@sureshdsk/devflow-mcp 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +4 -4
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_global-error/page.js +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +2 -2
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +14 -13
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +14 -13
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +5 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/projects/[id]/route.js +2 -2
- package/.next/standalone/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js +2 -2
- package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/specs/[name]/artifacts/[artifactType]/approve/route.js +2 -2
- package/.next/standalone/.next/server/app/api/specs/[name]/artifacts/[artifactType]/approve/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/specs/[name]/artifacts/[artifactType]/route.js +2 -2
- package/.next/standalone/.next/server/app/api/specs/[name]/artifacts/[artifactType]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/specs/[name]/promote/route.js +2 -2
- package/.next/standalone/.next/server/app/api/specs/[name]/promote/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/specs/[name]/route.js +2 -2
- package/.next/standalone/.next/server/app/api/specs/[name]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/specs/route.js +2 -2
- package/.next/standalone/.next/server/app/api/specs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/route.js +2 -2
- package/.next/standalone/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/route.js +2 -2
- package/.next/standalone/.next/server/app/api/tasks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -14
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -14
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +5 -4
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/page.js +2 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/specs/[name]/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/specs/[name]/page.js +2 -2
- package/.next/standalone/.next/server/app/specs/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/specs/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0be0eb8b._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__a9d478ee._.js → [root-of-the-server]__160c54ca._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17ac51e3._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bb083e9._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1dc1e944._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__22ecfa2c._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__13a93eb6._.js → [root-of-the-server]__64710c0d._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a2b7e5f2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cf302bda._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d85482cd._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__dfa21757._.js +3 -0
- package/.next/standalone/.next/server/chunks/_3f452afe._.js +2 -2
- package/.next/standalone/.next/server/chunks/src_db_index_ts_a71f50f0._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__023e2c69._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0a1a1435._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0c49a387._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1be1fc5f._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3a2f2efb._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4693399c._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__937c9212._.js → [root-of-the-server]__72a14301._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__8064ca06._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__8b786d48._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__8c052461._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__8d306066._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__9532fd59._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a119dd75._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__7fb6ef14._.js → [root-of-the-server]__a57b312b._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a80bd0ea._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__abe095b3._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ad3bd783._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1e05fe0e._.js → [root-of-the-server]__ae9f05d6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__c8781469._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__c8a25070._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__e8c1e595._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0ff3de19._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_01a5cd4b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_05c6819f._.js +31 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_06c2c30a._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_09efe605._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_mermaid_dist_chunks_mermaid_core_ef601841._.js → node_modules_0a439e3b._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_3507b41a._.js → node_modules_0e73ad6c._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0e7ff06d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0f73e25c._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_14cf9cea._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_19801f01._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_2235b8cf._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_23096c6d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_23db4cf7._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_24381e95._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_24ca0eb6._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_27525793._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_mermaid_dist_chunks_mermaid_core_4cfa6360._.js → node_modules_27c20382._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_2c901b92._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_33b818b7._.js +45 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_345d7791._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_36185c24._.js +45 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_3ac7ce09._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_41b77cc7._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_ed317ff6._.js → node_modules_42acd8db._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_434aa5ec._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_54a9e72d._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_54f1273a._.js +26 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_58d64491._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_5e012e3d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_5ea9e4cf._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_5ecf8270._.js +26 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_611c99b5._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_d3-scale_src_e02ef77f._.js → node_modules_6629853d._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_6fe2661c._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_7fe65a84._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_860f971a._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_882f3743._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_8e047938._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_9268cdc4._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_942541c9._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_9d52c0d6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_@tanstack_query-core_build_modern_21ece5ea._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_ae6841d2._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_ba280bb0._.js +31 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_bffdb8ec._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_c00f1821._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_c142ba86._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_d1a47cde._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_d9b454fe._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_dbe36b1d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_ddbe26b7._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_e76b8bf2._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_e945b74d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_fbd8a2ee._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_katex_dist_katex_mjs_31d456ba._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_katex_dist_katex_mjs_e1edc676._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_lodash-es_33e24dce._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-QXUST7PY_mjs_159fba97._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-S3R3BYOJ_mjs_dbeeb277._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_mermaid_core_mjs_a11916de._.js +9 -0
- package/.next/standalone/.next/server/chunks/ssr/src_66a70595._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_components_kanban-board_tsx_7b875e8e._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +2 -2
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +2 -2
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/AGENTS.md +13 -7
- package/.next/standalone/CONTRIBUTING.md +42 -26
- package/.next/standalone/README.md +166 -25
- package/.next/standalone/bin/devflow.js +12 -5
- package/.next/standalone/bun.lock +78 -24
- package/.next/standalone/devflow/project-config.json +4 -0
- package/.next/standalone/devflow/schemas/api-first/schema.yaml +39 -0
- package/.next/standalone/devflow/schemas/api-first/templates/api-design.md +41 -0
- package/.next/standalone/devflow/schemas/api-first/templates/db-design.md +28 -0
- package/.next/standalone/devflow/schemas/api-first/templates/final-architecture.md +31 -0
- package/.next/standalone/devflow/schemas/api-first/templates/proposal.md +22 -0
- package/.next/standalone/devflow/schemas/api-first/templates/tasks.md +16 -0
- package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/.approvals.json +1 -1
- package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/.meta.json +1 -1
- package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/design.md +11 -0
- package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/proposal.md +3 -0
- package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/tasks.md +34 -2
- package/.next/standalone/devflow/specs/precommit/.approvals.json +26 -0
- package/.next/standalone/devflow/specs/precommit/.meta.json +7 -0
- package/.next/standalone/devflow/specs/precommit/design.md +105 -0
- package/.next/standalone/devflow/specs/precommit/proposal.md +43 -0
- package/.next/standalone/devflow/specs/precommit/specs.md +89 -0
- package/.next/standalone/devflow/specs/precommit/tasks.md +283 -0
- package/.next/standalone/docs/custom-schemas.md +117 -0
- package/.next/standalone/docs/local-dev-guide.md +73 -0
- package/.next/standalone/drizzle.config.ts +7 -7
- package/.next/standalone/eslint.config.mjs +2 -2
- package/.next/standalone/instrumentation.ts +3 -5
- package/.next/standalone/next.config.ts +11 -2
- package/.next/standalone/node_modules/{sharp → libsql}/node_modules/detect-libc/package.json +4 -8
- package/.next/standalone/package-lock.json +5257 -2085
- package/.next/standalone/package.json +16 -7
- package/.next/standalone/postcss.config.mjs +1 -1
- package/.next/standalone/scripts/init-db.js +3 -5
- package/.next/standalone/scripts/init-db.test.js +6 -6
- package/.next/standalone/scripts/init-schema.js +22 -22
- package/.next/standalone/scripts/init-schema.test.js +45 -45
- package/.next/standalone/scripts/install-environments.js +27 -8
- package/.next/standalone/scripts/install-environments.test.js +19 -10
- package/.next/standalone/scripts/install-skills.js +104 -31
- package/.next/standalone/scripts/install-skills.test.js +6 -6
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/app/api/agents/route.ts +2 -2
- package/.next/standalone/src/app/api/projects/[id]/route.ts +10 -19
- package/.next/standalone/src/app/api/projects/route.ts +4 -10
- package/.next/standalone/src/app/api/specs/[name]/artifacts/[artifactType]/approve/route.ts +8 -8
- package/.next/standalone/src/app/api/specs/[name]/artifacts/[artifactType]/route.ts +14 -14
- package/.next/standalone/src/app/api/specs/[name]/promote/route.ts +17 -23
- package/.next/standalone/src/app/api/specs/[name]/route.ts +34 -36
- package/.next/standalone/src/app/api/specs/route.ts +10 -10
- package/.next/standalone/src/app/api/tasks/[id]/route.ts +11 -33
- package/.next/standalone/src/app/api/tasks/route.ts +3 -6
- package/.next/standalone/src/app/globals.css +3 -3
- package/.next/standalone/src/app/layout.tsx +9 -5
- package/.next/standalone/src/app/page.tsx +1 -1
- package/.next/standalone/src/app/specs/[name]/page.tsx +26 -68
- package/.next/standalone/src/components/kanban-board.tsx +78 -157
- package/.next/standalone/src/components/kanban-column.tsx +10 -12
- package/.next/standalone/src/components/markdown-preview.tsx +36 -19
- package/.next/standalone/src/components/providers.tsx +20 -0
- package/.next/standalone/src/components/specs/artifact-dag-status.tsx +12 -14
- package/.next/standalone/src/components/specs/artifact-editor.tsx +55 -26
- package/.next/standalone/src/components/specs/spec-detail.tsx +48 -40
- package/.next/standalone/src/components/specs/spec-kanban-column.tsx +49 -68
- package/.next/standalone/src/components/specs/spec-modal.tsx +119 -83
- package/.next/standalone/src/components/task-card.tsx +34 -38
- package/.next/standalone/src/components/task-dialog.tsx +16 -31
- package/.next/standalone/src/components/ui/badge.tsx +12 -18
- package/.next/standalone/src/components/ui/button.tsx +23 -28
- package/.next/standalone/src/components/ui/card.tsx +42 -62
- package/.next/standalone/src/components/ui/dialog.tsx +17 -35
- package/.next/standalone/src/db/index.ts +10 -10
- package/.next/standalone/src/db/schema.ts +37 -37
- package/.next/standalone/src/hooks/use-queries.ts +81 -0
- package/.next/standalone/src/hooks/use-websocket.ts +74 -0
- package/.next/standalone/src/lib/schema.test.ts +37 -37
- package/.next/standalone/src/lib/schema.ts +77 -31
- package/.next/standalone/src/lib/specs-dir.ts +8 -8
- package/.next/standalone/src/lib/specs.ts +98 -92
- package/.next/standalone/src/lib/utils.ts +2 -2
- package/.next/standalone/src/mcp/server.ts +556 -349
- package/.next/standalone/src/mcp/websocket.ts +26 -23
- package/.next/standalone/src/schemas/backend-api/templates/proposal.md +6 -4
- package/.next/standalone/src/schemas/backend-api/templates/tasks.md +6 -0
- package/.next/standalone/src/schemas/data-engineering/templates/proposal.md +6 -4
- package/.next/standalone/src/schemas/data-engineering/templates/tasks.md +6 -0
- package/.next/standalone/src/schemas/devops-platform/templates/proposal.md +6 -4
- package/.next/standalone/src/schemas/devops-platform/templates/tasks.md +6 -0
- package/.next/standalone/src/schemas/frontend-product/templates/proposal.md +6 -4
- package/.next/standalone/src/schemas/frontend-product/templates/tasks.md +6 -0
- package/.next/standalone/src/schemas/spec-driven/templates/proposal.md +6 -4
- package/.next/standalone/src/schemas/spec-driven/templates/tasks.md +26 -0
- package/.next/standalone/src/websocket/server.ts +20 -18
- package/.next/standalone/tsconfig.json +3 -12
- package/.next/standalone/tsconfig.tsbuildinfo +1 -1
- package/.next/static/chunks/4f23f64d46848f57.js +1 -0
- package/.next/static/chunks/53081dcdcad4f31e.js +1 -0
- package/.next/static/chunks/{6a3d582315f1c214.js → 701cfcbb41e0ab47.js} +1 -1
- package/.next/static/chunks/ac4b6b4d5b7e486e.css +1 -0
- package/.next/static/chunks/d0309ea872db5d9f.js +1 -0
- package/.next/static/chunks/d4cf8893a018e965.js +1 -0
- package/.next/static/chunks/e6c0233269a4bd69.js +13 -0
- package/.next/static/chunks/{7e65cfa9841f66a5.js → e7d83ce855afe416.js} +2 -2
- package/.next/static/chunks/ee7035560fc9e5e9.js +1 -0
- package/.next/static/chunks/{turbopack-f4d3806ab575051d.js → turbopack-8b3b66a22a5e0fb4.js} +2 -2
- package/README.md +166 -25
- package/bin/devflow.js +12 -5
- package/drizzle.config.ts +7 -7
- package/next.config.ts +11 -2
- package/package.json +16 -7
- package/scripts/init-db.js +3 -5
- package/scripts/init-db.test.js +6 -6
- package/scripts/init-schema.js +22 -22
- package/scripts/init-schema.test.js +45 -45
- package/scripts/install-environments.js +27 -8
- package/scripts/install-environments.test.js +19 -10
- package/scripts/install-skills.js +104 -31
- package/scripts/install-skills.test.js +6 -6
- package/src/app/api/agents/route.ts +2 -2
- package/src/app/api/projects/[id]/route.ts +10 -19
- package/src/app/api/projects/route.ts +4 -10
- package/src/app/api/specs/[name]/artifacts/[artifactType]/approve/route.ts +8 -8
- package/src/app/api/specs/[name]/artifacts/[artifactType]/route.ts +14 -14
- package/src/app/api/specs/[name]/promote/route.ts +17 -23
- package/src/app/api/specs/[name]/route.ts +34 -36
- package/src/app/api/specs/route.ts +10 -10
- package/src/app/api/tasks/[id]/route.ts +11 -33
- package/src/app/api/tasks/route.ts +3 -6
- package/src/app/globals.css +3 -3
- package/src/app/layout.tsx +9 -5
- package/src/app/page.tsx +1 -1
- package/src/app/specs/[name]/page.tsx +26 -68
- package/src/components/kanban-board.tsx +78 -157
- package/src/components/kanban-column.tsx +10 -12
- package/src/components/markdown-preview.tsx +36 -19
- package/src/components/providers.tsx +20 -0
- package/src/components/specs/artifact-dag-status.tsx +12 -14
- package/src/components/specs/artifact-editor.tsx +55 -26
- package/src/components/specs/spec-detail.tsx +48 -40
- package/src/components/specs/spec-kanban-column.tsx +49 -68
- package/src/components/specs/spec-modal.tsx +119 -83
- package/src/components/task-card.tsx +34 -38
- package/src/components/task-dialog.tsx +16 -31
- package/src/components/ui/badge.tsx +12 -18
- package/src/components/ui/button.tsx +23 -28
- package/src/components/ui/card.tsx +42 -62
- package/src/components/ui/dialog.tsx +17 -35
- package/src/db/index.ts +10 -10
- package/src/db/schema.ts +37 -37
- package/src/hooks/use-queries.ts +81 -0
- package/src/hooks/use-websocket.ts +74 -0
- package/src/lib/schema.test.ts +37 -37
- package/src/lib/schema.ts +77 -31
- package/src/lib/specs-dir.ts +8 -8
- package/src/lib/specs.ts +98 -92
- package/src/lib/utils.ts +2 -2
- package/src/mcp/server.ts +556 -349
- package/src/mcp/websocket.ts +26 -23
- package/src/schemas/backend-api/templates/proposal.md +6 -4
- package/src/schemas/backend-api/templates/tasks.md +6 -0
- package/src/schemas/data-engineering/templates/proposal.md +6 -4
- package/src/schemas/data-engineering/templates/tasks.md +6 -0
- package/src/schemas/devops-platform/templates/proposal.md +6 -4
- package/src/schemas/devops-platform/templates/tasks.md +6 -0
- package/src/schemas/frontend-product/templates/proposal.md +6 -4
- package/src/schemas/frontend-product/templates/tasks.md +6 -0
- package/src/schemas/spec-driven/templates/proposal.md +6 -4
- package/src/schemas/spec-driven/templates/tasks.md +26 -0
- package/src/types/bun-sqlite.d.ts +1 -1
- package/src/websocket/server.ts +20 -18
- package/tsconfig.json +3 -12
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1be4e4b6._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__492a4a24._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__67c59ae1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6cc7aecd._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__83a77b07._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__88d91cb5._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9e095e8._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b367d327._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__eb413bbc._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0b8c072a._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12b2191f._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__15316462._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__19c9c409._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__19e5e22f._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__25b5ccb3._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__2f78c3da._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3160b3f4._.js +0 -9
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__319559be._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__34f7cbcb._.js +0 -31
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3abab94b._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3b3d8930._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4250799b._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4c29cbc3._.js +0 -26
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4e0bb6eb._.js +0 -9
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__5678d2e3._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__673445e0._.js +0 -31
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__934de06b._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__9b6c6f09._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a1b83a98._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__b00a15c5._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__b8567be3._.js +0 -26
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ce64536e._.js +0 -45
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__e96d33d2._.js +0 -45
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__fd7ec054._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_16a3f9e7._.js +0 -17
- package/.next/standalone/.next/server/chunks/ssr/node_modules_45bce0e1._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_5e5a372d._.js +0 -17
- package/.next/standalone/.next/server/chunks/ssr/node_modules_6ece6f1e._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_d173e749._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_d3-shape_src_arc_fb1ac087.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_1f73a830._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_663ac803._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-FMBD7UC4_mjs_4f485529._.js +0 -17
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-TZMSLE5B_mjs_8436a62a._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_f78d2dc4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_app_layout_tsx_cc8184fa._.js +0 -3
- package/.next/standalone/devflow/specs/add-default-schema-template-selection/.approvals.json +0 -26
- package/.next/standalone/devflow/specs/add-default-schema-template-selection/.meta.json +0 -8
- package/.next/standalone/devflow/specs/add-default-schema-template-selection/design.md +0 -126
- package/.next/standalone/devflow/specs/add-default-schema-template-selection/proposal.md +0 -65
- package/.next/standalone/devflow/specs/add-default-schema-template-selection/specs.md +0 -107
- package/.next/standalone/devflow/specs/add-default-schema-template-selection/tasks.md +0 -235
- package/.next/standalone/devflow/specs/test-no-project/.approvals.json +0 -17
- package/.next/standalone/devflow/specs/test-no-project/.meta.json +0 -6
- package/.next/standalone/devflow/specs/ui-cleanup/.approvals.json +0 -29
- package/.next/standalone/devflow/specs/ui-cleanup/.meta.json +0 -6
- package/.next/standalone/devflow/specs/ui-cleanup/design.md +0 -49
- package/.next/standalone/devflow/specs/ui-cleanup/proposal.md +0 -34
- package/.next/standalone/devflow/specs/ui-cleanup/specs.md +0 -55
- package/.next/standalone/devflow/specs/ui-cleanup/tasks.md +0 -28
- package/.next/standalone/node_modules/@img/colour/color.cjs +0 -1594
- package/.next/standalone/node_modules/@img/colour/index.cjs +0 -1
- package/.next/standalone/node_modules/@img/colour/package.json +0 -45
- package/.next/standalone/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-darwin-arm64/package.json +0 -40
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/glib-2.0/include/glibconfig.h +0 -220
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/package.json +0 -36
- package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/versions.json +0 -30
- package/.next/standalone/node_modules/buffer-from/index.js +0 -72
- package/.next/standalone/node_modules/buffer-from/package.json +0 -19
- package/.next/standalone/node_modules/sharp/lib/channel.js +0 -177
- package/.next/standalone/node_modules/sharp/lib/colour.js +0 -195
- package/.next/standalone/node_modules/sharp/lib/composite.js +0 -212
- package/.next/standalone/node_modules/sharp/lib/constructor.js +0 -499
- package/.next/standalone/node_modules/sharp/lib/index.js +0 -16
- package/.next/standalone/node_modules/sharp/lib/input.js +0 -809
- package/.next/standalone/node_modules/sharp/lib/is.js +0 -143
- package/.next/standalone/node_modules/sharp/lib/libvips.js +0 -207
- package/.next/standalone/node_modules/sharp/lib/operation.js +0 -1016
- package/.next/standalone/node_modules/sharp/lib/output.js +0 -1666
- package/.next/standalone/node_modules/sharp/lib/resize.js +0 -595
- package/.next/standalone/node_modules/sharp/lib/sharp.js +0 -121
- package/.next/standalone/node_modules/sharp/lib/utility.js +0 -291
- package/.next/standalone/node_modules/sharp/node_modules/detect-libc/lib/detect-libc.js +0 -313
- package/.next/standalone/node_modules/sharp/node_modules/detect-libc/lib/elf.js +0 -39
- package/.next/standalone/node_modules/sharp/node_modules/detect-libc/lib/filesystem.js +0 -51
- package/.next/standalone/node_modules/sharp/node_modules/detect-libc/lib/process.js +0 -24
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/comparator.js +0 -143
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/range.js +0 -557
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/semver.js +0 -333
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/cmp.js +0 -54
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/coerce.js +0 -62
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/compare.js +0 -7
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/eq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/neq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/parse.js +0 -18
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/satisfies.js +0 -12
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/constants.js +0 -37
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/debug.js +0 -11
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/identifiers.js +0 -29
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/lrucache.js +0 -42
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/parse-options.js +0 -17
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/re.js +0 -223
- package/.next/standalone/node_modules/sharp/node_modules/semver/package.json +0 -78
- package/.next/standalone/node_modules/sharp/package.json +0 -202
- package/.next/standalone/node_modules/source-map/lib/array-set.js +0 -121
- package/.next/standalone/node_modules/source-map/lib/base64-vlq.js +0 -140
- package/.next/standalone/node_modules/source-map/lib/base64.js +0 -67
- package/.next/standalone/node_modules/source-map/lib/binary-search.js +0 -111
- package/.next/standalone/node_modules/source-map/lib/mapping-list.js +0 -79
- package/.next/standalone/node_modules/source-map/lib/quick-sort.js +0 -114
- package/.next/standalone/node_modules/source-map/lib/source-map-consumer.js +0 -1145
- package/.next/standalone/node_modules/source-map/lib/source-map-generator.js +0 -425
- package/.next/standalone/node_modules/source-map/lib/source-node.js +0 -413
- package/.next/standalone/node_modules/source-map/lib/util.js +0 -488
- package/.next/standalone/node_modules/source-map/package.json +0 -73
- package/.next/standalone/node_modules/source-map/source-map.js +0 -8
- package/.next/standalone/node_modules/source-map-support/LICENSE.md +0 -21
- package/.next/standalone/node_modules/source-map-support/README.md +0 -284
- package/.next/standalone/node_modules/source-map-support/browser-source-map-support.js +0 -114
- package/.next/standalone/node_modules/source-map-support/package.json +0 -31
- package/.next/standalone/node_modules/source-map-support/register-hook-require.js +0 -1
- package/.next/standalone/node_modules/source-map-support/register.js +0 -1
- package/.next/standalone/node_modules/source-map-support/source-map-support.js +0 -625
- package/.next/standalone/node_modules/typescript/lib/_tsc.js +0 -133818
- package/.next/standalone/node_modules/typescript/lib/_tsserver.js +0 -659
- package/.next/standalone/node_modules/typescript/lib/_typingsInstaller.js +0 -222
- package/.next/standalone/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/de/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/es/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/it/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/tsc.js +0 -8
- package/.next/standalone/node_modules/typescript/lib/tsserver.js +0 -8
- package/.next/standalone/node_modules/typescript/lib/tsserverlibrary.js +0 -21
- package/.next/standalone/node_modules/typescript/lib/typesMap.json +0 -497
- package/.next/standalone/node_modules/typescript/lib/typescript.js +0 -200276
- package/.next/standalone/node_modules/typescript/lib/typingsInstaller.js +0 -8
- package/.next/standalone/node_modules/typescript/lib/watchGuard.js +0 -53
- package/.next/standalone/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +0 -2122
- package/.next/standalone/node_modules/typescript/package.json +0 -120
- package/.next/standalone/src/components/ui/collapsible.tsx +0 -12
- package/.next/standalone/src/components/ui/sheet.tsx +0 -130
- package/.next/standalone/src/components/ui/tabs.tsx +0 -58
- package/.next/static/chunks/0177331b8adf7346.js +0 -7
- package/.next/static/chunks/06af74e2f3e207c5.js +0 -7
- package/.next/static/chunks/1748d5cd2443723b.css +0 -1
- package/.next/static/chunks/7ae917cb100be2b9.js +0 -7
- package/.next/static/chunks/7c4b901b394c3a8c.js +0 -7
- package/src/components/ui/collapsible.tsx +0 -12
- package/src/components/ui/sheet.tsx +0 -130
- package/src/components/ui/tabs.tsx +0 -58
- /package/.next/standalone/node_modules/{detect-libc → libsql/node_modules/detect-libc}/lib/detect-libc.js +0 -0
- /package/.next/standalone/node_modules/{detect-libc → libsql/node_modules/detect-libc}/lib/filesystem.js +0 -0
- /package/.next/standalone/node_modules/{detect-libc → libsql/node_modules/detect-libc}/lib/process.js +0 -0
- /package/.next/static/{5YFrdIQd1UU2IxLxekrU9 → Ql6qo0GYLL23WRu6ec4N5}/_buildManifest.js +0 -0
- /package/.next/static/{5YFrdIQd1UU2IxLxekrU9 → Ql6qo0GYLL23WRu6ec4N5}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{5YFrdIQd1UU2IxLxekrU9 → Ql6qo0GYLL23WRu6ec4N5}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import WebSocket from
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
2
|
|
|
3
3
|
let client: WebSocket | null = null;
|
|
4
4
|
let reconnectAttempts = 0;
|
|
@@ -6,11 +6,11 @@ let reconnectTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
|
6
6
|
let isConnecting = false;
|
|
7
7
|
|
|
8
8
|
function detectAgentName(): string {
|
|
9
|
-
if (process.env.CLAUDECODE || process.env.CLAUDE_CODE_ENTRYPOINT) return
|
|
10
|
-
if (process.env.CODEX) return
|
|
11
|
-
if (process.env.CURSOR_TRACE_ID || process.env.CURSOR_CHANNEL) return
|
|
12
|
-
if (process.env.WINDSURF_PLUGIN_VERSION) return
|
|
13
|
-
return
|
|
9
|
+
if (process.env.CLAUDECODE || process.env.CLAUDE_CODE_ENTRYPOINT) return 'Claude Code';
|
|
10
|
+
if (process.env.CODEX) return 'Codex';
|
|
11
|
+
if (process.env.CURSOR_TRACE_ID || process.env.CURSOR_CHANNEL) return 'Cursor';
|
|
12
|
+
if (process.env.WINDSURF_PLUGIN_VERSION) return 'Windsurf';
|
|
13
|
+
return ''; // empty = unknown, server.ts will re-identify after MCP initialize
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
const MAX_RECONNECT_DELAY = 30000; // 30 seconds
|
|
@@ -32,7 +32,7 @@ function getReconnectDelay(): number {
|
|
|
32
32
|
// Exponential backoff: 1s, 2s, 4s, 8s, 16s, 30s (max)
|
|
33
33
|
const delay = Math.min(
|
|
34
34
|
INITIAL_RECONNECT_DELAY * Math.pow(2, reconnectAttempts),
|
|
35
|
-
MAX_RECONNECT_DELAY
|
|
35
|
+
MAX_RECONNECT_DELAY,
|
|
36
36
|
);
|
|
37
37
|
return delay;
|
|
38
38
|
}
|
|
@@ -62,42 +62,40 @@ function connectToServer() {
|
|
|
62
62
|
try {
|
|
63
63
|
client = new WebSocket(url);
|
|
64
64
|
|
|
65
|
-
client.on(
|
|
65
|
+
client.on('open', () => {
|
|
66
66
|
isConnecting = false;
|
|
67
67
|
reconnectAttempts = 0;
|
|
68
68
|
console.error(`[MCP WebSocket] Connected to server at ${url}`);
|
|
69
69
|
// Announce this connection as an MCP agent with detected name
|
|
70
|
-
client!.send(JSON.stringify({ type:
|
|
70
|
+
client!.send(JSON.stringify({ type: 'identify', role: 'mcp', agent: detectAgentName() }));
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
-
client.on(
|
|
73
|
+
client.on('close', () => {
|
|
74
74
|
isConnecting = false;
|
|
75
75
|
client = null;
|
|
76
76
|
// Only log and reconnect if we had been connected (reconnectAttempts > 0 means we're already trying)
|
|
77
77
|
if (reconnectAttempts === 0) {
|
|
78
|
-
console.error(
|
|
78
|
+
console.error('[MCP WebSocket] Disconnected from server, will reconnect');
|
|
79
79
|
}
|
|
80
80
|
scheduleReconnect();
|
|
81
81
|
});
|
|
82
82
|
|
|
83
|
-
client.on(
|
|
83
|
+
client.on('error', (error: Error & { code?: string }) => {
|
|
84
84
|
isConnecting = false;
|
|
85
85
|
// Only log connection refused once, not on every retry
|
|
86
|
-
if (error.code ===
|
|
86
|
+
if (error.code === 'ECONNREFUSED') {
|
|
87
87
|
if (reconnectAttempts === 0) {
|
|
88
|
-
console.error(
|
|
89
|
-
`[MCP WebSocket] Server not available at ${url}, will retry in background`
|
|
90
|
-
);
|
|
88
|
+
console.error(`[MCP WebSocket] Server not available at ${url}, will retry in background`);
|
|
91
89
|
}
|
|
92
90
|
} else {
|
|
93
|
-
console.error(
|
|
91
|
+
console.error('[MCP WebSocket] Error:', error.message);
|
|
94
92
|
}
|
|
95
93
|
client = null;
|
|
96
94
|
scheduleReconnect();
|
|
97
95
|
});
|
|
98
96
|
} catch (error) {
|
|
99
97
|
isConnecting = false;
|
|
100
|
-
console.error(
|
|
98
|
+
console.error('[MCP WebSocket] Failed to create connection:', error);
|
|
101
99
|
scheduleReconnect();
|
|
102
100
|
}
|
|
103
101
|
}
|
|
@@ -105,16 +103,19 @@ function connectToServer() {
|
|
|
105
103
|
export function broadcastUpdate(data: unknown) {
|
|
106
104
|
if (!client || client.readyState !== WebSocket.OPEN) {
|
|
107
105
|
// Server not available, silently fail - UI has polling fallback
|
|
108
|
-
console.error(
|
|
106
|
+
console.error(
|
|
107
|
+
'[MCP WebSocket] Not connected, skipping broadcast:',
|
|
108
|
+
JSON.stringify(data).substring(0, 100),
|
|
109
|
+
);
|
|
109
110
|
return;
|
|
110
111
|
}
|
|
111
112
|
|
|
112
113
|
try {
|
|
113
114
|
const message = JSON.stringify(data);
|
|
114
|
-
console.error(
|
|
115
|
+
console.error('[MCP WebSocket] Broadcasting:', message.substring(0, 100));
|
|
115
116
|
client.send(message);
|
|
116
117
|
} catch (error) {
|
|
117
|
-
console.error(
|
|
118
|
+
console.error('[MCP WebSocket] Failed to send message:', error);
|
|
118
119
|
}
|
|
119
120
|
}
|
|
120
121
|
|
|
@@ -133,5 +134,7 @@ export function disconnect() {
|
|
|
133
134
|
}
|
|
134
135
|
}
|
|
135
136
|
|
|
136
|
-
//
|
|
137
|
-
|
|
137
|
+
// Connect lazily — skip during build
|
|
138
|
+
if (process.env.NEXT_PHASE !== 'phase-production-build') {
|
|
139
|
+
connectToServer();
|
|
140
|
+
}
|
|
@@ -3,15 +3,18 @@
|
|
|
3
3
|
## 1. Delivery Overview
|
|
4
4
|
|
|
5
5
|
### 1.1 Objective
|
|
6
|
+
|
|
6
7
|
<Deliver backend/API changes with contract safety and operational confidence.>
|
|
7
8
|
|
|
8
9
|
### 1.2 In-Scope Outcomes
|
|
10
|
+
|
|
9
11
|
- <Service/API behavior outcome>
|
|
10
12
|
- <Data or migration outcome>
|
|
11
13
|
|
|
12
14
|
## 2. Task Cards
|
|
13
15
|
|
|
14
16
|
### 2.1 Task: <short-task-title>
|
|
17
|
+
|
|
15
18
|
- [ ] **Status**
|
|
16
19
|
- **Task ID:** `<T1>`
|
|
17
20
|
- **Owner Type:** `agent`
|
|
@@ -22,14 +25,17 @@
|
|
|
22
25
|
<Concrete backend/API goal>
|
|
23
26
|
|
|
24
27
|
**Implementation Targets**
|
|
28
|
+
|
|
25
29
|
- Files to create/update:
|
|
26
30
|
- `<path>`
|
|
27
31
|
|
|
28
32
|
**Validation**
|
|
33
|
+
|
|
29
34
|
- Automated tests to add/update:
|
|
30
35
|
- `<test file>`
|
|
31
36
|
|
|
32
37
|
**Task Summary**
|
|
38
|
+
|
|
33
39
|
- Completed: <!-- yes/no -->
|
|
34
40
|
- What was done: <!-- brief description -->
|
|
35
41
|
- Files changed: <!-- list key files -->
|
|
@@ -3,15 +3,18 @@
|
|
|
3
3
|
## 1. Delivery Overview
|
|
4
4
|
|
|
5
5
|
### 1.1 Objective
|
|
6
|
+
|
|
6
7
|
<Deliver trustworthy data pipeline/model changes with lineage and quality controls.>
|
|
7
8
|
|
|
8
9
|
### 1.2 In-Scope Outcomes
|
|
10
|
+
|
|
9
11
|
- <Pipeline/model outcome>
|
|
10
12
|
- <Data quality/SLA outcome>
|
|
11
13
|
|
|
12
14
|
## 2. Task Cards
|
|
13
15
|
|
|
14
16
|
### 2.1 Task: <short-task-title>
|
|
17
|
+
|
|
15
18
|
- [ ] **Status**
|
|
16
19
|
- **Task ID:** `<T1>`
|
|
17
20
|
- **Owner Type:** `agent`
|
|
@@ -22,14 +25,17 @@
|
|
|
22
25
|
<Concrete data engineering goal>
|
|
23
26
|
|
|
24
27
|
**Implementation Targets**
|
|
28
|
+
|
|
25
29
|
- Files to create/update:
|
|
26
30
|
- `<path>`
|
|
27
31
|
|
|
28
32
|
**Validation**
|
|
33
|
+
|
|
29
34
|
- Automated tests to add/update:
|
|
30
35
|
- `<test file>`
|
|
31
36
|
|
|
32
37
|
**Task Summary**
|
|
38
|
+
|
|
33
39
|
- Completed: <!-- yes/no -->
|
|
34
40
|
- What was done: <!-- brief description -->
|
|
35
41
|
- Files changed: <!-- list key files -->
|
|
@@ -3,15 +3,18 @@
|
|
|
3
3
|
## 1. Delivery Overview
|
|
4
4
|
|
|
5
5
|
### 1.1 Objective
|
|
6
|
+
|
|
6
7
|
<Deliver safe platform/devops changes with clear deployment and rollback confidence.>
|
|
7
8
|
|
|
8
9
|
### 1.2 In-Scope Outcomes
|
|
10
|
+
|
|
9
11
|
- <Infrastructure/deployment outcome>
|
|
10
12
|
- <Reliability/security outcome>
|
|
11
13
|
|
|
12
14
|
## 2. Task Cards
|
|
13
15
|
|
|
14
16
|
### 2.1 Task: <short-task-title>
|
|
17
|
+
|
|
15
18
|
- [ ] **Status**
|
|
16
19
|
- **Task ID:** `<T1>`
|
|
17
20
|
- **Owner Type:** `agent`
|
|
@@ -22,14 +25,17 @@
|
|
|
22
25
|
<Concrete devops/platform goal>
|
|
23
26
|
|
|
24
27
|
**Implementation Targets**
|
|
28
|
+
|
|
25
29
|
- Files to create/update:
|
|
26
30
|
- `<path>`
|
|
27
31
|
|
|
28
32
|
**Validation**
|
|
33
|
+
|
|
29
34
|
- Automated tests to add/update:
|
|
30
35
|
- `<test file>`
|
|
31
36
|
|
|
32
37
|
**Task Summary**
|
|
38
|
+
|
|
33
39
|
- Completed: <!-- yes/no -->
|
|
34
40
|
- What was done: <!-- brief description -->
|
|
35
41
|
- Files changed: <!-- list key files -->
|
|
@@ -3,15 +3,18 @@
|
|
|
3
3
|
## 1. Delivery Overview
|
|
4
4
|
|
|
5
5
|
### 1.1 Objective
|
|
6
|
+
|
|
6
7
|
<Deliver the frontend/product experience safely with measurable UX outcomes.>
|
|
7
8
|
|
|
8
9
|
### 1.2 In-Scope Outcomes
|
|
10
|
+
|
|
9
11
|
- <UI/UX outcome>
|
|
10
12
|
- <Behavior/API consumption outcome>
|
|
11
13
|
|
|
12
14
|
## 2. Task Cards
|
|
13
15
|
|
|
14
16
|
### 2.1 Task: <short-task-title>
|
|
17
|
+
|
|
15
18
|
- [ ] **Status**
|
|
16
19
|
- **Task ID:** `<T1>`
|
|
17
20
|
- **Owner Type:** `agent`
|
|
@@ -22,14 +25,17 @@
|
|
|
22
25
|
<Concrete frontend/product goal>
|
|
23
26
|
|
|
24
27
|
**Implementation Targets**
|
|
28
|
+
|
|
25
29
|
- Files to create/update:
|
|
26
30
|
- `<path>`
|
|
27
31
|
|
|
28
32
|
**Validation**
|
|
33
|
+
|
|
29
34
|
- Automated tests to add/update:
|
|
30
35
|
- `<test file>`
|
|
31
36
|
|
|
32
37
|
**Task Summary**
|
|
38
|
+
|
|
33
39
|
- Completed: <!-- yes/no -->
|
|
34
40
|
- What was done: <!-- brief description -->
|
|
35
41
|
- Files changed: <!-- list key files -->
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
<!-- Tasks will be parsed and promoted to the Kanban board -->
|
|
5
5
|
|
|
6
6
|
## How To Use This File
|
|
7
|
+
|
|
7
8
|
- Create one task card per meaningful unit of delivery.
|
|
8
9
|
- Keep tasks dependency-ordered and independently executable where possible.
|
|
9
10
|
- Every task card must include enough context that a new agent can execute it without re-discovery work.
|
|
@@ -12,21 +13,26 @@
|
|
|
12
13
|
## 1. Delivery Overview
|
|
13
14
|
|
|
14
15
|
### 1.1 Objective
|
|
16
|
+
|
|
15
17
|
<One-paragraph summary of what this change delivers and why it matters.>
|
|
16
18
|
|
|
17
19
|
### 1.2 In-Scope Outcomes
|
|
20
|
+
|
|
18
21
|
- <Outcome 1>
|
|
19
22
|
- <Outcome 2>
|
|
20
23
|
|
|
21
24
|
### 1.3 Non-Goals
|
|
25
|
+
|
|
22
26
|
- <Non-goal 1>
|
|
23
27
|
- <Non-goal 2>
|
|
24
28
|
|
|
25
29
|
### 1.4 Global Constraints
|
|
30
|
+
|
|
26
31
|
- <Technical or product constraints that apply to all tasks>
|
|
27
32
|
- <Compatibility/performance/security constraints>
|
|
28
33
|
|
|
29
34
|
### 1.5 Shared References
|
|
35
|
+
|
|
30
36
|
- Proposal: `specflow/changes/<change-name>/proposal.md`
|
|
31
37
|
- Design: `specflow/changes/<change-name>/design.md`
|
|
32
38
|
- Specs: `specflow/changes/<change-name>/specs/spec.md`
|
|
@@ -37,6 +43,7 @@
|
|
|
37
43
|
## 2. Task Cards
|
|
38
44
|
|
|
39
45
|
### 2.1 Task: <short-task-title>
|
|
46
|
+
|
|
40
47
|
- [ ] **Status**
|
|
41
48
|
- **Task ID:** `<T1>`
|
|
42
49
|
- **Owner Type:** `<agent|human|either>`
|
|
@@ -50,6 +57,7 @@
|
|
|
50
57
|
<Domain and technical context required before editing. Include key assumptions.>
|
|
51
58
|
|
|
52
59
|
**Scope**
|
|
60
|
+
|
|
53
61
|
- In scope:
|
|
54
62
|
- <item>
|
|
55
63
|
- <item>
|
|
@@ -57,6 +65,7 @@
|
|
|
57
65
|
- <item>
|
|
58
66
|
|
|
59
67
|
**Implementation Targets**
|
|
68
|
+
|
|
60
69
|
- Files to create/update:
|
|
61
70
|
- `<path>`
|
|
62
71
|
- `<path>`
|
|
@@ -64,11 +73,13 @@
|
|
|
64
73
|
- `<API/type/command>`
|
|
65
74
|
|
|
66
75
|
**Execution Steps**
|
|
76
|
+
|
|
67
77
|
1. <Step 1 with expected output>
|
|
68
78
|
2. <Step 2 with expected output>
|
|
69
79
|
3. <Step 3 with expected output>
|
|
70
80
|
|
|
71
81
|
**Validation**
|
|
82
|
+
|
|
72
83
|
- Automated tests to add/update:
|
|
73
84
|
- `<test file>`
|
|
74
85
|
- Commands to run:
|
|
@@ -78,10 +89,12 @@
|
|
|
78
89
|
- <check>
|
|
79
90
|
|
|
80
91
|
**Acceptance Criteria**
|
|
92
|
+
|
|
81
93
|
- <Measurable criterion 1>
|
|
82
94
|
- <Measurable criterion 2>
|
|
83
95
|
|
|
84
96
|
**Risks and Mitigations**
|
|
97
|
+
|
|
85
98
|
- Risk: <risk>
|
|
86
99
|
- Mitigation: <mitigation>
|
|
87
100
|
|
|
@@ -89,7 +102,9 @@
|
|
|
89
102
|
<What the next task/agent should know, including outputs and unresolved items.>
|
|
90
103
|
|
|
91
104
|
**Task Summary**
|
|
105
|
+
|
|
92
106
|
<!-- To be filled by the agent after completing this task -->
|
|
107
|
+
|
|
93
108
|
- Completed: <!-- yes/no -->
|
|
94
109
|
- What was done: <!-- brief description -->
|
|
95
110
|
- Files changed: <!-- list key files -->
|
|
@@ -97,6 +112,7 @@
|
|
|
97
112
|
- Follow-ups: <!-- items deferred or discovered during implementation -->
|
|
98
113
|
|
|
99
114
|
### 2.2 Task: <short-task-title>
|
|
115
|
+
|
|
100
116
|
- [ ] **Status**
|
|
101
117
|
- **Task ID:** `<T2>`
|
|
102
118
|
- **Owner Type:** `<agent|human|either>`
|
|
@@ -110,6 +126,7 @@
|
|
|
110
126
|
<Domain and technical context required before editing. Include key assumptions.>
|
|
111
127
|
|
|
112
128
|
**Scope**
|
|
129
|
+
|
|
113
130
|
- In scope:
|
|
114
131
|
- <item>
|
|
115
132
|
- <item>
|
|
@@ -117,6 +134,7 @@
|
|
|
117
134
|
- <item>
|
|
118
135
|
|
|
119
136
|
**Implementation Targets**
|
|
137
|
+
|
|
120
138
|
- Files to create/update:
|
|
121
139
|
- `<path>`
|
|
122
140
|
- `<path>`
|
|
@@ -124,11 +142,13 @@
|
|
|
124
142
|
- `<API/type/command>`
|
|
125
143
|
|
|
126
144
|
**Execution Steps**
|
|
145
|
+
|
|
127
146
|
1. <Step 1 with expected output>
|
|
128
147
|
2. <Step 2 with expected output>
|
|
129
148
|
3. <Step 3 with expected output>
|
|
130
149
|
|
|
131
150
|
**Validation**
|
|
151
|
+
|
|
132
152
|
- Automated tests to add/update:
|
|
133
153
|
- `<test file>`
|
|
134
154
|
- Commands to run:
|
|
@@ -138,10 +158,12 @@
|
|
|
138
158
|
- <check>
|
|
139
159
|
|
|
140
160
|
**Acceptance Criteria**
|
|
161
|
+
|
|
141
162
|
- <Measurable criterion 1>
|
|
142
163
|
- <Measurable criterion 2>
|
|
143
164
|
|
|
144
165
|
**Risks and Mitigations**
|
|
166
|
+
|
|
145
167
|
- Risk: <risk>
|
|
146
168
|
- Mitigation: <mitigation>
|
|
147
169
|
|
|
@@ -149,7 +171,9 @@
|
|
|
149
171
|
<What the next task/agent should know, including outputs and unresolved items.>
|
|
150
172
|
|
|
151
173
|
**Task Summary**
|
|
174
|
+
|
|
152
175
|
<!-- To be filled by the agent after completing this task -->
|
|
176
|
+
|
|
153
177
|
- Completed: <!-- yes/no -->
|
|
154
178
|
- What was done: <!-- brief description -->
|
|
155
179
|
- Files changed: <!-- list key files -->
|
|
@@ -157,12 +181,14 @@
|
|
|
157
181
|
- Follow-ups: <!-- items deferred or discovered during implementation -->
|
|
158
182
|
|
|
159
183
|
## 3. Cross-Task Verification
|
|
184
|
+
|
|
160
185
|
- [ ] End-to-end behavior matches `specs/spec.md` requirements and scenarios.
|
|
161
186
|
- [ ] All affected tests are updated and passing.
|
|
162
187
|
- [ ] User-facing docs and command help are updated where behavior changed.
|
|
163
188
|
- [ ] Rollback path is documented for risky changes.
|
|
164
189
|
|
|
165
190
|
## 4. Completion Gate
|
|
191
|
+
|
|
166
192
|
- [ ] All task cards are checked complete.
|
|
167
193
|
- [ ] `node bin/specflow.js validate --change <change-name>` passes.
|
|
168
194
|
- [ ] Implementation summary and follow-up items are recorded in handoff notes.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { WebSocketServer, WebSocket } from
|
|
2
|
-
import { createConnection } from
|
|
1
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
2
|
+
import { createConnection } from 'net';
|
|
3
3
|
|
|
4
4
|
let wss: WebSocketServer | null = null;
|
|
5
5
|
const clients = new Set<WebSocket>();
|
|
@@ -25,7 +25,7 @@ function isPortInUse(port: number): Promise<boolean> {
|
|
|
25
25
|
client.end();
|
|
26
26
|
resolve(true);
|
|
27
27
|
});
|
|
28
|
-
client.on(
|
|
28
|
+
client.on('error', () => {
|
|
29
29
|
resolve(false);
|
|
30
30
|
});
|
|
31
31
|
});
|
|
@@ -46,28 +46,30 @@ export async function startWebSocketServer(port?: number): Promise<WebSocketServ
|
|
|
46
46
|
try {
|
|
47
47
|
wss = new WebSocketServer({ port: wsPort });
|
|
48
48
|
|
|
49
|
-
wss.on(
|
|
49
|
+
wss.on('connection', (ws) => {
|
|
50
50
|
clients.add(ws);
|
|
51
51
|
console.log(`[WebSocket] Client connected (total: ${clients.size})`);
|
|
52
52
|
|
|
53
|
-
ws.on(
|
|
53
|
+
ws.on('message', (data) => {
|
|
54
54
|
try {
|
|
55
55
|
const message = data.toString();
|
|
56
56
|
const parsed = JSON.parse(message);
|
|
57
57
|
|
|
58
58
|
// Identity handshake: MCP clients announce themselves
|
|
59
|
-
if (parsed.type ===
|
|
60
|
-
const agentName = parsed.agent ||
|
|
59
|
+
if (parsed.type === 'identify' && parsed.role === 'mcp') {
|
|
60
|
+
const agentName = parsed.agent || 'Unknown Agent';
|
|
61
61
|
const prev = agentClients.get(ws);
|
|
62
62
|
agentClients.set(ws, agentName);
|
|
63
63
|
if (prev !== agentName) {
|
|
64
|
-
console.log(
|
|
64
|
+
console.log(
|
|
65
|
+
`[WebSocket] MCP agent identified: ${agentName} (agents: ${agentClients.size})`,
|
|
66
|
+
);
|
|
65
67
|
broadcastAgentList();
|
|
66
68
|
}
|
|
67
69
|
return;
|
|
68
70
|
}
|
|
69
71
|
|
|
70
|
-
console.log(
|
|
72
|
+
console.log('[WebSocket] Relaying message:', message.substring(0, 100));
|
|
71
73
|
// Relay to all non-sender clients (browser UIs)
|
|
72
74
|
clients.forEach((client) => {
|
|
73
75
|
if (client !== ws && client.readyState === WebSocket.OPEN) {
|
|
@@ -75,11 +77,11 @@ export async function startWebSocketServer(port?: number): Promise<WebSocketServ
|
|
|
75
77
|
}
|
|
76
78
|
});
|
|
77
79
|
} catch (error) {
|
|
78
|
-
console.error(
|
|
80
|
+
console.error('[WebSocket] Error relaying message:', error);
|
|
79
81
|
}
|
|
80
82
|
});
|
|
81
83
|
|
|
82
|
-
ws.on(
|
|
84
|
+
ws.on('close', () => {
|
|
83
85
|
const wasAgent = agentClients.has(ws);
|
|
84
86
|
agentClients.delete(ws);
|
|
85
87
|
clients.delete(ws);
|
|
@@ -90,18 +92,18 @@ export async function startWebSocketServer(port?: number): Promise<WebSocketServ
|
|
|
90
92
|
}
|
|
91
93
|
});
|
|
92
94
|
|
|
93
|
-
ws.on(
|
|
94
|
-
console.error(
|
|
95
|
+
ws.on('error', (error) => {
|
|
96
|
+
console.error('[WebSocket] Client error:', error);
|
|
95
97
|
agentClients.delete(ws);
|
|
96
98
|
clients.delete(ws);
|
|
97
99
|
});
|
|
98
100
|
});
|
|
99
101
|
|
|
100
|
-
wss.on(
|
|
101
|
-
if (error.code ===
|
|
102
|
+
wss.on('error', (error: NodeJS.ErrnoException) => {
|
|
103
|
+
if (error.code === 'EADDRINUSE') {
|
|
102
104
|
console.log(`[WebSocket] Port ${wsPort} already in use, skipping`);
|
|
103
105
|
} else {
|
|
104
|
-
console.error(
|
|
106
|
+
console.error('[WebSocket] Server error:', error);
|
|
105
107
|
}
|
|
106
108
|
wss = null;
|
|
107
109
|
});
|
|
@@ -124,7 +126,7 @@ export async function startWebSocketServer(port?: number): Promise<WebSocketServ
|
|
|
124
126
|
|
|
125
127
|
console.log(`[WebSocket] Server started on port ${wsPort}`);
|
|
126
128
|
} catch (error) {
|
|
127
|
-
console.error(
|
|
129
|
+
console.error('[WebSocket] Failed to start server:', error);
|
|
128
130
|
return null;
|
|
129
131
|
}
|
|
130
132
|
|
|
@@ -149,7 +151,7 @@ export function getAgentList(): string[] {
|
|
|
149
151
|
|
|
150
152
|
function broadcastAgentList() {
|
|
151
153
|
const agents = getAgentList();
|
|
152
|
-
const msg = JSON.stringify({ type:
|
|
154
|
+
const msg = JSON.stringify({ type: 'agent_count', count: agents.length, agents });
|
|
153
155
|
clients.forEach((client) => {
|
|
154
156
|
if (!agentClients.has(client) && client.readyState === WebSocket.OPEN) {
|
|
155
157
|
client.send(msg);
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
"target": "ES2017",
|
|
4
|
-
"lib": [
|
|
5
|
-
"dom",
|
|
6
|
-
"dom.iterable",
|
|
7
|
-
"esnext"
|
|
8
|
-
],
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
9
5
|
"allowJs": true,
|
|
10
6
|
"skipLibCheck": true,
|
|
11
7
|
"strict": true,
|
|
@@ -23,9 +19,7 @@
|
|
|
23
19
|
}
|
|
24
20
|
],
|
|
25
21
|
"paths": {
|
|
26
|
-
"@/*": [
|
|
27
|
-
"./src/*"
|
|
28
|
-
]
|
|
22
|
+
"@/*": ["./src/*"]
|
|
29
23
|
}
|
|
30
24
|
},
|
|
31
25
|
"include": [
|
|
@@ -35,8 +29,5 @@
|
|
|
35
29
|
".next/types/**/*.ts",
|
|
36
30
|
".next/dev/types/**/*.ts"
|
|
37
31
|
],
|
|
38
|
-
"exclude": [
|
|
39
|
-
"node_modules",
|
|
40
|
-
"**/*.test.ts"
|
|
41
|
-
]
|
|
32
|
+
"exclude": ["node_modules", "**/*.test.ts"]
|
|
42
33
|
}
|