@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/devflow/specs/autodetect-skill-and-slash-command-installation/design.md
CHANGED
|
@@ -11,17 +11,20 @@ The design isolates environment-specific logic behind adapters so support can be
|
|
|
11
11
|
### Components
|
|
12
12
|
|
|
13
13
|
1. Installer Orchestrator
|
|
14
|
+
|
|
14
15
|
- Entry point for install flow.
|
|
15
16
|
- Coordinates `detect -> resolve targets -> install -> summarize`.
|
|
16
17
|
- Aggregates per-environment results and exit status.
|
|
17
18
|
|
|
18
19
|
2. Environment Detectors
|
|
20
|
+
|
|
19
21
|
- `ClaudeCodeDetector`
|
|
20
22
|
- `CodexDetector`
|
|
21
23
|
- Each detector determines availability using tool-specific signals (binary presence, expected config directory, or both).
|
|
22
24
|
- Output is normalized into a common `DetectedEnvironment` model.
|
|
23
25
|
|
|
24
26
|
3. Environment Adapters
|
|
27
|
+
|
|
25
28
|
- `ClaudeCodeAdapter`
|
|
26
29
|
- `CodexAdapter`
|
|
27
30
|
- Each adapter resolves destination paths for:
|
|
@@ -30,6 +33,7 @@ The design isolates environment-specific logic behind adapters so support can be
|
|
|
30
33
|
- Encapsulates environment-specific path rules and platform handling.
|
|
31
34
|
|
|
32
35
|
4. Asset Installer
|
|
36
|
+
|
|
33
37
|
- Copies DevFlow-managed assets (skills and commands) into resolved targets.
|
|
34
38
|
- Uses safe write strategy:
|
|
35
39
|
- create temp file/dir
|
|
@@ -38,6 +42,7 @@ The design isolates environment-specific logic behind adapters so support can be
|
|
|
38
42
|
- Tracks installed/updated/skipped operations.
|
|
39
43
|
|
|
40
44
|
5. Summary Reporter
|
|
45
|
+
|
|
41
46
|
- Emits per-environment outcome with:
|
|
42
47
|
- detected status
|
|
43
48
|
- target paths
|
|
@@ -65,6 +70,7 @@ The design isolates environment-specific logic behind adapters so support can be
|
|
|
65
70
|
No persistent database schema changes are required.
|
|
66
71
|
|
|
67
72
|
In-memory models introduced:
|
|
73
|
+
|
|
68
74
|
- `DetectedEnvironment`
|
|
69
75
|
- `id` (`claude-code` | `codex`)
|
|
70
76
|
- `version?`
|
|
@@ -85,6 +91,7 @@ In-memory models introduced:
|
|
|
85
91
|
No external network API changes.
|
|
86
92
|
|
|
87
93
|
CLI/installer behavior changes:
|
|
94
|
+
|
|
88
95
|
- Existing install command performs auto-detection by default.
|
|
89
96
|
- Optional flags:
|
|
90
97
|
- `--no-autodetect` to disable environment detection and preserve manual behavior.
|
|
@@ -112,12 +119,14 @@ CLI/installer behavior changes:
|
|
|
112
119
|
## Testing Strategy
|
|
113
120
|
|
|
114
121
|
1. Unit tests
|
|
122
|
+
|
|
115
123
|
- Detector tests for present/absent/malformed signals.
|
|
116
124
|
- Adapter path resolution tests across OS path variants.
|
|
117
125
|
- Asset installer idempotency and safe-write tests.
|
|
118
126
|
- Summary reporter formatting and status mapping tests.
|
|
119
127
|
|
|
120
128
|
2. Integration tests
|
|
129
|
+
|
|
121
130
|
- Simulated filesystem environments for:
|
|
122
131
|
- Claude Code only
|
|
123
132
|
- Codex only
|
|
@@ -127,6 +136,7 @@ CLI/installer behavior changes:
|
|
|
127
136
|
- Partial failure scenario (one env succeeds, one fails).
|
|
128
137
|
|
|
129
138
|
3. End-to-end installer tests
|
|
139
|
+
|
|
130
140
|
- Run installer with fixtures and verify:
|
|
131
141
|
- expected files created/updated
|
|
132
142
|
- unrelated files unchanged
|
|
@@ -134,4 +144,5 @@ CLI/installer behavior changes:
|
|
|
134
144
|
- exit code behavior
|
|
135
145
|
|
|
136
146
|
4. Regression coverage
|
|
147
|
+
|
|
137
148
|
- Existing manual install flows remain functional when autodetect disabled or unavailable.
|
package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/proposal.md
CHANGED
|
@@ -9,6 +9,7 @@ DevFlow installation currently requires manual setup steps for AI coding environ
|
|
|
9
9
|
Add an installation flow that automatically detects supported AI coding environments (Claude Code and Codex) and installs compatible skills and slash commands without requiring manual environment-specific steps.
|
|
10
10
|
|
|
11
11
|
The installer will:
|
|
12
|
+
|
|
12
13
|
- Detect which supported tools are present on the host.
|
|
13
14
|
- Determine install targets and paths for each detected tool.
|
|
14
15
|
- Install DevFlow skills and slash commands into the detected environment(s).
|
|
@@ -18,6 +19,7 @@ The installer will:
|
|
|
18
19
|
## Scope
|
|
19
20
|
|
|
20
21
|
### In Scope
|
|
22
|
+
|
|
21
23
|
- Detection logic for Claude Code and Codex presence.
|
|
22
24
|
- Mapping from detected tool to install locations for skills and slash commands.
|
|
23
25
|
- Automatic installation of DevFlow-provided skills and slash commands.
|
|
@@ -25,6 +27,7 @@ The installer will:
|
|
|
25
27
|
- Safe handling for partial support cases (e.g., only one tool detected).
|
|
26
28
|
|
|
27
29
|
### Out of Scope
|
|
30
|
+
|
|
28
31
|
- Supporting additional AI coding tools beyond Claude Code and Codex.
|
|
29
32
|
- Migration of existing user-customized skills/commands.
|
|
30
33
|
- Cloud-based environment discovery.
|
package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/tasks.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Tasks: Auto-Detect and Install Skills and Slash Commands
|
|
2
2
|
|
|
3
3
|
## How To Use This File
|
|
4
|
+
|
|
4
5
|
- Create one task card per meaningful unit of delivery.
|
|
5
6
|
- Keep tasks dependency-ordered and independently executable where possible.
|
|
6
7
|
- Every task card must include enough context that a new agent can execute it without re-discovery work.
|
|
@@ -9,23 +10,28 @@
|
|
|
9
10
|
## 1. Delivery Overview
|
|
10
11
|
|
|
11
12
|
### 1.1 Objective
|
|
13
|
+
|
|
12
14
|
Deliver an installation flow that auto-detects Claude Code and Codex, resolves environment-specific install targets, installs DevFlow skills and slash commands idempotently, and reports clear per-environment outcomes with safe failure behavior.
|
|
13
15
|
|
|
14
16
|
### 1.2 In-Scope Outcomes
|
|
17
|
+
|
|
15
18
|
- Automatic detection and install target resolution for Claude Code and Codex.
|
|
16
19
|
- Automatic installation of DevFlow-managed skills and slash commands for each detected environment.
|
|
17
20
|
- Clear summary output and robust failure isolation.
|
|
18
21
|
|
|
19
22
|
### 1.3 Non-Goals
|
|
23
|
+
|
|
20
24
|
- Support for additional AI coding environments beyond Claude Code and Codex.
|
|
21
25
|
- Migration tooling for arbitrary user-managed custom skills/commands.
|
|
22
26
|
|
|
23
27
|
### 1.4 Global Constraints
|
|
28
|
+
|
|
24
29
|
- Preserve existing manual flow via explicit opt-out/override flags.
|
|
25
30
|
- Only modify DevFlow-managed files; never modify unrelated user files.
|
|
26
31
|
- Installer must remain idempotent and safe on repeated runs.
|
|
27
32
|
|
|
28
33
|
### 1.5 Shared References
|
|
34
|
+
|
|
29
35
|
- Proposal: `devflow/specs/autodetect-skill-and-slash-command-installation/proposal.md`
|
|
30
36
|
- Design: `devflow/specs/autodetect-skill-and-slash-command-installation/design.md`
|
|
31
37
|
- Specs: `devflow/specs/autodetect-skill-and-slash-command-installation/specs.md`
|
|
@@ -40,6 +46,7 @@ Deliver an installation flow that auto-detects Claude Code and Codex, resolves e
|
|
|
40
46
|
Inspect existing install pipeline, add environment detection contracts and registry, implement Claude Code and Codex detectors, add unit tests for detection scenarios, run tests, then update task summary and check out.
|
|
41
47
|
|
|
42
48
|
### 2.1 Task: Add environment detection and adapter contracts
|
|
49
|
+
|
|
43
50
|
- [ ] **Status**
|
|
44
51
|
- **Task ID:** `T1`
|
|
45
52
|
- **Owner Type:** `agent`
|
|
@@ -53,6 +60,7 @@ Create a shared detector/adapter contract and implement Claude Code and Codex de
|
|
|
53
60
|
Detection must be environment-specific but consumed by common orchestration logic. This is foundational for all later tasks.
|
|
54
61
|
|
|
55
62
|
**Scope**
|
|
63
|
+
|
|
56
64
|
- In scope:
|
|
57
65
|
- Define `DetectedEnvironment` and adapter interfaces.
|
|
58
66
|
- Implement `ClaudeCodeDetector` and `CodexDetector`.
|
|
@@ -61,6 +69,7 @@ Detection must be environment-specific but consumed by common orchestration logi
|
|
|
61
69
|
- Actual file installation writes.
|
|
62
70
|
|
|
63
71
|
**Implementation Targets**
|
|
72
|
+
|
|
64
73
|
- Files to create/update:
|
|
65
74
|
- installer detection and adapter modules
|
|
66
75
|
- shared types/contracts for detection results
|
|
@@ -69,11 +78,13 @@ Detection must be environment-specific but consumed by common orchestration logi
|
|
|
69
78
|
- environment identifier enum/string union
|
|
70
79
|
|
|
71
80
|
**Execution Steps**
|
|
81
|
+
|
|
72
82
|
1. Define detector result and environment ID contracts.
|
|
73
83
|
2. Implement tool-specific detection logic for Claude Code and Codex.
|
|
74
84
|
3. Add registry wiring and unit tests for detection permutations.
|
|
75
85
|
|
|
76
86
|
**Validation**
|
|
87
|
+
|
|
77
88
|
- Automated tests to add/update:
|
|
78
89
|
- detection unit test suite covering present/absent/both/none
|
|
79
90
|
- Commands to run:
|
|
@@ -83,10 +94,12 @@ Detection must be environment-specific but consumed by common orchestration logi
|
|
|
83
94
|
- verify detector debug output is understandable in verbose mode
|
|
84
95
|
|
|
85
96
|
**Acceptance Criteria**
|
|
97
|
+
|
|
86
98
|
- Detection returns correct environment set for all four core scenarios.
|
|
87
99
|
- Contracts are stable and reusable by orchestration layer.
|
|
88
100
|
|
|
89
101
|
**Risks and Mitigations**
|
|
102
|
+
|
|
90
103
|
- Risk: false positives from weak detection signals.
|
|
91
104
|
- Mitigation: require at least one strong signal or multi-signal confirmation per environment.
|
|
92
105
|
|
|
@@ -94,16 +107,18 @@ Detection must be environment-specific but consumed by common orchestration logi
|
|
|
94
107
|
Provide detector contract docs and examples so next task can integrate target resolution without re-discovery.
|
|
95
108
|
|
|
96
109
|
**Task Summary**
|
|
110
|
+
|
|
97
111
|
- Completed: no
|
|
98
112
|
- What was done: N/A
|
|
99
113
|
- Files changed: N/A
|
|
100
114
|
- Issues encountered: N/A
|
|
101
115
|
- Follow-ups: N/A
|
|
102
|
-
**Execution Plan**
|
|
116
|
+
**Execution Plan**
|
|
103
117
|
|
|
104
118
|
Refactor install-skills to use adapter-resolved targets with safe write semantics, enforce DevFlow-managed ownership checks, isolate failures per environment/asset, and expand tests for no-op re-run and partial failure scenarios before checking out.
|
|
105
119
|
|
|
106
120
|
### 2.2 Task: Implement install target resolution and idempotent asset installer
|
|
121
|
+
|
|
107
122
|
- [ ] **Status**
|
|
108
123
|
- **Task ID:** `T2`
|
|
109
124
|
- **Owner Type:** `agent`
|
|
@@ -117,6 +132,7 @@ Resolve per-environment install paths and implement safe, idempotent installatio
|
|
|
117
132
|
Path resolution and write behavior are environment-dependent and must be failure-isolated per environment.
|
|
118
133
|
|
|
119
134
|
**Scope**
|
|
135
|
+
|
|
120
136
|
- In scope:
|
|
121
137
|
- Implement `ClaudeCodeAdapter` and `CodexAdapter` path resolution.
|
|
122
138
|
- Build asset installer with safe writes and ownership checks.
|
|
@@ -125,6 +141,7 @@ Path resolution and write behavior are environment-dependent and must be failure
|
|
|
125
141
|
- CLI flags and final summary UX polish.
|
|
126
142
|
|
|
127
143
|
**Implementation Targets**
|
|
144
|
+
|
|
128
145
|
- Files to create/update:
|
|
129
146
|
- adapter implementations
|
|
130
147
|
- install/write utility modules
|
|
@@ -134,11 +151,13 @@ Path resolution and write behavior are environment-dependent and must be failure
|
|
|
134
151
|
- install operation result model
|
|
135
152
|
|
|
136
153
|
**Execution Steps**
|
|
154
|
+
|
|
137
155
|
1. Implement adapter path resolution for both environments.
|
|
138
156
|
2. Add idempotent copy/update logic for skills and slash commands.
|
|
139
157
|
3. Add tests for permission errors, partial failures, and no-op re-run behavior.
|
|
140
158
|
|
|
141
159
|
**Validation**
|
|
160
|
+
|
|
142
161
|
- Automated tests to add/update:
|
|
143
162
|
- adapter resolution tests
|
|
144
163
|
- installer idempotency and failure isolation tests
|
|
@@ -149,11 +168,13 @@ Path resolution and write behavior are environment-dependent and must be failure
|
|
|
149
168
|
- run installer twice against fixture dirs and confirm second run is no-op
|
|
150
169
|
|
|
151
170
|
**Acceptance Criteria**
|
|
171
|
+
|
|
152
172
|
- Installer writes expected assets for each resolved environment.
|
|
153
173
|
- Re-running installer does not duplicate files and only updates changed DevFlow-managed assets.
|
|
154
174
|
- Failure in one environment does not prevent install in another.
|
|
155
175
|
|
|
156
176
|
**Risks and Mitigations**
|
|
177
|
+
|
|
157
178
|
- Risk: accidental overwrite of user-managed files.
|
|
158
179
|
- Mitigation: strict ownership markers and deny-write for unmanaged files.
|
|
159
180
|
|
|
@@ -161,16 +182,18 @@ Path resolution and write behavior are environment-dependent and must be failure
|
|
|
161
182
|
Document adapter path assumptions by OS so CLI integration task can surface helpful diagnostics.
|
|
162
183
|
|
|
163
184
|
**Task Summary**
|
|
185
|
+
|
|
164
186
|
- Completed: no
|
|
165
187
|
- What was done: N/A
|
|
166
188
|
- Files changed: N/A
|
|
167
189
|
- Issues encountered: N/A
|
|
168
190
|
- Follow-ups: N/A
|
|
169
|
-
**Execution Plan**
|
|
191
|
+
**Execution Plan**
|
|
170
192
|
|
|
171
193
|
Integrate autodetect pipeline into install-skills and devflow CLI, add --no-autodetect/--only/--dry-run flags, include per-environment summary output, add tests for flag behavior and dry-run, update task summary, then check out.
|
|
172
194
|
|
|
173
195
|
### 2.3 Task: Integrate pipeline into installer CLI and add summary reporting
|
|
196
|
+
|
|
174
197
|
- [ ] **Status**
|
|
175
198
|
- **Task ID:** `T3`
|
|
176
199
|
- **Owner Type:** `agent`
|
|
@@ -184,6 +207,7 @@ Connect detect/resolve/install pipeline to the installer command and provide cle
|
|
|
184
207
|
This task makes the behavior user-visible and keeps backward compatibility for manual flow via flags.
|
|
185
208
|
|
|
186
209
|
**Scope**
|
|
210
|
+
|
|
187
211
|
- In scope:
|
|
188
212
|
- Wire orchestrator into install command.
|
|
189
213
|
- Add `--no-autodetect`, `--only=<env>`, and `--dry-run` (or equivalent naming per CLI conventions).
|
|
@@ -192,6 +216,7 @@ This task makes the behavior user-visible and keeps backward compatibility for m
|
|
|
192
216
|
- New environment support beyond Claude Code/Codex.
|
|
193
217
|
|
|
194
218
|
**Implementation Targets**
|
|
219
|
+
|
|
195
220
|
- Files to create/update:
|
|
196
221
|
- installer CLI entrypoint and option parsing
|
|
197
222
|
- orchestrator module
|
|
@@ -200,11 +225,13 @@ This task makes the behavior user-visible and keeps backward compatibility for m
|
|
|
200
225
|
- install command behavior and flags
|
|
201
226
|
|
|
202
227
|
**Execution Steps**
|
|
228
|
+
|
|
203
229
|
1. Add orchestration pipeline invocation to install command.
|
|
204
230
|
2. Implement flags and execution branches (autodetect/default, restricted env, dry-run).
|
|
205
231
|
3. Add integration/e2e tests for summary output and exit code behavior.
|
|
206
232
|
|
|
207
233
|
**Validation**
|
|
234
|
+
|
|
208
235
|
- Automated tests to add/update:
|
|
209
236
|
- CLI integration tests for core scenarios and flags
|
|
210
237
|
- Commands to run:
|
|
@@ -214,11 +241,13 @@ This task makes the behavior user-visible and keeps backward compatibility for m
|
|
|
214
241
|
- run installer in fixture setups for Claude-only, Codex-only, both, and none
|
|
215
242
|
|
|
216
243
|
**Acceptance Criteria**
|
|
244
|
+
|
|
217
245
|
- Default install auto-detects and installs for supported detected environments.
|
|
218
246
|
- Summary output clearly reports installed/skipped/failed per environment with reasons.
|
|
219
247
|
- Flags work as documented and preserve manual behavior when requested.
|
|
220
248
|
|
|
221
249
|
**Risks and Mitigations**
|
|
250
|
+
|
|
222
251
|
- Risk: confusing CLI output in partial-failure cases.
|
|
223
252
|
- Mitigation: structured per-environment summary with explicit reason and suggested remediation.
|
|
224
253
|
|
|
@@ -226,6 +255,7 @@ This task makes the behavior user-visible and keeps backward compatibility for m
|
|
|
226
255
|
Include before/after CLI output examples in docs for release notes and support.
|
|
227
256
|
|
|
228
257
|
**Task Summary**
|
|
258
|
+
|
|
229
259
|
- Completed: no
|
|
230
260
|
- What was done: N/A
|
|
231
261
|
- Files changed: N/A
|
|
@@ -233,12 +263,14 @@ Include before/after CLI output examples in docs for release notes and support.
|
|
|
233
263
|
- Follow-ups: N/A
|
|
234
264
|
|
|
235
265
|
## 3. Cross-Task Verification
|
|
266
|
+
|
|
236
267
|
- [ ] End-to-end behavior matches `specs.md` requirements and scenarios.
|
|
237
268
|
- [ ] All affected tests are updated and passing.
|
|
238
269
|
- [ ] User-facing docs and command help are updated where behavior changed.
|
|
239
270
|
- [ ] Rollback path is documented for risky changes.
|
|
240
271
|
|
|
241
272
|
## 4. Completion Gate
|
|
273
|
+
|
|
242
274
|
- [ ] All task cards are checked complete.
|
|
243
275
|
- [ ] Spec validation command passes for `autodetect-skill-and-slash-command-installation`.
|
|
244
276
|
- [ ] Implementation summary and follow-up items are recorded in handoff notes.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"artifacts": {
|
|
4
|
+
"proposal": {
|
|
5
|
+
"state": "approved",
|
|
6
|
+
"approvedAt": "2026-02-27T12:20:51.946Z",
|
|
7
|
+
"contentHash": "4c009bda20fed6264ed0b3db42790f875c54889b5f64de30f0592402ffb150a1",
|
|
8
|
+
"approvedBy": "human"
|
|
9
|
+
},
|
|
10
|
+
"specs": {
|
|
11
|
+
"state": "approved",
|
|
12
|
+
"approvedAt": "2026-02-27T12:47:30.347Z",
|
|
13
|
+
"contentHash": "daab8a3eb6cdd62994319eb3924ccc4a3c6abba1fe172baf65deb77f0898b673",
|
|
14
|
+
"approvedBy": "human"
|
|
15
|
+
},
|
|
16
|
+
"design": {
|
|
17
|
+
"state": "approved",
|
|
18
|
+
"approvedAt": "2026-02-27T12:47:30.355Z",
|
|
19
|
+
"contentHash": "a99715ba724aebf55aee18340effd33a321c041859d9d50f9d5c313be5b3d882",
|
|
20
|
+
"approvedBy": "human"
|
|
21
|
+
},
|
|
22
|
+
"tasks": {
|
|
23
|
+
"state": "draft"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Design: Setup automatic linting & formatting on git commit
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Add a pre-commit hook pipeline using husky (v9) and lint-staged (v15) that runs ESLint and Prettier on staged files. No architecture or data model changes — this is purely a developer tooling addition.
|
|
6
|
+
|
|
7
|
+
## Architecture
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
flowchart TD
|
|
11
|
+
A[git commit] --> B[.husky/pre-commit]
|
|
12
|
+
B --> C[npx lint-staged]
|
|
13
|
+
C --> D{File type?}
|
|
14
|
+
D -->|*.ts, *.tsx| E[eslint --fix]
|
|
15
|
+
E --> F[prettier --write]
|
|
16
|
+
D -->|*.js, *.json, *.css, *.md| F
|
|
17
|
+
D -->|other files| G[skip]
|
|
18
|
+
F --> H{Errors?}
|
|
19
|
+
H -->|No| I[Re-stage fixed files]
|
|
20
|
+
I --> J[Commit succeeds]
|
|
21
|
+
H -->|Yes| K[Commit blocked]
|
|
22
|
+
G --> J
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
All configuration lives in the project root:
|
|
26
|
+
|
|
27
|
+
- `.husky/pre-commit` — shell script that runs `npx lint-staged`
|
|
28
|
+
- `package.json` — `lint-staged` config block and `prepare` script
|
|
29
|
+
- `.prettierrc` — Prettier options
|
|
30
|
+
- `.prettierignore` — files/dirs to skip (node_modules, .next, dist)
|
|
31
|
+
|
|
32
|
+
## Data Model Changes
|
|
33
|
+
|
|
34
|
+
None.
|
|
35
|
+
|
|
36
|
+
## API Changes
|
|
37
|
+
|
|
38
|
+
None.
|
|
39
|
+
|
|
40
|
+
## Implementation Notes
|
|
41
|
+
|
|
42
|
+
### Package versions
|
|
43
|
+
|
|
44
|
+
- `husky@^9` — uses the simplified `husky init` setup (no `husky install`)
|
|
45
|
+
- `lint-staged@^15` — latest stable
|
|
46
|
+
- `prettier@^3` — latest stable
|
|
47
|
+
|
|
48
|
+
### package.json changes
|
|
49
|
+
|
|
50
|
+
Add to `scripts`:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
"prepare": "husky"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The existing `postinstall` script is unaffected — `prepare` runs after `install` and before `prepublishOnly`.
|
|
57
|
+
|
|
58
|
+
Add `lint-staged` config block:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
"lint-staged": {
|
|
62
|
+
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
|
|
63
|
+
"*.{js,json,css,md}": ["prettier --write"]
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### .prettierrc
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"semi": true,
|
|
72
|
+
"singleQuote": true,
|
|
73
|
+
"trailingComma": "all",
|
|
74
|
+
"tabWidth": 2,
|
|
75
|
+
"printWidth": 100
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### .prettierignore
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
node_modules
|
|
83
|
+
.next
|
|
84
|
+
dist
|
|
85
|
+
drizzle
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Husky setup
|
|
89
|
+
|
|
90
|
+
Run `npx husky init` which creates `.husky/pre-commit`. Replace its contents with:
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
npx lint-staged
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Baseline formatting commit
|
|
97
|
+
|
|
98
|
+
After setup, run `npx prettier --write .` across the codebase and commit as a single formatting commit before the hook is active for other developers.
|
|
99
|
+
|
|
100
|
+
## Testing Strategy
|
|
101
|
+
|
|
102
|
+
- **Manual**: Stage a file with a formatting issue, run `git commit`, verify it gets auto-fixed
|
|
103
|
+
- **Manual**: Stage a file with a non-fixable ESLint error, run `git commit`, verify it's blocked
|
|
104
|
+
- **Manual**: Run `npm install` in a fresh clone, verify `.husky/` hooks are installed
|
|
105
|
+
- **CI**: No changes needed — CI doesn't use git hooks
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Proposal: Setup automatic linting & formatting on git commit
|
|
2
|
+
|
|
3
|
+
## Problem Statement
|
|
4
|
+
|
|
5
|
+
There is no automated code quality gate on commit. Developers (and AI agents) can commit code with lint errors, inconsistent formatting, or type issues. This leads to noisy diffs, broken CI, and wasted review cycles.
|
|
6
|
+
|
|
7
|
+
## Proposed Solution
|
|
8
|
+
|
|
9
|
+
Add **lint-staged** + **husky** to run ESLint and Prettier automatically on staged files during `git commit`. This ensures every commit passes linting and formatting checks before it lands.
|
|
10
|
+
|
|
11
|
+
- **Husky** — manages the git `pre-commit` hook
|
|
12
|
+
- **lint-staged** — runs linters only on staged files for speed
|
|
13
|
+
- **Prettier** — formats `.ts`, `.tsx`, `.js`, `.json`, `.css`, `.md` files
|
|
14
|
+
- ESLint (already installed) — lints `.ts` and `.tsx` files
|
|
15
|
+
|
|
16
|
+
## Scope
|
|
17
|
+
|
|
18
|
+
### In Scope
|
|
19
|
+
|
|
20
|
+
- Install husky, lint-staged, and prettier as devDependencies
|
|
21
|
+
- Configure husky pre-commit hook to run lint-staged
|
|
22
|
+
- Configure lint-staged to run `eslint --fix` on `.ts/.tsx` files and `prettier --write` on all supported files
|
|
23
|
+
- Add a `.prettierrc` with sensible defaults (single quotes, trailing commas, 2-space indent)
|
|
24
|
+
- Add `prepare` script (`husky`) to package.json so hooks install automatically on `npm install`
|
|
25
|
+
|
|
26
|
+
### Out of Scope
|
|
27
|
+
|
|
28
|
+
- CI pipeline changes
|
|
29
|
+
- Commit message linting (commitlint)
|
|
30
|
+
- Pre-push hooks (e.g. running tests or typecheck)
|
|
31
|
+
- Changing existing ESLint rules
|
|
32
|
+
|
|
33
|
+
## Success Criteria
|
|
34
|
+
|
|
35
|
+
- Running `git commit` on files with formatting issues auto-fixes them before committing
|
|
36
|
+
- Running `git commit` on files with lint errors blocks the commit with a clear error message
|
|
37
|
+
- Hooks install automatically when a new contributor runs `npm install`
|
|
38
|
+
|
|
39
|
+
## Risks & Assumptions
|
|
40
|
+
|
|
41
|
+
- **Assumption**: The team is fine with Prettier's opinionated defaults; first commit may touch many files if existing code doesn't match
|
|
42
|
+
- **Risk**: The `postinstall` script already exists — the `prepare` script for husky must coexist without conflict
|
|
43
|
+
- **Mitigation**: Run Prettier on the full codebase in a single formatting commit before enabling the hook, to avoid noisy diffs on subsequent commits
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Specifications: Setup automatic linting & formatting on git commit
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This spec defines the requirements for integrating pre-commit hooks that automatically lint and format staged files before each git commit.
|
|
6
|
+
|
|
7
|
+
### Requirement: Husky Git Hook Installation
|
|
8
|
+
|
|
9
|
+
**SHALL** install husky and configure it to run a pre-commit hook automatically when contributors run `npm install`.
|
|
10
|
+
|
|
11
|
+
#### Scenario: Fresh clone and install
|
|
12
|
+
|
|
13
|
+
**Given** a developer clones the repository for the first time
|
|
14
|
+
**When** they run `npm install`
|
|
15
|
+
**Then** husky installs git hooks into `.husky/` and the pre-commit hook is active
|
|
16
|
+
|
|
17
|
+
#### Scenario: CI environment
|
|
18
|
+
|
|
19
|
+
**Given** the project is installed in a CI environment where `CI=true`
|
|
20
|
+
**When** `npm install` runs
|
|
21
|
+
**Then** husky skips hook installation gracefully (no errors)
|
|
22
|
+
|
|
23
|
+
### Requirement: Lint-Staged Configuration
|
|
24
|
+
|
|
25
|
+
**SHALL** configure lint-staged to run the appropriate tool on each staged file type.
|
|
26
|
+
|
|
27
|
+
#### Scenario: TypeScript/TSX files staged
|
|
28
|
+
|
|
29
|
+
**Given** a developer stages `.ts` or `.tsx` files
|
|
30
|
+
**When** they run `git commit`
|
|
31
|
+
**Then** lint-staged runs `eslint --fix` followed by `prettier --write` on those files
|
|
32
|
+
|
|
33
|
+
#### Scenario: Non-TypeScript files staged
|
|
34
|
+
|
|
35
|
+
**Given** a developer stages `.json`, `.css`, `.md`, or `.js` files
|
|
36
|
+
**When** they run `git commit`
|
|
37
|
+
**Then** lint-staged runs `prettier --write` on those files
|
|
38
|
+
|
|
39
|
+
#### Scenario: No matching files staged
|
|
40
|
+
|
|
41
|
+
**Given** a developer stages only files not matched by lint-staged (e.g. images, `.gitignore`)
|
|
42
|
+
**When** they run `git commit`
|
|
43
|
+
**Then** the commit proceeds without running any linters
|
|
44
|
+
|
|
45
|
+
### Requirement: ESLint Auto-Fix on Commit
|
|
46
|
+
|
|
47
|
+
**SHALL** run `eslint --fix` on staged TypeScript files to auto-fix resolvable issues.
|
|
48
|
+
|
|
49
|
+
#### Scenario: Auto-fixable lint error
|
|
50
|
+
|
|
51
|
+
**Given** a staged `.ts` file has an auto-fixable ESLint error (e.g. unused import)
|
|
52
|
+
**When** the pre-commit hook runs
|
|
53
|
+
**Then** ESLint fixes the issue, the fixed file is re-staged, and the commit succeeds
|
|
54
|
+
|
|
55
|
+
#### Scenario: Non-fixable lint error
|
|
56
|
+
|
|
57
|
+
**Given** a staged `.ts` file has a lint error that cannot be auto-fixed
|
|
58
|
+
**When** the pre-commit hook runs
|
|
59
|
+
**Then** the commit is blocked and the error is printed to the terminal
|
|
60
|
+
|
|
61
|
+
### Requirement: Prettier Formatting on Commit
|
|
62
|
+
|
|
63
|
+
**SHALL** run `prettier --write` on staged files to enforce consistent formatting.
|
|
64
|
+
|
|
65
|
+
#### Scenario: Unformatted file
|
|
66
|
+
|
|
67
|
+
**Given** a staged file has inconsistent formatting (wrong indentation, missing trailing comma)
|
|
68
|
+
**When** the pre-commit hook runs
|
|
69
|
+
**Then** Prettier reformats the file, the formatted file is re-staged, and the commit succeeds
|
|
70
|
+
|
|
71
|
+
### Requirement: Prettier Configuration
|
|
72
|
+
|
|
73
|
+
**SHALL** provide a `.prettierrc` configuration file with project defaults.
|
|
74
|
+
|
|
75
|
+
#### Scenario: Prettier config is respected
|
|
76
|
+
|
|
77
|
+
**Given** a `.prettierrc` file exists in the project root
|
|
78
|
+
**When** Prettier runs on any file
|
|
79
|
+
**Then** it uses the settings from `.prettierrc` (single quotes, trailing commas, 2-space indent, 100 char print width)
|
|
80
|
+
|
|
81
|
+
### Requirement: Baseline Formatting Commit
|
|
82
|
+
|
|
83
|
+
**SHALL** run Prettier on the entire codebase in a single commit before enabling the hook, to avoid noisy diffs in subsequent commits.
|
|
84
|
+
|
|
85
|
+
#### Scenario: Initial formatting pass
|
|
86
|
+
|
|
87
|
+
**Given** the pre-commit hook setup is complete
|
|
88
|
+
**When** Prettier is run across the full codebase
|
|
89
|
+
**Then** all supported files are formatted and committed in a single "chore: format codebase" commit
|