claude-code-workflow 7.2.10 → 7.2.12

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 (331) hide show
  1. package/.claude/agents/cli-planning-agent.md +3 -0
  2. package/.claude/agents/debug-explore-agent.md +1 -0
  3. package/.claude/agents/tdd-developer.md +1 -0
  4. package/.claude/agents/team-worker.md +1 -1
  5. package/.claude/agents/test-action-planning-agent.md +3 -0
  6. package/.claude/agents/test-context-search-agent.md +1 -0
  7. package/.claude/agents/test-fix-agent.md +3 -0
  8. package/.claude/commands/workflow/analyze-with-file.md +108 -54
  9. package/.claude/commands/workflow-tune.md +811 -0
  10. package/.claude/skills/review-code/SKILL.md +2 -0
  11. package/.claude/skills/review-cycle/SKILL.md +4 -0
  12. package/.claude/skills/skill-simplify/phases/02-optimize.md +4 -0
  13. package/.claude/skills/spec-generator/phases/05-epics-stories.md +4 -0
  14. package/.claude/skills/team-arch-opt/specs/team-config.json +5 -5
  15. package/.claude/skills/team-frontend-debug/roles/analyzer/role.md +3 -2
  16. package/.claude/skills/team-perf-opt/roles/coordinator/commands/monitor.md +1 -1
  17. package/.claude/skills/team-perf-opt/specs/team-config.json +5 -5
  18. package/.claude/skills/team-quality-assurance/roles/executor/role.md +2 -1
  19. package/.claude/skills/team-review/roles/reviewer/role.md +2 -1
  20. package/.claude/skills/team-tech-debt/roles/scanner/role.md +2 -1
  21. package/.claude/skills/team-testing/roles/executor/role.md +2 -1
  22. package/.claude/skills/team-testing/roles/generator/role.md +2 -1
  23. package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +2 -1
  24. package/.claude/skills/team-ux-improve/specs/team-config.json +6 -6
  25. package/.claude/skills/workflow-execute/phases/06-review.md +4 -4
  26. package/.claude/skills/workflow-lite-execute/SKILL.md +106 -14
  27. package/.claude/skills/workflow-lite-plan/SKILL.md +34 -72
  28. package/.claude/skills/workflow-lite-test-review/SKILL.md +41 -26
  29. package/.claude/skills/workflow-plan/phases/05-plan-verify.md +4 -0
  30. package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +1 -0
  31. package/.claude/skills/workflow-tdd-plan/phases/05-tdd-task-generation.md +2 -1
  32. package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +1 -0
  33. package/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +2 -1
  34. package/.codex/skills/analyze-with-file/SKILL.md +2 -0
  35. package/.codex/skills/debug-with-file/SKILL.md +4 -0
  36. package/.codex/skills/issue-discover/SKILL.md +1 -0
  37. package/.codex/skills/review-cycle/phases/02-parallel-review.md +3 -0
  38. package/.codex/skills/team-designer/agents/validation-reporter.md +186 -0
  39. package/.codex/skills/team-iterdev/agents/gc-controller.md +193 -0
  40. package/.codex/skills/team-iterdev/agents/task-analyzer.md +206 -0
  41. package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +165 -0
  42. package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +163 -0
  43. package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +182 -0
  44. package/.codex/skills/team-uidesign/agents/completion-handler.md +177 -0
  45. package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +162 -0
  46. package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +4 -0
  47. package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +2 -0
  48. package/ccw/dist/commands/spec.d.ts.map +1 -1
  49. package/ccw/dist/commands/spec.js +9 -4
  50. package/ccw/dist/commands/spec.js.map +1 -1
  51. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  52. package/ccw/dist/core/routes/codexlens-routes.js +3 -1
  53. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  54. package/ccw/dist/tools/spec-index-builder.d.ts +8 -4
  55. package/ccw/dist/tools/spec-index-builder.d.ts.map +1 -1
  56. package/ccw/dist/tools/spec-index-builder.js +8 -4
  57. package/ccw/dist/tools/spec-index-builder.js.map +1 -1
  58. package/ccw/dist/tools/spec-init.d.ts +1 -1
  59. package/ccw/dist/tools/spec-init.d.ts.map +1 -1
  60. package/ccw/dist/tools/spec-init.js +127 -0
  61. package/ccw/dist/tools/spec-init.js.map +1 -1
  62. package/ccw/dist/tools/spec-loader.d.ts.map +1 -1
  63. package/ccw/dist/tools/spec-loader.js +2 -1
  64. package/ccw/dist/tools/spec-loader.js.map +1 -1
  65. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js → AlertDialog-BW9jiZ-p.js} +2 -2
  66. package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js.map → AlertDialog-BW9jiZ-p.js.map} +1 -1
  67. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js → AnalysisPage-ds-w_nVO.js} +2 -2
  68. package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js.map → AnalysisPage-ds-w_nVO.js.map} +1 -1
  69. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js → ApiSettingsPage-DlCbXxTz.js} +2 -2
  70. package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js.map → ApiSettingsPage-DlCbXxTz.js.map} +1 -1
  71. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js → CliModeToggle-Dq3nL4fF.js} +2 -2
  72. package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js.map → CliModeToggle-Dq3nL4fF.js.map} +1 -1
  73. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js → CliSessionSharePage-BNDkEE4u.js} +2 -2
  74. package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js.map → CliSessionSharePage-BNDkEE4u.js.map} +1 -1
  75. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js → CliViewerPage-ChM-uNx_.js} +2 -2
  76. package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js.map → CliViewerPage-ChM-uNx_.js.map} +1 -1
  77. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js +2 -0
  78. package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js.map +1 -0
  79. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js → Collapsible-CRNbykXN.js} +2 -2
  80. package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js.map → Collapsible-CRNbykXN.js.map} +1 -1
  81. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js → CommandsManagerPage-C2JWcemF.js} +2 -2
  82. package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js.map → CommandsManagerPage-C2JWcemF.js.map} +1 -1
  83. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js → DeepWikiPage-CvleOtJy.js} +2 -2
  84. package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js.map → DeepWikiPage-CvleOtJy.js.map} +1 -1
  85. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js → EndpointsPage-CMOWQG64.js} +2 -2
  86. package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js.map → EndpointsPage-CMOWQG64.js.map} +1 -1
  87. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js → ExplorerPage-DaFPRlNo.js} +2 -2
  88. package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js.map → ExplorerPage-DaFPRlNo.js.map} +1 -1
  89. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js → FixSessionPage-CC4p04Az.js} +2 -2
  90. package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js.map → FixSessionPage-CC4p04Az.js.map} +1 -1
  91. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js → FloatingFileBrowser-DROn1xZ5.js} +2 -2
  92. package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js.map → FloatingFileBrowser-DROn1xZ5.js.map} +1 -1
  93. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js → FloatingPanel-CmL_yhDv.js} +2 -2
  94. package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js.map → FloatingPanel-CmL_yhDv.js.map} +1 -1
  95. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js → GraphExplorerPage-DCV5ybKE.js} +2 -2
  96. package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js.map → GraphExplorerPage-DCV5ybKE.js.map} +1 -1
  97. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js → HistoryPage-D0fYQZgc.js} +2 -2
  98. package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js.map → HistoryPage-D0fYQZgc.js.map} +1 -1
  99. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js → HookManagerPage-D2FuJfsM.js} +2 -2
  100. package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js.map → HookManagerPage-D2FuJfsM.js.map} +1 -1
  101. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js → InstallationsPage-tjklillZ.js} +2 -2
  102. package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js.map → InstallationsPage-tjklillZ.js.map} +1 -1
  103. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js → IssueHubPage-E4JVrhO1.js} +2 -2
  104. package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js.map → IssueHubPage-E4JVrhO1.js.map} +1 -1
  105. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js → LiteTasksPage-aJuRoyLt.js} +2 -2
  106. package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js.map → LiteTasksPage-aJuRoyLt.js.map} +1 -1
  107. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js → McpManagerPage-BJeuWJv1.js} +2 -2
  108. package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js.map → McpManagerPage-BJeuWJv1.js.map} +1 -1
  109. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js → MemoryPage-BI4FAXhs.js} +2 -2
  110. package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js.map → MemoryPage-BI4FAXhs.js.map} +1 -1
  111. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js → NotFoundPage-DD2svchp.js} +2 -2
  112. package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js.map → NotFoundPage-DD2svchp.js.map} +1 -1
  113. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js → OrchestratorPage-FC__7yYa.js} +2 -2
  114. package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js.map → OrchestratorPage-FC__7yYa.js.map} +1 -1
  115. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js → ProjectOverviewPage-DBB_-FzV.js} +2 -2
  116. package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js.map → ProjectOverviewPage-DBB_-FzV.js.map} +1 -1
  117. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js → PromptHistoryPage-BwOAvCH8.js} +2 -2
  118. package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js.map → PromptHistoryPage-BwOAvCH8.js.map} +1 -1
  119. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js → ReviewSessionPage-Dd1-g_gp.js} +2 -2
  120. package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js.map → ReviewSessionPage-Dd1-g_gp.js.map} +1 -1
  121. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js → RulesManagerPage-B3RGdsKD.js} +2 -2
  122. package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js.map → RulesManagerPage-B3RGdsKD.js.map} +1 -1
  123. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js → SessionDetailPage-DM-W5R8K.js} +2 -2
  124. package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js.map → SessionDetailPage-DM-W5R8K.js.map} +1 -1
  125. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js → SessionsPage-BVz1KCc7.js} +2 -2
  126. package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js.map → SessionsPage-BVz1KCc7.js.map} +1 -1
  127. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js → SettingsPage-ComW7EZS.js} +4 -4
  128. package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js.map → SettingsPage-ComW7EZS.js.map} +1 -1
  129. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js → SkillsManagerPage-CKom9XwV.js} +2 -2
  130. package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js.map → SkillsManagerPage-CKom9XwV.js.map} +1 -1
  131. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js → SpecsSettingsPage-DQz7WP2s.js} +2 -2
  132. package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js.map → SpecsSettingsPage-DQz7WP2s.js.map} +1 -1
  133. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js → Switch-BPMdND9H.js} +2 -2
  134. package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js.map → Switch-BPMdND9H.js.map} +1 -1
  135. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js → TabsNavigation-qqt70VYL.js} +2 -2
  136. package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js.map → TabsNavigation-qqt70VYL.js.map} +1 -1
  137. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js → TaskDrawer-BqK_qiHX.js} +2 -2
  138. package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js.map → TaskDrawer-BqK_qiHX.js.map} +1 -1
  139. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js → TeamPage-u5_i0Rgh.js} +2 -2
  140. package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js.map → TeamPage-u5_i0Rgh.js.map} +1 -1
  141. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js → TerminalDashboardPage-rUtC9e40.js} +2 -2
  142. package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js.map → TerminalDashboardPage-rUtC9e40.js.map} +1 -1
  143. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js → archive-C3u8YNQF.js} +2 -2
  144. package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js.map → archive-C3u8YNQF.js.map} +1 -1
  145. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js → archive-restore-DfQ998g5.js} +2 -2
  146. package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js.map → archive-restore-DfQ998g5.js.map} +1 -1
  147. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js → arrow-right-BshJM9Po.js} +2 -2
  148. package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js.map → arrow-right-BshJM9Po.js.map} +1 -1
  149. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js → bookmark-plus-D03qJyOZ.js} +2 -2
  150. package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js.map → bookmark-plus-D03qJyOZ.js.map} +1 -1
  151. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js → bot-CyzWuwq0.js} +2 -2
  152. package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js.map → bot-CyzWuwq0.js.map} +1 -1
  153. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js → braces-BPgtyjsG.js} +2 -2
  154. package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js.map → braces-BPgtyjsG.js.map} +1 -1
  155. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js → circle-stop-Dix1AOmw.js} +2 -2
  156. package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js.map → circle-stop-Dix1AOmw.js.map} +1 -1
  157. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js → cpu-CCQ4Q0Zh.js} +2 -2
  158. package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js.map → cpu-CCQ4Q0Zh.js.map} +1 -1
  159. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js → ellipsis-vertical-BpTysg-Y.js} +2 -2
  160. package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js.map → ellipsis-vertical-BpTysg-Y.js.map} +1 -1
  161. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js → eye-DGY1rAZs.js} +2 -2
  162. package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js.map → eye-DGY1rAZs.js.map} +1 -1
  163. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js → eye-off-D8t3JfWG.js} +2 -2
  164. package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js.map → eye-off-D8t3JfWG.js.map} +1 -1
  165. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js → file-json-BAdJb0n8.js} +2 -2
  166. package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js.map → file-json-BAdJb0n8.js.map} +1 -1
  167. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js → file-text-DrJFiOUB.js} +2 -2
  168. package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js.map → file-text-DrJFiOUB.js.map} +1 -1
  169. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js → filter-CKqzYbz7.js} +2 -2
  170. package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js.map → filter-CKqzYbz7.js.map} +1 -1
  171. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js → folder-CV8511y9.js} +2 -2
  172. package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js.map → folder-CV8511y9.js.map} +1 -1
  173. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js → gauge-XKvmu_uU.js} +2 -2
  174. package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js.map → gauge-XKvmu_uU.js.map} +1 -1
  175. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js → globe-C56cDUzX.js} +2 -2
  176. package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js.map → globe-C56cDUzX.js.map} +1 -1
  177. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js → grid-3x3-Bya-suFW.js} +2 -2
  178. package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js.map → grid-3x3-Bya-suFW.js.map} +1 -1
  179. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js → hard-drive-CmuTZpsB.js} +2 -2
  180. package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js.map → hard-drive-CmuTZpsB.js.map} +1 -1
  181. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js → hash-CRPT_tJQ.js} +2 -2
  182. package/ccw/frontend/dist/assets/{hash-Bd1RD285.js.map → hash-CRPT_tJQ.js.map} +1 -1
  183. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js → history-C1pJZQCL.js} +2 -2
  184. package/ccw/frontend/dist/assets/{history-eyyCQA6b.js.map → history-C1pJZQCL.js.map} +1 -1
  185. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js → index-B6TpijCe.js} +2 -2
  186. package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js.map → index-B6TpijCe.js.map} +1 -1
  187. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js → index-Bcq-7r6F.js} +2 -2
  188. package/ccw/frontend/dist/assets/{index-b2C0iFd1.js.map → index-Bcq-7r6F.js.map} +1 -1
  189. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js → index-CI8-rBff.js} +2 -2
  190. package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js.map → index-CI8-rBff.js.map} +1 -1
  191. package/ccw/frontend/dist/assets/{index-CY6Lueph.js → index-Dmt9OiEf.js} +2 -2
  192. package/ccw/frontend/dist/assets/{index-CY6Lueph.js.map → index-Dmt9OiEf.js.map} +1 -1
  193. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js → index-anSMmEF8.js} +2 -2
  194. package/ccw/frontend/dist/assets/{index-DfeBbFXo.js.map → index-anSMmEF8.js.map} +1 -1
  195. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js → index-dWT2M6Ef.js} +4 -4
  196. package/ccw/frontend/dist/assets/{index-B6I7GQC5.js.map → index-dWT2M6Ef.js.map} +1 -1
  197. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js → layout-grid-TSO0BFQE.js} +2 -2
  198. package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js.map → layout-grid-TSO0BFQE.js.map} +1 -1
  199. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js → lightbulb-Caj6fIQD.js} +2 -2
  200. package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js.map → lightbulb-Caj6fIQD.js.map} +1 -1
  201. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js → link-2-DE9lMxa-.js} +2 -2
  202. package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js.map → link-2-DE9lMxa-.js.map} +1 -1
  203. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js → link-BZtPgLW0.js} +2 -2
  204. package/ccw/frontend/dist/assets/{link-CL4JmoHb.js.map → link-BZtPgLW0.js.map} +1 -1
  205. package/ccw/frontend/dist/assets/{list-CDmYFcio.js → list-DubWyY-U.js} +2 -2
  206. package/ccw/frontend/dist/assets/{list-CDmYFcio.js.map → list-DubWyY-U.js.map} +1 -1
  207. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js → map-pin-DwN_48AF.js} +2 -2
  208. package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js.map → map-pin-DwN_48AF.js.map} +1 -1
  209. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js → messages-square-bjxvaiM9.js} +2 -2
  210. package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js.map → messages-square-bjxvaiM9.js.map} +1 -1
  211. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js → minimize-2-CGfBKD_V.js} +2 -2
  212. package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js.map → minimize-2-CGfBKD_V.js.map} +1 -1
  213. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js → package-nzWY6ilt.js} +2 -2
  214. package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js.map → package-nzWY6ilt.js.map} +1 -1
  215. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js → plug-CiLce49C.js} +2 -2
  216. package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js.map → plug-CiLce49C.js.map} +1 -1
  217. package/ccw/frontend/dist/assets/{power-DmIojFl-.js → power-CFLmB-U9.js} +2 -2
  218. package/ccw/frontend/dist/assets/{power-DmIojFl-.js.map → power-CFLmB-U9.js.map} +1 -1
  219. package/ccw/frontend/dist/assets/{save-BFa03OnG.js → save-DuO6OF0C.js} +2 -2
  220. package/ccw/frontend/dist/assets/{save-BFa03OnG.js.map → save-DuO6OF0C.js.map} +1 -1
  221. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js → send-CZk9p0mM.js} +2 -2
  222. package/ccw/frontend/dist/assets/{send-Vet3sN4J.js.map → send-CZk9p0mM.js.map} +1 -1
  223. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js → square-check-big-BY_1YQQg.js} +2 -2
  224. package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js.map → square-check-big-BY_1YQQg.js.map} +1 -1
  225. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js → square-pen-CnZgm6g-.js} +2 -2
  226. package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js.map → square-pen-CnZgm6g-.js.map} +1 -1
  227. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js → star-Cn1F0qy7.js} +2 -2
  228. package/ccw/frontend/dist/assets/{star-BCQHcnSe.js.map → star-Cn1F0qy7.js.map} +1 -1
  229. package/ccw/frontend/dist/assets/{style-CJsrp48L.js → style-Dxs1iXCV.js} +2 -2
  230. package/ccw/frontend/dist/assets/{style-CJsrp48L.js.map → style-Dxs1iXCV.js.map} +1 -1
  231. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js → target-Bz1fLRKH.js} +2 -2
  232. package/ccw/frontend/dist/assets/{target-CBzCJCB1.js.map → target-Bz1fLRKH.js.map} +1 -1
  233. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js → test-tube-C6qCYlDr.js} +2 -2
  234. package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js.map → test-tube-C6qCYlDr.js.map} +1 -1
  235. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js → upload-C71kd4Qs.js} +2 -2
  236. package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js.map → upload-C71kd4Qs.js.map} +1 -1
  237. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js → useApiSettings-CqP2BAJ7.js} +2 -2
  238. package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js.map → useApiSettings-CqP2BAJ7.js.map} +1 -1
  239. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js → useCli-PCoPoVeM.js} +2 -2
  240. package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js.map → useCli-PCoPoVeM.js.map} +1 -1
  241. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js → useCommands-3OfPQPw4.js} +2 -2
  242. package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js.map → useCommands-3OfPQPw4.js.map} +1 -1
  243. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js → useDebounce-bXiFhQx9.js} +2 -2
  244. package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js.map → useDebounce-bXiFhQx9.js.map} +1 -1
  245. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js → useFileExplorer-DEyUm46_.js} +2 -2
  246. package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js.map → useFileExplorer-DEyUm46_.js.map} +1 -1
  247. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js → useLocale-sXTrdxcJ.js} +2 -2
  248. package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js.map → useLocale-sXTrdxcJ.js.map} +1 -1
  249. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js → useSkills-D0W0kXYm.js} +3 -3
  250. package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js.map → useSkills-D0W0kXYm.js.map} +1 -1
  251. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js → useSystemSettings-DZ-8lZsG.js} +2 -2
  252. package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js.map → useSystemSettings-DZ-8lZsG.js.map} +1 -1
  253. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js → wand-sparkles-83GmAYuw.js} +2 -2
  254. package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js.map → wand-sparkles-83GmAYuw.js.map} +1 -1
  255. package/ccw/frontend/dist/index.html +1 -1
  256. package/package.json +1 -1
  257. package/.claude/commands/ddd/auto.md +0 -359
  258. package/.claude/commands/ddd/doc-generate.md +0 -222
  259. package/.claude/commands/ddd/doc-refresh.md +0 -218
  260. package/.claude/commands/ddd/execute.md +0 -416
  261. package/.claude/commands/ddd/index-build.md +0 -212
  262. package/.claude/commands/ddd/plan.md +0 -611
  263. package/.claude/commands/ddd/scan.md +0 -365
  264. package/.claude/commands/ddd/sync.md +0 -353
  265. package/.claude/commands/ddd/update.md +0 -160
  266. package/.claude/commands/idaw/add.md +0 -287
  267. package/.claude/commands/idaw/resume.md +0 -442
  268. package/.claude/commands/idaw/run-coordinate.md +0 -648
  269. package/.claude/commands/idaw/run.md +0 -539
  270. package/.claude/commands/idaw/status.md +0 -182
  271. package/.claude/skills/team-arch-opt/role-specs/analyzer.md +0 -80
  272. package/.claude/skills/team-arch-opt/role-specs/designer.md +0 -118
  273. package/.claude/skills/team-arch-opt/role-specs/refactorer.md +0 -106
  274. package/.claude/skills/team-arch-opt/role-specs/reviewer.md +0 -116
  275. package/.claude/skills/team-arch-opt/role-specs/validator.md +0 -117
  276. package/.claude/skills/team-brainstorm/role-specs/challenger.md +0 -63
  277. package/.claude/skills/team-brainstorm/role-specs/evaluator.md +0 -58
  278. package/.claude/skills/team-brainstorm/role-specs/ideator.md +0 -71
  279. package/.claude/skills/team-brainstorm/role-specs/synthesizer.md +0 -59
  280. package/.claude/skills/team-frontend/role-specs/analyst.md +0 -91
  281. package/.claude/skills/team-frontend/role-specs/architect.md +0 -85
  282. package/.claude/skills/team-frontend/role-specs/developer.md +0 -92
  283. package/.claude/skills/team-frontend/role-specs/qa.md +0 -78
  284. package/.claude/skills/team-issue/role-specs/explorer.md +0 -95
  285. package/.claude/skills/team-issue/role-specs/implementer.md +0 -89
  286. package/.claude/skills/team-issue/role-specs/integrator.md +0 -86
  287. package/.claude/skills/team-issue/role-specs/planner.md +0 -83
  288. package/.claude/skills/team-issue/role-specs/reviewer.md +0 -89
  289. package/.claude/skills/team-iterdev/role-specs/architect.md +0 -64
  290. package/.claude/skills/team-iterdev/role-specs/developer.md +0 -73
  291. package/.claude/skills/team-iterdev/role-specs/reviewer.md +0 -65
  292. package/.claude/skills/team-iterdev/role-specs/tester.md +0 -87
  293. package/.claude/skills/team-perf-opt/role-specs/benchmarker.md +0 -110
  294. package/.claude/skills/team-perf-opt/role-specs/optimizer.md +0 -102
  295. package/.claude/skills/team-perf-opt/role-specs/profiler.md +0 -73
  296. package/.claude/skills/team-perf-opt/role-specs/reviewer.md +0 -91
  297. package/.claude/skills/team-perf-opt/role-specs/strategist.md +0 -114
  298. package/.claude/skills/team-planex/role-specs/executor.md +0 -90
  299. package/.claude/skills/team-planex/role-specs/planner.md +0 -110
  300. package/.claude/skills/team-quality-assurance/role-specs/analyst.md +0 -79
  301. package/.claude/skills/team-quality-assurance/role-specs/executor.md +0 -64
  302. package/.claude/skills/team-quality-assurance/role-specs/generator.md +0 -67
  303. package/.claude/skills/team-quality-assurance/role-specs/scout.md +0 -66
  304. package/.claude/skills/team-quality-assurance/role-specs/strategist.md +0 -70
  305. package/.claude/skills/team-review/role-specs/fixer.md +0 -75
  306. package/.claude/skills/team-review/role-specs/reviewer.md +0 -66
  307. package/.claude/skills/team-review/role-specs/scanner.md +0 -70
  308. package/.claude/skills/team-roadmap-dev/role-specs/executor.md +0 -71
  309. package/.claude/skills/team-roadmap-dev/role-specs/planner.md +0 -77
  310. package/.claude/skills/team-roadmap-dev/role-specs/verifier.md +0 -73
  311. package/.claude/skills/team-tech-debt/role-specs/assessor.md +0 -70
  312. package/.claude/skills/team-tech-debt/role-specs/executor.md +0 -80
  313. package/.claude/skills/team-tech-debt/role-specs/planner.md +0 -71
  314. package/.claude/skills/team-tech-debt/role-specs/scanner.md +0 -85
  315. package/.claude/skills/team-tech-debt/role-specs/validator.md +0 -83
  316. package/.claude/skills/team-testing/role-specs/analyst.md +0 -94
  317. package/.claude/skills/team-testing/role-specs/executor.md +0 -97
  318. package/.claude/skills/team-testing/role-specs/generator.md +0 -96
  319. package/.claude/skills/team-testing/role-specs/strategist.md +0 -82
  320. package/.claude/skills/team-uidesign/role-specs/designer.md +0 -72
  321. package/.claude/skills/team-uidesign/role-specs/implementer.md +0 -74
  322. package/.claude/skills/team-uidesign/role-specs/researcher.md +0 -84
  323. package/.claude/skills/team-uidesign/role-specs/reviewer.md +0 -70
  324. package/.claude/skills/team-ux-improve/role-specs/designer.md +0 -191
  325. package/.claude/skills/team-ux-improve/role-specs/diagnoser.md +0 -110
  326. package/.claude/skills/team-ux-improve/role-specs/explorer.md +0 -109
  327. package/.claude/skills/team-ux-improve/role-specs/implementer.md +0 -164
  328. package/.claude/skills/team-ux-improve/role-specs/scanner.md +0 -117
  329. package/.claude/skills/team-ux-improve/role-specs/tester.md +0 -163
  330. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js +0 -2
  331. package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js.map +0 -1
@@ -0,0 +1,811 @@
1
+ ---
2
+ name: workflow-tune
3
+ description: Workflow tuning - extract commands from reference docs or natural language, execute each via ccw cli --tool claude --mode write, then analyze artifacts via gemini. For testing how commands execute in Claude.
4
+ argument-hint: "<file-path> <intent> | \"step1 | step2 | step3\" | \"skill-a,skill-b\" | --file workflow.json [--depth quick|standard|deep] [-y|--yes] [--auto-fix]"
5
+ allowed-tools: Agent(*), AskUserQuestion(*), TaskCreate(*), TaskUpdate(*), TaskList(*), Read(*), Write(*), Edit(*), Bash(*), Glob(*), Grep(*)
6
+ ---
7
+
8
+ # Workflow Tune
9
+
10
+ 测试 Claude command/skill 的执行效果并优化。提取可执行命令,逐步通过 `ccw cli --tool claude` 执行,分析产物质量,生成优化建议。
11
+
12
+ ## Tool Assignment
13
+
14
+ | Phase | Tool | Mode | Rule |
15
+ |-------|------|------|------|
16
+ | Execute | `claude` | `write` | `universal-rigorous-style` |
17
+ | Analyze | `gemini` | `analysis` | `analysis-review-code-quality` |
18
+ | Synthesize | `gemini` | `analysis` | `analysis-review-architecture` |
19
+
20
+ ## Architecture
21
+
22
+ ```
23
+ Input → Parse → GenTestTask → Confirm → Setup → [resolveCmd → readMeta → assemblePrompt → Execute → STOP → Analyze → STOP]×N → Synthesize → STOP → Report
24
+ ↑ ↑
25
+ Claude 直接生成测试任务 prompt 中注入 test_task
26
+ (无需 CLI 调用) 作为命令的执行输入
27
+ ```
28
+
29
+ ## Input Formats
30
+
31
+ ```
32
+ 1. --file workflow.json → JSON definition
33
+ 2. "cmd1 | cmd2 | cmd3" → pipe-separated commands
34
+ 3. "skill-a,skill-b,skill-c" → comma-separated skills
35
+ 4. natural language → semantic decomposition
36
+ 4a: <file-path> <intent> → extract commands from reference doc via LLM
37
+ 4b: <pure intent text> → intent-verb matching → ccw cli command assembly
38
+ ```
39
+
40
+ **ANTI-PATTERN**: Steps like `{ command: "分析 Phase 管线" }` are WRONG — descriptions, not commands. Correct: `{ command: "/workflow-lite-plan analyze auth module" }` or `{ command: "ccw cli -p '...' --tool claude --mode write" }`
41
+
42
+ ## Utility: Shell Escaping
43
+
44
+ ```javascript
45
+ function escapeForShell(str) {
46
+ // Replace single quotes with escaped version, wrap in single quotes
47
+ return "'" + str.replace(/'/g, "'\\''") + "'";
48
+ }
49
+ ```
50
+
51
+ ## Phase 1: Setup
52
+
53
+ ### Step 1.1: Parse Input + Preference Collection
54
+
55
+ ```javascript
56
+ const args = $ARGUMENTS.trim();
57
+ const autoYes = /\b(-y|--yes)\b/.test(args);
58
+
59
+ // Preference collection (skip if -y)
60
+ if (autoYes) {
61
+ workflowPreferences = { autoYes: true, analysisDepth: 'standard', autoFix: false };
62
+ } else {
63
+ const prefResponse = AskUserQuestion({
64
+ questions: [
65
+ { question: "选择调优配置:", header: "Tune Config", multiSelect: false,
66
+ options: [
67
+ { label: "Quick (轻量分析)", description: "每步简要检查" },
68
+ { label: "Standard (标准分析) (Recommended)", description: "每步详细分析" },
69
+ { label: "Deep (深度分析)", description: "深度审查含架构建议" }
70
+ ]
71
+ },
72
+ { question: "是否自动应用优化建议?", header: "Auto Fix", multiSelect: false,
73
+ options: [
74
+ { label: "No (仅报告) (Recommended)", description: "只分析不修改" },
75
+ { label: "Yes (自动应用)", description: "自动应用高优先级建议" }
76
+ ]
77
+ }
78
+ ]
79
+ });
80
+ const depthMap = { "Quick": "quick", "Standard": "standard", "Deep": "deep" };
81
+ const selectedDepth = Object.keys(depthMap).find(k => prefResponse["Tune Config"].startsWith(k)) || "Standard";
82
+ workflowPreferences = {
83
+ autoYes: false,
84
+ analysisDepth: depthMap[selectedDepth],
85
+ autoFix: prefResponse["Auto Fix"].startsWith("Yes")
86
+ };
87
+ }
88
+
89
+ // Parse --depth override
90
+ const depthMatch = args.match(/--depth\s+(quick|standard|deep)/);
91
+ if (depthMatch) workflowPreferences.analysisDepth = depthMatch[1];
92
+
93
+ // ── Format Detection ──
94
+ let steps = [], workflowName = 'unnamed-workflow', inputFormat = '';
95
+ let projectScenario = ''; // ★ 统一虚构项目场景,所有步骤共享(在 Step 1.1a 生成)
96
+
97
+ const fileMatch = args.match(/--file\s+"?([^\s"]+)"?/);
98
+ if (fileMatch) {
99
+ const wfDef = JSON.parse(Read(fileMatch[1]));
100
+ workflowName = wfDef.name || 'unnamed-workflow';
101
+ projectScenario = wfDef.project_scenario || wfDef.description || '';
102
+ steps = wfDef.steps;
103
+ inputFormat = 'json';
104
+ }
105
+ else if (args.includes('|')) {
106
+ const rawSteps = args.split(/(?:--context|--depth|-y|--yes|--auto-fix)\s+("[^"]*"|\S+)/)[0];
107
+ steps = rawSteps.split('|').map((cmd, i) => ({
108
+ name: `step-${i + 1}`,
109
+ command: cmd.trim(),
110
+ expected_artifacts: [], success_criteria: ''
111
+ }));
112
+ inputFormat = 'pipe';
113
+ }
114
+ else if (/^[\w-]+(,[\w-]+)+/.test(args.split(/\s/)[0])) {
115
+ const skillNames = args.match(/^([^\s]+)/)[1].split(',');
116
+ steps = skillNames.map(name => ({
117
+ name, command: `/${name}`,
118
+ expected_artifacts: [], success_criteria: ''
119
+ }));
120
+ inputFormat = 'skills';
121
+ }
122
+ else {
123
+ inputFormat = 'natural-language';
124
+ let naturalLanguageInput = args.replace(/--\w+\s+"[^"]*"/g, '').replace(/--\w+\s+\S+/g, '').replace(/-y|--yes/g, '').trim();
125
+ const filePathPattern = /(?:[A-Za-z]:[\\\/][^\s,;]+|\/[^\s,;]+\.(?:md|txt|json|yaml|yml|toml)|\.\/?[^\s,;]+\.(?:md|txt|json|yaml|yml|toml))/g;
126
+ const detectedPaths = naturalLanguageInput.match(filePathPattern) || [];
127
+ let referenceDocContent = null, referenceDocPath = null;
128
+ if (detectedPaths.length > 0) {
129
+ referenceDocPath = detectedPaths[0];
130
+ try {
131
+ referenceDocContent = Read(referenceDocPath);
132
+ naturalLanguageInput = naturalLanguageInput.replace(referenceDocPath, '').trim();
133
+ } catch (e) { referenceDocContent = null; }
134
+ }
135
+ // → Mode 4a/4b in Step 1.1b
136
+ }
137
+
138
+ // workflowContext 已移除 — 统一使用 projectScenario(在 Step 1.1a 生成)
139
+ ```
140
+
141
+ ### Step 1.1a: Generate Test Task (测试任务直接生成)
142
+
143
+ > **核心概念**: 所有步骤共享一个**统一虚构项目场景**(如"在线书店网站"),每个命令根据自身能力获得该场景下的一个子任务。由当前 Claude 直接生成,不需要额外 CLI 调用。所有执行在独立沙箱目录中进行,不影响真实项目。
144
+
145
+ ```javascript
146
+ // ★ 测试任务直接生成 — 无需 CLI 调用
147
+ // 来源优先级:
148
+ // 1. JSON 定义中的 step.test_task 字段 (已有则跳过)
149
+ // 2. 当前 Claude 直接生成
150
+
151
+ const stepsNeedTask = steps.filter(s => !s.test_task);
152
+
153
+ if (stepsNeedTask.length > 0) {
154
+ // ── Step A: 生成统一项目场景 ──
155
+ // 根据命令链的整体复杂度,选一个虚构项目作为测试场景
156
+ // 场景必须:完全虚构、与当前工作空间无关、足够支撑所有步骤
157
+ //
158
+ // 场景池示例(根据步骤数量和类型选择合适规模):
159
+ // 1-2 步: 小型项目 — "命令行 TODO 工具" "Markdown 转 HTML 工具" "天气查询 CLI"
160
+ // 3-4 步: 中型项目 — "在线书店网站" "团队任务看板" "博客系统"
161
+ // 5+ 步: 大型项目 — "多租户 SaaS 平台" "电商系统" "在线教育平台"
162
+
163
+ projectScenario = /* Claude 从上述池中选择或自创一个场景 */;
164
+ // 例如: "在线书店网站 — 支持用户注册登录、书籍搜索浏览、购物车、订单管理、评论系统"
165
+
166
+ // ── Step B: 为每步生成子任务 ──
167
+ for (const step of stepsNeedTask) {
168
+ const cmdFile = resolveCommandFile(step.command);
169
+ const cmdMeta = readCommandMeta(cmdFile);
170
+ const cmdDesc = (cmdMeta?.description || step.command).toLowerCase();
171
+
172
+ // 根据命令类型分配场景下的子任务
173
+ // 每个子任务必须按以下模板生成:
174
+ //
175
+ // ┌─────────────────────────────────────────────────┐
176
+ // │ 项目: {projectScenario} │
177
+ // │ 任务: {具体子任务描述} │
178
+ // │ 功能点: │
179
+ // │ 1. {功能点1 — 具体到接口/组件/模块} │
180
+ // │ 2. {功能点2} │
181
+ // │ 3. {功能点3} │
182
+ // │ 技术约束: {语言/框架/架构要求} │
183
+ // │ 验收标准: │
184
+ // │ 1. {可验证的标准1} │
185
+ // │ 2. {可验证的标准2} │
186
+ // └─────────────────────────────────────────────────┘
187
+ //
188
+ // 命令类型 → 子任务映射:
189
+ // plan/design → 架构设计任务: "为{场景}设计技术架构,包含模块划分、数据模型、API 设计"
190
+ // implement → 功能实现任务: "实现{场景}的{某模块},包含{具体功能点}"
191
+ // analyze/review→ 代码分析任务: "先在沙箱创建{场景}的{某模块}示例代码,然后分析其质量"
192
+ // test → 测试任务: "为{场景}的{某模块}编写测试,覆盖{具体场景}"
193
+ // fix/debug → 修复任务: "先在沙箱创建含已知 bug 的代码,然后诊断修复"
194
+ // refactor → 重构任务: "先在沙箱创建可工作但需重构的代码,然后重构"
195
+
196
+ step.test_task = /* 按上述模板生成,必须包含:项目、任务、功能点、技术约束、验收标准 */;
197
+ step.acceptance_criteria = /* 从 test_task 中提取 2-4 条可验证标准 */;
198
+ step.complexity_level = /plan|design|architect/i.test(cmdDesc) ? 'high'
199
+ : /test|lint|format/i.test(cmdDesc) ? 'low' : 'medium';
200
+ }
201
+ }
202
+ ```
203
+
204
+ **模拟示例** — 输入 `workflow-lite-plan,workflow-lite-execute`:
205
+
206
+ ```
207
+ 场景: 在线书店网站 — 支持用户注册登录、书籍搜索、购物车、订单管理
208
+
209
+ Step 1 (workflow-lite-plan → plan 类, high):
210
+ 项目: 在线书店网站
211
+ 任务: 为在线书店设计技术架构和实现计划
212
+ 功能点:
213
+ 1. 用户模块 — 注册、登录、个人信息管理
214
+ 2. 书籍模块 — 搜索、分类浏览、详情页
215
+ 3. 交易模块 — 购物车、下单、支付状态
216
+ 4. 数据模型 — User, Book, Order, CartItem 表结构设计
217
+ 技术约束: TypeScript + Express + SQLite, REST API
218
+ 验收标准:
219
+ 1. 输出包含模块划分和依赖关系
220
+ 2. 包含数据模型定义
221
+ 3. 包含 API 路由清单
222
+ 4. 包含实现步骤分解
223
+
224
+ Step 2 (workflow-lite-execute → implement 类, medium):
225
+ 项目: 在线书店网站
226
+ 任务: 根据 Step 1 的计划,实现书籍搜索和浏览模块
227
+ 功能点:
228
+ 1. GET /api/books — 分页列表,支持按标题/作者搜索
229
+ 2. GET /api/books/:id — 书籍详情
230
+ 3. GET /api/categories — 分类列表
231
+ 4. Book 数据模型 + seed 数据
232
+ 技术约束: TypeScript + Express + SQLite, 沿用 Step 1 架构
233
+ 验收标准:
234
+ 1. API 可正常调用返回 JSON
235
+ 2. 搜索支持模糊匹配
236
+ 3. 包含至少 5 条 seed 数据
237
+ ```
238
+
239
+ ### Step 1.1b: Semantic Decomposition (Format 4 only)
240
+
241
+ #### Mode 4a: Reference Document → LLM Extraction
242
+
243
+ ```javascript
244
+ if (inputFormat === 'natural-language' && referenceDocContent) {
245
+ const extractPrompt = `PURPOSE: Extract ACTUAL EXECUTABLE COMMANDS from the reference document. The user wants to TEST these commands by running them.
246
+
247
+ USER INTENT: ${naturalLanguageInput}
248
+ REFERENCE DOCUMENT: ${referenceDocPath}
249
+
250
+ DOCUMENT CONTENT:
251
+ ${referenceDocContent}
252
+
253
+ CRITICAL RULES:
254
+ - "command" field MUST be a real executable: slash command (/skill-name args), ccw cli call, or shell command
255
+ - CORRECT: { "command": "/workflow-lite-plan analyze auth module" }
256
+ - CORRECT: { "command": "ccw cli -p 'review code' --tool claude --mode write" }
257
+ - WRONG: { "command": "分析 Phase 管线" } ← DESCRIPTION, not command
258
+ - Default mode to "write"
259
+
260
+ EXPECTED OUTPUT (strict JSON):
261
+ {
262
+ "workflow_name": "<name>",
263
+ "project_scenario": "<虚构项目场景>",
264
+ "steps": [{ "name": "", "command": "<executable>", "expected_artifacts": [], "success_criteria": "" }]
265
+ }`;
266
+
267
+ Bash({
268
+ command: `ccw cli -p ${escapeForShell(extractPrompt)} --tool claude --mode write --rule universal-rigorous-style`,
269
+ run_in_background: true, timeout: 300000
270
+ });
271
+ // ■ STOP — wait for hook callback, parse JSON → steps[]
272
+ }
273
+ ```
274
+
275
+ #### Mode 4b: Pure Intent → Command Assembly
276
+
277
+ ```javascript
278
+ if (inputFormat === 'natural-language' && !referenceDocContent) {
279
+ // Intent → rule mapping for ccw cli command generation
280
+ const intentMap = [
281
+ { pattern: /分析|analyze|审查|inspect|scan/i, name: 'analyze', rule: 'analysis-analyze-code-patterns' },
282
+ { pattern: /评审|review|code.?review/i, name: 'review', rule: 'analysis-review-code-quality' },
283
+ { pattern: /诊断|debug|排查|diagnose/i, name: 'diagnose', rule: 'analysis-diagnose-bug-root-cause' },
284
+ { pattern: /安全|security|漏洞/i, name: 'security-audit', rule: 'analysis-assess-security-risks' },
285
+ { pattern: /性能|performance|perf/i, name: 'perf-analysis', rule: 'analysis-analyze-performance' },
286
+ { pattern: /架构|architecture/i, name: 'arch-review', rule: 'analysis-review-architecture' },
287
+ { pattern: /修复|fix|repair|解决/i, name: 'fix', rule: 'development-debug-runtime-issues' },
288
+ { pattern: /实现|implement|开发|create|新增/i, name: 'implement', rule: 'development-implement-feature' },
289
+ { pattern: /重构|refactor/i, name: 'refactor', rule: 'development-refactor-codebase' },
290
+ { pattern: /测试|test/i, name: 'test', rule: 'development-generate-tests' },
291
+ { pattern: /规划|plan|设计|design/i, name: 'plan', rule: 'planning-plan-architecture-design' },
292
+ ];
293
+
294
+ const segments = naturalLanguageInput
295
+ .split(/[,,;;、]|(?:然后|接着|之后|最后|再|并|and then|then|finally|next)\s*/i)
296
+ .map(s => s.trim()).filter(Boolean);
297
+
298
+ // ★ 将意图文本转化为完整的 ccw cli 命令
299
+ steps = segments.map((segment, i) => {
300
+ const matched = intentMap.find(m => m.pattern.test(segment));
301
+ const rule = matched?.rule || 'universal-rigorous-style';
302
+ // 组装真正可执行的命令
303
+ const command = `ccw cli -p ${escapeForShell('PURPOSE: ' + segment + '\\nTASK: Execute based on intent\\nCONTEXT: @**/*')} --tool claude --mode write --rule ${rule}`;
304
+ return {
305
+ name: matched?.name || `step-${i + 1}`,
306
+ command,
307
+ original_intent: segment, // 保留原始意图用于分析
308
+ expected_artifacts: [], success_criteria: ''
309
+ };
310
+ });
311
+ }
312
+ ```
313
+
314
+ ### Step 1.1c: Execution Plan Confirmation
315
+
316
+ ```javascript
317
+ function generateCommandDoc(steps, workflowName, projectScenario, analysisDepth) {
318
+ const stepTable = steps.map((s, i) => {
319
+ const cmdPreview = s.command.length > 60 ? s.command.substring(0, 57) + '...' : s.command;
320
+ const taskPreview = (s.test_task || '-').length > 40 ? s.test_task.substring(0, 37) + '...' : (s.test_task || '-');
321
+ return `| ${i + 1} | ${s.name} | \`${cmdPreview}\` | ${taskPreview} |`;
322
+ }).join('\n');
323
+
324
+ return `# Workflow Tune — Execution Plan\n\n**Workflow**: ${workflowName}\n**Test Project**: ${projectScenario}\n**Steps**: ${steps.length}\n**Depth**: ${analysisDepth}\n\n| # | Name | Command | Test Task |\n|---|------|---------|-----------|\n${stepTable}`;
325
+ }
326
+
327
+ const commandDoc = generateCommandDoc(steps, workflowName, projectScenario, workflowPreferences.analysisDepth);
328
+
329
+ if (!workflowPreferences.autoYes) {
330
+ const confirmation = AskUserQuestion({
331
+ questions: [{
332
+ question: commandDoc + "\n\n确认执行以上 Workflow 调优计划?", header: "Confirm Execution", multiSelect: false,
333
+ options: [
334
+ { label: "Execute (确认执行)", description: "按计划开始执行" },
335
+ { label: "Cancel (取消)", description: "取消" }
336
+ ]
337
+ }]
338
+ });
339
+ if (confirmation["Confirm Execution"].startsWith("Cancel")) return;
340
+ }
341
+ ```
342
+
343
+ ### Step 1.2: (Merged into Step 1.1a)
344
+
345
+ > Test requirements (acceptance_criteria) are now generated together with test_task in Step 1.1a, avoiding an extra CLI call.
346
+
347
+ ### Step 1.3: Create Workspace + Sandbox Project
348
+
349
+ ```javascript
350
+ const ts = Date.now();
351
+ const workDir = `.workflow/.scratchpad/workflow-tune-${ts}`;
352
+
353
+ // ★ 创建独立沙箱项目目录 — 所有命令执行在此目录中,不影响真实项目
354
+ const sandboxDir = `${workDir}/sandbox`;
355
+ Bash(`mkdir -p "${workDir}/steps" "${sandboxDir}"`);
356
+ // 初始化沙箱为独立 git 仓库(部分命令依赖 git 环境)
357
+ Bash(`cd "${sandboxDir}" && git init && echo "# Sandbox Project" > README.md && git add . && git commit -m "init sandbox"`);
358
+
359
+ for (let i = 0; i < steps.length; i++) Bash(`mkdir -p "${workDir}/steps/step-${i + 1}/artifacts"`);
360
+
361
+ Write(`${workDir}/command-doc.md`, commandDoc);
362
+
363
+ const initialState = {
364
+ status: 'running', started_at: new Date().toISOString(),
365
+ workflow_name: workflowName, project_scenario: projectScenario,
366
+ analysis_depth: workflowPreferences.analysisDepth, auto_fix: workflowPreferences.autoFix,
367
+ sandbox_dir: sandboxDir, // ★ 独立沙箱项目目录
368
+ current_step: 0, // ★ State machine cursor
369
+ current_phase: 'execute', // 'execute' | 'analyze'
370
+ steps: steps.map((s, i) => ({
371
+ ...s, index: i, status: 'pending',
372
+ test_task: s.test_task || '', // ★ 每步的测试任务
373
+ execution: null, analysis: null,
374
+ test_requirements: s.test_requirements || null
375
+ })),
376
+ gemini_session_id: null, // ★ Updated after each gemini callback
377
+ work_dir: workDir,
378
+ errors: [], error_count: 0, max_errors: 3
379
+ };
380
+
381
+ Write(`${workDir}/workflow-state.json`, JSON.stringify(initialState, null, 2));
382
+ Write(`${workDir}/process-log.md`, `# Process Log\n\n**Workflow**: ${workflowName}\n**Test Project**: ${projectScenario}\n**Steps**: ${steps.length}\n**Started**: ${new Date().toISOString()}\n\n---\n\n`);
383
+ ```
384
+
385
+ ## Phase 2: Execute Step
386
+
387
+ ### resolveCommandFile — Slash command → file path
388
+
389
+ ```javascript
390
+ function resolveCommandFile(command) {
391
+ const cmdMatch = command.match(/^\/?([^\s]+)/);
392
+ if (!cmdMatch) return null;
393
+ const cmdName = cmdMatch[1];
394
+ const cmdPath = cmdName.replace(/:/g, '/');
395
+
396
+ const searchRoots = ['.claude', '~/.claude'];
397
+
398
+ for (const root of searchRoots) {
399
+ const candidates = [
400
+ `${root}/commands/${cmdPath}.md`,
401
+ `${root}/commands/${cmdPath}/index.md`,
402
+ ];
403
+ for (const candidate of candidates) {
404
+ try { Read(candidate, { limit: 1 }); return candidate; } catch {}
405
+ }
406
+ }
407
+
408
+ for (const root of searchRoots) {
409
+ const candidates = [
410
+ `${root}/skills/${cmdName}/SKILL.md`,
411
+ `${root}/skills/${cmdPath.replace(/\//g, '-')}/SKILL.md`,
412
+ ];
413
+ for (const candidate of candidates) {
414
+ try { Read(candidate, { limit: 1 }); return candidate; } catch {}
415
+ }
416
+ }
417
+
418
+ return null;
419
+ }
420
+ ```
421
+
422
+ ### readCommandMeta — Read YAML frontmatter + body summary
423
+
424
+ ```javascript
425
+ function readCommandMeta(filePath) {
426
+ if (!filePath) return null;
427
+
428
+ const content = Read(filePath);
429
+ const meta = { filePath, name: '', description: '', argumentHint: '', allowedTools: '', bodySummary: '' };
430
+
431
+ const yamlMatch = content.match(/^---\n([\s\S]*?)\n---/);
432
+ if (yamlMatch) {
433
+ const yaml = yamlMatch[1];
434
+ const nameMatch = yaml.match(/^name:\s*(.+)$/m);
435
+ const descMatch = yaml.match(/^description:\s*(.+)$/m);
436
+ const hintMatch = yaml.match(/^argument-hint:\s*"?(.+?)"?\s*$/m);
437
+ const toolsMatch = yaml.match(/^allowed-tools:\s*(.+)$/m);
438
+
439
+ if (nameMatch) meta.name = nameMatch[1].trim();
440
+ if (descMatch) meta.description = descMatch[1].trim();
441
+ if (hintMatch) meta.argumentHint = hintMatch[1].trim();
442
+ if (toolsMatch) meta.allowedTools = toolsMatch[1].trim();
443
+ }
444
+
445
+ const bodyStart = content.indexOf('---', content.indexOf('---') + 3);
446
+ if (bodyStart !== -1) {
447
+ const body = content.substring(bodyStart + 3).trim();
448
+ meta.bodySummary = body.split('\n').slice(0, 30).join('\n');
449
+ }
450
+
451
+ return meta;
452
+ }
453
+ ```
454
+
455
+ ### assembleStepPrompt — Build execution prompt from command metadata
456
+
457
+ ```javascript
458
+ function assembleStepPrompt(step, stepIdx, state) {
459
+ // ── 1. Resolve command file + metadata ──
460
+ const isSlashCmd = step.command.startsWith('/');
461
+ const cmdFile = isSlashCmd ? resolveCommandFile(step.command) : null;
462
+ const cmdMeta = readCommandMeta(cmdFile);
463
+ const cmdArgs = isSlashCmd ? step.command.replace(/^\/?[^\s]+\s*/, '').trim() : '';
464
+
465
+ // ── 2. Prior/next step context ──
466
+ const prevStep = stepIdx > 0 ? state.steps[stepIdx - 1] : null;
467
+ const nextStep = stepIdx < state.steps.length - 1 ? state.steps[stepIdx + 1] : null;
468
+
469
+ const priorContext = prevStep
470
+ ? `PRIOR STEP: "${prevStep.name}" — ${prevStep.command}\n Status: ${prevStep.status} | Artifacts: ${prevStep.execution?.artifact_count || 0}`
471
+ : 'PRIOR STEP: None (first step)';
472
+
473
+ const nextContext = nextStep
474
+ ? `NEXT STEP: "${nextStep.name}" — ${nextStep.command}\n Ensure output is consumable by next step`
475
+ : 'NEXT STEP: None (last step)';
476
+
477
+ // ── 3. Acceptance criteria (from test_task generation) ──
478
+ const criteria = step.acceptance_criteria || [];
479
+ const testReqSection = criteria.length > 0
480
+ ? `ACCEPTANCE CRITERIA:\n${criteria.map((c, i) => ` ${i + 1}. ${c}`).join('\n')}`
481
+ : '';
482
+
483
+ // ── 4. Test task — the concrete scenario to drive execution ──
484
+ const testTask = step.test_task || '';
485
+ const testTaskSection = testTask
486
+ ? `TEST TASK (用此任务驱动命令执行):\n ${testTask}`
487
+ : '';
488
+
489
+ // ── 5. Build prompt based on whether command has metadata ──
490
+ if (cmdMeta) {
491
+ // Slash command with resolved file — rich context prompt
492
+ return `PURPOSE: Execute workflow step "${step.name}" (${stepIdx + 1}/${state.steps.length}).
493
+
494
+ COMMAND DEFINITION:
495
+ Name: ${cmdMeta.name}
496
+ Description: ${cmdMeta.description}
497
+ Argument Format: ${cmdMeta.argumentHint || 'none'}
498
+ Allowed Tools: ${cmdMeta.allowedTools || 'default'}
499
+ Source: ${cmdMeta.filePath}
500
+
501
+ COMMAND TO EXECUTE: ${step.command}
502
+ ARGUMENTS: ${cmdArgs || '(no arguments)'}
503
+
504
+ ${testTaskSection}
505
+
506
+ COMMAND REFERENCE (first 30 lines):
507
+ ${cmdMeta.bodySummary}
508
+
509
+ PROJECT: ${state.project_scenario}
510
+ SANDBOX PROJECT: ${state.sandbox_dir}
511
+ OUTPUT DIR: ${state.work_dir}/steps/step-${stepIdx + 1}
512
+
513
+ ${priorContext}
514
+ ${nextContext}
515
+ ${testReqSection}
516
+
517
+ TASK: Execute the command as described in COMMAND DEFINITION, using TEST TASK as the input/scenario. Use the COMMAND REFERENCE to understand expected behavior. All work happens in the SANDBOX PROJECT directory (an isolated empty project, NOT the real workspace). Auto-confirm all prompts.
518
+ CONSTRAINTS: Stay scoped to this step only. Follow the command's own execution flow. The TEST TASK is the real work — treat it as the $ARGUMENTS input to the command. Do NOT read/modify files outside SANDBOX PROJECT.`;
519
+
520
+ } else {
521
+ // Shell command, ccw cli command, or unresolved command
522
+ return `PURPOSE: Execute workflow step "${step.name}" (${stepIdx + 1}/${state.steps.length}).
523
+ COMMAND: ${step.command}
524
+ ${testTaskSection}
525
+ PROJECT: ${state.project_scenario}
526
+ SANDBOX PROJECT: ${state.sandbox_dir}
527
+ OUTPUT DIR: ${state.work_dir}/steps/step-${stepIdx + 1}
528
+
529
+ ${priorContext}
530
+ ${nextContext}
531
+ ${testReqSection}
532
+
533
+ TASK: Execute the COMMAND above with TEST TASK as the input scenario. All work happens in the SANDBOX PROJECT directory (an isolated empty project). Auto-confirm all prompts.
534
+ CONSTRAINTS: Stay scoped to this step only. The TEST TASK is the real work to execute. Do NOT read/modify files outside SANDBOX PROJECT.`;
535
+ }
536
+ }
537
+ ```
538
+
539
+ ### Step Execution
540
+
541
+ ```javascript
542
+ const stepIdx = state.current_step;
543
+ const step = state.steps[stepIdx];
544
+ const stepDir = `${state.work_dir}/steps/step-${stepIdx + 1}`;
545
+
546
+ // Pre-execution: snapshot sandbox directory files
547
+ const preFiles = Bash(`find "${state.sandbox_dir}" -type f 2>/dev/null | sort`).stdout.trim();
548
+ Write(`${stepDir}/pre-exec-snapshot.txt`, preFiles || '(empty)');
549
+
550
+ const startTime = Date.now();
551
+ const prompt = assembleStepPrompt(step, stepIdx, state);
552
+
553
+ // ★ All steps execute via ccw cli --tool claude --mode write
554
+ // ★ --cd 指向沙箱目录(独立项目),不影响真实工作空间
555
+ Bash({
556
+ command: `ccw cli -p ${escapeForShell(prompt)} --tool claude --mode write --rule universal-rigorous-style --cd "${state.sandbox_dir}"`,
557
+ run_in_background: true, timeout: 600000
558
+ });
559
+ // ■ STOP — wait for hook callback
560
+ ```
561
+
562
+ ### Post-Execute Callback Handler
563
+
564
+ ```javascript
565
+ // ★ This runs after receiving the ccw cli callback
566
+
567
+ const duration = Date.now() - startTime;
568
+
569
+ // Collect artifacts by scanning sandbox (not git diff — sandbox is an independent project)
570
+ const postFiles = Bash(`find "${state.sandbox_dir}" -type f -newer "${stepDir}/pre-exec-snapshot.txt" 2>/dev/null | sort`).stdout.trim();
571
+ const newArtifacts = postFiles ? postFiles.split('\n').filter(f => !f.endsWith('.git/')) : [];
572
+
573
+ const artifactManifest = {
574
+ step: step.name, step_index: stepIdx,
575
+ success: true, duration_ms: duration,
576
+ artifacts: newArtifacts.map(f => ({
577
+ path: f,
578
+ type: f.endsWith('.md') ? 'markdown' : f.endsWith('.json') ? 'json' : 'other'
579
+ })),
580
+ collected_at: new Date().toISOString()
581
+ };
582
+ Write(`${stepDir}/artifacts-manifest.json`, JSON.stringify(artifactManifest, null, 2));
583
+
584
+ // Update state
585
+ state.steps[stepIdx].status = 'executed';
586
+ state.steps[stepIdx].execution = {
587
+ success: true, duration_ms: duration,
588
+ artifact_count: newArtifacts.length
589
+ };
590
+ state.current_phase = 'analyze';
591
+ Write(`${state.work_dir}/workflow-state.json`, JSON.stringify(state, null, 2));
592
+
593
+ // → Proceed to Phase 3 for this step
594
+ ```
595
+
596
+ ## Phase 3: Analyze Step (per step, via gemini)
597
+
598
+ ```javascript
599
+ const manifest = JSON.parse(Read(`${stepDir}/artifacts-manifest.json`));
600
+
601
+ // Build artifact content for analysis
602
+ let artifactSummary = '';
603
+ if (state.analysis_depth === 'quick') {
604
+ artifactSummary = manifest.artifacts.map(a => `- ${a.path} (${a.type})`).join('\n');
605
+ } else {
606
+ const maxLines = state.analysis_depth === 'deep' ? 300 : 150;
607
+ artifactSummary = manifest.artifacts.map(a => {
608
+ try { return `--- ${a.path} ---\n${Read(a.path, { limit: maxLines })}`; }
609
+ catch { return `--- ${a.path} --- [unreadable]`; }
610
+ }).join('\n\n');
611
+ }
612
+
613
+ const criteria = step.acceptance_criteria || [];
614
+ const testTaskDesc = step.test_task ? `TEST TASK: ${step.test_task}` : '';
615
+ const criteriaSection = criteria.length > 0
616
+ ? `ACCEPTANCE CRITERIA:\n${criteria.map((c, i) => ` ${i + 1}. ${c}`).join('\n')}`
617
+ : '';
618
+
619
+ const analysisPrompt = `PURPOSE: Evaluate execution quality of step "${step.name}" (${stepIdx + 1}/${state.steps.length}).
620
+ WORKFLOW: ${state.workflow_name} — ${state.project_scenario}
621
+ COMMAND: ${step.command}
622
+ ${testTaskDesc}
623
+ ${criteriaSection}
624
+ EXECUTION: Duration ${step.execution.duration_ms}ms | Artifacts: ${manifest.artifacts.length}
625
+ ARTIFACTS:\n${artifactSummary}
626
+ EXPECTED OUTPUT (strict JSON):
627
+ { "quality_score": <0-100>, "requirement_match": { "pass": <bool>, "criteria_met": [], "criteria_missed": [], "fail_signals_detected": [] }, "execution_assessment": { "success": <bool>, "completeness": "", "notes": "" }, "artifact_assessment": { "count": <n>, "quality": "", "key_outputs": [], "missing_outputs": [] }, "issues": [{ "severity": "critical|high|medium|low", "description": "", "suggestion": "" }], "optimization_opportunities": [{ "area": "", "description": "", "impact": "high|medium|low" }], "step_summary": "" }`;
628
+
629
+ let cliCommand = `ccw cli -p ${escapeForShell(analysisPrompt)} --tool gemini --mode analysis --rule analysis-review-code-quality`;
630
+ if (state.gemini_session_id) cliCommand += ` --resume ${state.gemini_session_id}`;
631
+ Bash({ command: cliCommand, run_in_background: true, timeout: 300000 });
632
+ // ■ STOP — wait for hook callback
633
+ ```
634
+
635
+ ### Post-Analyze Callback Handler
636
+
637
+ ```javascript
638
+ // ★ Parse analysis result JSON from callback
639
+ const analysisResult = /* parsed from callback output */;
640
+
641
+ // ★ Capture gemini session ID for resume chain
642
+ // Session ID is in stderr: [CCW_EXEC_ID=gem-xxxxxx-xxxx]
643
+ state.gemini_session_id = /* captured from callback exec_id */;
644
+
645
+ Write(`${stepDir}/step-${stepIdx + 1}-analysis.json`, JSON.stringify(analysisResult, null, 2));
646
+
647
+ // Update state
648
+ state.steps[stepIdx].analysis = {
649
+ quality_score: analysisResult.quality_score,
650
+ requirement_pass: analysisResult.requirement_match?.pass,
651
+ issue_count: (analysisResult.issues || []).length
652
+ };
653
+ state.steps[stepIdx].status = 'completed';
654
+
655
+ // Append to process log
656
+ const logEntry = `## Step ${stepIdx + 1}: ${step.name}\n- Score: ${analysisResult.quality_score}/100\n- Req: ${analysisResult.requirement_match?.pass ? 'PASS' : 'FAIL'}\n- Issues: ${(analysisResult.issues || []).length}\n- Summary: ${analysisResult.step_summary}\n\n`;
657
+ Edit(`${state.work_dir}/process-log.md`, /* append logEntry */);
658
+
659
+ // ★ Advance state machine
660
+ state.current_step = stepIdx + 1;
661
+ state.current_phase = 'execute';
662
+ Write(`${state.work_dir}/workflow-state.json`, JSON.stringify(state, null, 2));
663
+
664
+ // ★ Decision: advance or synthesize
665
+ if (state.current_step < state.steps.length) {
666
+ // → Back to Phase 2 for next step
667
+ } else {
668
+ // → Phase 4: Synthesize
669
+ }
670
+ ```
671
+
672
+ ## Step Loop — State Machine
673
+
674
+ ```
675
+ NOT a sync for-loop. Each step follows this state machine:
676
+
677
+ ┌─────────────────────────────────────────────────────┐
678
+ │ state.current_step = N, state.current_phase = X │
679
+ ├─────────────────────────────────────────────────────┤
680
+ │ phase='execute' → Phase 2 → ccw cli claude → STOP │
681
+ │ callback → collect artifacts → phase='analyze' │
682
+ │ phase='analyze' → Phase 3 → ccw cli gemini → STOP │
683
+ │ callback → save analysis → current_step++ │
684
+ │ if current_step < total → phase='execute' (loop) │
685
+ │ else → Phase 4 (synthesize) │
686
+ └─────────────────────────────────────────────────────┘
687
+
688
+ Error handling:
689
+ - Execute timeout → retry once, then mark failed, advance
690
+ - Analyze failure → retry without --resume, then skip analysis
691
+ - 3+ consecutive errors → terminate, jump to Phase 5 partial report
692
+ ```
693
+
694
+ ## Phase 4: Synthesize (via gemini)
695
+
696
+ ```javascript
697
+ const stepAnalyses = state.steps.map((step, i) => {
698
+ try { return { step: step.name, content: Read(`${state.work_dir}/steps/step-${i + 1}/step-${i + 1}-analysis.json`) }; }
699
+ catch { return { step: step.name, content: '[Not available]' }; }
700
+ });
701
+
702
+ const scores = state.steps.map(s => s.analysis?.quality_score).filter(Boolean);
703
+ const avgScore = scores.length > 0 ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length) : 0;
704
+
705
+ const synthesisPrompt = `PURPOSE: Synthesize all step analyses into holistic workflow assessment with actionable optimization plan.
706
+ WORKFLOW: ${state.workflow_name} — ${state.project_scenario}
707
+ Steps: ${state.steps.length} | Avg Quality: ${avgScore}/100
708
+ STEP ANALYSES:\n${stepAnalyses.map(a => `### ${a.step}\n${a.content}`).join('\n\n---\n\n')}
709
+ Evaluate: coherence across steps, handoff quality, redundancy, bottlenecks.
710
+ EXPECTED OUTPUT (strict JSON):
711
+ { "workflow_score": <0-100>, "coherence": { "score": <0-100>, "assessment": "", "gaps": [] }, "bottlenecks": [{ "step": "", "issue": "", "suggestion": "" }], "per_step_improvements": [{ "step": "", "priority": "high|medium|low", "action": "" }], "workflow_improvements": [{ "area": "", "description": "", "impact": "high|medium|low" }], "summary": "" }`;
712
+
713
+ let cliCommand = `ccw cli -p ${escapeForShell(synthesisPrompt)} --tool gemini --mode analysis --rule analysis-review-architecture`;
714
+ if (state.gemini_session_id) cliCommand += ` --resume ${state.gemini_session_id}`;
715
+ Bash({ command: cliCommand, run_in_background: true, timeout: 300000 });
716
+ // ■ STOP — wait for hook callback → parse JSON, write synthesis.json, update state
717
+ ```
718
+
719
+ ## Phase 5: Report
720
+
721
+ ```javascript
722
+ const synthesis = JSON.parse(Read(`${state.work_dir}/synthesis.json`));
723
+ const scores = state.steps.map(s => s.analysis?.quality_score).filter(Boolean);
724
+ const avgScore = scores.length > 0 ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length) : 0;
725
+ const totalIssues = state.steps.reduce((sum, s) => sum + (s.analysis?.issue_count || 0), 0);
726
+
727
+ const stepTable = state.steps.map((s, i) => {
728
+ const reqStr = s.analysis?.requirement_pass === true ? 'PASS' : s.analysis?.requirement_pass === false ? 'FAIL' : '-';
729
+ return `| ${i + 1} | ${s.name} | ${s.execution?.success ? 'OK' : 'FAIL'} | ${reqStr} | ${s.analysis?.quality_score || '-'} | ${s.analysis?.issue_count || 0} |`;
730
+ }).join('\n');
731
+
732
+ const improvements = (synthesis.per_step_improvements || [])
733
+ .filter(imp => imp.priority === 'high')
734
+ .map(imp => `- **${imp.step}**: ${imp.action}`)
735
+ .join('\n');
736
+
737
+ const report = `# Workflow Tune Report
738
+
739
+ | Field | Value |
740
+ |---|---|
741
+ | Workflow | ${state.workflow_name} |
742
+ | Test Project | ${state.project_scenario} |
743
+ | Workflow Score | ${synthesis.workflow_score || avgScore}/100 |
744
+ | Avg Step Score | ${avgScore}/100 |
745
+ | Total Issues | ${totalIssues} |
746
+ | Coherence | ${synthesis.coherence?.score || '-'}/100 |
747
+
748
+ ## Step Results
749
+
750
+ | # | Step | Exec | Req | Quality | Issues |
751
+ |---|------|------|-----|---------|--------|
752
+ ${stepTable}
753
+
754
+ ## High Priority Improvements
755
+
756
+ ${improvements || 'None'}
757
+
758
+ ## Workflow-Level Improvements
759
+
760
+ ${(synthesis.workflow_improvements || []).map(w => `- **${w.area}** (${w.impact}): ${w.description}`).join('\n') || 'None'}
761
+
762
+ ## Bottlenecks
763
+
764
+ ${(synthesis.bottlenecks || []).map(b => `- **${b.step}**: ${b.issue} → ${b.suggestion}`).join('\n') || 'None'}
765
+
766
+ ## Summary
767
+
768
+ ${synthesis.summary || 'N/A'}
769
+ `;
770
+
771
+ Write(`${state.work_dir}/final-report.md`, report);
772
+ state.status = 'completed';
773
+ Write(`${state.work_dir}/workflow-state.json`, JSON.stringify(state, null, 2));
774
+
775
+ // Output report to user
776
+ ```
777
+
778
+ ## Resume Chain
779
+
780
+ ```
781
+ Step 1 Execute → ccw cli claude --mode write --rule universal-rigorous-style --cd step-1/ → STOP → callback → artifacts
782
+ Step 1 Analyze → ccw cli gemini --mode analysis --rule analysis-review-code-quality → STOP → callback → gemini_session_id = exec_id
783
+ Step 2 Execute → ccw cli claude --mode write --rule universal-rigorous-style --cd step-2/ → STOP → callback → artifacts
784
+ Step 2 Analyze → ccw cli gemini --mode analysis --resume gemini_session_id → STOP → callback → gemini_session_id = exec_id
785
+ ...
786
+ Synthesize → ccw cli gemini --mode analysis --resume gemini_session_id → STOP → callback → synthesis
787
+ Report → local generation (no CLI call)
788
+ ```
789
+
790
+ ## Error Handling
791
+
792
+ | Phase | Error | Recovery |
793
+ |-------|-------|----------|
794
+ | Execute | CLI timeout | Retry once, then mark step failed and advance |
795
+ | Execute | Command not found | Skip step, note in process-log |
796
+ | Analyze | CLI fails | Retry without --resume, then skip analysis |
797
+ | Synthesize | CLI fails | Generate report from step analyses only |
798
+ | Any | 3+ consecutive errors | Terminate, produce partial report |
799
+
800
+ ## Core Rules
801
+
802
+ 1. **STOP After Each CLI Call**: Every `ccw cli` call runs in background — STOP output immediately, wait for hook callback
803
+ 2. **State Machine**: Advance via `current_step` + `current_phase`, never use sync loops for async operations
804
+ 3. **Test Task Drives Execution**: 每个命令必须有 test_task(完整需求说明),作为命令的 $ARGUMENTS 输入。test_task 由当前 Claude 直接根据命令链复杂度生成,不需要额外 CLI 调用
805
+ 4. **All Execution via claude**: `ccw cli --tool claude --mode write --rule universal-rigorous-style`
806
+ 5. **All Analysis via gemini**: `ccw cli --tool gemini --mode analysis`, chained via `--resume`
807
+ 6. **Session Capture**: After each gemini callback, capture exec_id → `gemini_session_id` for resume chain
808
+ 7. **Sandbox Isolation**: 所有命令在独立沙箱目录(`sandbox/`)中执行,使用虚构测试任务,不影响真实项目
809
+ 8. **Artifact Collection**: Scan sandbox filesystem (not git diff), compare pre/post snapshots
810
+ 9. **Prompt Assembly**: Every step goes through `assembleStepPrompt()` — resolves command file, reads YAML metadata, injects test_task, builds rich context
811
+ 10. **Auto-Confirm**: All prompts auto-confirmed, no blocking interactions during execution