@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.
Files changed (504) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +4 -4
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
  6. package/.next/standalone/.next/server/app/_global-error/page.js +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  9. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
  16. package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
  17. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.rsc +14 -13
  21. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +14 -13
  22. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  23. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +5 -4
  24. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  25. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  26. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  27. package/.next/standalone/.next/server/app/api/projects/[id]/route.js +2 -2
  28. package/.next/standalone/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/projects/route.js +2 -2
  30. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/specs/[name]/artifacts/[artifactType]/approve/route.js +2 -2
  32. package/.next/standalone/.next/server/app/api/specs/[name]/artifacts/[artifactType]/approve/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/specs/[name]/artifacts/[artifactType]/route.js +2 -2
  34. package/.next/standalone/.next/server/app/api/specs/[name]/artifacts/[artifactType]/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/specs/[name]/promote/route.js +2 -2
  36. package/.next/standalone/.next/server/app/api/specs/[name]/promote/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/specs/[name]/route.js +2 -2
  38. package/.next/standalone/.next/server/app/api/specs/[name]/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/specs/route.js +2 -2
  40. package/.next/standalone/.next/server/app/api/specs/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/tasks/[id]/route.js +2 -2
  42. package/.next/standalone/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/tasks/route.js +2 -2
  44. package/.next/standalone/.next/server/app/api/tasks/route.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/index.html +1 -1
  46. package/.next/standalone/.next/server/app/index.rsc +15 -14
  47. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  48. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -14
  49. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  50. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +5 -4
  51. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  52. package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
  53. package/.next/standalone/.next/server/app/page.js +2 -2
  54. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/specs/[name]/page/build-manifest.json +2 -2
  57. package/.next/standalone/.next/server/app/specs/[name]/page.js +2 -2
  58. package/.next/standalone/.next/server/app/specs/[name]/page.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/specs/[name]/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0be0eb8b._.js +3 -0
  61. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__a9d478ee._.js → [root-of-the-server]__160c54ca._.js} +2 -2
  62. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17ac51e3._.js +3 -0
  63. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bb083e9._.js +3 -0
  64. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1dc1e944._.js +3 -0
  65. package/.next/standalone/.next/server/chunks/[root-of-the-server]__22ecfa2c._.js +3 -0
  66. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__13a93eb6._.js → [root-of-the-server]__64710c0d._.js} +2 -2
  67. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a2b7e5f2._.js +3 -0
  68. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cf302bda._.js +3 -0
  69. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d85482cd._.js +3 -0
  70. package/.next/standalone/.next/server/chunks/[root-of-the-server]__dfa21757._.js +3 -0
  71. package/.next/standalone/.next/server/chunks/_3f452afe._.js +2 -2
  72. package/.next/standalone/.next/server/chunks/src_db_index_ts_a71f50f0._.js +3 -0
  73. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__023e2c69._.js +3 -0
  74. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0a1a1435._.js +3 -0
  75. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0c49a387._.js +3 -0
  76. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1be1fc5f._.js +3 -0
  77. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3a2f2efb._.js +3 -0
  78. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4693399c._.js +3 -0
  79. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__937c9212._.js → [root-of-the-server]__72a14301._.js} +2 -2
  80. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__8064ca06._.js +3 -0
  81. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__8b786d48._.js +3 -0
  82. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__8c052461._.js +3 -0
  83. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__8d306066._.js +3 -0
  84. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__9532fd59._.js +3 -0
  85. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a119dd75._.js +3 -0
  86. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__7fb6ef14._.js → [root-of-the-server]__a57b312b._.js} +2 -2
  87. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a80bd0ea._.js +3 -0
  88. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__abe095b3._.js +3 -0
  89. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ad3bd783._.js +3 -0
  90. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1e05fe0e._.js → [root-of-the-server]__ae9f05d6._.js} +2 -2
  91. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__c8781469._.js +3 -0
  92. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__c8a25070._.js +3 -0
  93. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__e8c1e595._.js +3 -0
  94. package/.next/standalone/.next/server/chunks/ssr/_0ff3de19._.js +1 -1
  95. package/.next/standalone/.next/server/chunks/ssr/node_modules_01a5cd4b._.js +3 -0
  96. package/.next/standalone/.next/server/chunks/ssr/node_modules_05c6819f._.js +31 -0
  97. package/.next/standalone/.next/server/chunks/ssr/node_modules_06c2c30a._.js +3 -0
  98. package/.next/standalone/.next/server/chunks/ssr/node_modules_09efe605._.js +3 -0
  99. package/.next/standalone/.next/server/chunks/ssr/{node_modules_mermaid_dist_chunks_mermaid_core_ef601841._.js → node_modules_0a439e3b._.js} +2 -2
  100. package/.next/standalone/.next/server/chunks/ssr/{node_modules_3507b41a._.js → node_modules_0e73ad6c._.js} +3 -3
  101. package/.next/standalone/.next/server/chunks/ssr/node_modules_0e7ff06d._.js +3 -0
  102. package/.next/standalone/.next/server/chunks/ssr/node_modules_0f73e25c._.js +3 -0
  103. package/.next/standalone/.next/server/chunks/ssr/node_modules_14cf9cea._.js +3 -0
  104. package/.next/standalone/.next/server/chunks/ssr/node_modules_19801f01._.js +3 -0
  105. package/.next/standalone/.next/server/chunks/ssr/node_modules_2235b8cf._.js +17 -0
  106. package/.next/standalone/.next/server/chunks/ssr/node_modules_23096c6d._.js +3 -0
  107. package/.next/standalone/.next/server/chunks/ssr/node_modules_23db4cf7._.js +17 -0
  108. package/.next/standalone/.next/server/chunks/ssr/node_modules_24381e95._.js +3 -0
  109. package/.next/standalone/.next/server/chunks/ssr/node_modules_24ca0eb6._.js +17 -0
  110. package/.next/standalone/.next/server/chunks/ssr/node_modules_27525793._.js +17 -0
  111. package/.next/standalone/.next/server/chunks/ssr/{node_modules_mermaid_dist_chunks_mermaid_core_4cfa6360._.js → node_modules_27c20382._.js} +2 -2
  112. package/.next/standalone/.next/server/chunks/ssr/node_modules_2c901b92._.js +3 -0
  113. package/.next/standalone/.next/server/chunks/ssr/node_modules_33b818b7._.js +45 -0
  114. package/.next/standalone/.next/server/chunks/ssr/node_modules_345d7791._.js +3 -0
  115. package/.next/standalone/.next/server/chunks/ssr/node_modules_36185c24._.js +45 -0
  116. package/.next/standalone/.next/server/chunks/ssr/node_modules_3ac7ce09._.js +3 -0
  117. package/.next/standalone/.next/server/chunks/ssr/node_modules_41b77cc7._.js +3 -0
  118. package/.next/standalone/.next/server/chunks/ssr/{node_modules_ed317ff6._.js → node_modules_42acd8db._.js} +2 -2
  119. package/.next/standalone/.next/server/chunks/ssr/node_modules_434aa5ec._.js +3 -0
  120. package/.next/standalone/.next/server/chunks/ssr/node_modules_54a9e72d._.js +17 -0
  121. package/.next/standalone/.next/server/chunks/ssr/node_modules_54f1273a._.js +26 -0
  122. package/.next/standalone/.next/server/chunks/ssr/node_modules_58d64491._.js +3 -0
  123. package/.next/standalone/.next/server/chunks/ssr/node_modules_5e012e3d._.js +3 -0
  124. package/.next/standalone/.next/server/chunks/ssr/node_modules_5ea9e4cf._.js +3 -0
  125. package/.next/standalone/.next/server/chunks/ssr/node_modules_5ecf8270._.js +26 -0
  126. package/.next/standalone/.next/server/chunks/ssr/node_modules_611c99b5._.js +1 -1
  127. package/.next/standalone/.next/server/chunks/ssr/{node_modules_d3-scale_src_e02ef77f._.js → node_modules_6629853d._.js} +2 -2
  128. package/.next/standalone/.next/server/chunks/ssr/node_modules_6fe2661c._.js +3 -0
  129. package/.next/standalone/.next/server/chunks/ssr/node_modules_7fe65a84._.js +3 -0
  130. package/.next/standalone/.next/server/chunks/ssr/node_modules_860f971a._.js +3 -0
  131. package/.next/standalone/.next/server/chunks/ssr/node_modules_882f3743._.js +3 -0
  132. package/.next/standalone/.next/server/chunks/ssr/node_modules_8e047938._.js +3 -0
  133. package/.next/standalone/.next/server/chunks/ssr/node_modules_9268cdc4._.js +3 -0
  134. package/.next/standalone/.next/server/chunks/ssr/node_modules_942541c9._.js +3 -0
  135. package/.next/standalone/.next/server/chunks/ssr/node_modules_9d52c0d6._.js +3 -0
  136. package/.next/standalone/.next/server/chunks/ssr/node_modules_@tanstack_query-core_build_modern_21ece5ea._.js +3 -0
  137. package/.next/standalone/.next/server/chunks/ssr/node_modules_ae6841d2._.js +17 -0
  138. package/.next/standalone/.next/server/chunks/ssr/node_modules_ba280bb0._.js +31 -0
  139. package/.next/standalone/.next/server/chunks/ssr/node_modules_bffdb8ec._.js +3 -0
  140. package/.next/standalone/.next/server/chunks/ssr/node_modules_c00f1821._.js +17 -0
  141. package/.next/standalone/.next/server/chunks/ssr/node_modules_c142ba86._.js +3 -0
  142. package/.next/standalone/.next/server/chunks/ssr/node_modules_d1a47cde._.js +17 -0
  143. package/.next/standalone/.next/server/chunks/ssr/node_modules_d9b454fe._.js +3 -0
  144. package/.next/standalone/.next/server/chunks/ssr/node_modules_dbe36b1d._.js +3 -0
  145. package/.next/standalone/.next/server/chunks/ssr/node_modules_ddbe26b7._.js +3 -0
  146. package/.next/standalone/.next/server/chunks/ssr/node_modules_e76b8bf2._.js +3 -0
  147. package/.next/standalone/.next/server/chunks/ssr/node_modules_e945b74d._.js +3 -0
  148. package/.next/standalone/.next/server/chunks/ssr/node_modules_fbd8a2ee._.js +17 -0
  149. package/.next/standalone/.next/server/chunks/ssr/node_modules_katex_dist_katex_mjs_31d456ba._.js +3 -0
  150. package/.next/standalone/.next/server/chunks/ssr/node_modules_katex_dist_katex_mjs_e1edc676._.js +3 -0
  151. package/.next/standalone/.next/server/chunks/ssr/node_modules_lodash-es_33e24dce._.js +3 -0
  152. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-QXUST7PY_mjs_159fba97._.js +1 -1
  153. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-S3R3BYOJ_mjs_dbeeb277._.js +1 -1
  154. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_mermaid_core_mjs_a11916de._.js +9 -0
  155. package/.next/standalone/.next/server/chunks/ssr/src_66a70595._.js +3 -0
  156. package/.next/standalone/.next/server/chunks/ssr/src_components_kanban-board_tsx_7b875e8e._.js +1 -1
  157. package/.next/standalone/.next/server/middleware-build-manifest.js +2 -2
  158. package/.next/standalone/.next/server/pages/404.html +1 -1
  159. package/.next/standalone/.next/server/pages/500.html +2 -2
  160. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  162. package/.next/standalone/AGENTS.md +13 -7
  163. package/.next/standalone/CONTRIBUTING.md +42 -26
  164. package/.next/standalone/README.md +166 -25
  165. package/.next/standalone/bin/devflow.js +12 -5
  166. package/.next/standalone/bun.lock +78 -24
  167. package/.next/standalone/devflow/project-config.json +4 -0
  168. package/.next/standalone/devflow/schemas/api-first/schema.yaml +39 -0
  169. package/.next/standalone/devflow/schemas/api-first/templates/api-design.md +41 -0
  170. package/.next/standalone/devflow/schemas/api-first/templates/db-design.md +28 -0
  171. package/.next/standalone/devflow/schemas/api-first/templates/final-architecture.md +31 -0
  172. package/.next/standalone/devflow/schemas/api-first/templates/proposal.md +22 -0
  173. package/.next/standalone/devflow/schemas/api-first/templates/tasks.md +16 -0
  174. package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/.approvals.json +1 -1
  175. package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/.meta.json +1 -1
  176. package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/design.md +11 -0
  177. package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/proposal.md +3 -0
  178. package/.next/standalone/devflow/specs/autodetect-skill-and-slash-command-installation/tasks.md +34 -2
  179. package/.next/standalone/devflow/specs/precommit/.approvals.json +26 -0
  180. package/.next/standalone/devflow/specs/precommit/.meta.json +7 -0
  181. package/.next/standalone/devflow/specs/precommit/design.md +105 -0
  182. package/.next/standalone/devflow/specs/precommit/proposal.md +43 -0
  183. package/.next/standalone/devflow/specs/precommit/specs.md +89 -0
  184. package/.next/standalone/devflow/specs/precommit/tasks.md +283 -0
  185. package/.next/standalone/docs/custom-schemas.md +117 -0
  186. package/.next/standalone/docs/local-dev-guide.md +73 -0
  187. package/.next/standalone/drizzle.config.ts +7 -7
  188. package/.next/standalone/eslint.config.mjs +2 -2
  189. package/.next/standalone/instrumentation.ts +3 -5
  190. package/.next/standalone/next.config.ts +11 -2
  191. package/.next/standalone/node_modules/{sharp → libsql}/node_modules/detect-libc/package.json +4 -8
  192. package/.next/standalone/package-lock.json +5257 -2085
  193. package/.next/standalone/package.json +16 -7
  194. package/.next/standalone/postcss.config.mjs +1 -1
  195. package/.next/standalone/scripts/init-db.js +3 -5
  196. package/.next/standalone/scripts/init-db.test.js +6 -6
  197. package/.next/standalone/scripts/init-schema.js +22 -22
  198. package/.next/standalone/scripts/init-schema.test.js +45 -45
  199. package/.next/standalone/scripts/install-environments.js +27 -8
  200. package/.next/standalone/scripts/install-environments.test.js +19 -10
  201. package/.next/standalone/scripts/install-skills.js +104 -31
  202. package/.next/standalone/scripts/install-skills.test.js +6 -6
  203. package/.next/standalone/server.js +1 -1
  204. package/.next/standalone/src/app/api/agents/route.ts +2 -2
  205. package/.next/standalone/src/app/api/projects/[id]/route.ts +10 -19
  206. package/.next/standalone/src/app/api/projects/route.ts +4 -10
  207. package/.next/standalone/src/app/api/specs/[name]/artifacts/[artifactType]/approve/route.ts +8 -8
  208. package/.next/standalone/src/app/api/specs/[name]/artifacts/[artifactType]/route.ts +14 -14
  209. package/.next/standalone/src/app/api/specs/[name]/promote/route.ts +17 -23
  210. package/.next/standalone/src/app/api/specs/[name]/route.ts +34 -36
  211. package/.next/standalone/src/app/api/specs/route.ts +10 -10
  212. package/.next/standalone/src/app/api/tasks/[id]/route.ts +11 -33
  213. package/.next/standalone/src/app/api/tasks/route.ts +3 -6
  214. package/.next/standalone/src/app/globals.css +3 -3
  215. package/.next/standalone/src/app/layout.tsx +9 -5
  216. package/.next/standalone/src/app/page.tsx +1 -1
  217. package/.next/standalone/src/app/specs/[name]/page.tsx +26 -68
  218. package/.next/standalone/src/components/kanban-board.tsx +78 -157
  219. package/.next/standalone/src/components/kanban-column.tsx +10 -12
  220. package/.next/standalone/src/components/markdown-preview.tsx +36 -19
  221. package/.next/standalone/src/components/providers.tsx +20 -0
  222. package/.next/standalone/src/components/specs/artifact-dag-status.tsx +12 -14
  223. package/.next/standalone/src/components/specs/artifact-editor.tsx +55 -26
  224. package/.next/standalone/src/components/specs/spec-detail.tsx +48 -40
  225. package/.next/standalone/src/components/specs/spec-kanban-column.tsx +49 -68
  226. package/.next/standalone/src/components/specs/spec-modal.tsx +119 -83
  227. package/.next/standalone/src/components/task-card.tsx +34 -38
  228. package/.next/standalone/src/components/task-dialog.tsx +16 -31
  229. package/.next/standalone/src/components/ui/badge.tsx +12 -18
  230. package/.next/standalone/src/components/ui/button.tsx +23 -28
  231. package/.next/standalone/src/components/ui/card.tsx +42 -62
  232. package/.next/standalone/src/components/ui/dialog.tsx +17 -35
  233. package/.next/standalone/src/db/index.ts +10 -10
  234. package/.next/standalone/src/db/schema.ts +37 -37
  235. package/.next/standalone/src/hooks/use-queries.ts +81 -0
  236. package/.next/standalone/src/hooks/use-websocket.ts +74 -0
  237. package/.next/standalone/src/lib/schema.test.ts +37 -37
  238. package/.next/standalone/src/lib/schema.ts +77 -31
  239. package/.next/standalone/src/lib/specs-dir.ts +8 -8
  240. package/.next/standalone/src/lib/specs.ts +98 -92
  241. package/.next/standalone/src/lib/utils.ts +2 -2
  242. package/.next/standalone/src/mcp/server.ts +556 -349
  243. package/.next/standalone/src/mcp/websocket.ts +26 -23
  244. package/.next/standalone/src/schemas/backend-api/templates/proposal.md +6 -4
  245. package/.next/standalone/src/schemas/backend-api/templates/tasks.md +6 -0
  246. package/.next/standalone/src/schemas/data-engineering/templates/proposal.md +6 -4
  247. package/.next/standalone/src/schemas/data-engineering/templates/tasks.md +6 -0
  248. package/.next/standalone/src/schemas/devops-platform/templates/proposal.md +6 -4
  249. package/.next/standalone/src/schemas/devops-platform/templates/tasks.md +6 -0
  250. package/.next/standalone/src/schemas/frontend-product/templates/proposal.md +6 -4
  251. package/.next/standalone/src/schemas/frontend-product/templates/tasks.md +6 -0
  252. package/.next/standalone/src/schemas/spec-driven/templates/proposal.md +6 -4
  253. package/.next/standalone/src/schemas/spec-driven/templates/tasks.md +26 -0
  254. package/.next/standalone/src/websocket/server.ts +20 -18
  255. package/.next/standalone/tsconfig.json +3 -12
  256. package/.next/standalone/tsconfig.tsbuildinfo +1 -1
  257. package/.next/static/chunks/4f23f64d46848f57.js +1 -0
  258. package/.next/static/chunks/53081dcdcad4f31e.js +1 -0
  259. package/.next/static/chunks/{6a3d582315f1c214.js → 701cfcbb41e0ab47.js} +1 -1
  260. package/.next/static/chunks/ac4b6b4d5b7e486e.css +1 -0
  261. package/.next/static/chunks/d0309ea872db5d9f.js +1 -0
  262. package/.next/static/chunks/d4cf8893a018e965.js +1 -0
  263. package/.next/static/chunks/e6c0233269a4bd69.js +13 -0
  264. package/.next/static/chunks/{7e65cfa9841f66a5.js → e7d83ce855afe416.js} +2 -2
  265. package/.next/static/chunks/ee7035560fc9e5e9.js +1 -0
  266. package/.next/static/chunks/{turbopack-f4d3806ab575051d.js → turbopack-8b3b66a22a5e0fb4.js} +2 -2
  267. package/README.md +166 -25
  268. package/bin/devflow.js +12 -5
  269. package/drizzle.config.ts +7 -7
  270. package/next.config.ts +11 -2
  271. package/package.json +16 -7
  272. package/scripts/init-db.js +3 -5
  273. package/scripts/init-db.test.js +6 -6
  274. package/scripts/init-schema.js +22 -22
  275. package/scripts/init-schema.test.js +45 -45
  276. package/scripts/install-environments.js +27 -8
  277. package/scripts/install-environments.test.js +19 -10
  278. package/scripts/install-skills.js +104 -31
  279. package/scripts/install-skills.test.js +6 -6
  280. package/src/app/api/agents/route.ts +2 -2
  281. package/src/app/api/projects/[id]/route.ts +10 -19
  282. package/src/app/api/projects/route.ts +4 -10
  283. package/src/app/api/specs/[name]/artifacts/[artifactType]/approve/route.ts +8 -8
  284. package/src/app/api/specs/[name]/artifacts/[artifactType]/route.ts +14 -14
  285. package/src/app/api/specs/[name]/promote/route.ts +17 -23
  286. package/src/app/api/specs/[name]/route.ts +34 -36
  287. package/src/app/api/specs/route.ts +10 -10
  288. package/src/app/api/tasks/[id]/route.ts +11 -33
  289. package/src/app/api/tasks/route.ts +3 -6
  290. package/src/app/globals.css +3 -3
  291. package/src/app/layout.tsx +9 -5
  292. package/src/app/page.tsx +1 -1
  293. package/src/app/specs/[name]/page.tsx +26 -68
  294. package/src/components/kanban-board.tsx +78 -157
  295. package/src/components/kanban-column.tsx +10 -12
  296. package/src/components/markdown-preview.tsx +36 -19
  297. package/src/components/providers.tsx +20 -0
  298. package/src/components/specs/artifact-dag-status.tsx +12 -14
  299. package/src/components/specs/artifact-editor.tsx +55 -26
  300. package/src/components/specs/spec-detail.tsx +48 -40
  301. package/src/components/specs/spec-kanban-column.tsx +49 -68
  302. package/src/components/specs/spec-modal.tsx +119 -83
  303. package/src/components/task-card.tsx +34 -38
  304. package/src/components/task-dialog.tsx +16 -31
  305. package/src/components/ui/badge.tsx +12 -18
  306. package/src/components/ui/button.tsx +23 -28
  307. package/src/components/ui/card.tsx +42 -62
  308. package/src/components/ui/dialog.tsx +17 -35
  309. package/src/db/index.ts +10 -10
  310. package/src/db/schema.ts +37 -37
  311. package/src/hooks/use-queries.ts +81 -0
  312. package/src/hooks/use-websocket.ts +74 -0
  313. package/src/lib/schema.test.ts +37 -37
  314. package/src/lib/schema.ts +77 -31
  315. package/src/lib/specs-dir.ts +8 -8
  316. package/src/lib/specs.ts +98 -92
  317. package/src/lib/utils.ts +2 -2
  318. package/src/mcp/server.ts +556 -349
  319. package/src/mcp/websocket.ts +26 -23
  320. package/src/schemas/backend-api/templates/proposal.md +6 -4
  321. package/src/schemas/backend-api/templates/tasks.md +6 -0
  322. package/src/schemas/data-engineering/templates/proposal.md +6 -4
  323. package/src/schemas/data-engineering/templates/tasks.md +6 -0
  324. package/src/schemas/devops-platform/templates/proposal.md +6 -4
  325. package/src/schemas/devops-platform/templates/tasks.md +6 -0
  326. package/src/schemas/frontend-product/templates/proposal.md +6 -4
  327. package/src/schemas/frontend-product/templates/tasks.md +6 -0
  328. package/src/schemas/spec-driven/templates/proposal.md +6 -4
  329. package/src/schemas/spec-driven/templates/tasks.md +26 -0
  330. package/src/types/bun-sqlite.d.ts +1 -1
  331. package/src/websocket/server.ts +20 -18
  332. package/tsconfig.json +3 -12
  333. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1be4e4b6._.js +0 -3
  334. package/.next/standalone/.next/server/chunks/[root-of-the-server]__492a4a24._.js +0 -3
  335. package/.next/standalone/.next/server/chunks/[root-of-the-server]__67c59ae1._.js +0 -3
  336. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6cc7aecd._.js +0 -3
  337. package/.next/standalone/.next/server/chunks/[root-of-the-server]__83a77b07._.js +0 -3
  338. package/.next/standalone/.next/server/chunks/[root-of-the-server]__88d91cb5._.js +0 -3
  339. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9e095e8._.js +0 -3
  340. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b367d327._.js +0 -3
  341. package/.next/standalone/.next/server/chunks/[root-of-the-server]__eb413bbc._.js +0 -3
  342. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0b8c072a._.js +0 -3
  343. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12b2191f._.js +0 -3
  344. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__15316462._.js +0 -3
  345. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__19c9c409._.js +0 -3
  346. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__19e5e22f._.js +0 -3
  347. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__25b5ccb3._.js +0 -3
  348. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__2f78c3da._.js +0 -3
  349. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3160b3f4._.js +0 -9
  350. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__319559be._.js +0 -3
  351. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__34f7cbcb._.js +0 -31
  352. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3abab94b._.js +0 -3
  353. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3b3d8930._.js +0 -3
  354. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4250799b._.js +0 -3
  355. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4c29cbc3._.js +0 -26
  356. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4e0bb6eb._.js +0 -9
  357. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__5678d2e3._.js +0 -3
  358. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__673445e0._.js +0 -31
  359. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__934de06b._.js +0 -3
  360. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__9b6c6f09._.js +0 -3
  361. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a1b83a98._.js +0 -3
  362. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__b00a15c5._.js +0 -3
  363. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__b8567be3._.js +0 -26
  364. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ce64536e._.js +0 -45
  365. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__e96d33d2._.js +0 -45
  366. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__fd7ec054._.js +0 -3
  367. package/.next/standalone/.next/server/chunks/ssr/node_modules_16a3f9e7._.js +0 -17
  368. package/.next/standalone/.next/server/chunks/ssr/node_modules_45bce0e1._.js +0 -3
  369. package/.next/standalone/.next/server/chunks/ssr/node_modules_5e5a372d._.js +0 -17
  370. package/.next/standalone/.next/server/chunks/ssr/node_modules_6ece6f1e._.js +0 -3
  371. package/.next/standalone/.next/server/chunks/ssr/node_modules_d173e749._.js +0 -3
  372. package/.next/standalone/.next/server/chunks/ssr/node_modules_d3-shape_src_arc_fb1ac087.js +0 -3
  373. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_1f73a830._.js +0 -3
  374. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_663ac803._.js +0 -3
  375. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-FMBD7UC4_mjs_4f485529._.js +0 -17
  376. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-TZMSLE5B_mjs_8436a62a._.js +0 -3
  377. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_f78d2dc4._.js +0 -3
  378. package/.next/standalone/.next/server/chunks/ssr/src_app_layout_tsx_cc8184fa._.js +0 -3
  379. package/.next/standalone/devflow/specs/add-default-schema-template-selection/.approvals.json +0 -26
  380. package/.next/standalone/devflow/specs/add-default-schema-template-selection/.meta.json +0 -8
  381. package/.next/standalone/devflow/specs/add-default-schema-template-selection/design.md +0 -126
  382. package/.next/standalone/devflow/specs/add-default-schema-template-selection/proposal.md +0 -65
  383. package/.next/standalone/devflow/specs/add-default-schema-template-selection/specs.md +0 -107
  384. package/.next/standalone/devflow/specs/add-default-schema-template-selection/tasks.md +0 -235
  385. package/.next/standalone/devflow/specs/test-no-project/.approvals.json +0 -17
  386. package/.next/standalone/devflow/specs/test-no-project/.meta.json +0 -6
  387. package/.next/standalone/devflow/specs/ui-cleanup/.approvals.json +0 -29
  388. package/.next/standalone/devflow/specs/ui-cleanup/.meta.json +0 -6
  389. package/.next/standalone/devflow/specs/ui-cleanup/design.md +0 -49
  390. package/.next/standalone/devflow/specs/ui-cleanup/proposal.md +0 -34
  391. package/.next/standalone/devflow/specs/ui-cleanup/specs.md +0 -55
  392. package/.next/standalone/devflow/specs/ui-cleanup/tasks.md +0 -28
  393. package/.next/standalone/node_modules/@img/colour/color.cjs +0 -1594
  394. package/.next/standalone/node_modules/@img/colour/index.cjs +0 -1
  395. package/.next/standalone/node_modules/@img/colour/package.json +0 -45
  396. package/.next/standalone/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
  397. package/.next/standalone/node_modules/@img/sharp-darwin-arm64/package.json +0 -40
  398. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/README.md +0 -46
  399. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/glib-2.0/include/glibconfig.h +0 -220
  400. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/index.js +0 -1
  401. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib +0 -0
  402. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/package.json +0 -36
  403. package/.next/standalone/node_modules/@img/sharp-libvips-darwin-arm64/versions.json +0 -30
  404. package/.next/standalone/node_modules/buffer-from/index.js +0 -72
  405. package/.next/standalone/node_modules/buffer-from/package.json +0 -19
  406. package/.next/standalone/node_modules/sharp/lib/channel.js +0 -177
  407. package/.next/standalone/node_modules/sharp/lib/colour.js +0 -195
  408. package/.next/standalone/node_modules/sharp/lib/composite.js +0 -212
  409. package/.next/standalone/node_modules/sharp/lib/constructor.js +0 -499
  410. package/.next/standalone/node_modules/sharp/lib/index.js +0 -16
  411. package/.next/standalone/node_modules/sharp/lib/input.js +0 -809
  412. package/.next/standalone/node_modules/sharp/lib/is.js +0 -143
  413. package/.next/standalone/node_modules/sharp/lib/libvips.js +0 -207
  414. package/.next/standalone/node_modules/sharp/lib/operation.js +0 -1016
  415. package/.next/standalone/node_modules/sharp/lib/output.js +0 -1666
  416. package/.next/standalone/node_modules/sharp/lib/resize.js +0 -595
  417. package/.next/standalone/node_modules/sharp/lib/sharp.js +0 -121
  418. package/.next/standalone/node_modules/sharp/lib/utility.js +0 -291
  419. package/.next/standalone/node_modules/sharp/node_modules/detect-libc/lib/detect-libc.js +0 -313
  420. package/.next/standalone/node_modules/sharp/node_modules/detect-libc/lib/elf.js +0 -39
  421. package/.next/standalone/node_modules/sharp/node_modules/detect-libc/lib/filesystem.js +0 -51
  422. package/.next/standalone/node_modules/sharp/node_modules/detect-libc/lib/process.js +0 -24
  423. package/.next/standalone/node_modules/sharp/node_modules/semver/classes/comparator.js +0 -143
  424. package/.next/standalone/node_modules/sharp/node_modules/semver/classes/range.js +0 -557
  425. package/.next/standalone/node_modules/sharp/node_modules/semver/classes/semver.js +0 -333
  426. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/cmp.js +0 -54
  427. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/coerce.js +0 -62
  428. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/compare.js +0 -7
  429. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/eq.js +0 -5
  430. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gt.js +0 -5
  431. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gte.js +0 -5
  432. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lt.js +0 -5
  433. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lte.js +0 -5
  434. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/neq.js +0 -5
  435. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/parse.js +0 -18
  436. package/.next/standalone/node_modules/sharp/node_modules/semver/functions/satisfies.js +0 -12
  437. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/constants.js +0 -37
  438. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/debug.js +0 -11
  439. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/identifiers.js +0 -29
  440. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/lrucache.js +0 -42
  441. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/parse-options.js +0 -17
  442. package/.next/standalone/node_modules/sharp/node_modules/semver/internal/re.js +0 -223
  443. package/.next/standalone/node_modules/sharp/node_modules/semver/package.json +0 -78
  444. package/.next/standalone/node_modules/sharp/package.json +0 -202
  445. package/.next/standalone/node_modules/source-map/lib/array-set.js +0 -121
  446. package/.next/standalone/node_modules/source-map/lib/base64-vlq.js +0 -140
  447. package/.next/standalone/node_modules/source-map/lib/base64.js +0 -67
  448. package/.next/standalone/node_modules/source-map/lib/binary-search.js +0 -111
  449. package/.next/standalone/node_modules/source-map/lib/mapping-list.js +0 -79
  450. package/.next/standalone/node_modules/source-map/lib/quick-sort.js +0 -114
  451. package/.next/standalone/node_modules/source-map/lib/source-map-consumer.js +0 -1145
  452. package/.next/standalone/node_modules/source-map/lib/source-map-generator.js +0 -425
  453. package/.next/standalone/node_modules/source-map/lib/source-node.js +0 -413
  454. package/.next/standalone/node_modules/source-map/lib/util.js +0 -488
  455. package/.next/standalone/node_modules/source-map/package.json +0 -73
  456. package/.next/standalone/node_modules/source-map/source-map.js +0 -8
  457. package/.next/standalone/node_modules/source-map-support/LICENSE.md +0 -21
  458. package/.next/standalone/node_modules/source-map-support/README.md +0 -284
  459. package/.next/standalone/node_modules/source-map-support/browser-source-map-support.js +0 -114
  460. package/.next/standalone/node_modules/source-map-support/package.json +0 -31
  461. package/.next/standalone/node_modules/source-map-support/register-hook-require.js +0 -1
  462. package/.next/standalone/node_modules/source-map-support/register.js +0 -1
  463. package/.next/standalone/node_modules/source-map-support/source-map-support.js +0 -625
  464. package/.next/standalone/node_modules/typescript/lib/_tsc.js +0 -133818
  465. package/.next/standalone/node_modules/typescript/lib/_tsserver.js +0 -659
  466. package/.next/standalone/node_modules/typescript/lib/_typingsInstaller.js +0 -222
  467. package/.next/standalone/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +0 -2122
  468. package/.next/standalone/node_modules/typescript/lib/de/diagnosticMessages.generated.json +0 -2122
  469. package/.next/standalone/node_modules/typescript/lib/es/diagnosticMessages.generated.json +0 -2122
  470. package/.next/standalone/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +0 -2122
  471. package/.next/standalone/node_modules/typescript/lib/it/diagnosticMessages.generated.json +0 -2122
  472. package/.next/standalone/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +0 -2122
  473. package/.next/standalone/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +0 -2122
  474. package/.next/standalone/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +0 -2122
  475. package/.next/standalone/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +0 -2122
  476. package/.next/standalone/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +0 -2122
  477. package/.next/standalone/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +0 -2122
  478. package/.next/standalone/node_modules/typescript/lib/tsc.js +0 -8
  479. package/.next/standalone/node_modules/typescript/lib/tsserver.js +0 -8
  480. package/.next/standalone/node_modules/typescript/lib/tsserverlibrary.js +0 -21
  481. package/.next/standalone/node_modules/typescript/lib/typesMap.json +0 -497
  482. package/.next/standalone/node_modules/typescript/lib/typescript.js +0 -200276
  483. package/.next/standalone/node_modules/typescript/lib/typingsInstaller.js +0 -8
  484. package/.next/standalone/node_modules/typescript/lib/watchGuard.js +0 -53
  485. package/.next/standalone/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +0 -2122
  486. package/.next/standalone/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +0 -2122
  487. package/.next/standalone/node_modules/typescript/package.json +0 -120
  488. package/.next/standalone/src/components/ui/collapsible.tsx +0 -12
  489. package/.next/standalone/src/components/ui/sheet.tsx +0 -130
  490. package/.next/standalone/src/components/ui/tabs.tsx +0 -58
  491. package/.next/static/chunks/0177331b8adf7346.js +0 -7
  492. package/.next/static/chunks/06af74e2f3e207c5.js +0 -7
  493. package/.next/static/chunks/1748d5cd2443723b.css +0 -1
  494. package/.next/static/chunks/7ae917cb100be2b9.js +0 -7
  495. package/.next/static/chunks/7c4b901b394c3a8c.js +0 -7
  496. package/src/components/ui/collapsible.tsx +0 -12
  497. package/src/components/ui/sheet.tsx +0 -130
  498. package/src/components/ui/tabs.tsx +0 -58
  499. /package/.next/standalone/node_modules/{detect-libc → libsql/node_modules/detect-libc}/lib/detect-libc.js +0 -0
  500. /package/.next/standalone/node_modules/{detect-libc → libsql/node_modules/detect-libc}/lib/filesystem.js +0 -0
  501. /package/.next/standalone/node_modules/{detect-libc → libsql/node_modules/detect-libc}/lib/process.js +0 -0
  502. /package/.next/static/{5YFrdIQd1UU2IxLxekrU9 → Ql6qo0GYLL23WRu6ec4N5}/_buildManifest.js +0 -0
  503. /package/.next/static/{5YFrdIQd1UU2IxLxekrU9 → Ql6qo0GYLL23WRu6ec4N5}/_clientMiddlewareManifest.json +0 -0
  504. /package/.next/static/{5YFrdIQd1UU2IxLxekrU9 → Ql6qo0GYLL23WRu6ec4N5}/_ssgManifest.js +0 -0
@@ -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/6a3d582315f1c214.js",
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-f4d3806ab575051d.js"
15
+ "static/chunks/turbopack-8b3b66a22a5e0fb4.js"
16
16
  ]
17
17
  };
18
18
  globalThis.__BUILD_MANIFEST.lowPriorityFiles = [
@@ -1 +1 @@
1
- <!DOCTYPE html><!--5YFrdIQd1UU2IxLxekrU9--><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/1748d5cd2443723b.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/6a3d582315f1c214.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-f4d3806ab575051d.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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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/6a3d582315f1c214.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:HL[\"/_next/static/chunks/1748d5cd2443723b.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"5YFrdIQd1UU2IxLxekrU9\",\"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/1748d5cd2443723b.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",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,[\"$\",\"$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\":[[[\"$\",\"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: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: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: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:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$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:[[\"$\",\"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\"}],[\"$\",\"$Lc\",\"3\",{}]]\n"])</script></body></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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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><!--5YFrdIQd1UU2IxLxekrU9--><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/6a3d582315f1c214.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-f4d3806ab575051d.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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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/6a3d582315f1c214.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\":\"5YFrdIQd1UU2IxLxekrU9\",\"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
+ <!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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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\": \"lstxKUHDl6+HjMIS28TafRd5blj8hk4m8q4AEVDyb1Y=\"\n}"
1
+ self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"tgHD+6NRmMcL5+La3uQltK12rpt4uIkpWu+9O8XbqcE=\"\n}"
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "node": {},
3
3
  "edge": {},
4
- "encryptionKey": "lstxKUHDl6+HjMIS28TafRd5blj8hk4m8q4AEVDyb1Y="
4
+ "encryptionKey": "tgHD+6NRmMcL5+La3uQltK12rpt4uIkpWu+9O8XbqcE="
5
5
  }
@@ -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 | `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` |
124
- | Tasks | `list_tasks`, `get_task`, `create_task`, `create_tasks_bulk`, `update_task` |
125
- | Agent | `check_in`, `check_out`, `log_activity`, `get_activity_log` |
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
- bun install
51
- bun typecheck
52
- bun lint
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
- bun install
95
+ npm install
94
96
 
95
97
  # Initialize database
96
- bun run db:init
98
+ npm run db:init
97
99
 
98
100
  # Start development
99
- bun dev # Web UI
100
- bun run mcp # MCP server
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
- └── lib/ # Utility functions
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
- └── docs/ # Documentation
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
- "use client";
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
- bun dev
236
+ npm run dev
222
237
  ```
223
- - Create projects, features, tasks
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
- bun run mcp
246
+ npm run mcp
230
247
  ```
231
- - Use Claude Desktop or Cursor
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
- bun run db:generate
294
+ npm run db:generate
276
295
 
277
296
  # 3. Test migration
278
297
  rm ~/.devflow/devflow.db
279
- bun run db:init
280
-
281
- # 4. Verify schema
282
- bun run db:studio
298
+ npm run db:init
283
299
  ```
284
300
 
285
301
  ### Migration Guidelines