claude-code-workflow 7.2.27 → 7.2.29
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/brainstorm/SKILL.md +3 -3
- package/.codex/skills/clean/SKILL.md +3 -3
- 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/issue-discover/SKILL.md +13 -13
- package/.codex/skills/issue-discover/phases/02-discover.md +4 -4
- package/.codex/skills/issue-discover/phases/03-discover-by-prompt.md +3 -3
- package/.codex/skills/parallel-dev-cycle/SKILL.md +4 -4
- package/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md +6 -6
- package/.codex/skills/parallel-dev-cycle/phases/03-result-aggregation.md +10 -10
- package/.codex/skills/review-cycle/SKILL.md +10 -10
- package/.codex/skills/review-cycle/phases/02-parallel-review.md +6 -6
- package/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md +4 -4
- package/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md +4 -4
- package/.codex/skills/review-cycle/phases/08-fix-execution.md +2 -2
- package/.codex/skills/roadmap-with-file/SKILL.md +14 -14
- 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/spec-generator/README.md +1 -1
- package/.codex/skills/spec-generator/SKILL.md +184 -88
- package/.codex/skills/spec-generator/phases/01-5-requirement-clarification.md +4 -7
- package/.codex/skills/spec-generator/phases/01-discovery.md +30 -11
- package/.codex/skills/spec-generator/phases/02-product-brief.md +2 -5
- package/.codex/skills/spec-generator/phases/03-requirements.md +4 -6
- package/.codex/skills/spec-generator/phases/04-architecture.md +4 -6
- package/.codex/skills/spec-generator/phases/05-epics-stories.md +4 -6
- package/.codex/skills/spec-generator/phases/06-5-auto-fix.md +4 -5
- package/.codex/skills/spec-generator/phases/06-readiness-check.md +8 -8
- package/.codex/skills/spec-generator/phases/07-issue-export.md +2 -2
- package/.codex/skills/spec-setup/SKILL.md +4 -4
- 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/.codex/skills/workflow-plan/SKILL.md +6 -6
- package/.codex/skills/workflow-tdd-plan/SKILL.md +5 -5
- package/.codex/skills/workflow-test-fix-cycle/SKILL.md +19 -19
- package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +5 -5
- package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +5 -5
- 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-exlTDW81.js} +3 -3
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-exlTDW81.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-cgV9LfAI.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-cgV9LfAI.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-Dk5jJdWt.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-Dk5jJdWt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-Be9xsPiv.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-Be9xsPiv.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-Bh9jBtPI.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-Bh9jBtPI.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BrE-oyEq.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BrE-oyEq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cd3nrC93.js} +2 -2
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cd3nrC93.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DXFl3VKF.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DXFl3VKF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-IV8zpjgX.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-IV8zpjgX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-CpDxtmRX.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-CpDxtmRX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-BchjWe7s.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-BchjWe7s.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-CbWvaJ0y.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-CbWvaJ0y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-YMjVRiCk.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-YMjVRiCk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-JW2ehYY_.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-JW2ehYY_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BtqzqDVq.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BtqzqDVq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-BsJL_W4d.js} +3 -3
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-BsJL_W4d.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-BuWpQ7k5.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-BuWpQ7k5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-D0BtMIWy.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-D0BtMIWy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-C7dwsAKG.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-C7dwsAKG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-D0nCNaeB.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-D0nCNaeB.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-B5c2Kb9r.js} +3 -3
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-B5c2Kb9r.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-C-S5CehM.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-C-S5CehM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-P_B0JVUQ.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-P_B0JVUQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-S4Jn9LUE.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-S4Jn9LUE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-C2Zlr7AC.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-C2Zlr7AC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-CMVfz8s5.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-CMVfz8s5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-YEMjFARX.js} +3 -3
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-YEMjFARX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-DnTm55nG.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-DnTm55nG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CUwebtO2.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CUwebtO2.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-0qyH1Z5P.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-0qyH1Z5P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-BpgP4087.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-BpgP4087.js.map} +1 -1
- package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js +150 -0
- package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js.map +1 -0
- package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js +7 -0
- package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js.map +1 -0
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DT-yTVkD.js} +4 -4
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DT-yTVkD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-CYSPdqWk.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-CYSPdqWk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-CPh6Zor1.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-CPh6Zor1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-Ds-8830B.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-Ds-8830B.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-CJODUxBk.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-CJODUxBk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-Cn3fGUuO.js} +3 -3
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-Cn3fGUuO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-CjwVpw6k.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-CjwVpw6k.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-2vZa9Ic3.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-2vZa9Ic3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-CUU5XDgT.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-CUU5XDgT.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-Cc3nKRZ5.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-Cc3nKRZ5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-BwpSRDUa.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-BwpSRDUa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-DBzUW1XC.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-DBzUW1XC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CGNNsjvE.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CGNNsjvE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-D27G86Ul.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-D27G86Ul.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-C1Ij47Yz.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-C1Ij47Yz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-C6MOB7Au.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-C6MOB7Au.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-BxfBlZ26.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-BxfBlZ26.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-NI237wA-.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-NI237wA-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-Byn2_2v6.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-Byn2_2v6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-D-7PhZjx.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-D-7PhZjx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-BoAsK_FL.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-BoAsK_FL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-DCSxJIS4.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-DCSxJIS4.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-CHS3prza.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-CHS3prza.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-D7K35U7S.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-D7K35U7S.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-eq9xE07G.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-eq9xE07G.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-C1DMpBua.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-C1DMpBua.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-Di5SBCY-.js} +2 -2
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-Di5SBCY-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index--_R7COnA.js} +2 -2
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index--_R7COnA.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-BUol9HDD.js} +3 -3
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-BUol9HDD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-CT9oykfw.js} +2 -2
- package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-CT9oykfw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-Ddwvf87H.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-Ddwvf87H.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-LiX0qZbN.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-LiX0qZbN.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-CL3DVEwb.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-CL3DVEwb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CC5cFeq6.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CC5cFeq6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-ngFQ9bs0.js} +2 -2
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-ngFQ9bs0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-BEU6I0KK.js} +2 -2
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-BEU6I0KK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BWZdLA6y.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BWZdLA6y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-K6_Chm7n.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-K6_Chm7n.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CWkphauf.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CWkphauf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-DrNgkamn.js} +2 -2
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-DrNgkamn.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CMo3sw5_.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CMo3sw5_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-DppNTW5e.js} +2 -2
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-DppNTW5e.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-CD8aPMbZ.js} +2 -2
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-CD8aPMbZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-B4z90fQD.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-B4z90fQD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2-CAKRU_QC.js} +2 -2
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2-CAKRU_QC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-KhI3HrzX.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-KhI3HrzX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-BtdGIpuq.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-BtdGIpuq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-ZoBUkXoD.js} +2 -2
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-ZoBUkXoD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CltxQP-P.js} +2 -2
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CltxQP-P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-C32OUSGf.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-C32OUSGf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-0IxoyAVZ.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-0IxoyAVZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-4eKCkyBn.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-4eKCkyBn.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-zLTUWqhi.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-zLTUWqhi.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-BtN2vpOX.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-BtN2vpOX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-_spj49qL.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-_spj49qL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-Bm9KFZvd.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-Bm9KFZvd.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-DOmpm6v9.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-DOmpm6v9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-D2rj4rea.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-D2rj4rea.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-OskEpomF.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-OskEpomF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-BjMgsNSF.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-BjMgsNSF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-CLhyYWa7.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-CLhyYWa7.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 +0 -150
- package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
- package/ccw/frontend/dist/assets/SkillsManagerPage-D3LzbpJY.js +0 -7
- package/ccw/frontend/dist/assets/SkillsManagerPage-D3LzbpJY.js.map +0 -1
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ship
|
|
3
|
+
description: Structured release pipeline with pre-flight checks, AI code review, version bump, changelog, and PR creation. Triggers on "ship", "release", "publish".
|
|
4
|
+
agents: ship-operator
|
|
5
|
+
phases: 5
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Ship
|
|
9
|
+
|
|
10
|
+
Structured release pipeline that guides code from working branch to pull request through 5 gated phases: pre-flight checks, automated code review, version bump, changelog generation, and PR creation.
|
|
11
|
+
|
|
12
|
+
## Architecture
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
+--------------------------------------------------------------+
|
|
16
|
+
| ship Orchestrator |
|
|
17
|
+
| -> Single ship-operator agent driven through 5 gated phases |
|
|
18
|
+
+------------------------------+-------------------------------+
|
|
19
|
+
|
|
|
20
|
+
+-------------------+-------------------+
|
|
21
|
+
v v v
|
|
22
|
+
+------------+ +------------+ +------------+
|
|
23
|
+
| Phase 1 | --> | Phase 2 | --> | Phase 3 |
|
|
24
|
+
| Pre-Flight | | Code Review| | Version |
|
|
25
|
+
| Checks | | | | Bump |
|
|
26
|
+
+------------+ +------------+ +------------+
|
|
27
|
+
v v v
|
|
28
|
+
Gate: ALL Gate: No Gate: Version
|
|
29
|
+
4 checks critical updated OK
|
|
30
|
+
pass issues
|
|
31
|
+
|
|
|
32
|
+
+-------------------+-------------------+
|
|
33
|
+
v v
|
|
34
|
+
+------------+ +------------+
|
|
35
|
+
| Phase 4 | ----------------------> | Phase 5 |
|
|
36
|
+
| Changelog | | PR Creation|
|
|
37
|
+
| & Commit | | |
|
|
38
|
+
+------------+ +------------+
|
|
39
|
+
v v
|
|
40
|
+
Gate: Push Gate: PR
|
|
41
|
+
succeeded created
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Agent Registry
|
|
47
|
+
|
|
48
|
+
| Agent | task_name | Role File | Responsibility | Pattern | fork_context |
|
|
49
|
+
|-------|-----------|-----------|----------------|---------|--------------|
|
|
50
|
+
| ship-operator | ship-operator | ~/.codex/agents/ship-operator.md | Execute all 5 release phases sequentially, enforce gates | Deep Interaction (2.3) | false |
|
|
51
|
+
|
|
52
|
+
> **COMPACT PROTECTION**: Agent files are execution documents. When context compression occurs and agent instructions are reduced to summaries, **you MUST immediately `Read` the corresponding agent.md to reload before continuing execution**.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Fork Context Strategy
|
|
57
|
+
|
|
58
|
+
| Agent | task_name | fork_context | fork_from | Rationale |
|
|
59
|
+
|-------|-----------|--------------|-----------|-----------|
|
|
60
|
+
| ship-operator | ship-operator | false | — | Starts fresh; all context provided in initial task message |
|
|
61
|
+
|
|
62
|
+
**Fork Decision Rules**:
|
|
63
|
+
|
|
64
|
+
| Condition | fork_context | Reason |
|
|
65
|
+
|-----------|--------------|--------|
|
|
66
|
+
| Pipeline stage with explicit input | false | Context in message, not history |
|
|
67
|
+
| Agent is isolated utility | false | Clean context, focused task |
|
|
68
|
+
| ship-operator | false | Self-contained release operator; no parent context needed |
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Subagent Registry
|
|
73
|
+
|
|
74
|
+
Utility subagents callable by ship-operator (not separate pipeline stages):
|
|
75
|
+
|
|
76
|
+
| Subagent | Agent File | Callable By | Purpose | Model |
|
|
77
|
+
|----------|-----------|-------------|---------|-------|
|
|
78
|
+
| inline-code-review | ~/.codex/agents/cli-explore-agent.md | ship-operator | AI code review of diff during Phase 2 | haiku |
|
|
79
|
+
|
|
80
|
+
> Subagents are spawned by agents within their own execution context (Pattern 2.8), not by the orchestrator.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Phase Execution
|
|
85
|
+
|
|
86
|
+
### Phase 1: Pre-Flight Checks
|
|
87
|
+
|
|
88
|
+
**Objective**: Validate that the repository is in a shippable state — confirm clean working tree, appropriate branch, passing tests, and successful build.
|
|
89
|
+
|
|
90
|
+
**Input**:
|
|
91
|
+
|
|
92
|
+
| Source | Description |
|
|
93
|
+
|--------|-------------|
|
|
94
|
+
| User trigger | "ship" / "release" / "publish" command |
|
|
95
|
+
| Repository | Current git working directory |
|
|
96
|
+
| Phase detail | ~/.codex/skills/ship/phases/01-preflight-checks.md |
|
|
97
|
+
|
|
98
|
+
**Execution**:
|
|
99
|
+
|
|
100
|
+
Spawn ship-operator with Phase 1 task. The operator reads the phase detail file then executes all four checks.
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
spawn_agent({
|
|
104
|
+
task_name: "ship-operator",
|
|
105
|
+
fork_context: false,
|
|
106
|
+
message: `## TASK ASSIGNMENT
|
|
107
|
+
|
|
108
|
+
### MANDATORY FIRST STEPS
|
|
109
|
+
1. Read role definition: ~/.codex/agents/ship-operator.md (MUST read first)
|
|
110
|
+
2. Read phase detail: ~/.codex/skills/ship/phases/01-preflight-checks.md
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
Goal: Execute Phase 1 Pre-Flight Checks for the release pipeline.
|
|
115
|
+
|
|
116
|
+
Execute all four checks (git clean, branch validation, test suite, build verification).
|
|
117
|
+
Output structured preflight-report JSON plus gate status.`
|
|
118
|
+
})
|
|
119
|
+
const phase1Result = wait_agent({ targets: ["ship-operator"], timeout_ms: 300000 })
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Gate Decision**:
|
|
123
|
+
|
|
124
|
+
| Condition | Action |
|
|
125
|
+
|-----------|--------|
|
|
126
|
+
| All four checks pass (overall: "pass") | Fast-advance: assign Phase 2 task to ship-operator |
|
|
127
|
+
| Any check fails (overall: "fail") | BLOCKED — report failure details, halt pipeline |
|
|
128
|
+
| Branch is main/master (warn) | Ask user to confirm direct-to-main release before proceeding |
|
|
129
|
+
| Timeout | assign_task "Finalize current work and output results", re-wait 120s |
|
|
130
|
+
|
|
131
|
+
**Output**:
|
|
132
|
+
|
|
133
|
+
| Artifact | Description |
|
|
134
|
+
|----------|-------------|
|
|
135
|
+
| preflight-report JSON | Pass/fail per check, blockers list |
|
|
136
|
+
| Gate status | pass / fail / blocked |
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
### Phase 2: Code Review
|
|
141
|
+
|
|
142
|
+
**Objective**: Detect merge base, generate diff, run AI-powered code review via inline subagent, assess risk, evaluate results.
|
|
143
|
+
|
|
144
|
+
**Input**:
|
|
145
|
+
|
|
146
|
+
| Source | Description |
|
|
147
|
+
|--------|-------------|
|
|
148
|
+
| Phase 1 result | Gate passed (overall: "pass") |
|
|
149
|
+
| Repository | Git history, diff data |
|
|
150
|
+
| Phase detail | ~/.codex/skills/ship/phases/02-code-review.md |
|
|
151
|
+
|
|
152
|
+
**Execution**:
|
|
153
|
+
|
|
154
|
+
Phase 2 is assigned to the already-running ship-operator via assign_task.
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
assign_task({
|
|
158
|
+
target: "ship-operator",
|
|
159
|
+
items: [{ type: "text", text: `## PHASE 2 TASK
|
|
160
|
+
|
|
161
|
+
Read phase detail: ~/.codex/skills/ship/phases/02-code-review.md
|
|
162
|
+
|
|
163
|
+
Execute Phase 2 Code Review:
|
|
164
|
+
1. Detect merge base
|
|
165
|
+
2. Generate diff summary
|
|
166
|
+
3. Perform risk assessment
|
|
167
|
+
4. Spawn inline-code-review subagent for AI analysis
|
|
168
|
+
5. Evaluate review results and report gate status` }]
|
|
169
|
+
})
|
|
170
|
+
const phase2Result = wait_agent({ targets: ["ship-operator"], timeout_ms: 600000 })
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Gate Decision**:
|
|
174
|
+
|
|
175
|
+
| Condition | Action |
|
|
176
|
+
|-----------|--------|
|
|
177
|
+
| No critical issues (overall: "pass") | Fast-advance: assign Phase 3 task to ship-operator |
|
|
178
|
+
| Critical issues found (overall: "fail") | BLOCKED — report critical issues list, halt pipeline |
|
|
179
|
+
| Warnings only (overall: "warn") | Fast-advance to Phase 3, flag DONE_WITH_CONCERNS |
|
|
180
|
+
| Review subagent timeout/error | Ask user whether to proceed or retry; if proceed, flag warn |
|
|
181
|
+
| Timeout on phase2Result | assign_task "Finalize current work", re-wait 120s |
|
|
182
|
+
|
|
183
|
+
**Output**:
|
|
184
|
+
|
|
185
|
+
| Artifact | Description |
|
|
186
|
+
|----------|-------------|
|
|
187
|
+
| Review summary JSON | Risk level, risk factors, AI review recommendation, issues |
|
|
188
|
+
| Gate status | pass / fail / warn / blocked |
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### Phase 3: Version Bump
|
|
193
|
+
|
|
194
|
+
**Objective**: Detect version file, determine bump type from commits or user input, calculate new version, update version file, verify update.
|
|
195
|
+
|
|
196
|
+
**Input**:
|
|
197
|
+
|
|
198
|
+
| Source | Description |
|
|
199
|
+
|--------|-------------|
|
|
200
|
+
| Phase 2 result | Gate passed (no critical issues) |
|
|
201
|
+
| Repository | package.json / pyproject.toml / VERSION |
|
|
202
|
+
| Phase detail | ~/.codex/skills/ship/phases/03-version-bump.md |
|
|
203
|
+
|
|
204
|
+
**Execution**:
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
assign_task({
|
|
208
|
+
target: "ship-operator",
|
|
209
|
+
items: [{ type: "text", text: `## PHASE 3 TASK
|
|
210
|
+
|
|
211
|
+
Read phase detail: ~/.codex/skills/ship/phases/03-version-bump.md
|
|
212
|
+
|
|
213
|
+
Execute Phase 3 Version Bump:
|
|
214
|
+
1. Detect version file (package.json > pyproject.toml > VERSION)
|
|
215
|
+
2. Determine bump type from commit messages (patch/minor/major)
|
|
216
|
+
3. For major bumps: ask user to confirm before proceeding
|
|
217
|
+
4. Calculate new version
|
|
218
|
+
5. Update version file
|
|
219
|
+
6. Verify update
|
|
220
|
+
Output version change record JSON plus gate status.` }]
|
|
221
|
+
})
|
|
222
|
+
const phase3Result = wait_agent({ targets: ["ship-operator"], timeout_ms: 300000 })
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Gate Decision**:
|
|
226
|
+
|
|
227
|
+
| Condition | Action |
|
|
228
|
+
|-----------|--------|
|
|
229
|
+
| Version file updated and verified (overall: "pass") | Fast-advance: assign Phase 4 task to ship-operator |
|
|
230
|
+
| Version file not found | NEEDS_CONTEXT — ask user which file to use; halt until answered |
|
|
231
|
+
| Version mismatch after update (overall: "fail") | BLOCKED — report mismatch, halt pipeline |
|
|
232
|
+
| User declines major bump | BLOCKED — halt, user must re-trigger with explicit bump type |
|
|
233
|
+
| Timeout | assign_task "Finalize current work", re-wait 120s |
|
|
234
|
+
|
|
235
|
+
**Output**:
|
|
236
|
+
|
|
237
|
+
| Artifact | Description |
|
|
238
|
+
|----------|-------------|
|
|
239
|
+
| Version change record JSON | version_file, previous_version, new_version, bump_type, bump_source |
|
|
240
|
+
| Gate status | pass / fail / needs_context / blocked |
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
### Phase 4: Changelog & Commit
|
|
245
|
+
|
|
246
|
+
**Objective**: Parse git log into grouped changelog entry, update CHANGELOG.md, create release commit, push branch to remote.
|
|
247
|
+
|
|
248
|
+
**Input**:
|
|
249
|
+
|
|
250
|
+
| Source | Description |
|
|
251
|
+
|--------|-------------|
|
|
252
|
+
| Phase 3 result | new_version, version_file, bump_type |
|
|
253
|
+
| Repository | Git history since last tag |
|
|
254
|
+
| Phase detail | ~/.codex/skills/ship/phases/04-changelog-commit.md |
|
|
255
|
+
|
|
256
|
+
**Execution**:
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
assign_task({
|
|
260
|
+
target: "ship-operator",
|
|
261
|
+
items: [{ type: "text", text: `## PHASE 4 TASK
|
|
262
|
+
|
|
263
|
+
Read phase detail: ~/.codex/skills/ship/phases/04-changelog-commit.md
|
|
264
|
+
|
|
265
|
+
New version: <new_version>
|
|
266
|
+
Version file: <version_file>
|
|
267
|
+
|
|
268
|
+
Execute Phase 4 Changelog & Commit:
|
|
269
|
+
1. Gather commits since last tag
|
|
270
|
+
2. Group by conventional commit type
|
|
271
|
+
3. Format changelog entry
|
|
272
|
+
4. Update or create CHANGELOG.md
|
|
273
|
+
5. Create release commit (chore: bump version to <new_version>)
|
|
274
|
+
6. Push branch to remote
|
|
275
|
+
Output commit record JSON plus gate status.` }]
|
|
276
|
+
})
|
|
277
|
+
const phase4Result = wait_agent({ targets: ["ship-operator"], timeout_ms: 300000 })
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**Gate Decision**:
|
|
281
|
+
|
|
282
|
+
| Condition | Action |
|
|
283
|
+
|-----------|--------|
|
|
284
|
+
| Push succeeded (overall: "pass") | Fast-advance: assign Phase 5 task to ship-operator |
|
|
285
|
+
| Push rejected (non-fast-forward) | BLOCKED — report error, suggest `git pull --rebase` |
|
|
286
|
+
| Permission denied | BLOCKED — report error, advise check remote access |
|
|
287
|
+
| No remote configured | BLOCKED — report error, suggest `git remote add` |
|
|
288
|
+
| Timeout | assign_task "Finalize current work", re-wait 120s |
|
|
289
|
+
|
|
290
|
+
**Output**:
|
|
291
|
+
|
|
292
|
+
| Artifact | Description |
|
|
293
|
+
|----------|-------------|
|
|
294
|
+
| Commit record JSON | changelog_entry, commit_sha, commit_message, pushed_to |
|
|
295
|
+
| Gate status | pass / fail / blocked |
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
### Phase 5: PR Creation
|
|
300
|
+
|
|
301
|
+
**Objective**: Extract issue references from commits, build PR title and body, create PR via `gh pr create`, capture PR URL.
|
|
302
|
+
|
|
303
|
+
**Input**:
|
|
304
|
+
|
|
305
|
+
| Source | Description |
|
|
306
|
+
|--------|-------------|
|
|
307
|
+
| Phase 4 result | commit_sha, new_version, previous_version, bump_type |
|
|
308
|
+
| Phase 2 result | merge_base (for change_summary) |
|
|
309
|
+
| Repository | Git history, remote |
|
|
310
|
+
| Phase detail | ~/.codex/skills/ship/phases/05-pr-creation.md |
|
|
311
|
+
|
|
312
|
+
**Execution**:
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
assign_task({
|
|
316
|
+
target: "ship-operator",
|
|
317
|
+
items: [{ type: "text", text: `## PHASE 5 TASK
|
|
318
|
+
|
|
319
|
+
Read phase detail: ~/.codex/skills/ship/phases/05-pr-creation.md
|
|
320
|
+
|
|
321
|
+
New version: <new_version>
|
|
322
|
+
Previous version: <previous_version>
|
|
323
|
+
Bump type: <bump_type>
|
|
324
|
+
Merge base: <merge_base>
|
|
325
|
+
Commit SHA: <commit_sha>
|
|
326
|
+
|
|
327
|
+
Execute Phase 5 PR Creation:
|
|
328
|
+
1. Extract issue references from commits
|
|
329
|
+
2. Determine target branch
|
|
330
|
+
3. Build PR title: "release: v<new_version>"
|
|
331
|
+
4. Build PR body with all sections
|
|
332
|
+
5. Create PR via gh pr create
|
|
333
|
+
6. Capture and report PR URL
|
|
334
|
+
Output PR creation record JSON plus final completion status.` }]
|
|
335
|
+
})
|
|
336
|
+
const phase5Result = wait_agent({ targets: ["ship-operator"], timeout_ms: 300000 })
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**Gate Decision**:
|
|
340
|
+
|
|
341
|
+
| Condition | Action |
|
|
342
|
+
|-----------|--------|
|
|
343
|
+
| PR created, URL returned (overall: "pass") | Pipeline complete — output DONE status |
|
|
344
|
+
| PR created with review warnings | Pipeline complete — output DONE_WITH_CONCERNS |
|
|
345
|
+
| gh CLI not available | BLOCKED — report error, advise `gh auth login` |
|
|
346
|
+
| PR creation fails | BLOCKED — report error details, halt |
|
|
347
|
+
| Timeout | assign_task "Finalize current work", re-wait 120s |
|
|
348
|
+
|
|
349
|
+
**Output**:
|
|
350
|
+
|
|
351
|
+
| Artifact | Description |
|
|
352
|
+
|----------|-------------|
|
|
353
|
+
| PR record JSON | pr_url, pr_title, target_branch, source_branch, linked_issues |
|
|
354
|
+
| Final completion status | DONE / DONE_WITH_CONCERNS / BLOCKED |
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Lifecycle Management
|
|
359
|
+
|
|
360
|
+
### Timeout Protocol
|
|
361
|
+
|
|
362
|
+
| Phase | Default Timeout | On Timeout |
|
|
363
|
+
|-------|-----------------|------------|
|
|
364
|
+
| Phase 1: Pre-Flight | 300000 ms (5 min) | assign_task "Finalize current work", re-wait 120s |
|
|
365
|
+
| Phase 2: Code Review | 600000 ms (10 min) | assign_task "Finalize current work", re-wait 120s |
|
|
366
|
+
| Phase 3: Version Bump | 300000 ms (5 min) | assign_task "Finalize current work", re-wait 120s |
|
|
367
|
+
| Phase 4: Changelog & Commit | 300000 ms (5 min) | assign_task "Finalize current work", re-wait 120s |
|
|
368
|
+
| Phase 5: PR Creation | 300000 ms (5 min) | assign_task "Finalize current work", re-wait 120s |
|
|
369
|
+
|
|
370
|
+
### Cleanup Protocol
|
|
371
|
+
|
|
372
|
+
After Phase 5 completes (or on any terminal BLOCKED halt), close ship-operator.
|
|
373
|
+
|
|
374
|
+
```
|
|
375
|
+
close_agent({ target: "ship-operator" })
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### Agent Health Check
|
|
379
|
+
|
|
380
|
+
```
|
|
381
|
+
const remaining = list_agents({})
|
|
382
|
+
if (remaining.length > 0) {
|
|
383
|
+
remaining.forEach(agent => close_agent({ target: agent.id }))
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## Error Handling
|
|
390
|
+
|
|
391
|
+
| Scenario | Resolution |
|
|
392
|
+
|----------|------------|
|
|
393
|
+
| Agent timeout (first) | assign_task with "Finalize current work and output results" + re-wait 120s |
|
|
394
|
+
| Agent timeout (second) | Log error, close_agent({ target: "ship-operator" }), report partial results |
|
|
395
|
+
| Gate fail — any phase | Log BLOCKED status with phase name and failure detail, close_agent, halt |
|
|
396
|
+
| NEEDS_CONTEXT | Pause pipeline, surface question to user, resume with assign_task on answer |
|
|
397
|
+
| send_message ignored | Escalate to assign_task |
|
|
398
|
+
| Inline subagent timeout | ship-operator handles internally; continue with warn if review failed |
|
|
399
|
+
| User cancellation | close_agent({ target: "ship-operator" }), report current pipeline state |
|
|
400
|
+
| Fork from closed agent | Not applicable (single agent, no forking) |
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## Output Format
|
|
405
|
+
|
|
406
|
+
```
|
|
407
|
+
## Summary
|
|
408
|
+
- One-sentence completion status (DONE / DONE_WITH_CONCERNS / BLOCKED)
|
|
409
|
+
|
|
410
|
+
## Results
|
|
411
|
+
- Phase 1 Pre-Flight: pass/fail
|
|
412
|
+
- Phase 2 Code Review: pass/warn/fail
|
|
413
|
+
- Phase 3 Version Bump: <previous> -> <new> (<bump_type>)
|
|
414
|
+
- Phase 4 Changelog & Commit: commit <sha> pushed to <remote/branch>
|
|
415
|
+
- Phase 5 PR Creation: <pr_url>
|
|
416
|
+
|
|
417
|
+
## Artifacts
|
|
418
|
+
- CHANGELOG.md (updated)
|
|
419
|
+
- <version_file> (version bumped to <new_version>)
|
|
420
|
+
- Release commit: <sha>
|
|
421
|
+
- PR: <pr_url>
|
|
422
|
+
|
|
423
|
+
## Next Steps (Optional)
|
|
424
|
+
1. Review and merge the PR
|
|
425
|
+
2. Tag the release after merge
|
|
426
|
+
```
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Phase 1: Pre-Flight Checks
|
|
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
|
+
Validate that the repository is in a shippable state before proceeding with the release pipeline.
|
|
6
|
+
|
|
7
|
+
## Objective
|
|
8
|
+
|
|
9
|
+
- Confirm working tree is clean (no uncommitted changes)
|
|
10
|
+
- Validate current branch is appropriate for release
|
|
11
|
+
- Run test suite and confirm all tests pass
|
|
12
|
+
- Verify build succeeds
|
|
13
|
+
|
|
14
|
+
## Input
|
|
15
|
+
|
|
16
|
+
| Source | Required | Description |
|
|
17
|
+
|--------|----------|-------------|
|
|
18
|
+
| Repository working directory | Yes | Git repo with working tree |
|
|
19
|
+
| package.json / pyproject.toml / Makefile | No | Used for test and build detection |
|
|
20
|
+
|
|
21
|
+
## Execution Steps
|
|
22
|
+
|
|
23
|
+
### Step 1: Git Clean Check
|
|
24
|
+
|
|
25
|
+
Run `git status --porcelain` and evaluate output.
|
|
26
|
+
|
|
27
|
+
**Decision Table**:
|
|
28
|
+
|
|
29
|
+
| Condition | Action |
|
|
30
|
+
|-----------|--------|
|
|
31
|
+
| Output is empty | PASS — working tree is clean |
|
|
32
|
+
| Output is non-empty | FAIL — working tree is dirty; report dirty files, suggest `git stash` or `git commit` |
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
git_status=$(git status --porcelain)
|
|
36
|
+
if [ -n "$git_status" ]; then
|
|
37
|
+
echo "FAIL: Working tree is dirty"
|
|
38
|
+
echo "$git_status"
|
|
39
|
+
# Gate: BLOCKED — commit or stash changes first
|
|
40
|
+
else
|
|
41
|
+
echo "PASS: Working tree is clean"
|
|
42
|
+
fi
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Pass condition**: `git status --porcelain` produces empty output.
|
|
46
|
+
**On failure**: Report dirty files and suggest `git stash` or `git commit`.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
### Step 2: Branch Validation
|
|
51
|
+
|
|
52
|
+
Run `git branch --show-current` and evaluate.
|
|
53
|
+
|
|
54
|
+
**Decision Table**:
|
|
55
|
+
|
|
56
|
+
| Condition | Action |
|
|
57
|
+
|-----------|--------|
|
|
58
|
+
| Branch is not main or master | PASS — proceed |
|
|
59
|
+
| Branch is main or master | WARN — ask user to confirm direct-to-main/master release before proceeding |
|
|
60
|
+
| User confirms direct release | PASS with warning noted |
|
|
61
|
+
| User declines | BLOCKED — halt pipeline |
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
current_branch=$(git branch --show-current)
|
|
65
|
+
if [ "$current_branch" = "main" ] || [ "$current_branch" = "master" ]; then
|
|
66
|
+
echo "WARN: Currently on $current_branch — direct push to main/master is risky"
|
|
67
|
+
# Ask user for confirmation before proceeding
|
|
68
|
+
else
|
|
69
|
+
echo "PASS: On branch $current_branch"
|
|
70
|
+
fi
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Pass condition**: Not on main/master, OR user explicitly confirms direct-to-main release.
|
|
74
|
+
**On warning**: Ask user to confirm they intend to release from main/master directly.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
### Step 3: Test Suite Execution
|
|
79
|
+
|
|
80
|
+
Detect project type and run appropriate test command.
|
|
81
|
+
|
|
82
|
+
**Decision Table**:
|
|
83
|
+
|
|
84
|
+
| Condition | Action |
|
|
85
|
+
|-----------|--------|
|
|
86
|
+
| package.json with "test" script exists | Run `npm test` |
|
|
87
|
+
| pytest available and tests/ or test/ directory exists | Run `pytest` |
|
|
88
|
+
| pyproject.toml with pytest listed exists | Run `pytest` |
|
|
89
|
+
| No test suite detected | WARN and continue (skip check) |
|
|
90
|
+
| Test command exits code 0 | PASS |
|
|
91
|
+
| Test command exits non-zero | FAIL — report test failures, halt pipeline |
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Detection priority:
|
|
95
|
+
# 1. package.json with "test" script → npm test
|
|
96
|
+
# 2. pytest available and tests exist → pytest
|
|
97
|
+
# 3. No tests found → WARN and continue
|
|
98
|
+
|
|
99
|
+
if [ -f "package.json" ] && grep -q '"test"' package.json; then
|
|
100
|
+
npm test
|
|
101
|
+
elif command -v pytest &>/dev/null && [ -d "tests" -o -d "test" ]; then
|
|
102
|
+
pytest
|
|
103
|
+
elif [ -f "pyproject.toml" ] && grep -q 'pytest' pyproject.toml; then
|
|
104
|
+
pytest
|
|
105
|
+
else
|
|
106
|
+
echo "WARN: No test suite detected — skipping test check"
|
|
107
|
+
fi
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Pass condition**: Test command exits with code 0, or no tests detected (warn).
|
|
111
|
+
**On failure**: Report test failures and stop the pipeline.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### Step 4: Build Verification
|
|
116
|
+
|
|
117
|
+
Detect project build step and run it.
|
|
118
|
+
|
|
119
|
+
**Decision Table**:
|
|
120
|
+
|
|
121
|
+
| Condition | Action |
|
|
122
|
+
|-----------|--------|
|
|
123
|
+
| package.json with "build" script exists | Run `npm run build` |
|
|
124
|
+
| pyproject.toml exists and python build module available | Run `python -m build` |
|
|
125
|
+
| Makefile with build target exists | Run `make build` |
|
|
126
|
+
| No build step detected | INFO — skip (not all projects need a build), PASS |
|
|
127
|
+
| Build command exits code 0 | PASS |
|
|
128
|
+
| Build command exits non-zero | FAIL — report build errors, halt pipeline |
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Detection priority:
|
|
132
|
+
# 1. package.json with "build" script → npm run build
|
|
133
|
+
# 2. pyproject.toml → python -m build (if build module available)
|
|
134
|
+
# 3. Makefile with build target → make build
|
|
135
|
+
# 4. No build step → PASS (not all projects need a build)
|
|
136
|
+
|
|
137
|
+
if [ -f "package.json" ] && grep -q '"build"' package.json; then
|
|
138
|
+
npm run build
|
|
139
|
+
elif [ -f "pyproject.toml" ] && python -m build --help &>/dev/null; then
|
|
140
|
+
python -m build
|
|
141
|
+
elif [ -f "Makefile" ] && grep -q '^build:' Makefile; then
|
|
142
|
+
make build
|
|
143
|
+
else
|
|
144
|
+
echo "INFO: No build step detected — skipping build check"
|
|
145
|
+
fi
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Pass condition**: Build command exits with code 0, or no build step detected.
|
|
149
|
+
**On failure**: Report build errors and stop the pipeline.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Output
|
|
154
|
+
|
|
155
|
+
| Artifact | Format | Description |
|
|
156
|
+
|----------|--------|-------------|
|
|
157
|
+
| preflight-report | JSON | Pass/fail per check, current branch, blockers list |
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"phase": "preflight",
|
|
162
|
+
"timestamp": "ISO-8601",
|
|
163
|
+
"checks": {
|
|
164
|
+
"git_clean": { "status": "pass|fail", "details": "" },
|
|
165
|
+
"branch": { "status": "pass|warn", "current": "branch-name", "details": "" },
|
|
166
|
+
"tests": { "status": "pass|fail|skip", "details": "" },
|
|
167
|
+
"build": { "status": "pass|fail|skip", "details": "" }
|
|
168
|
+
},
|
|
169
|
+
"overall": "pass|fail",
|
|
170
|
+
"blockers": []
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Success Criteria
|
|
175
|
+
|
|
176
|
+
| Criterion | Validation Method |
|
|
177
|
+
|-----------|-------------------|
|
|
178
|
+
| Git working tree is clean | `git status --porcelain` returns empty |
|
|
179
|
+
| Branch is non-main or user confirmed | Branch check + optional user confirmation |
|
|
180
|
+
| Tests pass or skipped with warning | Test command exit code 0, or skip with WARN |
|
|
181
|
+
| Build passes or skipped with info | Build command exit code 0, or skip with INFO |
|
|
182
|
+
| Overall gate is "pass" | All checks produce pass/warn/skip (no fail) |
|
|
183
|
+
|
|
184
|
+
## Error Handling
|
|
185
|
+
|
|
186
|
+
| Scenario | Resolution |
|
|
187
|
+
|----------|------------|
|
|
188
|
+
| Dirty working tree | BLOCKED — list dirty files, suggest `git stash` or `git commit`, halt |
|
|
189
|
+
| Tests fail | BLOCKED — report test output, halt pipeline |
|
|
190
|
+
| Build fails | BLOCKED — report build output, halt pipeline |
|
|
191
|
+
| git command not found | BLOCKED — report environment error |
|
|
192
|
+
| No version file or project type detected | WARN — continue, version detection deferred to Phase 3 |
|
|
193
|
+
|
|
194
|
+
## Next Phase
|
|
195
|
+
|
|
196
|
+
-> [Phase 2: Code Review](02-code-review.md)
|
|
197
|
+
|
|
198
|
+
If any check fails (overall: "fail"), report BLOCKED status with the preflight report. Do not proceed.
|