claude-code-workflow 7.2.28 → 7.2.30

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 (348) hide show
  1. package/.ccw/workflows/cli-templates/schemas/plan-overview-base-schema.json +2 -2
  2. package/.ccw/workflows/cli-templates/schemas/task-schema.json +14 -7
  3. package/.claude/agents/action-planning-agent.md +7 -4
  4. package/.claude/agents/cli-explore-agent.md +77 -63
  5. package/.claude/agents/cli-lite-planning-agent.md +11 -10
  6. package/.claude/agents/issue-plan-agent.md +421 -426
  7. package/.claude/commands/workflow/spec/setup.md +1 -1
  8. package/.claude/skills/ccw-chain/SKILL.md +119 -0
  9. package/.claude/skills/ccw-chain/chains/ccw-cycle.json +21 -0
  10. package/.claude/skills/ccw-chain/chains/ccw-exploration.json +47 -0
  11. package/.claude/skills/ccw-chain/chains/ccw-issue.json +33 -0
  12. package/.claude/skills/ccw-chain/chains/ccw-lightweight.json +57 -0
  13. package/.claude/skills/ccw-chain/chains/ccw-main.json +52 -0
  14. package/.claude/skills/ccw-chain/chains/ccw-standard.json +39 -0
  15. package/.claude/skills/ccw-chain/chains/ccw-team.json +10 -0
  16. package/.claude/skills/ccw-chain/chains/ccw-with-file.json +31 -0
  17. package/.claude/skills/ccw-chain/phases/analyze-with-file.md +788 -0
  18. package/.claude/skills/ccw-chain/phases/brainstorm/SKILL.md +408 -0
  19. package/.claude/skills/ccw-chain/phases/brainstorm/phases/01-mode-routing.md +207 -0
  20. package/.claude/skills/ccw-chain/phases/brainstorm/phases/02-artifacts.md +567 -0
  21. package/.claude/skills/ccw-chain/phases/brainstorm/phases/03-role-analysis.md +748 -0
  22. package/.claude/skills/ccw-chain/phases/brainstorm/phases/04-synthesis.md +827 -0
  23. package/.claude/skills/ccw-chain/phases/brainstorm-with-file.md +482 -0
  24. package/.claude/skills/ccw-chain/phases/collaborative-plan-with-file.md +639 -0
  25. package/.claude/skills/ccw-chain/phases/debug-with-file.md +656 -0
  26. package/.claude/skills/ccw-chain/phases/integration-test-cycle.md +936 -0
  27. package/.claude/skills/ccw-chain/phases/issue-convert-to-plan.md +720 -0
  28. package/.claude/skills/ccw-chain/phases/issue-discover.md +483 -0
  29. package/.claude/skills/ccw-chain/phases/issue-execute.md +629 -0
  30. package/.claude/skills/ccw-chain/phases/issue-from-brainstorm.md +382 -0
  31. package/.claude/skills/ccw-chain/phases/issue-plan.md +343 -0
  32. package/.claude/skills/ccw-chain/phases/issue-queue.md +464 -0
  33. package/.claude/skills/ccw-chain/phases/refactor-cycle.md +852 -0
  34. package/.claude/skills/ccw-chain/phases/review-cycle/SKILL.md +132 -0
  35. package/.claude/skills/ccw-chain/phases/review-cycle/phases/review-fix.md +760 -0
  36. package/.claude/skills/ccw-chain/phases/review-cycle/phases/review-module.md +764 -0
  37. package/.claude/skills/ccw-chain/phases/review-cycle/phases/review-session.md +775 -0
  38. package/.claude/skills/ccw-chain/phases/roadmap-with-file.md +544 -0
  39. package/.claude/skills/ccw-chain/phases/spec-generator/SKILL.md +338 -0
  40. package/.claude/skills/ccw-chain/phases/spec-generator/phases/01-5-requirement-clarification.md +404 -0
  41. package/.claude/skills/ccw-chain/phases/spec-generator/phases/01-discovery.md +257 -0
  42. package/.claude/skills/ccw-chain/phases/spec-generator/phases/02-product-brief.md +274 -0
  43. package/.claude/skills/ccw-chain/phases/spec-generator/phases/03-requirements.md +184 -0
  44. package/.claude/skills/ccw-chain/phases/spec-generator/phases/04-architecture.md +248 -0
  45. package/.claude/skills/ccw-chain/phases/spec-generator/phases/05-epics-stories.md +178 -0
  46. package/.claude/skills/ccw-chain/phases/spec-generator/phases/06-5-auto-fix.md +144 -0
  47. package/.claude/skills/ccw-chain/phases/spec-generator/phases/06-readiness-check.md +480 -0
  48. package/.claude/skills/ccw-chain/phases/team-planex.md +123 -0
  49. package/.claude/skills/ccw-chain/phases/ui-design-explore-auto.md +678 -0
  50. package/.claude/skills/ccw-chain/phases/unified-execute-with-file.md +870 -0
  51. package/.claude/skills/ccw-chain/phases/workflow-execute/SKILL.md +625 -0
  52. package/.claude/skills/ccw-chain/phases/workflow-execute/phases/06-review.md +215 -0
  53. package/.claude/skills/ccw-chain/phases/workflow-lite-plan.md +616 -0
  54. package/.claude/skills/ccw-chain/phases/workflow-multi-cli-plan.md +424 -0
  55. package/.claude/skills/ccw-chain/phases/workflow-plan/SKILL.md +466 -0
  56. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/01-session-discovery.md +99 -0
  57. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/02-context-gathering.md +338 -0
  58. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/03-conflict-resolution.md +422 -0
  59. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/04-task-generation.md +440 -0
  60. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/05-plan-verify.md +395 -0
  61. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/06-replan.md +594 -0
  62. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/SKILL.md +527 -0
  63. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/01-session-discovery.md +57 -0
  64. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/02-context-gathering.md +407 -0
  65. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/03-test-coverage-analysis.md +172 -0
  66. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/04-conflict-resolution.md +426 -0
  67. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/05-tdd-task-generation.md +473 -0
  68. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/06-tdd-structure-validation.md +189 -0
  69. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/07-tdd-verify.md +635 -0
  70. package/.claude/skills/ccw-chain/phases/workflow-test-fix/SKILL.md +482 -0
  71. package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/01-session-start.md +60 -0
  72. package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/02-test-context-gather.md +493 -0
  73. package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/03-test-concept-enhanced.md +150 -0
  74. package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/04-test-task-generate.md +346 -0
  75. package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/05-test-cycle-execute.md +538 -0
  76. package/.claude/skills/ccw-chain/specs/auto-mode.md +47 -0
  77. package/.claude/skills/ccw-chain/specs/intent-patterns.md +60 -0
  78. package/.claude/skills/chain-loader/SKILL.md +78 -0
  79. package/.claude/skills/chain-loader/phases/01-analyze-skill.md +53 -0
  80. package/.claude/skills/chain-loader/phases/02-design-graph.md +73 -0
  81. package/.claude/skills/chain-loader/phases/03-generate-validate.md +75 -0
  82. package/.claude/skills/chain-loader/specs/chain-schema.md +99 -0
  83. package/.claude/skills/chain-loader/specs/design-patterns.md +99 -0
  84. package/.claude/skills/chain-loader/templates/chain-json.md +63 -0
  85. package/.claude/skills/review-cycle/phases/review-module.md +764 -764
  86. package/.claude/skills/review-cycle/phases/review-session.md +775 -775
  87. package/.claude/skills/workflow-multi-cli-plan/SKILL.md +2 -2
  88. package/.claude/skills/workflow-plan/phases/03-conflict-resolution.md +422 -422
  89. package/.claude/skills/workflow-plan/phases/05-plan-verify.md +395 -395
  90. package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +407 -407
  91. package/.claude/skills/workflow-tdd-plan/phases/04-conflict-resolution.md +426 -426
  92. package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +493 -493
  93. package/.codex/skills/brainstorm/SKILL.md +3 -3
  94. package/.codex/skills/clean/SKILL.md +3 -3
  95. package/.codex/skills/issue-discover/SKILL.md +13 -13
  96. package/.codex/skills/issue-discover/phases/02-discover.md +4 -4
  97. package/.codex/skills/issue-discover/phases/03-discover-by-prompt.md +3 -3
  98. package/.codex/skills/parallel-dev-cycle/SKILL.md +4 -4
  99. package/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md +6 -6
  100. package/.codex/skills/parallel-dev-cycle/phases/03-result-aggregation.md +10 -10
  101. package/.codex/skills/review-cycle/SKILL.md +10 -10
  102. package/.codex/skills/review-cycle/phases/02-parallel-review.md +6 -6
  103. package/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md +4 -4
  104. package/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md +4 -4
  105. package/.codex/skills/review-cycle/phases/08-fix-execution.md +2 -2
  106. package/.codex/skills/roadmap-with-file/SKILL.md +14 -14
  107. package/.codex/skills/spec-generator/README.md +1 -1
  108. package/.codex/skills/spec-generator/SKILL.md +184 -88
  109. package/.codex/skills/spec-generator/phases/01-5-requirement-clarification.md +4 -7
  110. package/.codex/skills/spec-generator/phases/01-discovery.md +30 -11
  111. package/.codex/skills/spec-generator/phases/02-product-brief.md +2 -5
  112. package/.codex/skills/spec-generator/phases/03-requirements.md +4 -6
  113. package/.codex/skills/spec-generator/phases/04-architecture.md +4 -6
  114. package/.codex/skills/spec-generator/phases/05-epics-stories.md +4 -6
  115. package/.codex/skills/spec-generator/phases/06-5-auto-fix.md +4 -5
  116. package/.codex/skills/spec-generator/phases/06-readiness-check.md +8 -8
  117. package/.codex/skills/spec-generator/phases/07-issue-export.md +2 -2
  118. package/.codex/skills/spec-setup/SKILL.md +4 -4
  119. package/.codex/skills/workflow-plan/SKILL.md +6 -6
  120. package/.codex/skills/workflow-tdd-plan/SKILL.md +5 -5
  121. package/.codex/skills/workflow-test-fix-cycle/SKILL.md +19 -19
  122. package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +5 -5
  123. package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +5 -5
  124. package/README.md +14 -0
  125. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  126. package/ccw/dist/core/routes/litellm-api-routes.js +0 -23
  127. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  128. package/ccw/dist/tools/chain-loader.d.ts +10 -0
  129. package/ccw/dist/tools/chain-loader.d.ts.map +1 -0
  130. package/ccw/dist/tools/chain-loader.js +642 -0
  131. package/ccw/dist/tools/chain-loader.js.map +1 -0
  132. package/ccw/dist/tools/index.d.ts.map +1 -1
  133. package/ccw/dist/tools/index.js +2 -0
  134. package/ccw/dist/tools/index.js.map +1 -1
  135. package/ccw/dist/tools/json-builder.js +20 -0
  136. package/ccw/dist/tools/json-builder.js.map +1 -1
  137. package/ccw/dist/types/chain-types.d.ts +72 -0
  138. package/ccw/dist/types/chain-types.d.ts.map +1 -0
  139. package/ccw/dist/types/chain-types.js +5 -0
  140. package/ccw/dist/types/chain-types.js.map +1 -0
  141. package/ccw/frontend/dist/assets/{AlertDialog-BjP1ydDR.js → AlertDialog-exlTDW81.js} +3 -3
  142. package/ccw/frontend/dist/assets/{AlertDialog-BjP1ydDR.js.map → AlertDialog-exlTDW81.js.map} +1 -1
  143. package/ccw/frontend/dist/assets/{AnalysisPage-CAX3xqMf.js → AnalysisPage-cgV9LfAI.js} +2 -2
  144. package/ccw/frontend/dist/assets/{AnalysisPage-CAX3xqMf.js.map → AnalysisPage-cgV9LfAI.js.map} +1 -1
  145. package/ccw/frontend/dist/assets/{ApiSettingsPage-CtWlmztq.js → ApiSettingsPage-Dk5jJdWt.js} +2 -2
  146. package/ccw/frontend/dist/assets/{ApiSettingsPage-CtWlmztq.js.map → ApiSettingsPage-Dk5jJdWt.js.map} +1 -1
  147. package/ccw/frontend/dist/assets/{CliModeToggle-hR4a-eLX.js → CliModeToggle-Be9xsPiv.js} +2 -2
  148. package/ccw/frontend/dist/assets/{CliModeToggle-hR4a-eLX.js.map → CliModeToggle-Be9xsPiv.js.map} +1 -1
  149. package/ccw/frontend/dist/assets/{CliSessionSharePage-DzNPkFN9.js → CliSessionSharePage-Bh9jBtPI.js} +2 -2
  150. package/ccw/frontend/dist/assets/{CliSessionSharePage-DzNPkFN9.js.map → CliSessionSharePage-Bh9jBtPI.js.map} +1 -1
  151. package/ccw/frontend/dist/assets/{CliViewerPage-BPEGN4TT.js → CliViewerPage-BrE-oyEq.js} +2 -2
  152. package/ccw/frontend/dist/assets/{CliViewerPage-BPEGN4TT.js.map → CliViewerPage-BrE-oyEq.js.map} +1 -1
  153. package/ccw/frontend/dist/assets/{CodexLensPage-Cf0r2RHY.js → CodexLensPage-Cd3nrC93.js} +2 -2
  154. package/ccw/frontend/dist/assets/{CodexLensPage-Cf0r2RHY.js.map → CodexLensPage-Cd3nrC93.js.map} +1 -1
  155. package/ccw/frontend/dist/assets/{Collapsible-DEm1rJ4h.js → Collapsible-DXFl3VKF.js} +2 -2
  156. package/ccw/frontend/dist/assets/{Collapsible-DEm1rJ4h.js.map → Collapsible-DXFl3VKF.js.map} +1 -1
  157. package/ccw/frontend/dist/assets/{CommandsManagerPage-BpeWw8HO.js → CommandsManagerPage-IV8zpjgX.js} +2 -2
  158. package/ccw/frontend/dist/assets/{CommandsManagerPage-BpeWw8HO.js.map → CommandsManagerPage-IV8zpjgX.js.map} +1 -1
  159. package/ccw/frontend/dist/assets/{DeepWikiPage-BEsmh2vF.js → DeepWikiPage-CpDxtmRX.js} +2 -2
  160. package/ccw/frontend/dist/assets/{DeepWikiPage-BEsmh2vF.js.map → DeepWikiPage-CpDxtmRX.js.map} +1 -1
  161. package/ccw/frontend/dist/assets/{EndpointsPage-B30SFdtU.js → EndpointsPage-BchjWe7s.js} +2 -2
  162. package/ccw/frontend/dist/assets/{EndpointsPage-B30SFdtU.js.map → EndpointsPage-BchjWe7s.js.map} +1 -1
  163. package/ccw/frontend/dist/assets/{ExplorerPage-BVvMpg1O.js → ExplorerPage-CbWvaJ0y.js} +2 -2
  164. package/ccw/frontend/dist/assets/{ExplorerPage-BVvMpg1O.js.map → ExplorerPage-CbWvaJ0y.js.map} +1 -1
  165. package/ccw/frontend/dist/assets/{FixSessionPage-CL73dHbh.js → FixSessionPage-YMjVRiCk.js} +2 -2
  166. package/ccw/frontend/dist/assets/{FixSessionPage-CL73dHbh.js.map → FixSessionPage-YMjVRiCk.js.map} +1 -1
  167. package/ccw/frontend/dist/assets/{FloatingFileBrowser-BL-28lMZ.js → FloatingFileBrowser-JW2ehYY_.js} +2 -2
  168. package/ccw/frontend/dist/assets/{FloatingFileBrowser-BL-28lMZ.js.map → FloatingFileBrowser-JW2ehYY_.js.map} +1 -1
  169. package/ccw/frontend/dist/assets/{FloatingPanel-BzZDciHZ.js → FloatingPanel-BtqzqDVq.js} +2 -2
  170. package/ccw/frontend/dist/assets/{FloatingPanel-BzZDciHZ.js.map → FloatingPanel-BtqzqDVq.js.map} +1 -1
  171. package/ccw/frontend/dist/assets/{GraphExplorerPage-CDp6-d8P.js → GraphExplorerPage-BsJL_W4d.js} +3 -3
  172. package/ccw/frontend/dist/assets/{GraphExplorerPage-CDp6-d8P.js.map → GraphExplorerPage-BsJL_W4d.js.map} +1 -1
  173. package/ccw/frontend/dist/assets/{HistoryPage-fZY_7O9n.js → HistoryPage-BuWpQ7k5.js} +2 -2
  174. package/ccw/frontend/dist/assets/{HistoryPage-fZY_7O9n.js.map → HistoryPage-BuWpQ7k5.js.map} +1 -1
  175. package/ccw/frontend/dist/assets/{HookManagerPage-4LJeC9bq.js → HookManagerPage-D0BtMIWy.js} +2 -2
  176. package/ccw/frontend/dist/assets/{HookManagerPage-4LJeC9bq.js.map → HookManagerPage-D0BtMIWy.js.map} +1 -1
  177. package/ccw/frontend/dist/assets/{InstallationsPage-Bpigrbhw.js → InstallationsPage-C7dwsAKG.js} +2 -2
  178. package/ccw/frontend/dist/assets/{InstallationsPage-Bpigrbhw.js.map → InstallationsPage-C7dwsAKG.js.map} +1 -1
  179. package/ccw/frontend/dist/assets/{IssueHubPage-BP0zJc1R.js → IssueHubPage-D0nCNaeB.js} +2 -2
  180. package/ccw/frontend/dist/assets/{IssueHubPage-BP0zJc1R.js.map → IssueHubPage-D0nCNaeB.js.map} +1 -1
  181. package/ccw/frontend/dist/assets/{LiteTasksPage-CSt2oVKQ.js → LiteTasksPage-B5c2Kb9r.js} +3 -3
  182. package/ccw/frontend/dist/assets/{LiteTasksPage-CSt2oVKQ.js.map → LiteTasksPage-B5c2Kb9r.js.map} +1 -1
  183. package/ccw/frontend/dist/assets/{McpManagerPage-B-xaMA0w.js → McpManagerPage-C-S5CehM.js} +2 -2
  184. package/ccw/frontend/dist/assets/{McpManagerPage-B-xaMA0w.js.map → McpManagerPage-C-S5CehM.js.map} +1 -1
  185. package/ccw/frontend/dist/assets/{MemoryPage-CJqo_7DY.js → MemoryPage-P_B0JVUQ.js} +2 -2
  186. package/ccw/frontend/dist/assets/{MemoryPage-CJqo_7DY.js.map → MemoryPage-P_B0JVUQ.js.map} +1 -1
  187. package/ccw/frontend/dist/assets/{NotFoundPage-ibZeQA-Y.js → NotFoundPage-S4Jn9LUE.js} +2 -2
  188. package/ccw/frontend/dist/assets/{NotFoundPage-ibZeQA-Y.js.map → NotFoundPage-S4Jn9LUE.js.map} +1 -1
  189. package/ccw/frontend/dist/assets/{OrchestratorPage-DgJ4ctPQ.js → OrchestratorPage-C2Zlr7AC.js} +2 -2
  190. package/ccw/frontend/dist/assets/{OrchestratorPage-DgJ4ctPQ.js.map → OrchestratorPage-C2Zlr7AC.js.map} +1 -1
  191. package/ccw/frontend/dist/assets/{ProjectOverviewPage-Cit0Yq0D.js → ProjectOverviewPage-CMVfz8s5.js} +2 -2
  192. package/ccw/frontend/dist/assets/{ProjectOverviewPage-Cit0Yq0D.js.map → ProjectOverviewPage-CMVfz8s5.js.map} +1 -1
  193. package/ccw/frontend/dist/assets/{PromptHistoryPage-Ce1HDIK0.js → PromptHistoryPage-YEMjFARX.js} +3 -3
  194. package/ccw/frontend/dist/assets/{PromptHistoryPage-Ce1HDIK0.js.map → PromptHistoryPage-YEMjFARX.js.map} +1 -1
  195. package/ccw/frontend/dist/assets/{ReviewSessionPage-J1KikNrk.js → ReviewSessionPage-DnTm55nG.js} +2 -2
  196. package/ccw/frontend/dist/assets/{ReviewSessionPage-J1KikNrk.js.map → ReviewSessionPage-DnTm55nG.js.map} +1 -1
  197. package/ccw/frontend/dist/assets/{RulesManagerPage-CdBjTmth.js → RulesManagerPage-CUwebtO2.js} +2 -2
  198. package/ccw/frontend/dist/assets/{RulesManagerPage-CdBjTmth.js.map → RulesManagerPage-CUwebtO2.js.map} +1 -1
  199. package/ccw/frontend/dist/assets/{SessionDetailPage-B9ZK7LvX.js → SessionDetailPage-0qyH1Z5P.js} +2 -2
  200. package/ccw/frontend/dist/assets/{SessionDetailPage-B9ZK7LvX.js.map → SessionDetailPage-0qyH1Z5P.js.map} +1 -1
  201. package/ccw/frontend/dist/assets/{SessionsPage-CW_nS5UR.js → SessionsPage-BpgP4087.js} +2 -2
  202. package/ccw/frontend/dist/assets/{SessionsPage-CW_nS5UR.js.map → SessionsPage-BpgP4087.js.map} +1 -1
  203. package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js +150 -0
  204. package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js.map +1 -0
  205. package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js +7 -0
  206. package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js.map +1 -0
  207. package/ccw/frontend/dist/assets/{SpecsSettingsPage-DJpi9XQL.js → SpecsSettingsPage-DT-yTVkD.js} +4 -4
  208. package/ccw/frontend/dist/assets/{SpecsSettingsPage-DJpi9XQL.js.map → SpecsSettingsPage-DT-yTVkD.js.map} +1 -1
  209. package/ccw/frontend/dist/assets/{Switch-Ac6Ov7uy.js → Switch-CYSPdqWk.js} +2 -2
  210. package/ccw/frontend/dist/assets/{Switch-Ac6Ov7uy.js.map → Switch-CYSPdqWk.js.map} +1 -1
  211. package/ccw/frontend/dist/assets/{TabsNavigation-DZAAspqR.js → TabsNavigation-CPh6Zor1.js} +2 -2
  212. package/ccw/frontend/dist/assets/{TabsNavigation-DZAAspqR.js.map → TabsNavigation-CPh6Zor1.js.map} +1 -1
  213. package/ccw/frontend/dist/assets/{TaskDrawer-BJkwfhIZ.js → TaskDrawer-Ds-8830B.js} +2 -2
  214. package/ccw/frontend/dist/assets/{TaskDrawer-BJkwfhIZ.js.map → TaskDrawer-Ds-8830B.js.map} +1 -1
  215. package/ccw/frontend/dist/assets/{TeamPage-BJgjxBgb.js → TeamPage-CJODUxBk.js} +2 -2
  216. package/ccw/frontend/dist/assets/{TeamPage-BJgjxBgb.js.map → TeamPage-CJODUxBk.js.map} +1 -1
  217. package/ccw/frontend/dist/assets/{TerminalDashboardPage-D1WekoOy.js → TerminalDashboardPage-Cn3fGUuO.js} +3 -3
  218. package/ccw/frontend/dist/assets/{TerminalDashboardPage-D1WekoOy.js.map → TerminalDashboardPage-Cn3fGUuO.js.map} +1 -1
  219. package/ccw/frontend/dist/assets/{archive-DxemgIhF.js → archive-CjwVpw6k.js} +2 -2
  220. package/ccw/frontend/dist/assets/{archive-DxemgIhF.js.map → archive-CjwVpw6k.js.map} +1 -1
  221. package/ccw/frontend/dist/assets/{archive-restore-CjS83f1V.js → archive-restore-2vZa9Ic3.js} +2 -2
  222. package/ccw/frontend/dist/assets/{archive-restore-CjS83f1V.js.map → archive-restore-2vZa9Ic3.js.map} +1 -1
  223. package/ccw/frontend/dist/assets/{arrow-right-B5PUcn8I.js → arrow-right-CUU5XDgT.js} +2 -2
  224. package/ccw/frontend/dist/assets/{arrow-right-B5PUcn8I.js.map → arrow-right-CUU5XDgT.js.map} +1 -1
  225. package/ccw/frontend/dist/assets/{bookmark-plus-DCc9aPbb.js → bookmark-plus-Cc3nKRZ5.js} +2 -2
  226. package/ccw/frontend/dist/assets/{bookmark-plus-DCc9aPbb.js.map → bookmark-plus-Cc3nKRZ5.js.map} +1 -1
  227. package/ccw/frontend/dist/assets/{bot-DOwFtzak.js → bot-BwpSRDUa.js} +2 -2
  228. package/ccw/frontend/dist/assets/{bot-DOwFtzak.js.map → bot-BwpSRDUa.js.map} +1 -1
  229. package/ccw/frontend/dist/assets/{braces-96qH3aFh.js → braces-DBzUW1XC.js} +2 -2
  230. package/ccw/frontend/dist/assets/{braces-96qH3aFh.js.map → braces-DBzUW1XC.js.map} +1 -1
  231. package/ccw/frontend/dist/assets/{circle-stop-CCxSuil1.js → circle-stop-CGNNsjvE.js} +2 -2
  232. package/ccw/frontend/dist/assets/{circle-stop-CCxSuil1.js.map → circle-stop-CGNNsjvE.js.map} +1 -1
  233. package/ccw/frontend/dist/assets/{cpu-CZNSJFdq.js → cpu-D27G86Ul.js} +2 -2
  234. package/ccw/frontend/dist/assets/{cpu-CZNSJFdq.js.map → cpu-D27G86Ul.js.map} +1 -1
  235. package/ccw/frontend/dist/assets/{ellipsis-vertical-h8xtvw2_.js → ellipsis-vertical-C1Ij47Yz.js} +2 -2
  236. package/ccw/frontend/dist/assets/{ellipsis-vertical-h8xtvw2_.js.map → ellipsis-vertical-C1Ij47Yz.js.map} +1 -1
  237. package/ccw/frontend/dist/assets/{eye-D3NY0bm6.js → eye-C6MOB7Au.js} +2 -2
  238. package/ccw/frontend/dist/assets/{eye-D3NY0bm6.js.map → eye-C6MOB7Au.js.map} +1 -1
  239. package/ccw/frontend/dist/assets/{eye-off-Cy2vkc8p.js → eye-off-BxfBlZ26.js} +2 -2
  240. package/ccw/frontend/dist/assets/{eye-off-Cy2vkc8p.js.map → eye-off-BxfBlZ26.js.map} +1 -1
  241. package/ccw/frontend/dist/assets/{file-json-Bzq3U1Mx.js → file-json-NI237wA-.js} +2 -2
  242. package/ccw/frontend/dist/assets/{file-json-Bzq3U1Mx.js.map → file-json-NI237wA-.js.map} +1 -1
  243. package/ccw/frontend/dist/assets/{file-text-DwuwPDPi.js → file-text-Byn2_2v6.js} +2 -2
  244. package/ccw/frontend/dist/assets/{file-text-DwuwPDPi.js.map → file-text-Byn2_2v6.js.map} +1 -1
  245. package/ccw/frontend/dist/assets/{filter-q9g-bknU.js → filter-D-7PhZjx.js} +2 -2
  246. package/ccw/frontend/dist/assets/{filter-q9g-bknU.js.map → filter-D-7PhZjx.js.map} +1 -1
  247. package/ccw/frontend/dist/assets/{folder-CL6vb42J.js → folder-BoAsK_FL.js} +2 -2
  248. package/ccw/frontend/dist/assets/{folder-CL6vb42J.js.map → folder-BoAsK_FL.js.map} +1 -1
  249. package/ccw/frontend/dist/assets/{gauge-BkrcQBly.js → gauge-DCSxJIS4.js} +2 -2
  250. package/ccw/frontend/dist/assets/{gauge-BkrcQBly.js.map → gauge-DCSxJIS4.js.map} +1 -1
  251. package/ccw/frontend/dist/assets/{globe-BQbwyNeV.js → globe-CHS3prza.js} +2 -2
  252. package/ccw/frontend/dist/assets/{globe-BQbwyNeV.js.map → globe-CHS3prza.js.map} +1 -1
  253. package/ccw/frontend/dist/assets/{grid-3x3-x5_7DrN7.js → grid-3x3-D7K35U7S.js} +2 -2
  254. package/ccw/frontend/dist/assets/{grid-3x3-x5_7DrN7.js.map → grid-3x3-D7K35U7S.js.map} +1 -1
  255. package/ccw/frontend/dist/assets/{hard-drive-DTyWXwzf.js → hard-drive-eq9xE07G.js} +2 -2
  256. package/ccw/frontend/dist/assets/{hard-drive-DTyWXwzf.js.map → hard-drive-eq9xE07G.js.map} +1 -1
  257. package/ccw/frontend/dist/assets/{hash-80O0kJO7.js → hash-C1DMpBua.js} +2 -2
  258. package/ccw/frontend/dist/assets/{hash-80O0kJO7.js.map → hash-C1DMpBua.js.map} +1 -1
  259. package/ccw/frontend/dist/assets/{history-DDlN2Bwa.js → history-Di5SBCY-.js} +2 -2
  260. package/ccw/frontend/dist/assets/{history-DDlN2Bwa.js.map → history-Di5SBCY-.js.map} +1 -1
  261. package/ccw/frontend/dist/assets/{index-mbeo62f8.js → index--_R7COnA.js} +2 -2
  262. package/ccw/frontend/dist/assets/{index-mbeo62f8.js.map → index--_R7COnA.js.map} +1 -1
  263. package/ccw/frontend/dist/assets/{index-rLgoBCfV.js → index-BUol9HDD.js} +3 -3
  264. package/ccw/frontend/dist/assets/{index-rLgoBCfV.js.map → index-BUol9HDD.js.map} +1 -1
  265. package/ccw/frontend/dist/assets/{index-Bs80iCX0.js → index-CT9oykfw.js} +2 -2
  266. package/ccw/frontend/dist/assets/{index-Bs80iCX0.js.map → index-CT9oykfw.js.map} +1 -1
  267. package/ccw/frontend/dist/assets/{index-B9A3Hnrk.js → index-Ddwvf87H.js} +2 -2
  268. package/ccw/frontend/dist/assets/{index-B9A3Hnrk.js.map → index-Ddwvf87H.js.map} +1 -1
  269. package/ccw/frontend/dist/assets/{layout-grid-C1niOWJx.js → layout-grid-LiX0qZbN.js} +2 -2
  270. package/ccw/frontend/dist/assets/{layout-grid-C1niOWJx.js.map → layout-grid-LiX0qZbN.js.map} +1 -1
  271. package/ccw/frontend/dist/assets/{lightbulb-BTmI7SUg.js → lightbulb-CL3DVEwb.js} +2 -2
  272. package/ccw/frontend/dist/assets/{lightbulb-BTmI7SUg.js.map → lightbulb-CL3DVEwb.js.map} +1 -1
  273. package/ccw/frontend/dist/assets/{link-2-CB9HKeuZ.js → link-2-CC5cFeq6.js} +2 -2
  274. package/ccw/frontend/dist/assets/{link-2-CB9HKeuZ.js.map → link-2-CC5cFeq6.js.map} +1 -1
  275. package/ccw/frontend/dist/assets/{link-koEYiemK.js → link-ngFQ9bs0.js} +2 -2
  276. package/ccw/frontend/dist/assets/{link-koEYiemK.js.map → link-ngFQ9bs0.js.map} +1 -1
  277. package/ccw/frontend/dist/assets/{list-v2_GaLdC.js → list-BEU6I0KK.js} +2 -2
  278. package/ccw/frontend/dist/assets/{list-v2_GaLdC.js.map → list-BEU6I0KK.js.map} +1 -1
  279. package/ccw/frontend/dist/assets/{map-pin-BQNfAqG_.js → map-pin-BWZdLA6y.js} +2 -2
  280. package/ccw/frontend/dist/assets/{map-pin-BQNfAqG_.js.map → map-pin-BWZdLA6y.js.map} +1 -1
  281. package/ccw/frontend/dist/assets/{messages-square-Dzq5LGg9.js → messages-square-K6_Chm7n.js} +2 -2
  282. package/ccw/frontend/dist/assets/{messages-square-Dzq5LGg9.js.map → messages-square-K6_Chm7n.js.map} +1 -1
  283. package/ccw/frontend/dist/assets/{minimize-2-CtkoJXcz.js → minimize-2-CWkphauf.js} +2 -2
  284. package/ccw/frontend/dist/assets/{minimize-2-CtkoJXcz.js.map → minimize-2-CWkphauf.js.map} +1 -1
  285. package/ccw/frontend/dist/assets/{package-CH3smL37.js → package-DrNgkamn.js} +2 -2
  286. package/ccw/frontend/dist/assets/{package-CH3smL37.js.map → package-DrNgkamn.js.map} +1 -1
  287. package/ccw/frontend/dist/assets/{plug-CZ0aL_yF.js → plug-CMo3sw5_.js} +2 -2
  288. package/ccw/frontend/dist/assets/{plug-CZ0aL_yF.js.map → plug-CMo3sw5_.js.map} +1 -1
  289. package/ccw/frontend/dist/assets/{power-F2A_J4l6.js → power-DppNTW5e.js} +2 -2
  290. package/ccw/frontend/dist/assets/{power-F2A_J4l6.js.map → power-DppNTW5e.js.map} +1 -1
  291. package/ccw/frontend/dist/assets/{save-Byxot0YU.js → save-CD8aPMbZ.js} +2 -2
  292. package/ccw/frontend/dist/assets/{save-Byxot0YU.js.map → save-CD8aPMbZ.js.map} +1 -1
  293. package/ccw/frontend/dist/assets/{send-JjqhUkpw.js → send-B4z90fQD.js} +2 -2
  294. package/ccw/frontend/dist/assets/{send-JjqhUkpw.js.map → send-B4z90fQD.js.map} +1 -1
  295. package/ccw/frontend/dist/assets/{settings-2--SuN9rAt.js → settings-2-CAKRU_QC.js} +2 -2
  296. package/ccw/frontend/dist/assets/{settings-2--SuN9rAt.js.map → settings-2-CAKRU_QC.js.map} +1 -1
  297. package/ccw/frontend/dist/assets/{square-check-big-BbngGB2h.js → square-check-big-KhI3HrzX.js} +2 -2
  298. package/ccw/frontend/dist/assets/{square-check-big-BbngGB2h.js.map → square-check-big-KhI3HrzX.js.map} +1 -1
  299. package/ccw/frontend/dist/assets/{square-pen-CgrHgZSl.js → square-pen-BtdGIpuq.js} +2 -2
  300. package/ccw/frontend/dist/assets/{square-pen-CgrHgZSl.js.map → square-pen-BtdGIpuq.js.map} +1 -1
  301. package/ccw/frontend/dist/assets/{star-BU3TQr7Z.js → star-ZoBUkXoD.js} +2 -2
  302. package/ccw/frontend/dist/assets/{star-BU3TQr7Z.js.map → star-ZoBUkXoD.js.map} +1 -1
  303. package/ccw/frontend/dist/assets/{style-CKs7nnn3.js → style-CltxQP-P.js} +2 -2
  304. package/ccw/frontend/dist/assets/{style-CKs7nnn3.js.map → style-CltxQP-P.js.map} +1 -1
  305. package/ccw/frontend/dist/assets/{target-DW5tsDW6.js → target-C32OUSGf.js} +2 -2
  306. package/ccw/frontend/dist/assets/{target-DW5tsDW6.js.map → target-C32OUSGf.js.map} +1 -1
  307. package/ccw/frontend/dist/assets/{test-tube-BHm7w3ON.js → test-tube-0IxoyAVZ.js} +2 -2
  308. package/ccw/frontend/dist/assets/{test-tube-BHm7w3ON.js.map → test-tube-0IxoyAVZ.js.map} +1 -1
  309. package/ccw/frontend/dist/assets/{upload-DYR7PWwt.js → upload-4eKCkyBn.js} +2 -2
  310. package/ccw/frontend/dist/assets/{upload-DYR7PWwt.js.map → upload-4eKCkyBn.js.map} +1 -1
  311. package/ccw/frontend/dist/assets/{useApiSettings-D0TVgQD_.js → useApiSettings-zLTUWqhi.js} +2 -2
  312. package/ccw/frontend/dist/assets/{useApiSettings-D0TVgQD_.js.map → useApiSettings-zLTUWqhi.js.map} +1 -1
  313. package/ccw/frontend/dist/assets/{useCli-DfY8mAP8.js → useCli-BtN2vpOX.js} +2 -2
  314. package/ccw/frontend/dist/assets/{useCli-DfY8mAP8.js.map → useCli-BtN2vpOX.js.map} +1 -1
  315. package/ccw/frontend/dist/assets/{useCommands-CGusDp0F.js → useCommands-_spj49qL.js} +2 -2
  316. package/ccw/frontend/dist/assets/{useCommands-CGusDp0F.js.map → useCommands-_spj49qL.js.map} +1 -1
  317. package/ccw/frontend/dist/assets/{useDebounce-CIwh0fF1.js → useDebounce-Bm9KFZvd.js} +2 -2
  318. package/ccw/frontend/dist/assets/{useDebounce-CIwh0fF1.js.map → useDebounce-Bm9KFZvd.js.map} +1 -1
  319. package/ccw/frontend/dist/assets/{useFileExplorer-FMyFv39K.js → useFileExplorer-DOmpm6v9.js} +2 -2
  320. package/ccw/frontend/dist/assets/{useFileExplorer-FMyFv39K.js.map → useFileExplorer-DOmpm6v9.js.map} +1 -1
  321. package/ccw/frontend/dist/assets/{useLocale-B2qhsoTb.js → useLocale-D2rj4rea.js} +2 -2
  322. package/ccw/frontend/dist/assets/{useLocale-B2qhsoTb.js.map → useLocale-D2rj4rea.js.map} +1 -1
  323. package/ccw/frontend/dist/assets/{useSkills-cxKXMBm3.js → useSkills-OskEpomF.js} +3 -3
  324. package/ccw/frontend/dist/assets/{useSkills-cxKXMBm3.js.map → useSkills-OskEpomF.js.map} +1 -1
  325. package/ccw/frontend/dist/assets/{useSystemSettings-B-xUT_z-.js → useSystemSettings-BjMgsNSF.js} +2 -2
  326. package/ccw/frontend/dist/assets/{useSystemSettings-B-xUT_z-.js.map → useSystemSettings-BjMgsNSF.js.map} +1 -1
  327. package/ccw/frontend/dist/assets/{wand-sparkles-DZV_3lPr.js → wand-sparkles-CLhyYWa7.js} +2 -2
  328. package/ccw/frontend/dist/assets/{wand-sparkles-DZV_3lPr.js.map → wand-sparkles-CLhyYWa7.js.map} +1 -1
  329. package/ccw/frontend/dist/index.html +1 -1
  330. package/ccw/scripts/prepublish-clean.mjs +0 -1
  331. package/package.json +1 -3
  332. package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js +0 -150
  333. package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +0 -1
  334. package/ccw/frontend/dist/assets/SkillsManagerPage-CTnWrrwp.js +0 -7
  335. package/ccw/frontend/dist/assets/SkillsManagerPage-CTnWrrwp.js.map +0 -1
  336. package/ccw-litellm/README.md +0 -180
  337. package/ccw-litellm/pyproject.toml +0 -35
  338. package/ccw-litellm/src/ccw_litellm/__init__.py +0 -47
  339. package/ccw-litellm/src/ccw_litellm/cli.py +0 -108
  340. package/ccw-litellm/src/ccw_litellm/clients/__init__.py +0 -12
  341. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +0 -270
  342. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +0 -198
  343. package/ccw-litellm/src/ccw_litellm/config/__init__.py +0 -22
  344. package/ccw-litellm/src/ccw_litellm/config/loader.py +0 -343
  345. package/ccw-litellm/src/ccw_litellm/config/models.py +0 -162
  346. package/ccw-litellm/src/ccw_litellm/interfaces/__init__.py +0 -14
  347. package/ccw-litellm/src/ccw_litellm/interfaces/embedder.py +0 -52
  348. package/ccw-litellm/src/ccw_litellm/interfaces/llm.py +0 -45
@@ -1,426 +1,421 @@
1
- ---
2
- name: issue-plan-agent
3
- description: |
4
- Closed-loop issue planning agent combining ACE exploration and solution generation.
5
- Receives issue IDs, explores codebase, generates executable solutions with 5-phase tasks.
6
- color: green
7
- ---
8
-
9
- ## Overview
10
-
11
- **Agent Role**: Closed-loop planning agent that transforms GitHub issues into executable solutions. Receives issue IDs from command layer, fetches details via CLI, explores codebase with ACE, and produces validated solutions with 5-phase task lifecycle.
12
-
13
- **Core Capabilities**:
14
- - ACE semantic search for intelligent code discovery
15
- - Batch processing (1-3 issues per invocation)
16
- - 5-phase task lifecycle (analyze → implement → test → optimize → commit)
17
- - Conflict-aware planning (isolate file modifications across issues)
18
- - Dependency DAG validation
19
- - Execute bind command for single solution, return for selection on multiple
20
-
21
- **Key Principle**: Generate tasks conforming to schema with quantified acceptance criteria.
22
-
23
- ---
24
-
25
- ## 1. Input & Execution
26
-
27
- ### 1.1 Input Context
28
-
29
- **Project Context** (load at startup):
30
- - Read `.workflow/project-tech.json` (if exists) → tech_stack, architecture
31
- - Read `.workflow/specs/*.md` (if exists) → constraints, conventions
32
-
33
- ```javascript
34
- {
35
- issue_ids: string[], // Issue IDs only (e.g., ["GH-123", "GH-124"])
36
- project_root: string, // Project root path for ACE search
37
- batch_size?: number, // Max issues per batch (default: 3)
38
- }
39
- ```
40
-
41
- **Note**: Agent receives IDs only. Fetch details via `ccw issue status <id> --json`.
42
-
43
- ### 1.2 Execution Flow
44
-
45
- ```
46
- Phase 1: Issue Understanding (10%)
47
- ↓ Fetch details, extract requirements, determine complexity
48
- Phase 2: ACE Exploration (30%)
49
- ↓ Semantic search, pattern discovery, dependency mapping
50
- Phase 3: Solution Planning (45%)
51
- ↓ Task decomposition, 5-phase lifecycle, acceptance criteria
52
- Phase 4: Validation & Output (15%)
53
- ↓ DAG validation, solution registration, binding
54
- ```
55
-
56
- #### Phase 1: Issue Understanding
57
-
58
- **Step 1**: Fetch issue details via CLI
59
- ```bash
60
- ccw issue status <issue-id> --json
61
- ```
62
-
63
- **Step 2**: Analyze failure history (if present)
64
- ```javascript
65
- function analyzeFailureHistory(issue) {
66
- if (!issue.feedback || issue.feedback.length === 0) {
67
- return { has_failures: false };
68
- }
69
-
70
- // Extract execution failures
71
- const failures = issue.feedback.filter(f => f.type === 'failure' && f.stage === 'execute');
72
-
73
- if (failures.length === 0) {
74
- return { has_failures: false };
75
- }
76
-
77
- // Parse failure details
78
- const failureAnalysis = failures.map(f => {
79
- const detail = JSON.parse(f.content);
80
- return {
81
- solution_id: detail.solution_id,
82
- task_id: detail.task_id,
83
- error_type: detail.error_type, // test_failure, compilation, timeout, etc.
84
- message: detail.message,
85
- stack_trace: detail.stack_trace,
86
- timestamp: f.created_at
87
- };
88
- });
89
-
90
- // Identify patterns
91
- const errorTypes = failureAnalysis.map(f => f.error_type);
92
- const repeatedErrors = errorTypes.filter((e, i, arr) => arr.indexOf(e) !== i);
93
-
94
- return {
95
- has_failures: true,
96
- failure_count: failures.length,
97
- failures: failureAnalysis,
98
- patterns: {
99
- repeated_errors: repeatedErrors, // Same error multiple times
100
- failed_approaches: [...new Set(failureAnalysis.map(f => f.solution_id))]
101
- }
102
- };
103
- }
104
- ```
105
-
106
- **Step 3**: Analyze and classify
107
- ```javascript
108
- function analyzeIssue(issue) {
109
- const failureAnalysis = analyzeFailureHistory(issue);
110
-
111
- return {
112
- issue_id: issue.id,
113
- requirements: extractRequirements(issue.context),
114
- scope: inferScope(issue.title, issue.context),
115
- complexity: determineComplexity(issue), // Low | Medium | High
116
- failure_analysis: failureAnalysis, // Failure context for planning
117
- is_replan: failureAnalysis.has_failures // Flag for replanning
118
- }
119
- }
120
- ```
121
-
122
- **Complexity Rules**:
123
- | Complexity | Files | Tasks |
124
- |------------|-------|-------|
125
- | Low | 1-2 | 1-3 |
126
- | Medium | 3-5 | 3-6 |
127
- | High | 6+ | 5-10 |
128
-
129
- #### Phase 2: ACE Exploration
130
-
131
- **Primary**: ACE semantic search
132
- ```javascript
133
- mcp__ace-tool__search_context({
134
- project_root_path: project_root,
135
- query: `Find code related to: ${issue.title}. Keywords: ${extractKeywords(issue)}`
136
- })
137
- ```
138
-
139
- **Exploration Checklist**:
140
- - [ ] Identify relevant files (direct matches)
141
- - [ ] Find related patterns (similar implementations)
142
- - [ ] Map integration points
143
- - [ ] Discover dependencies
144
- - [ ] Locate test patterns
145
-
146
- **Fallback Chain**: ACE → smart_search → Grep → rg → Glob
147
-
148
- | Tool | When to Use |
149
- |------|-------------|
150
- | `mcp__ace-tool__search_context` | Semantic search (primary) |
151
- | `mcp__ccw-tools__smart_search` | Symbol/pattern search |
152
- | `Grep` | Exact regex matching |
153
- | `rg` / `grep` | CLI fallback |
154
- | `Glob` | File path discovery |
155
-
156
- #### Phase 3: Solution Planning
157
-
158
- **Failure-Aware Planning** (when `issue.failure_analysis.has_failures === true`):
159
-
160
- ```javascript
161
- function planWithFailureContext(issue, exploration, failureAnalysis) {
162
- // Identify what failed before
163
- const failedApproaches = failureAnalysis.patterns.failed_approaches;
164
- const rootCauses = failureAnalysis.failures.map(f => ({
165
- error: f.error_type,
166
- message: f.message,
167
- task: f.task_id
168
- }));
169
-
170
- // Design alternative approach
171
- const approach = `
172
- **Previous Attempt Analysis**:
173
- - Failed approaches: ${failedApproaches.join(', ')}
174
- - Root causes: ${rootCauses.map(r => `${r.error} (${r.task}): ${r.message}`).join('; ')}
175
-
176
- **Alternative Strategy**:
177
- - [Describe how this solution addresses root causes]
178
- - [Explain what's different from failed approaches]
179
- - [Prevention steps to catch same errors earlier]
180
- `;
181
-
182
- // Add explicit verification tasks
183
- const verificationTasks = rootCauses.map(rc => ({
184
- verification_type: rc.error,
185
- check: `Prevent ${rc.error}: ${rc.message}`,
186
- method: `Add unit test / compile check / timeout limit`
187
- }));
188
-
189
- return { approach, verificationTasks };
190
- }
191
- ```
192
-
193
- **Multi-Solution Generation**:
194
-
195
- Generate multiple candidate solutions when:
196
- - Issue complexity is HIGH
197
- - Multiple valid implementation approaches exist
198
- - Trade-offs between approaches (performance vs simplicity, etc.)
199
-
200
- | Condition | Solutions | Binding Action |
201
- |-----------|-----------|----------------|
202
- | Low complexity, single approach | 1 solution | Execute bind |
203
- | Medium complexity, clear path | 1-2 solutions | Execute bind if 1, return if 2+ |
204
- | High complexity, multiple approaches | 2-3 solutions | Return for selection |
205
-
206
- **Binding Decision** (based SOLELY on final `solutions.length`):
207
- ```javascript
208
- // After generating all solutions
209
- if (solutions.length === 1) {
210
- exec(`ccw issue bind ${issueId} ${solutions[0].id}`); // MUST execute
211
- } else {
212
- return { pending_selection: solutions }; // Return for user choice
213
- }
214
- ```
215
-
216
- **Solution Evaluation** (for each candidate):
217
- ```javascript
218
- {
219
- analysis: { risk: "low|medium|high", impact: "low|medium|high", complexity: "low|medium|high" },
220
- score: 0.0-1.0 // Higher = recommended
221
- }
222
- ```
223
-
224
- **Task Decomposition** following schema:
225
- ```javascript
226
- function decomposeTasks(issue, exploration) {
227
- const tasks = groups.map(group => ({
228
- id: `T${taskId++}`, // Pattern: ^T[0-9]+$
229
- title: group.title,
230
- scope: inferScope(group), // Module path
231
- action: inferAction(group), // Create | Update | Implement | ...
232
- description: group.description,
233
- files: mapFiles(group), // [{path, target, change, action?, conflict_risk?}]
234
- implementation: generateSteps(group), // Step-by-step guide
235
- test: {
236
- unit: generateUnitTests(group),
237
- commands: ['npm test']
238
- },
239
- convergence: {
240
- criteria: generateCriteria(group), // Quantified checklist
241
- verification: generateVerification(group)
242
- },
243
- commit: {
244
- type: inferCommitType(group), // feat | fix | refactor | ...
245
- scope: inferScope(group),
246
- message_template: generateCommitMsg(group)
247
- },
248
- depends_on: inferDependencies(group, tasks),
249
- priority: calculatePriorityEnum(group) // "critical"|"high"|"medium"|"low"
250
- }));
251
-
252
- // GitHub Reply Task: Add final task if issue has github_url
253
- if (issue.github_url || issue.github_number) {
254
- const lastTaskId = tasks[tasks.length - 1]?.id;
255
- tasks.push({
256
- id: `T${taskId++}`,
257
- title: 'Reply to GitHub Issue',
258
- scope: 'github',
259
- action: 'Notify',
260
- description: `Comment on GitHub issue to report completion status`,
261
- files: [],
262
- implementation: [
263
- `Generate completion summary (tasks completed, files changed)`,
264
- `Post comment via: gh issue comment ${issue.github_number || extractNumber(issue.github_url)} --body "..."`,
265
- `Include: solution approach, key changes, verification results`
266
- ],
267
- test: { unit: [], commands: [] },
268
- convergence: {
269
- criteria: ['GitHub comment posted successfully', 'Comment includes completion summary'],
270
- verification: ['Check GitHub issue for new comment']
271
- },
272
- commit: null, // No commit for notification task
273
- depends_on: lastTaskId ? [lastTaskId] : [], // Depends on last implementation task
274
- priority: "low" // Lowest priority (run last)
275
- });
276
- }
277
-
278
- return tasks;
279
- }
280
- ```
281
-
282
- #### Phase 4: Validation & Output
283
-
284
- **Validation**:
285
- - DAG validation (no circular dependencies)
286
- - Task validation (all 5 phases present)
287
- - File isolation check (ensure minimal overlap across issues in batch)
288
-
289
- **Solution Registration** (via file write):
290
-
291
- **Step 1: Create solution files**
292
-
293
- Write solution JSON to JSONL file (one line per solution):
294
-
295
- ```
296
- .workflow/issues/solutions/{issue-id}.jsonl
297
- ```
298
-
299
- **File Format** (JSONL - each line is a complete solution):
300
- ```
301
- {"id":"SOL-GH-123-a7x9","description":"...","approach":"...","analysis":{...},"score":0.85,"tasks":[...]}
302
- {"id":"SOL-GH-123-b2k4","description":"...","approach":"...","analysis":{...},"score":0.75,"tasks":[...]}
303
- ```
304
-
305
- **Solution Schema** (must match CLI `Solution` interface):
306
- ```typescript
307
- {
308
- id: string; // Format: SOL-{issue-id}-{uid}
309
- description?: string;
310
- approach?: string;
311
- tasks: SolutionTask[];
312
- analysis?: { risk, impact, complexity };
313
- score?: number;
314
- // Note: is_bound, created_at are added by CLI on read
315
- }
316
- ```
317
-
318
- **Write Operation**:
319
- ```javascript
320
- // Append solution to JSONL file (one line per solution)
321
- // Use 4-char random uid to avoid collisions across multiple plan runs
322
- const uid = Math.random().toString(36).slice(2, 6); // e.g., "a7x9"
323
- const solutionId = `SOL-${issueId}-${uid}`;
324
- const solutionLine = JSON.stringify({ id: solutionId, ...solution });
325
-
326
- // Bash equivalent for uid generation:
327
- // uid=$(cat /dev/urandom | tr -dc 'a-z0-9' | head -c 4)
328
-
329
- // Read existing, append new line, write back
330
- const filePath = `.workflow/issues/solutions/${issueId}.jsonl`;
331
- const existing = existsSync(filePath) ? readFileSync(filePath) : '';
332
- const newContent = existing.trimEnd() + (existing ? '\n' : '') + solutionLine + '\n';
333
- Write({ file_path: filePath, content: newContent })
334
- ```
335
-
336
- **Step 2: Bind decision**
337
- - 1 solution → Execute `ccw issue bind <issue-id> <solution-id>`
338
- - 2+ solutions → Return `pending_selection` (no bind)
339
-
340
- ---
341
-
342
- ## 2. Output Requirements
343
-
344
- ### 2.1 Generate Files (Primary)
345
-
346
- **Solution file per issue**:
347
- ```
348
- .workflow/issues/solutions/{issue-id}.jsonl
349
- ```
350
-
351
- Each line is a solution JSON containing tasks. Schema: `ccw tool exec json_builder '{"cmd":"info","schema":"solution"}'`
352
-
353
- ### 2.2 Return Summary
354
-
355
- ```json
356
- {
357
- "bound": [{ "issue_id": "...", "solution_id": "...", "task_count": N }],
358
- "pending_selection": [{ "issue_id": "GH-123", "solutions": [{ "id": "SOL-GH-123-1", "description": "...", "task_count": N }] }]
359
- }
360
- ```
361
-
362
- ---
363
-
364
- ## 3. Quality Standards
365
-
366
- ### 3.1 Acceptance Criteria
367
-
368
- | Good | Bad |
369
- |------|-----|
370
- | "3 API endpoints: GET, POST, DELETE" | "API works correctly" |
371
- | "Response time < 200ms p95" | "Good performance" |
372
- | "All 4 test cases pass" | "Tests pass" |
373
-
374
- ### 3.2 Validation Checklist
375
-
376
- - [ ] ACE search performed for each issue
377
- - [ ] All files[] paths verified against codebase
378
- - [ ] Tasks have 2+ implementation steps
379
- - [ ] All 5 lifecycle phases present
380
- - [ ] Quantified convergence criteria with verification
381
- - [ ] Dependencies form valid DAG
382
- - [ ] Commit follows conventional commits
383
-
384
- ### 3.3 Guidelines
385
-
386
- **Bash Tool**:
387
- - Use `run_in_background=false` for all Bash/CLI calls to ensure foreground execution
388
-
389
- **ALWAYS**:
390
- 1. **Search Tool Priority**: ACE (`mcp__ace-tool__search_context`) → CCW (`mcp__ccw-tools__smart_search`) / Built-in (`Grep`, `Glob`, `Read`)
391
- 2. Get schema info: `ccw tool exec json_builder '{"cmd":"info","schema":"solution"}'` (replaces reading raw schema)
392
- 3. Use ACE semantic search as PRIMARY exploration tool
393
- 4. Fetch issue details via `ccw issue status <id> --json`
394
- 5. **Analyze failure history**: Check `issue.feedback` for type='failure', stage='execute'
395
- 6. **For replanning**: Reference previous failures in `solution.approach`, add prevention steps
396
- 7. Quantify convergence.criteria with testable conditions
397
- 8. Validate DAG before output
398
- 9. Evaluate each solution with `analysis` and `score`
399
- 10. Write solutions to `.workflow/issues/solutions/{issue-id}.jsonl` (append mode)
400
- 11. For HIGH complexity: generate 2-3 candidate solutions
401
- 12. **Solution ID format**: `SOL-{issue-id}-{uid}` where uid is 4 random alphanumeric chars (e.g., `SOL-GH-123-a7x9`)
402
- 13. **GitHub Reply Task**: If issue has `github_url` or `github_number`, add final task to comment on GitHub issue with completion summary
403
-
404
- **CONFLICT AVOIDANCE** (for batch processing of similar issues):
405
- 1. **File isolation**: Each issue's solution should target distinct files when possible
406
- 2. **Module boundaries**: Prefer solutions that modify different modules/directories
407
- 3. **Multiple solutions**: When file overlap is unavoidable, generate alternative solutions with different file targets
408
- 4. **Dependency ordering**: If issues must touch same files, encode execution order via `depends_on`
409
- 5. **Scope minimization**: Prefer smaller, focused modifications over broad refactoring
410
-
411
- **VALIDATE**: After writing solution JSONL, validate each solution:
412
- ```bash
413
- ccw tool exec json_builder '{"cmd":"validate","target":".workflow/issues/solutions/<issue-id>.jsonl","schema":"solution"}'
414
- ```
415
-
416
- **NEVER**:
417
- 1. Execute implementation (return plan only)
418
- 2. Use vague criteria ("works correctly", "good performance")
419
- 3. Create circular dependencies
420
- 4. Generate more than 10 tasks per issue
421
- 5. Skip bind when `solutions.length === 1` (MUST execute bind command)
422
-
423
- **OUTPUT**:
424
- 1. Write solutions to `.workflow/issues/solutions/{issue-id}.jsonl`
425
- 2. Execute bind or return `pending_selection` based on solution count
426
- 3. Return JSON: `{ bound: [...], pending_selection: [...] }`
1
+ ---
2
+ name: issue-plan-agent
3
+ description: |
4
+ Closed-loop issue planning agent combining ACE exploration and solution generation.
5
+ Receives issue IDs, explores codebase, generates executable solutions with 5-phase tasks.
6
+ color: green
7
+ ---
8
+
9
+ ## Overview
10
+
11
+ **Agent Role**: Closed-loop planning agent that transforms GitHub issues into executable solutions. Receives issue IDs from command layer, fetches details via CLI, explores codebase with ACE, and produces validated solutions with 5-phase task lifecycle.
12
+
13
+ **Core Capabilities**:
14
+ - ACE semantic search for intelligent code discovery
15
+ - Batch processing (1-3 issues per invocation)
16
+ - 5-phase task lifecycle (analyze → implement → test → optimize → commit)
17
+ - Conflict-aware planning (isolate file modifications across issues)
18
+ - Dependency DAG validation
19
+ - Execute bind command for single solution, return for selection on multiple
20
+
21
+ **Key Principle**: Generate tasks conforming to schema with quantified acceptance criteria.
22
+
23
+ ---
24
+
25
+ ## 1. Input & Execution
26
+
27
+ ### 1.1 Input Context
28
+
29
+ **Project Context** (load at startup):
30
+ - Read `.workflow/project-tech.json` (if exists) → tech_stack, architecture
31
+ - Read `.workflow/specs/*.md` (if exists) → constraints, conventions
32
+
33
+ ```javascript
34
+ {
35
+ issue_ids: string[], // Issue IDs only (e.g., ["GH-123", "GH-124"])
36
+ project_root: string, // Project root path for ACE search
37
+ batch_size?: number, // Max issues per batch (default: 3)
38
+ }
39
+ ```
40
+
41
+ **Note**: Agent receives IDs only. Fetch details via `ccw issue status <id> --json`.
42
+
43
+ ### 1.2 Execution Flow
44
+
45
+ ```
46
+ Phase 1: Issue Understanding (10%)
47
+ ↓ Fetch details, extract requirements, determine complexity
48
+ Phase 2: ACE Exploration (30%)
49
+ ↓ Semantic search, pattern discovery, dependency mapping
50
+ Phase 3: Solution Planning (45%)
51
+ ↓ Task decomposition, 5-phase lifecycle, acceptance criteria
52
+ Phase 4: Validation & Output (15%)
53
+ ↓ DAG validation, solution registration, binding
54
+ ```
55
+
56
+ #### Phase 1: Issue Understanding
57
+
58
+ **Step 1**: Fetch issue details via CLI
59
+ ```bash
60
+ ccw issue status <issue-id> --json
61
+ ```
62
+
63
+ **Step 2**: Analyze failure history (if present)
64
+ ```javascript
65
+ function analyzeFailureHistory(issue) {
66
+ if (!issue.feedback || issue.feedback.length === 0) {
67
+ return { has_failures: false };
68
+ }
69
+
70
+ // Extract execution failures
71
+ const failures = issue.feedback.filter(f => f.type === 'failure' && f.stage === 'execute');
72
+
73
+ if (failures.length === 0) {
74
+ return { has_failures: false };
75
+ }
76
+
77
+ // Parse failure details
78
+ const failureAnalysis = failures.map(f => {
79
+ const detail = JSON.parse(f.content);
80
+ return {
81
+ solution_id: detail.solution_id,
82
+ task_id: detail.task_id,
83
+ error_type: detail.error_type, // test_failure, compilation, timeout, etc.
84
+ message: detail.message,
85
+ stack_trace: detail.stack_trace,
86
+ timestamp: f.created_at
87
+ };
88
+ });
89
+
90
+ // Identify patterns
91
+ const errorTypes = failureAnalysis.map(f => f.error_type);
92
+ const repeatedErrors = errorTypes.filter((e, i, arr) => arr.indexOf(e) !== i);
93
+
94
+ return {
95
+ has_failures: true,
96
+ failure_count: failures.length,
97
+ failures: failureAnalysis,
98
+ patterns: {
99
+ repeated_errors: repeatedErrors, // Same error multiple times
100
+ failed_approaches: [...new Set(failureAnalysis.map(f => f.solution_id))]
101
+ }
102
+ };
103
+ }
104
+ ```
105
+
106
+ **Step 3**: Analyze and classify
107
+ ```javascript
108
+ function analyzeIssue(issue) {
109
+ const failureAnalysis = analyzeFailureHistory(issue);
110
+
111
+ return {
112
+ issue_id: issue.id,
113
+ requirements: extractRequirements(issue.context),
114
+ scope: inferScope(issue.title, issue.context),
115
+ complexity: determineComplexity(issue), // Low | Medium | High
116
+ failure_analysis: failureAnalysis, // Failure context for planning
117
+ is_replan: failureAnalysis.has_failures // Flag for replanning
118
+ }
119
+ }
120
+ ```
121
+
122
+ **Complexity Rules**:
123
+ | Complexity | Files | Tasks |
124
+ |------------|-------|-------|
125
+ | Low | 1-2 | 1-3 |
126
+ | Medium | 3-5 | 3-6 |
127
+ | High | 6+ | 5-10 |
128
+
129
+ #### Phase 2: ACE Exploration
130
+
131
+ **Primary**: ACE semantic search
132
+ ```javascript
133
+ mcp__ace-tool__search_context({
134
+ project_root_path: project_root,
135
+ query: `Find code related to: ${issue.title}. Keywords: ${extractKeywords(issue)}`
136
+ })
137
+ ```
138
+
139
+ **Exploration Checklist**:
140
+ - [ ] Identify relevant files (direct matches)
141
+ - [ ] Find related patterns (similar implementations)
142
+ - [ ] Map integration points
143
+ - [ ] Discover dependencies
144
+ - [ ] Locate test patterns
145
+
146
+ **Fallback Chain**: ACE → smart_search → Grep → rg → Glob
147
+
148
+ | Tool | When to Use |
149
+ |------|-------------|
150
+ | `mcp__ace-tool__search_context` | Semantic search (primary) |
151
+ | `mcp__ccw-tools__smart_search` | Symbol/pattern search |
152
+ | `Grep` | Exact regex matching |
153
+ | `rg` / `grep` | CLI fallback |
154
+ | `Glob` | File path discovery |
155
+
156
+ #### Phase 3: Solution Planning
157
+
158
+ **Failure-Aware Planning** (when `issue.failure_analysis.has_failures === true`):
159
+
160
+ ```javascript
161
+ function planWithFailureContext(issue, exploration, failureAnalysis) {
162
+ // Identify what failed before
163
+ const failedApproaches = failureAnalysis.patterns.failed_approaches;
164
+ const rootCauses = failureAnalysis.failures.map(f => ({
165
+ error: f.error_type,
166
+ message: f.message,
167
+ task: f.task_id
168
+ }));
169
+
170
+ // Design alternative approach
171
+ const approach = `
172
+ **Previous Attempt Analysis**:
173
+ - Failed approaches: ${failedApproaches.join(', ')}
174
+ - Root causes: ${rootCauses.map(r => `${r.error} (${r.task}): ${r.message}`).join('; ')}
175
+
176
+ **Alternative Strategy**:
177
+ - [Describe how this solution addresses root causes]
178
+ - [Explain what's different from failed approaches]
179
+ - [Prevention steps to catch same errors earlier]
180
+ `;
181
+
182
+ // Add explicit verification tasks
183
+ const verificationTasks = rootCauses.map(rc => ({
184
+ verification_type: rc.error,
185
+ check: `Prevent ${rc.error}: ${rc.message}`,
186
+ method: `Add unit test / compile check / timeout limit`
187
+ }));
188
+
189
+ return { approach, verificationTasks };
190
+ }
191
+ ```
192
+
193
+ **Multi-Solution Generation**:
194
+
195
+ Generate multiple candidate solutions when:
196
+ - Issue complexity is HIGH
197
+ - Multiple valid implementation approaches exist
198
+ - Trade-offs between approaches (performance vs simplicity, etc.)
199
+
200
+ | Condition | Solutions | Binding Action |
201
+ |-----------|-----------|----------------|
202
+ | Low complexity, single approach | 1 solution | Execute bind |
203
+ | Medium complexity, clear path | 1-2 solutions | Execute bind if 1, return if 2+ |
204
+ | High complexity, multiple approaches | 2-3 solutions | Return for selection |
205
+
206
+ **Binding Decision** (based SOLELY on final `solutions.length`):
207
+ ```javascript
208
+ // After generating all solutions
209
+ if (solutions.length === 1) {
210
+ exec(`ccw issue bind ${issueId} ${solutions[0].id}`); // MUST execute
211
+ } else {
212
+ return { pending_selection: solutions }; // Return for user choice
213
+ }
214
+ ```
215
+
216
+ **Solution Evaluation** (for each candidate):
217
+ ```javascript
218
+ {
219
+ analysis: { risk: "low|medium|high", impact: "low|medium|high", complexity: "low|medium|high" },
220
+ score: 0.0-1.0 // Higher = recommended
221
+ }
222
+ ```
223
+
224
+ **Task Decomposition** following schema:
225
+ ```javascript
226
+ function decomposeTasks(issue, exploration) {
227
+ const tasks = groups.map(group => ({
228
+ id: `T${taskId++}`, // Pattern: ^T[0-9]+$
229
+ title: group.title,
230
+ scope: inferScope(group), // Module path
231
+ action: inferAction(group), // Create | Update | Implement | ...
232
+ description: group.description,
233
+ files: mapFiles(group), // [{path, target, change, action?, conflict_risk?}]
234
+ implementation: generateSteps(group), // Step-by-step guide
235
+ test: {
236
+ unit: generateUnitTests(group),
237
+ commands: ['npm test']
238
+ },
239
+ convergence: {
240
+ criteria: generateCriteria(group), // Quantified checklist
241
+ verification: generateVerification(group)
242
+ },
243
+ commit: {
244
+ type: inferCommitType(group), // feat | fix | refactor | ...
245
+ scope: inferScope(group),
246
+ message_template: generateCommitMsg(group)
247
+ },
248
+ depends_on: inferDependencies(group, tasks),
249
+ priority: calculatePriorityEnum(group) // "critical"|"high"|"medium"|"low"
250
+ }));
251
+
252
+ // GitHub Reply Task: Add final task if issue has github_url
253
+ if (issue.github_url || issue.github_number) {
254
+ const lastTaskId = tasks[tasks.length - 1]?.id;
255
+ tasks.push({
256
+ id: `T${taskId++}`,
257
+ title: 'Reply to GitHub Issue',
258
+ scope: 'github',
259
+ action: 'Notify',
260
+ description: `Comment on GitHub issue to report completion status`,
261
+ files: [],
262
+ implementation: [
263
+ `Generate completion summary (tasks completed, files changed)`,
264
+ `Post comment via: gh issue comment ${issue.github_number || extractNumber(issue.github_url)} --body "..."`,
265
+ `Include: solution approach, key changes, verification results`
266
+ ],
267
+ test: { unit: [], commands: [] },
268
+ convergence: {
269
+ criteria: ['GitHub comment posted successfully', 'Comment includes completion summary'],
270
+ verification: ['Check GitHub issue for new comment']
271
+ },
272
+ commit: null, // No commit for notification task
273
+ depends_on: lastTaskId ? [lastTaskId] : [], // Depends on last implementation task
274
+ priority: "low" // Lowest priority (run last)
275
+ });
276
+ }
277
+
278
+ return tasks;
279
+ }
280
+ ```
281
+
282
+ #### Phase 4: Validation & Output
283
+
284
+ **Validation**:
285
+ - DAG validation (no circular dependencies)
286
+ - Task validation (all 5 phases present)
287
+ - File isolation check (ensure minimal overlap across issues in batch)
288
+
289
+ **Solution Registration** (via file write):
290
+
291
+ **Step 1: Create solution files**
292
+
293
+ Write solution JSON to JSONL file (one line per solution):
294
+
295
+ ```
296
+ .workflow/issues/solutions/{issue-id}.jsonl
297
+ ```
298
+
299
+ **File Format** (JSONL - each line is a complete solution):
300
+ ```
301
+ {"id":"SOL-GH-123-a7x9","description":"...","approach":"...","analysis":{...},"score":0.85,"tasks":[...]}
302
+ {"id":"SOL-GH-123-b2k4","description":"...","approach":"...","analysis":{...},"score":0.75,"tasks":[...]}
303
+ ```
304
+
305
+ **Solution Schema** (must match CLI `Solution` interface):
306
+ ```typescript
307
+ {
308
+ id: string; // Format: SOL-{issue-id}-{uid}
309
+ description?: string;
310
+ approach?: string;
311
+ tasks: SolutionTask[];
312
+ analysis?: { risk, impact, complexity };
313
+ score?: number;
314
+ // Note: is_bound, created_at are added by CLI on read
315
+ }
316
+ ```
317
+
318
+ **Write Operation**:
319
+ ```javascript
320
+ // Append solution to JSONL file (one line per solution)
321
+ // Use 4-char random uid to avoid collisions across multiple plan runs
322
+ const uid = Math.random().toString(36).slice(2, 6); // e.g., "a7x9"
323
+ const solutionId = `SOL-${issueId}-${uid}`;
324
+ const solutionLine = JSON.stringify({ id: solutionId, ...solution });
325
+
326
+ // Bash equivalent for uid generation:
327
+ // uid=$(cat /dev/urandom | tr -dc 'a-z0-9' | head -c 4)
328
+
329
+ // Read existing, append new line, write back
330
+ const filePath = `.workflow/issues/solutions/${issueId}.jsonl`;
331
+ const existing = existsSync(filePath) ? readFileSync(filePath) : '';
332
+ const newContent = existing.trimEnd() + (existing ? '\n' : '') + solutionLine + '\n';
333
+ Write({ file_path: filePath, content: newContent })
334
+ ```
335
+
336
+ **Step 2: Bind decision**
337
+ - 1 solution → Execute `ccw issue bind <issue-id> <solution-id>`
338
+ - 2+ solutions → Return `pending_selection` (no bind)
339
+
340
+ ---
341
+
342
+ ## 2. Output Requirements
343
+
344
+ ### 2.1 Generate Files (Primary)
345
+
346
+ **Solution file per issue**:
347
+ ```
348
+ .workflow/issues/solutions/{issue-id}.jsonl
349
+ ```
350
+
351
+ Each line is a solution JSON containing tasks. Schema: `cat ~/.ccw/workflows/cli-templates/schemas/solution-schema.json`
352
+
353
+ ### 2.2 Return Summary
354
+
355
+ ```json
356
+ {
357
+ "bound": [{ "issue_id": "...", "solution_id": "...", "task_count": N }],
358
+ "pending_selection": [{ "issue_id": "GH-123", "solutions": [{ "id": "SOL-GH-123-1", "description": "...", "task_count": N }] }]
359
+ }
360
+ ```
361
+
362
+ ---
363
+
364
+ ## 3. Quality Standards
365
+
366
+ ### 3.1 Acceptance Criteria
367
+
368
+ | Good | Bad |
369
+ |------|-----|
370
+ | "3 API endpoints: GET, POST, DELETE" | "API works correctly" |
371
+ | "Response time < 200ms p95" | "Good performance" |
372
+ | "All 4 test cases pass" | "Tests pass" |
373
+
374
+ ### 3.2 Validation Checklist
375
+
376
+ - [ ] ACE search performed for each issue
377
+ - [ ] All files[] paths verified against codebase
378
+ - [ ] Tasks have 2+ implementation steps
379
+ - [ ] All 5 lifecycle phases present
380
+ - [ ] Quantified convergence criteria with verification
381
+ - [ ] Dependencies form valid DAG
382
+ - [ ] Commit follows conventional commits
383
+
384
+ ### 3.3 Guidelines
385
+
386
+ **Bash Tool**:
387
+ - Use `run_in_background=false` for all Bash/CLI calls to ensure foreground execution
388
+
389
+ **ALWAYS**:
390
+ 1. **Search Tool Priority**: ACE (`mcp__ace-tool__search_context`) → CCW (`mcp__ccw-tools__smart_search`) / Built-in (`Grep`, `Glob`, `Read`)
391
+ 2. Read schema first: `cat ~/.ccw/workflows/cli-templates/schemas/solution-schema.json`
392
+ 3. Use ACE semantic search as PRIMARY exploration tool
393
+ 4. Fetch issue details via `ccw issue status <id> --json`
394
+ 5. **Analyze failure history**: Check `issue.feedback` for type='failure', stage='execute'
395
+ 6. **For replanning**: Reference previous failures in `solution.approach`, add prevention steps
396
+ 7. Quantify convergence.criteria with testable conditions
397
+ 8. Validate DAG before output
398
+ 9. Evaluate each solution with `analysis` and `score`
399
+ 10. Write solutions to `.workflow/issues/solutions/{issue-id}.jsonl` (append mode)
400
+ 11. For HIGH complexity: generate 2-3 candidate solutions
401
+ 12. **Solution ID format**: `SOL-{issue-id}-{uid}` where uid is 4 random alphanumeric chars (e.g., `SOL-GH-123-a7x9`)
402
+ 13. **GitHub Reply Task**: If issue has `github_url` or `github_number`, add final task to comment on GitHub issue with completion summary
403
+
404
+ **CONFLICT AVOIDANCE** (for batch processing of similar issues):
405
+ 1. **File isolation**: Each issue's solution should target distinct files when possible
406
+ 2. **Module boundaries**: Prefer solutions that modify different modules/directories
407
+ 3. **Multiple solutions**: When file overlap is unavoidable, generate alternative solutions with different file targets
408
+ 4. **Dependency ordering**: If issues must touch same files, encode execution order via `depends_on`
409
+ 5. **Scope minimization**: Prefer smaller, focused modifications over broad refactoring
410
+
411
+ **NEVER**:
412
+ 1. Execute implementation (return plan only)
413
+ 2. Use vague criteria ("works correctly", "good performance")
414
+ 3. Create circular dependencies
415
+ 4. Generate more than 10 tasks per issue
416
+ 5. Skip bind when `solutions.length === 1` (MUST execute bind command)
417
+
418
+ **OUTPUT**:
419
+ 1. Write solutions to `.workflow/issues/solutions/{issue-id}.jsonl`
420
+ 2. Execute bind or return `pending_selection` based on solution count
421
+ 3. Return JSON: `{ bound: [...], pending_selection: [...] }`