1{ 2 "name": "@factory/performance", 3 "version": "0.1.0", 4 "private": true, 5 "description": "k6 performance/load suites for AI Software Factory: API throughput (1k rps mixed), realtime WebSocket scale (10k connections), and 100k-record database query performance. k6 is a Go binary installed from GitHub releases \u2014 see README.md.", 6 "scripts": { 7 "check": "k6 version && echo \"k6 found\" || echo \"k6 not found \u2014 install from https://github.com/grafana/k6/releases (see README.md)\"", 8 "api": "k6 run --env K6_API_URL=${K6_API_URL:-http://localhost:4000} api.js", 9 "realtime": "k6 run --env K6_REALTIME_URL=${K6_REALTIME_URL:-ws://localhost:4001} --env K6_API_URL=${K6_API_URL:-http://localhost:4000} realtime.js", 10 "realtime:1k": "k6 run --summary-export realtime-1k-final.json --env K6_REALTIME_URL=${K6_REALTIME_URL:-ws://localhost:4001} --env K6_JWT_SECRET=${K6_JWT_SECRET} --env K6_WORKSPACE_ID=${K6_WORKSPACE_ID} --env K6_PAGE_IDS=${K6_PAGE_IDS} --env K6_VUS=${K6_VUS:-1000} --env K6_RAMP_SECONDS=${K6_RAMP_SECONDS:-30} --env K6_HOLD_SECONDS=${K6_HOLD_SECONDS:-120} realtime-1k.js", 11 "realtime:smoke": "k6 run --summary-export realtime-smoke.json --env K6_REALTIME_URL=${K6_REALTIME_URL:-ws://localhost:4001} --env K6_JWT_SECRET=${K6_JWT_SECRET} --env K6_WORKSPACE_ID=${K6_WORKSPACE_ID} --env K6_PAGE_IDS=${K6_PAGE_IDS} --env K6_VUS=${K6_VUS:-100} --env K6_RAMP_SECONDS=${K6_RAMP_SECONDS:-10} --env K6_HOLD_SECONDS=${K6_HOLD_SECONDS:-20} --env K6_RTT_P95_MS=${K6_RTT_P95_MS:-400} --env K6_RTT_P99_MS=${K6_RTT_P99_MS:-800} realtime-1k.js", 12 "check:1k": "k6 archive realtime-1k.js && echo \"realtime-1k.js parses (k6 archive-clean)\"", 13 "database": "k6 run --env K6_API_URL=${K6_API_URL:-http://localhost:4000} database.js", 14 "perf:seed:search": "tsx fixtures/search-100k.ts seed", 15 "perf:reset:search": "tsx fixtures/search-100k.ts reset", 16 "check:search": "k6 archive search-search.k6.js && echo \"search-search.k6.js parses (k6 archive-clean)\"", 17 "search:100k": "k6 run --summary-export reports/search-full.json --env K6_API_URL=${K6_API_URL:-http://localhost:4000} --env K6_JWT_SECRET=${K6_JWT_SECRET} --env K6_SEARCH_WORKSPACES=${K6_SEARCH_WORKSPACES:-perf-search-a,perf-search-b} --env K6_VERSION=${K6_VERSION:-local} --env K6_VUS=${K6_VUS:-100} --env K6_DURATION_SECONDS=${K6_DURATION_SECONDS:-300} --env K6_RATE=${K6_RATE:-50} --env K6_P95_MS=${K6_P95_MS:-500} --env K6_P99_MS=${K6_P99_MS:-1000} search-search.k6.js", 18 "search:100k:reduced": "k6 run --summary-export reports/search-reduced.json --env K6_API_URL=${K6_API_URL:-http://localhost:4000} --env K6_JWT_SECRET=${K6_JWT_SECRET} --env K6_SEARCH_WORKSPACES=${K6_SEARCH_WORKSPACES:-perf-search-a,perf-search-b} --env K6_VERSION=${K6_VERSION:-ci} --env K6_VUS=${K6_VUS:-10} --env K6_DURATION_SECONDS=${K6_DURATION_SECONDS:-60} --env K6_RATE=${K6_RATE:-10} --env K6_P95_MS=${K6_P95_MS:-1000} --env K6_P99_MS=${K6_P99_MS:-2000} search-search.k6.js", 19 "seed:100k": "node seed-100k.mjs", 20 "check:load": "k6 archive api-load.js && k6 archive database-load.js && k6 archive realtime-load.js && echo \"TASK-0135 suites parse (k6 archive-clean)\"", 21 "api-load": "k6 run --summary-export reports/api-load.json --env K6_API_URL=${K6_API_URL:-http://localhost:4000} --env K6_EMAIL=${K6_EMAIL:-demo@factory.local} --env K6_PASSWORD=${K6_PASSWORD:-Factory!2345} --env K6_WORKSPACE_ID=${K6_WORKSPACE_ID} --env K6_PAGE_IDS=${K6_PAGE_IDS} --env K6_DB_ID=${K6_DB_ID} --env K6_STRICT=${K6_STRICT:-1} api-load.js", 22 "api-load:smoke": "K6_PROFILE=smoke K6_STRICT=0 k6 run --summary-export reports/api-load-smoke.json --env K6_API_URL=${K6_API_URL:-http://localhost:4000} --env K6_EMAIL=${K6_EMAIL:-demo@factory.local} --env K6_PASSWORD=${K6_PASSWORD:-Factory!2345} --env K6_WORKSPACE_ID=${K6_WORKSPACE_ID} --env K6_PAGE_IDS=${K6_PAGE_IDS} --env K6_DB_ID=${K6_DB_ID} api-load.js", 23 "database-load": "k6 run --summary-export reports/database-load.json --env K6_API_URL=${K6_API_URL:-http://localhost:4000} --env K6_EMAIL=${K6_EMAIL:-demo@factory.local} --env K6_PASSWORD=${K6_PASSWORD:-Factory!2345} --env K6_WORKSPACE_ID=${K6_WORKSPACE_ID} --env K6_DB_ID=${K6_DB_ID} --env K6_STRICT=${K6_STRICT:-1} database-load.js", 24 "database-load:smoke": "K6_PROFILE=smoke K6_STRICT=0 k6 run --summary-export reports/database-load-smoke.json --env K6_API_URL=${K6_API_URL:-http://localhost:4000} --env K6_EMAIL=${K6_EMAIL:-demo@factory.local} --env K6_PASSWORD=${K6_PASSWORD:-Factory!2345} --env K6_WORKSPACE_ID=${K6_WORKSPACE_ID} --env K6_DB_ID=${K6_DB_ID} database-load.js", 25 "realtime-load": "bash run-realtime-load.sh", 26 "realtime-load:smoke": "K6_PROFILE=smoke K6_STRICT=0 bash run-realtime-load.sh", 27 "editor-local": "node editor-local.mjs", 28 "threshold-breach-demo": "k6 run --env K6_API_URL=${K6_API_URL:-http://localhost:4000} --env K6_STRICT=1 threshold-breach-demo.js" 29 }, 30 "devDependencies": { 31 "@factory/search": "workspace:*", 32 "@prisma/client": "^6.19.3", 33 "@types/node": "^20.14.0", 34 "bullmq": "^5.12.0", 35 "ioredis": "^5.4.1", 36 "playwright": "1.49.1", 37 "tsx": "^4.19.0", 38 "ws": "^8.17.0", 39 "yjs": "^13.6.13" 40 } 41} 42