claude-code-workflow 7.2.9 → 7.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/cli-planning-agent.md +3 -0
- package/.claude/agents/debug-explore-agent.md +1 -0
- package/.claude/agents/tdd-developer.md +1 -0
- package/.claude/agents/team-worker.md +1 -1
- package/.claude/agents/test-action-planning-agent.md +3 -0
- package/.claude/agents/test-context-search-agent.md +1 -0
- package/.claude/agents/test-fix-agent.md +3 -0
- package/.claude/skills/review-code/SKILL.md +2 -0
- package/.claude/skills/review-cycle/SKILL.md +4 -0
- package/.claude/skills/skill-simplify/phases/02-optimize.md +4 -0
- package/.claude/skills/spec-generator/phases/05-epics-stories.md +4 -0
- package/.claude/skills/team-arch-opt/specs/team-config.json +5 -5
- package/.claude/skills/team-frontend-debug/roles/analyzer/role.md +3 -2
- package/.claude/skills/team-perf-opt/roles/coordinator/commands/monitor.md +1 -1
- package/.claude/skills/team-perf-opt/specs/team-config.json +5 -5
- package/.claude/skills/team-quality-assurance/roles/executor/role.md +2 -1
- package/.claude/skills/team-review/roles/reviewer/role.md +2 -1
- package/.claude/skills/team-tech-debt/roles/scanner/role.md +2 -1
- package/.claude/skills/team-testing/roles/executor/role.md +2 -1
- package/.claude/skills/team-testing/roles/generator/role.md +2 -1
- package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +2 -1
- package/.claude/skills/team-ux-improve/specs/team-config.json +6 -6
- package/.claude/skills/workflow-execute/phases/06-review.md +4 -4
- package/.claude/skills/workflow-lite-test-review/SKILL.md +2 -0
- package/.claude/skills/workflow-plan/phases/05-plan-verify.md +4 -0
- package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +1 -0
- package/.claude/skills/workflow-tdd-plan/phases/05-tdd-task-generation.md +2 -1
- package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +1 -0
- package/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +2 -1
- package/.claude/skills/workflow-tune/SKILL.md +487 -0
- package/.claude/skills/workflow-tune/phases/01-setup.md +548 -0
- package/.claude/skills/workflow-tune/phases/02-step-execute.md +197 -0
- package/.claude/skills/workflow-tune/phases/03-step-analyze.md +386 -0
- package/.claude/skills/workflow-tune/phases/04-synthesize.md +257 -0
- package/.claude/skills/workflow-tune/phases/05-optimize-report.md +246 -0
- package/.claude/skills/workflow-tune/specs/workflow-eval-criteria.md +57 -0
- package/.claude/skills/workflow-tune/templates/step-analysis-prompt.md +88 -0
- package/.claude/skills/workflow-tune/templates/synthesis-prompt.md +90 -0
- package/.codex/skills/analyze-with-file/SKILL.md +64 -103
- package/.codex/skills/debug-with-file/SKILL.md +4 -0
- package/.codex/skills/issue-discover/SKILL.md +1 -0
- package/.codex/skills/review-cycle/phases/02-parallel-review.md +3 -0
- package/.codex/skills/roadmap-with-file/SKILL.md +11 -17
- package/.codex/skills/team-designer/agents/validation-reporter.md +186 -0
- package/.codex/skills/team-iterdev/agents/gc-controller.md +193 -0
- package/.codex/skills/team-iterdev/agents/task-analyzer.md +206 -0
- package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +165 -0
- package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +163 -0
- package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +182 -0
- package/.codex/skills/team-uidesign/agents/completion-handler.md +177 -0
- package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +162 -0
- package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +4 -0
- package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +2 -0
- package/ccw/dist/commands/spec.d.ts.map +1 -1
- package/ccw/dist/commands/spec.js +9 -4
- package/ccw/dist/commands/spec.js.map +1 -1
- package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/codexlens-routes.js +3 -1
- package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
- package/ccw/dist/tools/spec-index-builder.d.ts +8 -4
- package/ccw/dist/tools/spec-index-builder.d.ts.map +1 -1
- package/ccw/dist/tools/spec-index-builder.js +8 -4
- package/ccw/dist/tools/spec-index-builder.js.map +1 -1
- package/ccw/dist/tools/spec-init.d.ts +1 -1
- package/ccw/dist/tools/spec-init.d.ts.map +1 -1
- package/ccw/dist/tools/spec-init.js +127 -0
- package/ccw/dist/tools/spec-init.js.map +1 -1
- package/ccw/dist/tools/spec-loader.d.ts.map +1 -1
- package/ccw/dist/tools/spec-loader.js +2 -1
- package/ccw/dist/tools/spec-loader.js.map +1 -1
- package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js → AlertDialog-BW9jiZ-p.js} +2 -2
- package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js.map → AlertDialog-BW9jiZ-p.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js → AnalysisPage-ds-w_nVO.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js.map → AnalysisPage-ds-w_nVO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js → ApiSettingsPage-DlCbXxTz.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js.map → ApiSettingsPage-DlCbXxTz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js → CliModeToggle-Dq3nL4fF.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js.map → CliModeToggle-Dq3nL4fF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js → CliSessionSharePage-BNDkEE4u.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js.map → CliSessionSharePage-BNDkEE4u.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js → CliViewerPage-ChM-uNx_.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js.map → CliViewerPage-ChM-uNx_.js.map} +1 -1
- package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js +2 -0
- package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js.map +1 -0
- package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js → Collapsible-CRNbykXN.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js.map → Collapsible-CRNbykXN.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js → CommandsManagerPage-C2JWcemF.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js.map → CommandsManagerPage-C2JWcemF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js → DeepWikiPage-CvleOtJy.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js.map → DeepWikiPage-CvleOtJy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js → EndpointsPage-CMOWQG64.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js.map → EndpointsPage-CMOWQG64.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js → ExplorerPage-DaFPRlNo.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js.map → ExplorerPage-DaFPRlNo.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js → FixSessionPage-CC4p04Az.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js.map → FixSessionPage-CC4p04Az.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js → FloatingFileBrowser-DROn1xZ5.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js.map → FloatingFileBrowser-DROn1xZ5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js → FloatingPanel-CmL_yhDv.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js.map → FloatingPanel-CmL_yhDv.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js → GraphExplorerPage-DCV5ybKE.js} +2 -2
- package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js.map → GraphExplorerPage-DCV5ybKE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js → HistoryPage-D0fYQZgc.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js.map → HistoryPage-D0fYQZgc.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js → HookManagerPage-D2FuJfsM.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js.map → HookManagerPage-D2FuJfsM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js → InstallationsPage-tjklillZ.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js.map → InstallationsPage-tjklillZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js → IssueHubPage-E4JVrhO1.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js.map → IssueHubPage-E4JVrhO1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js → LiteTasksPage-aJuRoyLt.js} +2 -2
- package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js.map → LiteTasksPage-aJuRoyLt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js → McpManagerPage-BJeuWJv1.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js.map → McpManagerPage-BJeuWJv1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js → MemoryPage-BI4FAXhs.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js.map → MemoryPage-BI4FAXhs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js → NotFoundPage-DD2svchp.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js.map → NotFoundPage-DD2svchp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js → OrchestratorPage-FC__7yYa.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js.map → OrchestratorPage-FC__7yYa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js → ProjectOverviewPage-DBB_-FzV.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js.map → ProjectOverviewPage-DBB_-FzV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js → PromptHistoryPage-BwOAvCH8.js} +2 -2
- package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js.map → PromptHistoryPage-BwOAvCH8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js → ReviewSessionPage-Dd1-g_gp.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js.map → ReviewSessionPage-Dd1-g_gp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js → RulesManagerPage-B3RGdsKD.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js.map → RulesManagerPage-B3RGdsKD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js → SessionDetailPage-DM-W5R8K.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js.map → SessionDetailPage-DM-W5R8K.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js → SessionsPage-BVz1KCc7.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js.map → SessionsPage-BVz1KCc7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js → SettingsPage-ComW7EZS.js} +4 -4
- package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js.map → SettingsPage-ComW7EZS.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js → SkillsManagerPage-CKom9XwV.js} +2 -2
- package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js.map → SkillsManagerPage-CKom9XwV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js → SpecsSettingsPage-DQz7WP2s.js} +2 -2
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js.map → SpecsSettingsPage-DQz7WP2s.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js → Switch-BPMdND9H.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js.map → Switch-BPMdND9H.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js → TabsNavigation-qqt70VYL.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js.map → TabsNavigation-qqt70VYL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js → TaskDrawer-BqK_qiHX.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js.map → TaskDrawer-BqK_qiHX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js → TeamPage-u5_i0Rgh.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js.map → TeamPage-u5_i0Rgh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js → TerminalDashboardPage-rUtC9e40.js} +2 -2
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js.map → TerminalDashboardPage-rUtC9e40.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js → archive-C3u8YNQF.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js.map → archive-C3u8YNQF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js → archive-restore-DfQ998g5.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js.map → archive-restore-DfQ998g5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js → arrow-right-BshJM9Po.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js.map → arrow-right-BshJM9Po.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js → bookmark-plus-D03qJyOZ.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js.map → bookmark-plus-D03qJyOZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js → bot-CyzWuwq0.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js.map → bot-CyzWuwq0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js → braces-BPgtyjsG.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js.map → braces-BPgtyjsG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js → circle-stop-Dix1AOmw.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js.map → circle-stop-Dix1AOmw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js → cpu-CCQ4Q0Zh.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js.map → cpu-CCQ4Q0Zh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js → ellipsis-vertical-BpTysg-Y.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js.map → ellipsis-vertical-BpTysg-Y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js → eye-DGY1rAZs.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js.map → eye-DGY1rAZs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js → eye-off-D8t3JfWG.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js.map → eye-off-D8t3JfWG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js → file-json-BAdJb0n8.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js.map → file-json-BAdJb0n8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js → file-text-DrJFiOUB.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js.map → file-text-DrJFiOUB.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js → filter-CKqzYbz7.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js.map → filter-CKqzYbz7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js → folder-CV8511y9.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js.map → folder-CV8511y9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js → gauge-XKvmu_uU.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js.map → gauge-XKvmu_uU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js → globe-C56cDUzX.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js.map → globe-C56cDUzX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js → grid-3x3-Bya-suFW.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js.map → grid-3x3-Bya-suFW.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js → hard-drive-CmuTZpsB.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js.map → hard-drive-CmuTZpsB.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Bd1RD285.js → hash-CRPT_tJQ.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Bd1RD285.js.map → hash-CRPT_tJQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-eyyCQA6b.js → history-C1pJZQCL.js} +2 -2
- package/ccw/frontend/dist/assets/{history-eyyCQA6b.js.map → history-C1pJZQCL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js → index-B6TpijCe.js} +2 -2
- package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js.map → index-B6TpijCe.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-b2C0iFd1.js → index-Bcq-7r6F.js} +2 -2
- package/ccw/frontend/dist/assets/{index-b2C0iFd1.js.map → index-Bcq-7r6F.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js → index-CI8-rBff.js} +2 -2
- package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js.map → index-CI8-rBff.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CY6Lueph.js → index-Dmt9OiEf.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CY6Lueph.js.map → index-Dmt9OiEf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-DfeBbFXo.js → index-anSMmEF8.js} +2 -2
- package/ccw/frontend/dist/assets/{index-DfeBbFXo.js.map → index-anSMmEF8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B6I7GQC5.js → index-dWT2M6Ef.js} +4 -4
- package/ccw/frontend/dist/assets/{index-B6I7GQC5.js.map → index-dWT2M6Ef.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js → layout-grid-TSO0BFQE.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js.map → layout-grid-TSO0BFQE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js → lightbulb-Caj6fIQD.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js.map → lightbulb-Caj6fIQD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js → link-2-DE9lMxa-.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js.map → link-2-DE9lMxa-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-CL4JmoHb.js → link-BZtPgLW0.js} +2 -2
- package/ccw/frontend/dist/assets/{link-CL4JmoHb.js.map → link-BZtPgLW0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-CDmYFcio.js → list-DubWyY-U.js} +2 -2
- package/ccw/frontend/dist/assets/{list-CDmYFcio.js.map → list-DubWyY-U.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js → map-pin-DwN_48AF.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js.map → map-pin-DwN_48AF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js → messages-square-bjxvaiM9.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js.map → messages-square-bjxvaiM9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js → minimize-2-CGfBKD_V.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js.map → minimize-2-CGfBKD_V.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js → package-nzWY6ilt.js} +2 -2
- package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js.map → package-nzWY6ilt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js → plug-CiLce49C.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js.map → plug-CiLce49C.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-DmIojFl-.js → power-CFLmB-U9.js} +2 -2
- package/ccw/frontend/dist/assets/{power-DmIojFl-.js.map → power-CFLmB-U9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-BFa03OnG.js → save-DuO6OF0C.js} +2 -2
- package/ccw/frontend/dist/assets/{save-BFa03OnG.js.map → save-DuO6OF0C.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Vet3sN4J.js → send-CZk9p0mM.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Vet3sN4J.js.map → send-CZk9p0mM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js → square-check-big-BY_1YQQg.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js.map → square-check-big-BY_1YQQg.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js → square-pen-CnZgm6g-.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js.map → square-pen-CnZgm6g-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-BCQHcnSe.js → star-Cn1F0qy7.js} +2 -2
- package/ccw/frontend/dist/assets/{star-BCQHcnSe.js.map → star-Cn1F0qy7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-CJsrp48L.js → style-Dxs1iXCV.js} +2 -2
- package/ccw/frontend/dist/assets/{style-CJsrp48L.js.map → style-Dxs1iXCV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CBzCJCB1.js → target-Bz1fLRKH.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CBzCJCB1.js.map → target-Bz1fLRKH.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js → test-tube-C6qCYlDr.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js.map → test-tube-C6qCYlDr.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js → upload-C71kd4Qs.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js.map → upload-C71kd4Qs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js → useApiSettings-CqP2BAJ7.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js.map → useApiSettings-CqP2BAJ7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js → useCli-PCoPoVeM.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js.map → useCli-PCoPoVeM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js → useCommands-3OfPQPw4.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js.map → useCommands-3OfPQPw4.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js → useDebounce-bXiFhQx9.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js.map → useDebounce-bXiFhQx9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js → useFileExplorer-DEyUm46_.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js.map → useFileExplorer-DEyUm46_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js → useLocale-sXTrdxcJ.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js.map → useLocale-sXTrdxcJ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js → useSkills-D0W0kXYm.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js.map → useSkills-D0W0kXYm.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js → useSystemSettings-DZ-8lZsG.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js.map → useSystemSettings-DZ-8lZsG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js → wand-sparkles-83GmAYuw.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js.map → wand-sparkles-83GmAYuw.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/package.json +1 -1
- package/.claude/skills/team-arch-opt/role-specs/analyzer.md +0 -80
- package/.claude/skills/team-arch-opt/role-specs/designer.md +0 -118
- package/.claude/skills/team-arch-opt/role-specs/refactorer.md +0 -106
- package/.claude/skills/team-arch-opt/role-specs/reviewer.md +0 -116
- package/.claude/skills/team-arch-opt/role-specs/validator.md +0 -117
- package/.claude/skills/team-brainstorm/role-specs/challenger.md +0 -63
- package/.claude/skills/team-brainstorm/role-specs/evaluator.md +0 -58
- package/.claude/skills/team-brainstorm/role-specs/ideator.md +0 -71
- package/.claude/skills/team-brainstorm/role-specs/synthesizer.md +0 -59
- package/.claude/skills/team-frontend/role-specs/analyst.md +0 -91
- package/.claude/skills/team-frontend/role-specs/architect.md +0 -85
- package/.claude/skills/team-frontend/role-specs/developer.md +0 -92
- package/.claude/skills/team-frontend/role-specs/qa.md +0 -78
- package/.claude/skills/team-issue/role-specs/explorer.md +0 -95
- package/.claude/skills/team-issue/role-specs/implementer.md +0 -89
- package/.claude/skills/team-issue/role-specs/integrator.md +0 -86
- package/.claude/skills/team-issue/role-specs/planner.md +0 -83
- package/.claude/skills/team-issue/role-specs/reviewer.md +0 -89
- package/.claude/skills/team-iterdev/role-specs/architect.md +0 -64
- package/.claude/skills/team-iterdev/role-specs/developer.md +0 -73
- package/.claude/skills/team-iterdev/role-specs/reviewer.md +0 -65
- package/.claude/skills/team-iterdev/role-specs/tester.md +0 -87
- package/.claude/skills/team-perf-opt/role-specs/benchmarker.md +0 -110
- package/.claude/skills/team-perf-opt/role-specs/optimizer.md +0 -102
- package/.claude/skills/team-perf-opt/role-specs/profiler.md +0 -73
- package/.claude/skills/team-perf-opt/role-specs/reviewer.md +0 -91
- package/.claude/skills/team-perf-opt/role-specs/strategist.md +0 -114
- package/.claude/skills/team-planex/role-specs/executor.md +0 -90
- package/.claude/skills/team-planex/role-specs/planner.md +0 -110
- package/.claude/skills/team-quality-assurance/role-specs/analyst.md +0 -79
- package/.claude/skills/team-quality-assurance/role-specs/executor.md +0 -64
- package/.claude/skills/team-quality-assurance/role-specs/generator.md +0 -67
- package/.claude/skills/team-quality-assurance/role-specs/scout.md +0 -66
- package/.claude/skills/team-quality-assurance/role-specs/strategist.md +0 -70
- package/.claude/skills/team-review/role-specs/fixer.md +0 -75
- package/.claude/skills/team-review/role-specs/reviewer.md +0 -66
- package/.claude/skills/team-review/role-specs/scanner.md +0 -70
- package/.claude/skills/team-roadmap-dev/role-specs/executor.md +0 -71
- package/.claude/skills/team-roadmap-dev/role-specs/planner.md +0 -77
- package/.claude/skills/team-roadmap-dev/role-specs/verifier.md +0 -73
- package/.claude/skills/team-tech-debt/role-specs/assessor.md +0 -70
- package/.claude/skills/team-tech-debt/role-specs/executor.md +0 -80
- package/.claude/skills/team-tech-debt/role-specs/planner.md +0 -71
- package/.claude/skills/team-tech-debt/role-specs/scanner.md +0 -85
- package/.claude/skills/team-tech-debt/role-specs/validator.md +0 -83
- package/.claude/skills/team-testing/role-specs/analyst.md +0 -94
- package/.claude/skills/team-testing/role-specs/executor.md +0 -97
- package/.claude/skills/team-testing/role-specs/generator.md +0 -96
- package/.claude/skills/team-testing/role-specs/strategist.md +0 -82
- package/.claude/skills/team-uidesign/role-specs/designer.md +0 -72
- package/.claude/skills/team-uidesign/role-specs/implementer.md +0 -74
- package/.claude/skills/team-uidesign/role-specs/researcher.md +0 -84
- package/.claude/skills/team-uidesign/role-specs/reviewer.md +0 -70
- package/.claude/skills/team-ux-improve/role-specs/designer.md +0 -191
- package/.claude/skills/team-ux-improve/role-specs/diagnoser.md +0 -110
- package/.claude/skills/team-ux-improve/role-specs/explorer.md +0 -109
- package/.claude/skills/team-ux-improve/role-specs/implementer.md +0 -164
- package/.claude/skills/team-ux-improve/role-specs/scanner.md +0 -117
- package/.claude/skills/team-ux-improve/role-specs/tester.md +0 -163
- package/.codex/skills/analyze-with-file/EXECUTE.md +0 -716
- package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js +0 -2
- package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js.map +0 -1
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
# Phase 1: Setup
|
|
2
|
+
|
|
3
|
+
Initialize workspace, parse workflow definition, semantic decomposition for natural language, generate command document, user confirmation, create state and process log.
|
|
4
|
+
|
|
5
|
+
## Objective
|
|
6
|
+
|
|
7
|
+
- Parse workflow steps from user input (Format 1-3: direct parse, Format 4: semantic decomposition)
|
|
8
|
+
- Generate Command Document (formatted execution plan)
|
|
9
|
+
- User confirmation: Execute / Edit steps / Cancel
|
|
10
|
+
- Validate step commands/skill paths
|
|
11
|
+
- Create isolated workspace directory
|
|
12
|
+
- Initialize workflow-state.json and process-log.md
|
|
13
|
+
|
|
14
|
+
## Execution
|
|
15
|
+
|
|
16
|
+
### Step 1.1: Parse Input
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
const args = $ARGUMENTS.trim();
|
|
20
|
+
|
|
21
|
+
// Detect input format
|
|
22
|
+
let steps = [];
|
|
23
|
+
let workflowName = 'unnamed-workflow';
|
|
24
|
+
let workflowContext = '';
|
|
25
|
+
|
|
26
|
+
// Format 1: JSON file (--file path)
|
|
27
|
+
const fileMatch = args.match(/--file\s+"?([^\s"]+)"?/);
|
|
28
|
+
if (fileMatch) {
|
|
29
|
+
const wfDef = JSON.parse(Read(fileMatch[1]));
|
|
30
|
+
workflowName = wfDef.name || 'unnamed-workflow';
|
|
31
|
+
workflowContext = wfDef.description || '';
|
|
32
|
+
steps = wfDef.steps;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Format 2: Pipe-separated commands ("cmd1 | cmd2 | cmd3")
|
|
36
|
+
else if (args.includes('|')) {
|
|
37
|
+
const rawSteps = args.split(/(?:--context|--depth|-y|--yes|--auto-fix)\s+("[^"]*"|\S+)/)[0];
|
|
38
|
+
steps = rawSteps.split('|').map((cmd, i) => ({
|
|
39
|
+
name: `step-${i + 1}`,
|
|
40
|
+
type: cmd.trim().startsWith('/') ? 'skill'
|
|
41
|
+
: cmd.trim().startsWith('ccw cli') ? 'ccw-cli'
|
|
42
|
+
: 'command',
|
|
43
|
+
command: cmd.trim(),
|
|
44
|
+
expected_artifacts: [],
|
|
45
|
+
success_criteria: ''
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Format 3: Comma-separated skill names (matches pattern: word,word or word-word,word-word)
|
|
50
|
+
else if (/^[\w-]+(,[\w-]+)+/.test(args.split(/\s/)[0])) {
|
|
51
|
+
const skillPart = args.match(/^([^\s]+)/);
|
|
52
|
+
const skillNames = skillPart ? skillPart[1].split(',') : [];
|
|
53
|
+
steps = skillNames.map((name, i) => {
|
|
54
|
+
const skillPath = name.startsWith('.claude/') ? name : `.claude/skills/${name}`;
|
|
55
|
+
return {
|
|
56
|
+
name: name.replace('.claude/skills/', ''),
|
|
57
|
+
type: 'skill',
|
|
58
|
+
command: `/${name.replace('.claude/skills/', '')}`,
|
|
59
|
+
skill_path: skillPath,
|
|
60
|
+
expected_artifacts: [],
|
|
61
|
+
success_criteria: ''
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Format 4: Natural language → semantic decomposition
|
|
67
|
+
else {
|
|
68
|
+
inputFormat = 'natural-language';
|
|
69
|
+
naturalLanguageInput = args.replace(/--\w+\s+"[^"]*"/g, '').replace(/--\w+\s+\S+/g, '').replace(/-y|--yes/g, '').trim();
|
|
70
|
+
// Steps will be populated in Step 1.1b
|
|
71
|
+
steps = [];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Parse --context
|
|
75
|
+
const contextMatch = args.match(/--context\s+"([^"]+)"/);
|
|
76
|
+
workflowContext = contextMatch ? contextMatch[1] : workflowContext;
|
|
77
|
+
|
|
78
|
+
// Parse --depth
|
|
79
|
+
const depthMatch = args.match(/--depth\s+(quick|standard|deep)/);
|
|
80
|
+
if (depthMatch) {
|
|
81
|
+
workflowPreferences.analysisDepth = depthMatch[1];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// If no context provided, ask user
|
|
85
|
+
if (!workflowContext) {
|
|
86
|
+
const response = AskUserQuestion({
|
|
87
|
+
questions: [{
|
|
88
|
+
question: "请描述这个 workflow 的目标和预期效果:",
|
|
89
|
+
header: "Workflow Context",
|
|
90
|
+
multiSelect: false,
|
|
91
|
+
options: [
|
|
92
|
+
{ label: "General quality check", description: "通用质量检查,评估步骤间衔接" },
|
|
93
|
+
{ label: "Custom description", description: "自定义描述 workflow 目标" }
|
|
94
|
+
]
|
|
95
|
+
}]
|
|
96
|
+
});
|
|
97
|
+
workflowContext = response["Workflow Context"];
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Step 1.1b: Semantic Decomposition (Format 4 only)
|
|
102
|
+
|
|
103
|
+
> Skip this step if `inputFormat !== 'natural-language'`.
|
|
104
|
+
|
|
105
|
+
Decompose natural language input into a structured step chain by identifying intent verbs and mapping them to available tools/skills.
|
|
106
|
+
|
|
107
|
+
```javascript
|
|
108
|
+
if (inputFormat === 'natural-language') {
|
|
109
|
+
// Intent-to-tool mapping (regex patterns → tool config)
|
|
110
|
+
const intentMap = [
|
|
111
|
+
{ pattern: /分析|analyze|审查|inspect|scan/i, name: 'analyze', tool: 'gemini', mode: 'analysis', rule: 'analysis-analyze-code-patterns' },
|
|
112
|
+
{ pattern: /评审|review|code.?review/i, name: 'review', tool: 'gemini', mode: 'analysis', rule: 'analysis-review-code-quality' },
|
|
113
|
+
{ pattern: /诊断|debug|排查|diagnose/i, name: 'diagnose', tool: 'gemini', mode: 'analysis', rule: 'analysis-diagnose-bug-root-cause' },
|
|
114
|
+
{ pattern: /安全|security|漏洞|vulnerability/i, name: 'security-audit', tool: 'gemini', mode: 'analysis', rule: 'analysis-assess-security-risks' },
|
|
115
|
+
{ pattern: /性能|performance|perf/i, name: 'perf-analysis', tool: 'gemini', mode: 'analysis', rule: 'analysis-analyze-performance' },
|
|
116
|
+
{ pattern: /架构|architecture/i, name: 'arch-review', tool: 'gemini', mode: 'analysis', rule: 'analysis-review-architecture' },
|
|
117
|
+
{ pattern: /修复|fix|repair|解决/i, name: 'fix', tool: 'claude', mode: 'write', rule: 'development-debug-runtime-issues' },
|
|
118
|
+
{ pattern: /实现|implement|开发|create|新增/i, name: 'implement', tool: 'claude', mode: 'write', rule: 'development-implement-feature' },
|
|
119
|
+
{ pattern: /重构|refactor/i, name: 'refactor', tool: 'claude', mode: 'write', rule: 'development-refactor-codebase' },
|
|
120
|
+
{ pattern: /测试|test|generate.?test/i, name: 'test', tool: 'claude', mode: 'write', rule: 'development-generate-tests' },
|
|
121
|
+
{ pattern: /规划|plan|设计|design/i, name: 'plan', tool: 'gemini', mode: 'analysis', rule: 'planning-plan-architecture-design' },
|
|
122
|
+
{ pattern: /拆解|breakdown|分解/i, name: 'breakdown', tool: 'gemini', mode: 'analysis', rule: 'planning-breakdown-task-steps' },
|
|
123
|
+
];
|
|
124
|
+
|
|
125
|
+
// Segment input by Chinese/English delimiters: 、,,;然后/接着/最后/之后 etc.
|
|
126
|
+
const segments = naturalLanguageInput
|
|
127
|
+
.split(/[,,;;、]|(?:然后|接着|之后|最后|再|并|and then|then|finally|next)\s*/i)
|
|
128
|
+
.map(s => s.trim())
|
|
129
|
+
.filter(Boolean);
|
|
130
|
+
|
|
131
|
+
// Match each segment to an intent (with ambiguity resolution)
|
|
132
|
+
steps = segments.map((segment, i) => {
|
|
133
|
+
const allMatches = intentMap.filter(m => m.pattern.test(segment));
|
|
134
|
+
let matched = allMatches[0] || null;
|
|
135
|
+
|
|
136
|
+
// ★ Ambiguity resolution: if multiple intents match, ask user
|
|
137
|
+
if (allMatches.length > 1) {
|
|
138
|
+
const disambig = AskUserQuestion({
|
|
139
|
+
questions: [{
|
|
140
|
+
question: `"${segment}" 匹配到多个意图,请选择最符合的:`,
|
|
141
|
+
header: `Disambiguate Step ${i + 1}`,
|
|
142
|
+
multiSelect: false,
|
|
143
|
+
options: allMatches.map(m => ({
|
|
144
|
+
label: m.name,
|
|
145
|
+
description: `Tool: ${m.tool}, Mode: ${m.mode}, Rule: ${m.rule}`
|
|
146
|
+
}))
|
|
147
|
+
}]
|
|
148
|
+
});
|
|
149
|
+
const chosen = disambig[`Disambiguate Step ${i + 1}`];
|
|
150
|
+
matched = allMatches.find(m => m.name === chosen) || allMatches[0];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (matched) {
|
|
154
|
+
// Extract target scope from segment (e.g., "分析 src 目录" → scope = "src")
|
|
155
|
+
const scopeMatch = segment.match(/(?:目录|文件|模块|directory|file|module)?\s*[::]?\s*(\S+)/);
|
|
156
|
+
const scope = scopeMatch ? scopeMatch[1].replace(/[的地得]$/, '') : '**/*';
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
name: `${matched.name}`,
|
|
160
|
+
type: 'ccw-cli',
|
|
161
|
+
command: `ccw cli -p "${segment}" --tool ${matched.tool} --mode ${matched.mode} --rule ${matched.rule}`,
|
|
162
|
+
tool: matched.tool,
|
|
163
|
+
mode: matched.mode,
|
|
164
|
+
rule: matched.rule,
|
|
165
|
+
original_text: segment,
|
|
166
|
+
expected_artifacts: [],
|
|
167
|
+
success_criteria: ''
|
|
168
|
+
};
|
|
169
|
+
} else {
|
|
170
|
+
// Unmatched segment → generic analysis step
|
|
171
|
+
return {
|
|
172
|
+
name: `step-${i + 1}`,
|
|
173
|
+
type: 'ccw-cli',
|
|
174
|
+
command: `ccw cli -p "${segment}" --tool gemini --mode analysis`,
|
|
175
|
+
tool: 'gemini',
|
|
176
|
+
mode: 'analysis',
|
|
177
|
+
rule: 'universal-rigorous-style',
|
|
178
|
+
original_text: segment,
|
|
179
|
+
expected_artifacts: [],
|
|
180
|
+
success_criteria: ''
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// Deduplicate: if same intent name appears twice, suffix with index
|
|
186
|
+
const nameCount = {};
|
|
187
|
+
steps.forEach(s => {
|
|
188
|
+
nameCount[s.name] = (nameCount[s.name] || 0) + 1;
|
|
189
|
+
if (nameCount[s.name] > 1) {
|
|
190
|
+
s.name = `${s.name}-${nameCount[s.name]}`;
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
// Set workflow context from the full natural language input
|
|
195
|
+
if (!workflowContext) {
|
|
196
|
+
workflowContext = naturalLanguageInput;
|
|
197
|
+
}
|
|
198
|
+
workflowName = 'nl-workflow'; // natural language derived
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Step 1.1c: Generate Command Document
|
|
203
|
+
|
|
204
|
+
Generate a formatted execution plan for user review. This runs for ALL input formats, not just Format 4.
|
|
205
|
+
|
|
206
|
+
```javascript
|
|
207
|
+
function generateCommandDoc(steps, workflowName, workflowContext, analysisDepth) {
|
|
208
|
+
const stepTable = steps.map((s, i) => {
|
|
209
|
+
const tool = s.tool || (s.type === 'skill' ? '-' : 'claude');
|
|
210
|
+
const mode = s.mode || (s.type === 'skill' ? '-' : 'write');
|
|
211
|
+
const cmdPreview = s.command.length > 60 ? s.command.substring(0, 57) + '...' : s.command;
|
|
212
|
+
return `| ${i + 1} | ${s.name} | ${s.type} | \`${cmdPreview}\` | ${tool} | ${mode} |`;
|
|
213
|
+
}).join('\n');
|
|
214
|
+
|
|
215
|
+
const flowDiagram = steps.map((s, i) => {
|
|
216
|
+
const arrow = i < steps.length - 1 ? '\n ↓' : '';
|
|
217
|
+
const feedsInto = i < steps.length - 1 ? `Feeds into: Step ${i + 2} (${steps[i + 1].name})` : 'Final step';
|
|
218
|
+
const originalText = s.original_text ? `\n Source: "${s.original_text}"` : '';
|
|
219
|
+
return `Step ${i + 1}: ${s.name}
|
|
220
|
+
Command: ${s.command}
|
|
221
|
+
Type: ${s.type} | Tool: ${s.tool || '-'} | Mode: ${s.mode || '-'}${originalText}
|
|
222
|
+
${feedsInto}${arrow}`;
|
|
223
|
+
}).join('\n');
|
|
224
|
+
|
|
225
|
+
const totalCli = steps.filter(s => s.type === 'ccw-cli').length;
|
|
226
|
+
const totalSkill = steps.filter(s => s.type === 'skill').length;
|
|
227
|
+
const totalCmd = steps.filter(s => s.type === 'command').length;
|
|
228
|
+
|
|
229
|
+
return `# Workflow Tune — Execution Plan
|
|
230
|
+
|
|
231
|
+
**Workflow**: ${workflowName}
|
|
232
|
+
**Goal**: ${workflowContext}
|
|
233
|
+
**Steps**: ${steps.length}
|
|
234
|
+
**Analysis Depth**: ${analysisDepth}
|
|
235
|
+
|
|
236
|
+
## Step Chain
|
|
237
|
+
|
|
238
|
+
| # | Name | Type | Command | Tool | Mode |
|
|
239
|
+
|---|------|------|---------|------|------|
|
|
240
|
+
${stepTable}
|
|
241
|
+
|
|
242
|
+
## Execution Flow
|
|
243
|
+
|
|
244
|
+
\`\`\`
|
|
245
|
+
${flowDiagram}
|
|
246
|
+
\`\`\`
|
|
247
|
+
|
|
248
|
+
## Estimated Scope
|
|
249
|
+
|
|
250
|
+
- CLI execute calls: ${totalCli}
|
|
251
|
+
- Skill invocations: ${totalSkill}
|
|
252
|
+
- Shell commands: ${totalCmd}
|
|
253
|
+
- Analysis calls (gemini --resume chain): ${steps.length} (per-step) + 1 (synthesis)
|
|
254
|
+
- Process documentation: process-log.md (accumulated)
|
|
255
|
+
- Final output: final-report.md with optimization recommendations
|
|
256
|
+
`;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const commandDoc = generateCommandDoc(steps, workflowName, workflowContext, workflowPreferences.analysisDepth);
|
|
260
|
+
|
|
261
|
+
// Output command document to user (direct text output)
|
|
262
|
+
// The orchestrator displays this as formatted text before confirmation
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Step 1.1d: Pre-Execution Confirmation
|
|
266
|
+
|
|
267
|
+
```javascript
|
|
268
|
+
// ★ Skip confirmation if -y/--yes auto mode
|
|
269
|
+
if (!workflowPreferences.autoYes) {
|
|
270
|
+
// Display commandDoc to user as formatted text output
|
|
271
|
+
// Then ask for confirmation
|
|
272
|
+
|
|
273
|
+
const confirmation = AskUserQuestion({
|
|
274
|
+
questions: [{
|
|
275
|
+
question: "确认执行以上 Workflow 调优计划?",
|
|
276
|
+
header: "Confirm Execution",
|
|
277
|
+
multiSelect: false,
|
|
278
|
+
options: [
|
|
279
|
+
{ label: "Execute (确认执行)", description: "按计划开始执行所有步骤" },
|
|
280
|
+
{ label: "Edit steps (修改步骤)", description: "调整步骤顺序、增删步骤、更换工具" },
|
|
281
|
+
{ label: "Cancel (取消)", description: "取消本次调优" }
|
|
282
|
+
]
|
|
283
|
+
}]
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
const choice = confirmation["Confirm Execution"];
|
|
287
|
+
|
|
288
|
+
if (choice.startsWith("Cancel")) {
|
|
289
|
+
// Abort: no workspace created, no state written
|
|
290
|
+
// Output: "Workflow tune cancelled."
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (choice.startsWith("Edit")) {
|
|
295
|
+
// Enter edit loop: ask user what to change, apply, re-display, re-confirm
|
|
296
|
+
let editing = true;
|
|
297
|
+
while (editing) {
|
|
298
|
+
const editResponse = AskUserQuestion({
|
|
299
|
+
questions: [{
|
|
300
|
+
question: "请描述要修改的内容:\n" +
|
|
301
|
+
" - 删除步骤: '删除步骤2' 或 'remove step 2'\n" +
|
|
302
|
+
" - 添加步骤: '在步骤1后加入安全扫描' 或 'add security scan after step 1'\n" +
|
|
303
|
+
" - 修改工具: '步骤3改用codex' 或 'step 3 use codex'\n" +
|
|
304
|
+
" - 调换顺序: '步骤2和步骤3互换' 或 'swap step 2 and 3'\n" +
|
|
305
|
+
" - 修改命令: '步骤1命令改为 ccw cli -p \"...\" --tool gemini'",
|
|
306
|
+
header: "Edit Steps"
|
|
307
|
+
}]
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
const editText = editResponse["Edit Steps"];
|
|
311
|
+
|
|
312
|
+
// Apply edits to steps[] based on user instruction
|
|
313
|
+
// The orchestrator interprets the edit instruction and modifies steps:
|
|
314
|
+
//
|
|
315
|
+
// Delete: filter out the specified step, re-index
|
|
316
|
+
// Add: insert new step at specified position
|
|
317
|
+
// Modify tool: update the step's tool/mode/command
|
|
318
|
+
// Swap: exchange positions of two steps
|
|
319
|
+
// Modify command: replace command string
|
|
320
|
+
//
|
|
321
|
+
// After applying edits, re-generate command doc and re-display
|
|
322
|
+
|
|
323
|
+
const updatedCommandDoc = generateCommandDoc(steps, workflowName, workflowContext, workflowPreferences.analysisDepth);
|
|
324
|
+
// Display updatedCommandDoc to user
|
|
325
|
+
|
|
326
|
+
const reconfirm = AskUserQuestion({
|
|
327
|
+
questions: [{
|
|
328
|
+
question: "修改后的计划如上,是否确认?",
|
|
329
|
+
header: "Confirm Execution",
|
|
330
|
+
multiSelect: false,
|
|
331
|
+
options: [
|
|
332
|
+
{ label: "Execute (确认执行)", description: "按修改后的计划执行" },
|
|
333
|
+
{ label: "Edit more (继续修改)", description: "还需要调整" },
|
|
334
|
+
{ label: "Cancel (取消)", description: "取消本次调优" }
|
|
335
|
+
]
|
|
336
|
+
}]
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
const reChoice = reconfirm["Confirm Execution"];
|
|
340
|
+
if (reChoice.startsWith("Execute")) {
|
|
341
|
+
editing = false;
|
|
342
|
+
} else if (reChoice.startsWith("Cancel")) {
|
|
343
|
+
return; // Abort
|
|
344
|
+
}
|
|
345
|
+
// else: continue editing loop
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// choice === "Execute" → proceed to workspace creation
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Save command doc for reference
|
|
353
|
+
// Will be written to workspace after Step 1.3
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Step 1.2: Validate Steps
|
|
357
|
+
|
|
358
|
+
```javascript
|
|
359
|
+
for (const step of steps) {
|
|
360
|
+
if (step.type === 'skill' && step.skill_path) {
|
|
361
|
+
const skillFiles = Glob(`${step.skill_path}/SKILL.md`);
|
|
362
|
+
if (skillFiles.length === 0) {
|
|
363
|
+
step.validation = 'warning';
|
|
364
|
+
step.validation_msg = `Skill not found: ${step.skill_path}`;
|
|
365
|
+
} else {
|
|
366
|
+
step.validation = 'ok';
|
|
367
|
+
}
|
|
368
|
+
} else {
|
|
369
|
+
// Command-type steps: basic validation (non-empty)
|
|
370
|
+
step.validation = step.command && step.command.trim() ? 'ok' : 'invalid';
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
const invalidSteps = steps.filter(s => s.validation === 'invalid');
|
|
375
|
+
if (invalidSteps.length > 0) {
|
|
376
|
+
throw new Error(`Invalid steps: ${invalidSteps.map(s => s.name).join(', ')}`);
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### Step 1.2b: Generate Test Requirements (Acceptance Criteria)
|
|
381
|
+
|
|
382
|
+
> 调优的前提:为每一步生成跟任务匹配的验收标准。没有预期基准,就无法判断命令执行是否达标。
|
|
383
|
+
|
|
384
|
+
用 Gemini 根据 step command + workflow context + 上下游关系,自动推断每步的验收标准。
|
|
385
|
+
|
|
386
|
+
```javascript
|
|
387
|
+
// Build step chain description for context
|
|
388
|
+
const stepChainDesc = steps.map((s, i) =>
|
|
389
|
+
`Step ${i + 1}: ${s.name} (${s.type}) — ${s.command}`
|
|
390
|
+
).join('\n');
|
|
391
|
+
|
|
392
|
+
const reqGenPrompt = `PURPOSE: Generate concrete acceptance criteria (test requirements) for each step in a workflow pipeline. These criteria will be used to objectively judge whether each step's execution succeeded or failed.
|
|
393
|
+
|
|
394
|
+
WORKFLOW:
|
|
395
|
+
Name: ${workflowName}
|
|
396
|
+
Goal: ${workflowContext}
|
|
397
|
+
|
|
398
|
+
STEP CHAIN:
|
|
399
|
+
${stepChainDesc}
|
|
400
|
+
|
|
401
|
+
TASK:
|
|
402
|
+
For each step, generate:
|
|
403
|
+
1. **expected_outputs** — what files/artifacts should be produced (specific filenames or patterns)
|
|
404
|
+
2. **content_signals** — what content patterns indicate success (keywords, structures, data shapes)
|
|
405
|
+
3. **quality_thresholds** — minimum quality bar (e.g., "no empty files", "JSON must be parseable", "must contain at least N items")
|
|
406
|
+
4. **pass_criteria** — 1-2 sentence description of what "pass" looks like for this step
|
|
407
|
+
5. **fail_signals** — what patterns indicate failure (error messages, empty output, wrong format)
|
|
408
|
+
6. **handoff_contract** — what this step must provide for the next step to work (data format, required fields)
|
|
409
|
+
|
|
410
|
+
CONTEXT RULES:
|
|
411
|
+
- Infer from the command what the step is supposed to do
|
|
412
|
+
- Consider workflow goal when judging what "good enough" means
|
|
413
|
+
- Each step's handoff_contract should match what the next step needs as input
|
|
414
|
+
- Be specific: "report.md with ## Summary section" not "a report file"
|
|
415
|
+
|
|
416
|
+
EXPECTED OUTPUT (strict JSON, no markdown):
|
|
417
|
+
{
|
|
418
|
+
"step_requirements": [
|
|
419
|
+
{
|
|
420
|
+
"step_index": 0,
|
|
421
|
+
"step_name": "<name>",
|
|
422
|
+
"expected_outputs": ["<file or pattern>"],
|
|
423
|
+
"content_signals": ["<keyword or pattern that indicates success>"],
|
|
424
|
+
"quality_thresholds": ["<minimum bar>"],
|
|
425
|
+
"pass_criteria": "<what pass looks like>",
|
|
426
|
+
"fail_signals": ["<pattern that indicates failure>"],
|
|
427
|
+
"handoff_contract": "<what next step needs from this step>"
|
|
428
|
+
}
|
|
429
|
+
]
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
CONSTRAINTS: Be specific to each command, output ONLY JSON`;
|
|
433
|
+
|
|
434
|
+
Bash({
|
|
435
|
+
command: `ccw cli -p "${escapeForShell(reqGenPrompt)}" --tool gemini --mode analysis --rule universal-rigorous-style`,
|
|
436
|
+
run_in_background: true,
|
|
437
|
+
timeout: 300000
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
// STOP — wait for hook callback
|
|
441
|
+
// After callback: parse JSON, attach requirements to each step
|
|
442
|
+
|
|
443
|
+
const reqOutput = /* CLI output from callback */;
|
|
444
|
+
const reqJsonMatch = reqOutput.match(/\{[\s\S]*\}/);
|
|
445
|
+
|
|
446
|
+
if (reqJsonMatch) {
|
|
447
|
+
try {
|
|
448
|
+
const reqData = JSON.parse(reqJsonMatch[0]);
|
|
449
|
+
(reqData.step_requirements || []).forEach(req => {
|
|
450
|
+
const idx = req.step_index;
|
|
451
|
+
if (idx >= 0 && idx < steps.length) {
|
|
452
|
+
steps[idx].test_requirements = {
|
|
453
|
+
expected_outputs: req.expected_outputs || [],
|
|
454
|
+
content_signals: req.content_signals || [],
|
|
455
|
+
quality_thresholds: req.quality_thresholds || [],
|
|
456
|
+
pass_criteria: req.pass_criteria || '',
|
|
457
|
+
fail_signals: req.fail_signals || [],
|
|
458
|
+
handoff_contract: req.handoff_contract || ''
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
} catch (e) {
|
|
463
|
+
// Fallback: proceed without generated requirements
|
|
464
|
+
// Steps will use any manually provided success_criteria
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// Capture session ID for resume chain start
|
|
469
|
+
const reqSessionMatch = reqOutput.match(/\[CCW_EXEC_ID=([^\]]+)\]/);
|
|
470
|
+
const reqSessionId = reqSessionMatch ? reqSessionMatch[1] : null;
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Step 1.3: Create Workspace
|
|
474
|
+
|
|
475
|
+
```javascript
|
|
476
|
+
const ts = Date.now();
|
|
477
|
+
const workDir = `.workflow/.scratchpad/workflow-tune-${ts}`;
|
|
478
|
+
|
|
479
|
+
Bash(`mkdir -p "${workDir}/steps"`);
|
|
480
|
+
|
|
481
|
+
// Create per-step directories
|
|
482
|
+
for (let i = 0; i < steps.length; i++) {
|
|
483
|
+
Bash(`mkdir -p "${workDir}/steps/step-${i + 1}/artifacts"`);
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### Step 1.3b: Save Command Document
|
|
488
|
+
|
|
489
|
+
```javascript
|
|
490
|
+
// Save confirmed command doc to workspace for reference
|
|
491
|
+
Write(`${workDir}/command-doc.md`, commandDoc);
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### Step 1.4: Initialize State
|
|
495
|
+
|
|
496
|
+
```javascript
|
|
497
|
+
const initialState = {
|
|
498
|
+
status: 'running',
|
|
499
|
+
started_at: new Date().toISOString(),
|
|
500
|
+
updated_at: new Date().toISOString(),
|
|
501
|
+
workflow_name: workflowName,
|
|
502
|
+
workflow_context: workflowContext,
|
|
503
|
+
analysis_depth: workflowPreferences.analysisDepth,
|
|
504
|
+
auto_fix: workflowPreferences.autoFix,
|
|
505
|
+
steps: steps.map((s, i) => ({
|
|
506
|
+
...s,
|
|
507
|
+
index: i,
|
|
508
|
+
status: 'pending',
|
|
509
|
+
execution: null,
|
|
510
|
+
analysis: null,
|
|
511
|
+
test_requirements: s.test_requirements || null // from Step 1.2b
|
|
512
|
+
})),
|
|
513
|
+
analysis_session_id: reqSessionId || null, // resume chain starts from requirements generation
|
|
514
|
+
process_log_entries: [],
|
|
515
|
+
synthesis: null,
|
|
516
|
+
errors: [],
|
|
517
|
+
error_count: 0,
|
|
518
|
+
max_errors: 3,
|
|
519
|
+
work_dir: workDir
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
Write(`${workDir}/workflow-state.json`, JSON.stringify(initialState, null, 2));
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### Step 1.5: Initialize Process Log
|
|
526
|
+
|
|
527
|
+
```javascript
|
|
528
|
+
const processLog = `# Workflow Tune Process Log
|
|
529
|
+
|
|
530
|
+
**Workflow**: ${workflowName}
|
|
531
|
+
**Context**: ${workflowContext}
|
|
532
|
+
**Steps**: ${steps.length}
|
|
533
|
+
**Analysis Depth**: ${workflowPreferences.analysisDepth}
|
|
534
|
+
**Started**: ${new Date().toISOString()}
|
|
535
|
+
|
|
536
|
+
---
|
|
537
|
+
|
|
538
|
+
`;
|
|
539
|
+
|
|
540
|
+
Write(`${workDir}/process-log.md`, processLog);
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
## Output
|
|
544
|
+
|
|
545
|
+
- **Variables**: `workDir`, `steps[]`, `workflowContext`, `commandDoc`, initialized state
|
|
546
|
+
- **Files**: `workflow-state.json`, `process-log.md`, `command-doc.md`, per-step directories
|
|
547
|
+
- **User Confirmation**: Execution plan confirmed (or cancelled → abort)
|
|
548
|
+
- **TaskUpdate**: Mark Phase 1 completed, start Step Loop
|