spb/wp-spboucher-ai
Public
1{2 "name": "wp-spboucher-ai",3 "version": "1.0.0",4 "private": true,5 "type": "module",6 "description": "Research Working Papers \u2014 Simon-Pierre Boucher Research Observatory (wp.spboucher.ai)",7 "scripts": {8 "dev": "next dev -p 8560",9 "build": "next build",10 "start": "next start -p 8560 -H 0.0.0.0",11 "lint": "eslint .",12 "typecheck": "tsc --noEmit",13 "db:migrate": "tsx scripts/migrate.ts",14 "db:roles": "tsx scripts/db-roles.ts",15 "bootstrap": "tsx scripts/bootstrap-owner.ts",16 "seed:import": "tsx scripts/seed-import.ts",17 "ingest:scan": "tsx scripts/ingest-scan.ts",18 "relations:rebuild": "tsx scripts/relations-rebuild.ts",19 "worker": "tsx src/worker/index.ts",20 "backup": "tsx scripts/backup.ts",21 "restore:drill": "tsx scripts/restore-drill.ts",22 "test": "vitest run",23 "test:e2e": "playwright test",24 "test:security": "tsx scripts/security-audit.ts",25 "verify:deploy": "tsx scripts/verify-deploy.ts"26 },27 "dependencies": {28 "@node-rs/argon2": "^2.2.2",29 "d3-force": "^3.0.0",30 "date-fns": "^4.4.0",31 "dotenv": "^18.0.9",32 "lucide-react": "^1.66.0",33 "next": "16.4.3",34 "otplib": "^13.5.0",35 "postgres": "^4.0.0",36 "qrcode": "^1.5.4",37 "react": "19.3.1",38 "react-dom": "19.3.1",39 "tailwindcss": "^4.3.3",40 "@tailwindcss/postcss": "^4.3.3",41 "zod": "^4.6.7"42 },43 "devDependencies": {44 "@playwright/test": "^1.64.1",45 "@types/d3-force": "^3.0.10",46 "@types/node": "^26.6.6",47 "@types/qrcode": "^1.5.6",48 "@types/react": "^19.3.0",49 "@types/react-dom": "^19.3.0",50 "tsx": "^4.23.15",51 "typescript": "^7.0.2",52 "vitest": "~5.0.0"53 }54}55