claude-code-workflow 7.2.27 → 7.2.28
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/.ccw/specs/architecture-constraints.md +5 -0
- package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +140 -0
- package/.claude/skills/investigate/SKILL.md +110 -0
- package/.claude/skills/investigate/phases/01-root-cause-investigation.md +132 -0
- package/.claude/skills/investigate/phases/02-pattern-analysis.md +126 -0
- package/.claude/skills/investigate/phases/03-hypothesis-testing.md +177 -0
- package/.claude/skills/investigate/phases/04-implementation.md +139 -0
- package/.claude/skills/investigate/phases/05-verification-report.md +153 -0
- package/.claude/skills/investigate/specs/debug-report-format.md +226 -0
- package/.claude/skills/investigate/specs/iron-law.md +101 -0
- package/.claude/skills/security-audit/SKILL.md +125 -0
- package/.claude/skills/security-audit/phases/01-supply-chain-scan.md +139 -0
- package/.claude/skills/security-audit/phases/02-owasp-review.md +156 -0
- package/.claude/skills/security-audit/phases/03-threat-modeling.md +180 -0
- package/.claude/skills/security-audit/phases/04-report-tracking.md +177 -0
- package/.claude/skills/security-audit/specs/owasp-checklist.md +442 -0
- package/.claude/skills/security-audit/specs/scoring-gates.md +141 -0
- package/.claude/skills/ship/SKILL.md +105 -0
- package/.claude/skills/ship/phases/01-preflight-checks.md +121 -0
- package/.claude/skills/ship/phases/02-code-review.md +137 -0
- package/.claude/skills/ship/phases/03-version-bump.md +171 -0
- package/.claude/skills/ship/phases/04-changelog-commit.md +167 -0
- package/.claude/skills/ship/phases/05-pr-creation.md +163 -0
- package/.claude/skills/skill-generator/templates/sequential-phase.md +10 -0
- package/.claude/skills/skill-generator/templates/skill-md.md +4 -0
- package/.claude/skills/team-interactive-craft/SKILL.md +127 -0
- package/.claude/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.claude/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +192 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +183 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/role.md +166 -0
- package/.claude/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.claude/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.claude/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.claude/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.claude/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.claude/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.claude/skills/team-motion-design/SKILL.md +129 -0
- package/.claude/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.claude/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/dispatch.md +203 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/monitor.md +184 -0
- package/.claude/skills/team-motion-design/roles/coordinator/role.md +167 -0
- package/.claude/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.claude/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.claude/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.claude/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.claude/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.claude/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.claude/skills/team-motion-design/specs/team-config.json +99 -0
- package/.claude/skills/team-ui-polish/SKILL.md +127 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +194 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/monitor.md +180 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/role.md +170 -0
- package/.claude/skills/team-ui-polish/roles/diagnostician/role.md +160 -0
- package/.claude/skills/team-ui-polish/roles/optimizer/role.md +225 -0
- package/.claude/skills/team-ui-polish/roles/scanner/role.md +356 -0
- package/.claude/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.claude/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.claude/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.claude/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.claude/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.claude/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.claude/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.claude/skills/team-uidesign/SKILL.md +6 -1
- package/.claude/skills/team-uidesign/roles/designer/role.md +28 -4
- package/.claude/skills/team-uidesign/roles/implementer/role.md +25 -3
- package/.claude/skills/team-uidesign/roles/researcher/role.md +21 -2
- package/.claude/skills/team-uidesign/roles/reviewer/role.md +19 -17
- package/.claude/skills/team-uidesign/specs/anti-patterns.md +211 -0
- package/.claude/skills/team-uidesign/specs/design-standards.md +329 -0
- package/.claude/skills/team-uidesign/specs/scoring-guide.md +114 -0
- package/.claude/skills/team-uidesign/specs/team-config.json +1 -1
- package/.claude/skills/team-uidesign/specs/ux-writing.md +86 -0
- package/.claude/skills/team-ux-improve/SKILL.md +3 -0
- package/.claude/skills/team-ux-improve/roles/designer/role.md +30 -0
- package/.claude/skills/team-ux-improve/roles/diagnoser/role.md +16 -1
- package/.claude/skills/team-ux-improve/roles/scanner/role.md +43 -1
- package/.claude/skills/team-ux-improve/specs/anti-patterns.md +103 -0
- package/.claude/skills/team-ux-improve/specs/design-standards.md +54 -0
- package/.claude/skills/team-ux-improve/specs/heuristics.md +88 -0
- package/.claude/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +40 -8
- package/.claude/skills/team-ux-improve/wisdom/patterns/state-management.md +32 -12
- package/.claude/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +35 -11
- package/.claude/skills/team-ux-improve/wisdom/principles/general-ux.md +36 -9
- package/.claude/skills/team-visual-a11y/SKILL.md +143 -0
- package/.claude/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +250 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +204 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/role.md +169 -0
- package/.claude/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.claude/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.claude/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.claude/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.claude/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.claude/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.claude/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.claude/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.claude/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.claude/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/.codex/skills/investigate/agents/investigator.md +392 -0
- package/.codex/skills/investigate/orchestrator.md +362 -0
- package/.codex/skills/investigate/phases/01-root-cause-investigation.md +212 -0
- package/.codex/skills/investigate/phases/02-pattern-analysis.md +181 -0
- package/.codex/skills/investigate/phases/03-hypothesis-testing.md +214 -0
- package/.codex/skills/investigate/phases/04-implementation.md +195 -0
- package/.codex/skills/investigate/phases/05-verification-report.md +240 -0
- package/.codex/skills/security-audit/agents/security-auditor.md +341 -0
- package/.codex/skills/security-audit/orchestrator.md +384 -0
- package/.codex/skills/security-audit/phases/01-supply-chain-scan.md +226 -0
- package/.codex/skills/security-audit/phases/02-owasp-review.md +232 -0
- package/.codex/skills/security-audit/phases/03-threat-modeling.md +249 -0
- package/.codex/skills/security-audit/phases/04-report-tracking.md +300 -0
- package/.codex/skills/ship/agents/ship-operator.md +318 -0
- package/.codex/skills/ship/orchestrator.md +426 -0
- package/.codex/skills/ship/phases/01-preflight-checks.md +198 -0
- package/.codex/skills/ship/phases/02-code-review.md +228 -0
- package/.codex/skills/ship/phases/03-version-bump.md +259 -0
- package/.codex/skills/ship/phases/04-changelog-commit.md +263 -0
- package/.codex/skills/ship/phases/05-pr-creation.md +280 -0
- package/.codex/skills/team-interactive-craft/SKILL.md +220 -0
- package/.codex/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.codex/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +162 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +233 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/role.md +209 -0
- package/.codex/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.codex/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.codex/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.codex/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.codex/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.codex/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.codex/skills/team-motion-design/SKILL.md +222 -0
- package/.codex/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.codex/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/dispatch.md +168 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/monitor.md +242 -0
- package/.codex/skills/team-motion-design/roles/coordinator/role.md +210 -0
- package/.codex/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.codex/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.codex/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.codex/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.codex/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.codex/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.codex/skills/team-motion-design/specs/team-config.json +99 -0
- package/.codex/skills/team-ui-polish/SKILL.md +218 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +167 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/monitor.md +230 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-ui-polish/roles/diagnostician/role.md +164 -0
- package/.codex/skills/team-ui-polish/roles/optimizer/role.md +229 -0
- package/.codex/skills/team-ui-polish/roles/scanner/role.md +360 -0
- package/.codex/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.codex/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.codex/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.codex/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.codex/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.codex/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.codex/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.codex/skills/team-visual-a11y/SKILL.md +319 -0
- package/.codex/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +188 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +281 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.codex/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.codex/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.codex/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.codex/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.codex/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.codex/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.codex/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.codex/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.codex/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/README.md +8 -0
- package/ccw/dist/core/hooks/hook-templates.d.ts.map +1 -1
- package/ccw/dist/core/hooks/hook-templates.js +114 -1
- package/ccw/dist/core/hooks/hook-templates.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +34 -0
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +2 -2
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js → AlertDialog-BjP1ydDR.js} +2 -2
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-BjP1ydDR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-CAX3xqMf.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-CAX3xqMf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-CtWlmztq.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-CtWlmztq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-hR4a-eLX.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-hR4a-eLX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-DzNPkFN9.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-DzNPkFN9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BPEGN4TT.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BPEGN4TT.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cf0r2RHY.js} +2 -2
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cf0r2RHY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DEm1rJ4h.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DEm1rJ4h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-BpeWw8HO.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-BpeWw8HO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-BEsmh2vF.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-BEsmh2vF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-B30SFdtU.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-B30SFdtU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-BVvMpg1O.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-BVvMpg1O.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-CL73dHbh.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-CL73dHbh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-BL-28lMZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-BL-28lMZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BzZDciHZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BzZDciHZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-CDp6-d8P.js} +2 -2
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-CDp6-d8P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-fZY_7O9n.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-fZY_7O9n.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-4LJeC9bq.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-4LJeC9bq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-Bpigrbhw.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-Bpigrbhw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-BP0zJc1R.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-BP0zJc1R.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-CSt2oVKQ.js} +2 -2
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-CSt2oVKQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-B-xaMA0w.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-B-xaMA0w.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-CJqo_7DY.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-CJqo_7DY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-ibZeQA-Y.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-ibZeQA-Y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-DgJ4ctPQ.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-DgJ4ctPQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-Cit0Yq0D.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-Cit0Yq0D.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-Ce1HDIK0.js} +2 -2
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-Ce1HDIK0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-J1KikNrk.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-J1KikNrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CdBjTmth.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CdBjTmth.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-B9ZK7LvX.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-B9ZK7LvX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-CW_nS5UR.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-CW_nS5UR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SettingsPage-BPDbXPSM.js → SettingsPage-B2PYzSoO.js} +35 -35
- package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +1 -0
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js → SkillsManagerPage-CTnWrrwp.js} +2 -2
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js.map → SkillsManagerPage-CTnWrrwp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DJpi9XQL.js} +2 -2
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DJpi9XQL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-Ac6Ov7uy.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-Ac6Ov7uy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-DZAAspqR.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-DZAAspqR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-BJkwfhIZ.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-BJkwfhIZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-BJgjxBgb.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-BJgjxBgb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-D1WekoOy.js} +2 -2
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-D1WekoOy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-DxemgIhF.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-DxemgIhF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-CjS83f1V.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-CjS83f1V.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-B5PUcn8I.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-B5PUcn8I.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-DCc9aPbb.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-DCc9aPbb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-DOwFtzak.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-DOwFtzak.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-96qH3aFh.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-96qH3aFh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CCxSuil1.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CCxSuil1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-CZNSJFdq.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-CZNSJFdq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-h8xtvw2_.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-h8xtvw2_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-D3NY0bm6.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-D3NY0bm6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-Cy2vkc8p.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-Cy2vkc8p.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-Bzq3U1Mx.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-Bzq3U1Mx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-DwuwPDPi.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-DwuwPDPi.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-q9g-bknU.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-q9g-bknU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-CL6vb42J.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-CL6vb42J.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-BkrcQBly.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-BkrcQBly.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-BQbwyNeV.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-BQbwyNeV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-x5_7DrN7.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-x5_7DrN7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-DTyWXwzf.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-DTyWXwzf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-80O0kJO7.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-80O0kJO7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-DDlN2Bwa.js} +2 -2
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-DDlN2Bwa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-B9A3Hnrk.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-B9A3Hnrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-Bs80iCX0.js} +2 -2
- package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-Bs80iCX0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index-mbeo62f8.js} +2 -2
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index-mbeo62f8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-rLgoBCfV.js} +3 -3
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-rLgoBCfV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-C1niOWJx.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-C1niOWJx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-BTmI7SUg.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-BTmI7SUg.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CB9HKeuZ.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CB9HKeuZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-koEYiemK.js} +2 -2
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-koEYiemK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-v2_GaLdC.js} +2 -2
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-v2_GaLdC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BQNfAqG_.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BQNfAqG_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-Dzq5LGg9.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-Dzq5LGg9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CtkoJXcz.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CtkoJXcz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-CH3smL37.js} +2 -2
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-CH3smL37.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CZ0aL_yF.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CZ0aL_yF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-F2A_J4l6.js} +2 -2
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-F2A_J4l6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-Byxot0YU.js} +2 -2
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-Byxot0YU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-JjqhUkpw.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-JjqhUkpw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2--SuN9rAt.js} +2 -2
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2--SuN9rAt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-BbngGB2h.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-BbngGB2h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-CgrHgZSl.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-CgrHgZSl.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-BU3TQr7Z.js} +2 -2
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-BU3TQr7Z.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CKs7nnn3.js} +2 -2
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CKs7nnn3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-DW5tsDW6.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-DW5tsDW6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-BHm7w3ON.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-BHm7w3ON.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-DYR7PWwt.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-DYR7PWwt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-D0TVgQD_.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-D0TVgQD_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-DfY8mAP8.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-DfY8mAP8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-CGusDp0F.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-CGusDp0F.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-CIwh0fF1.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-CIwh0fF1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-FMyFv39K.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-FMyFv39K.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-B2qhsoTb.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-B2qhsoTb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-cxKXMBm3.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-cxKXMBm3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-B-xUT_z-.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-B-xUT_z-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-DZV_3lPr.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-DZV_3lPr.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/package.json +105 -105
- package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# Phase 2: Code Review
|
|
2
|
+
|
|
3
|
+
> **COMPACT PROTECTION**: This is a core execution phase. If context compression has occurred and this file is only a summary, **MUST `Read` this file again before executing any Step**. Do not execute from memory.
|
|
4
|
+
|
|
5
|
+
Automated AI-powered code review of changes since the base branch, with risk assessment.
|
|
6
|
+
|
|
7
|
+
## Objective
|
|
8
|
+
|
|
9
|
+
- Detect the merge base between current branch and target branch
|
|
10
|
+
- Generate diff for review
|
|
11
|
+
- Assess high-risk indicators before AI review
|
|
12
|
+
- Run AI-powered code review via inline subagent
|
|
13
|
+
- Flag high-risk changes (large diffs, sensitive files, breaking changes)
|
|
14
|
+
|
|
15
|
+
## Input
|
|
16
|
+
|
|
17
|
+
| Source | Required | Description |
|
|
18
|
+
|--------|----------|-------------|
|
|
19
|
+
| Phase 1 gate result | Yes | overall: "pass" — must have passed |
|
|
20
|
+
| Repository git history | Yes | Commit log, diff data |
|
|
21
|
+
|
|
22
|
+
## Execution Steps
|
|
23
|
+
|
|
24
|
+
### Step 1: Detect Merge Base
|
|
25
|
+
|
|
26
|
+
Determine the target branch and find the common ancestor commit.
|
|
27
|
+
|
|
28
|
+
**Decision Table**:
|
|
29
|
+
|
|
30
|
+
| Condition | Action |
|
|
31
|
+
|-----------|--------|
|
|
32
|
+
| origin/main exists | Use main as target branch |
|
|
33
|
+
| origin/main not found | Fall back to master as target branch |
|
|
34
|
+
| Current branch is main or master | Use last tag as merge base |
|
|
35
|
+
| Current branch is main/master and no tags exist | Use initial commit as merge base |
|
|
36
|
+
| Current branch is feature branch | Use `git merge-base origin/<target> HEAD` |
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Determine target branch (default: main, fallback: master)
|
|
40
|
+
target_branch="main"
|
|
41
|
+
if ! git rev-parse --verify "origin/$target_branch" &>/dev/null; then
|
|
42
|
+
target_branch="master"
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# Find merge base
|
|
46
|
+
merge_base=$(git merge-base "origin/$target_branch" HEAD)
|
|
47
|
+
echo "Merge base: $merge_base"
|
|
48
|
+
|
|
49
|
+
# If on main/master directly, compare against last tag
|
|
50
|
+
current_branch=$(git branch --show-current)
|
|
51
|
+
if [ "$current_branch" = "main" ] || [ "$current_branch" = "master" ]; then
|
|
52
|
+
last_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
|
53
|
+
if [ -n "$last_tag" ]; then
|
|
54
|
+
merge_base="$last_tag"
|
|
55
|
+
echo "On main — using last tag as base: $last_tag"
|
|
56
|
+
else
|
|
57
|
+
# Use first commit if no tags exist
|
|
58
|
+
merge_base=$(git rev-list --max-parents=0 HEAD | head -1)
|
|
59
|
+
echo "No tags found — using initial commit as base"
|
|
60
|
+
fi
|
|
61
|
+
fi
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
### Step 2: Generate Diff Summary
|
|
67
|
+
|
|
68
|
+
Collect statistics and full diff content.
|
|
69
|
+
|
|
70
|
+
**Decision Table**:
|
|
71
|
+
|
|
72
|
+
| Condition | Action |
|
|
73
|
+
|-----------|--------|
|
|
74
|
+
| Diff command succeeds | Record files_changed, lines_added, lines_removed |
|
|
75
|
+
| No changes found | WARN — nothing to review; ask user whether to proceed |
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# File-level summary
|
|
79
|
+
git diff --stat "$merge_base"...HEAD
|
|
80
|
+
|
|
81
|
+
# Full diff for review
|
|
82
|
+
git diff "$merge_base"...HEAD > /tmp/ship-review-diff.txt
|
|
83
|
+
|
|
84
|
+
# Count changes for risk assessment
|
|
85
|
+
files_changed=$(git diff --name-only "$merge_base"...HEAD | wc -l)
|
|
86
|
+
lines_added=$(git diff --numstat "$merge_base"...HEAD | awk '{s+=$1} END {print s}')
|
|
87
|
+
lines_removed=$(git diff --numstat "$merge_base"...HEAD | awk '{s+=$2} END {print s}')
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
### Step 3: Risk Assessment
|
|
93
|
+
|
|
94
|
+
Flag high-risk indicators before AI review.
|
|
95
|
+
|
|
96
|
+
**Risk Factor Table**:
|
|
97
|
+
|
|
98
|
+
| Risk Factor | Threshold | Risk Level |
|
|
99
|
+
|-------------|-----------|------------|
|
|
100
|
+
| Files changed | > 50 | High |
|
|
101
|
+
| Lines changed | > 1000 | High |
|
|
102
|
+
| Sensitive files modified | Any of: `.env*`, `*secret*`, `*credential*`, `*auth*`, `*.key`, `*.pem` | High |
|
|
103
|
+
| Config files modified | `package.json`, `pyproject.toml`, `tsconfig.json`, `Dockerfile` | Medium |
|
|
104
|
+
| Migration files | `*migration*`, `*migrate*` | Medium |
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# Check for sensitive file changes
|
|
108
|
+
sensitive_files=$(git diff --name-only "$merge_base"...HEAD | grep -iE '\.(env|key|pem)|secret|credential' || true)
|
|
109
|
+
if [ -n "$sensitive_files" ]; then
|
|
110
|
+
echo "HIGH RISK: Sensitive files modified:"
|
|
111
|
+
echo "$sensitive_files"
|
|
112
|
+
fi
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Decision Table**:
|
|
116
|
+
|
|
117
|
+
| Condition | Action |
|
|
118
|
+
|-----------|--------|
|
|
119
|
+
| Sensitive files detected | Set risk_level = high, add to risk_factors |
|
|
120
|
+
| files_changed > 50 | Set risk_level = high, add to risk_factors |
|
|
121
|
+
| lines changed > 1000 | Set risk_level = high, add to risk_factors |
|
|
122
|
+
| Config or migration files detected | Set risk_level = medium (if not already high) |
|
|
123
|
+
| No risk factors | Set risk_level = low |
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### Step 4: AI Code Review via Inline Subagent
|
|
128
|
+
|
|
129
|
+
Spawn inline-code-review subagent for AI analysis. Replace the ccw cli call from the original with this inline subagent:
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
spawn_agent({
|
|
133
|
+
task_name: "inline-code-review",
|
|
134
|
+
fork_context: false,
|
|
135
|
+
model: "haiku",
|
|
136
|
+
reasoning_effort: "medium",
|
|
137
|
+
message: `### MANDATORY FIRST STEPS
|
|
138
|
+
1. Read: ~/.codex/agents/cli-explore-agent.md
|
|
139
|
+
|
|
140
|
+
Goal: Review code changes for release readiness
|
|
141
|
+
Context: Diff from <merge_base> to HEAD (<files_changed> files, +<lines_added>/-<lines_removed> lines)
|
|
142
|
+
|
|
143
|
+
Task:
|
|
144
|
+
- Review diff for bugs and correctness issues
|
|
145
|
+
- Check for breaking changes (API, config, schema)
|
|
146
|
+
- Identify security concerns
|
|
147
|
+
- Assess test coverage gaps
|
|
148
|
+
- Flag formatting-only changes to exclude from critical issues
|
|
149
|
+
|
|
150
|
+
Expected: Risk level (low/medium/high), list of issues with severity and file:line reference, release recommendation (ship|hold|fix-first)
|
|
151
|
+
Constraints: Focus on correctness and security | Flag breaking API changes | Ignore formatting-only changes`
|
|
152
|
+
})
|
|
153
|
+
const result = wait_agent({ targets: ["inline-code-review"], timeout_ms: 300000 })
|
|
154
|
+
close_agent({ target: "inline-code-review" })
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Note**: Wait for the subagent to complete before proceeding. Do not advance to Step 5 while review is running.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### Step 5: Evaluate Review Results
|
|
162
|
+
|
|
163
|
+
Based on the inline subagent output, apply gate logic.
|
|
164
|
+
|
|
165
|
+
**Review Result Decision Table**:
|
|
166
|
+
|
|
167
|
+
| Review Result | Action |
|
|
168
|
+
|---------------|--------|
|
|
169
|
+
| recommendation: "ship", no critical issues | Gate = pass — proceed to Phase 3 |
|
|
170
|
+
| recommendation: "hold" or critical issues present | Gate = fail — report BLOCKED, list issues |
|
|
171
|
+
| recommendation: "fix-first" | Gate = fail — report BLOCKED, list issues with file:line |
|
|
172
|
+
| Warnings only, recommendation: "ship" | Gate = warn — proceed with DONE_WITH_CONCERNS note |
|
|
173
|
+
| Review subagent failed or timed out | Ask user whether to proceed or retry |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Output
|
|
178
|
+
|
|
179
|
+
| Artifact | Format | Description |
|
|
180
|
+
|----------|--------|-------------|
|
|
181
|
+
| Review summary | JSON | Risk level, risk factors, AI review recommendation, critical issues, warnings |
|
|
182
|
+
|
|
183
|
+
```json
|
|
184
|
+
{
|
|
185
|
+
"phase": "code-review",
|
|
186
|
+
"merge_base": "commit-sha",
|
|
187
|
+
"stats": {
|
|
188
|
+
"files_changed": 0,
|
|
189
|
+
"lines_added": 0,
|
|
190
|
+
"lines_removed": 0
|
|
191
|
+
},
|
|
192
|
+
"risk_level": "low|medium|high",
|
|
193
|
+
"risk_factors": [],
|
|
194
|
+
"ai_review": {
|
|
195
|
+
"recommendation": "ship|hold|fix-first",
|
|
196
|
+
"critical_issues": [],
|
|
197
|
+
"warnings": []
|
|
198
|
+
},
|
|
199
|
+
"overall": "pass|fail|warn"
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## Success Criteria
|
|
204
|
+
|
|
205
|
+
| Criterion | Validation Method |
|
|
206
|
+
|-----------|-------------------|
|
|
207
|
+
| Merge base detected | merge_base SHA present in output |
|
|
208
|
+
| Diff statistics collected | files_changed, lines_added, lines_removed populated |
|
|
209
|
+
| Risk assessment completed | risk_level set (low/medium/high), risk_factors populated |
|
|
210
|
+
| AI review completed | ai_review.recommendation present |
|
|
211
|
+
| Gate condition evaluated | overall set to pass/fail/warn |
|
|
212
|
+
|
|
213
|
+
## Error Handling
|
|
214
|
+
|
|
215
|
+
| Scenario | Resolution |
|
|
216
|
+
|----------|------------|
|
|
217
|
+
| origin/main and origin/master both missing | Use HEAD~1 as merge base, warn user |
|
|
218
|
+
| No commits in diff | WARN — nothing to review; ask user whether to proceed |
|
|
219
|
+
| Inline subagent timeout | Log warning, ask user whether to proceed without AI review |
|
|
220
|
+
| Inline subagent error | Log error, ask user whether to proceed |
|
|
221
|
+
| Critical issues found | BLOCKED — report full issues list with severity and file:line |
|
|
222
|
+
|
|
223
|
+
## Next Phase
|
|
224
|
+
|
|
225
|
+
-> [Phase 3: Version Bump](03-version-bump.md)
|
|
226
|
+
|
|
227
|
+
If review passes (overall: "pass" or "warn"), proceed to Phase 3.
|
|
228
|
+
If critical issues found (overall: "fail"), report BLOCKED status with review summary. Do not proceed.
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# Phase 3: Version Bump
|
|
2
|
+
|
|
3
|
+
> **COMPACT PROTECTION**: This is a core execution phase. If context compression has occurred and this file is only a summary, **MUST `Read` this file again before executing any Step**. Do not execute from memory.
|
|
4
|
+
|
|
5
|
+
Detect the current version, determine the bump type, and update the version file.
|
|
6
|
+
|
|
7
|
+
## Objective
|
|
8
|
+
|
|
9
|
+
- Detect which version file the project uses
|
|
10
|
+
- Read the current version
|
|
11
|
+
- Determine bump type (patch/minor/major) from commit messages or user input
|
|
12
|
+
- Update the version file
|
|
13
|
+
- Record the version change
|
|
14
|
+
|
|
15
|
+
## Input
|
|
16
|
+
|
|
17
|
+
| Source | Required | Description |
|
|
18
|
+
|--------|----------|-------------|
|
|
19
|
+
| Phase 2 gate result | Yes | overall: "pass" or "warn" — must have passed |
|
|
20
|
+
| package.json / pyproject.toml / VERSION | Conditional | One must exist; used for version detection |
|
|
21
|
+
| Git history | Yes | Commit messages for bump type auto-detection |
|
|
22
|
+
|
|
23
|
+
## Execution Steps
|
|
24
|
+
|
|
25
|
+
### Step 1: Detect Version File
|
|
26
|
+
|
|
27
|
+
Search for version file in priority order.
|
|
28
|
+
|
|
29
|
+
**Version File Detection Priority Table**:
|
|
30
|
+
|
|
31
|
+
| Priority | File | Read Method |
|
|
32
|
+
|----------|------|-------------|
|
|
33
|
+
| 1 | `package.json` | `jq -r .version package.json` |
|
|
34
|
+
| 2 | `pyproject.toml` | `grep -oP 'version\s*=\s*"\K[^"]+' pyproject.toml` |
|
|
35
|
+
| 3 | `VERSION` | `cat VERSION` |
|
|
36
|
+
|
|
37
|
+
**Decision Table**:
|
|
38
|
+
|
|
39
|
+
| Condition | Action |
|
|
40
|
+
|-----------|--------|
|
|
41
|
+
| package.json found | Set version_file = package.json, read version with node/jq |
|
|
42
|
+
| pyproject.toml found (no package.json) | Set version_file = pyproject.toml, read with grep -oP |
|
|
43
|
+
| VERSION found (no others) | Set version_file = VERSION, read with cat |
|
|
44
|
+
| No version file found | NEEDS_CONTEXT — ask user which file to use or create |
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
if [ -f "package.json" ]; then
|
|
48
|
+
version_file="package.json"
|
|
49
|
+
current_version=$(node -p "require('./package.json').version" 2>/dev/null || jq -r .version package.json)
|
|
50
|
+
elif [ -f "pyproject.toml" ]; then
|
|
51
|
+
version_file="pyproject.toml"
|
|
52
|
+
current_version=$(grep -oP 'version\s*=\s*"\K[^"]+' pyproject.toml | head -1)
|
|
53
|
+
elif [ -f "VERSION" ]; then
|
|
54
|
+
version_file="VERSION"
|
|
55
|
+
current_version=$(cat VERSION | tr -d '[:space:]')
|
|
56
|
+
else
|
|
57
|
+
echo "NEEDS_CONTEXT: No version file found"
|
|
58
|
+
echo "Expected one of: package.json, pyproject.toml, VERSION"
|
|
59
|
+
# Ask user which file to use or create
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
echo "Version file: $version_file"
|
|
63
|
+
echo "Current version: $current_version"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### Step 2: Determine Bump Type
|
|
69
|
+
|
|
70
|
+
Auto-detect from commit messages, then confirm with user for major bumps.
|
|
71
|
+
|
|
72
|
+
**Bump Type Auto-Detection from Conventional Commits**:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Get commits since last tag
|
|
76
|
+
last_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
|
77
|
+
if [ -n "$last_tag" ]; then
|
|
78
|
+
commits=$(git log "$last_tag"..HEAD --oneline)
|
|
79
|
+
else
|
|
80
|
+
commits=$(git log --oneline -20)
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# Scan for conventional commit prefixes
|
|
84
|
+
has_breaking=$(echo "$commits" | grep -iE '(BREAKING CHANGE|!:)' || true)
|
|
85
|
+
has_feat=$(echo "$commits" | grep -iE '^[a-f0-9]+ feat' || true)
|
|
86
|
+
has_fix=$(echo "$commits" | grep -iE '^[a-f0-9]+ fix' || true)
|
|
87
|
+
|
|
88
|
+
if [ -n "$has_breaking" ]; then
|
|
89
|
+
suggested_bump="major"
|
|
90
|
+
elif [ -n "$has_feat" ]; then
|
|
91
|
+
suggested_bump="minor"
|
|
92
|
+
else
|
|
93
|
+
suggested_bump="patch"
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
echo "Suggested bump: $suggested_bump"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**User Confirmation Decision Table**:
|
|
100
|
+
|
|
101
|
+
| Bump Type | Action |
|
|
102
|
+
|-----------|--------|
|
|
103
|
+
| patch | Proceed with suggested bump, inform user |
|
|
104
|
+
| minor | Proceed with suggested bump, inform user |
|
|
105
|
+
| major | Always ask user to confirm before proceeding |
|
|
106
|
+
| User overrides suggestion | Use user-specified bump type |
|
|
107
|
+
| User declines major bump | BLOCKED — halt, user must re-trigger with explicit bump type |
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### Step 3: Calculate New Version
|
|
112
|
+
|
|
113
|
+
Apply semver arithmetic to derive new version.
|
|
114
|
+
|
|
115
|
+
**Decision Table**:
|
|
116
|
+
|
|
117
|
+
| Bump Type | Calculation |
|
|
118
|
+
|-----------|-------------|
|
|
119
|
+
| major | `(major+1).0.0` |
|
|
120
|
+
| minor | `major.(minor+1).0` |
|
|
121
|
+
| patch | `major.minor.(patch+1)` |
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Parse semver components
|
|
125
|
+
IFS='.' read -r major minor patch <<< "$current_version"
|
|
126
|
+
|
|
127
|
+
case "$bump_type" in
|
|
128
|
+
major)
|
|
129
|
+
new_version="$((major + 1)).0.0"
|
|
130
|
+
;;
|
|
131
|
+
minor)
|
|
132
|
+
new_version="${major}.$((minor + 1)).0"
|
|
133
|
+
;;
|
|
134
|
+
patch)
|
|
135
|
+
new_version="${major}.${minor}.$((patch + 1))"
|
|
136
|
+
;;
|
|
137
|
+
esac
|
|
138
|
+
|
|
139
|
+
echo "Version bump: $current_version -> $new_version"
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### Step 4: Update Version File
|
|
145
|
+
|
|
146
|
+
Write new version to the appropriate file using the correct method for each format.
|
|
147
|
+
|
|
148
|
+
**Decision Table**:
|
|
149
|
+
|
|
150
|
+
| Version File | Update Method |
|
|
151
|
+
|--------------|---------------|
|
|
152
|
+
| package.json | `jq --arg v "<new_version>" '.version = $v'` + update package-lock.json if present |
|
|
153
|
+
| pyproject.toml | `sed -i "s/^version\s*=\s*\".*\"/version = \"<new_version>\"/"` |
|
|
154
|
+
| VERSION | `echo "<new_version>" > VERSION` |
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
case "$version_file" in
|
|
158
|
+
package.json)
|
|
159
|
+
# Use node/jq for safe JSON update
|
|
160
|
+
jq --arg v "$new_version" '.version = $v' package.json > tmp.json && mv tmp.json package.json
|
|
161
|
+
# Also update package-lock.json if it exists
|
|
162
|
+
if [ -f "package-lock.json" ]; then
|
|
163
|
+
jq --arg v "$new_version" '.version = $v | .packages[""].version = $v' package-lock.json > tmp.json && mv tmp.json package-lock.json
|
|
164
|
+
fi
|
|
165
|
+
;;
|
|
166
|
+
pyproject.toml)
|
|
167
|
+
# Use sed for TOML update (version line in [project] or [tool.poetry])
|
|
168
|
+
sed -i "s/^version\s*=\s*\".*\"/version = \"$new_version\"/" pyproject.toml
|
|
169
|
+
;;
|
|
170
|
+
VERSION)
|
|
171
|
+
echo "$new_version" > VERSION
|
|
172
|
+
;;
|
|
173
|
+
esac
|
|
174
|
+
|
|
175
|
+
echo "Updated $version_file: $current_version -> $new_version"
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
### Step 5: Verify Update
|
|
181
|
+
|
|
182
|
+
Re-read version file to confirm the update was applied correctly.
|
|
183
|
+
|
|
184
|
+
**Decision Table**:
|
|
185
|
+
|
|
186
|
+
| Condition | Action |
|
|
187
|
+
|-----------|--------|
|
|
188
|
+
| Re-read version equals new_version | PASS — gate satisfied |
|
|
189
|
+
| Re-read version does not match | FAIL — report mismatch, BLOCKED |
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# Re-read to confirm
|
|
193
|
+
case "$version_file" in
|
|
194
|
+
package.json)
|
|
195
|
+
verified=$(node -p "require('./package.json').version" 2>/dev/null || jq -r .version package.json)
|
|
196
|
+
;;
|
|
197
|
+
pyproject.toml)
|
|
198
|
+
verified=$(grep -oP 'version\s*=\s*"\K[^"]+' pyproject.toml | head -1)
|
|
199
|
+
;;
|
|
200
|
+
VERSION)
|
|
201
|
+
verified=$(cat VERSION | tr -d '[:space:]')
|
|
202
|
+
;;
|
|
203
|
+
esac
|
|
204
|
+
|
|
205
|
+
if [ "$verified" = "$new_version" ]; then
|
|
206
|
+
echo "PASS: Version verified as $new_version"
|
|
207
|
+
else
|
|
208
|
+
echo "FAIL: Version mismatch — expected $new_version, got $verified"
|
|
209
|
+
fi
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Output
|
|
215
|
+
|
|
216
|
+
| Artifact | Format | Description |
|
|
217
|
+
|----------|--------|-------------|
|
|
218
|
+
| Version change record | JSON | version_file, previous_version, new_version, bump_type, bump_source |
|
|
219
|
+
|
|
220
|
+
```json
|
|
221
|
+
{
|
|
222
|
+
"phase": "version-bump",
|
|
223
|
+
"version_file": "package.json",
|
|
224
|
+
"previous_version": "1.2.3",
|
|
225
|
+
"new_version": "1.3.0",
|
|
226
|
+
"bump_type": "minor",
|
|
227
|
+
"bump_source": "auto-detected|user-specified",
|
|
228
|
+
"overall": "pass|fail"
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Success Criteria
|
|
233
|
+
|
|
234
|
+
| Criterion | Validation Method |
|
|
235
|
+
|-----------|-------------------|
|
|
236
|
+
| Version file detected | version_file field populated |
|
|
237
|
+
| Current version read | current_version field populated |
|
|
238
|
+
| Bump type determined | bump_type set to patch/minor/major |
|
|
239
|
+
| Version file updated | Write/edit operation succeeded |
|
|
240
|
+
| Update verified | Re-read matches new_version |
|
|
241
|
+
| overall = "pass" | All steps completed without error |
|
|
242
|
+
|
|
243
|
+
## Error Handling
|
|
244
|
+
|
|
245
|
+
| Scenario | Resolution |
|
|
246
|
+
|----------|------------|
|
|
247
|
+
| No version file found | NEEDS_CONTEXT — ask user which file to create or use |
|
|
248
|
+
| Version parse error (malformed semver) | NEEDS_CONTEXT — report current value, ask user for correction |
|
|
249
|
+
| jq not available | Fall back to node for package.json; report error for others |
|
|
250
|
+
| sed fails on pyproject.toml | Try Write tool to rewrite the file; report on failure |
|
|
251
|
+
| User declines major bump | BLOCKED — halt, user must re-trigger with explicit bump type |
|
|
252
|
+
| Version mismatch after update | BLOCKED — report expected vs actual, suggest manual fix |
|
|
253
|
+
|
|
254
|
+
## Next Phase
|
|
255
|
+
|
|
256
|
+
-> [Phase 4: Changelog & Commit](04-changelog-commit.md)
|
|
257
|
+
|
|
258
|
+
If version updated successfully (overall: "pass"), proceed to Phase 4.
|
|
259
|
+
If update fails or context needed, report BLOCKED / NEEDS_CONTEXT. Do not proceed.
|