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,384 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security-audit
|
|
3
|
+
description: OWASP Top 10 and STRIDE security auditing with supply chain analysis. Triggers on "security audit", "security scan", "cso".
|
|
4
|
+
agents: security-auditor
|
|
5
|
+
phases: 4
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Security Audit
|
|
9
|
+
|
|
10
|
+
4-phase security audit covering supply chain risks, OWASP Top 10 code review, STRIDE threat modeling, and trend-tracked reporting. Produces structured JSON findings in `.workflow/.security/`.
|
|
11
|
+
|
|
12
|
+
## Architecture
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
+----------------------------------------------------------------------+
|
|
16
|
+
| security-audit Orchestrator |
|
|
17
|
+
| -> Mode selection: quick-scan (Phase 1 only) vs comprehensive |
|
|
18
|
+
+-----------------------------------+----------------------------------+
|
|
19
|
+
|
|
|
20
|
+
+---------------------+---------------------+
|
|
21
|
+
| |
|
|
22
|
+
[quick-scan mode] [comprehensive mode]
|
|
23
|
+
| |
|
|
24
|
+
+---------v---------+ +------------v-----------+
|
|
25
|
+
| Phase 1 | | Phase 1 |
|
|
26
|
+
| Supply Chain Scan | | Supply Chain Scan |
|
|
27
|
+
| -> supply-chain- | | -> supply-chain- |
|
|
28
|
+
| report.json | | report.json |
|
|
29
|
+
+---------+---------+ +------------+-----------+
|
|
30
|
+
| |
|
|
31
|
+
[score gate] +-----------v-----------+
|
|
32
|
+
score >= 8/10 | Phase 2 |
|
|
33
|
+
| | OWASP Review |
|
|
34
|
+
[DONE or | -> owasp-findings. |
|
|
35
|
+
DONE_WITH_CONCERNS] | json |
|
|
36
|
+
+-----------+-----------+
|
|
37
|
+
|
|
|
38
|
+
+-----------v-----------+
|
|
39
|
+
| Phase 3 |
|
|
40
|
+
| Threat Modeling |
|
|
41
|
+
| (STRIDE) |
|
|
42
|
+
| -> threat-model.json |
|
|
43
|
+
+-----------+-----------+
|
|
44
|
+
|
|
|
45
|
+
+-----------v-----------+
|
|
46
|
+
| Phase 4 |
|
|
47
|
+
| Report & Tracking |
|
|
48
|
+
| -> audit-report- |
|
|
49
|
+
| {date}.json |
|
|
50
|
+
+-----------------------+
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Agent Registry
|
|
56
|
+
|
|
57
|
+
| Agent | task_name | Role File | Responsibility | Pattern | fork_context |
|
|
58
|
+
|-------|-----------|-----------|----------------|---------|-------------|
|
|
59
|
+
| security-auditor | security-auditor | ~/.codex/agents/security-auditor.md | Execute all 4 phases: dependency audit, OWASP review, STRIDE modeling, report generation | Deep Interaction (2.3) | false |
|
|
60
|
+
|
|
61
|
+
> **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**.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Fork Context Strategy
|
|
66
|
+
|
|
67
|
+
| Agent | task_name | fork_context | fork_from | Rationale |
|
|
68
|
+
|-------|-----------|-------------|-----------|-----------|
|
|
69
|
+
| security-auditor | security-auditor | false | — | Starts fresh; all context provided via assign_task phase messages |
|
|
70
|
+
|
|
71
|
+
**Fork Decision Rules**:
|
|
72
|
+
|
|
73
|
+
| Condition | fork_context | Reason |
|
|
74
|
+
|-----------|-------------|--------|
|
|
75
|
+
| security-auditor spawn | false | Self-contained pipeline; phase inputs passed via assign_task |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Subagent Registry
|
|
80
|
+
|
|
81
|
+
Utility subagents spawned by `security-auditor` (not by the orchestrator):
|
|
82
|
+
|
|
83
|
+
| Subagent | Agent File | Callable By | Purpose | Model |
|
|
84
|
+
|----------|-----------|-------------|---------|-------|
|
|
85
|
+
| inline-owasp-analysis | ~/.codex/agents/cli-explore-agent.md | security-auditor (Phase 2) | OWASP Top 10 2021 code-level analysis | haiku |
|
|
86
|
+
|
|
87
|
+
> Subagents are spawned by agents within their own execution context (Pattern 2.8), not by the orchestrator.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Mode Selection
|
|
92
|
+
|
|
93
|
+
Determine mode from user request before spawning any agent.
|
|
94
|
+
|
|
95
|
+
| User Intent | Mode | Phases to Execute | Gate |
|
|
96
|
+
|-------------|------|-------------------|------|
|
|
97
|
+
| "quick scan", "daily check", "fast audit" | quick-scan | Phase 1 only | score >= 8/10 |
|
|
98
|
+
| "full audit", "comprehensive", "security audit", "cso" | comprehensive | Phases 1 → 2 → 3 → 4 | no regression (initial: >= 2/10) |
|
|
99
|
+
| Ambiguous | Prompt user: "Quick-scan (Phase 1 only) or comprehensive (all 4 phases)?" | — | — |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Phase Execution
|
|
104
|
+
|
|
105
|
+
### Phase 1: Supply Chain Scan
|
|
106
|
+
|
|
107
|
+
**Objective**: Detect low-hanging security risks in dependencies, secrets, CI/CD pipelines, and LLM integrations.
|
|
108
|
+
|
|
109
|
+
**Input**:
|
|
110
|
+
|
|
111
|
+
| Source | Description |
|
|
112
|
+
|--------|-------------|
|
|
113
|
+
| Working directory | Project source to be scanned |
|
|
114
|
+
| Mode | quick-scan or comprehensive |
|
|
115
|
+
|
|
116
|
+
**Execution**:
|
|
117
|
+
|
|
118
|
+
Spawn the security-auditor agent and assign Phase 1:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
spawn_agent({
|
|
122
|
+
task_name: "security-auditor",
|
|
123
|
+
fork_context: false,
|
|
124
|
+
message: `### MANDATORY FIRST STEPS
|
|
125
|
+
1. Read: ~/.codex/skills/security-audit/agents/security-auditor.md
|
|
126
|
+
|
|
127
|
+
## TASK: Phase 1 — Supply Chain Scan
|
|
128
|
+
|
|
129
|
+
Mode: <quick-scan|comprehensive>
|
|
130
|
+
Work directory: .workflow/.security
|
|
131
|
+
|
|
132
|
+
Execute Phase 1 per: ~/.codex/skills/security-audit/phases/01-supply-chain-scan.md
|
|
133
|
+
|
|
134
|
+
Deliverables:
|
|
135
|
+
- .workflow/.security/supply-chain-report.json
|
|
136
|
+
- Structured output summary with finding counts by severity`
|
|
137
|
+
})
|
|
138
|
+
const phase1Result = wait_agent({ targets: ["security-auditor"], timeout_ms: 300000 })
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**On timeout**:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
assign_task({
|
|
145
|
+
target: "security-auditor",
|
|
146
|
+
items: [{ type: "text", text: "Finalize current supply chain scan and output supply-chain-report.json now." }]
|
|
147
|
+
})
|
|
148
|
+
const phase1Result = wait_agent({ targets: ["security-auditor"], timeout_ms: 120000 })
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Output**:
|
|
152
|
+
|
|
153
|
+
| Artifact | Description |
|
|
154
|
+
|----------|-------------|
|
|
155
|
+
| `.workflow/.security/supply-chain-report.json` | Dependency, secrets, CI/CD, and LLM findings |
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### Quick-Scan Gate (quick-scan mode only)
|
|
160
|
+
|
|
161
|
+
After Phase 1 completes, evaluate score and close agent.
|
|
162
|
+
|
|
163
|
+
| Condition | Action |
|
|
164
|
+
|-----------|--------|
|
|
165
|
+
| score >= 8.0 | Status: DONE. No blocking issues. |
|
|
166
|
+
| 6.0 <= score < 8.0 | Status: DONE_WITH_CONCERNS. Log warning — review before deploy. |
|
|
167
|
+
| score < 6.0 | Status: DONE_WITH_CONCERNS. Block deployment. Remediate critical/high findings. |
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
close_agent({ target: "security-auditor" })
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
> **If quick-scan mode**: Stop here. Output final summary with score and findings count.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
### Phase 2: OWASP Review (comprehensive mode only)
|
|
178
|
+
|
|
179
|
+
**Objective**: Systematic code-level review against all 10 OWASP Top 10 2021 categories.
|
|
180
|
+
|
|
181
|
+
**Input**:
|
|
182
|
+
|
|
183
|
+
| Source | Description |
|
|
184
|
+
|--------|-------------|
|
|
185
|
+
| `.workflow/.security/supply-chain-report.json` | Phase 1 findings for context |
|
|
186
|
+
| Source files | All .ts/.js/.py/.go/.java excluding node_modules, dist, build |
|
|
187
|
+
|
|
188
|
+
**Execution**:
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
assign_task({
|
|
192
|
+
target: "security-auditor",
|
|
193
|
+
items: [{ type: "text", text: `## Phase 2 — OWASP Review
|
|
194
|
+
|
|
195
|
+
Execute Phase 2 per: ~/.codex/skills/security-audit/phases/02-owasp-review.md
|
|
196
|
+
|
|
197
|
+
Context: supply-chain-report.json already written to .workflow/.security/
|
|
198
|
+
Reference: ~/.codex/skills/security-audit/specs/owasp-checklist.md
|
|
199
|
+
|
|
200
|
+
Deliverables:
|
|
201
|
+
- .workflow/.security/owasp-findings.json
|
|
202
|
+
- Coverage for all 10 OWASP categories (A01–A10)` }]
|
|
203
|
+
})
|
|
204
|
+
const phase2Result = wait_agent({ targets: ["security-auditor"], timeout_ms: 360000 })
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Output**:
|
|
208
|
+
|
|
209
|
+
| Artifact | Description |
|
|
210
|
+
|----------|-------------|
|
|
211
|
+
| `.workflow/.security/owasp-findings.json` | OWASP findings with owasp_id, severity, file:line, evidence, remediation |
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
### Phase 3: Threat Modeling (comprehensive mode only)
|
|
216
|
+
|
|
217
|
+
**Objective**: Apply STRIDE threat model to architecture components; assess attack surface.
|
|
218
|
+
|
|
219
|
+
**Input**:
|
|
220
|
+
|
|
221
|
+
| Source | Description |
|
|
222
|
+
|--------|-------------|
|
|
223
|
+
| `.workflow/.security/supply-chain-report.json` | Phase 1 findings |
|
|
224
|
+
| `.workflow/.security/owasp-findings.json` | Phase 2 findings |
|
|
225
|
+
| Source files | Route handlers, data stores, auth modules, external service clients |
|
|
226
|
+
|
|
227
|
+
**Execution**:
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
assign_task({
|
|
231
|
+
target: "security-auditor",
|
|
232
|
+
items: [{ type: "text", text: `## Phase 3 — Threat Modeling (STRIDE)
|
|
233
|
+
|
|
234
|
+
Execute Phase 3 per: ~/.codex/skills/security-audit/phases/03-threat-modeling.md
|
|
235
|
+
|
|
236
|
+
Context: supply-chain-report.json and owasp-findings.json available in .workflow/.security/
|
|
237
|
+
Cross-reference Phase 1 and Phase 2 findings when mapping STRIDE categories.
|
|
238
|
+
|
|
239
|
+
Deliverables:
|
|
240
|
+
- .workflow/.security/threat-model.json
|
|
241
|
+
- All 6 STRIDE categories (S, T, R, I, D, E) evaluated per component
|
|
242
|
+
- Trust boundaries and attack surface quantified` }]
|
|
243
|
+
})
|
|
244
|
+
const phase3Result = wait_agent({ targets: ["security-auditor"], timeout_ms: 360000 })
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Output**:
|
|
248
|
+
|
|
249
|
+
| Artifact | Description |
|
|
250
|
+
|----------|-------------|
|
|
251
|
+
| `.workflow/.security/threat-model.json` | STRIDE threat model with components, trust boundaries, attack surface |
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
### Phase 4: Report & Tracking (comprehensive mode only)
|
|
256
|
+
|
|
257
|
+
**Objective**: Calculate score, compare with previous audits, generate date-stamped report.
|
|
258
|
+
|
|
259
|
+
**Input**:
|
|
260
|
+
|
|
261
|
+
| Source | Description |
|
|
262
|
+
|--------|-------------|
|
|
263
|
+
| `.workflow/.security/supply-chain-report.json` | Phase 1 output |
|
|
264
|
+
| `.workflow/.security/owasp-findings.json` | Phase 2 output |
|
|
265
|
+
| `.workflow/.security/threat-model.json` | Phase 3 output |
|
|
266
|
+
| `.workflow/.security/audit-report-*.json` | Previous audit reports (optional, for trend) |
|
|
267
|
+
|
|
268
|
+
**Execution**:
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
assign_task({
|
|
272
|
+
target: "security-auditor",
|
|
273
|
+
items: [{ type: "text", text: `## Phase 4 — Report & Tracking
|
|
274
|
+
|
|
275
|
+
Execute Phase 4 per: ~/.codex/skills/security-audit/phases/04-report-tracking.md
|
|
276
|
+
|
|
277
|
+
Scoring reference: ~/.codex/skills/security-audit/specs/scoring-gates.md
|
|
278
|
+
|
|
279
|
+
Steps:
|
|
280
|
+
1. Aggregate all findings from phases 1–3
|
|
281
|
+
2. Calculate score using formula: base 10.0 - (weighted_sum / normalization)
|
|
282
|
+
3. Check for previous audit: ls -t .workflow/.security/audit-report-*.json | head -1
|
|
283
|
+
4. Compute trend (improving/stable/regressing/baseline)
|
|
284
|
+
5. Evaluate gate (initial >= 2/10; subsequent >= previous_score)
|
|
285
|
+
6. Write .workflow/.security/audit-report-<YYYY-MM-DD>.json
|
|
286
|
+
|
|
287
|
+
Deliverables:
|
|
288
|
+
- .workflow/.security/audit-report-<YYYY-MM-DD>.json
|
|
289
|
+
- Updated copies of all phase outputs in .workflow/.security/` }]
|
|
290
|
+
})
|
|
291
|
+
const phase4Result = wait_agent({ targets: ["security-auditor"], timeout_ms: 300000 })
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**Output**:
|
|
295
|
+
|
|
296
|
+
| Artifact | Description |
|
|
297
|
+
|----------|-------------|
|
|
298
|
+
| `.workflow/.security/audit-report-<date>.json` | Full scored report with trend, top risks, remediation priority |
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
### Comprehensive Gate (comprehensive mode only)
|
|
303
|
+
|
|
304
|
+
After Phase 4 completes, evaluate gate and close agent.
|
|
305
|
+
|
|
306
|
+
| Audit Type | Condition | Result | Action |
|
|
307
|
+
|------------|-----------|--------|--------|
|
|
308
|
+
| Initial (no prior audit) | score >= 2.0 | PASS | DONE. Baseline established. Plan remediation. |
|
|
309
|
+
| Initial | score < 2.0 | FAIL | DONE_WITH_CONCERNS. Critical exposure. Immediate triage required. |
|
|
310
|
+
| Subsequent | score >= previous_score | PASS | DONE. No regression. |
|
|
311
|
+
| Subsequent | previous_score - 0.5 <= score < previous_score | WARN | DONE_WITH_CONCERNS. Marginal change. Review new findings. |
|
|
312
|
+
| Subsequent | score < previous_score - 0.5 | FAIL | DONE_WITH_CONCERNS. Regression detected. Investigate new findings. |
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
close_agent({ target: "security-auditor" })
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Lifecycle Management
|
|
321
|
+
|
|
322
|
+
### Timeout Protocol
|
|
323
|
+
|
|
324
|
+
| Phase | Default Timeout | On Timeout |
|
|
325
|
+
|-------|-----------------|------------|
|
|
326
|
+
| Phase 1: Supply Chain | 300000 ms (5 min) | assign_task "Finalize output now", re-wait 120s |
|
|
327
|
+
| Phase 2: OWASP Review | 360000 ms (6 min) | assign_task "Output partial findings", re-wait 120s |
|
|
328
|
+
| Phase 3: Threat Modeling | 360000 ms (6 min) | assign_task "Output partial threat model", re-wait 120s |
|
|
329
|
+
| Phase 4: Report | 300000 ms (5 min) | assign_task "Write report with available data", re-wait 120s |
|
|
330
|
+
|
|
331
|
+
### Cleanup Protocol
|
|
332
|
+
|
|
333
|
+
Agent is closed after the final executed phase (Phase 1 for quick-scan, Phase 4 for comprehensive).
|
|
334
|
+
|
|
335
|
+
```
|
|
336
|
+
close_agent({ target: "security-auditor" })
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Error Handling
|
|
342
|
+
|
|
343
|
+
| Scenario | Resolution |
|
|
344
|
+
|----------|------------|
|
|
345
|
+
| Agent timeout (first) | assign_task "Finalize current work and output now" + re-wait 120000 ms |
|
|
346
|
+
| Agent timeout (second) | Log error, close_agent({ target: "security-auditor" }), report partial results |
|
|
347
|
+
| Phase output file missing | assign_task requesting specific file output, re-wait |
|
|
348
|
+
| Audit tool not installed (npm/pip) | Phase 1 logs as INFO finding and continues — not a blocker |
|
|
349
|
+
| No previous audit found | Treat as baseline — apply initial gate (>= 2/10) |
|
|
350
|
+
| User cancellation | close_agent({ target: "security-auditor" }), report current state |
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## Output Format
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
## Summary
|
|
358
|
+
- One-sentence completion status with mode and final score
|
|
359
|
+
|
|
360
|
+
## Score
|
|
361
|
+
- Overall: <N>/10 (<Rating>)
|
|
362
|
+
- Gate: PASS|FAIL|WARN
|
|
363
|
+
- Mode: quick-scan|comprehensive
|
|
364
|
+
|
|
365
|
+
## Findings
|
|
366
|
+
- Critical: <N>
|
|
367
|
+
- High: <N>
|
|
368
|
+
- Medium: <N>
|
|
369
|
+
- Low: <N>
|
|
370
|
+
|
|
371
|
+
## Artifacts
|
|
372
|
+
- File: .workflow/.security/supply-chain-report.json
|
|
373
|
+
- File: .workflow/.security/owasp-findings.json (comprehensive only)
|
|
374
|
+
- File: .workflow/.security/threat-model.json (comprehensive only)
|
|
375
|
+
- File: .workflow/.security/audit-report-<date>.json (comprehensive only)
|
|
376
|
+
|
|
377
|
+
## Top Risks
|
|
378
|
+
1. <Most critical finding with file:line and remediation>
|
|
379
|
+
2. <Second finding>
|
|
380
|
+
|
|
381
|
+
## Next Steps
|
|
382
|
+
1. Remediate critical findings (effort: <low|medium|high>)
|
|
383
|
+
2. Re-run audit to verify fixes
|
|
384
|
+
```
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Phase 1: Supply Chain Scan
|
|
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 low-hanging security risks in third-party dependencies, hardcoded secrets, CI/CD pipelines, and LLM/AI integrations.
|
|
6
|
+
|
|
7
|
+
## Objective
|
|
8
|
+
|
|
9
|
+
- Audit third-party dependencies for known vulnerabilities
|
|
10
|
+
- Scan source code for leaked secrets and credentials
|
|
11
|
+
- Review CI/CD configuration for injection risks
|
|
12
|
+
- Check for LLM/AI prompt injection vulnerabilities
|
|
13
|
+
|
|
14
|
+
## Input
|
|
15
|
+
|
|
16
|
+
| Source | Required | Description |
|
|
17
|
+
|--------|----------|-------------|
|
|
18
|
+
| Project root | Yes | Working directory containing source files and dependency manifests |
|
|
19
|
+
| WORK_DIR | Yes | `.workflow/.security` — output directory (create if not exists) |
|
|
20
|
+
|
|
21
|
+
## Execution Steps
|
|
22
|
+
|
|
23
|
+
### Step 1: Dependency Audit
|
|
24
|
+
|
|
25
|
+
Detect package manager and run appropriate audit tool.
|
|
26
|
+
|
|
27
|
+
**Decision Table**:
|
|
28
|
+
|
|
29
|
+
| Condition | Action |
|
|
30
|
+
|-----------|--------|
|
|
31
|
+
| `package-lock.json` or `yarn.lock` present | Run `npm audit --json` |
|
|
32
|
+
| `requirements.txt` or `pyproject.toml` present | Run `pip-audit --format json`; fallback `safety check --json` |
|
|
33
|
+
| `go.sum` present | Run `govulncheck ./...` |
|
|
34
|
+
| No manifest files found | Log INFO finding: "No dependency manifests detected"; continue |
|
|
35
|
+
| Audit tool not installed | Log INFO finding: "<tool> not installed — manual review needed"; continue |
|
|
36
|
+
|
|
37
|
+
**Execution**:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Ensure output directory exists
|
|
41
|
+
mkdir -p .workflow/.security
|
|
42
|
+
WORK_DIR=".workflow/.security"
|
|
43
|
+
|
|
44
|
+
# Node.js projects
|
|
45
|
+
if [ -f package-lock.json ] || [ -f yarn.lock ]; then
|
|
46
|
+
npm audit --json > "${WORK_DIR}/npm-audit-raw.json" 2>&1 || true
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# Python projects
|
|
50
|
+
if [ -f requirements.txt ] || [ -f pyproject.toml ]; then
|
|
51
|
+
pip-audit --format json --output "${WORK_DIR}/pip-audit-raw.json" 2>&1 || true
|
|
52
|
+
# Fallback: safety check
|
|
53
|
+
safety check --json > "${WORK_DIR}/safety-raw.json" 2>&1 || true
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
# Go projects
|
|
57
|
+
if [ -f go.sum ]; then
|
|
58
|
+
govulncheck ./... 2>&1 | tee "${WORK_DIR}/govulncheck-raw.txt" || true
|
|
59
|
+
fi
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
### Step 2: Secrets Detection
|
|
65
|
+
|
|
66
|
+
Scan source files for hardcoded secrets using regex patterns. Exclude generated, compiled, and dependency directories.
|
|
67
|
+
|
|
68
|
+
**Decision Table**:
|
|
69
|
+
|
|
70
|
+
| Match Type | Severity | Category |
|
|
71
|
+
|------------|----------|----------|
|
|
72
|
+
| API key / token with 16+ chars | Critical | secret |
|
|
73
|
+
| AWS AKIA key pattern | Critical | secret |
|
|
74
|
+
| Private key PEM block | Critical | secret |
|
|
75
|
+
| DB connection string with embedded password | Critical | secret |
|
|
76
|
+
| Hardcoded JWT token | High | secret |
|
|
77
|
+
| No matches | — | No finding |
|
|
78
|
+
|
|
79
|
+
**Execution**:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# High-confidence patterns (case-insensitive)
|
|
83
|
+
grep -rniE \
|
|
84
|
+
'(api[_-]?key|api[_-]?secret|access[_-]?token|auth[_-]?token|secret[_-]?key)\s*[:=]\s*["\x27][A-Za-z0-9+/=_-]{16,}' \
|
|
85
|
+
--include='*.ts' --include='*.js' --include='*.py' --include='*.go' \
|
|
86
|
+
--include='*.java' --include='*.rb' --include='*.env' --include='*.yml' \
|
|
87
|
+
--include='*.yaml' --include='*.json' --include='*.toml' --include='*.cfg' \
|
|
88
|
+
. || true
|
|
89
|
+
|
|
90
|
+
# AWS patterns
|
|
91
|
+
grep -rniE '(AKIA[0-9A-Z]{16}|aws[_-]?secret[_-]?access[_-]?key)' . || true
|
|
92
|
+
|
|
93
|
+
# Private keys
|
|
94
|
+
grep -rniE '-----BEGIN (RSA |EC |DSA )?PRIVATE KEY-----' . || true
|
|
95
|
+
|
|
96
|
+
# Connection strings with passwords
|
|
97
|
+
grep -rniE '(mongodb|postgres|mysql|redis)://[^:]+:[^@]+@' . || true
|
|
98
|
+
|
|
99
|
+
# JWT tokens (hardcoded)
|
|
100
|
+
grep -rniE 'eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}' . || true
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Exclude from scan: `node_modules/`, `.git/`, `dist/`, `build/`, `__pycache__/`, `*.lock`, `*.min.js`.
|
|
104
|
+
|
|
105
|
+
Redact actual matched secret values in findings — use `[REDACTED]` in evidence field.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Step 3: CI/CD Config Review
|
|
110
|
+
|
|
111
|
+
Check GitHub Actions and other CI/CD configurations for injection risks.
|
|
112
|
+
|
|
113
|
+
**Decision Table**:
|
|
114
|
+
|
|
115
|
+
| Pattern Found | Severity | Finding |
|
|
116
|
+
|---------------|----------|---------|
|
|
117
|
+
| `${{ github.event.` in `run:` block | High | Expression injection in workflow run step |
|
|
118
|
+
| `pull_request_target` with checkout of PR code | High | Privileged workflow triggered by untrusted code |
|
|
119
|
+
| `actions/checkout@v1` or `@v2` | Medium | Deprecated action version with known issues |
|
|
120
|
+
| `secrets.` passed to untrusted context | High | Secret exposure risk |
|
|
121
|
+
| No `.github/workflows/` directory | — | Not applicable; skip |
|
|
122
|
+
|
|
123
|
+
**Execution**:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Find workflow files
|
|
127
|
+
find .github/workflows -name '*.yml' -o -name '*.yaml' 2>/dev/null
|
|
128
|
+
|
|
129
|
+
# Check for expression injection in run: blocks
|
|
130
|
+
# Dangerous: ${{ github.event.pull_request.title }} in run:
|
|
131
|
+
grep -rn '\${{.*github\.event\.' .github/workflows/ 2>/dev/null || true
|
|
132
|
+
|
|
133
|
+
# Check for pull_request_target with checkout of PR code
|
|
134
|
+
grep -rn 'pull_request_target' .github/workflows/ 2>/dev/null || true
|
|
135
|
+
|
|
136
|
+
# Check for use of deprecated/vulnerable actions
|
|
137
|
+
grep -rn 'actions/checkout@v1\|actions/checkout@v2' .github/workflows/ 2>/dev/null || true
|
|
138
|
+
|
|
139
|
+
# Check for secrets passed to untrusted contexts
|
|
140
|
+
grep -rn 'secrets\.' .github/workflows/ 2>/dev/null || true
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
### Step 4: LLM/AI Prompt Injection Check
|
|
146
|
+
|
|
147
|
+
Scan for patterns indicating prompt injection risk in LLM integrations.
|
|
148
|
+
|
|
149
|
+
**Decision Table**:
|
|
150
|
+
|
|
151
|
+
| Pattern Found | Severity | Finding |
|
|
152
|
+
|---------------|----------|---------|
|
|
153
|
+
| User input directly concatenated into prompt/system_message | High | LLM prompt injection vector |
|
|
154
|
+
| User input in template string passed to LLM call | High | LLM prompt injection via template |
|
|
155
|
+
| f-string with user data in `.complete`/`.generate` call | High | Python LLM prompt injection |
|
|
156
|
+
| LLM API call detected, no injection pattern | Low | LLM integration present — review for sanitization |
|
|
157
|
+
|
|
158
|
+
**Execution**:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# User input concatenated directly into prompts
|
|
162
|
+
grep -rniE '(prompt|system_message|messages)\s*[+=].*\b(user_input|request\.(body|query|params)|req\.)' \
|
|
163
|
+
--include='*.ts' --include='*.js' --include='*.py' . || true
|
|
164
|
+
|
|
165
|
+
# Template strings with user data in LLM calls
|
|
166
|
+
grep -rniE '(openai|anthropic|llm|chat|completion)\.' \
|
|
167
|
+
--include='*.ts' --include='*.js' --include='*.py' . || true
|
|
168
|
+
|
|
169
|
+
# Check for missing input sanitization before LLM calls
|
|
170
|
+
grep -rniE 'f".*{.*}.*".*\.(chat|complete|generate)' \
|
|
171
|
+
--include='*.py' . || true
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Output
|
|
177
|
+
|
|
178
|
+
| Artifact | Format | Description |
|
|
179
|
+
|----------|--------|-------------|
|
|
180
|
+
| `.workflow/.security/supply-chain-report.json` | JSON | All supply chain findings with severity classifications |
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"phase": "supply-chain-scan",
|
|
185
|
+
"timestamp": "ISO-8601",
|
|
186
|
+
"findings": [
|
|
187
|
+
{
|
|
188
|
+
"category": "dependency|secret|cicd|llm",
|
|
189
|
+
"severity": "critical|high|medium|low",
|
|
190
|
+
"title": "Finding title",
|
|
191
|
+
"description": "Detailed description",
|
|
192
|
+
"file": "path/to/file",
|
|
193
|
+
"line": 42,
|
|
194
|
+
"evidence": "matched text or context",
|
|
195
|
+
"remediation": "How to fix"
|
|
196
|
+
}
|
|
197
|
+
],
|
|
198
|
+
"summary": {
|
|
199
|
+
"total": 0,
|
|
200
|
+
"by_severity": { "critical": 0, "high": 0, "medium": 0, "low": 0 },
|
|
201
|
+
"by_category": { "dependency": 0, "secret": 0, "cicd": 0, "llm": 0 }
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Success Criteria
|
|
207
|
+
|
|
208
|
+
| Criterion | Validation Method |
|
|
209
|
+
|-----------|-------------------|
|
|
210
|
+
| All 4 scan steps executed or explicitly skipped with reason | Review step execution log |
|
|
211
|
+
| `supply-chain-report.json` written to `.workflow/.security/` | File exists and is valid JSON |
|
|
212
|
+
| All findings have category, severity, file, evidence, remediation | JSON schema check |
|
|
213
|
+
| Secret values redacted in evidence field | No raw credential values in output |
|
|
214
|
+
|
|
215
|
+
## Error Handling
|
|
216
|
+
|
|
217
|
+
| Scenario | Resolution |
|
|
218
|
+
|----------|------------|
|
|
219
|
+
| Audit tool not installed | Log INFO finding; continue with remaining steps |
|
|
220
|
+
| `grep` finds no matches | No finding generated for that pattern; continue |
|
|
221
|
+
| `.github/workflows/` does not exist | Mark CI/CD step as not_applicable; continue |
|
|
222
|
+
| Write to WORK_DIR fails | Attempt `mkdir -p .workflow/.security` and retry once |
|
|
223
|
+
|
|
224
|
+
## Next Phase
|
|
225
|
+
|
|
226
|
+
-> [Phase 2: OWASP Review](02-owasp-review.md)
|