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
|
@@ -1,716 +0,0 @@
|
|
|
1
|
-
# Analyze Task Generation & Execution Spec
|
|
2
|
-
|
|
3
|
-
> **Purpose**: Quality standards for task generation + execution specification for Phase 5 of `analyze-with-file`.
|
|
4
|
-
> **Consumer**: Phase 5 of `analyze-with-file` workflow.
|
|
5
|
-
> **Scope**: Task generation quality + direct inline execution.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Task Generation Flow
|
|
10
|
-
|
|
11
|
-
> **Entry point**: Routed here from SKILL.md Phase 5 when complexity is `complex` (≥3 recommendations or high-priority with dependencies).
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
Step 1: Load context → Step 2: Generate .task/*.json → Step 3: Pre-execution analysis
|
|
15
|
-
→ Step 4: User confirmation → Step 5: Serial execution → Step 6: Finalize
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
**Input artifacts** (all from session folder):
|
|
19
|
-
|
|
20
|
-
| Artifact | Required | Provides |
|
|
21
|
-
|----------|----------|----------|
|
|
22
|
-
| `conclusions.json` | Yes | `recommendations[]` with action, rationale, priority, evidence_refs |
|
|
23
|
-
| `exploration-codebase.json` | No | `relevant_files[]`, `patterns[]`, `constraints[]`, `integration_points[]` — primary source for file resolution |
|
|
24
|
-
| `explorations.json` | No | `sources[]`, `key_findings[]` — fallback for file resolution |
|
|
25
|
-
| `perspectives.json` | No | Multi-perspective findings — alternative to explorations.json |
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## File Resolution Algorithm
|
|
30
|
-
|
|
31
|
-
Target files are resolved with a 3-priority fallback chain. Recommendations carry only `evidence_refs` — file resolution is EXECUTE.md's responsibility:
|
|
32
|
-
|
|
33
|
-
```javascript
|
|
34
|
-
function resolveTargetFiles(rec, codebaseContext, explorations) {
|
|
35
|
-
// Priority 1: Extract file paths from evidence_refs (e.g., "src/auth/token.ts:89")
|
|
36
|
-
if (rec.evidence_refs?.length) {
|
|
37
|
-
const filePaths = [...new Set(
|
|
38
|
-
rec.evidence_refs
|
|
39
|
-
.filter(ref => ref.includes('/') || ref.includes('.'))
|
|
40
|
-
.map(ref => ref.split(':')[0])
|
|
41
|
-
)]
|
|
42
|
-
if (filePaths.length) {
|
|
43
|
-
return filePaths.map(path => ({
|
|
44
|
-
path,
|
|
45
|
-
action: 'modify',
|
|
46
|
-
target: null,
|
|
47
|
-
changes: []
|
|
48
|
-
}))
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Priority 2: Match from exploration-codebase.json relevant_files
|
|
53
|
-
if (codebaseContext?.relevant_files?.length) {
|
|
54
|
-
const keywords = extractKeywords(rec.action + ' ' + rec.rationale)
|
|
55
|
-
const matched = codebaseContext.relevant_files.filter(f =>
|
|
56
|
-
keywords.some(kw =>
|
|
57
|
-
f.path.toLowerCase().includes(kw) ||
|
|
58
|
-
f.summary?.toLowerCase().includes(kw) ||
|
|
59
|
-
f.relevance?.toLowerCase().includes(kw)
|
|
60
|
-
)
|
|
61
|
-
)
|
|
62
|
-
if (matched.length) {
|
|
63
|
-
return matched.map(f => ({
|
|
64
|
-
path: f.path,
|
|
65
|
-
action: 'modify',
|
|
66
|
-
target: null,
|
|
67
|
-
changes: rec.changes || []
|
|
68
|
-
}))
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Priority 3: Match from explorations.json sources
|
|
73
|
-
if (explorations?.sources?.length) {
|
|
74
|
-
const actionVerb = rec.action.split(' ')[0].toLowerCase()
|
|
75
|
-
const matched = explorations.sources.filter(s =>
|
|
76
|
-
s.summary?.toLowerCase().includes(actionVerb) ||
|
|
77
|
-
s.file?.includes(actionVerb)
|
|
78
|
-
)
|
|
79
|
-
if (matched.length) {
|
|
80
|
-
return matched.map(s => ({
|
|
81
|
-
path: s.file,
|
|
82
|
-
action: 'modify',
|
|
83
|
-
target: null,
|
|
84
|
-
changes: []
|
|
85
|
-
}))
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Fallback: empty array — task relies on description + implementation for guidance
|
|
90
|
-
return []
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function extractKeywords(text) {
|
|
94
|
-
return text
|
|
95
|
-
.toLowerCase()
|
|
96
|
-
.replace(/[^a-z0-9\u4e00-\u9fa5\s]/g, ' ')
|
|
97
|
-
.split(/\s+/)
|
|
98
|
-
.filter(w => w.length > 2)
|
|
99
|
-
.filter(w => !['the', 'and', 'for', 'with', 'from', 'that', 'this'].includes(w))
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## Task Type Inference
|
|
106
|
-
|
|
107
|
-
| Recommendation Pattern | Inferred Type |
|
|
108
|
-
|------------------------|---------------|
|
|
109
|
-
| fix, resolve, repair, patch, correct | `fix` |
|
|
110
|
-
| refactor, restructure, extract, reorganize, decouple | `refactor` |
|
|
111
|
-
| add, implement, create, build, introduce | `feature` |
|
|
112
|
-
| improve, optimize, enhance, upgrade, streamline | `enhancement` |
|
|
113
|
-
| test, coverage, validate, verify, assert | `testing` |
|
|
114
|
-
|
|
115
|
-
```javascript
|
|
116
|
-
function inferTaskType(rec) {
|
|
117
|
-
const text = (rec.action + ' ' + rec.rationale).toLowerCase()
|
|
118
|
-
const patterns = [
|
|
119
|
-
{ type: 'fix', keywords: ['fix', 'resolve', 'repair', 'patch', 'correct', 'bug'] },
|
|
120
|
-
{ type: 'refactor', keywords: ['refactor', 'restructure', 'extract', 'reorganize', 'decouple'] },
|
|
121
|
-
{ type: 'feature', keywords: ['add', 'implement', 'create', 'build', 'introduce'] },
|
|
122
|
-
{ type: 'enhancement', keywords: ['improve', 'optimize', 'enhance', 'upgrade', 'streamline'] },
|
|
123
|
-
{ type: 'testing', keywords: ['test', 'coverage', 'validate', 'verify', 'assert'] }
|
|
124
|
-
]
|
|
125
|
-
for (const p of patterns) {
|
|
126
|
-
if (p.keywords.some(kw => text.includes(kw))) return p.type
|
|
127
|
-
}
|
|
128
|
-
return 'enhancement' // safe default
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
## Effort Inference
|
|
133
|
-
|
|
134
|
-
| Signal | Effort |
|
|
135
|
-
|--------|--------|
|
|
136
|
-
| priority=high AND files >= 3 | `large` |
|
|
137
|
-
| priority=high OR files=2 | `medium` |
|
|
138
|
-
| priority=medium AND files <= 1 | `medium` |
|
|
139
|
-
| priority=low OR single file | `small` |
|
|
140
|
-
|
|
141
|
-
```javascript
|
|
142
|
-
function inferEffort(rec, targetFiles) {
|
|
143
|
-
const fileCount = targetFiles?.length || 0
|
|
144
|
-
if (rec.priority === 'high' && fileCount >= 3) return 'large'
|
|
145
|
-
if (rec.priority === 'high' || fileCount >= 2) return 'medium'
|
|
146
|
-
if (rec.priority === 'low' || fileCount <= 1) return 'small'
|
|
147
|
-
return 'medium'
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## Convergence Quality Validation
|
|
154
|
-
|
|
155
|
-
Every task's `convergence` MUST pass quality gates before writing to disk.
|
|
156
|
-
|
|
157
|
-
### Quality Rules
|
|
158
|
-
|
|
159
|
-
| Field | Requirement | Validation |
|
|
160
|
-
|-------|-------------|------------|
|
|
161
|
-
| `criteria[]` | **Testable** — assertions or concrete manual steps | Reject vague patterns; each criterion must reference observable behavior |
|
|
162
|
-
| `verification` | **Executable** — shell command or explicit step sequence | Must contain a runnable command or step-by-step verification procedure |
|
|
163
|
-
| `definition_of_done` | **Business language** — non-technical stakeholder can judge | Must NOT contain technical commands (jest, tsc, npm, build) |
|
|
164
|
-
|
|
165
|
-
### Vague Pattern Detection
|
|
166
|
-
|
|
167
|
-
```javascript
|
|
168
|
-
const VAGUE_PATTERNS = /正常|正确|好|可以|没问题|works|fine|good|correct|properly|as expected/i
|
|
169
|
-
const TECHNICAL_IN_DOD = /compile|build|lint|npm|npx|jest|tsc|eslint|cargo|pytest|go test/i
|
|
170
|
-
|
|
171
|
-
function validateConvergenceQuality(tasks) {
|
|
172
|
-
const issues = []
|
|
173
|
-
tasks.forEach(task => {
|
|
174
|
-
// Rule 1: No vague criteria
|
|
175
|
-
task.convergence.criteria.forEach((c, i) => {
|
|
176
|
-
if (VAGUE_PATTERNS.test(c) && c.length < 20) {
|
|
177
|
-
issues.push({
|
|
178
|
-
task: task.id, field: `criteria[${i}]`,
|
|
179
|
-
problem: 'Vague criterion', value: c,
|
|
180
|
-
fix: 'Replace with specific observable condition from evidence'
|
|
181
|
-
})
|
|
182
|
-
}
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
// Rule 2: Verification should be executable
|
|
186
|
-
if (task.convergence.verification && task.convergence.verification.length < 5) {
|
|
187
|
-
issues.push({
|
|
188
|
-
task: task.id, field: 'verification',
|
|
189
|
-
problem: 'Too short to be executable', value: task.convergence.verification,
|
|
190
|
-
fix: 'Provide shell command or numbered step sequence'
|
|
191
|
-
})
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// Rule 3: DoD should be business language
|
|
195
|
-
if (TECHNICAL_IN_DOD.test(task.convergence.definition_of_done)) {
|
|
196
|
-
issues.push({
|
|
197
|
-
task: task.id, field: 'definition_of_done',
|
|
198
|
-
problem: 'Contains technical commands', value: task.convergence.definition_of_done,
|
|
199
|
-
fix: 'Rewrite in business language describing user/system outcome'
|
|
200
|
-
})
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// Rule 4: files[].changes should not be empty when files exist
|
|
204
|
-
task.files?.forEach((f, i) => {
|
|
205
|
-
if (f.action === 'modify' && (!f.changes || f.changes.length === 0) && !f.change) {
|
|
206
|
-
issues.push({
|
|
207
|
-
task: task.id, field: `files[${i}].changes`,
|
|
208
|
-
problem: 'No change description for modify action', value: f.path,
|
|
209
|
-
fix: 'Describe what specifically changes in this file'
|
|
210
|
-
})
|
|
211
|
-
}
|
|
212
|
-
})
|
|
213
|
-
|
|
214
|
-
// Rule 5: implementation steps should exist
|
|
215
|
-
if (!task.implementation || task.implementation.length === 0) {
|
|
216
|
-
issues.push({
|
|
217
|
-
task: task.id, field: 'implementation',
|
|
218
|
-
problem: 'No implementation steps',
|
|
219
|
-
fix: 'Add at least one step describing how to realize this task'
|
|
220
|
-
})
|
|
221
|
-
}
|
|
222
|
-
})
|
|
223
|
-
|
|
224
|
-
// Auto-fix where possible, log remaining issues
|
|
225
|
-
issues.forEach(issue => {
|
|
226
|
-
// Attempt auto-fix based on available evidence
|
|
227
|
-
// If unfixable, log warning — task still generated but flagged
|
|
228
|
-
})
|
|
229
|
-
return issues
|
|
230
|
-
}
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### Good vs Bad Examples
|
|
234
|
-
|
|
235
|
-
**Criteria**:
|
|
236
|
-
|
|
237
|
-
| Bad | Good |
|
|
238
|
-
|-----|------|
|
|
239
|
-
| `"Code works correctly"` | `"refreshToken() returns a new JWT with >0 expiry when called with expired token"` |
|
|
240
|
-
| `"No errors"` | `"Error handler at auth.ts:45 returns 401 status with { error: 'token_expired' } body"` |
|
|
241
|
-
| `"Performance is good"` | `"API response time < 200ms at p95 for /api/users endpoint under 100 concurrent requests"` |
|
|
242
|
-
|
|
243
|
-
**Verification**:
|
|
244
|
-
|
|
245
|
-
| Bad | Good |
|
|
246
|
-
|-----|------|
|
|
247
|
-
| `"Check it"` | `"jest --testPathPattern=auth.test.ts && npx tsc --noEmit"` |
|
|
248
|
-
| `"Run tests"` | `"1. Run npm test -- --grep 'token refresh' 2. Verify no TypeScript errors with npx tsc --noEmit"` |
|
|
249
|
-
|
|
250
|
-
**Definition of Done**:
|
|
251
|
-
|
|
252
|
-
| Bad | Good |
|
|
253
|
-
|-----|------|
|
|
254
|
-
| `"jest passes"` | `"Users remain logged in across token expiration without manual re-login"` |
|
|
255
|
-
| `"No TypeScript errors"` | `"Authentication flow handles all user-facing error scenarios with clear error messages"` |
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
## Required Task Fields (analyze-with-file producer)
|
|
260
|
-
|
|
261
|
-
SKILL.md produces minimal recommendations `{action, rationale, priority, evidence_refs}`. EXECUTE.md enriches these into full task JSON. The final `.task/*.json` MUST populate:
|
|
262
|
-
|
|
263
|
-
| Block | Fields | Required |
|
|
264
|
-
|-------|--------|----------|
|
|
265
|
-
| IDENTITY | `id`, `title`, `description` | Yes |
|
|
266
|
-
| CLASSIFICATION | `type`, `priority`, `effort` | Yes |
|
|
267
|
-
| DEPENDENCIES | `depends_on` | Yes (empty array if none) |
|
|
268
|
-
| CONVERGENCE | `convergence.criteria[]`, `convergence.verification`, `convergence.definition_of_done` | Yes |
|
|
269
|
-
| FILES | `files[].path`, `files[].action`, `files[].changes`/`files[].change` | Yes (if files identified) |
|
|
270
|
-
| IMPLEMENTATION | `implementation[]` with step + description | Yes |
|
|
271
|
-
| CONTEXT | `evidence`, `source.tool`, `source.session_id`, `source.original_id` | Yes |
|
|
272
|
-
|
|
273
|
-
### Task JSON Example
|
|
274
|
-
|
|
275
|
-
```json
|
|
276
|
-
{
|
|
277
|
-
"id": "TASK-001",
|
|
278
|
-
"title": "Fix authentication token refresh",
|
|
279
|
-
"description": "Token refresh fails silently when JWT expires, causing users to be logged out unexpectedly",
|
|
280
|
-
"type": "fix",
|
|
281
|
-
"priority": "high",
|
|
282
|
-
"effort": "medium",
|
|
283
|
-
"files": [
|
|
284
|
-
{
|
|
285
|
-
"path": "src/auth/token.ts",
|
|
286
|
-
"action": "modify",
|
|
287
|
-
"target": "refreshToken",
|
|
288
|
-
"changes": [
|
|
289
|
-
"Add await to refreshToken() call at line 89",
|
|
290
|
-
"Add error propagation for refresh failure"
|
|
291
|
-
],
|
|
292
|
-
"change": "Add await to refreshToken() call and propagate errors"
|
|
293
|
-
},
|
|
294
|
-
{
|
|
295
|
-
"path": "src/middleware/auth.ts",
|
|
296
|
-
"action": "modify",
|
|
297
|
-
"target": "authMiddleware",
|
|
298
|
-
"changes": [
|
|
299
|
-
"Update error handler at line 45 to distinguish refresh failures from auth failures"
|
|
300
|
-
],
|
|
301
|
-
"change": "Update error handler to propagate refresh failures"
|
|
302
|
-
}
|
|
303
|
-
],
|
|
304
|
-
"depends_on": [],
|
|
305
|
-
"convergence": {
|
|
306
|
-
"criteria": [
|
|
307
|
-
"refreshToken() returns new valid JWT when called with expired token",
|
|
308
|
-
"Expired token triggers automatic refresh without user action",
|
|
309
|
-
"Failed refresh returns 401 with { error: 'token_expired' } body"
|
|
310
|
-
],
|
|
311
|
-
"verification": "jest --testPathPattern=token.test.ts && npx tsc --noEmit",
|
|
312
|
-
"definition_of_done": "Users remain logged in across token expiration without manual re-login"
|
|
313
|
-
},
|
|
314
|
-
"implementation": [
|
|
315
|
-
{
|
|
316
|
-
"step": "1",
|
|
317
|
-
"description": "Add await to refreshToken() call in token.ts",
|
|
318
|
-
"actions": ["Read token.ts", "Add await keyword at line 89", "Verify async chain"]
|
|
319
|
-
},
|
|
320
|
-
{
|
|
321
|
-
"step": "2",
|
|
322
|
-
"description": "Update error handler in auth middleware",
|
|
323
|
-
"actions": ["Read auth.ts", "Modify error handler at line 45", "Add refresh-specific error type"]
|
|
324
|
-
}
|
|
325
|
-
],
|
|
326
|
-
"evidence": ["src/auth/token.ts:89", "src/middleware/auth.ts:45"],
|
|
327
|
-
"source": {
|
|
328
|
-
"tool": "analyze-with-file",
|
|
329
|
-
"session_id": "ANL-auth-token-refresh-2025-01-21",
|
|
330
|
-
"original_id": "TASK-001"
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
---
|
|
336
|
-
|
|
337
|
-
## Step 1: Load All Context Sources
|
|
338
|
-
|
|
339
|
-
Phase 2-4 already loaded and processed these artifacts. If data is still in conversation memory, skip disk reads.
|
|
340
|
-
|
|
341
|
-
```javascript
|
|
342
|
-
// Skip loading if already in memory from Phase 2-4
|
|
343
|
-
// Only read from disk when entering EXECUTE.md from a fresh/resumed session
|
|
344
|
-
|
|
345
|
-
if (!conclusions) {
|
|
346
|
-
conclusions = JSON.parse(Read(`${sessionFolder}/conclusions.json`))
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
if (!codebaseContext) {
|
|
350
|
-
codebaseContext = file_exists(`${sessionFolder}/exploration-codebase.json`)
|
|
351
|
-
? JSON.parse(Read(`${sessionFolder}/exploration-codebase.json`))
|
|
352
|
-
: null
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
if (!explorations) {
|
|
356
|
-
explorations = file_exists(`${sessionFolder}/explorations.json`)
|
|
357
|
-
? JSON.parse(Read(`${sessionFolder}/explorations.json`))
|
|
358
|
-
: file_exists(`${sessionFolder}/perspectives.json`)
|
|
359
|
-
? JSON.parse(Read(`${sessionFolder}/perspectives.json`))
|
|
360
|
-
: null
|
|
361
|
-
}
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
## Step 2: Enrich Recommendations & Generate .task/*.json
|
|
365
|
-
|
|
366
|
-
SKILL.md Phase 4 produces minimal recommendations: `{action, rationale, priority, evidence_refs}`.
|
|
367
|
-
This step enriches each recommendation with execution-specific details using codebase context, then generates individual task JSON files.
|
|
368
|
-
|
|
369
|
-
**Enrichment pipeline**: `rec (minimal) + codebaseContext + explorations → task JSON (full)`
|
|
370
|
-
|
|
371
|
-
```javascript
|
|
372
|
-
const tasks = conclusions.recommendations.map((rec, index) => {
|
|
373
|
-
const taskId = `TASK-${String(index + 1).padStart(3, '0')}`
|
|
374
|
-
|
|
375
|
-
// 1. ENRICH: Resolve target files from codebase context (not from rec)
|
|
376
|
-
const targetFiles = resolveTargetFiles(rec, codebaseContext, explorations)
|
|
377
|
-
|
|
378
|
-
// 2. ENRICH: Generate implementation steps from action + context
|
|
379
|
-
const implSteps = generateImplementationSteps(rec, targetFiles, codebaseContext)
|
|
380
|
-
|
|
381
|
-
// 3. ENRICH: Derive change descriptions per file
|
|
382
|
-
const enrichedFiles = targetFiles.map(f => ({
|
|
383
|
-
path: f.path,
|
|
384
|
-
action: f.action || 'modify',
|
|
385
|
-
target: f.target || null,
|
|
386
|
-
changes: deriveChanges(rec, f, codebaseContext) || [],
|
|
387
|
-
change: rec.action
|
|
388
|
-
}))
|
|
389
|
-
|
|
390
|
-
return {
|
|
391
|
-
id: taskId,
|
|
392
|
-
title: rec.action,
|
|
393
|
-
description: rec.rationale,
|
|
394
|
-
type: inferTaskType(rec),
|
|
395
|
-
priority: rec.priority,
|
|
396
|
-
effort: inferEffort(rec, targetFiles),
|
|
397
|
-
|
|
398
|
-
files: enrichedFiles,
|
|
399
|
-
depends_on: [],
|
|
400
|
-
|
|
401
|
-
// CONVERGENCE (must pass quality validation)
|
|
402
|
-
convergence: {
|
|
403
|
-
criteria: generateCriteria(rec),
|
|
404
|
-
verification: generateVerification(rec),
|
|
405
|
-
definition_of_done: generateDoD(rec)
|
|
406
|
-
},
|
|
407
|
-
|
|
408
|
-
// IMPLEMENTATION steps (generated here, not from SKILL.md)
|
|
409
|
-
implementation: implSteps,
|
|
410
|
-
|
|
411
|
-
// CONTEXT
|
|
412
|
-
evidence: rec.evidence_refs || [],
|
|
413
|
-
source: {
|
|
414
|
-
tool: 'analyze-with-file',
|
|
415
|
-
session_id: sessionId,
|
|
416
|
-
original_id: taskId
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
})
|
|
420
|
-
|
|
421
|
-
// Quality validation
|
|
422
|
-
validateConvergenceQuality(tasks)
|
|
423
|
-
|
|
424
|
-
// Write each task as individual JSON file
|
|
425
|
-
Bash(`mkdir -p ${sessionFolder}/.task`)
|
|
426
|
-
tasks.forEach(task => {
|
|
427
|
-
Write(`${sessionFolder}/.task/${task.id}.json`, JSON.stringify(task, null, 2))
|
|
428
|
-
})
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
**Enrichment Functions**:
|
|
432
|
-
|
|
433
|
-
```javascript
|
|
434
|
-
// Generate implementation steps from action + resolved files
|
|
435
|
-
function generateImplementationSteps(rec, targetFiles, codebaseContext) {
|
|
436
|
-
// 1. Parse rec.action into atomic steps
|
|
437
|
-
// 2. Map steps to target files
|
|
438
|
-
// 3. Add context from codebaseContext.patterns if applicable
|
|
439
|
-
// Return: [{step: '1', description: '...', actions: [...]}]
|
|
440
|
-
return [{
|
|
441
|
-
step: '1',
|
|
442
|
-
description: rec.action,
|
|
443
|
-
actions: targetFiles.map(f => `Modify ${f.path}`)
|
|
444
|
-
}]
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
// Derive specific change descriptions for a file
|
|
448
|
-
function deriveChanges(rec, file, codebaseContext) {
|
|
449
|
-
// 1. Match rec.action keywords to file content patterns
|
|
450
|
-
// 2. Use codebaseContext.patterns for context-aware change descriptions
|
|
451
|
-
// 3. Use rec.evidence_refs to locate specific modification points
|
|
452
|
-
// Return: ['specific change 1', 'specific change 2']
|
|
453
|
-
return [rec.action]
|
|
454
|
-
}
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
## Step 3-6: Execution Steps
|
|
458
|
-
|
|
459
|
-
After `.task/*.json` generation, validate and execute tasks directly inline.
|
|
460
|
-
|
|
461
|
-
### Step 3: Pre-Execution Analysis
|
|
462
|
-
|
|
463
|
-
```javascript
|
|
464
|
-
const taskFiles = Glob(`${sessionFolder}/.task/*.json`)
|
|
465
|
-
const tasks = taskFiles.map(f => JSON.parse(Read(f)))
|
|
466
|
-
|
|
467
|
-
// 1. Dependency validation
|
|
468
|
-
const taskIds = new Set(tasks.map(t => t.id))
|
|
469
|
-
const errors = []
|
|
470
|
-
tasks.forEach(task => {
|
|
471
|
-
task.depends_on.forEach(dep => {
|
|
472
|
-
if (!taskIds.has(dep)) errors.push(`${task.id}: depends on unknown task ${dep}`)
|
|
473
|
-
})
|
|
474
|
-
})
|
|
475
|
-
|
|
476
|
-
// 2. Circular dependency detection (DFS)
|
|
477
|
-
function detectCycles(tasks) {
|
|
478
|
-
const graph = new Map(tasks.map(t => [t.id, t.depends_on]))
|
|
479
|
-
const visited = new Set(), inStack = new Set(), cycles = []
|
|
480
|
-
function dfs(node, path) {
|
|
481
|
-
if (inStack.has(node)) { cycles.push([...path, node].join(' → ')); return }
|
|
482
|
-
if (visited.has(node)) return
|
|
483
|
-
visited.add(node); inStack.add(node)
|
|
484
|
-
;(graph.get(node) || []).forEach(dep => dfs(dep, [...path, node]))
|
|
485
|
-
inStack.delete(node)
|
|
486
|
-
}
|
|
487
|
-
tasks.forEach(t => { if (!visited.has(t.id)) dfs(t.id, []) })
|
|
488
|
-
return cycles
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
// 3. Topological sort for execution order
|
|
492
|
-
function topoSort(tasks) {
|
|
493
|
-
const inDegree = new Map(tasks.map(t => [t.id, 0]))
|
|
494
|
-
tasks.forEach(t => t.depends_on.forEach(dep => {
|
|
495
|
-
inDegree.set(t.id, inDegree.get(t.id) + 1)
|
|
496
|
-
}))
|
|
497
|
-
const queue = tasks.filter(t => inDegree.get(t.id) === 0).map(t => t.id)
|
|
498
|
-
const order = []
|
|
499
|
-
while (queue.length) {
|
|
500
|
-
const id = queue.shift()
|
|
501
|
-
order.push(id)
|
|
502
|
-
tasks.forEach(t => {
|
|
503
|
-
if (t.depends_on.includes(id)) {
|
|
504
|
-
inDegree.set(t.id, inDegree.get(t.id) - 1)
|
|
505
|
-
if (inDegree.get(t.id) === 0) queue.push(t.id)
|
|
506
|
-
}
|
|
507
|
-
})
|
|
508
|
-
}
|
|
509
|
-
return order
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
// 4. File conflict detection
|
|
513
|
-
const fileTaskMap = new Map()
|
|
514
|
-
tasks.forEach(task => {
|
|
515
|
-
(task.files || []).forEach(f => {
|
|
516
|
-
if (!fileTaskMap.has(f.path)) fileTaskMap.set(f.path, [])
|
|
517
|
-
fileTaskMap.get(f.path).push(task.id)
|
|
518
|
-
})
|
|
519
|
-
})
|
|
520
|
-
const conflicts = []
|
|
521
|
-
fileTaskMap.forEach((taskIds, file) => {
|
|
522
|
-
if (taskIds.length > 1) conflicts.push({ file, tasks: taskIds })
|
|
523
|
-
})
|
|
524
|
-
```
|
|
525
|
-
|
|
526
|
-
### Step 4: Initialize Execution Artifacts
|
|
527
|
-
|
|
528
|
-
```javascript
|
|
529
|
-
// execution.md — overview with task table
|
|
530
|
-
const executionMd = `# Execution Overview
|
|
531
|
-
|
|
532
|
-
## Session Info
|
|
533
|
-
- **Session ID**: ${sessionId}
|
|
534
|
-
- **Plan Source**: .task/*.json (from analysis conclusions)
|
|
535
|
-
- **Started**: ${getUtc8ISOString()}
|
|
536
|
-
- **Total Tasks**: ${tasks.length}
|
|
537
|
-
|
|
538
|
-
## Task Overview
|
|
539
|
-
|
|
540
|
-
| # | ID | Title | Type | Priority | Status |
|
|
541
|
-
|---|-----|-------|------|----------|--------|
|
|
542
|
-
${tasks.map((t, i) => `| ${i+1} | ${t.id} | ${t.title} | ${t.type} | ${t.priority} | pending |`).join('\n')}
|
|
543
|
-
|
|
544
|
-
## Pre-Execution Analysis
|
|
545
|
-
${conflicts.length
|
|
546
|
-
? `### File Conflicts\n${conflicts.map(c => `- **${c.file}**: ${c.tasks.join(', ')}`).join('\n')}`
|
|
547
|
-
: 'No file conflicts detected.'}
|
|
548
|
-
|
|
549
|
-
## Execution Timeline
|
|
550
|
-
> Updated as tasks complete
|
|
551
|
-
`
|
|
552
|
-
Write(`${sessionFolder}/execution.md`, executionMd)
|
|
553
|
-
|
|
554
|
-
// execution-events.md — chronological event log
|
|
555
|
-
Write(`${sessionFolder}/execution-events.md`,
|
|
556
|
-
`# Execution Events\n\n**Session**: ${sessionId}\n**Started**: ${getUtc8ISOString()}\n\n---\n\n`)
|
|
557
|
-
```
|
|
558
|
-
|
|
559
|
-
### Step 5: Task Execution Loop
|
|
560
|
-
|
|
561
|
-
**User Confirmation** before execution:
|
|
562
|
-
|
|
563
|
-
```javascript
|
|
564
|
-
if (!autoYes) {
|
|
565
|
-
const action = AskUserQuestion({
|
|
566
|
-
questions: [{
|
|
567
|
-
question: `Execute ${tasks.length} tasks?\n${tasks.map(t => ` ${t.id}: ${t.title} (${t.priority})`).join('\n')}`,
|
|
568
|
-
header: "Confirm",
|
|
569
|
-
multiSelect: false,
|
|
570
|
-
options: [
|
|
571
|
-
{ label: "Start", description: "Execute all tasks serially" },
|
|
572
|
-
{ label: "Adjust", description: "Modify .task/*.json before execution" },
|
|
573
|
-
{ label: "Skip", description: "Keep .task/*.json, skip execution" }
|
|
574
|
-
]
|
|
575
|
-
}]
|
|
576
|
-
})
|
|
577
|
-
// "Adjust": user edits task files, then resumes
|
|
578
|
-
// "Skip": end — user can execute later separately
|
|
579
|
-
}
|
|
580
|
-
```
|
|
581
|
-
|
|
582
|
-
Execute tasks serially using `task.implementation` steps and `task.files[].changes` as guidance.
|
|
583
|
-
|
|
584
|
-
```
|
|
585
|
-
For each taskId in executionOrder:
|
|
586
|
-
├─ Load task from .task/{taskId}.json
|
|
587
|
-
├─ Check dependencies satisfied
|
|
588
|
-
├─ Record START event → execution-events.md
|
|
589
|
-
├─ Execute using task.implementation + task.files[].changes:
|
|
590
|
-
│ ├─ Read target files listed in task.files[]
|
|
591
|
-
│ ├─ Apply modifications described in files[].changes / files[].change
|
|
592
|
-
│ ├─ Follow implementation[].actions sequence
|
|
593
|
-
│ └─ Use Edit (preferred), Write (new files), Bash (build/test)
|
|
594
|
-
├─ Verify convergence:
|
|
595
|
-
│ ├─ Check each convergence.criteria[] item
|
|
596
|
-
│ ├─ Run convergence.verification (if executable command)
|
|
597
|
-
│ └─ Record verification results
|
|
598
|
-
├─ Record COMPLETE/FAIL event → execution-events.md
|
|
599
|
-
├─ Update execution.md task status
|
|
600
|
-
└─ Continue to next task
|
|
601
|
-
```
|
|
602
|
-
|
|
603
|
-
**Execution Guidance Priority** — what the AI follows when executing each task:
|
|
604
|
-
|
|
605
|
-
| Priority | Source | Example |
|
|
606
|
-
|----------|--------|---------|
|
|
607
|
-
| 1 | `files[].changes` / `files[].change` | "Add await to refreshToken() call at line 89" |
|
|
608
|
-
| 2 | `implementation[].actions` | ["Read token.ts", "Add await keyword at line 89"] |
|
|
609
|
-
| 3 | `implementation[].description` | "Add await to refreshToken() call in token.ts" |
|
|
610
|
-
| 4 | `task.description` | "Token refresh fails silently..." |
|
|
611
|
-
|
|
612
|
-
When `files[].changes` is populated, the AI has concrete instructions. When empty, it falls back to `implementation` steps, then to `description`.
|
|
613
|
-
|
|
614
|
-
### Step 5.1: Failure Handling
|
|
615
|
-
|
|
616
|
-
```javascript
|
|
617
|
-
// On task failure, ask user how to proceed
|
|
618
|
-
if (!autoYes) {
|
|
619
|
-
AskUserQuestion({
|
|
620
|
-
questions: [{
|
|
621
|
-
question: `Task ${task.id} failed: ${errorMessage}\nHow to proceed?`,
|
|
622
|
-
header: "Failure",
|
|
623
|
-
multiSelect: false,
|
|
624
|
-
options: [
|
|
625
|
-
{ label: "Skip & Continue", description: "Skip this task, continue with next" },
|
|
626
|
-
{ label: "Retry", description: "Retry this task" },
|
|
627
|
-
{ label: "Abort", description: "Stop execution, keep progress" }
|
|
628
|
-
]
|
|
629
|
-
}]
|
|
630
|
-
})
|
|
631
|
-
}
|
|
632
|
-
```
|
|
633
|
-
|
|
634
|
-
### Step 6: Finalize
|
|
635
|
-
|
|
636
|
-
After all tasks complete:
|
|
637
|
-
|
|
638
|
-
1. Append execution summary to `execution.md` (statistics, task results table)
|
|
639
|
-
2. Append session footer to `execution-events.md`
|
|
640
|
-
3. Write back `_execution` state to each `.task/*.json`:
|
|
641
|
-
|
|
642
|
-
```javascript
|
|
643
|
-
tasks.forEach(task => {
|
|
644
|
-
const updated = {
|
|
645
|
-
...task,
|
|
646
|
-
status: task._status, // "completed" | "failed" | "skipped"
|
|
647
|
-
executed_at: task._executed_at,
|
|
648
|
-
result: {
|
|
649
|
-
success: task._status === 'completed',
|
|
650
|
-
files_modified: task._result?.files_modified || [],
|
|
651
|
-
summary: task._result?.summary || '',
|
|
652
|
-
error: task._result?.error || null,
|
|
653
|
-
convergence_verified: task._result?.convergence_verified || []
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
Write(`${sessionFolder}/.task/${task.id}.json`, JSON.stringify(updated, null, 2))
|
|
657
|
-
})
|
|
658
|
-
```
|
|
659
|
-
|
|
660
|
-
### Step 6.1: Post-Execution Options
|
|
661
|
-
|
|
662
|
-
```javascript
|
|
663
|
-
if (!autoYes) {
|
|
664
|
-
AskUserQuestion({
|
|
665
|
-
questions: [{
|
|
666
|
-
question: `Execution complete: ${completedTasks.size}/${tasks.length} succeeded. Next:`,
|
|
667
|
-
header: "Post-Execute",
|
|
668
|
-
multiSelect: false,
|
|
669
|
-
options: [
|
|
670
|
-
{ label: "Retry Failed", description: `Re-execute ${failedTasks.size} failed tasks` },
|
|
671
|
-
{ label: "View Events", description: "Display execution-events.md" },
|
|
672
|
-
{ label: "Create Issue", description: "Create issue from failed tasks" },
|
|
673
|
-
{ label: "Done", description: "End workflow" }
|
|
674
|
-
]
|
|
675
|
-
}]
|
|
676
|
-
})
|
|
677
|
-
}
|
|
678
|
-
```
|
|
679
|
-
|
|
680
|
-
---
|
|
681
|
-
|
|
682
|
-
## Output Structure
|
|
683
|
-
|
|
684
|
-
```
|
|
685
|
-
{sessionFolder}/
|
|
686
|
-
├── .task/ # Individual task JSON files (with _execution state after completion)
|
|
687
|
-
│ ├── TASK-001.json
|
|
688
|
-
│ └── ...
|
|
689
|
-
├── execution.md # Execution overview + task table + summary
|
|
690
|
-
└── execution-events.md # Chronological event log
|
|
691
|
-
```
|
|
692
|
-
|
|
693
|
-
## execution-events.md Event Format
|
|
694
|
-
|
|
695
|
-
```markdown
|
|
696
|
-
## {timestamp} — {task.id}: {task.title}
|
|
697
|
-
|
|
698
|
-
**Type**: {task.type} | **Priority**: {task.priority}
|
|
699
|
-
**Status**: IN PROGRESS
|
|
700
|
-
**Files**: {task.files[].path}
|
|
701
|
-
|
|
702
|
-
### Execution Log
|
|
703
|
-
- Read {file} ({lines} lines)
|
|
704
|
-
- Applied: {change description}
|
|
705
|
-
- ...
|
|
706
|
-
|
|
707
|
-
**Status**: COMPLETED / FAILED
|
|
708
|
-
**Files Modified**: {list}
|
|
709
|
-
|
|
710
|
-
#### Convergence Verification
|
|
711
|
-
- [x/] {criterion 1}
|
|
712
|
-
- [x/] {criterion 2}
|
|
713
|
-
- **Verification**: {command} → PASS/FAIL
|
|
714
|
-
|
|
715
|
-
---
|
|
716
|
-
```
|