claude-code-workflow 7.2.26 → 7.2.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ccw/specs/architecture-constraints.md +5 -0
- package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +140 -0
- package/.claude/skills/investigate/SKILL.md +110 -0
- package/.claude/skills/investigate/phases/01-root-cause-investigation.md +132 -0
- package/.claude/skills/investigate/phases/02-pattern-analysis.md +126 -0
- package/.claude/skills/investigate/phases/03-hypothesis-testing.md +177 -0
- package/.claude/skills/investigate/phases/04-implementation.md +139 -0
- package/.claude/skills/investigate/phases/05-verification-report.md +153 -0
- package/.claude/skills/investigate/specs/debug-report-format.md +226 -0
- package/.claude/skills/investigate/specs/iron-law.md +101 -0
- package/.claude/skills/security-audit/SKILL.md +125 -0
- package/.claude/skills/security-audit/phases/01-supply-chain-scan.md +139 -0
- package/.claude/skills/security-audit/phases/02-owasp-review.md +156 -0
- package/.claude/skills/security-audit/phases/03-threat-modeling.md +180 -0
- package/.claude/skills/security-audit/phases/04-report-tracking.md +177 -0
- package/.claude/skills/security-audit/specs/owasp-checklist.md +442 -0
- package/.claude/skills/security-audit/specs/scoring-gates.md +141 -0
- package/.claude/skills/ship/SKILL.md +105 -0
- package/.claude/skills/ship/phases/01-preflight-checks.md +121 -0
- package/.claude/skills/ship/phases/02-code-review.md +137 -0
- package/.claude/skills/ship/phases/03-version-bump.md +171 -0
- package/.claude/skills/ship/phases/04-changelog-commit.md +167 -0
- package/.claude/skills/ship/phases/05-pr-creation.md +163 -0
- package/.claude/skills/skill-generator/templates/sequential-phase.md +10 -0
- package/.claude/skills/skill-generator/templates/skill-md.md +4 -0
- package/.claude/skills/team-arch-opt/SKILL.md +1 -1
- package/.claude/skills/team-arch-opt/roles/coordinator/commands/monitor.md +3 -1
- package/.claude/skills/team-arch-opt/roles/refactorer/role.md +3 -1
- package/.claude/skills/team-arch-opt/specs/team-config.json +2 -2
- package/.claude/skills/team-coordinate/SKILL.md +4 -3
- package/.claude/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +1 -1
- package/.claude/skills/team-coordinate/roles/coordinator/commands/dispatch.md +3 -2
- package/.claude/skills/team-coordinate/roles/coordinator/commands/monitor.md +3 -2
- package/.claude/skills/team-coordinate/roles/coordinator/role.md +16 -15
- package/.claude/skills/team-coordinate/specs/pipelines.md +7 -4
- package/.claude/skills/team-coordinate/specs/role-spec-template.md +1 -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-lifecycle-v4/SKILL.md +1 -1
- package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +14 -2
- package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +24 -2
- package/.claude/skills/team-lifecycle-v4/roles/executor/role.md +3 -1
- 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-perf-opt/SKILL.md +1 -1
- package/.claude/skills/team-perf-opt/roles/optimizer/role.md +3 -1
- package/.claude/skills/team-perf-opt/specs/team-config.json +2 -2
- package/.claude/skills/team-quality-assurance/SKILL.md +1 -1
- package/.claude/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +4 -2
- package/.claude/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +4 -2
- package/.claude/skills/team-quality-assurance/roles/executor/role.md +3 -1
- package/.claude/skills/team-testing/SKILL.md +1 -1
- package/.claude/skills/team-testing/roles/coordinator/commands/dispatch.md +5 -2
- package/.claude/skills/team-testing/roles/coordinator/commands/monitor.md +4 -2
- package/.claude/skills/team-testing/roles/executor/role.md +3 -1
- package/.claude/skills/team-ui-polish/SKILL.md +127 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +194 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/monitor.md +180 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/role.md +170 -0
- package/.claude/skills/team-ui-polish/roles/diagnostician/role.md +160 -0
- package/.claude/skills/team-ui-polish/roles/optimizer/role.md +225 -0
- package/.claude/skills/team-ui-polish/roles/scanner/role.md +356 -0
- package/.claude/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.claude/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.claude/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.claude/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.claude/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.claude/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.claude/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.claude/skills/team-uidesign/SKILL.md +6 -1
- package/.claude/skills/team-uidesign/roles/designer/role.md +28 -4
- package/.claude/skills/team-uidesign/roles/implementer/role.md +25 -3
- package/.claude/skills/team-uidesign/roles/researcher/role.md +21 -2
- package/.claude/skills/team-uidesign/roles/reviewer/role.md +19 -17
- package/.claude/skills/team-uidesign/specs/anti-patterns.md +211 -0
- package/.claude/skills/team-uidesign/specs/design-standards.md +329 -0
- package/.claude/skills/team-uidesign/specs/scoring-guide.md +114 -0
- package/.claude/skills/team-uidesign/specs/team-config.json +1 -1
- package/.claude/skills/team-uidesign/specs/ux-writing.md +86 -0
- package/.claude/skills/team-ux-improve/SKILL.md +3 -0
- package/.claude/skills/team-ux-improve/roles/designer/role.md +30 -0
- package/.claude/skills/team-ux-improve/roles/diagnoser/role.md +16 -1
- package/.claude/skills/team-ux-improve/roles/scanner/role.md +43 -1
- package/.claude/skills/team-ux-improve/specs/anti-patterns.md +103 -0
- package/.claude/skills/team-ux-improve/specs/design-standards.md +54 -0
- package/.claude/skills/team-ux-improve/specs/heuristics.md +88 -0
- package/.claude/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +40 -8
- package/.claude/skills/team-ux-improve/wisdom/patterns/state-management.md +32 -12
- package/.claude/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +35 -11
- package/.claude/skills/team-ux-improve/wisdom/principles/general-ux.md +36 -9
- package/.claude/skills/team-visual-a11y/SKILL.md +143 -0
- package/.claude/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +250 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +204 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/role.md +169 -0
- package/.claude/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.claude/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.claude/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.claude/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.claude/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.claude/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.claude/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.claude/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.claude/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.claude/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/.codex/skills/investigate/agents/investigator.md +392 -0
- package/.codex/skills/investigate/orchestrator.md +362 -0
- package/.codex/skills/investigate/phases/01-root-cause-investigation.md +212 -0
- package/.codex/skills/investigate/phases/02-pattern-analysis.md +181 -0
- package/.codex/skills/investigate/phases/03-hypothesis-testing.md +214 -0
- package/.codex/skills/investigate/phases/04-implementation.md +195 -0
- package/.codex/skills/investigate/phases/05-verification-report.md +240 -0
- package/.codex/skills/security-audit/agents/security-auditor.md +341 -0
- package/.codex/skills/security-audit/orchestrator.md +384 -0
- package/.codex/skills/security-audit/phases/01-supply-chain-scan.md +226 -0
- package/.codex/skills/security-audit/phases/02-owasp-review.md +232 -0
- package/.codex/skills/security-audit/phases/03-threat-modeling.md +249 -0
- package/.codex/skills/security-audit/phases/04-report-tracking.md +300 -0
- package/.codex/skills/ship/agents/ship-operator.md +318 -0
- package/.codex/skills/ship/orchestrator.md +426 -0
- package/.codex/skills/ship/phases/01-preflight-checks.md +198 -0
- package/.codex/skills/ship/phases/02-code-review.md +228 -0
- package/.codex/skills/ship/phases/03-version-bump.md +259 -0
- package/.codex/skills/ship/phases/04-changelog-commit.md +263 -0
- package/.codex/skills/ship/phases/05-pr-creation.md +280 -0
- package/.codex/skills/team-interactive-craft/SKILL.md +220 -0
- package/.codex/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.codex/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +162 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +233 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/role.md +209 -0
- package/.codex/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.codex/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.codex/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.codex/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.codex/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.codex/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.codex/skills/team-motion-design/SKILL.md +222 -0
- package/.codex/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.codex/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/dispatch.md +168 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/monitor.md +242 -0
- package/.codex/skills/team-motion-design/roles/coordinator/role.md +210 -0
- package/.codex/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.codex/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.codex/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.codex/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.codex/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.codex/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.codex/skills/team-motion-design/specs/team-config.json +99 -0
- package/.codex/skills/team-ui-polish/SKILL.md +218 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +167 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/monitor.md +230 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-ui-polish/roles/diagnostician/role.md +164 -0
- package/.codex/skills/team-ui-polish/roles/optimizer/role.md +229 -0
- package/.codex/skills/team-ui-polish/roles/scanner/role.md +360 -0
- package/.codex/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.codex/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.codex/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.codex/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.codex/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.codex/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.codex/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.codex/skills/team-visual-a11y/SKILL.md +319 -0
- package/.codex/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +188 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +281 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.codex/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.codex/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.codex/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.codex/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.codex/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.codex/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.codex/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.codex/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.codex/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/README.md +8 -0
- package/ccw/dist/core/hooks/hook-templates.d.ts.map +1 -1
- package/ccw/dist/core/hooks/hook-templates.js +114 -1
- package/ccw/dist/core/hooks/hook-templates.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +34 -0
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +2 -2
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js → AlertDialog-BjP1ydDR.js} +2 -2
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-BjP1ydDR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-CAX3xqMf.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-CAX3xqMf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-CtWlmztq.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-CtWlmztq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-hR4a-eLX.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-hR4a-eLX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-DzNPkFN9.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-DzNPkFN9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BPEGN4TT.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BPEGN4TT.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cf0r2RHY.js} +2 -2
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cf0r2RHY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DEm1rJ4h.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DEm1rJ4h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-BpeWw8HO.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-BpeWw8HO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-BEsmh2vF.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-BEsmh2vF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-B30SFdtU.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-B30SFdtU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-BVvMpg1O.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-BVvMpg1O.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-CL73dHbh.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-CL73dHbh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-BL-28lMZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-BL-28lMZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BzZDciHZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BzZDciHZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-CDp6-d8P.js} +2 -2
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-CDp6-d8P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-fZY_7O9n.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-fZY_7O9n.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-4LJeC9bq.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-4LJeC9bq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-Bpigrbhw.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-Bpigrbhw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-BP0zJc1R.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-BP0zJc1R.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-CSt2oVKQ.js} +2 -2
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-CSt2oVKQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-B-xaMA0w.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-B-xaMA0w.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-CJqo_7DY.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-CJqo_7DY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-ibZeQA-Y.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-ibZeQA-Y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-DgJ4ctPQ.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-DgJ4ctPQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-Cit0Yq0D.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-Cit0Yq0D.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-Ce1HDIK0.js} +2 -2
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-Ce1HDIK0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-J1KikNrk.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-J1KikNrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CdBjTmth.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CdBjTmth.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-B9ZK7LvX.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-B9ZK7LvX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-CW_nS5UR.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-CW_nS5UR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SettingsPage-BPDbXPSM.js → SettingsPage-B2PYzSoO.js} +35 -35
- package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +1 -0
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js → SkillsManagerPage-CTnWrrwp.js} +2 -2
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js.map → SkillsManagerPage-CTnWrrwp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DJpi9XQL.js} +2 -2
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DJpi9XQL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-Ac6Ov7uy.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-Ac6Ov7uy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-DZAAspqR.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-DZAAspqR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-BJkwfhIZ.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-BJkwfhIZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-BJgjxBgb.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-BJgjxBgb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-D1WekoOy.js} +2 -2
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-D1WekoOy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-DxemgIhF.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-DxemgIhF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-CjS83f1V.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-CjS83f1V.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-B5PUcn8I.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-B5PUcn8I.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-DCc9aPbb.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-DCc9aPbb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-DOwFtzak.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-DOwFtzak.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-96qH3aFh.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-96qH3aFh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CCxSuil1.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CCxSuil1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-CZNSJFdq.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-CZNSJFdq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-h8xtvw2_.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-h8xtvw2_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-D3NY0bm6.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-D3NY0bm6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-Cy2vkc8p.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-Cy2vkc8p.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-Bzq3U1Mx.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-Bzq3U1Mx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-DwuwPDPi.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-DwuwPDPi.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-q9g-bknU.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-q9g-bknU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-CL6vb42J.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-CL6vb42J.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-BkrcQBly.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-BkrcQBly.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-BQbwyNeV.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-BQbwyNeV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-x5_7DrN7.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-x5_7DrN7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-DTyWXwzf.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-DTyWXwzf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-80O0kJO7.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-80O0kJO7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-DDlN2Bwa.js} +2 -2
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-DDlN2Bwa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-B9A3Hnrk.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-B9A3Hnrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-Bs80iCX0.js} +2 -2
- package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-Bs80iCX0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index-mbeo62f8.js} +2 -2
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index-mbeo62f8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-rLgoBCfV.js} +3 -3
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-rLgoBCfV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-C1niOWJx.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-C1niOWJx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-BTmI7SUg.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-BTmI7SUg.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CB9HKeuZ.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CB9HKeuZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-koEYiemK.js} +2 -2
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-koEYiemK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-v2_GaLdC.js} +2 -2
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-v2_GaLdC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BQNfAqG_.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BQNfAqG_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-Dzq5LGg9.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-Dzq5LGg9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CtkoJXcz.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CtkoJXcz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-CH3smL37.js} +2 -2
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-CH3smL37.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CZ0aL_yF.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CZ0aL_yF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-F2A_J4l6.js} +2 -2
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-F2A_J4l6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-Byxot0YU.js} +2 -2
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-Byxot0YU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-JjqhUkpw.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-JjqhUkpw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2--SuN9rAt.js} +2 -2
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2--SuN9rAt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-BbngGB2h.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-BbngGB2h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-CgrHgZSl.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-CgrHgZSl.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-BU3TQr7Z.js} +2 -2
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-BU3TQr7Z.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CKs7nnn3.js} +2 -2
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CKs7nnn3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-DW5tsDW6.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-DW5tsDW6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-BHm7w3ON.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-BHm7w3ON.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-DYR7PWwt.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-DYR7PWwt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-D0TVgQD_.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-D0TVgQD_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-DfY8mAP8.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-DfY8mAP8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-CGusDp0F.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-CGusDp0F.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-CIwh0fF1.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-CIwh0fF1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-FMyFv39K.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-FMyFv39K.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-B2qhsoTb.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-B2qhsoTb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-cxKXMBm3.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-cxKXMBm3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-B-xUT_z-.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-B-xUT_z-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-DZV_3lPr.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-DZV_3lPr.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/package.json +105 -105
- package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
# OWASP Top 10 2021 Checklist
|
|
2
|
+
|
|
3
|
+
Code-level detection patterns, vulnerable code examples, and remediation templates for each OWASP category.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
| Phase | Usage | Section |
|
|
8
|
+
|-------|-------|---------|
|
|
9
|
+
| Phase 2 | Reference during OWASP code review | All categories |
|
|
10
|
+
| Phase 4 | Classify findings by OWASP category | Category IDs |
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## A01: Broken Access Control
|
|
15
|
+
|
|
16
|
+
**CWE**: CWE-200, CWE-284, CWE-285, CWE-352, CWE-639
|
|
17
|
+
|
|
18
|
+
### Detection Patterns
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Missing auth middleware on route handlers
|
|
22
|
+
grep -rnE 'app\.(get|post|put|delete|patch)\s*\(\s*["\x27/]' --include='*.ts' --include='*.js' .
|
|
23
|
+
# Then verify each route has auth middleware
|
|
24
|
+
|
|
25
|
+
# Direct object reference without ownership check
|
|
26
|
+
grep -rnE 'findById\(.*params|findOne\(.*params|\.get\(.*id' --include='*.ts' --include='*.js' --include='*.py' .
|
|
27
|
+
|
|
28
|
+
# Path traversal patterns
|
|
29
|
+
grep -rnE '(readFile|writeFile|createReadStream|open)\s*\(.*req\.' --include='*.ts' --include='*.js' .
|
|
30
|
+
grep -rnE 'os\.path\.join\(.*request\.' --include='*.py' .
|
|
31
|
+
|
|
32
|
+
# Missing CORS restrictions
|
|
33
|
+
grep -rnE 'Access-Control-Allow-Origin.*\*|cors\(\s*\)' --include='*.ts' --include='*.js' .
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Vulnerable Code Example
|
|
37
|
+
|
|
38
|
+
```javascript
|
|
39
|
+
// BAD: No ownership check
|
|
40
|
+
app.get('/api/documents/:id', auth, async (req, res) => {
|
|
41
|
+
const doc = await Document.findById(req.params.id); // Any user can access any doc
|
|
42
|
+
res.json(doc);
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Remediation
|
|
47
|
+
|
|
48
|
+
```javascript
|
|
49
|
+
// GOOD: Ownership check
|
|
50
|
+
app.get('/api/documents/:id', auth, async (req, res) => {
|
|
51
|
+
const doc = await Document.findOne({ _id: req.params.id, owner: req.user.id });
|
|
52
|
+
if (!doc) return res.status(404).json({ error: 'Not found' });
|
|
53
|
+
res.json(doc);
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## A02: Cryptographic Failures
|
|
60
|
+
|
|
61
|
+
**CWE**: CWE-259, CWE-327, CWE-331, CWE-798
|
|
62
|
+
|
|
63
|
+
### Detection Patterns
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Weak hash algorithms
|
|
67
|
+
grep -rniE '(md5|sha1)\s*\(' --include='*.ts' --include='*.js' --include='*.py' --include='*.java' .
|
|
68
|
+
|
|
69
|
+
# Plaintext password storage
|
|
70
|
+
grep -rniE 'password\s*[:=]\s*.*\.(body|query|params)' --include='*.ts' --include='*.js' .
|
|
71
|
+
|
|
72
|
+
# Hardcoded encryption keys
|
|
73
|
+
grep -rniE '(encrypt|cipher|secret|key)\s*[:=]\s*["\x27][A-Za-z0-9+/=]{8,}' --include='*.ts' --include='*.js' --include='*.py' .
|
|
74
|
+
|
|
75
|
+
# HTTP (not HTTPS) for sensitive operations
|
|
76
|
+
grep -rniE 'http://.*\.(api|auth|login|payment)' --include='*.ts' --include='*.js' --include='*.py' .
|
|
77
|
+
|
|
78
|
+
# Missing encryption at rest
|
|
79
|
+
grep -rniE '(password|ssn|credit.?card|social.?security)' --include='*.sql' --include='*.prisma' --include='*.schema' .
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Vulnerable Code Example
|
|
83
|
+
|
|
84
|
+
```python
|
|
85
|
+
# BAD: MD5 for password hashing
|
|
86
|
+
import hashlib
|
|
87
|
+
password_hash = hashlib.md5(password.encode()).hexdigest()
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Remediation
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
# GOOD: bcrypt with proper work factor
|
|
94
|
+
import bcrypt
|
|
95
|
+
password_hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## A03: Injection
|
|
101
|
+
|
|
102
|
+
**CWE**: CWE-20, CWE-74, CWE-79, CWE-89
|
|
103
|
+
|
|
104
|
+
### Detection Patterns
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# SQL string concatenation/interpolation
|
|
108
|
+
grep -rniE "(query|execute|raw)\s*\(\s*[\`\"'].*(\+|\$\{|%s|\.format)" --include='*.ts' --include='*.js' --include='*.py' .
|
|
109
|
+
grep -rniE "f[\"'].*SELECT.*\{" --include='*.py' .
|
|
110
|
+
|
|
111
|
+
# NoSQL injection
|
|
112
|
+
grep -rniE '\$where|\$regex.*req\.' --include='*.ts' --include='*.js' .
|
|
113
|
+
grep -rniE 'find\(\s*\{.*req\.(body|query|params)' --include='*.ts' --include='*.js' .
|
|
114
|
+
|
|
115
|
+
# OS command injection
|
|
116
|
+
grep -rniE '(child_process|exec|execSync|spawn|system|popen|subprocess)\s*\(.*req\.' --include='*.ts' --include='*.js' --include='*.py' .
|
|
117
|
+
|
|
118
|
+
# XPath/LDAP injection
|
|
119
|
+
grep -rniE '(xpath|ldap).*\+.*req\.' --include='*.ts' --include='*.js' --include='*.py' .
|
|
120
|
+
|
|
121
|
+
# Template injection
|
|
122
|
+
grep -rniE '(render_template_string|Template\(.*req\.|eval\(.*req\.)' --include='*.py' --include='*.js' .
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Vulnerable Code Example
|
|
126
|
+
|
|
127
|
+
```javascript
|
|
128
|
+
// BAD: SQL string concatenation
|
|
129
|
+
const result = await db.query(`SELECT * FROM users WHERE id = ${req.params.id}`);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Remediation
|
|
133
|
+
|
|
134
|
+
```javascript
|
|
135
|
+
// GOOD: Parameterized query
|
|
136
|
+
const result = await db.query('SELECT * FROM users WHERE id = $1', [req.params.id]);
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## A04: Insecure Design
|
|
142
|
+
|
|
143
|
+
**CWE**: CWE-209, CWE-256, CWE-501, CWE-522
|
|
144
|
+
|
|
145
|
+
### Detection Patterns
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# Missing rate limiting on auth endpoints
|
|
149
|
+
grep -rniE '(login|register|reset.?password|forgot.?password)' --include='*.ts' --include='*.js' --include='*.py' .
|
|
150
|
+
# Then check if rate limiting middleware is applied
|
|
151
|
+
|
|
152
|
+
# No account lockout mechanism
|
|
153
|
+
grep -rniE 'failed.?login|login.?attempt|max.?retries' --include='*.ts' --include='*.js' --include='*.py' .
|
|
154
|
+
|
|
155
|
+
# Business logic without validation
|
|
156
|
+
grep -rniE '(transfer|withdraw|purchase|delete.?account)' --include='*.ts' --include='*.js' --include='*.py' .
|
|
157
|
+
# Then check for confirmation/validation steps
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Checks
|
|
161
|
+
|
|
162
|
+
- [ ] Authentication flows have rate limiting
|
|
163
|
+
- [ ] Account lockout after N failed attempts
|
|
164
|
+
- [ ] Multi-step operations have proper state validation
|
|
165
|
+
- [ ] Business-critical operations require confirmation
|
|
166
|
+
- [ ] Threat modeling has been performed (see Phase 3)
|
|
167
|
+
|
|
168
|
+
### Remediation
|
|
169
|
+
|
|
170
|
+
Implement defense-in-depth: rate limiting, input validation, business logic validation, and multi-step confirmation for critical operations.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## A05: Security Misconfiguration
|
|
175
|
+
|
|
176
|
+
**CWE**: CWE-2, CWE-11, CWE-13, CWE-15, CWE-16, CWE-388
|
|
177
|
+
|
|
178
|
+
### Detection Patterns
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# Debug mode enabled
|
|
182
|
+
grep -rniE '(DEBUG|NODE_ENV)\s*[:=]\s*(true|True|1|"development"|"debug")' \
|
|
183
|
+
--include='*.env' --include='*.env.*' --include='*.py' --include='*.json' --include='*.yaml' .
|
|
184
|
+
|
|
185
|
+
# Default credentials
|
|
186
|
+
grep -rniE '(admin|root|test|default).*[:=].*password' --include='*.env' --include='*.yaml' --include='*.json' --include='*.py' .
|
|
187
|
+
|
|
188
|
+
# Verbose error responses (stack traces to client)
|
|
189
|
+
grep -rniE '(stack|stackTrace|traceback).*res\.(json|send)|app\.use.*err.*stack' --include='*.ts' --include='*.js' .
|
|
190
|
+
|
|
191
|
+
# Missing security headers
|
|
192
|
+
grep -rniE '(helmet|X-Frame-Options|X-Content-Type-Options|Strict-Transport-Security)' --include='*.ts' --include='*.js' .
|
|
193
|
+
|
|
194
|
+
# Directory listing enabled
|
|
195
|
+
grep -rniE 'autoindex\s+on|directory.?listing|serveStatic.*index.*false' --include='*.conf' --include='*.ts' --include='*.js' .
|
|
196
|
+
|
|
197
|
+
# Unnecessary features/services
|
|
198
|
+
grep -rniE '(graphiql|playground|swagger-ui).*true' --include='*.ts' --include='*.js' --include='*.py' --include='*.yaml' .
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Vulnerable Code Example
|
|
202
|
+
|
|
203
|
+
```javascript
|
|
204
|
+
// BAD: Stack trace in error response
|
|
205
|
+
app.use((err, req, res, next) => {
|
|
206
|
+
res.status(500).json({ error: err.message, stack: err.stack });
|
|
207
|
+
});
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Remediation
|
|
211
|
+
|
|
212
|
+
```javascript
|
|
213
|
+
// GOOD: Generic error response in production
|
|
214
|
+
app.use((err, req, res, next) => {
|
|
215
|
+
console.error(err.stack); // Log internally
|
|
216
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
217
|
+
});
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## A06: Vulnerable and Outdated Components
|
|
223
|
+
|
|
224
|
+
**CWE**: CWE-1104
|
|
225
|
+
|
|
226
|
+
### Detection Patterns
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# Check dependency lock files age
|
|
230
|
+
ls -la package-lock.json yarn.lock requirements.txt Pipfile.lock go.sum 2>/dev/null
|
|
231
|
+
|
|
232
|
+
# Run package audits (from Phase 1)
|
|
233
|
+
npm audit --json 2>/dev/null
|
|
234
|
+
pip-audit --format json 2>/dev/null
|
|
235
|
+
|
|
236
|
+
# Check for pinned vs unpinned dependencies
|
|
237
|
+
grep -E ':\s*"\^|:\s*"~|:\s*"\*|>=\s' package.json 2>/dev/null
|
|
238
|
+
grep -E '^[a-zA-Z].*[^=]==[^=]' requirements.txt 2>/dev/null # Good: pinned
|
|
239
|
+
grep -E '^[a-zA-Z].*>=|^[a-zA-Z][^=]*$' requirements.txt 2>/dev/null # Bad: unpinned
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Checks
|
|
243
|
+
|
|
244
|
+
- [ ] All dependencies have pinned versions
|
|
245
|
+
- [ ] No known CVEs in dependencies (via audit tools)
|
|
246
|
+
- [ ] Dependencies are actively maintained (not abandoned)
|
|
247
|
+
- [ ] Lock files are committed to version control
|
|
248
|
+
|
|
249
|
+
### Remediation
|
|
250
|
+
|
|
251
|
+
Run `npm audit fix` or `pip install --upgrade` for vulnerable packages. Pin all dependency versions. Set up automated dependency scanning (Dependabot, Renovate).
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## A07: Identification and Authentication Failures
|
|
256
|
+
|
|
257
|
+
**CWE**: CWE-255, CWE-259, CWE-287, CWE-384
|
|
258
|
+
|
|
259
|
+
### Detection Patterns
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
# Weak password requirements
|
|
263
|
+
grep -rniE 'password.*length.*[0-5]|minlength.*[0-5]|min.?length.*[0-5]' --include='*.ts' --include='*.js' --include='*.py' .
|
|
264
|
+
|
|
265
|
+
# Missing password hashing
|
|
266
|
+
grep -rniE 'password\s*[:=].*req\.' --include='*.ts' --include='*.js' .
|
|
267
|
+
# Then check if bcrypt/argon2/scrypt is used before storage
|
|
268
|
+
|
|
269
|
+
# Session fixation (no rotation after login)
|
|
270
|
+
grep -rniE 'session\.regenerate|session\.id\s*=' --include='*.ts' --include='*.js' .
|
|
271
|
+
|
|
272
|
+
# JWT without expiration
|
|
273
|
+
grep -rniE 'jwt\.sign\(' --include='*.ts' --include='*.js' .
|
|
274
|
+
# Then check for expiresIn option
|
|
275
|
+
|
|
276
|
+
# Credentials in URL
|
|
277
|
+
grep -rniE '(token|key|password|secret)=[^&\s]+' --include='*.ts' --include='*.js' --include='*.py' .
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Vulnerable Code Example
|
|
281
|
+
|
|
282
|
+
```javascript
|
|
283
|
+
// BAD: JWT without expiration
|
|
284
|
+
const token = jwt.sign({ userId: user.id }, SECRET);
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Remediation
|
|
288
|
+
|
|
289
|
+
```javascript
|
|
290
|
+
// GOOD: JWT with expiration and proper claims
|
|
291
|
+
const token = jwt.sign(
|
|
292
|
+
{ userId: user.id, role: user.role },
|
|
293
|
+
SECRET,
|
|
294
|
+
{ expiresIn: '1h', issuer: 'myapp', audience: 'myapp-client' }
|
|
295
|
+
);
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## A08: Software and Data Integrity Failures
|
|
301
|
+
|
|
302
|
+
**CWE**: CWE-345, CWE-353, CWE-426, CWE-494, CWE-502
|
|
303
|
+
|
|
304
|
+
### Detection Patterns
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
# Insecure deserialization
|
|
308
|
+
grep -rniE '(pickle\.load|yaml\.load\(|unserialize|JSON\.parse\(.*req\.|eval\()' --include='*.py' --include='*.ts' --include='*.js' --include='*.php' .
|
|
309
|
+
|
|
310
|
+
# Missing integrity checks on downloads/updates
|
|
311
|
+
grep -rniE '(download|fetch|curl|wget)' --include='*.sh' --include='*.yaml' --include='*.yml' .
|
|
312
|
+
# Then check for checksum/signature verification
|
|
313
|
+
|
|
314
|
+
# CI/CD pipeline without pinned action versions
|
|
315
|
+
grep -rniE 'uses:\s*[^@]+$|uses:.*@(main|master|latest)' .github/workflows/*.yml 2>/dev/null
|
|
316
|
+
|
|
317
|
+
# Unsafe YAML loading
|
|
318
|
+
grep -rniE 'yaml\.load\(' --include='*.py' .
|
|
319
|
+
# Should be yaml.safe_load()
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Vulnerable Code Example
|
|
323
|
+
|
|
324
|
+
```python
|
|
325
|
+
# BAD: Unsafe YAML loading
|
|
326
|
+
import yaml
|
|
327
|
+
data = yaml.load(user_input) # Allows arbitrary code execution
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Remediation
|
|
331
|
+
|
|
332
|
+
```python
|
|
333
|
+
# GOOD: Safe YAML loading
|
|
334
|
+
import yaml
|
|
335
|
+
data = yaml.safe_load(user_input)
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## A09: Security Logging and Monitoring Failures
|
|
341
|
+
|
|
342
|
+
**CWE**: CWE-223, CWE-532, CWE-778
|
|
343
|
+
|
|
344
|
+
### Detection Patterns
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
# Check for logging of auth events
|
|
348
|
+
grep -rniE '(log|logger|logging)\.' --include='*.ts' --include='*.js' --include='*.py' .
|
|
349
|
+
# Then check if login/logout/failed-auth events are logged
|
|
350
|
+
|
|
351
|
+
# Sensitive data in logs
|
|
352
|
+
grep -rniE 'log.*(password|token|secret|credit.?card|ssn)' --include='*.ts' --include='*.js' --include='*.py' .
|
|
353
|
+
|
|
354
|
+
# Empty catch blocks (swallowed errors)
|
|
355
|
+
grep -rniE 'catch\s*\([^)]*\)\s*\{\s*\}' --include='*.ts' --include='*.js' .
|
|
356
|
+
|
|
357
|
+
# Missing audit trail for critical operations
|
|
358
|
+
grep -rniE '(delete|update|create|transfer)' --include='*.ts' --include='*.js' --include='*.py' .
|
|
359
|
+
# Then check if these operations are logged with user context
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### Checks
|
|
363
|
+
|
|
364
|
+
- [ ] Failed login attempts are logged with IP and timestamp
|
|
365
|
+
- [ ] Successful logins are logged
|
|
366
|
+
- [ ] Access control failures are logged
|
|
367
|
+
- [ ] Input validation failures are logged
|
|
368
|
+
- [ ] Sensitive data is NOT logged (passwords, tokens, PII)
|
|
369
|
+
- [ ] Logs include sufficient context (who, what, when, where)
|
|
370
|
+
|
|
371
|
+
### Remediation
|
|
372
|
+
|
|
373
|
+
Implement structured logging with: user ID, action, timestamp, IP address, result (success/failure). Exclude sensitive data. Set up log monitoring and alerting for anomalous patterns.
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## A10: Server-Side Request Forgery (SSRF)
|
|
378
|
+
|
|
379
|
+
**CWE**: CWE-918
|
|
380
|
+
|
|
381
|
+
### Detection Patterns
|
|
382
|
+
|
|
383
|
+
```bash
|
|
384
|
+
# User-controlled URLs in fetch/request calls
|
|
385
|
+
grep -rniE '(fetch|axios|http\.request|requests\.(get|post)|urllib)\s*\(.*req\.(body|query|params)' \
|
|
386
|
+
--include='*.ts' --include='*.js' --include='*.py' .
|
|
387
|
+
|
|
388
|
+
# URL construction from user input
|
|
389
|
+
grep -rniE '(url|endpoint|target|redirect)\s*[:=].*req\.(body|query|params)' --include='*.ts' --include='*.js' --include='*.py' .
|
|
390
|
+
|
|
391
|
+
# Image/file fetch from URL
|
|
392
|
+
grep -rniE '(download|fetchImage|getFile|loadUrl)\s*\(.*req\.' --include='*.ts' --include='*.js' --include='*.py' .
|
|
393
|
+
|
|
394
|
+
# Redirect without validation
|
|
395
|
+
grep -rniE 'res\.redirect\(.*req\.|redirect_to.*request\.' --include='*.ts' --include='*.js' --include='*.py' .
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### Vulnerable Code Example
|
|
399
|
+
|
|
400
|
+
```javascript
|
|
401
|
+
// BAD: Unvalidated URL fetch
|
|
402
|
+
app.get('/proxy', async (req, res) => {
|
|
403
|
+
const response = await fetch(req.query.url); // Can access internal services
|
|
404
|
+
res.send(await response.text());
|
|
405
|
+
});
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Remediation
|
|
409
|
+
|
|
410
|
+
```javascript
|
|
411
|
+
// GOOD: URL allowlist validation
|
|
412
|
+
const ALLOWED_HOSTS = ['api.example.com', 'cdn.example.com'];
|
|
413
|
+
|
|
414
|
+
app.get('/proxy', async (req, res) => {
|
|
415
|
+
const url = new URL(req.query.url);
|
|
416
|
+
if (!ALLOWED_HOSTS.includes(url.hostname)) {
|
|
417
|
+
return res.status(400).json({ error: 'Host not allowed' });
|
|
418
|
+
}
|
|
419
|
+
if (url.protocol !== 'https:') {
|
|
420
|
+
return res.status(400).json({ error: 'HTTPS required' });
|
|
421
|
+
}
|
|
422
|
+
const response = await fetch(url.toString());
|
|
423
|
+
res.send(await response.text());
|
|
424
|
+
});
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## Quick Reference
|
|
430
|
+
|
|
431
|
+
| ID | Category | Key Grep Pattern | Severity Baseline |
|
|
432
|
+
|----|----------|-----------------|-------------------|
|
|
433
|
+
| A01 | Broken Access Control | `findById.*params` without owner check | High |
|
|
434
|
+
| A02 | Cryptographic Failures | `md5\|sha1` for passwords | High |
|
|
435
|
+
| A03 | Injection | `query.*\+.*req\.\|f".*SELECT.*\{` | Critical |
|
|
436
|
+
| A04 | Insecure Design | Missing rate limit on auth routes | Medium |
|
|
437
|
+
| A05 | Security Misconfiguration | `DEBUG.*true\|stack.*res.json` | Medium |
|
|
438
|
+
| A06 | Vulnerable Components | `npm audit` / `pip-audit` results | Varies |
|
|
439
|
+
| A07 | Auth Failures | `jwt.sign` without `expiresIn` | High |
|
|
440
|
+
| A08 | Integrity Failures | `pickle.load\|yaml.load` | High |
|
|
441
|
+
| A09 | Logging Failures | Empty catch blocks, no auth logging | Medium |
|
|
442
|
+
| A10 | SSRF | `fetch.*req.query.url` | High |
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Scoring Gates
|
|
2
|
+
|
|
3
|
+
Defines the 10-point scoring system, severity weights, quality gates, and trend tracking format for security audits.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
| Phase | Usage | Section |
|
|
8
|
+
|-------|-------|---------|
|
|
9
|
+
| Phase 1 | Quick-scan scoring (daily gate) | Severity Weights, Daily Gate |
|
|
10
|
+
| Phase 4 | Full audit scoring and reporting | All sections |
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 10-Point Scale
|
|
15
|
+
|
|
16
|
+
All security audit scores are on a 0-10 scale where 10 = no findings and 0 = critical exposure.
|
|
17
|
+
|
|
18
|
+
| Score | Rating | Description |
|
|
19
|
+
|-------|--------|-------------|
|
|
20
|
+
| 9.0 - 10.0 | Excellent | Minimal risk. Production-ready without reservations. |
|
|
21
|
+
| 7.0 - 8.9 | Good | Low risk. Acceptable for production with minor improvements. |
|
|
22
|
+
| 5.0 - 6.9 | Fair | Moderate risk. Remediation recommended before production. |
|
|
23
|
+
| 3.0 - 4.9 | Poor | High risk. Remediation required. Not production-ready. |
|
|
24
|
+
| 0.0 - 2.9 | Critical | Severe exposure. Immediate action required. |
|
|
25
|
+
|
|
26
|
+
## Severity Weights
|
|
27
|
+
|
|
28
|
+
Each finding is weighted by severity for score calculation.
|
|
29
|
+
|
|
30
|
+
| Severity | Weight | Criteria | Examples |
|
|
31
|
+
|----------|--------|----------|----------|
|
|
32
|
+
| **Critical** | 10 | Exploitable with high impact, no user interaction needed | RCE, SQL injection with data access, leaked production credentials, auth bypass |
|
|
33
|
+
| **High** | 7 | Exploitable with significant impact, may need user interaction | Broken authentication, SSRF, privilege escalation, XSS with session theft |
|
|
34
|
+
| **Medium** | 4 | Limited exploitability or moderate impact | Reflected XSS, CSRF, verbose error messages, missing security headers |
|
|
35
|
+
| **Low** | 1 | Informational or minimal impact | Missing best-practice headers, minor info disclosure, deprecated dependencies without known exploit |
|
|
36
|
+
|
|
37
|
+
## Score Calculation
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Input:
|
|
41
|
+
findings[] -- array of all findings with severity
|
|
42
|
+
files_scanned -- total source files analyzed
|
|
43
|
+
|
|
44
|
+
Algorithm:
|
|
45
|
+
base_score = 10.0
|
|
46
|
+
normalization = max(10, files_scanned)
|
|
47
|
+
|
|
48
|
+
weighted_sum = 0
|
|
49
|
+
for each finding:
|
|
50
|
+
weighted_sum += severity_weight(finding.severity)
|
|
51
|
+
|
|
52
|
+
penalty = weighted_sum / normalization
|
|
53
|
+
final_score = max(0, base_score - penalty)
|
|
54
|
+
final_score = round(final_score, 1)
|
|
55
|
+
|
|
56
|
+
return final_score
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Example**:
|
|
60
|
+
|
|
61
|
+
| Findings | Files Scanned | Weighted Sum | Penalty | Score |
|
|
62
|
+
|----------|--------------|--------------|---------|-------|
|
|
63
|
+
| 1 critical | 50 | 10 | 0.2 | 9.8 |
|
|
64
|
+
| 2 critical, 3 high | 50 | 41 | 0.82 | 9.2 |
|
|
65
|
+
| 5 critical, 10 high | 50 | 120 | 2.4 | 7.6 |
|
|
66
|
+
| 10 critical, 20 high, 15 medium | 100 | 300 | 3.0 | 7.0 |
|
|
67
|
+
| 20 critical | 20 | 200 | 10.0 | 0.0 |
|
|
68
|
+
|
|
69
|
+
## Quality Gates
|
|
70
|
+
|
|
71
|
+
### Daily Quick-Scan Gate
|
|
72
|
+
|
|
73
|
+
Applies to Phase 1 (Supply Chain Scan) only.
|
|
74
|
+
|
|
75
|
+
| Result | Condition | Action |
|
|
76
|
+
|--------|-----------|--------|
|
|
77
|
+
| **PASS** | score >= 8.0 | Continue. No blocking issues. |
|
|
78
|
+
| **WARN** | 6.0 <= score < 8.0 | Log warning. Review findings before deploy. |
|
|
79
|
+
| **FAIL** | score < 6.0 | Block deployment. Remediate critical/high findings. |
|
|
80
|
+
|
|
81
|
+
### Comprehensive Audit Gate
|
|
82
|
+
|
|
83
|
+
Applies to full audit (all 4 phases).
|
|
84
|
+
|
|
85
|
+
**Initial/Baseline audit** (no previous audit exists):
|
|
86
|
+
|
|
87
|
+
| Result | Condition | Action |
|
|
88
|
+
|--------|-----------|--------|
|
|
89
|
+
| **PASS** | score >= 2.0 | Baseline established. Plan remediation. |
|
|
90
|
+
| **FAIL** | score < 2.0 | Critical exposure. Immediate triage required. |
|
|
91
|
+
|
|
92
|
+
**Subsequent audits** (previous audit exists):
|
|
93
|
+
|
|
94
|
+
| Result | Condition | Action |
|
|
95
|
+
|--------|-----------|--------|
|
|
96
|
+
| **PASS** | score >= previous_score | No regression. Continue improvement. |
|
|
97
|
+
| **WARN** | score within 0.5 of previous | Marginal change. Review new findings. |
|
|
98
|
+
| **FAIL** | score < previous_score - 0.5 | Regression detected. Investigate new findings. |
|
|
99
|
+
|
|
100
|
+
**Production readiness target**: score >= 7.0
|
|
101
|
+
|
|
102
|
+
## Trend Tracking Format
|
|
103
|
+
|
|
104
|
+
Each audit report stores trend data for comparison.
|
|
105
|
+
|
|
106
|
+
```json
|
|
107
|
+
{
|
|
108
|
+
"trend": {
|
|
109
|
+
"current_date": "2026-03-29",
|
|
110
|
+
"current_score": 7.5,
|
|
111
|
+
"previous_date": "2026-03-22",
|
|
112
|
+
"previous_score": 6.8,
|
|
113
|
+
"score_delta": 0.7,
|
|
114
|
+
"new_findings": 2,
|
|
115
|
+
"resolved_findings": 5,
|
|
116
|
+
"direction": "improving",
|
|
117
|
+
"history": [
|
|
118
|
+
{ "date": "2026-03-15", "score": 5.2, "total_findings": 45 },
|
|
119
|
+
{ "date": "2026-03-22", "score": 6.8, "total_findings": 32 },
|
|
120
|
+
{ "date": "2026-03-29", "score": 7.5, "total_findings": 29 }
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Direction values**:
|
|
127
|
+
|
|
128
|
+
| Direction | Condition |
|
|
129
|
+
|-----------|-----------|
|
|
130
|
+
| `improving` | score_delta > 0.5 |
|
|
131
|
+
| `stable` | -0.5 <= score_delta <= 0.5 |
|
|
132
|
+
| `regressing` | score_delta < -0.5 |
|
|
133
|
+
| `baseline` | No previous audit exists |
|
|
134
|
+
|
|
135
|
+
## Finding Deduplication
|
|
136
|
+
|
|
137
|
+
When the same vulnerability appears in multiple phases:
|
|
138
|
+
1. Keep the highest-severity classification
|
|
139
|
+
2. Merge evidence from all phases
|
|
140
|
+
3. Count as a single finding for scoring
|
|
141
|
+
4. Note all phases that detected it
|
|
@@ -0,0 +1,105 @@
|
|
|
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
|
+
allowed-tools: Read, Write, Bash, Glob, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Ship
|
|
8
|
+
|
|
9
|
+
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.
|
|
10
|
+
|
|
11
|
+
## Key Design Principles
|
|
12
|
+
|
|
13
|
+
1. **Phase Gates**: Each phase must pass before the next begins — no shipping broken code
|
|
14
|
+
2. **Multi-Project Support**: Detects npm (package.json), Python (pyproject.toml), and generic (VERSION) projects
|
|
15
|
+
3. **AI-Powered Review**: Uses CCW CLI to run automated code review before release
|
|
16
|
+
4. **Audit Trail**: Each phase produces structured output for traceability
|
|
17
|
+
5. **Safe Defaults**: Warns on risky operations (direct push to main, major version bumps)
|
|
18
|
+
|
|
19
|
+
## Architecture Overview
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
User: "ship" / "release" / "publish"
|
|
23
|
+
|
|
|
24
|
+
v
|
|
25
|
+
┌──────────────────────────────────────────────────────────┐
|
|
26
|
+
│ Phase 1: Pre-Flight Checks │
|
|
27
|
+
│ → git clean? branch ok? tests pass? build ok? │
|
|
28
|
+
│ → Output: preflight-report.json │
|
|
29
|
+
│ → Gate: ALL checks must pass │
|
|
30
|
+
├──────────────────────────────────────────────────────────┤
|
|
31
|
+
│ Phase 2: Code Review │
|
|
32
|
+
│ → detect merge base, diff against base │
|
|
33
|
+
│ → ccw cli --tool gemini --mode analysis │
|
|
34
|
+
│ → flag high-risk changes │
|
|
35
|
+
│ → Output: review-summary │
|
|
36
|
+
│ → Gate: No critical issues flagged │
|
|
37
|
+
├──────────────────────────────────────────────────────────┤
|
|
38
|
+
│ Phase 3: Version Bump │
|
|
39
|
+
│ → detect version file (package.json/pyproject.toml/VERSION)
|
|
40
|
+
│ → determine bump type from commits or user input │
|
|
41
|
+
│ → update version file │
|
|
42
|
+
│ → Output: version change record │
|
|
43
|
+
│ → Gate: Version updated successfully │
|
|
44
|
+
├──────────────────────────────────────────────────────────┤
|
|
45
|
+
│ Phase 4: Changelog & Commit │
|
|
46
|
+
│ → generate changelog from git log since last tag │
|
|
47
|
+
│ → update CHANGELOG.md │
|
|
48
|
+
│ → create release commit, push to remote │
|
|
49
|
+
│ → Output: commit SHA │
|
|
50
|
+
│ → Gate: Push successful │
|
|
51
|
+
├──────────────────────────────────────────────────────────┤
|
|
52
|
+
│ Phase 5: PR Creation │
|
|
53
|
+
│ → gh pr create with structured body │
|
|
54
|
+
│ → auto-link issues from commits │
|
|
55
|
+
│ → Output: PR URL │
|
|
56
|
+
│ → Gate: PR created │
|
|
57
|
+
└──────────────────────────────────────────────────────────┘
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Execution Flow
|
|
61
|
+
|
|
62
|
+
Execute phases sequentially. Each phase has a gate condition — if the gate fails, stop and report status.
|
|
63
|
+
|
|
64
|
+
1. **Phase 1**: [Pre-Flight Checks](phases/01-preflight-checks.md) -- Validate git state, branch, tests, build
|
|
65
|
+
2. **Phase 2**: [Code Review](phases/02-code-review.md) -- AI-powered diff review with risk assessment
|
|
66
|
+
3. **Phase 3**: [Version Bump](phases/03-version-bump.md) -- Detect and update version across project types
|
|
67
|
+
4. **Phase 4**: [Changelog & Commit](phases/04-changelog-commit.md) -- Generate changelog, create release commit, push
|
|
68
|
+
5. **Phase 5**: [PR Creation](phases/05-pr-creation.md) -- Create PR with structured body and issue links
|
|
69
|
+
|
|
70
|
+
## Pre-Flight Checklist (Quick Reference)
|
|
71
|
+
|
|
72
|
+
| Check | Command | Pass Condition |
|
|
73
|
+
|-------|---------|----------------|
|
|
74
|
+
| Git clean | `git status --porcelain` | Empty output |
|
|
75
|
+
| Branch | `git branch --show-current` | Not main/master |
|
|
76
|
+
| Tests | `npm test` / `pytest` | Exit code 0 |
|
|
77
|
+
| Build | `npm run build` / `python -m build` | Exit code 0 |
|
|
78
|
+
|
|
79
|
+
## Completion Status Protocol
|
|
80
|
+
|
|
81
|
+
This skill follows the Completion Status Protocol defined in [SKILL-DESIGN-SPEC.md sections 13-14](../_shared/SKILL-DESIGN-SPEC.md#13-completion-status-protocol).
|
|
82
|
+
|
|
83
|
+
Every execution terminates with one of:
|
|
84
|
+
|
|
85
|
+
| Status | When |
|
|
86
|
+
|--------|------|
|
|
87
|
+
| **DONE** | All 5 phases completed, PR created |
|
|
88
|
+
| **DONE_WITH_CONCERNS** | PR created but with review warnings or non-critical issues |
|
|
89
|
+
| **BLOCKED** | A gate failed (dirty git, tests fail, push rejected) |
|
|
90
|
+
| **NEEDS_CONTEXT** | Cannot determine bump type, ambiguous branch target |
|
|
91
|
+
|
|
92
|
+
### Escalation
|
|
93
|
+
|
|
94
|
+
Follows the Three-Strike Rule (SKILL-DESIGN-SPEC section 14). On 3 consecutive failures at the same step, stop and output diagnostic dump.
|
|
95
|
+
|
|
96
|
+
## Reference Documents
|
|
97
|
+
|
|
98
|
+
| Document | Purpose |
|
|
99
|
+
|----------|---------|
|
|
100
|
+
| [phases/01-preflight-checks.md](phases/01-preflight-checks.md) | Git, branch, test, build validation |
|
|
101
|
+
| [phases/02-code-review.md](phases/02-code-review.md) | AI-powered diff review |
|
|
102
|
+
| [phases/03-version-bump.md](phases/03-version-bump.md) | Version detection and bump |
|
|
103
|
+
| [phases/04-changelog-commit.md](phases/04-changelog-commit.md) | Changelog generation and release commit |
|
|
104
|
+
| [phases/05-pr-creation.md](phases/05-pr-creation.md) | PR creation with issue linking |
|
|
105
|
+
| [../_shared/SKILL-DESIGN-SPEC.md](../_shared/SKILL-DESIGN-SPEC.md) | Skill design spec (completion protocol, escalation) |
|