@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
package/.next/standalone/.next/server/chunks/ssr/src_components_kanban-board_tsx_7b875e8e._.js
CHANGED
|
@@ -2,6 +2,6 @@ module.exports=[89077,a=>{"use strict";let b,c,d,e,f,g,h;var i,j,k,l,m,n,o,p,q,r
|
|
|
2
2
|
|
|
3
3
|
If you want to hide the \`${b.titleName}\`, you can wrap it with our VisuallyHidden component.
|
|
4
4
|
|
|
5
|
-
For more information, see https://radix-ui.com/primitives/docs/components/${b.docsSlug}`;return L.useEffect(()=>{a&&(document.getElementById(a)||console.error(c))},[c,a]),null},dE=({contentRef:a,descriptionId:b})=>{let c=dC("DialogDescriptionWarning"),d=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${c.contentName}}.`;return L.useEffect(()=>{let c=a.current?.getAttribute("aria-describedby");b&&c&&(document.getElementById(b)||console.warn(d))},[d,a,b]),null};let dF=bW("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),dG=L.forwardRef(({className:a,...b},c)=>(0,K.jsx)(dk,{ref:c,className:(0,bK.cn)("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...b}));dG.displayName=dk.displayName;let dH=L.forwardRef(({className:a,children:b,...c},d)=>(0,K.jsxs)(di,{children:[(0,K.jsx)(dG,{}),(0,K.jsxs)(dp,{ref:d,className:(0,bK.cn)("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border-4 border-black bg-white p-6 neubrutalism-shadow-xl duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",a),...c,children:[b,(0,K.jsxs)(dy,{className:"absolute right-4 top-4 border-2 border-black bg-white p-1 hover:bg-gray-100 focus:outline-none",children:[(0,K.jsx)(dF,{className:"h-4 w-4"}),(0,K.jsx)("span",{className:"sr-only",children:"Close"})]})]})]}));dH.displayName=dp.displayName;let dI=({className:a,...b})=>(0,K.jsx)("div",{className:(0,bK.cn)("flex flex-col space-y-1.5 text-center sm:text-left",a),...b});dI.displayName="DialogHeader";let dJ=L.forwardRef(({className:a,...b},c)=>(0,K.jsx)(du,{ref:c,className:(0,bK.cn)("text-2xl font-bold uppercase tracking-wide leading-none",a),...b}));dJ.displayName=du.displayName,L.forwardRef(({className:a,...b},c)=>(0,K.jsx)(dw,{ref:c,className:(0,bK.cn)("text-sm text-muted-foreground",a),...b})).displayName=dw.displayName;let dK=bW("clock",[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);var dL=a.i(22249);function dM({task:a,open:b,onOpenChange:c,onRefresh:d}){let[e,f]=(0,L.useState)(a.title),[g,h]=(0,L.useState)(a.priority),[i,j]=(0,L.useState)(a.status),[k,l]=(0,L.useState)(a.body),[m,n]=(0,L.useState)(!1);async function o(){n(!0);try{await fetch(`/api/tasks/${a.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:e,priority:g,status:i})}),d(),c(!1)}catch(a){console.error("Failed to update task:",a)}finally{n(!1)}}return(0,L.useEffect)(()=>{b&&fetch(`/api/tasks/${a.id}`).then(a=>a.json()).then(a=>{f(a.title),h(a.priority),j(a.status),l(a.body)}).catch(()=>{f(a.title),h(a.priority),j(a.status),l(a.body)})},[b,a.id]),(0,K.jsx)(dd,{open:b,onOpenChange:c,children:(0,K.jsxs)(dH,{className:"max-w-2xl max-h-[90vh] overflow-y-auto",children:[(0,K.jsx)(dI,{children:(0,K.jsx)(dJ,{children:"Edit Task"})}),(0,K.jsxs)("div",{className:"space-y-4",children:[(0,K.jsxs)("div",{children:[(0,K.jsx)("label",{className:"text-xs font-bold uppercase tracking-wide mb-2 block",children:"Title"}),(0,K.jsx)("input",{type:"text",value:e,onChange:a=>f(a.target.value),className:"w-full px-4 py-3 border-3 border-black font-bold focus:outline-none focus:shadow-[4px_4px_0px_0px_rgba(0,0,0,1)]",placeholder:"Task title"})]}),(0,K.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,K.jsxs)("div",{children:[(0,K.jsx)("label",{className:"text-xs font-bold uppercase tracking-wide mb-2 block",children:"Priority"}),(0,K.jsxs)("select",{value:g,onChange:a=>h(a.target.value),className:"w-full px-4 py-3 border-3 border-black font-bold uppercase focus:outline-none focus:shadow-[4px_4px_0px_0px_rgba(0,0,0,1)]",children:[(0,K.jsx)("option",{value:"low",children:"Low"}),(0,K.jsx)("option",{value:"medium",children:"Medium"}),(0,K.jsx)("option",{value:"high",children:"High"}),(0,K.jsx)("option",{value:"urgent",children:"Urgent"})]})]}),(0,K.jsxs)("div",{children:[(0,K.jsx)("label",{className:"text-xs font-bold uppercase tracking-wide mb-2 block",children:"Status"}),(0,K.jsxs)("select",{value:i,onChange:a=>j(a.target.value),className:"w-full px-4 py-3 border-3 border-black font-bold uppercase focus:outline-none focus:shadow-[4px_4px_0px_0px_rgba(0,0,0,1)]",children:[(0,K.jsx)("option",{value:"backlog",children:"Backlog"}),(0,K.jsx)("option",{value:"todo",children:"To Do"}),(0,K.jsx)("option",{value:"in_progress",children:"In Progress"}),(0,K.jsx)("option",{value:"interrupted",children:"Interrupted"}),(0,K.jsx)("option",{value:"done",children:"Done"})]})]})]}),a.specName&&(0,K.jsxs)("div",{children:[(0,K.jsx)("label",{className:"text-xs font-bold uppercase tracking-wide mb-2 block",children:"Spec"}),(0,K.jsx)("div",{className:"px-4 py-2 border-2 border-black bg-gray-50 font-mono text-sm",children:a.specName})]}),k&&(0,K.jsxs)("div",{children:[(0,K.jsx)("label",{className:"text-xs font-bold uppercase tracking-wide mb-2 block",children:"Task Card"}),(0,K.jsx)("div",{className:"w-full px-4 py-3 border-2 border-black bg-gray-50 min-h-[100px] text-sm overflow-auto max-h-[300px]",children:(0,K.jsx)(dL.MarkdownPreview,{content:k})})]}),(0,K.jsxs)("div",{className:"flex flex-wrap gap-3 pt-4 border-t-3 border-black",children:[a.assignedAgent&&(0,K.jsxs)(bQ,{variant:"secondary",className:"gap-1",children:[(0,K.jsx)(bY,{className:"h-3 w-3"}),a.assignedAgent]}),(0,K.jsxs)(bQ,{variant:"outline",className:"gap-1",children:[(0,K.jsx)(dK,{className:"h-3 w-3"}),"Created: ",new Date(a.createdAt).toLocaleDateString()]}),a.updatedAt&&a.updatedAt!==a.createdAt&&(0,K.jsxs)(bQ,{variant:"outline",className:"gap-1",children:[(0,K.jsx)(dK,{className:"h-3 w-3"}),"Updated: ",new Date(a.updatedAt).toLocaleDateString()]})]}),(0,K.jsxs)("div",{className:"flex justify-end gap-3 pt-4 border-t-3 border-black",children:[(0,K.jsx)(bR.Button,{variant:"outline",onClick:()=>c(!1),disabled:m,children:"Cancel"}),(0,K.jsx)(bR.Button,{onClick:o,disabled:m,children:m?"Saving...":"Save Changes"})]})]})]})})}let dN={low:"bg-[--color-primary] text-black",medium:"bg-[--color-secondary] text-black",high:"bg-orange-300 text-black",urgent:"bg-[--color-accent] text-black"};function dO({task:a,onRefresh:b}){let[c,d]=(0,L.useState)(!1),{attributes:e,listeners:f,setNodeRef:g,transform:h,transition:i,isDragging:j}=function(a){var b,c,d,e;let{animateLayoutChanges:f=bF,attributes:g,disabled:h,data:i,getNewIndex:j=bE,id:k,strategy:l,resizeObserverConfig:m,transition:n=bG}=a,{items:o,containerId:p,activeIndex:q,disabled:r,disableTransforms:s,sortedRects:t,overIndex:u,useDragOverlay:v,strategy:w}=(0,L.useContext)(bC),x=(b=h,c=r,"boolean"==typeof b?{draggable:b,droppable:!1}:{draggable:null!=(d=null==b?void 0:b.draggable)?d:c.draggable,droppable:null!=(e=null==b?void 0:b.droppable)?e:c.droppable}),y=o.indexOf(k),z=(0,L.useMemo)(()=>({sortable:{containerId:p,index:y,items:o},...i}),[p,i,y,o]),A=(0,L.useMemo)(()=>o.slice(o.indexOf(k)),[o,k]),{rect:B,node:C,isOver:D,setNodeRef:E}=bm({id:k,data:z,disabled:x.droppable,resizeObserverConfig:{updateMeasurementsFor:A,...m}}),{active:F,activatorEvent:G,activeNodeRect:H,attributes:I,setNodeRef:J,listeners:K,isDragging:M,over:N,setActivatorNodeRef:O,transform:P}=function(a){let{id:b,data:c,disabled:d=!1,attributes:e}=a,f=_("Draggable"),{activators:g,activatorEvent:h,active:i,activeNodeRect:j,ariaDescribedById:k,draggableNodes:l,over:m}=(0,L.useContext)(ba),{role:n=bj,roleDescription:o="draggable",tabIndex:p=0}=null!=e?e:{},q=(null==i?void 0:i.id)===b,r=(0,L.useContext)(q?bg:bi),[s,t]=Y(),[u,v]=Y(),w=(0,L.useMemo)(()=>g.reduce((a,c)=>{let{eventName:d,handler:e}=c;return a[d]=a=>{e(a,b)},a},{}),[g,b]),x=W(c);return U(()=>(l.set(b,{id:b,key:f,node:s,activatorNode:u,data:x}),()=>{let a=l.get(b);a&&a.key===f&&l.delete(b)}),[l,b]),{active:i,activatorEvent:h,activeNodeRect:j,attributes:(0,L.useMemo)(()=>({role:n,tabIndex:p,"aria-disabled":d,"aria-pressed":!!q&&n===bj||void 0,"aria-roledescription":o,"aria-describedby":k.draggable}),[d,n,p,q,o,k.draggable]),isDragging:q,listeners:d?void 0:w,node:s,over:m,setNodeRef:t,setActivatorNodeRef:v,transform:r}}({id:k,data:z,attributes:{...bJ,...g},disabled:x.draggable}),Q=function(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];return(0,L.useMemo)(()=>a=>{b.forEach(b=>b(a))},b)}(E,J),R=!!F,S=R&&!s&&bx(q)&&bx(u),T=!v&&M,V=T&&S?P:null,X=S?null!=V?V:(null!=l?l:w)({rects:t,activeNodeRect:H,activeIndex:q,overIndex:u,index:y}):null,Z=bx(q)&&bx(u)?j({id:k,items:o,activeIndex:q,overIndex:u}):y,$=null==F?void 0:F.id,aa=(0,L.useRef)({activeId:$,items:o,newIndex:Z,containerId:p}),ab=o!==aa.current.items,ac=f({active:F,containerId:p,isDragging:M,isSorting:R,id:k,index:y,items:o,newIndex:aa.current.newIndex,previousItems:aa.current.items,previousContainerId:aa.current.containerId,transition:n,wasDragging:null!=aa.current.activeId}),ae=function(a){let{disabled:b,index:c,node:d,rect:e}=a,[f,g]=(0,L.useState)(null),h=(0,L.useRef)(c);return U(()=>{if(!b&&c!==h.current&&d.current){let a=e.current;if(a){let b=aw(d.current,{ignoreTransform:!0}),c={x:a.left-b.left,y:a.top-b.top,scaleX:a.width/b.width,scaleY:a.height/b.height};(c.x||c.y)&&g(c)}}c!==h.current&&(h.current=c)},[b,c,d,e]),(0,L.useEffect)(()=>{f&&g(null)},[f]),f}({disabled:!ac,index:y,node:C,rect:B});return(0,L.useEffect)(()=>{R&&aa.current.newIndex!==Z&&(aa.current.newIndex=Z),p!==aa.current.containerId&&(aa.current.containerId=p),o!==aa.current.items&&(aa.current.items=o)},[R,Z,p,o]),(0,L.useEffect)(()=>{if($===aa.current.activeId)return;if(null!=$&&null==aa.current.activeId){aa.current.activeId=$;return}let a=setTimeout(()=>{aa.current.activeId=$},50);return()=>clearTimeout(a)},[$]),{active:F,activeIndex:q,attributes:I,data:z,rect:B,index:y,newIndex:Z,items:o,isOver:D,isSorting:R,isDragging:M,listeners:K,node:C,overIndex:u,over:N,setNodeRef:Q,setActivatorNodeRef:O,setDroppableNodeRef:E,setDraggableNodeRef:J,transform:null!=ae?ae:X,transition:ae||ab&&aa.current.newIndex===y?bI:(!T||ad(G))&&n&&(R||ac)?af.Transition.toString({...n,property:bH}):void 0}}({id:a.id}),k={transform:af.Transform.toString(h),transition:i};async function l(c){if(c.stopPropagation(),confirm("Are you sure you want to delete this task?"))try{await fetch(`/api/tasks/${a.id}`,{method:"DELETE"}),b()}catch(a){console.error("Failed to delete task:",a)}}return(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)("div",{ref:g,style:k,className:(0,bK.cn)("cursor-pointer transition-opacity",j&&"opacity-50"),children:(0,K.jsxs)(bL,{className:(0,bK.cn)("hover:translate-x-0.5 hover:translate-y-0.5 transition-transform cursor-pointer","interrupted"===a.status&&"border-amber-500 bg-amber-50"),onClick:()=>d(!0),children:[(0,K.jsx)(bM,{className:"pb-3",children:(0,K.jsxs)("div",{className:"flex items-start justify-between gap-2",children:[(0,K.jsx)("div",{className:"flex-1 min-w-0",children:(0,K.jsx)(bN,{className:"text-sm line-clamp-2",children:a.title})}),(0,K.jsxs)("div",{className:"flex items-center gap-1",children:[(0,K.jsx)(bR.Button,{variant:"ghost",size:"icon",className:"h-6 w-6 cursor-grab active:cursor-grabbing border-2 border-black",...e,...f,onClick:a=>a.stopPropagation(),children:(0,K.jsx)(bX,{className:"h-4 w-4"})}),(0,K.jsx)(bR.Button,{variant:"ghost",size:"icon",className:"h-6 w-6 border-2 border-black bg-[--color-accent] hover:bg-red-400",onClick:l,children:(0,K.jsx)(b$,{className:"h-3 w-3"})})]})]})}),(0,K.jsx)(bO,{className:"space-y-2",children:(0,K.jsxs)("div",{className:"flex flex-wrap gap-2",children:["interrupted"===a.status&&(0,K.jsxs)(bQ,{variant:"outline",className:"text-xs gap-1 border-amber-500 text-amber-700 bg-amber-50",children:[(0,K.jsx)(b_,{className:"h-3 w-3"}),"Interrupted"]}),a.specName&&(0,K.jsx)(bQ,{variant:"outline",className:"text-xs font-mono",children:a.specName}),(0,K.jsx)(bQ,{variant:"outline",className:(0,bK.cn)("text-xs",dN[a.priority]),children:a.priority}),a.assignedAgent&&(0,K.jsxs)(bQ,{variant:"secondary",className:"text-xs gap-1",children:[(0,K.jsx)(bY,{className:"h-3 w-3"}),a.assignedAgent]}),a.body&&(0,K.jsxs)(bQ,{variant:"outline",className:"text-xs gap-1",children:[(0,K.jsx)(bZ,{className:"h-3 w-3"}),"Notes"]})]})})]})}),(0,K.jsx)(dM,{task:a,features:[],open:c,onOpenChange:d,onRefresh:b})]})}function dP({id:a,title:b,color:c,tasks:d,onRefresh:e}){let{setNodeRef:f,isOver:g}=bm({id:a});return(0,K.jsxs)("div",{className:"flex flex-col h-full min-h-0",children:[(0,K.jsx)("div",{className:(0,bK.cn)("px-4 py-3 border-3 border-black border-b-0",c),children:(0,K.jsxs)("h2",{className:"font-black uppercase tracking-wide text-black flex items-center justify-between",children:[(0,K.jsx)("span",{children:b}),(0,K.jsx)("span",{className:"text-sm font-bold bg-black text-white px-2 py-1",children:d.length})]})}),(0,K.jsxs)("div",{ref:f,className:(0,bK.cn)("flex-1 overflow-y-auto p-4 space-y-3 bg-white border-3 border-black transition-colors",g&&"bg-gray-100"),children:[(0,K.jsx)(bD,{items:d.map(a=>a.id),strategy:bA,children:d.map(a=>(0,K.jsx)(dO,{task:a,feature:void 0,features:[],onRefresh:e},a.id))}),0===d.length&&(0,K.jsx)("div",{className:"text-center text-gray-500 font-bold text-sm py-8 uppercase",children:"Drop tasks here"})]})]})}let dQ=bW("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]),dR=bW("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]),dS=bW("circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),dT=bW("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]),dU={blocked:"bg-gray-300",ready:"bg-blue-400",in_review:"bg-yellow-400",in_progress:"bg-orange-400",done:"bg-green-500"},dV={done:(0,K.jsx)(dR,{className:"h-3 w-3 text-green-600"}),in_review:(0,K.jsx)(dK,{className:"h-3 w-3 text-yellow-500"}),in_progress:(0,K.jsx)(dK,{className:"h-3 w-3 text-orange-500"}),ready:(0,K.jsx)(dS,{className:"h-3 w-3 text-blue-500"}),blocked:(0,K.jsx)(dT,{className:"h-3 w-3 text-gray-400"})},dW={done:"done",in_review:"in review",in_progress:"in progress",ready:"ready",blocked:"blocked"};function dX({spec:a,selected:b,onClick:c}){let d,e=a.statuses?0===(d=a.statuses.filter(a=>"development"!==a.id)).length?"ready":d.every(a=>"done"===a.state)?"done":d.some(a=>"in_review"===a.state||"in_progress"===a.state)?"in_review":d.some(a=>"ready"===a.state)?"ready":"blocked":"ready",f=a.statuses?.filter(a=>"development"!==a.id)??[];return(0,K.jsxs)("button",{onClick:c,className:`w-full text-left p-3 border-4 transition-all ${b?"border-black bg-black text-white shadow-none translate-x-[2px] translate-y-[2px]":"border-black bg-white shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] hover:translate-x-[2px] hover:translate-y-[2px] hover:shadow-none"}`,children:[(0,K.jsxs)("div",{className:"flex items-start justify-between gap-1 mb-2",children:[(0,K.jsx)("span",{className:`font-black text-xs uppercase leading-tight line-clamp-2 flex-1 ${b?"text-white":""}`,children:a.title||a.name}),(0,K.jsx)("span",{className:"flex-shrink-0 mt-0.5",children:dV[e]})]}),(0,K.jsx)("p",{className:`font-mono text-[10px] mb-2 truncate ${b?"text-gray-300":"text-gray-400"}`,children:a.name}),f.length>0&&(0,K.jsxs)("div",{className:"flex gap-1 items-center",children:[f.map(a=>(0,K.jsx)("div",{title:`${a.id}: ${a.state}`,className:`w-2 h-2 rounded-full border border-black ${b?"border-gray-400":""} ${dU[a.state]}`},a.id)),(0,K.jsx)("span",{className:`text-[10px] font-bold uppercase ml-1 ${b?"text-gray-300":"text-gray-400"}`,children:dW[e]})]})]})}function dY({selectedSpecName:a,onSelectSpec:b}){let[c,d]=(0,L.useState)([]),[e,f]=(0,L.useState)(!0);return(0,L.useEffect)(()=>{!async function(){try{let a=await fetch("/api/specs"),b=await a.json(),c=await Promise.all(b.map(async a=>{try{let b=await fetch(`/api/specs/${a.name}`),c=await b.json();return{...a,statuses:c.statuses}}catch{return a}}));d(c)}catch(a){console.error(a)}finally{f(!1)}}()},[]),(0,K.jsxs)("div",{className:"flex flex-col h-full min-h-0 border-r-4 border-black bg-[--color-bg]",style:{width:220,flexShrink:0},children:[(0,K.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b-4 border-black bg-[--color-secondary] flex-shrink-0",children:[(0,K.jsx)("h2",{className:"font-black uppercase text-sm tracking-wide",children:"Specs"}),(0,K.jsxs)("span",{className:"text-xs font-bold opacity-60",children:["(",c.length,")"]})]}),(0,K.jsxs)("div",{className:"flex-1 overflow-y-auto p-3 flex flex-col gap-2",children:[e&&(0,K.jsx)("p",{className:"text-xs text-gray-400 font-mono px-1",children:"Loading..."}),!e&&0===c.length&&(0,K.jsx)("p",{className:"text-xs text-gray-400 font-mono px-1",children:"No specs yet."}),c.map(c=>(0,K.jsx)(dX,{spec:c,selected:a===c.name,onClick:()=>b(c.name)},c.name))]})]})}let dZ=bW("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);var d$=a.i(56631),d_=a.i(66132);let d0={blocked:(0,K.jsx)(dT,{className:"h-3 w-3 text-gray-400 flex-shrink-0"}),ready:(0,K.jsx)(dS,{className:"h-3 w-3 text-blue-500 flex-shrink-0"}),in_review:(0,K.jsx)(dK,{className:"h-3 w-3 text-yellow-500 flex-shrink-0"}),in_progress:(0,K.jsx)(dK,{className:"h-3 w-3 text-orange-500 flex-shrink-0"}),done:(0,K.jsx)(dR,{className:"h-3 w-3 text-green-600 flex-shrink-0"})},d1={backlog:"bg-gray-100 border-gray-400 text-gray-600",todo:"bg-blue-100 border-blue-400 text-blue-700",in_progress:"bg-orange-100 border-orange-400 text-orange-700",interrupted:"bg-red-100 border-red-400 text-red-700",done:"bg-green-100 border-green-500 text-green-700"},d2={urgent:"text-red-600",high:"text-orange-500",medium:"text-gray-500",low:"text-gray-400"};function d3({tasks:a,status:b}){let c=a.length,d=a.filter(a=>"done"===a.status).length,e=a.filter(a=>"in_progress"===a.status).length;return b?.state==="blocked"?(0,K.jsxs)("div",{className:"p-6 bg-gray-100 border-4 border-gray-300 text-center",children:[(0,K.jsx)("p",{className:"font-bold text-gray-600 uppercase",children:"Blocked — approve and promote tasks first"}),(0,K.jsx)("p",{className:"text-sm text-gray-500 mt-1",children:"Approve all artifacts, then click “Promote to Tasks”"})]}):0===a.length?(0,K.jsxs)("div",{className:"p-6 bg-blue-50 border-4 border-blue-300 text-center",children:[(0,K.jsx)("p",{className:"font-bold text-blue-700 uppercase",children:"Ready to promote"}),(0,K.jsx)("p",{className:"text-sm text-blue-600 mt-1",children:"All artifacts approved. Promote tasks to start development."})]}):(0,K.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,K.jsxs)("div",{className:"flex items-center gap-3",children:[(0,K.jsx)("div",{className:"flex-1 h-3 bg-gray-200 border-2 border-black overflow-hidden",children:(0,K.jsx)("div",{className:"h-full bg-green-500 transition-all",style:{width:`${c>0?d/c*100:0}%`}})}),(0,K.jsxs)("span",{className:"font-mono text-sm font-bold whitespace-nowrap",children:[d,"/",c," done",e>0&&(0,K.jsxs)("span",{className:"text-orange-600 ml-2",children:["· ",e," in progress"]})]})]}),(0,K.jsx)("div",{className:"flex flex-col gap-2",children:a.map(a=>(0,K.jsxs)("div",{className:"flex items-center gap-3 p-3 border-4 border-black bg-white",children:[(0,K.jsx)("span",{className:`text-lg ${"done"===a.status?"opacity-100":"opacity-30"}`,children:"done"===a.status?"✓":"in_progress"===a.status?"⟳":"○"}),(0,K.jsx)("span",{className:`flex-1 font-bold text-sm ${"done"===a.status?"line-through text-gray-400":""}`,children:a.title}),(0,K.jsx)("span",{className:`text-xs font-mono uppercase font-bold ${d2[a.priority]||""}`,children:a.priority}),(0,K.jsx)("span",{className:`px-2 py-0.5 border-2 text-xs font-bold uppercase ${d1[a.status]||""}`,children:a.status.replace("_"," ")}),a.assignedAgent&&(0,K.jsxs)("span",{className:"text-xs font-mono text-gray-500 truncate max-w-[120px]",title:a.assignedAgent,children:["@",a.assignedAgent]})]},a.id))})]})}function d4({specName:a,onClose:b}){let[c,d]=(0,L.useState)(null),[e,f]=(0,L.useState)(null),[g,h]=(0,L.useState)(!1);async function i(){let b=await fetch(`/api/specs/${a}`),c=await b.json();d(c),!e&&c.statuses?.length&&f(c.statuses[0].id)}async function j(){h(!0);try{let b=await fetch(`/api/specs/${a}/promote`,{method:"POST"}),c=await b.json();b.ok?(alert(`Promoted ${c.promoted} tasks to Kanban board!`),i()):alert(`Error: ${c.error}`)}finally{h(!1)}}(0,L.useEffect)(()=>{i()},[a]);let k=c?.statuses.filter(a=>"development"!==a.id)??[],l=c?.statuses.find(a=>"development"===a.id),m=k.every(a=>"done"===a.state),n=c?.statuses.find(a=>a.id===e),o="development"===e;return(0,K.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60",onClick:a=>{a.target===a.currentTarget&&b()},children:(0,K.jsxs)("div",{className:"bg-white border-4 border-black shadow-[8px_8px_0px_0px_rgba(0,0,0,1)] flex flex-col",style:{width:"min(1300px, 96vw)",height:"min(920px, 94vh)"},children:[(0,K.jsxs)("div",{className:"flex items-center justify-between px-6 py-4 border-b-4 border-black bg-white flex-shrink-0",children:[(0,K.jsxs)("div",{children:[(0,K.jsx)("h2",{className:"text-2xl font-black uppercase leading-tight",children:c?.title||a}),(0,K.jsx)("p",{className:"font-mono text-xs text-gray-500 mt-0.5",children:a})]}),(0,K.jsx)("button",{onClick:b,className:"p-2 border-4 border-black hover:bg-black hover:text-white transition-colors",children:(0,K.jsx)(dF,{className:"h-5 w-5"})})]}),c&&(0,K.jsx)("div",{className:"px-6 py-3 border-b-4 border-black bg-white flex-shrink-0",children:(0,K.jsx)(d_.ArtifactDagStatus,{statuses:c.statuses})}),m&&c?.tasks.length===0&&(0,K.jsxs)("div",{className:"px-6 py-3 border-b-4 border-green-600 bg-green-100 flex-shrink-0 flex items-center justify-between",children:[(0,K.jsx)("p",{className:"font-black text-green-800 uppercase text-sm",children:"All artifacts approved!"}),(0,K.jsx)(bR.Button,{onClick:j,disabled:g,className:"bg-green-600 hover:bg-green-700 text-white",children:g?"Promoting...":"Promote to Tasks"})]}),l?.state==="done"&&(0,K.jsx)("div",{className:"px-6 py-3 border-b-4 border-green-600 bg-green-100 flex-shrink-0",children:(0,K.jsxs)("p",{className:"font-black text-green-800 uppercase text-sm",children:["✓ Spec complete — all ",c?.tasks.length," tasks done"]})}),(0,K.jsxs)("div",{className:"flex flex-1 min-h-0",children:[(0,K.jsxs)("div",{className:"w-60 border-r-4 border-black bg-white flex flex-col flex-shrink-0 overflow-y-auto",children:[(0,K.jsx)("div",{className:"px-3 py-2 border-b-2 border-gray-200",children:(0,K.jsxs)("span",{className:"font-mono text-[10px] text-gray-400 uppercase tracking-widest",children:[a,"/"]})}),(0,K.jsx)("div",{className:"flex-1 py-1",children:c?(0,K.jsxs)(K.Fragment,{children:[k.map(a=>(0,K.jsxs)("button",{onClick:()=>f(a.id),className:`w-full flex items-center gap-2 px-3 py-2 text-left transition-colors group ${e===a.id?"bg-black text-white":"hover:bg-gray-100"}`,children:[(0,K.jsx)(dZ,{className:`h-3 w-3 flex-shrink-0 ${e===a.id?"text-white":"text-gray-300"}`}),(0,K.jsx)(bZ,{className:`h-3.5 w-3.5 flex-shrink-0 ${e===a.id?"text-white":"text-gray-400"}`}),(0,K.jsxs)("span",{className:"font-mono text-xs font-bold flex-1 truncate",children:[a.id,".md"]}),(0,K.jsx)("span",{className:e===a.id?"text-white opacity-70":"",children:d0[a.state]})]},a.id)),(m||c.tasks.length>0)&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)("div",{className:"mx-3 my-1 border-t border-dashed border-gray-200"}),(0,K.jsxs)("button",{onClick:()=>f("development"),className:`w-full flex items-center gap-2 px-3 py-2 text-left transition-colors ${"development"===e?"bg-black text-white":"hover:bg-gray-100"}`,children:[(0,K.jsx)(dZ,{className:`h-3 w-3 flex-shrink-0 ${"development"===e?"text-white":"text-gray-300"}`}),(0,K.jsx)(bZ,{className:`h-3.5 w-3.5 flex-shrink-0 ${"development"===e?"text-white":"text-gray-400"}`}),(0,K.jsx)("span",{className:"font-mono text-xs font-bold flex-1",children:"development"}),(0,K.jsx)("span",{className:"development"===e?"text-white opacity-70":"",children:l?d0[l.state]:null})]})]})]}):(0,K.jsx)("div",{className:"px-4 py-3 text-xs text-gray-400 font-mono",children:"Loading..."})})]}),(0,K.jsx)("div",{className:"flex-1 flex flex-col min-h-0 p-6",children:c?e?o?(0,K.jsx)(d3,{tasks:c.tasks,status:l}):n?(0,K.jsx)(d$.ArtifactEditor,{specName:a,artifactType:e,content:c.artifacts[e]??null,status:n,onSave:i,defaultMode:"preview"},e):null:null:(0,K.jsx)("div",{className:"flex items-center justify-center h-full",children:(0,K.jsx)("span",{className:"text-gray-400 font-mono text-sm",children:"Loading..."})})})]})]})})}let d5=[{id:"backlog",title:"Backlog",color:"bg-gray-200"},{id:"todo",title:"To Do",color:"bg-[--color-primary]"},{id:"in_progress",title:"In Progress",color:"bg-[--color-secondary]"},{id:"done",title:"Done",color:"bg-[--color-success]"}],d6=new Set(d5.map(a=>a.id)),d7="devflow-selected-project";function d8(){var a;let[b,c]=(0,L.useState)([]),[d,e]=(0,L.useState)([]),[f,g]=(0,L.useState)(null),[h,i]=(0,L.useState)(null),[j,k]=(0,L.useState)(!1),[l,m]=(0,L.useState)(null),[n,o]=(0,L.useState)(!0),[p,q]=(0,L.useState)(!1),[r,s]=(0,L.useState)(!1);(0,L.useRef)(null).current=f;let t=function(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];return(0,L.useMemo)(()=>[...b].filter(a=>null!=a),[...b])}((a={activationConstraint:{distance:8}},(0,L.useMemo)(()=>({sensor:aU,options:null!=a?a:{}}),[aU,a])));(0,L.useEffect)(()=>{let a=localStorage.getItem(d7);a&&g("all"===a?null:a),s(!0)},[]);let u=(0,L.useCallback)(a=>{g(a),i(null),localStorage.setItem(d7,a||"all"),q(!1)},[]);async function v(){try{let a=await fetch("/api/projects"),b=await a.json();e(b),r&&f?!b.some(a=>a.id===f)&&b.length>0&&u(b[0].id):r&&!f&&!localStorage.getItem(d7)&&b.length>0&&u(b[0].id)}catch(a){console.error("Failed to fetch projects:",a)}}async function w(){try{let a=await fetch("/api/tasks"),b=await a.json();c(b)}catch(a){console.error("Failed to fetch tasks:",a)}finally{o(!1)}}async function x(a,b){try{await fetch(`/api/tasks/${a}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:b})}),await w()}catch(a){console.error("Failed to update task:",a)}}async function y(a,c){let d=b.filter(b=>b.projectId===a).length;if(confirm(d>0?`Delete "${c}" and its ${d} task${1===d?"":"s"}? This cannot be undone.`:`Delete "${c}"? This cannot be undone.`))try{(await fetch(`/api/projects/${a}`,{method:"DELETE"})).ok&&(f===a&&u(null),await v(),await w())}catch(a){console.error("Failed to delete project:",a)}}if((0,L.useEffect)(()=>{v(),w();let a=setInterval(()=>{w(),v()},5e3);return()=>clearInterval(a)},[]),(0,L.useEffect)(()=>{let a,b=null,c=!1;return!function d(){if(!c)try{(b=new WebSocket("ws://localhost:3001")).onopen=()=>{console.log("WebSocket connected")},b.onmessage=a=>{let b=JSON.parse(a.data);"agent_count"!==b.type&&(b.type?.includes("project")&&v(),w())},b.onerror=()=>{},b.onclose=()=>{c||(a=setTimeout(d,3e3))}}catch{c||(a=setTimeout(d,3e3))}}(),()=>{c=!0,clearTimeout(a),b?.close()}},[]),n)return(0,K.jsx)("div",{className:"flex items-center justify-center h-screen",children:(0,K.jsx)("div",{className:"text-lg",children:"Loading tasks..."})});let z=d.find(a=>a.id===f),A=f?b.filter(a=>a.projectId===f):b,B=(h?A.filter(a=>a.specName===h):A).length;return(0,K.jsxs)("div",{className:"h-screen flex flex-col bg-[--color-bg]",children:[(0,K.jsx)("header",{className:"border-b-4 border-black bg-white neubrutalism-shadow",children:(0,K.jsx)("div",{className:"container mx-auto px-6 py-4",children:(0,K.jsxs)("div",{className:"flex items-center justify-between",children:[(0,K.jsxs)("div",{className:"flex items-center gap-6",children:[(0,K.jsx)("div",{className:"flex items-center gap-4",children:(0,K.jsx)("h1",{className:"text-3xl font-black uppercase tracking-tight",children:"DevFlow"})}),(0,K.jsxs)("div",{className:"relative",children:[(0,K.jsxs)("button",{onClick:()=>q(!p),className:"flex items-center gap-2 px-4 py-2 bg-[--color-primary] border-4 border-black font-bold text-sm uppercase hover:translate-x-[2px] hover:translate-y-[2px] hover:shadow-none transition-all shadow-[4px_4px_0px_0px_rgba(0,0,0,1)]",children:[(0,K.jsx)("span",{className:"max-w-[200px] truncate",children:z?z.name:"All Projects"}),(0,K.jsxs)("span",{className:"text-xs opacity-70",children:["(",B,")"]}),(0,K.jsx)(dQ,{className:`h-4 w-4 transition-transform ${p?"rotate-180":""}`})]}),p&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)("div",{className:"fixed inset-0 z-10",onClick:()=>q(!1)}),(0,K.jsxs)("div",{className:"absolute top-full left-0 mt-2 w-64 bg-white border-4 border-black shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] z-20 max-h-80 overflow-y-auto",children:[(0,K.jsxs)("button",{onClick:()=>u(null),className:`w-full px-4 py-3 text-left font-bold text-sm uppercase border-b-2 border-black hover:bg-gray-100 flex items-center justify-between ${!f?"bg-black text-white hover:bg-gray-800":""}`,children:[(0,K.jsx)("span",{children:"All Projects"}),(0,K.jsxs)("span",{className:"text-xs opacity-70",children:["(",b.length,")"]})]}),d.map(a=>{let c=b.filter(b=>b.projectId===a.id).length;return(0,K.jsxs)("div",{className:`flex items-center border-b border-gray-200 last:border-b-0 ${f===a.id?"bg-[--color-primary]":"hover:bg-gray-100"}`,children:[(0,K.jsxs)("button",{onClick:()=>u(a.id),className:"flex-1 px-4 py-3 text-left font-bold text-sm flex items-center justify-between",children:[(0,K.jsx)("span",{className:"truncate",children:a.name}),(0,K.jsxs)("span",{className:"text-xs opacity-70 ml-2",children:["(",c,")"]})]}),(0,K.jsx)("button",{onClick:b=>{b.stopPropagation(),y(a.id,a.name)},className:"px-3 py-3 text-red-600 hover:bg-red-100 hover:text-red-800 transition-colors",title:"Delete project",children:(0,K.jsx)(b$,{className:"h-4 w-4"})})]},a.id)}),0===d.length&&(0,K.jsx)("div",{className:"px-4 py-3 text-sm text-gray-500",children:"No projects yet"})]})]})]})]}),(0,K.jsx)("div",{})]})})}),z&&(0,K.jsx)("div",{className:"bg-[--color-primary] border-b-4 border-black px-6 py-2",children:(0,K.jsxs)("div",{className:"container mx-auto flex items-center justify-between",children:[(0,K.jsxs)("div",{className:"flex items-center gap-4",children:[(0,K.jsx)("h2",{className:"text-lg font-black uppercase",children:z.name}),z.description&&(0,K.jsxs)("p",{className:"text-sm font-medium opacity-80",children:["— ",z.description]})]}),(0,K.jsxs)("div",{className:"flex items-center gap-4 text-sm font-bold",children:[(0,K.jsxs)("span",{children:[A.filter(a=>"in_progress"===a.status).length," in progress"]}),(0,K.jsxs)("span",{children:[A.filter(a=>"done"===a.status).length," done"]})]})]})}),(0,K.jsxs)("div",{className:"flex-1 min-h-0 overflow-hidden flex",children:[(0,K.jsx)(dY,{selectedSpecName:h,onSelectSpec:a=>{h===a&&j?k(!1):(i(a),k(!0))}}),(0,K.jsx)("main",{className:"flex-1 min-h-0 overflow-hidden",children:(0,K.jsxs)(bh,{sensors:t,onDragStart:function(a){m(b.find(b=>b.id===a.active.id)||null)},onDragEnd:function(a){let c,{active:d,over:e}=a;if(m(null),!e)return;let f=d.id,g=e.id;if(d6.has(g))c=g;else{let a=b.find(a=>a.id===g);if(!a)return;c=a.status}let h=b.find(a=>a.id===f);h&&h.status!==c&&x(f,c)},children:[(0,K.jsx)("div",{className:"h-full px-6 py-6",children:(0,K.jsx)("div",{className:"grid grid-cols-4 gap-6 h-full min-h-0",children:d5.map(a=>{var c;return(0,K.jsx)(dP,{id:a.id,title:a.title,color:a.color,tasks:(c=a.id,b.filter(a=>"interrupted"===a.status?"in_progress"===c:a.status===c).filter(a=>!f||a.projectId===f).filter(a=>!h||a.specName===h)),features:[],onRefresh:w},a.id)})})}),(0,K.jsx)(bv,{children:l?(0,K.jsx)("div",{className:"rotate-3 opacity-80",children:(0,K.jsx)(dO,{task:l,feature:void 0,features:[],onRefresh:w})}):null})]})}),j&&h&&(0,K.jsx)(d4,{specName:h,onClose:()=>k(!1)})]})]})}a.s(["KanbanBoard",()=>d8],89077)}];
|
|
5
|
+
For more information, see https://radix-ui.com/primitives/docs/components/${b.docsSlug}`;return L.useEffect(()=>{a&&(document.getElementById(a)||console.error(c))},[c,a]),null},dE=({contentRef:a,descriptionId:b})=>{let c=dC("DialogDescriptionWarning"),d=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${c.contentName}}.`;return L.useEffect(()=>{let c=a.current?.getAttribute("aria-describedby");b&&c&&(document.getElementById(b)||console.warn(d))},[d,a,b]),null};let dF=bW("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),dG=L.forwardRef(({className:a,...b},c)=>(0,K.jsx)(dk,{ref:c,className:(0,bK.cn)("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...b}));dG.displayName=dk.displayName;let dH=L.forwardRef(({className:a,children:b,...c},d)=>(0,K.jsxs)(di,{children:[(0,K.jsx)(dG,{}),(0,K.jsxs)(dp,{ref:d,className:(0,bK.cn)("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border-4 border-black bg-white p-6 neubrutalism-shadow-xl duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",a),...c,children:[b,(0,K.jsxs)(dy,{className:"absolute right-4 top-4 border-2 border-black bg-white p-1 hover:bg-gray-100 focus:outline-none",children:[(0,K.jsx)(dF,{className:"h-4 w-4"}),(0,K.jsx)("span",{className:"sr-only",children:"Close"})]})]})]}));dH.displayName=dp.displayName;let dI=({className:a,...b})=>(0,K.jsx)("div",{className:(0,bK.cn)("flex flex-col space-y-1.5 text-center sm:text-left",a),...b});dI.displayName="DialogHeader";let dJ=L.forwardRef(({className:a,...b},c)=>(0,K.jsx)(du,{ref:c,className:(0,bK.cn)("text-2xl font-bold uppercase tracking-wide leading-none",a),...b}));dJ.displayName=du.displayName,L.forwardRef(({className:a,...b},c)=>(0,K.jsx)(dw,{ref:c,className:(0,bK.cn)("text-sm text-muted-foreground",a),...b})).displayName=dw.displayName;let dK=bW("clock",[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);var dL=a.i(22249);function dM({task:a,open:b,onOpenChange:c,onRefresh:d}){let[e,f]=(0,L.useState)(a.title),[g,h]=(0,L.useState)(a.priority),[i,j]=(0,L.useState)(a.status),[k,l]=(0,L.useState)(a.body),[m,n]=(0,L.useState)(!1);async function o(){n(!0);try{await fetch(`/api/tasks/${a.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:e,priority:g,status:i})}),d(),c(!1)}catch(a){console.error("Failed to update task:",a)}finally{n(!1)}}return(0,L.useEffect)(()=>{b&&fetch(`/api/tasks/${a.id}`).then(a=>a.json()).then(a=>{f(a.title),h(a.priority),j(a.status),l(a.body)}).catch(()=>{f(a.title),h(a.priority),j(a.status),l(a.body)})},[b,a.id]),(0,K.jsx)(dd,{open:b,onOpenChange:c,children:(0,K.jsxs)(dH,{className:"max-w-2xl max-h-[90vh] overflow-y-auto",children:[(0,K.jsx)(dI,{children:(0,K.jsx)(dJ,{children:"Edit Task"})}),(0,K.jsxs)("div",{className:"space-y-4",children:[(0,K.jsxs)("div",{children:[(0,K.jsx)("label",{className:"text-xs font-bold uppercase tracking-wide mb-2 block",children:"Title"}),(0,K.jsx)("input",{type:"text",value:e,onChange:a=>f(a.target.value),className:"w-full px-4 py-3 border-3 border-black font-bold focus:outline-none focus:shadow-[4px_4px_0px_0px_rgba(0,0,0,1)]",placeholder:"Task title"})]}),(0,K.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,K.jsxs)("div",{children:[(0,K.jsx)("label",{className:"text-xs font-bold uppercase tracking-wide mb-2 block",children:"Priority"}),(0,K.jsxs)("select",{value:g,onChange:a=>h(a.target.value),className:"w-full px-4 py-3 border-3 border-black font-bold uppercase focus:outline-none focus:shadow-[4px_4px_0px_0px_rgba(0,0,0,1)]",children:[(0,K.jsx)("option",{value:"low",children:"Low"}),(0,K.jsx)("option",{value:"medium",children:"Medium"}),(0,K.jsx)("option",{value:"high",children:"High"}),(0,K.jsx)("option",{value:"urgent",children:"Urgent"})]})]}),(0,K.jsxs)("div",{children:[(0,K.jsx)("label",{className:"text-xs font-bold uppercase tracking-wide mb-2 block",children:"Status"}),(0,K.jsxs)("select",{value:i,onChange:a=>j(a.target.value),className:"w-full px-4 py-3 border-3 border-black font-bold uppercase focus:outline-none focus:shadow-[4px_4px_0px_0px_rgba(0,0,0,1)]",children:[(0,K.jsx)("option",{value:"backlog",children:"Backlog"}),(0,K.jsx)("option",{value:"todo",children:"To Do"}),(0,K.jsx)("option",{value:"in_progress",children:"In Progress"}),(0,K.jsx)("option",{value:"interrupted",children:"Interrupted"}),(0,K.jsx)("option",{value:"done",children:"Done"})]})]})]}),a.specName&&(0,K.jsxs)("div",{children:[(0,K.jsx)("label",{className:"text-xs font-bold uppercase tracking-wide mb-2 block",children:"Spec"}),(0,K.jsx)("div",{className:"px-4 py-2 border-2 border-black bg-gray-50 font-mono text-sm",children:a.specName})]}),k&&(0,K.jsxs)("div",{children:[(0,K.jsx)("label",{className:"text-xs font-bold uppercase tracking-wide mb-2 block",children:"Task Card"}),(0,K.jsx)("div",{className:"w-full px-4 py-3 border-2 border-black bg-gray-50 min-h-[100px] text-sm overflow-auto max-h-[300px]",children:(0,K.jsx)(dL.MarkdownPreview,{content:k})})]}),(0,K.jsxs)("div",{className:"flex flex-wrap gap-3 pt-4 border-t-3 border-black",children:[a.assignedAgent&&(0,K.jsxs)(bQ,{variant:"secondary",className:"gap-1",children:[(0,K.jsx)(bY,{className:"h-3 w-3"}),a.assignedAgent]}),(0,K.jsxs)(bQ,{variant:"outline",className:"gap-1",children:[(0,K.jsx)(dK,{className:"h-3 w-3"}),"Created: ",new Date(a.createdAt).toLocaleDateString()]}),a.updatedAt&&a.updatedAt!==a.createdAt&&(0,K.jsxs)(bQ,{variant:"outline",className:"gap-1",children:[(0,K.jsx)(dK,{className:"h-3 w-3"}),"Updated: ",new Date(a.updatedAt).toLocaleDateString()]})]}),(0,K.jsxs)("div",{className:"flex justify-end gap-3 pt-4 border-t-3 border-black",children:[(0,K.jsx)(bR.Button,{variant:"outline",onClick:()=>c(!1),disabled:m,children:"Cancel"}),(0,K.jsx)(bR.Button,{onClick:o,disabled:m,children:m?"Saving...":"Save Changes"})]})]})]})})}let dN={low:"bg-[--color-primary] text-black",medium:"bg-[--color-secondary] text-black",high:"bg-orange-300 text-black",urgent:"bg-[--color-accent] text-black"};function dO({task:a,onRefresh:b}){let[c,d]=(0,L.useState)(!1),{attributes:e,listeners:f,setNodeRef:g,transform:h,transition:i,isDragging:j}=function(a){var b,c,d,e;let{animateLayoutChanges:f=bF,attributes:g,disabled:h,data:i,getNewIndex:j=bE,id:k,strategy:l,resizeObserverConfig:m,transition:n=bG}=a,{items:o,containerId:p,activeIndex:q,disabled:r,disableTransforms:s,sortedRects:t,overIndex:u,useDragOverlay:v,strategy:w}=(0,L.useContext)(bC),x=(b=h,c=r,"boolean"==typeof b?{draggable:b,droppable:!1}:{draggable:null!=(d=null==b?void 0:b.draggable)?d:c.draggable,droppable:null!=(e=null==b?void 0:b.droppable)?e:c.droppable}),y=o.indexOf(k),z=(0,L.useMemo)(()=>({sortable:{containerId:p,index:y,items:o},...i}),[p,i,y,o]),A=(0,L.useMemo)(()=>o.slice(o.indexOf(k)),[o,k]),{rect:B,node:C,isOver:D,setNodeRef:E}=bm({id:k,data:z,disabled:x.droppable,resizeObserverConfig:{updateMeasurementsFor:A,...m}}),{active:F,activatorEvent:G,activeNodeRect:H,attributes:I,setNodeRef:J,listeners:K,isDragging:M,over:N,setActivatorNodeRef:O,transform:P}=function(a){let{id:b,data:c,disabled:d=!1,attributes:e}=a,f=_("Draggable"),{activators:g,activatorEvent:h,active:i,activeNodeRect:j,ariaDescribedById:k,draggableNodes:l,over:m}=(0,L.useContext)(ba),{role:n=bj,roleDescription:o="draggable",tabIndex:p=0}=null!=e?e:{},q=(null==i?void 0:i.id)===b,r=(0,L.useContext)(q?bg:bi),[s,t]=Y(),[u,v]=Y(),w=(0,L.useMemo)(()=>g.reduce((a,c)=>{let{eventName:d,handler:e}=c;return a[d]=a=>{e(a,b)},a},{}),[g,b]),x=W(c);return U(()=>(l.set(b,{id:b,key:f,node:s,activatorNode:u,data:x}),()=>{let a=l.get(b);a&&a.key===f&&l.delete(b)}),[l,b]),{active:i,activatorEvent:h,activeNodeRect:j,attributes:(0,L.useMemo)(()=>({role:n,tabIndex:p,"aria-disabled":d,"aria-pressed":!!q&&n===bj||void 0,"aria-roledescription":o,"aria-describedby":k.draggable}),[d,n,p,q,o,k.draggable]),isDragging:q,listeners:d?void 0:w,node:s,over:m,setNodeRef:t,setActivatorNodeRef:v,transform:r}}({id:k,data:z,attributes:{...bJ,...g},disabled:x.draggable}),Q=function(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];return(0,L.useMemo)(()=>a=>{b.forEach(b=>b(a))},b)}(E,J),R=!!F,S=R&&!s&&bx(q)&&bx(u),T=!v&&M,V=T&&S?P:null,X=S?null!=V?V:(null!=l?l:w)({rects:t,activeNodeRect:H,activeIndex:q,overIndex:u,index:y}):null,Z=bx(q)&&bx(u)?j({id:k,items:o,activeIndex:q,overIndex:u}):y,$=null==F?void 0:F.id,aa=(0,L.useRef)({activeId:$,items:o,newIndex:Z,containerId:p}),ab=o!==aa.current.items,ac=f({active:F,containerId:p,isDragging:M,isSorting:R,id:k,index:y,items:o,newIndex:aa.current.newIndex,previousItems:aa.current.items,previousContainerId:aa.current.containerId,transition:n,wasDragging:null!=aa.current.activeId}),ae=function(a){let{disabled:b,index:c,node:d,rect:e}=a,[f,g]=(0,L.useState)(null),h=(0,L.useRef)(c);return U(()=>{if(!b&&c!==h.current&&d.current){let a=e.current;if(a){let b=aw(d.current,{ignoreTransform:!0}),c={x:a.left-b.left,y:a.top-b.top,scaleX:a.width/b.width,scaleY:a.height/b.height};(c.x||c.y)&&g(c)}}c!==h.current&&(h.current=c)},[b,c,d,e]),(0,L.useEffect)(()=>{f&&g(null)},[f]),f}({disabled:!ac,index:y,node:C,rect:B});return(0,L.useEffect)(()=>{R&&aa.current.newIndex!==Z&&(aa.current.newIndex=Z),p!==aa.current.containerId&&(aa.current.containerId=p),o!==aa.current.items&&(aa.current.items=o)},[R,Z,p,o]),(0,L.useEffect)(()=>{if($===aa.current.activeId)return;if(null!=$&&null==aa.current.activeId){aa.current.activeId=$;return}let a=setTimeout(()=>{aa.current.activeId=$},50);return()=>clearTimeout(a)},[$]),{active:F,activeIndex:q,attributes:I,data:z,rect:B,index:y,newIndex:Z,items:o,isOver:D,isSorting:R,isDragging:M,listeners:K,node:C,overIndex:u,over:N,setNodeRef:Q,setActivatorNodeRef:O,setDroppableNodeRef:E,setDraggableNodeRef:J,transform:null!=ae?ae:X,transition:ae||ab&&aa.current.newIndex===y?bI:(!T||ad(G))&&n&&(R||ac)?af.Transition.toString({...n,property:bH}):void 0}}({id:a.id}),k={transform:af.Transform.toString(h),transition:i};async function l(c){if(c.stopPropagation(),confirm("Are you sure you want to delete this task?"))try{await fetch(`/api/tasks/${a.id}`,{method:"DELETE"}),b()}catch(a){console.error("Failed to delete task:",a)}}return(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)("div",{ref:g,style:k,className:(0,bK.cn)("cursor-pointer transition-opacity",j&&"opacity-50"),children:(0,K.jsxs)(bL,{className:(0,bK.cn)("hover:translate-x-0.5 hover:translate-y-0.5 transition-transform cursor-pointer","interrupted"===a.status&&"border-amber-500 bg-amber-50"),onClick:()=>d(!0),children:[(0,K.jsx)(bM,{className:"pb-3",children:(0,K.jsxs)("div",{className:"flex items-start justify-between gap-2",children:[(0,K.jsx)("div",{className:"flex-1 min-w-0",children:(0,K.jsx)(bN,{className:"text-sm line-clamp-2",children:a.title})}),(0,K.jsxs)("div",{className:"flex items-center gap-1",children:[(0,K.jsx)(bR.Button,{variant:"ghost",size:"icon",className:"h-6 w-6 cursor-grab active:cursor-grabbing border-2 border-black",...e,...f,onClick:a=>a.stopPropagation(),children:(0,K.jsx)(bX,{className:"h-4 w-4"})}),(0,K.jsx)(bR.Button,{variant:"ghost",size:"icon",className:"h-6 w-6 border-2 border-black bg-[--color-accent] hover:bg-red-400",onClick:l,children:(0,K.jsx)(b$,{className:"h-3 w-3"})})]})]})}),(0,K.jsx)(bO,{className:"space-y-2",children:(0,K.jsxs)("div",{className:"flex flex-wrap gap-2",children:["interrupted"===a.status&&(0,K.jsxs)(bQ,{variant:"outline",className:"text-xs gap-1 border-amber-500 text-amber-700 bg-amber-50",children:[(0,K.jsx)(b_,{className:"h-3 w-3"}),"Interrupted"]}),a.specName&&(0,K.jsx)(bQ,{variant:"outline",className:"text-xs font-mono",children:a.specName}),(0,K.jsx)(bQ,{variant:"outline",className:(0,bK.cn)("text-xs",dN[a.priority]),children:a.priority}),a.assignedAgent&&(0,K.jsxs)(bQ,{variant:"secondary",className:"text-xs gap-1",children:[(0,K.jsx)(bY,{className:"h-3 w-3"}),a.assignedAgent]}),a.body&&(0,K.jsxs)(bQ,{variant:"outline",className:"text-xs gap-1",children:[(0,K.jsx)(bZ,{className:"h-3 w-3"}),"Notes"]})]})})]})}),(0,K.jsx)(dM,{task:a,features:[],open:c,onOpenChange:d,onRefresh:b})]})}function dP({id:a,title:b,color:c,tasks:d,onRefresh:e}){let{setNodeRef:f,isOver:g}=bm({id:a});return(0,K.jsxs)("div",{className:"flex flex-col h-full min-h-0",children:[(0,K.jsx)("div",{className:(0,bK.cn)("px-4 py-3 border-3 border-black border-b-0",c),children:(0,K.jsxs)("h2",{className:"font-black uppercase tracking-wide text-black flex items-center justify-between",children:[(0,K.jsx)("span",{children:b}),(0,K.jsx)("span",{className:"text-sm font-bold bg-black text-white px-2 py-1",children:d.length})]})}),(0,K.jsxs)("div",{ref:f,className:(0,bK.cn)("flex-1 overflow-y-auto p-4 space-y-3 bg-white border-3 border-black transition-colors",g&&"bg-gray-100"),children:[(0,K.jsx)(bD,{items:d.map(a=>a.id),strategy:bA,children:d.map(a=>(0,K.jsx)(dO,{task:a,feature:void 0,features:[],onRefresh:e},a.id))}),0===d.length&&(0,K.jsx)("div",{className:"text-center text-gray-500 font-bold text-sm py-8 uppercase",children:"Drop tasks here"})]})]})}let dQ=bW("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]),dR=bW("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]),dS=bW("circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),dT=bW("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);var dU=a.i(61149);let dV={blocked:"bg-gray-300",ready:"bg-blue-400",in_review:"bg-yellow-400",in_progress:"bg-orange-400",done:"bg-green-500"},dW={done:(0,K.jsx)(dR,{className:"h-3 w-3 text-green-600"}),in_review:(0,K.jsx)(dK,{className:"h-3 w-3 text-yellow-500"}),in_progress:(0,K.jsx)(dK,{className:"h-3 w-3 text-orange-500"}),ready:(0,K.jsx)(dS,{className:"h-3 w-3 text-blue-500"}),blocked:(0,K.jsx)(dT,{className:"h-3 w-3 text-gray-400"})},dX={done:"done",in_review:"in review",in_progress:"in progress",ready:"ready",blocked:"blocked"};function dY({spec:a,selected:b,onClick:c}){let d,e=a.statuses?0===(d=a.statuses.filter(a=>"development"!==a.id)).length?"ready":d.every(a=>"done"===a.state)?"done":d.some(a=>"in_review"===a.state||"in_progress"===a.state)?"in_review":d.some(a=>"ready"===a.state)?"ready":"blocked":"ready",f=a.statuses?.filter(a=>"development"!==a.id)??[];return(0,K.jsxs)("button",{onClick:c,className:`w-full text-left p-3 border-4 transition-all ${b?"border-black bg-black text-white shadow-none translate-x-[2px] translate-y-[2px]":"border-black bg-white shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] hover:translate-x-[2px] hover:translate-y-[2px] hover:shadow-none"}`,children:[(0,K.jsxs)("div",{className:"flex items-start justify-between gap-1 mb-2",children:[(0,K.jsx)("span",{className:`font-black text-xs uppercase leading-tight line-clamp-2 flex-1 ${b?"text-white":""}`,children:a.title||a.name}),(0,K.jsx)("span",{className:"flex-shrink-0 mt-0.5",children:dW[e]})]}),(0,K.jsx)("p",{className:`font-mono text-[10px] mb-2 truncate ${b?"text-gray-300":"text-gray-400"}`,children:a.name}),f.length>0&&(0,K.jsxs)("div",{className:"flex gap-1 items-center",children:[f.map(a=>(0,K.jsx)("div",{title:`${a.id}: ${a.state}`,className:`w-2 h-2 rounded-full border border-black ${b?"border-gray-400":""} ${dV[a.state]}`},a.id)),(0,K.jsx)("span",{className:`text-[10px] font-bold uppercase ml-1 ${b?"text-gray-300":"text-gray-400"}`,children:dX[e]})]})]})}function dZ({selectedSpecName:a,onSelectSpec:b}){let{data:c=[],isLoading:d}=(0,dU.useSpecs)();return(0,K.jsxs)("div",{className:"flex flex-col h-full min-h-0 border-r-4 border-black bg-[--color-bg]",style:{width:220,flexShrink:0},children:[(0,K.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b-4 border-black bg-[--color-secondary] flex-shrink-0",children:[(0,K.jsx)("h2",{className:"font-black uppercase text-sm tracking-wide",children:"Specs"}),(0,K.jsxs)("span",{className:"text-xs font-bold opacity-60",children:["(",c.length,")"]})]}),(0,K.jsxs)("div",{className:"flex-1 overflow-y-auto p-3 flex flex-col gap-2",children:[d&&(0,K.jsx)("p",{className:"text-xs text-gray-400 font-mono px-1",children:"Loading..."}),!d&&0===c.length&&(0,K.jsx)("p",{className:"text-xs text-gray-400 font-mono px-1",children:"No specs yet."}),c.map(c=>(0,K.jsx)(dY,{spec:c,selected:a===c.name,onClick:()=>b(c.name)},c.name))]})]})}let d$=bW("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);var d_=a.i(56631),d0=a.i(66132);let d1={blocked:(0,K.jsx)(dT,{className:"h-3 w-3 text-gray-400 flex-shrink-0"}),ready:(0,K.jsx)(dS,{className:"h-3 w-3 text-blue-500 flex-shrink-0"}),in_review:(0,K.jsx)(dK,{className:"h-3 w-3 text-yellow-500 flex-shrink-0"}),in_progress:(0,K.jsx)(dK,{className:"h-3 w-3 text-orange-500 flex-shrink-0"}),done:(0,K.jsx)(dR,{className:"h-3 w-3 text-green-600 flex-shrink-0"})},d2={backlog:"bg-gray-100 border-gray-400 text-gray-600",todo:"bg-blue-100 border-blue-400 text-blue-700",in_progress:"bg-orange-100 border-orange-400 text-orange-700",interrupted:"bg-red-100 border-red-400 text-red-700",done:"bg-green-100 border-green-500 text-green-700"},d3={urgent:"text-red-600",high:"text-orange-500",medium:"text-gray-500",low:"text-gray-400"};function d4({tasks:a,status:b}){let c=a.length,d=a.filter(a=>"done"===a.status).length,e=a.filter(a=>"in_progress"===a.status).length;return b?.state==="blocked"?(0,K.jsxs)("div",{className:"p-6 bg-gray-100 border-4 border-gray-300 text-center",children:[(0,K.jsx)("p",{className:"font-bold text-gray-600 uppercase",children:"Blocked — approve and promote tasks first"}),(0,K.jsx)("p",{className:"text-sm text-gray-500 mt-1",children:"Approve all artifacts, then click “Promote to Tasks”"})]}):0===a.length?(0,K.jsxs)("div",{className:"p-6 bg-blue-50 border-4 border-blue-300 text-center",children:[(0,K.jsx)("p",{className:"font-bold text-blue-700 uppercase",children:"Ready to promote"}),(0,K.jsx)("p",{className:"text-sm text-blue-600 mt-1",children:"All artifacts approved. Promote tasks to start development."})]}):(0,K.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,K.jsxs)("div",{className:"flex items-center gap-3",children:[(0,K.jsx)("div",{className:"flex-1 h-3 bg-gray-200 border-2 border-black overflow-hidden",children:(0,K.jsx)("div",{className:"h-full bg-green-500 transition-all",style:{width:`${c>0?d/c*100:0}%`}})}),(0,K.jsxs)("span",{className:"font-mono text-sm font-bold whitespace-nowrap",children:[d,"/",c," done",e>0&&(0,K.jsxs)("span",{className:"text-orange-600 ml-2",children:["· ",e," in progress"]})]})]}),(0,K.jsx)("div",{className:"flex flex-col gap-2",children:a.map(a=>(0,K.jsxs)("div",{className:"flex items-center gap-3 p-3 border-4 border-black bg-white",children:[(0,K.jsx)("span",{className:`text-lg ${"done"===a.status?"opacity-100":"opacity-30"}`,children:"done"===a.status?"✓":"in_progress"===a.status?"⟳":"○"}),(0,K.jsx)("span",{className:`flex-1 font-bold text-sm ${"done"===a.status?"line-through text-gray-400":""}`,children:a.title}),(0,K.jsx)("span",{className:`text-xs font-mono uppercase font-bold ${d3[a.priority]||""}`,children:a.priority}),(0,K.jsx)("span",{className:`px-2 py-0.5 border-2 text-xs font-bold uppercase ${d2[a.status]||""}`,children:a.status.replace("_"," ")}),a.assignedAgent&&(0,K.jsxs)("span",{className:"text-xs font-mono text-gray-500 truncate max-w-[120px]",title:a.assignedAgent,children:["@",a.assignedAgent]})]},a.id))})]})}function d5({specName:a,onClose:b}){let{data:c,isLoading:d}=(0,dU.useSpec)(a),{invalidateSpec:e,invalidateSpecs:f,invalidateTasks:g}=(0,dU.useInvalidate)(),[h,i]=(0,L.useState)(null),[j,k]=(0,L.useState)(!1);function l(){e(a),f()}async function m(){k(!0);try{let b=await fetch(`/api/specs/${a}/promote`,{method:"POST"}),c=await b.json();b.ok?(alert(`Promoted ${c.promoted} tasks to Kanban board!`),l(),g()):alert(`Error: ${c.error}`)}finally{k(!1)}}c&&!h&&c.statuses?.length&&i(c.statuses[0].id);let n=c?.statuses.filter(a=>"development"!==a.id)??[],o=c?.statuses.find(a=>"development"===a.id),p=n.every(a=>"done"===a.state),q=c?.statuses.find(a=>a.id===h),r="development"===h;return(0,K.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60",onClick:a=>{a.target===a.currentTarget&&b()},children:(0,K.jsxs)("div",{className:"bg-white border-4 border-black shadow-[8px_8px_0px_0px_rgba(0,0,0,1)] flex flex-col",style:{width:"min(1300px, 96vw)",height:"min(920px, 94vh)"},children:[(0,K.jsxs)("div",{className:"flex items-center justify-between px-6 py-4 border-b-4 border-black bg-white flex-shrink-0",children:[(0,K.jsxs)("div",{children:[(0,K.jsx)("h2",{className:"text-2xl font-black uppercase leading-tight",children:c?.title||a}),(0,K.jsx)("p",{className:"font-mono text-xs text-gray-500 mt-0.5",children:a})]}),(0,K.jsx)("button",{onClick:b,className:"p-2 border-4 border-black hover:bg-black hover:text-white transition-colors",children:(0,K.jsx)(dF,{className:"h-5 w-5"})})]}),c&&(0,K.jsx)("div",{className:"px-6 py-3 border-b-4 border-black bg-white flex-shrink-0",children:(0,K.jsx)(d0.ArtifactDagStatus,{statuses:c.statuses})}),p&&c?.tasks.length===0&&(0,K.jsxs)("div",{className:"px-6 py-3 border-b-4 border-green-600 bg-green-100 flex-shrink-0 flex items-center justify-between",children:[(0,K.jsx)("p",{className:"font-black text-green-800 uppercase text-sm",children:"All artifacts approved!"}),(0,K.jsx)(bR.Button,{onClick:m,disabled:j,className:"bg-green-600 hover:bg-green-700 text-white",children:j?"Promoting...":"Promote to Tasks"})]}),o?.state==="done"&&(0,K.jsx)("div",{className:"px-6 py-3 border-b-4 border-green-600 bg-green-100 flex-shrink-0",children:(0,K.jsxs)("p",{className:"font-black text-green-800 uppercase text-sm",children:["✓ Spec complete — all ",c?.tasks.length," tasks done"]})}),(0,K.jsxs)("div",{className:"flex flex-1 min-h-0",children:[(0,K.jsxs)("div",{className:"w-60 border-r-4 border-black bg-white flex flex-col flex-shrink-0 overflow-y-auto",children:[(0,K.jsx)("div",{className:"px-3 py-2 border-b-2 border-gray-200",children:(0,K.jsxs)("span",{className:"font-mono text-[10px] text-gray-400 uppercase tracking-widest",children:[a,"/"]})}),(0,K.jsx)("div",{className:"flex-1 py-1",children:c?(0,K.jsxs)(K.Fragment,{children:[n.map(a=>(0,K.jsxs)("button",{onClick:()=>i(a.id),className:`w-full flex items-center gap-2 px-3 py-2 text-left transition-colors group ${h===a.id?"bg-black text-white":"hover:bg-gray-100"}`,children:[(0,K.jsx)(d$,{className:`h-3 w-3 flex-shrink-0 ${h===a.id?"text-white":"text-gray-300"}`}),(0,K.jsx)(bZ,{className:`h-3.5 w-3.5 flex-shrink-0 ${h===a.id?"text-white":"text-gray-400"}`}),(0,K.jsxs)("span",{className:"font-mono text-xs font-bold flex-1 truncate",children:[a.id,".md"]}),(0,K.jsx)("span",{className:h===a.id?"text-white opacity-70":"",children:d1[a.state]})]},a.id)),(p||c.tasks.length>0)&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)("div",{className:"mx-3 my-1 border-t border-dashed border-gray-200"}),(0,K.jsxs)("button",{onClick:()=>i("development"),className:`w-full flex items-center gap-2 px-3 py-2 text-left transition-colors ${"development"===h?"bg-black text-white":"hover:bg-gray-100"}`,children:[(0,K.jsx)(d$,{className:`h-3 w-3 flex-shrink-0 ${"development"===h?"text-white":"text-gray-300"}`}),(0,K.jsx)(bZ,{className:`h-3.5 w-3.5 flex-shrink-0 ${"development"===h?"text-white":"text-gray-400"}`}),(0,K.jsx)("span",{className:"font-mono text-xs font-bold flex-1",children:"development"}),(0,K.jsx)("span",{className:"development"===h?"text-white opacity-70":"",children:o?d1[o.state]:null})]})]})]}):(0,K.jsx)("div",{className:"px-4 py-3 text-xs text-gray-400 font-mono",children:"Loading..."})})]}),(0,K.jsx)("div",{className:"flex-1 flex flex-col min-h-0 p-6",children:d?(0,K.jsx)("div",{className:"flex items-center justify-center h-full",children:(0,K.jsx)("span",{className:"text-gray-400 font-mono text-sm",children:"Loading..."})}):h?r?(0,K.jsx)(d4,{tasks:c?.tasks??[],status:o}):q?(0,K.jsx)(d_.ArtifactEditor,{specName:a,artifactType:h,content:c?.artifacts[h]??null,status:q,onSave:l,defaultMode:"preview"},h):null:null})]})]})})}var d6=a.i(45066);let d7=[{id:"backlog",title:"Backlog",color:"bg-gray-200"},{id:"todo",title:"To Do",color:"bg-[--color-primary]"},{id:"in_progress",title:"In Progress",color:"bg-[--color-secondary]"},{id:"done",title:"Done",color:"bg-[--color-success]"}],d8=new Set(d7.map(a=>a.id)),d9="devflow-selected-project";function ea(){var a;let{data:b=[],isLoading:c}=(0,dU.useProjects)(),{data:d=[],isLoading:e}=(0,dU.useTasks)(),{invalidateTasks:f,invalidateProjects:g}=(0,dU.useInvalidate)();(0,d6.useWebSocket)();let[h,i]=(0,L.useState)(null),[j,k]=(0,L.useState)(null),[l,m]=(0,L.useState)(!1),[n,o]=(0,L.useState)(null),[p,q]=(0,L.useState)(!1),[r,s]=(0,L.useState)(!1),t=function(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];return(0,L.useMemo)(()=>[...b].filter(a=>null!=a),[...b])}((a={activationConstraint:{distance:8}},(0,L.useMemo)(()=>({sensor:aU,options:null!=a?a:{}}),[aU,a])));(0,L.useEffect)(()=>{let a=localStorage.getItem(d9);a&&i("all"===a?null:a),s(!0)},[]),(0,L.useEffect)(()=>{r&&!c&&(h?!b.some(a=>a.id===h)&&b.length>0&&u(b[0].id):!localStorage.getItem(d9)&&b.length>0&&u(b[0].id))},[r,c,b]);let u=(0,L.useCallback)(a=>{i(a),k(null),localStorage.setItem(d9,a||"all"),q(!1)},[]);async function v(a,b){try{await fetch(`/api/tasks/${a}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:b})}),f()}catch(a){console.error("Failed to update task:",a)}}async function w(a,b){let c=d.filter(b=>b.projectId===a).length;if(confirm(c>0?`Delete "${b}" and its ${c} task${1===c?"":"s"}? This cannot be undone.`:`Delete "${b}"? This cannot be undone.`))try{(await fetch(`/api/projects/${a}`,{method:"DELETE"})).ok&&(h===a&&u(null),g(),f())}catch(a){console.error("Failed to delete project:",a)}}if(e&&!d.length)return(0,K.jsx)("div",{className:"flex items-center justify-center h-screen",children:(0,K.jsx)("div",{className:"text-lg",children:"Loading tasks..."})});let x=b.find(a=>a.id===h),y=h?d.filter(a=>a.projectId===h):d,z=(j?y.filter(a=>a.specName===j):y).length;return(0,K.jsxs)("div",{className:"h-screen flex flex-col bg-[--color-bg]",children:[(0,K.jsx)("header",{className:"border-b-4 border-black bg-white neubrutalism-shadow",children:(0,K.jsx)("div",{className:"container mx-auto px-6 py-4",children:(0,K.jsxs)("div",{className:"flex items-center justify-between",children:[(0,K.jsxs)("div",{className:"flex items-center gap-6",children:[(0,K.jsx)("div",{className:"flex items-center gap-4",children:(0,K.jsx)("h1",{className:"text-3xl font-black uppercase tracking-tight",children:"DevFlow"})}),(0,K.jsxs)("div",{className:"relative",children:[(0,K.jsxs)("button",{onClick:()=>q(!p),className:"flex items-center gap-2 px-4 py-2 bg-[--color-primary] border-4 border-black font-bold text-sm uppercase hover:translate-x-[2px] hover:translate-y-[2px] hover:shadow-none transition-all shadow-[4px_4px_0px_0px_rgba(0,0,0,1)]",children:[(0,K.jsx)("span",{className:"max-w-[200px] truncate",children:x?x.name:"All Projects"}),(0,K.jsxs)("span",{className:"text-xs opacity-70",children:["(",z,")"]}),(0,K.jsx)(dQ,{className:`h-4 w-4 transition-transform ${p?"rotate-180":""}`})]}),p&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)("div",{className:"fixed inset-0 z-10",onClick:()=>q(!1)}),(0,K.jsxs)("div",{className:"absolute top-full left-0 mt-2 w-64 bg-white border-4 border-black shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] z-20 max-h-80 overflow-y-auto",children:[(0,K.jsxs)("button",{onClick:()=>u(null),className:`w-full px-4 py-3 text-left font-bold text-sm uppercase border-b-2 border-black hover:bg-gray-100 flex items-center justify-between ${!h?"bg-black text-white hover:bg-gray-800":""}`,children:[(0,K.jsx)("span",{children:"All Projects"}),(0,K.jsxs)("span",{className:"text-xs opacity-70",children:["(",d.length,")"]})]}),b.map(a=>{let b=d.filter(b=>b.projectId===a.id).length;return(0,K.jsxs)("div",{className:`flex items-center border-b border-gray-200 last:border-b-0 ${h===a.id?"bg-[--color-primary]":"hover:bg-gray-100"}`,children:[(0,K.jsxs)("button",{onClick:()=>u(a.id),className:"flex-1 px-4 py-3 text-left font-bold text-sm flex items-center justify-between",children:[(0,K.jsx)("span",{className:"truncate",children:a.name}),(0,K.jsxs)("span",{className:"text-xs opacity-70 ml-2",children:["(",b,")"]})]}),(0,K.jsx)("button",{onClick:b=>{b.stopPropagation(),w(a.id,a.name)},className:"px-3 py-3 text-red-600 hover:bg-red-100 hover:text-red-800 transition-colors",title:"Delete project",children:(0,K.jsx)(b$,{className:"h-4 w-4"})})]},a.id)}),0===b.length&&(0,K.jsx)("div",{className:"px-4 py-3 text-sm text-gray-500",children:"No projects yet"})]})]})]})]}),(0,K.jsx)("div",{})]})})}),x&&(0,K.jsx)("div",{className:"bg-[--color-primary] border-b-4 border-black px-6 py-2",children:(0,K.jsxs)("div",{className:"container mx-auto flex items-center justify-between",children:[(0,K.jsxs)("div",{className:"flex items-center gap-4",children:[(0,K.jsx)("h2",{className:"text-lg font-black uppercase",children:x.name}),x.description&&(0,K.jsxs)("p",{className:"text-sm font-medium opacity-80",children:["— ",x.description]})]}),(0,K.jsxs)("div",{className:"flex items-center gap-4 text-sm font-bold",children:[(0,K.jsxs)("span",{children:[y.filter(a=>"in_progress"===a.status).length," in progress"]}),(0,K.jsxs)("span",{children:[y.filter(a=>"done"===a.status).length," done"]})]})]})}),(0,K.jsxs)("div",{className:"flex-1 min-h-0 overflow-hidden flex",children:[(0,K.jsx)(dZ,{selectedSpecName:j,onSelectSpec:a=>{j===a&&l?m(!1):(k(a),m(!0))}}),(0,K.jsx)("main",{className:"flex-1 min-h-0 overflow-hidden",children:(0,K.jsxs)(bh,{sensors:t,onDragStart:function(a){o(d.find(b=>b.id===a.active.id)||null)},onDragEnd:function(a){let b,{active:c,over:e}=a;if(o(null),!e)return;let f=c.id,g=e.id;if(d8.has(g))b=g;else{let a=d.find(a=>a.id===g);if(!a)return;b=a.status}let h=d.find(a=>a.id===f);h&&h.status!==b&&v(f,b)},children:[(0,K.jsx)("div",{className:"h-full px-6 py-6",children:(0,K.jsx)("div",{className:"grid grid-cols-4 gap-6 h-full min-h-0",children:d7.map(a=>{var b;return(0,K.jsx)(dP,{id:a.id,title:a.title,color:a.color,tasks:(b=a.id,d.filter(a=>"interrupted"===a.status?"in_progress"===b:a.status===b).filter(a=>!h||a.projectId===h).filter(a=>!j||a.specName===j)),features:[],onRefresh:()=>f()},a.id)})})}),(0,K.jsx)(bv,{children:n?(0,K.jsx)("div",{className:"rotate-3 opacity-80",children:(0,K.jsx)(dO,{task:n,feature:void 0,features:[],onRefresh:()=>f()})}):null})]})}),l&&j&&(0,K.jsx)(d5,{specName:j,onClose:()=>m(!1)})]})]})}a.s(["KanbanBoard",()=>ea],89077)}];
|
|
6
6
|
|
|
7
7
|
//# sourceMappingURL=src_components_kanban-board_tsx_7b875e8e._.js.map
|
|
@@ -8,11 +8,11 @@ globalThis.__BUILD_MANIFEST = {
|
|
|
8
8
|
],
|
|
9
9
|
"lowPriorityFiles": [],
|
|
10
10
|
"rootMainFiles": [
|
|
11
|
-
"static/chunks/
|
|
11
|
+
"static/chunks/701cfcbb41e0ab47.js",
|
|
12
12
|
"static/chunks/ad24b3b0881818aa.js",
|
|
13
13
|
"static/chunks/01c05b0fdc89fc0c.js",
|
|
14
14
|
"static/chunks/87f01c0a5d4010ab.js",
|
|
15
|
-
"static/chunks/turbopack-
|
|
15
|
+
"static/chunks/turbopack-8b3b66a22a5e0fb4.js"
|
|
16
16
|
]
|
|
17
17
|
};
|
|
18
18
|
globalThis.__BUILD_MANIFEST.lowPriorityFiles = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--Ql6qo0GYLL23WRu6ec4N5--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/ac4b6b4d5b7e486e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/701cfcbb41e0ab47.js"/><script src="/_next/static/chunks/ad24b3b0881818aa.js" async=""></script><script src="/_next/static/chunks/01c05b0fdc89fc0c.js" async=""></script><script src="/_next/static/chunks/87f01c0a5d4010ab.js" async=""></script><script src="/_next/static/chunks/turbopack-8b3b66a22a5e0fb4.js" async=""></script><script src="/_next/static/chunks/53081dcdcad4f31e.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/483effa74d32093a.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>DevFlow MCP - Context-First Kanban for AI Agents</title><meta name="description" content="Plan management and task management system with Model Context Protocol integration for AI agents"/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/701cfcbb41e0ab47.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1661,[\"/_next/static/chunks/53081dcdcad4f31e.js\"],\"Providers\"]\n3:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"default\"]\n:HL[\"/_next/static/chunks/ac4b6b4d5b7e486e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Ql6qo0GYLL23WRu6ec4N5\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/ac4b6b4d5b7e486e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/53081dcdcad4f31e.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"d:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"IconMark\"]\n7:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"DevFlow MCP - Context-First Kanban for AI Agents\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Plan management and task management system with Model Context Protocol integration for AI agents\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Ld\",\"3\",{}]]\n"])</script></body></html>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/
|
|
1
|
+
<!DOCTYPE html><!--Ql6qo0GYLL23WRu6ec4N5--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/701cfcbb41e0ab47.js"/><script src="/_next/static/chunks/ad24b3b0881818aa.js" async=""></script><script src="/_next/static/chunks/01c05b0fdc89fc0c.js" async=""></script><script src="/_next/static/chunks/87f01c0a5d4010ab.js" async=""></script><script src="/_next/static/chunks/turbopack-8b3b66a22a5e0fb4.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/483effa74d32093a.js" async=""></script><title>500: Internal Server Error.</title><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/701cfcbb41e0ab47.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Ql6qo0GYLL23WRu6ec4N5\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"c:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/483effa74d32093a.js\"],\"IconMark\"]\n6:null\na:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lc\",\"1\",{}]]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"
|
|
1
|
+
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"tgHD+6NRmMcL5+La3uQltK12rpt4uIkpWu+9O8XbqcE=\"\n}"
|
|
@@ -48,11 +48,13 @@ Web UI (Next.js, src/app)
|
|
|
48
48
|
## Core Components
|
|
49
49
|
|
|
50
50
|
1. MCP server (`src/mcp/server.ts`)
|
|
51
|
+
|
|
51
52
|
- stdio MCP server using `@modelcontextprotocol/sdk`
|
|
52
53
|
- Project/spec/task/agent tools
|
|
53
54
|
- Uses `src/db/index.ts` with `@libsql/client`
|
|
54
55
|
|
|
55
56
|
2. Web UI (`src/app/`)
|
|
57
|
+
|
|
56
58
|
- Next.js App Router, React 19
|
|
57
59
|
- `/` Kanban board (drag/drop)
|
|
58
60
|
- `/specs` read-only spec list
|
|
@@ -60,11 +62,13 @@ Web UI (Next.js, src/app)
|
|
|
60
62
|
- Real-time updates via WebSocket (`localhost:3001`)
|
|
61
63
|
|
|
62
64
|
3. Specs on disk (`./devflow/specs/`)
|
|
65
|
+
|
|
63
66
|
- Source of truth for planning artifacts
|
|
64
67
|
- Per-spec files: `proposal.md`, `specs.md`, `design.md`, `tasks.md`, `.approvals.json`, `.meta.json`
|
|
65
68
|
- Approval state stores SHA256 content hash; editing approved artifacts auto-revokes approval
|
|
66
69
|
|
|
67
70
|
4. Database (`~/.devflow/devflow.db`)
|
|
71
|
+
|
|
68
72
|
- libSQL/SQLite + WAL mode
|
|
69
73
|
- Drizzle ORM tables: `projects`, `tasks`, `agent_activity`
|
|
70
74
|
- Promoted tasks reference spec by name (`specName` text field)
|
|
@@ -117,12 +121,12 @@ proposal -> (specs, design) -> tasks -> [Promote to Kanban]
|
|
|
117
121
|
|
|
118
122
|
## MCP Tool Categories
|
|
119
123
|
|
|
120
|
-
| Category | Tools
|
|
121
|
-
|
|
122
|
-
| Projects | `list_projects`, `create_project`, `get_project`, `update_project`, `get_or_create_project`
|
|
123
|
-
| Specs
|
|
124
|
-
| Tasks
|
|
125
|
-
| Agent
|
|
124
|
+
| Category | Tools |
|
|
125
|
+
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
126
|
+
| Projects | `list_projects`, `create_project`, `get_project`, `update_project`, `get_or_create_project` |
|
|
127
|
+
| Specs | `create_spec`, `list_specs`, `get_spec`, `get_spec_status`, `write_artifact`, `get_artifact`, `get_artifact_template`, `approve_artifact`, `draft_artifact`, `validate_spec`, `promote_spec`, `archive_spec` |
|
|
128
|
+
| Tasks | `list_tasks`, `get_task`, `create_task`, `create_tasks_bulk`, `update_task` |
|
|
129
|
+
| Agent | `check_in`, `check_out`, `log_activity`, `get_activity_log` |
|
|
126
130
|
|
|
127
131
|
## AI Agent Integration
|
|
128
132
|
|
|
@@ -135,6 +139,7 @@ args = ["mcp"]
|
|
|
135
139
|
```
|
|
136
140
|
|
|
137
141
|
Skills and slash commands install locations:
|
|
142
|
+
|
|
138
143
|
- Codex: `.codex/skills/` (project) and `~/.codex/prompts/` (global)
|
|
139
144
|
- Claude Code: `.claude/skills/` and `.claude/commands/df/`
|
|
140
145
|
|
|
@@ -151,7 +156,7 @@ devflow tool update # rewrite managed sections
|
|
|
151
156
|
|
|
152
157
|
`devflow init` also runs `tool install` automatically.
|
|
153
158
|
|
|
154
|
-
Available slash commands: `/df:new`, `/df:continue`, `/df:status`, `/df:validate`, `/df:promote`, `/df:apply`, `/df:archive`
|
|
159
|
+
Available slash commands: `/df:new`, `/df:continue`, `/df:status`, `/df:validate`, `/df:promote`, `/df:apply`, `/df:archive`, `/df:schema`
|
|
155
160
|
|
|
156
161
|
## Local Development Build & Install
|
|
157
162
|
|
|
@@ -175,6 +180,7 @@ bun install -g @sureshdsk/devflow-mcp
|
|
|
175
180
|
```
|
|
176
181
|
|
|
177
182
|
Rebuild rules:
|
|
183
|
+
|
|
178
184
|
- MCP server changes: no web rebuild needed (`devflow mcp` runs `src/mcp/server.ts` via Bun)
|
|
179
185
|
- Web UI changes: run `bun run build` before testing via `devflow dev`
|
|
180
186
|
- During active UI development, use `bun dev` for hot reload
|
|
@@ -30,12 +30,14 @@ By participating in this project, you agree to maintain a respectful and inclusi
|
|
|
30
30
|
### Pull Requests
|
|
31
31
|
|
|
32
32
|
1. **Fork the repository**
|
|
33
|
+
|
|
33
34
|
```bash
|
|
34
35
|
git clone https://github.com/yourusername/devflow-mcp.git
|
|
35
36
|
cd devflow-mcp
|
|
36
37
|
```
|
|
37
38
|
|
|
38
39
|
2. **Create a feature branch**
|
|
40
|
+
|
|
39
41
|
```bash
|
|
40
42
|
git checkout -b feature/your-feature-name
|
|
41
43
|
```
|
|
@@ -46,14 +48,15 @@ By participating in this project, you agree to maintain a respectful and inclusi
|
|
|
46
48
|
- Update documentation as needed
|
|
47
49
|
|
|
48
50
|
4. **Test your changes**
|
|
51
|
+
|
|
49
52
|
```bash
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
bun test # when tests are added
|
|
53
|
+
npm install
|
|
54
|
+
npm run typecheck
|
|
55
|
+
npm run lint
|
|
54
56
|
```
|
|
55
57
|
|
|
56
58
|
5. **Commit your changes**
|
|
59
|
+
|
|
57
60
|
```bash
|
|
58
61
|
git add .
|
|
59
62
|
git commit -m "feat: add your feature description"
|
|
@@ -78,7 +81,6 @@ By participating in this project, you agree to maintain a respectful and inclusi
|
|
|
78
81
|
|
|
79
82
|
### Prerequisites
|
|
80
83
|
|
|
81
|
-
- Bun v1.0+
|
|
82
84
|
- Node.js 20+
|
|
83
85
|
- Git
|
|
84
86
|
|
|
@@ -90,14 +92,14 @@ git clone https://github.com/YOUR_USERNAME/devflow-mcp.git
|
|
|
90
92
|
cd devflow-mcp
|
|
91
93
|
|
|
92
94
|
# Install dependencies
|
|
93
|
-
|
|
95
|
+
npm install
|
|
94
96
|
|
|
95
97
|
# Initialize database
|
|
96
|
-
|
|
98
|
+
npm run db:init
|
|
97
99
|
|
|
98
100
|
# Start development
|
|
99
|
-
|
|
100
|
-
|
|
101
|
+
npm run dev # Web UI
|
|
102
|
+
npm run mcp # MCP server
|
|
101
103
|
```
|
|
102
104
|
|
|
103
105
|
### MCP Server for Local Development
|
|
@@ -137,17 +139,29 @@ After changing MCP config, restart your coding tool's session for changes to tak
|
|
|
137
139
|
```
|
|
138
140
|
devflow-mcp/
|
|
139
141
|
├── src/
|
|
140
|
-
│ ├── app/ # Next.js app (web UI)
|
|
142
|
+
│ ├── app/ # Next.js app (web UI) + API routes
|
|
141
143
|
│ ├── components/ # React components
|
|
144
|
+
│ ├── hooks/ # React Query hooks (use-queries, use-websocket)
|
|
142
145
|
│ ├── db/ # Database schema and connection
|
|
143
146
|
│ ├── mcp/ # MCP server implementation
|
|
144
|
-
│
|
|
147
|
+
│ ├── lib/ # Utility functions (specs, schema, etc.)
|
|
148
|
+
│ └── schemas/ # Bundled spec workflow schemas
|
|
149
|
+
├── devflow/ # Project-level devflow data
|
|
150
|
+
│ ├── specs/ # Spec artifacts (proposal.md, specs.md, etc.)
|
|
151
|
+
│ └── project-config.json # Project config (default schema, etc.)
|
|
145
152
|
├── scripts/ # Build and setup scripts
|
|
146
153
|
├── drizzle/ # Database migrations
|
|
147
154
|
├── bin/ # CLI entry points
|
|
148
|
-
└──
|
|
155
|
+
└── .claude/ # Claude Code skills and commands
|
|
156
|
+
├── skills/ # Skill definitions (df-new, df-continue, etc.)
|
|
157
|
+
└── commands/ # Slash command definitions
|
|
149
158
|
```
|
|
150
159
|
|
|
160
|
+
### Data Storage
|
|
161
|
+
|
|
162
|
+
- **`~/.devflow/`** — Global data directory (SQLite database at `~/.devflow/devflow.db`). Shared across all projects.
|
|
163
|
+
- **`devflow/`** — Project-level directory for spec artifacts and project config. Committed to git.
|
|
164
|
+
|
|
151
165
|
## Code Style Guidelines
|
|
152
166
|
|
|
153
167
|
### TypeScript
|
|
@@ -166,7 +180,7 @@ devflow-mcp/
|
|
|
166
180
|
- Follow the "use client" directive pattern
|
|
167
181
|
|
|
168
182
|
```tsx
|
|
169
|
-
|
|
183
|
+
'use client';
|
|
170
184
|
|
|
171
185
|
interface MyComponentProps {
|
|
172
186
|
title: string;
|
|
@@ -196,15 +210,15 @@ export function MyComponent({ title, onAction }: MyComponentProps) {
|
|
|
196
210
|
```typescript
|
|
197
211
|
case "my_tool": {
|
|
198
212
|
const { param } = request.params.arguments as { param: string };
|
|
199
|
-
|
|
213
|
+
|
|
200
214
|
// Validate input
|
|
201
215
|
if (!param) {
|
|
202
216
|
throw new Error("param is required");
|
|
203
217
|
}
|
|
204
|
-
|
|
218
|
+
|
|
205
219
|
// Perform operation
|
|
206
220
|
const result = await db.select()...;
|
|
207
|
-
|
|
221
|
+
|
|
208
222
|
// Return structured response
|
|
209
223
|
return {
|
|
210
224
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
@@ -217,24 +231,29 @@ case "my_tool": {
|
|
|
217
231
|
### Manual Testing
|
|
218
232
|
|
|
219
233
|
1. Test the web UI:
|
|
234
|
+
|
|
220
235
|
```bash
|
|
221
|
-
|
|
236
|
+
npm run dev
|
|
222
237
|
```
|
|
223
|
-
|
|
238
|
+
|
|
239
|
+
- Create projects and tasks
|
|
224
240
|
- Test drag and drop
|
|
225
|
-
- Verify real-time updates
|
|
241
|
+
- Verify real-time updates via WebSocket + polling
|
|
226
242
|
|
|
227
243
|
2. Test the MCP server:
|
|
244
|
+
|
|
228
245
|
```bash
|
|
229
|
-
|
|
246
|
+
npm run mcp
|
|
230
247
|
```
|
|
231
|
-
|
|
248
|
+
|
|
249
|
+
- Use Claude Code, Cursor, or any MCP-compatible tool
|
|
232
250
|
- Test each tool
|
|
233
251
|
- Verify error handling
|
|
234
252
|
|
|
235
253
|
### Automated Testing (Coming Soon)
|
|
236
254
|
|
|
237
255
|
We're working on adding:
|
|
256
|
+
|
|
238
257
|
- Unit tests with Vitest
|
|
239
258
|
- Integration tests for MCP tools
|
|
240
259
|
- E2E tests with Playwright
|
|
@@ -272,14 +291,11 @@ async function createTask(projectId: string, title: string) {
|
|
|
272
291
|
```bash
|
|
273
292
|
# 1. Update src/db/schema.ts
|
|
274
293
|
# 2. Generate migration
|
|
275
|
-
|
|
294
|
+
npm run db:generate
|
|
276
295
|
|
|
277
296
|
# 3. Test migration
|
|
278
297
|
rm ~/.devflow/devflow.db
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
# 4. Verify schema
|
|
282
|
-
bun run db:studio
|
|
298
|
+
npm run db:init
|
|
283
299
|
```
|
|
284
300
|
|
|
285
301
|
### Migration Guidelines
|