{ "name": "@factory/performance", "version": "0.1.0", "private": true, "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.", "scripts": { "check": "k6 version && echo \"k6 found\" || echo \"k6 not found \u2014 install from https://github.com/grafana/k6/releases (see README.md)\"", "api": "k6 run --env K6_API_URL=${K6_API_URL:-http://localhost:4000} api.js", "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", "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", "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", "check:1k": "k6 archive realtime-1k.js && echo \"realtime-1k.js parses (k6 archive-clean)\"", "database": "k6 run --env K6_API_URL=${K6_API_URL:-http://localhost:4000} database.js", "perf:seed:search": "tsx fixtures/search-100k.ts seed", "perf:reset:search": "tsx fixtures/search-100k.ts reset", "check:search": "k6 archive search-search.k6.js && echo \"search-search.k6.js parses (k6 archive-clean)\"", "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", "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", "seed:100k": "node seed-100k.mjs", "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)\"", "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", "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", "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", "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", "realtime-load": "bash run-realtime-load.sh", "realtime-load:smoke": "K6_PROFILE=smoke K6_STRICT=0 bash run-realtime-load.sh", "editor-local": "node editor-local.mjs", "threshold-breach-demo": "k6 run --env K6_API_URL=${K6_API_URL:-http://localhost:4000} --env K6_STRICT=1 threshold-breach-demo.js" }, "devDependencies": { "@factory/search": "workspace:*", "@prisma/client": "^6.19.3", "@types/node": "^20.14.0", "bullmq": "^5.12.0", "ioredis": "^5.4.1", "playwright": "1.49.1", "tsx": "^4.19.0", "ws": "^8.17.0", "yjs": "^13.6.13" } }