claude-code-workflow 6.3.32 → 6.3.34

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 (476) hide show
  1. package/.claude/CLAUDE.md +6 -1
  2. package/.claude/agents/action-planning-agent.md +885 -885
  3. package/.claude/agents/cli-discuss-agent.md +391 -391
  4. package/.claude/agents/cli-execution-agent.md +7 -6
  5. package/.claude/agents/cli-lite-planning-agent.md +1 -1
  6. package/.claude/agents/cli-planning-agent.md +2 -2
  7. package/.claude/agents/code-developer.md +407 -403
  8. package/.claude/agents/conceptual-planning-agent.md +11 -0
  9. package/.claude/agents/debug-explore-agent.md +3 -3
  10. package/.claude/agents/doc-generator.md +3 -3
  11. package/.claude/agents/issue-plan-agent.md +333 -340
  12. package/.claude/agents/issue-queue-agent.md +1 -1
  13. package/.claude/agents/memory-bridge.md +95 -95
  14. package/.claude/agents/test-context-search-agent.md +402 -402
  15. package/.claude/agents/ui-design-agent.md +595 -595
  16. package/.claude/agents/universal-executor.md +134 -134
  17. package/.claude/commands/cli/codex-review.md +355 -0
  18. package/.claude/commands/issue/discover-by-prompt.md +1 -1
  19. package/.claude/commands/issue/execute.md +581 -581
  20. package/.claude/commands/issue/new.md +413 -413
  21. package/.claude/commands/issue/plan.md +1 -1
  22. package/.claude/commands/issue/queue.md +441 -382
  23. package/.claude/commands/memory/code-map-memory.md +687 -687
  24. package/.claude/commands/memory/compact.md +383 -383
  25. package/.claude/commands/memory/docs-full-cli.md +471 -471
  26. package/.claude/commands/memory/docs-related-cli.md +386 -386
  27. package/.claude/commands/memory/docs.md +615 -615
  28. package/.claude/commands/memory/load-skill-memory.md +182 -182
  29. package/.claude/commands/memory/skill-memory.md +525 -525
  30. package/.claude/commands/memory/style-skill-memory.md +396 -396
  31. package/.claude/commands/memory/swagger-docs.md +773 -773
  32. package/.claude/commands/memory/tech-research-rules.md +2 -2
  33. package/.claude/commands/memory/update-full.md +332 -332
  34. package/.claude/commands/memory/workflow-skill-memory.md +517 -517
  35. package/.claude/commands/task/create.md +151 -151
  36. package/.claude/commands/task/replan.md +436 -436
  37. package/.claude/commands/version.md +254 -254
  38. package/.claude/commands/workflow/brainstorm/api-designer.md +587 -587
  39. package/.claude/commands/workflow/brainstorm/auto-parallel.md +11 -0
  40. package/.claude/commands/workflow/brainstorm/data-architect.md +220 -220
  41. package/.claude/commands/workflow/brainstorm/product-manager.md +200 -200
  42. package/.claude/commands/workflow/brainstorm/product-owner.md +200 -200
  43. package/.claude/commands/workflow/brainstorm/scrum-master.md +200 -200
  44. package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
  45. package/.claude/commands/workflow/brainstorm/system-architect.md +389 -389
  46. package/.claude/commands/workflow/brainstorm/ui-designer.md +221 -221
  47. package/.claude/commands/workflow/brainstorm/ux-expert.md +221 -221
  48. package/.claude/commands/workflow/debug-with-file.md +666 -0
  49. package/.claude/commands/workflow/debug.md +327 -327
  50. package/.claude/commands/workflow/execute.md +498 -498
  51. package/.claude/commands/workflow/lite-execute.md +23 -20
  52. package/.claude/commands/workflow/lite-fix.md +631 -631
  53. package/.claude/commands/workflow/lite-lite-lite.md +39 -11
  54. package/.claude/commands/workflow/lite-plan.md +4 -2
  55. package/.claude/commands/workflow/multi-cli-plan.md +97 -39
  56. package/.claude/commands/workflow/plan.md +551 -551
  57. package/.claude/commands/workflow/replan.md +515 -515
  58. package/.claude/commands/workflow/review-fix.md +610 -610
  59. package/.claude/commands/workflow/review-module-cycle.md +771 -771
  60. package/.claude/commands/workflow/review-session-cycle.md +782 -782
  61. package/.claude/commands/workflow/review.md +322 -322
  62. package/.claude/commands/workflow/session/list.md +95 -95
  63. package/.claude/commands/workflow/session/resume.md +60 -60
  64. package/.claude/commands/workflow/session/solidify.md +299 -299
  65. package/.claude/commands/workflow/tdd-plan.md +597 -460
  66. package/.claude/commands/workflow/test-cycle-execute.md +504 -504
  67. package/.claude/commands/workflow/test-fix-gen.md +699 -699
  68. package/.claude/commands/workflow/tools/conflict-resolution.md +2 -2
  69. package/.claude/commands/workflow/tools/task-generate-tdd.md +517 -517
  70. package/.claude/commands/workflow/tools/tdd-coverage-analysis.md +309 -309
  71. package/.claude/commands/workflow/tools/test-concept-enhanced.md +1 -1
  72. package/.claude/commands/workflow/tools/test-context-gather.md +235 -235
  73. package/.claude/commands/workflow/tools/test-task-generate.md +255 -255
  74. package/.claude/commands/workflow/ui-design/animation-extract.md +1150 -1150
  75. package/.claude/commands/workflow/ui-design/design-sync.md +454 -454
  76. package/.claude/commands/workflow/ui-design/explore-auto.md +678 -678
  77. package/.claude/commands/workflow/ui-design/imitate-auto.md +745 -745
  78. package/.claude/commands/workflow/ui-design/layout-extract.md +788 -788
  79. package/.claude/commands/workflow/ui-design/reference-page-generator.md +356 -356
  80. package/.claude/commands/workflow/ui-design/style-extract.md +773 -773
  81. package/.claude/skills/ccw/SKILL.md +522 -352
  82. package/.claude/skills/ccw/command.json +641 -547
  83. package/.claude/skills/ccw-help/SKILL.md +116 -116
  84. package/.claude/skills/ccw-help/command.json +520 -520
  85. package/.claude/skills/copyright-docs/phases/01.5-project-exploration.md +150 -150
  86. package/.claude/skills/copyright-docs/phases/02.5-consolidation.md +192 -192
  87. package/.claude/skills/copyright-docs/templates/agent-base.md +200 -200
  88. package/.claude/skills/project-analyze/phases/03.5-consolidation.md +233 -233
  89. package/.claude/skills/project-analyze/specs/writing-style.md +152 -152
  90. package/.claude/skills/review-code/phases/state-manager.md +752 -752
  91. package/.claude/skills/review-code/specs/rules/index.md +140 -140
  92. package/.claude/skills/skill-generator/specs/cli-integration.md +13 -19
  93. package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -265
  94. package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -503
  95. package/.claude/skills/skill-generator/templates/llm-action.md +355 -355
  96. package/.claude/skills/skill-generator/templates/script-bash.md +277 -277
  97. package/.claude/skills/skill-generator/templates/script-python.md +198 -198
  98. package/.claude/skills/skill-generator/templates/skill-md.md +235 -235
  99. package/.claude/skills/skill-tuning/SKILL.md +303 -303
  100. package/.claude/skills/skill-tuning/phases/actions/action-abort.md +164 -164
  101. package/.claude/skills/skill-tuning/phases/actions/action-apply-fix.md +206 -206
  102. package/.claude/skills/skill-tuning/phases/actions/action-complete.md +195 -195
  103. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-agent.md +317 -317
  104. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-context.md +243 -243
  105. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-dataflow.md +318 -318
  106. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-memory.md +269 -269
  107. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-token-consumption.md +200 -200
  108. package/.claude/skills/skill-tuning/phases/actions/action-gemini-analysis.md +322 -322
  109. package/.claude/skills/skill-tuning/phases/actions/action-generate-report.md +228 -228
  110. package/.claude/skills/skill-tuning/phases/actions/action-init.md +149 -149
  111. package/.claude/skills/skill-tuning/phases/actions/action-propose-fixes.md +317 -317
  112. package/.claude/skills/skill-tuning/phases/actions/action-verify.md +222 -222
  113. package/.claude/skills/skill-tuning/phases/orchestrator.md +377 -377
  114. package/.claude/skills/skill-tuning/phases/state-schema.md +378 -378
  115. package/.claude/skills/skill-tuning/specs/problem-taxonomy.md +318 -318
  116. package/.claude/skills/skill-tuning/specs/quality-gates.md +263 -263
  117. package/.claude/skills/skill-tuning/specs/tuning-strategies.md +1537 -1537
  118. package/.claude/skills/skill-tuning/templates/diagnosis-report.md +153 -153
  119. package/.claude/skills/skill-tuning/templates/fix-proposal.md +204 -204
  120. package/.claude/skills/software-manual/SKILL.md +184 -184
  121. package/.claude/skills/software-manual/phases/01-requirements-discovery.md +162 -162
  122. package/.claude/skills/software-manual/phases/02-project-exploration.md +101 -101
  123. package/.claude/skills/software-manual/phases/03-parallel-analysis.md +183 -183
  124. package/.claude/skills/software-manual/phases/03.5-consolidation.md +82 -82
  125. package/.claude/skills/software-manual/phases/04-screenshot-capture.md +89 -89
  126. package/.claude/skills/software-manual/phases/05-html-assembly.md +132 -132
  127. package/.claude/skills/software-manual/phases/06-iterative-refinement.md +259 -259
  128. package/.claude/skills/software-manual/scripts/screenshot-helper.md +447 -447
  129. package/.claude/skills/software-manual/scripts/swagger-runner.md +419 -419
  130. package/.claude/skills/software-manual/scripts/typedoc-runner.md +357 -357
  131. package/.claude/skills/software-manual/specs/html-template.md +325 -325
  132. package/.claude/skills/software-manual/specs/quality-standards.md +253 -253
  133. package/.claude/skills/software-manual/specs/writing-style.md +298 -298
  134. package/.claude/skills/text-formatter/SKILL.md +196 -196
  135. package/.claude/skills/text-formatter/phases/01-input-collection.md +111 -111
  136. package/.claude/skills/text-formatter/phases/02-content-analysis.md +248 -248
  137. package/.claude/skills/text-formatter/phases/03-format-transform.md +245 -245
  138. package/.claude/skills/text-formatter/phases/04-output-preview.md +183 -183
  139. package/.claude/skills/text-formatter/specs/callout-types.md +293 -293
  140. package/.claude/skills/text-formatter/specs/element-mapping.md +226 -226
  141. package/.claude/skills/text-formatter/specs/format-rules.md +273 -273
  142. package/.claude/skills/text-formatter/templates/bbcode-template.md +350 -350
  143. package/.claude/workflows/chinese-response.md +25 -25
  144. package/.claude/workflows/cli-templates/memory/style-skill-memory/skill-md-template.md +299 -299
  145. package/.claude/workflows/cli-templates/planning-roles/product-owner.md +261 -261
  146. package/.claude/workflows/cli-templates/prompts/{analysis/03-analyze-performance.txt → analysis-analyze-performance.txt} +29 -29
  147. package/.claude/workflows/cli-templates/prompts/{analysis/03-assess-security-risks.txt → analysis-assess-security-risks.txt} +29 -29
  148. package/.claude/workflows/cli-templates/prompts/{analysis/02-review-architecture.txt → analysis-review-architecture.txt} +29 -29
  149. package/.claude/workflows/cli-templates/prompts/{analysis/02-review-code-quality.txt → analysis-review-code-quality.txt} +28 -28
  150. package/.claude/workflows/cli-templates/prompts/{analysis/03-review-quality-standards.txt → analysis-review-quality-standards.txt} +29 -29
  151. package/.claude/workflows/cli-templates/prompts/{analysis/01-trace-code-execution.txt → analysis-trace-code-execution.txt} +115 -115
  152. package/.claude/workflows/cli-templates/prompts/{documentation/api.txt → documentation-api.txt} +14 -14
  153. package/.claude/workflows/cli-templates/prompts/{documentation/folder-navigation.txt → documentation-folder-navigation.txt} +26 -26
  154. package/.claude/workflows/cli-templates/prompts/{documentation/project-architecture.txt → documentation-project-architecture.txt} +40 -40
  155. package/.claude/workflows/cli-templates/prompts/{documentation/project-examples.txt → documentation-project-examples.txt} +34 -34
  156. package/.claude/workflows/cli-templates/prompts/{documentation/project-readme.txt → documentation-project-readme.txt} +34 -34
  157. package/.claude/workflows/cli-templates/prompts/{documentation/swagger-api.txt → documentation-swagger-api.txt} +266 -266
  158. package/.claude/workflows/cli-templates/prompts/{planning/02-design-component-spec.txt → planning-design-component-spec.txt} +28 -28
  159. package/.claude/workflows/cli-templates/prompts/{verification/codex-technical.txt → verification-codex-technical.txt} +28 -28
  160. package/.claude/workflows/cli-templates/prompts/{verification/cross-validation.txt → verification-cross-validation.txt} +28 -28
  161. package/.claude/workflows/cli-templates/prompts/{verification/gemini-strategic.txt → verification-gemini-strategic.txt} +27 -27
  162. package/.claude/workflows/cli-templates/prompts/{workflow/analysis-results-structure.txt → workflow-analysis-results-structure.txt} +224 -224
  163. package/.claude/workflows/cli-templates/prompts/{workflow/impl-plan-template.txt → workflow-impl-plan-template.txt} +286 -286
  164. package/.claude/workflows/cli-templates/prompts/{workflow/skill-conflict-patterns.txt → workflow-skill-conflict-patterns.txt} +2 -2
  165. package/.claude/workflows/cli-templates/prompts/{workflow/skill-lessons-learned.txt → workflow-skill-lessons-learned.txt} +2 -2
  166. package/.claude/workflows/cli-templates/prompts/{workflow/task-json-agent-mode.txt → workflow-task-json-agent-mode.txt} +123 -123
  167. package/.claude/workflows/cli-templates/schemas/project-guidelines-schema.json +141 -141
  168. package/.claude/workflows/cli-tools-usage.md +113 -117
  169. package/.claude/workflows/coding-philosophy.md +69 -69
  170. package/.claude/workflows/context-tools.md +76 -76
  171. package/.claude/workflows/file-modification.md +64 -64
  172. package/.claude/workflows/review-directory-specification.md +336 -336
  173. package/.claude/workflows/windows-platform.md +19 -19
  174. package/.claude/workflows/workflow-architecture.md +942 -942
  175. package/.codex/prompts/issue-execute.md +176 -70
  176. package/README.md +250 -214
  177. package/ccw/dist/cli.d.ts.map +1 -1
  178. package/ccw/dist/cli.js +15 -0
  179. package/ccw/dist/cli.js.map +1 -1
  180. package/ccw/dist/commands/cli.d.ts +5 -0
  181. package/ccw/dist/commands/cli.d.ts.map +1 -1
  182. package/ccw/dist/commands/cli.js +116 -19
  183. package/ccw/dist/commands/cli.js.map +1 -1
  184. package/ccw/dist/commands/install.d.ts +17 -0
  185. package/ccw/dist/commands/install.d.ts.map +1 -1
  186. package/ccw/dist/commands/install.js +211 -2
  187. package/ccw/dist/commands/install.js.map +1 -1
  188. package/ccw/dist/commands/issue.d.ts.map +1 -1
  189. package/ccw/dist/commands/issue.js +208 -28
  190. package/ccw/dist/commands/issue.js.map +1 -1
  191. package/ccw/dist/commands/uninstall.d.ts.map +1 -1
  192. package/ccw/dist/commands/uninstall.js +22 -1
  193. package/ccw/dist/commands/uninstall.js.map +1 -1
  194. package/ccw/dist/commands/view.d.ts.map +1 -1
  195. package/ccw/dist/commands/view.js +3 -0
  196. package/ccw/dist/commands/view.js.map +1 -1
  197. package/ccw/dist/commands/workflow.d.ts +11 -0
  198. package/ccw/dist/commands/workflow.d.ts.map +1 -0
  199. package/ccw/dist/commands/workflow.js +294 -0
  200. package/ccw/dist/commands/workflow.js.map +1 -0
  201. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  202. package/ccw/dist/core/routes/claude-routes.js +57 -3
  203. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  204. package/ccw/dist/core/routes/cli-routes.d.ts +13 -0
  205. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  206. package/ccw/dist/core/routes/cli-routes.js +46 -0
  207. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  208. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  209. package/ccw/dist/core/routes/hooks-routes.js +33 -0
  210. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  211. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  212. package/ccw/dist/core/routes/issue-routes.js +211 -29
  213. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  214. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
  215. package/ccw/dist/core/routes/mcp-routes.js +4 -1
  216. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  217. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
  218. package/ccw/dist/core/routes/rules-routes.js +22 -6
  219. package/ccw/dist/core/routes/rules-routes.js.map +1 -1
  220. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
  221. package/ccw/dist/core/routes/session-routes.js +23 -1
  222. package/ccw/dist/core/routes/session-routes.js.map +1 -1
  223. package/ccw/dist/mcp-server/index.js +8 -2
  224. package/ccw/dist/mcp-server/index.js.map +1 -1
  225. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  226. package/ccw/dist/tools/claude-cli-tools.js +52 -28
  227. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  228. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -1
  229. package/ccw/dist/tools/cli-executor-core.js +33 -8
  230. package/ccw/dist/tools/cli-executor-core.js.map +1 -1
  231. package/ccw/dist/tools/cli-executor-state.d.ts +2 -0
  232. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -1
  233. package/ccw/dist/tools/cli-executor-state.js.map +1 -1
  234. package/ccw/dist/tools/cli-executor-utils.d.ts +7 -0
  235. package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -1
  236. package/ccw/dist/tools/cli-executor-utils.js +18 -4
  237. package/ccw/dist/tools/cli-executor-utils.js.map +1 -1
  238. package/ccw/dist/tools/cli-history-store.d.ts +21 -0
  239. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  240. package/ccw/dist/tools/cli-history-store.js +106 -30
  241. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  242. package/ccw/dist/tools/cli-output-converter.d.ts +2 -1
  243. package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -1
  244. package/ccw/dist/tools/cli-output-converter.js +65 -10
  245. package/ccw/dist/tools/cli-output-converter.js.map +1 -1
  246. package/ccw/dist/tools/codex-lens-lsp.d.ts +61 -0
  247. package/ccw/dist/tools/codex-lens-lsp.d.ts.map +1 -0
  248. package/ccw/dist/tools/codex-lens-lsp.js +320 -0
  249. package/ccw/dist/tools/codex-lens-lsp.js.map +1 -0
  250. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  251. package/ccw/dist/tools/codex-lens.js +74 -54
  252. package/ccw/dist/tools/codex-lens.js.map +1 -1
  253. package/ccw/dist/tools/index.d.ts.map +1 -1
  254. package/ccw/dist/tools/index.js +4 -0
  255. package/ccw/dist/tools/index.js.map +1 -1
  256. package/ccw/dist/tools/template-discovery.d.ts +85 -0
  257. package/ccw/dist/tools/template-discovery.d.ts.map +1 -0
  258. package/ccw/dist/tools/template-discovery.js +239 -0
  259. package/ccw/dist/tools/template-discovery.js.map +1 -0
  260. package/ccw/dist/tools/vscode-lsp.d.ts +57 -0
  261. package/ccw/dist/tools/vscode-lsp.d.ts.map +1 -0
  262. package/ccw/dist/tools/vscode-lsp.js +250 -0
  263. package/ccw/dist/tools/vscode-lsp.js.map +1 -0
  264. package/ccw/dist/utils/path-resolver.d.ts +16 -2
  265. package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
  266. package/ccw/dist/utils/path-resolver.js +36 -6
  267. package/ccw/dist/utils/path-resolver.js.map +1 -1
  268. package/ccw/dist/utils/path-validator.d.ts +5 -0
  269. package/ccw/dist/utils/path-validator.d.ts.map +1 -1
  270. package/ccw/dist/utils/path-validator.js +16 -5
  271. package/ccw/dist/utils/path-validator.js.map +1 -1
  272. package/ccw/dist/utils/project-root.d.ts +25 -0
  273. package/ccw/dist/utils/project-root.d.ts.map +1 -0
  274. package/ccw/dist/utils/project-root.js +63 -0
  275. package/ccw/dist/utils/project-root.js.map +1 -0
  276. package/ccw/dist/utils/shell-escape.d.ts +47 -3
  277. package/ccw/dist/utils/shell-escape.d.ts.map +1 -1
  278. package/ccw/dist/utils/shell-escape.js +98 -15
  279. package/ccw/dist/utils/shell-escape.js.map +1 -1
  280. package/ccw/dist/utils/update-checker.d.ts +11 -0
  281. package/ccw/dist/utils/update-checker.d.ts.map +1 -0
  282. package/ccw/dist/utils/update-checker.js +167 -0
  283. package/ccw/dist/utils/update-checker.js.map +1 -0
  284. package/ccw/src/cli.ts +16 -0
  285. package/ccw/src/commands/cli.ts +126 -19
  286. package/ccw/src/commands/install.ts +239 -2
  287. package/ccw/src/commands/issue.ts +245 -31
  288. package/ccw/src/commands/uninstall.ts +23 -1
  289. package/ccw/src/commands/view.ts +4 -0
  290. package/ccw/src/commands/workflow.ts +348 -0
  291. package/ccw/src/core/routes/claude-routes.ts +64 -3
  292. package/ccw/src/core/routes/cli-routes.ts +58 -0
  293. package/ccw/src/core/routes/hooks-routes.ts +32 -0
  294. package/ccw/src/core/routes/issue-routes.ts +242 -28
  295. package/ccw/src/core/routes/mcp-routes.ts +6 -2
  296. package/ccw/src/core/routes/rules-routes.ts +24 -6
  297. package/ccw/src/core/routes/session-routes.ts +24 -1
  298. package/ccw/src/mcp-server/index.ts +7 -2
  299. package/ccw/src/templates/dashboard-css/26-claude-manager.css +179 -0
  300. package/ccw/src/templates/dashboard-css/32-issue-manager.css +3427 -3302
  301. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +3 -2
  302. package/ccw/src/templates/dashboard-js/components/cli-history.js +4 -1
  303. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +57 -21
  304. package/ccw/src/templates/dashboard-js/components/hook-manager.js +1492 -1492
  305. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +107 -20
  306. package/ccw/src/templates/dashboard-js/components/version-check.js +135 -1
  307. package/ccw/src/templates/dashboard-js/i18n.js +42 -0
  308. package/ccw/src/templates/dashboard-js/views/claude-manager.js +168 -0
  309. package/ccw/src/templates/dashboard-js/views/cli-manager.js +1 -0
  310. package/ccw/src/templates/dashboard-js/views/issue-manager.js +201 -1
  311. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +3502 -3478
  312. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +16 -0
  313. package/ccw/src/templates/dashboard.html +112 -0
  314. package/ccw/src/tools/claude-cli-tools.ts +54 -28
  315. package/ccw/src/tools/cli-executor-core.ts +36 -8
  316. package/ccw/src/tools/cli-executor-state.ts +2 -0
  317. package/ccw/src/tools/cli-executor-utils.ts +26 -4
  318. package/ccw/src/tools/cli-history-store.ts +122 -31
  319. package/ccw/src/tools/cli-output-converter.ts +76 -12
  320. package/ccw/src/tools/codex-lens-lsp.ts +405 -0
  321. package/ccw/src/tools/codex-lens.ts +82 -59
  322. package/ccw/src/tools/index.ts +4 -0
  323. package/ccw/src/tools/template-discovery.ts +303 -0
  324. package/ccw/src/tools/vscode-lsp.ts +317 -0
  325. package/ccw/src/utils/path-resolver.ts +37 -6
  326. package/ccw/src/utils/path-validator.ts +17 -5
  327. package/ccw/src/utils/project-root.ts +73 -0
  328. package/ccw/src/utils/shell-escape.ts +103 -16
  329. package/ccw/src/utils/update-checker.ts +178 -0
  330. package/codex-lens/pyproject.toml +14 -0
  331. package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
  332. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  333. package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
  334. package/codex-lens/src/codexlens/__pycache__/errors.cpython-313.pyc +0 -0
  335. package/codex-lens/src/codexlens/api/__init__.py +88 -0
  336. package/codex-lens/src/codexlens/api/__pycache__/__init__.cpython-312.pyc +0 -0
  337. package/codex-lens/src/codexlens/api/__pycache__/__init__.cpython-313.pyc +0 -0
  338. package/codex-lens/src/codexlens/api/__pycache__/definition.cpython-312.pyc +0 -0
  339. package/codex-lens/src/codexlens/api/__pycache__/definition.cpython-313.pyc +0 -0
  340. package/codex-lens/src/codexlens/api/__pycache__/file_context.cpython-312.pyc +0 -0
  341. package/codex-lens/src/codexlens/api/__pycache__/file_context.cpython-313.pyc +0 -0
  342. package/codex-lens/src/codexlens/api/__pycache__/hover.cpython-312.pyc +0 -0
  343. package/codex-lens/src/codexlens/api/__pycache__/hover.cpython-313.pyc +0 -0
  344. package/codex-lens/src/codexlens/api/__pycache__/models.cpython-312.pyc +0 -0
  345. package/codex-lens/src/codexlens/api/__pycache__/models.cpython-313.pyc +0 -0
  346. package/codex-lens/src/codexlens/api/__pycache__/references.cpython-312.pyc +0 -0
  347. package/codex-lens/src/codexlens/api/__pycache__/references.cpython-313.pyc +0 -0
  348. package/codex-lens/src/codexlens/api/__pycache__/semantic.cpython-312.pyc +0 -0
  349. package/codex-lens/src/codexlens/api/__pycache__/semantic.cpython-313.pyc +0 -0
  350. package/codex-lens/src/codexlens/api/__pycache__/symbols.cpython-312.pyc +0 -0
  351. package/codex-lens/src/codexlens/api/__pycache__/symbols.cpython-313.pyc +0 -0
  352. package/codex-lens/src/codexlens/api/__pycache__/utils.cpython-312.pyc +0 -0
  353. package/codex-lens/src/codexlens/api/__pycache__/utils.cpython-313.pyc +0 -0
  354. package/codex-lens/src/codexlens/api/definition.py +126 -0
  355. package/codex-lens/src/codexlens/api/file_context.py +271 -0
  356. package/codex-lens/src/codexlens/api/hover.py +148 -0
  357. package/codex-lens/src/codexlens/api/models.py +281 -0
  358. package/codex-lens/src/codexlens/api/references.py +345 -0
  359. package/codex-lens/src/codexlens/api/semantic.py +471 -0
  360. package/codex-lens/src/codexlens/api/symbols.py +146 -0
  361. package/codex-lens/src/codexlens/api/utils.py +153 -0
  362. package/codex-lens/src/codexlens/config.py +7 -0
  363. package/codex-lens/src/codexlens/errors.py +4 -0
  364. package/codex-lens/src/codexlens/hybrid_search/__init__.py +28 -0
  365. package/codex-lens/src/codexlens/hybrid_search/__pycache__/__init__.cpython-312.pyc +0 -0
  366. package/codex-lens/src/codexlens/hybrid_search/__pycache__/__init__.cpython-313.pyc +0 -0
  367. package/codex-lens/src/codexlens/hybrid_search/__pycache__/data_structures.cpython-312.pyc +0 -0
  368. package/codex-lens/src/codexlens/hybrid_search/__pycache__/data_structures.cpython-313.pyc +0 -0
  369. package/codex-lens/src/codexlens/hybrid_search/__pycache__/engine.cpython-313.pyc +0 -0
  370. package/codex-lens/src/codexlens/hybrid_search/data_structures.py +602 -0
  371. package/codex-lens/src/codexlens/lsp/__init__.py +34 -0
  372. package/codex-lens/src/codexlens/lsp/__pycache__/__init__.cpython-312.pyc +0 -0
  373. package/codex-lens/src/codexlens/lsp/__pycache__/__init__.cpython-313.pyc +0 -0
  374. package/codex-lens/src/codexlens/lsp/__pycache__/handlers.cpython-313.pyc +0 -0
  375. package/codex-lens/src/codexlens/lsp/__pycache__/lsp_bridge.cpython-312.pyc +0 -0
  376. package/codex-lens/src/codexlens/lsp/__pycache__/lsp_bridge.cpython-313.pyc +0 -0
  377. package/codex-lens/src/codexlens/lsp/__pycache__/lsp_graph_builder.cpython-312.pyc +0 -0
  378. package/codex-lens/src/codexlens/lsp/__pycache__/lsp_graph_builder.cpython-313.pyc +0 -0
  379. package/codex-lens/src/codexlens/lsp/__pycache__/providers.cpython-313.pyc +0 -0
  380. package/codex-lens/src/codexlens/lsp/__pycache__/server.cpython-313.pyc +0 -0
  381. package/codex-lens/src/codexlens/lsp/__pycache__/standalone_manager.cpython-313.pyc +0 -0
  382. package/codex-lens/src/codexlens/lsp/handlers.py +551 -0
  383. package/codex-lens/src/codexlens/lsp/lsp_bridge.py +834 -0
  384. package/codex-lens/src/codexlens/lsp/lsp_graph_builder.py +375 -0
  385. package/codex-lens/src/codexlens/lsp/providers.py +177 -0
  386. package/codex-lens/src/codexlens/lsp/server.py +263 -0
  387. package/codex-lens/src/codexlens/lsp/standalone_manager.py +1159 -0
  388. package/codex-lens/src/codexlens/mcp/__init__.py +20 -0
  389. package/codex-lens/src/codexlens/mcp/__pycache__/__init__.cpython-313.pyc +0 -0
  390. package/codex-lens/src/codexlens/mcp/__pycache__/hooks.cpython-313.pyc +0 -0
  391. package/codex-lens/src/codexlens/mcp/__pycache__/provider.cpython-313.pyc +0 -0
  392. package/codex-lens/src/codexlens/mcp/__pycache__/schema.cpython-313.pyc +0 -0
  393. package/codex-lens/src/codexlens/mcp/hooks.py +170 -0
  394. package/codex-lens/src/codexlens/mcp/provider.py +202 -0
  395. package/codex-lens/src/codexlens/mcp/schema.py +113 -0
  396. package/codex-lens/src/codexlens/search/__init__.py +53 -15
  397. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
  398. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-313.pyc +0 -0
  399. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
  400. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  401. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
  402. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  403. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
  404. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  405. package/codex-lens/src/codexlens/search/association_tree/QUICK_START.md +257 -0
  406. package/codex-lens/src/codexlens/search/association_tree/README.md +188 -0
  407. package/codex-lens/src/codexlens/search/association_tree/__init__.py +21 -0
  408. package/codex-lens/src/codexlens/search/association_tree/__pycache__/__init__.cpython-313.pyc +0 -0
  409. package/codex-lens/src/codexlens/search/association_tree/__pycache__/builder.cpython-313.pyc +0 -0
  410. package/codex-lens/src/codexlens/search/association_tree/__pycache__/data_structures.cpython-313.pyc +0 -0
  411. package/codex-lens/src/codexlens/search/association_tree/__pycache__/deduplicator.cpython-313.pyc +0 -0
  412. package/codex-lens/src/codexlens/search/association_tree/builder.py +450 -0
  413. package/codex-lens/src/codexlens/search/association_tree/data_structures.py +191 -0
  414. package/codex-lens/src/codexlens/search/association_tree/deduplicator.py +301 -0
  415. package/codex-lens/src/codexlens/search/chain_search.py +864 -3
  416. package/codex-lens/src/codexlens/search/clustering/__init__.py +124 -0
  417. package/codex-lens/src/codexlens/search/clustering/__pycache__/__init__.cpython-312.pyc +0 -0
  418. package/codex-lens/src/codexlens/search/clustering/__pycache__/__init__.cpython-313.pyc +0 -0
  419. package/codex-lens/src/codexlens/search/clustering/__pycache__/base.cpython-312.pyc +0 -0
  420. package/codex-lens/src/codexlens/search/clustering/__pycache__/base.cpython-313.pyc +0 -0
  421. package/codex-lens/src/codexlens/search/clustering/__pycache__/dbscan_strategy.cpython-313.pyc +0 -0
  422. package/codex-lens/src/codexlens/search/clustering/__pycache__/factory.cpython-312.pyc +0 -0
  423. package/codex-lens/src/codexlens/search/clustering/__pycache__/factory.cpython-313.pyc +0 -0
  424. package/codex-lens/src/codexlens/search/clustering/__pycache__/frequency_strategy.cpython-312.pyc +0 -0
  425. package/codex-lens/src/codexlens/search/clustering/__pycache__/frequency_strategy.cpython-313.pyc +0 -0
  426. package/codex-lens/src/codexlens/search/clustering/__pycache__/hdbscan_strategy.cpython-313.pyc +0 -0
  427. package/codex-lens/src/codexlens/search/clustering/__pycache__/noop_strategy.cpython-312.pyc +0 -0
  428. package/codex-lens/src/codexlens/search/clustering/__pycache__/noop_strategy.cpython-313.pyc +0 -0
  429. package/codex-lens/src/codexlens/search/clustering/base.py +153 -0
  430. package/codex-lens/src/codexlens/search/clustering/dbscan_strategy.py +197 -0
  431. package/codex-lens/src/codexlens/search/clustering/factory.py +202 -0
  432. package/codex-lens/src/codexlens/search/clustering/frequency_strategy.py +263 -0
  433. package/codex-lens/src/codexlens/search/clustering/hdbscan_strategy.py +153 -0
  434. package/codex-lens/src/codexlens/search/clustering/noop_strategy.py +83 -0
  435. package/codex-lens/src/codexlens/search/hybrid_search.py +194 -2
  436. package/codex-lens/src/codexlens/search/ranking.py +6 -4
  437. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
  438. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  439. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  440. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  441. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-313.pyc +0 -0
  442. package/codex-lens/src/codexlens/storage/dir_index.py +172 -0
  443. package/codex-lens/src/codexlens/storage/global_index.py +33 -0
  444. package/package.json +92 -92
  445. /package/.claude/workflows/cli-templates/prompts/{analysis/02-analyze-code-patterns.txt → analysis-analyze-code-patterns.txt} +0 -0
  446. /package/.claude/workflows/cli-templates/prompts/{analysis/02-analyze-technical-document.txt → analysis-analyze-technical-document.txt} +0 -0
  447. /package/.claude/workflows/cli-templates/prompts/{analysis/01-diagnose-bug-root-cause.txt → analysis-diagnose-bug-root-cause.txt} +0 -0
  448. /package/.claude/workflows/cli-templates/prompts/{development/03-debug-runtime-issues.txt → development-debug-runtime-issues.txt} +0 -0
  449. /package/.claude/workflows/cli-templates/prompts/{development/02-generate-tests.txt → development-generate-tests.txt} +0 -0
  450. /package/.claude/workflows/cli-templates/prompts/{development/02-implement-component-ui.txt → development-implement-component-ui.txt} +0 -0
  451. /package/.claude/workflows/cli-templates/prompts/{development/02-implement-feature.txt → development-implement-feature.txt} +0 -0
  452. /package/.claude/workflows/cli-templates/prompts/{development/02-refactor-codebase.txt → development-refactor-codebase.txt} +0 -0
  453. /package/.claude/workflows/cli-templates/prompts/{documentation/module-readme.txt → documentation-module-readme.txt} +0 -0
  454. /package/.claude/workflows/cli-templates/prompts/{memory/02-document-module-structure.txt → memory-document-module-structure.txt} +0 -0
  455. /package/.claude/workflows/cli-templates/prompts/{planning/02-breakdown-task-steps.txt → planning-breakdown-task-steps.txt} +0 -0
  456. /package/.claude/workflows/cli-templates/prompts/{planning/03-evaluate-concept-feasibility.txt → planning-evaluate-concept-feasibility.txt} +0 -0
  457. /package/.claude/workflows/cli-templates/prompts/{planning/01-plan-architecture-design.txt → planning-plan-architecture-design.txt} +0 -0
  458. /package/.claude/workflows/cli-templates/prompts/{planning/03-plan-migration-strategy.txt → planning-plan-migration-strategy.txt} +0 -0
  459. /package/.claude/workflows/cli-templates/prompts/{rules/rule-api.txt → rules-rule-api.txt} +0 -0
  460. /package/.claude/workflows/cli-templates/prompts/{rules/rule-components.txt → rules-rule-components.txt} +0 -0
  461. /package/.claude/workflows/cli-templates/prompts/{rules/rule-config.txt → rules-rule-config.txt} +0 -0
  462. /package/.claude/workflows/cli-templates/prompts/{rules/rule-core.txt → rules-rule-core.txt} +0 -0
  463. /package/.claude/workflows/cli-templates/prompts/{rules/rule-patterns.txt → rules-rule-patterns.txt} +0 -0
  464. /package/.claude/workflows/cli-templates/prompts/{rules/rule-testing.txt → rules-rule-testing.txt} +0 -0
  465. /package/.claude/workflows/cli-templates/prompts/{rules/tech-rules-agent-prompt.txt → rules-tech-rules-agent-prompt.txt} +0 -0
  466. /package/.claude/workflows/cli-templates/prompts/{tech/tech-module-format.txt → tech-tech-module-format.txt} +0 -0
  467. /package/.claude/workflows/cli-templates/prompts/{tech/tech-skill-index.txt → tech-tech-skill-index.txt} +0 -0
  468. /package/.claude/workflows/cli-templates/prompts/{test/test-concept-analysis.txt → test-test-concept-analysis.txt} +0 -0
  469. /package/.claude/workflows/cli-templates/prompts/{universal/00-universal-creative-style.txt → universal-universal-creative-style.txt} +0 -0
  470. /package/.claude/workflows/cli-templates/prompts/{universal/00-universal-rigorous-style.txt → universal-universal-rigorous-style.txt} +0 -0
  471. /package/.claude/workflows/cli-templates/prompts/{workflow/codex-feasibility-validation.txt → workflow-codex-feasibility-validation.txt} +0 -0
  472. /package/.claude/workflows/cli-templates/prompts/{workflow/gemini-solution-design.txt → workflow-gemini-solution-design.txt} +0 -0
  473. /package/.claude/workflows/cli-templates/prompts/{workflow/skill-aggregation.txt → workflow-skill-aggregation.txt} +0 -0
  474. /package/.claude/workflows/cli-templates/prompts/{workflow/skill-index.txt → workflow-skill-index.txt} +0 -0
  475. /package/.claude/workflows/cli-templates/prompts/{workflow/skill-sessions-timeline.txt → workflow-skill-sessions-timeline.txt} +0 -0
  476. /package/.claude/workflows/cli-templates/prompts/{workflow/task-json-cli-mode.txt → workflow-task-json-cli-mode.txt} +0 -0
@@ -1,581 +1,581 @@
1
- ---
2
- name: execute
3
- description: Execute queue with DAG-based parallel orchestration (one commit per solution)
4
- argument-hint: "--queue <queue-id> [--worktree [<existing-path>]]"
5
- allowed-tools: TodoWrite(*), Bash(*), Read(*), AskUserQuestion(*)
6
- ---
7
-
8
- # Issue Execute Command (/issue:execute)
9
-
10
- ## Overview
11
-
12
- Minimal orchestrator that dispatches **solution IDs** to executors. Each executor receives a complete solution with all its tasks.
13
-
14
- **Design Principles:**
15
- - `queue dag` → returns parallel batches with solution IDs (S-1, S-2, ...)
16
- - `detail <id>` → READ-ONLY solution fetch (returns full solution with all tasks)
17
- - `done <id>` → update solution completion status
18
- - No race conditions: status changes only via `done`
19
- - **Executor handles all tasks within a solution sequentially**
20
- - **Single worktree for entire queue**: One worktree isolates ALL queue execution from main workspace
21
-
22
- ## Queue ID Requirement (MANDATORY)
23
-
24
- **Queue ID is REQUIRED.** You MUST specify which queue to execute via `--queue <queue-id>`.
25
-
26
- ### If Queue ID Not Provided
27
-
28
- When `--queue` parameter is missing, you MUST:
29
-
30
- 1. **List available queues** by running:
31
- ```javascript
32
- const result = Bash('ccw issue queue list --brief --json');
33
- const index = JSON.parse(result);
34
- ```
35
-
36
- 2. **Display available queues** to user:
37
- ```
38
- Available Queues:
39
- ID Status Progress Issues
40
- -----------------------------------------------------------
41
- → QUE-20251215-001 active 3/10 ISS-001, ISS-002
42
- QUE-20251210-002 active 0/5 ISS-003
43
- QUE-20251205-003 completed 8/8 ISS-004
44
- ```
45
-
46
- 3. **Stop and ask user** to specify which queue to execute:
47
- ```javascript
48
- AskUserQuestion({
49
- questions: [{
50
- question: "Which queue would you like to execute?",
51
- header: "Queue",
52
- multiSelect: false,
53
- options: index.queues
54
- .filter(q => q.status === 'active')
55
- .map(q => ({
56
- label: q.id,
57
- description: `${q.status}, ${q.completed_solutions || 0}/${q.total_solutions || 0} completed, Issues: ${q.issue_ids.join(', ')}`
58
- }))
59
- }]
60
- })
61
- ```
62
-
63
- 4. **After user selection**, continue execution with the selected queue ID.
64
-
65
- **DO NOT auto-select queues.** Explicit user confirmation is required to prevent accidental execution of wrong queue.
66
-
67
- ## Usage
68
-
69
- ```bash
70
- /issue:execute --queue QUE-xxx # Execute specific queue (REQUIRED)
71
- /issue:execute --queue QUE-xxx --worktree # Execute in isolated worktree
72
- /issue:execute --queue QUE-xxx --worktree /path/to/existing/worktree # Resume
73
- ```
74
-
75
- **Parallelism**: Determined automatically by task dependency DAG (no manual control)
76
- **Executor & Dry-run**: Selected via interactive prompt (AskUserQuestion)
77
- **Worktree**: Creates ONE worktree for the entire queue execution (not per-solution)
78
-
79
- **⭐ Recommended Executor**: **Codex** - Best for long-running autonomous work (2hr timeout), supports background execution and full write access
80
-
81
- **Worktree Options**:
82
- - `--worktree` - Create a new worktree with timestamp-based name
83
- - `--worktree <existing-path>` - Resume in an existing worktree (for recovery/continuation)
84
-
85
- **Resume**: Use `git worktree list` to find existing worktrees from interrupted executions
86
-
87
- ## Execution Flow
88
-
89
- ```
90
- Phase 0: Validate Queue ID (REQUIRED)
91
- ├─ If --queue provided → use specified queue
92
- ├─ If --queue missing → list queues, prompt user to select
93
- └─ Store QUEUE_ID for all subsequent commands
94
-
95
- Phase 0.5 (if --worktree): Setup Queue Worktree
96
- ├─ Create ONE worktree for entire queue: .ccw/worktrees/queue-<timestamp>
97
- ├─ All subsequent execution happens in this worktree
98
- └─ Main workspace remains clean and untouched
99
-
100
- Phase 1: Get DAG & User Selection
101
- ├─ ccw issue queue dag --queue ${QUEUE_ID} → { parallel_batches: [["S-1","S-2"], ["S-3"]] }
102
- └─ AskUserQuestion → executor type (codex|gemini|agent), dry-run mode, worktree mode
103
-
104
- Phase 2: Dispatch Parallel Batch (DAG-driven)
105
- ├─ Parallelism determined by DAG (no manual limit)
106
- ├─ All executors work in the SAME worktree (or main if no worktree)
107
- ├─ For each solution ID in batch (parallel - all at once):
108
- │ ├─ Executor calls: ccw issue detail <id> (READ-ONLY)
109
- │ ├─ Executor gets FULL SOLUTION with all tasks
110
- │ ├─ Executor implements all tasks sequentially (T1 → T2 → T3)
111
- │ ├─ Executor tests + verifies each task
112
- │ ├─ Executor commits ONCE per solution (with formatted summary)
113
- │ └─ Executor calls: ccw issue done <id>
114
- └─ Wait for batch completion
115
-
116
- Phase 3: Next Batch (repeat Phase 2)
117
- └─ ccw issue queue dag → check for newly-ready solutions
118
-
119
- Phase 4 (if --worktree): Worktree Completion
120
- ├─ All batches complete → prompt for merge strategy
121
- └─ Options: Create PR / Merge to main / Keep branch
122
- ```
123
-
124
- ## Implementation
125
-
126
- ### Phase 0: Validate Queue ID
127
-
128
- ```javascript
129
- // Check if --queue was provided
130
- let QUEUE_ID = args.queue;
131
-
132
- if (!QUEUE_ID) {
133
- // List available queues
134
- const listResult = Bash('ccw issue queue list --brief --json').trim();
135
- const index = JSON.parse(listResult);
136
-
137
- if (index.queues.length === 0) {
138
- console.log('No queues found. Use /issue:queue to create one first.');
139
- return;
140
- }
141
-
142
- // Filter active queues only
143
- const activeQueues = index.queues.filter(q => q.status === 'active');
144
-
145
- if (activeQueues.length === 0) {
146
- console.log('No active queues found.');
147
- console.log('Available queues:', index.queues.map(q => `${q.id} (${q.status})`).join(', '));
148
- return;
149
- }
150
-
151
- // Display and prompt user
152
- console.log('\nAvailable Queues:');
153
- console.log('ID'.padEnd(22) + 'Status'.padEnd(12) + 'Progress'.padEnd(12) + 'Issues');
154
- console.log('-'.repeat(70));
155
- for (const q of index.queues) {
156
- const marker = q.id === index.active_queue_id ? '→ ' : ' ';
157
- console.log(marker + q.id.padEnd(20) + q.status.padEnd(12) +
158
- `${q.completed_solutions || 0}/${q.total_solutions || 0}`.padEnd(12) +
159
- q.issue_ids.join(', '));
160
- }
161
-
162
- const answer = AskUserQuestion({
163
- questions: [{
164
- question: "Which queue would you like to execute?",
165
- header: "Queue",
166
- multiSelect: false,
167
- options: activeQueues.map(q => ({
168
- label: q.id,
169
- description: `${q.completed_solutions || 0}/${q.total_solutions || 0} completed, Issues: ${q.issue_ids.join(', ')}`
170
- }))
171
- }]
172
- });
173
-
174
- QUEUE_ID = answer['Queue'];
175
- }
176
-
177
- console.log(`\n## Executing Queue: ${QUEUE_ID}\n`);
178
- ```
179
-
180
- ### Phase 1: Get DAG & User Selection
181
-
182
- ```javascript
183
- // Get dependency graph and parallel batches (QUEUE_ID required)
184
- const dagJson = Bash(`ccw issue queue dag --queue ${QUEUE_ID}`).trim();
185
- const dag = JSON.parse(dagJson);
186
-
187
- if (dag.error || dag.ready_count === 0) {
188
- console.log(dag.error || 'No solutions ready for execution');
189
- console.log('Use /issue:queue to form a queue first');
190
- return;
191
- }
192
-
193
- console.log(`
194
- ## Queue DAG (Solution-Level)
195
-
196
- - Total Solutions: ${dag.total}
197
- - Ready: ${dag.ready_count}
198
- - Completed: ${dag.completed_count}
199
- - Parallel in batch 1: ${dag.parallel_batches[0]?.length || 0}
200
- `);
201
-
202
- // Interactive selection via AskUserQuestion
203
- const answer = AskUserQuestion({
204
- questions: [
205
- {
206
- question: 'Select executor type:',
207
- header: 'Executor',
208
- multiSelect: false,
209
- options: [
210
- { label: 'Codex (Recommended)', description: 'Autonomous coding with full write access' },
211
- { label: 'Gemini', description: 'Large context analysis and implementation' },
212
- { label: 'Agent', description: 'Claude Code sub-agent for complex tasks' }
213
- ]
214
- },
215
- {
216
- question: 'Execution mode:',
217
- header: 'Mode',
218
- multiSelect: false,
219
- options: [
220
- { label: 'Execute (Recommended)', description: 'Run all ready solutions' },
221
- { label: 'Dry-run', description: 'Show DAG and batches without executing' }
222
- ]
223
- },
224
- {
225
- question: 'Use git worktree for queue isolation?',
226
- header: 'Worktree',
227
- multiSelect: false,
228
- options: [
229
- { label: 'Yes (Recommended)', description: 'Create ONE worktree for entire queue - main stays clean' },
230
- { label: 'No', description: 'Work directly in current directory' }
231
- ]
232
- }
233
- ]
234
- });
235
-
236
- const executor = answer['Executor'].toLowerCase().split(' ')[0]; // codex|gemini|agent
237
- const isDryRun = answer['Mode'].includes('Dry-run');
238
- const useWorktree = answer['Worktree'].includes('Yes');
239
-
240
- // Dry run mode
241
- if (isDryRun) {
242
- console.log('### Parallel Batches (Dry-run):\n');
243
- dag.parallel_batches.forEach((batch, i) => {
244
- console.log(`Batch ${i + 1}: ${batch.join(', ')}`);
245
- });
246
- return;
247
- }
248
- ```
249
-
250
- ### Phase 0 & 2: Setup Queue Worktree & Dispatch
251
-
252
- ```javascript
253
- // Parallelism determined by DAG - no manual limit
254
- // All solutions in same batch have NO file conflicts and can run in parallel
255
- const batch = dag.parallel_batches[0] || [];
256
-
257
- // Initialize TodoWrite
258
- TodoWrite({
259
- todos: batch.map(id => ({
260
- content: `Execute solution ${id}`,
261
- status: 'pending',
262
- activeForm: `Executing solution ${id}`
263
- }))
264
- });
265
-
266
- console.log(`\n### Executing Solutions (DAG batch 1): ${batch.join(', ')}`);
267
-
268
- // Parse existing worktree path from args if provided
269
- // Example: --worktree /path/to/existing/worktree
270
- const existingWorktree = args.worktree && typeof args.worktree === 'string' ? args.worktree : null;
271
-
272
- // Setup ONE worktree for entire queue (not per-solution)
273
- let worktreePath = null;
274
- let worktreeBranch = null;
275
-
276
- if (useWorktree) {
277
- const repoRoot = Bash('git rev-parse --show-toplevel').trim();
278
- const worktreeBase = `${repoRoot}/.ccw/worktrees`;
279
- Bash(`mkdir -p "${worktreeBase}"`);
280
- Bash('git worktree prune'); // Cleanup stale worktrees
281
-
282
- if (existingWorktree) {
283
- // Resume mode: Use existing worktree
284
- worktreePath = existingWorktree;
285
- worktreeBranch = Bash(`git -C "${worktreePath}" branch --show-current`).trim();
286
- console.log(`Resuming in existing worktree: ${worktreePath} (branch: ${worktreeBranch})`);
287
- } else {
288
- // Create mode: ONE worktree for the entire queue
289
- const timestamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14);
290
- worktreeBranch = `queue-exec-${dag.queue_id || timestamp}`;
291
- worktreePath = `${worktreeBase}/${worktreeBranch}`;
292
- Bash(`git worktree add "${worktreePath}" -b "${worktreeBranch}"`);
293
- console.log(`Created queue worktree: ${worktreePath}`);
294
- }
295
- }
296
-
297
- // Launch ALL solutions in batch in parallel (DAG guarantees no conflicts)
298
- // All executors work in the SAME worktree (or main if no worktree)
299
- const executions = batch.map(solutionId => {
300
- updateTodo(solutionId, 'in_progress');
301
- return dispatchExecutor(solutionId, executor, worktreePath);
302
- });
303
-
304
- await Promise.all(executions);
305
- batch.forEach(id => updateTodo(id, 'completed'));
306
- ```
307
-
308
- ### Executor Dispatch
309
-
310
- ```javascript
311
- // worktreePath: path to shared worktree (null if not using worktree)
312
- function dispatchExecutor(solutionId, executorType, worktreePath = null) {
313
- // If worktree is provided, executor works in that directory
314
- // No per-solution worktree creation - ONE worktree for entire queue
315
- const cdCommand = worktreePath ? `cd "${worktreePath}"` : '';
316
-
317
- const prompt = `
318
- ## Execute Solution ${solutionId}
319
- ${worktreePath ? `
320
- ### Step 0: Enter Queue Worktree
321
- \`\`\`bash
322
- cd "${worktreePath}"
323
- \`\`\`
324
- ` : ''}
325
- ### Step 1: Get Solution (read-only)
326
- \`\`\`bash
327
- ccw issue detail ${solutionId}
328
- \`\`\`
329
-
330
- ### Step 2: Execute All Tasks Sequentially
331
- The detail command returns a FULL SOLUTION with all tasks.
332
- Execute each task in order (T1 → T2 → T3 → ...):
333
-
334
- For each task:
335
- 1. Follow task.implementation steps
336
- 2. Run task.test commands
337
- 3. Verify task.acceptance criteria
338
- (Do NOT commit after each task)
339
-
340
- ### Step 3: Commit Solution (Once)
341
- After ALL tasks pass, commit once with formatted summary:
342
- \`\`\`bash
343
- git add <all-modified-files>
344
- git commit -m "[type](scope): [solution.description]
345
-
346
- ## Solution Summary
347
- - Solution-ID: ${solutionId}
348
- - Tasks: T1, T2, ...
349
-
350
- ## Tasks Completed
351
- - [T1] task1.title: action
352
- - [T2] task2.title: action
353
-
354
- ## Files Modified
355
- - file1.ts
356
- - file2.ts
357
-
358
- ## Verification
359
- - All tests passed
360
- - All acceptance criteria verified"
361
- \`\`\`
362
-
363
- ### Step 4: Report Completion
364
- \`\`\`bash
365
- ccw issue done ${solutionId} --result '{"summary": "...", "files_modified": [...], "commit": {"hash": "...", "type": "feat"}, "tasks_completed": N}'
366
- \`\`\`
367
-
368
- If any task failed:
369
- \`\`\`bash
370
- ccw issue done ${solutionId} --fail --reason '{"task_id": "TX", "error_type": "test_failure", "message": "..."}'
371
- \`\`\`
372
-
373
- **Note**: Do NOT cleanup worktree after this solution. Worktree is shared by all solutions in the queue.
374
- `;
375
-
376
- // For CLI tools, pass --cd to set working directory
377
- const cdOption = worktreePath ? ` --cd "${worktreePath}"` : '';
378
-
379
- if (executorType === 'codex') {
380
- return Bash(
381
- `ccw cli -p "${escapePrompt(prompt)}" --tool codex --mode write --id exec-${solutionId}${cdOption}`,
382
- { timeout: 7200000, run_in_background: true } // 2hr for full solution
383
- );
384
- } else if (executorType === 'gemini') {
385
- return Bash(
386
- `ccw cli -p "${escapePrompt(prompt)}" --tool gemini --mode write --id exec-${solutionId}${cdOption}`,
387
- { timeout: 3600000, run_in_background: true }
388
- );
389
- } else {
390
- return Task({
391
- subagent_type: 'code-developer',
392
- run_in_background: false,
393
- description: `Execute solution ${solutionId}`,
394
- prompt: worktreePath ? `Working directory: ${worktreePath}\n\n${prompt}` : prompt
395
- });
396
- }
397
- }
398
- ```
399
-
400
- ### Phase 3: Check Next Batch
401
-
402
- ```javascript
403
- // Refresh DAG after batch completes (use same QUEUE_ID)
404
- const refreshedDag = JSON.parse(Bash(`ccw issue queue dag --queue ${QUEUE_ID}`).trim());
405
-
406
- console.log(`
407
- ## Batch Complete
408
-
409
- - Solutions Completed: ${refreshedDag.completed_count}/${refreshedDag.total}
410
- - Next ready: ${refreshedDag.ready_count}
411
- `);
412
-
413
- if (refreshedDag.ready_count > 0) {
414
- console.log(`Run \`/issue:execute --queue ${QUEUE_ID}\` again for next batch.`);
415
- // Note: If resuming, pass existing worktree path:
416
- // /issue:execute --queue ${QUEUE_ID} --worktree <worktreePath>
417
- }
418
- ```
419
-
420
- ### Phase 4: Worktree Completion (after ALL batches)
421
-
422
- ```javascript
423
- // Only run when ALL solutions completed AND using worktree
424
- if (useWorktree && refreshedDag.ready_count === 0 && refreshedDag.completed_count === refreshedDag.total) {
425
- console.log('\n## All Solutions Completed - Worktree Cleanup');
426
-
427
- const answer = AskUserQuestion({
428
- questions: [{
429
- question: `Queue complete. What to do with worktree branch "${worktreeBranch}"?`,
430
- header: 'Merge',
431
- multiSelect: false,
432
- options: [
433
- { label: 'Create PR (Recommended)', description: 'Push branch and create pull request' },
434
- { label: 'Merge to main', description: 'Merge all commits and cleanup worktree' },
435
- { label: 'Keep branch', description: 'Cleanup worktree, keep branch for manual handling' }
436
- ]
437
- }]
438
- });
439
-
440
- const repoRoot = Bash('git rev-parse --show-toplevel').trim();
441
-
442
- if (answer['Merge'].includes('Create PR')) {
443
- Bash(`git -C "${worktreePath}" push -u origin "${worktreeBranch}"`);
444
- Bash(`gh pr create --title "Queue ${dag.queue_id}" --body "Issue queue execution - all solutions completed" --head "${worktreeBranch}"`);
445
- Bash(`git worktree remove "${worktreePath}"`);
446
- console.log(`PR created for branch: ${worktreeBranch}`);
447
- } else if (answer['Merge'].includes('Merge to main')) {
448
- // Check main is clean
449
- const mainDirty = Bash('git status --porcelain').trim();
450
- if (mainDirty) {
451
- console.log('Warning: Main has uncommitted changes. Falling back to PR.');
452
- Bash(`git -C "${worktreePath}" push -u origin "${worktreeBranch}"`);
453
- Bash(`gh pr create --title "Queue ${dag.queue_id}" --body "Issue queue execution (main had uncommitted changes)" --head "${worktreeBranch}"`);
454
- } else {
455
- Bash(`git merge --no-ff "${worktreeBranch}" -m "Merge queue ${dag.queue_id}"`);
456
- Bash(`git branch -d "${worktreeBranch}"`);
457
- }
458
- Bash(`git worktree remove "${worktreePath}"`);
459
- } else {
460
- Bash(`git worktree remove "${worktreePath}"`);
461
- console.log(`Branch ${worktreeBranch} kept for manual handling`);
462
- }
463
- }
464
- ```
465
-
466
- ## Parallel Execution Model
467
-
468
- ```
469
- ┌─────────────────────────────────────────────────────────────────┐
470
- │ Orchestrator │
471
- ├─────────────────────────────────────────────────────────────────┤
472
- │ 0. Validate QUEUE_ID (required, or prompt user to select) │
473
- │ │
474
- │ 0.5 (if --worktree) Create ONE worktree for entire queue │
475
- │ → .ccw/worktrees/queue-exec-<queue-id> │
476
- │ │
477
- │ 1. ccw issue queue dag --queue ${QUEUE_ID} │
478
- │ → { parallel_batches: [["S-1","S-2"], ["S-3"]] } │
479
- │ │
480
- │ 2. Dispatch batch 1 (parallel, SAME worktree): │
481
- │ ┌──────────────────────────────────────────────────────┐ │
482
- │ │ Shared Queue Worktree (or main) │ │
483
- │ │ ┌──────────────────┐ ┌──────────────────┐ │ │
484
- │ │ │ Executor 1 │ │ Executor 2 │ │ │
485
- │ │ │ detail S-1 │ │ detail S-2 │ │ │
486
- │ │ │ [T1→T2→T3] │ │ [T1→T2] │ │ │
487
- │ │ │ commit S-1 │ │ commit S-2 │ │ │
488
- │ │ │ done S-1 │ │ done S-2 │ │ │
489
- │ │ └──────────────────┘ └──────────────────┘ │ │
490
- │ └──────────────────────────────────────────────────────┘ │
491
- │ │
492
- │ 3. ccw issue queue dag (refresh) │
493
- │ → S-3 now ready → dispatch batch 2 (same worktree) │
494
- │ │
495
- │ 4. (if --worktree) ALL batches complete → cleanup worktree │
496
- │ → Prompt: Create PR / Merge to main / Keep branch │
497
- └─────────────────────────────────────────────────────────────────┘
498
- ```
499
-
500
- **Why this works for parallel:**
501
- - **ONE worktree for entire queue** → all solutions share same isolated workspace
502
- - `detail <id>` is READ-ONLY → no race conditions
503
- - Each executor handles **all tasks within a solution** sequentially
504
- - **One commit per solution** with formatted summary (not per-task)
505
- - `done <id>` updates only its own solution status
506
- - `queue dag` recalculates ready solutions after each batch
507
- - Solutions in same batch have NO file conflicts (DAG guarantees)
508
- - **Main workspace stays clean** until merge/PR decision
509
-
510
- ## CLI Endpoint Contract
511
-
512
- ### `ccw issue queue list --brief --json`
513
- Returns queue index for selection (used when --queue not provided):
514
- ```json
515
- {
516
- "active_queue_id": "QUE-20251215-001",
517
- "queues": [
518
- { "id": "QUE-20251215-001", "status": "active", "issue_ids": ["ISS-001"], "total_solutions": 5, "completed_solutions": 2 }
519
- ]
520
- }
521
- ```
522
-
523
- ### `ccw issue queue dag --queue <queue-id>`
524
- Returns dependency graph with parallel batches (solution-level, **--queue required**):
525
- ```json
526
- {
527
- "queue_id": "QUE-...",
528
- "total": 3,
529
- "ready_count": 2,
530
- "completed_count": 0,
531
- "nodes": [
532
- { "id": "S-1", "issue_id": "ISS-xxx", "status": "pending", "ready": true, "task_count": 3 },
533
- { "id": "S-2", "issue_id": "ISS-yyy", "status": "pending", "ready": true, "task_count": 2 },
534
- { "id": "S-3", "issue_id": "ISS-zzz", "status": "pending", "ready": false, "depends_on": ["S-1"] }
535
- ],
536
- "parallel_batches": [["S-1", "S-2"], ["S-3"]]
537
- }
538
- ```
539
-
540
- ### `ccw issue detail <item_id>`
541
- Returns FULL SOLUTION with all tasks (READ-ONLY):
542
- ```json
543
- {
544
- "item_id": "S-1",
545
- "issue_id": "ISS-xxx",
546
- "solution_id": "SOL-xxx",
547
- "status": "pending",
548
- "solution": {
549
- "id": "SOL-xxx",
550
- "approach": "...",
551
- "tasks": [
552
- { "id": "T1", "title": "...", "implementation": [...], "test": {...} },
553
- { "id": "T2", "title": "...", "implementation": [...], "test": {...} },
554
- { "id": "T3", "title": "...", "implementation": [...], "test": {...} }
555
- ],
556
- "exploration_context": { "relevant_files": [...] }
557
- },
558
- "execution_hints": { "executor": "codex", "estimated_minutes": 180 }
559
- }
560
- ```
561
-
562
- ### `ccw issue done <item_id>`
563
- Marks solution completed/failed, updates queue state, checks for queue completion.
564
-
565
- ## Error Handling
566
-
567
- | Error | Resolution |
568
- |-------|------------|
569
- | No queue | Run /issue:queue first |
570
- | No ready solutions | Dependencies blocked, check DAG |
571
- | Executor timeout | Solution not marked done, can retry |
572
- | Solution failure | Use `ccw issue retry` to reset |
573
- | Partial task failure | Executor reports which task failed via `done --fail` |
574
-
575
- ## Related Commands
576
-
577
- - `/issue:plan` - Plan issues with solutions
578
- - `/issue:queue` - Form execution queue
579
- - `ccw issue queue dag` - View dependency graph
580
- - `ccw issue detail <id>` - View task details
581
- - `ccw issue retry` - Reset failed tasks
1
+ ---
2
+ name: execute
3
+ description: Execute queue with DAG-based parallel orchestration (one commit per solution)
4
+ argument-hint: "--queue <queue-id> [--worktree [<existing-path>]]"
5
+ allowed-tools: TodoWrite(*), Bash(*), Read(*), AskUserQuestion(*)
6
+ ---
7
+
8
+ # Issue Execute Command (/issue:execute)
9
+
10
+ ## Overview
11
+
12
+ Minimal orchestrator that dispatches **solution IDs** to executors. Each executor receives a complete solution with all its tasks.
13
+
14
+ **Design Principles:**
15
+ - `queue dag` → returns parallel batches with solution IDs (S-1, S-2, ...)
16
+ - `detail <id>` → READ-ONLY solution fetch (returns full solution with all tasks)
17
+ - `done <id>` → update solution completion status
18
+ - No race conditions: status changes only via `done`
19
+ - **Executor handles all tasks within a solution sequentially**
20
+ - **Single worktree for entire queue**: One worktree isolates ALL queue execution from main workspace
21
+
22
+ ## Queue ID Requirement (MANDATORY)
23
+
24
+ **Queue ID is REQUIRED.** You MUST specify which queue to execute via `--queue <queue-id>`.
25
+
26
+ ### If Queue ID Not Provided
27
+
28
+ When `--queue` parameter is missing, you MUST:
29
+
30
+ 1. **List available queues** by running:
31
+ ```javascript
32
+ const result = Bash('ccw issue queue list --brief --json');
33
+ const index = JSON.parse(result);
34
+ ```
35
+
36
+ 2. **Display available queues** to user:
37
+ ```
38
+ Available Queues:
39
+ ID Status Progress Issues
40
+ -----------------------------------------------------------
41
+ → QUE-20251215-001 active 3/10 ISS-001, ISS-002
42
+ QUE-20251210-002 active 0/5 ISS-003
43
+ QUE-20251205-003 completed 8/8 ISS-004
44
+ ```
45
+
46
+ 3. **Stop and ask user** to specify which queue to execute:
47
+ ```javascript
48
+ AskUserQuestion({
49
+ questions: [{
50
+ question: "Which queue would you like to execute?",
51
+ header: "Queue",
52
+ multiSelect: false,
53
+ options: index.queues
54
+ .filter(q => q.status === 'active')
55
+ .map(q => ({
56
+ label: q.id,
57
+ description: `${q.status}, ${q.completed_solutions || 0}/${q.total_solutions || 0} completed, Issues: ${q.issue_ids.join(', ')}`
58
+ }))
59
+ }]
60
+ })
61
+ ```
62
+
63
+ 4. **After user selection**, continue execution with the selected queue ID.
64
+
65
+ **DO NOT auto-select queues.** Explicit user confirmation is required to prevent accidental execution of wrong queue.
66
+
67
+ ## Usage
68
+
69
+ ```bash
70
+ /issue:execute --queue QUE-xxx # Execute specific queue (REQUIRED)
71
+ /issue:execute --queue QUE-xxx --worktree # Execute in isolated worktree
72
+ /issue:execute --queue QUE-xxx --worktree /path/to/existing/worktree # Resume
73
+ ```
74
+
75
+ **Parallelism**: Determined automatically by task dependency DAG (no manual control)
76
+ **Executor & Dry-run**: Selected via interactive prompt (AskUserQuestion)
77
+ **Worktree**: Creates ONE worktree for the entire queue execution (not per-solution)
78
+
79
+ **⭐ Recommended Executor**: **Codex** - Best for long-running autonomous work (2hr timeout), supports background execution and full write access
80
+
81
+ **Worktree Options**:
82
+ - `--worktree` - Create a new worktree with timestamp-based name
83
+ - `--worktree <existing-path>` - Resume in an existing worktree (for recovery/continuation)
84
+
85
+ **Resume**: Use `git worktree list` to find existing worktrees from interrupted executions
86
+
87
+ ## Execution Flow
88
+
89
+ ```
90
+ Phase 0: Validate Queue ID (REQUIRED)
91
+ ├─ If --queue provided → use specified queue
92
+ ├─ If --queue missing → list queues, prompt user to select
93
+ └─ Store QUEUE_ID for all subsequent commands
94
+
95
+ Phase 0.5 (if --worktree): Setup Queue Worktree
96
+ ├─ Create ONE worktree for entire queue: .ccw/worktrees/queue-<timestamp>
97
+ ├─ All subsequent execution happens in this worktree
98
+ └─ Main workspace remains clean and untouched
99
+
100
+ Phase 1: Get DAG & User Selection
101
+ ├─ ccw issue queue dag --queue ${QUEUE_ID} → { parallel_batches: [["S-1","S-2"], ["S-3"]] }
102
+ └─ AskUserQuestion → executor type (codex|gemini|agent), dry-run mode, worktree mode
103
+
104
+ Phase 2: Dispatch Parallel Batch (DAG-driven)
105
+ ├─ Parallelism determined by DAG (no manual limit)
106
+ ├─ All executors work in the SAME worktree (or main if no worktree)
107
+ ├─ For each solution ID in batch (parallel - all at once):
108
+ │ ├─ Executor calls: ccw issue detail <id> (READ-ONLY)
109
+ │ ├─ Executor gets FULL SOLUTION with all tasks
110
+ │ ├─ Executor implements all tasks sequentially (T1 → T2 → T3)
111
+ │ ├─ Executor tests + verifies each task
112
+ │ ├─ Executor commits ONCE per solution (with formatted summary)
113
+ │ └─ Executor calls: ccw issue done <id>
114
+ └─ Wait for batch completion
115
+
116
+ Phase 3: Next Batch (repeat Phase 2)
117
+ └─ ccw issue queue dag → check for newly-ready solutions
118
+
119
+ Phase 4 (if --worktree): Worktree Completion
120
+ ├─ All batches complete → prompt for merge strategy
121
+ └─ Options: Create PR / Merge to main / Keep branch
122
+ ```
123
+
124
+ ## Implementation
125
+
126
+ ### Phase 0: Validate Queue ID
127
+
128
+ ```javascript
129
+ // Check if --queue was provided
130
+ let QUEUE_ID = args.queue;
131
+
132
+ if (!QUEUE_ID) {
133
+ // List available queues
134
+ const listResult = Bash('ccw issue queue list --brief --json').trim();
135
+ const index = JSON.parse(listResult);
136
+
137
+ if (index.queues.length === 0) {
138
+ console.log('No queues found. Use /issue:queue to create one first.');
139
+ return;
140
+ }
141
+
142
+ // Filter active queues only
143
+ const activeQueues = index.queues.filter(q => q.status === 'active');
144
+
145
+ if (activeQueues.length === 0) {
146
+ console.log('No active queues found.');
147
+ console.log('Available queues:', index.queues.map(q => `${q.id} (${q.status})`).join(', '));
148
+ return;
149
+ }
150
+
151
+ // Display and prompt user
152
+ console.log('\nAvailable Queues:');
153
+ console.log('ID'.padEnd(22) + 'Status'.padEnd(12) + 'Progress'.padEnd(12) + 'Issues');
154
+ console.log('-'.repeat(70));
155
+ for (const q of index.queues) {
156
+ const marker = q.id === index.active_queue_id ? '→ ' : ' ';
157
+ console.log(marker + q.id.padEnd(20) + q.status.padEnd(12) +
158
+ `${q.completed_solutions || 0}/${q.total_solutions || 0}`.padEnd(12) +
159
+ q.issue_ids.join(', '));
160
+ }
161
+
162
+ const answer = AskUserQuestion({
163
+ questions: [{
164
+ question: "Which queue would you like to execute?",
165
+ header: "Queue",
166
+ multiSelect: false,
167
+ options: activeQueues.map(q => ({
168
+ label: q.id,
169
+ description: `${q.completed_solutions || 0}/${q.total_solutions || 0} completed, Issues: ${q.issue_ids.join(', ')}`
170
+ }))
171
+ }]
172
+ });
173
+
174
+ QUEUE_ID = answer['Queue'];
175
+ }
176
+
177
+ console.log(`\n## Executing Queue: ${QUEUE_ID}\n`);
178
+ ```
179
+
180
+ ### Phase 1: Get DAG & User Selection
181
+
182
+ ```javascript
183
+ // Get dependency graph and parallel batches (QUEUE_ID required)
184
+ const dagJson = Bash(`ccw issue queue dag --queue ${QUEUE_ID}`).trim();
185
+ const dag = JSON.parse(dagJson);
186
+
187
+ if (dag.error || dag.ready_count === 0) {
188
+ console.log(dag.error || 'No solutions ready for execution');
189
+ console.log('Use /issue:queue to form a queue first');
190
+ return;
191
+ }
192
+
193
+ console.log(`
194
+ ## Queue DAG (Solution-Level)
195
+
196
+ - Total Solutions: ${dag.total}
197
+ - Ready: ${dag.ready_count}
198
+ - Completed: ${dag.completed_count}
199
+ - Parallel in batch 1: ${dag.parallel_batches[0]?.length || 0}
200
+ `);
201
+
202
+ // Interactive selection via AskUserQuestion
203
+ const answer = AskUserQuestion({
204
+ questions: [
205
+ {
206
+ question: 'Select executor type:',
207
+ header: 'Executor',
208
+ multiSelect: false,
209
+ options: [
210
+ { label: 'Codex (Recommended)', description: 'Autonomous coding with full write access' },
211
+ { label: 'Gemini', description: 'Large context analysis and implementation' },
212
+ { label: 'Agent', description: 'Claude Code sub-agent for complex tasks' }
213
+ ]
214
+ },
215
+ {
216
+ question: 'Execution mode:',
217
+ header: 'Mode',
218
+ multiSelect: false,
219
+ options: [
220
+ { label: 'Execute (Recommended)', description: 'Run all ready solutions' },
221
+ { label: 'Dry-run', description: 'Show DAG and batches without executing' }
222
+ ]
223
+ },
224
+ {
225
+ question: 'Use git worktree for queue isolation?',
226
+ header: 'Worktree',
227
+ multiSelect: false,
228
+ options: [
229
+ { label: 'Yes (Recommended)', description: 'Create ONE worktree for entire queue - main stays clean' },
230
+ { label: 'No', description: 'Work directly in current directory' }
231
+ ]
232
+ }
233
+ ]
234
+ });
235
+
236
+ const executor = answer['Executor'].toLowerCase().split(' ')[0]; // codex|gemini|agent
237
+ const isDryRun = answer['Mode'].includes('Dry-run');
238
+ const useWorktree = answer['Worktree'].includes('Yes');
239
+
240
+ // Dry run mode
241
+ if (isDryRun) {
242
+ console.log('### Parallel Batches (Dry-run):\n');
243
+ dag.parallel_batches.forEach((batch, i) => {
244
+ console.log(`Batch ${i + 1}: ${batch.join(', ')}`);
245
+ });
246
+ return;
247
+ }
248
+ ```
249
+
250
+ ### Phase 0 & 2: Setup Queue Worktree & Dispatch
251
+
252
+ ```javascript
253
+ // Parallelism determined by DAG - no manual limit
254
+ // All solutions in same batch have NO file conflicts and can run in parallel
255
+ const batch = dag.parallel_batches[0] || [];
256
+
257
+ // Initialize TodoWrite
258
+ TodoWrite({
259
+ todos: batch.map(id => ({
260
+ content: `Execute solution ${id}`,
261
+ status: 'pending',
262
+ activeForm: `Executing solution ${id}`
263
+ }))
264
+ });
265
+
266
+ console.log(`\n### Executing Solutions (DAG batch 1): ${batch.join(', ')}`);
267
+
268
+ // Parse existing worktree path from args if provided
269
+ // Example: --worktree /path/to/existing/worktree
270
+ const existingWorktree = args.worktree && typeof args.worktree === 'string' ? args.worktree : null;
271
+
272
+ // Setup ONE worktree for entire queue (not per-solution)
273
+ let worktreePath = null;
274
+ let worktreeBranch = null;
275
+
276
+ if (useWorktree) {
277
+ const repoRoot = Bash('git rev-parse --show-toplevel').trim();
278
+ const worktreeBase = `${repoRoot}/.ccw/worktrees`;
279
+ Bash(`mkdir -p "${worktreeBase}"`);
280
+ Bash('git worktree prune'); // Cleanup stale worktrees
281
+
282
+ if (existingWorktree) {
283
+ // Resume mode: Use existing worktree
284
+ worktreePath = existingWorktree;
285
+ worktreeBranch = Bash(`git -C "${worktreePath}" branch --show-current`).trim();
286
+ console.log(`Resuming in existing worktree: ${worktreePath} (branch: ${worktreeBranch})`);
287
+ } else {
288
+ // Create mode: ONE worktree for the entire queue
289
+ const timestamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14);
290
+ worktreeBranch = `queue-exec-${dag.queue_id || timestamp}`;
291
+ worktreePath = `${worktreeBase}/${worktreeBranch}`;
292
+ Bash(`git worktree add "${worktreePath}" -b "${worktreeBranch}"`);
293
+ console.log(`Created queue worktree: ${worktreePath}`);
294
+ }
295
+ }
296
+
297
+ // Launch ALL solutions in batch in parallel (DAG guarantees no conflicts)
298
+ // All executors work in the SAME worktree (or main if no worktree)
299
+ const executions = batch.map(solutionId => {
300
+ updateTodo(solutionId, 'in_progress');
301
+ return dispatchExecutor(solutionId, executor, worktreePath);
302
+ });
303
+
304
+ await Promise.all(executions);
305
+ batch.forEach(id => updateTodo(id, 'completed'));
306
+ ```
307
+
308
+ ### Executor Dispatch
309
+
310
+ ```javascript
311
+ // worktreePath: path to shared worktree (null if not using worktree)
312
+ function dispatchExecutor(solutionId, executorType, worktreePath = null) {
313
+ // If worktree is provided, executor works in that directory
314
+ // No per-solution worktree creation - ONE worktree for entire queue
315
+ const cdCommand = worktreePath ? `cd "${worktreePath}"` : '';
316
+
317
+ const prompt = `
318
+ ## Execute Solution ${solutionId}
319
+ ${worktreePath ? `
320
+ ### Step 0: Enter Queue Worktree
321
+ \`\`\`bash
322
+ cd "${worktreePath}"
323
+ \`\`\`
324
+ ` : ''}
325
+ ### Step 1: Get Solution (read-only)
326
+ \`\`\`bash
327
+ ccw issue detail ${solutionId}
328
+ \`\`\`
329
+
330
+ ### Step 2: Execute All Tasks Sequentially
331
+ The detail command returns a FULL SOLUTION with all tasks.
332
+ Execute each task in order (T1 → T2 → T3 → ...):
333
+
334
+ For each task:
335
+ 1. Follow task.implementation steps
336
+ 2. Run task.test commands
337
+ 3. Verify task.acceptance criteria
338
+ (Do NOT commit after each task)
339
+
340
+ ### Step 3: Commit Solution (Once)
341
+ After ALL tasks pass, commit once with formatted summary:
342
+ \`\`\`bash
343
+ git add <all-modified-files>
344
+ git commit -m "[type](scope): [solution.description]
345
+
346
+ ## Solution Summary
347
+ - Solution-ID: ${solutionId}
348
+ - Tasks: T1, T2, ...
349
+
350
+ ## Tasks Completed
351
+ - [T1] task1.title: action
352
+ - [T2] task2.title: action
353
+
354
+ ## Files Modified
355
+ - file1.ts
356
+ - file2.ts
357
+
358
+ ## Verification
359
+ - All tests passed
360
+ - All acceptance criteria verified"
361
+ \`\`\`
362
+
363
+ ### Step 4: Report Completion
364
+ \`\`\`bash
365
+ ccw issue done ${solutionId} --result '{"summary": "...", "files_modified": [...], "commit": {"hash": "...", "type": "feat"}, "tasks_completed": N}'
366
+ \`\`\`
367
+
368
+ If any task failed:
369
+ \`\`\`bash
370
+ ccw issue done ${solutionId} --fail --reason '{"task_id": "TX", "error_type": "test_failure", "message": "..."}'
371
+ \`\`\`
372
+
373
+ **Note**: Do NOT cleanup worktree after this solution. Worktree is shared by all solutions in the queue.
374
+ `;
375
+
376
+ // For CLI tools, pass --cd to set working directory
377
+ const cdOption = worktreePath ? ` --cd "${worktreePath}"` : '';
378
+
379
+ if (executorType === 'codex') {
380
+ return Bash(
381
+ `ccw cli -p "${escapePrompt(prompt)}" --tool codex --mode write --id exec-${solutionId}${cdOption}`,
382
+ { timeout: 7200000, run_in_background: true } // 2hr for full solution
383
+ );
384
+ } else if (executorType === 'gemini') {
385
+ return Bash(
386
+ `ccw cli -p "${escapePrompt(prompt)}" --tool gemini --mode write --id exec-${solutionId}${cdOption}`,
387
+ { timeout: 3600000, run_in_background: true }
388
+ );
389
+ } else {
390
+ return Task({
391
+ subagent_type: 'code-developer',
392
+ run_in_background: false,
393
+ description: `Execute solution ${solutionId}`,
394
+ prompt: worktreePath ? `Working directory: ${worktreePath}\n\n${prompt}` : prompt
395
+ });
396
+ }
397
+ }
398
+ ```
399
+
400
+ ### Phase 3: Check Next Batch
401
+
402
+ ```javascript
403
+ // Refresh DAG after batch completes (use same QUEUE_ID)
404
+ const refreshedDag = JSON.parse(Bash(`ccw issue queue dag --queue ${QUEUE_ID}`).trim());
405
+
406
+ console.log(`
407
+ ## Batch Complete
408
+
409
+ - Solutions Completed: ${refreshedDag.completed_count}/${refreshedDag.total}
410
+ - Next ready: ${refreshedDag.ready_count}
411
+ `);
412
+
413
+ if (refreshedDag.ready_count > 0) {
414
+ console.log(`Run \`/issue:execute --queue ${QUEUE_ID}\` again for next batch.`);
415
+ // Note: If resuming, pass existing worktree path:
416
+ // /issue:execute --queue ${QUEUE_ID} --worktree <worktreePath>
417
+ }
418
+ ```
419
+
420
+ ### Phase 4: Worktree Completion (after ALL batches)
421
+
422
+ ```javascript
423
+ // Only run when ALL solutions completed AND using worktree
424
+ if (useWorktree && refreshedDag.ready_count === 0 && refreshedDag.completed_count === refreshedDag.total) {
425
+ console.log('\n## All Solutions Completed - Worktree Cleanup');
426
+
427
+ const answer = AskUserQuestion({
428
+ questions: [{
429
+ question: `Queue complete. What to do with worktree branch "${worktreeBranch}"?`,
430
+ header: 'Merge',
431
+ multiSelect: false,
432
+ options: [
433
+ { label: 'Create PR (Recommended)', description: 'Push branch and create pull request' },
434
+ { label: 'Merge to main', description: 'Merge all commits and cleanup worktree' },
435
+ { label: 'Keep branch', description: 'Cleanup worktree, keep branch for manual handling' }
436
+ ]
437
+ }]
438
+ });
439
+
440
+ const repoRoot = Bash('git rev-parse --show-toplevel').trim();
441
+
442
+ if (answer['Merge'].includes('Create PR')) {
443
+ Bash(`git -C "${worktreePath}" push -u origin "${worktreeBranch}"`);
444
+ Bash(`gh pr create --title "Queue ${dag.queue_id}" --body "Issue queue execution - all solutions completed" --head "${worktreeBranch}"`);
445
+ Bash(`git worktree remove "${worktreePath}"`);
446
+ console.log(`PR created for branch: ${worktreeBranch}`);
447
+ } else if (answer['Merge'].includes('Merge to main')) {
448
+ // Check main is clean
449
+ const mainDirty = Bash('git status --porcelain').trim();
450
+ if (mainDirty) {
451
+ console.log('Warning: Main has uncommitted changes. Falling back to PR.');
452
+ Bash(`git -C "${worktreePath}" push -u origin "${worktreeBranch}"`);
453
+ Bash(`gh pr create --title "Queue ${dag.queue_id}" --body "Issue queue execution (main had uncommitted changes)" --head "${worktreeBranch}"`);
454
+ } else {
455
+ Bash(`git merge --no-ff "${worktreeBranch}" -m "Merge queue ${dag.queue_id}"`);
456
+ Bash(`git branch -d "${worktreeBranch}"`);
457
+ }
458
+ Bash(`git worktree remove "${worktreePath}"`);
459
+ } else {
460
+ Bash(`git worktree remove "${worktreePath}"`);
461
+ console.log(`Branch ${worktreeBranch} kept for manual handling`);
462
+ }
463
+ }
464
+ ```
465
+
466
+ ## Parallel Execution Model
467
+
468
+ ```
469
+ ┌─────────────────────────────────────────────────────────────────┐
470
+ │ Orchestrator │
471
+ ├─────────────────────────────────────────────────────────────────┤
472
+ │ 0. Validate QUEUE_ID (required, or prompt user to select) │
473
+ │ │
474
+ │ 0.5 (if --worktree) Create ONE worktree for entire queue │
475
+ │ → .ccw/worktrees/queue-exec-<queue-id> │
476
+ │ │
477
+ │ 1. ccw issue queue dag --queue ${QUEUE_ID} │
478
+ │ → { parallel_batches: [["S-1","S-2"], ["S-3"]] } │
479
+ │ │
480
+ │ 2. Dispatch batch 1 (parallel, SAME worktree): │
481
+ │ ┌──────────────────────────────────────────────────────┐ │
482
+ │ │ Shared Queue Worktree (or main) │ │
483
+ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │
484
+ │ │ │ Executor 1 │ │ Executor 2 │ │ │
485
+ │ │ │ detail S-1 │ │ detail S-2 │ │ │
486
+ │ │ │ [T1→T2→T3] │ │ [T1→T2] │ │ │
487
+ │ │ │ commit S-1 │ │ commit S-2 │ │ │
488
+ │ │ │ done S-1 │ │ done S-2 │ │ │
489
+ │ │ └──────────────────┘ └──────────────────┘ │ │
490
+ │ └──────────────────────────────────────────────────────┘ │
491
+ │ │
492
+ │ 3. ccw issue queue dag (refresh) │
493
+ │ → S-3 now ready → dispatch batch 2 (same worktree) │
494
+ │ │
495
+ │ 4. (if --worktree) ALL batches complete → cleanup worktree │
496
+ │ → Prompt: Create PR / Merge to main / Keep branch │
497
+ └─────────────────────────────────────────────────────────────────┘
498
+ ```
499
+
500
+ **Why this works for parallel:**
501
+ - **ONE worktree for entire queue** → all solutions share same isolated workspace
502
+ - `detail <id>` is READ-ONLY → no race conditions
503
+ - Each executor handles **all tasks within a solution** sequentially
504
+ - **One commit per solution** with formatted summary (not per-task)
505
+ - `done <id>` updates only its own solution status
506
+ - `queue dag` recalculates ready solutions after each batch
507
+ - Solutions in same batch have NO file conflicts (DAG guarantees)
508
+ - **Main workspace stays clean** until merge/PR decision
509
+
510
+ ## CLI Endpoint Contract
511
+
512
+ ### `ccw issue queue list --brief --json`
513
+ Returns queue index for selection (used when --queue not provided):
514
+ ```json
515
+ {
516
+ "active_queue_id": "QUE-20251215-001",
517
+ "queues": [
518
+ { "id": "QUE-20251215-001", "status": "active", "issue_ids": ["ISS-001"], "total_solutions": 5, "completed_solutions": 2 }
519
+ ]
520
+ }
521
+ ```
522
+
523
+ ### `ccw issue queue dag --queue <queue-id>`
524
+ Returns dependency graph with parallel batches (solution-level, **--queue required**):
525
+ ```json
526
+ {
527
+ "queue_id": "QUE-...",
528
+ "total": 3,
529
+ "ready_count": 2,
530
+ "completed_count": 0,
531
+ "nodes": [
532
+ { "id": "S-1", "issue_id": "ISS-xxx", "status": "pending", "ready": true, "task_count": 3 },
533
+ { "id": "S-2", "issue_id": "ISS-yyy", "status": "pending", "ready": true, "task_count": 2 },
534
+ { "id": "S-3", "issue_id": "ISS-zzz", "status": "pending", "ready": false, "depends_on": ["S-1"] }
535
+ ],
536
+ "parallel_batches": [["S-1", "S-2"], ["S-3"]]
537
+ }
538
+ ```
539
+
540
+ ### `ccw issue detail <item_id>`
541
+ Returns FULL SOLUTION with all tasks (READ-ONLY):
542
+ ```json
543
+ {
544
+ "item_id": "S-1",
545
+ "issue_id": "ISS-xxx",
546
+ "solution_id": "SOL-xxx",
547
+ "status": "pending",
548
+ "solution": {
549
+ "id": "SOL-xxx",
550
+ "approach": "...",
551
+ "tasks": [
552
+ { "id": "T1", "title": "...", "implementation": [...], "test": {...} },
553
+ { "id": "T2", "title": "...", "implementation": [...], "test": {...} },
554
+ { "id": "T3", "title": "...", "implementation": [...], "test": {...} }
555
+ ],
556
+ "exploration_context": { "relevant_files": [...] }
557
+ },
558
+ "execution_hints": { "executor": "codex", "estimated_minutes": 180 }
559
+ }
560
+ ```
561
+
562
+ ### `ccw issue done <item_id>`
563
+ Marks solution completed/failed, updates queue state, checks for queue completion.
564
+
565
+ ## Error Handling
566
+
567
+ | Error | Resolution |
568
+ |-------|------------|
569
+ | No queue | Run /issue:queue first |
570
+ | No ready solutions | Dependencies blocked, check DAG |
571
+ | Executor timeout | Solution not marked done, can retry |
572
+ | Solution failure | Use `ccw issue retry` to reset |
573
+ | Partial task failure | Executor reports which task failed via `done --fail` |
574
+
575
+ ## Related Commands
576
+
577
+ - `/issue:plan` - Plan issues with solutions
578
+ - `/issue:queue` - Form execution queue
579
+ - `ccw issue queue dag` - View dependency graph
580
+ - `ccw issue detail <id>` - View task details
581
+ - `ccw issue retry` - Reset failed tasks