codymaster 4.1.0
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/CHANGELOG.md +50 -0
- package/README.md +285 -0
- package/adapters/antigravity.js +15 -0
- package/adapters/claude-code.js +17 -0
- package/adapters/cursor.js +16 -0
- package/commands/bootstrap.md +49 -0
- package/commands/build.md +48 -0
- package/commands/content.md +48 -0
- package/commands/continuity.md +60 -0
- package/commands/debug.md +51 -0
- package/commands/demo.md +96 -0
- package/commands/deploy.md +51 -0
- package/commands/plan.md +42 -0
- package/commands/review.md +55 -0
- package/commands/track.md +46 -0
- package/commands/ux.md +46 -0
- package/dist/agent-dispatch.js +161 -0
- package/dist/chains/builtin.js +85 -0
- package/dist/continuity.js +385 -0
- package/dist/dashboard.js +926 -0
- package/dist/data.js +122 -0
- package/dist/index.js +2434 -0
- package/dist/judge.js +252 -0
- package/dist/parallel-dispatch.js +359 -0
- package/dist/parallel-quality.js +172 -0
- package/dist/skill-chain.js +258 -0
- package/install.sh +513 -0
- package/package.json +79 -0
- package/skills/.content-factory-state.json +132 -0
- package/skills/.git 2/logs/refs/heads/main +1 -0
- package/skills/.git 2/logs/refs/remotes/origin/main +1 -0
- package/skills/.git 2/objects/02/fb0956734b5f8ba3f918b7defd04a89cfe0076 +0 -0
- package/skills/.git 2/objects/08/1e129d75dc6feac6c02037272e6bd1a04e3324 +0 -0
- package/skills/.git 2/objects/0c/5393416f3c5e01c9a655a802bff0dd52f76f0a +0 -0
- package/skills/.git 2/objects/10/0b9be46978a946a77188f68be725098a122001 +0 -0
- package/skills/.git 2/objects/10/cf041167fc9843610eb3d90259ef3396315fdc +0 -0
- package/skills/.git 2/objects/12/5e19538dd6e1338ffe74f6c4c165b00435bf48 +0 -0
- package/skills/.git 2/objects/16/a9b9d0088d5c1347628b45a2620b479d8ad57c +0 -0
- package/skills/.git 2/objects/17/8c2a9ef93c33ae4eec9d58e82321f9229843a1 +0 -0
- package/skills/.git 2/objects/25/397ae41d09104d763bdcac2695209d85cdea89 +0 -0
- package/skills/.git 2/objects/2f/a836b7947f2d458e1f639788bf4bb0983a3305 +0 -0
- package/skills/.git 2/objects/3a/baaaf0a1c0909c0828335791557125fba911e0 +0 -0
- package/skills/.git 2/objects/42/2924221b81f5ce3c4e4daac9a64a24f9b01f9a +0 -0
- package/skills/.git 2/objects/42/ec0ce707447dc11446a34c9995fb8533801731 +0 -0
- package/skills/.git 2/objects/46/e43ce92866d56ce74b1d750db307cfe6154a15 +0 -0
- package/skills/.git 2/objects/48/5e41b633c63f55b8277bcc59f44f67681f671a +0 -0
- package/skills/.git 2/objects/49/49c596a3a89fa240642acd95dd3258e261eb09 +0 -0
- package/skills/.git 2/objects/50/9d42d8412ef8eaf7f7e138476bac2e4d10ce60 +0 -0
- package/skills/.git 2/objects/55/0c8c389d981b463ef849aeb792d8be3ccb6ec8 +0 -0
- package/skills/.git 2/objects/5d/82d3b18410cdda3ace3677436f0cb599dbe2d2 +0 -0
- package/skills/.git 2/objects/60/0617c58e871a38b33bf29e282d132bb3c381ad +0 -0
- package/skills/.git 2/objects/6a/8369a99c687b7245c92ffaf0e0f0dab9014504 +0 -0
- package/skills/.git 2/objects/79/bea435d40ab531c1aaf6be0432c6a5b7aaed21 +0 -0
- package/skills/.git 2/objects/7e/5ebd79251c2f14e4aceb86c74b6b6daae6b500 +0 -0
- package/skills/.git 2/objects/81/98a822a60178d6d5023ddb3e222cddf048742e +0 -0
- package/skills/.git 2/objects/86/0a0e1943dfe53411d2e499a1f16f46a96ef758 +0 -0
- package/skills/.git 2/objects/86/971fb55fdc081fdbae52376f0f13e57a4e9b04 +0 -0
- package/skills/.git 2/objects/88/b89dd609a0a03f8d4fe8bfde20d5b8fc1d326d +0 -0
- package/skills/.git 2/objects/90/8737edb6b7809e32cc01590b4e08ba42a9d40d +0 -0
- package/skills/.git 2/objects/93/d5a8a9a7d4fb7f11491cb596a6880528725118 +0 -0
- package/skills/.git 2/objects/98/46a2ab81d0c3b3eb00ef88fc56989aa7e9f316 +0 -0
- package/skills/.git 2/objects/9b/d8dd1e49cf274eaf9c555f3ab39dce7af5715e +0 -0
- package/skills/.git 2/objects/a1/13329fb0cec96ae78b222d33a24c3b5bc7fa1f +0 -0
- package/skills/.git 2/objects/a9/e6effe626e8a3aea3a8fc3364b492191c6e7d0 +0 -0
- package/skills/.git 2/objects/ad/6de7e48d9782cca9353d1ff0aa1aab7fe1df85 +0 -0
- package/skills/.git 2/objects/af/54ae316f771ff692e299ffcd8bf2f06b413b59 +0 -0
- package/skills/.git 2/objects/b0/4cb8b0b00dad633e731c1472161419e738d674 +0 -0
- package/skills/.git 2/objects/b3/094abb0b9ed46419b269e4a4e36a459690e3b0 +0 -0
- package/skills/.git 2/objects/b9/435c5d4baac2cfc5c83009ddd27b46b60db5f1 +0 -0
- package/skills/.git 2/objects/ba/5da17dbaec5ec2dcfdfd126aead518d1171d5c +0 -0
- package/skills/.git 2/objects/c0/bf58703aa258ba5dd63083bebaec8f223d844c +0 -0
- package/skills/.git 2/objects/c4/701a34edf1fc1bad58ccc57bd03f9426acb59a +0 -0
- package/skills/.git 2/objects/c7/5ccce9a4e5cc74d9b3174550cf6d993ca43638 +0 -0
- package/skills/.git 2/objects/c7/710d59b5a35b0f1f0a0399386643a0bd94c929 +0 -0
- package/skills/.git 2/objects/d1/fe58237112e953e5fec52da22cf38e08be3df9 +5 -0
- package/skills/.git 2/objects/d2/2bbe9fd2f74c95bc5583e803f5e435f1e2cd86 +0 -0
- package/skills/.git 2/objects/d7/e72852ea2bff74581dbf247d400120086229f4 +0 -0
- package/skills/.git 2/objects/d8/d4c3b5553e4fd72807e1d4b49ef07d9ef3ac35 +0 -0
- package/skills/.git 2/objects/dc/75050c2876f6a02ae2a53a3c886f395b622977 +0 -0
- package/skills/.git 2/objects/ee/e8546f95acec500187c08a28a8b9ee02db0dec +0 -0
- package/skills/.git 2/objects/ef/263c059208b416c2146434f10cb2b9fabcba16 +0 -0
- package/skills/.git 2/objects/f3/ae597e84d9a59b88acd21c99bde2eaf686d785 +0 -0
- package/skills/.git 2/objects/f3/f6f5673c821d3d8e76fa267a9e882e7a5387ea +0 -0
- package/skills/.git 2/objects/f9/6e6d0ad02624dd11d5848594d056caef7a5e8b +0 -0
- package/skills/.git 2/objects/ff/278988fc1edf0db3abcf18de795f4cc0b4f3e1 +0 -0
- package/skills/.git 2/refs/heads/main +1 -0
- package/skills/.git 2/refs/remotes/origin/main +1 -0
- package/skills/.pytest_cache 2/v/cache/nodeids +76 -0
- package/skills/.pytest_cache 2/v/cache/stepwise +1 -0
- package/skills/_shared/helpers.md +123 -0
- package/skills/_shared/outputs-convention.md +24 -0
- package/skills/cm-ads-tracker/SKILL.md +109 -0
- package/skills/cm-ads-tracker/evals/evals.json +55 -0
- package/skills/cm-ads-tracker/references/gtm-architecture.md +321 -0
- package/skills/cm-ads-tracker/references/industry-events.md +294 -0
- package/skills/cm-ads-tracker/references/platforms-api.md +238 -0
- package/skills/cm-ads-tracker/templates/capi-payload.md +79 -0
- package/skills/cm-ads-tracker/templates/datalayer-push.js +104 -0
- package/skills/cm-ads-tracker/templates/gtm-variables.js +56 -0
- package/skills/cm-brainstorm-idea/SKILL.md +423 -0
- package/skills/cm-code-review/SKILL.md +151 -0
- package/skills/cm-content-factory/SKILL.md +416 -0
- package/skills/cm-continuity/SKILL.md +399 -0
- package/skills/cm-dashboard/SKILL.md +533 -0
- package/skills/cm-dashboard/ui/app.js +1270 -0
- package/skills/cm-dashboard/ui/index.html +206 -0
- package/skills/cm-dashboard/ui/style.css +440 -0
- package/skills/cm-debugging/SKILL.md +412 -0
- package/skills/cm-deep-search/SKILL.md +242 -0
- package/skills/cm-design-system/SKILL.md +97 -0
- package/skills/cm-design-system/resources/halo-modern.md +40 -0
- package/skills/cm-design-system/resources/lunaris-advanced.md +40 -0
- package/skills/cm-design-system/resources/nitro-enterprise.md +39 -0
- package/skills/cm-design-system/resources/shadcn-default.md +37 -0
- package/skills/cm-dockit/README.md +100 -0
- package/skills/cm-dockit/SKILL.md +302 -0
- package/skills/cm-dockit/index.html +443 -0
- package/skills/cm-dockit/package-lock.json +1850 -0
- package/skills/cm-dockit/package.json +14 -0
- package/skills/cm-dockit/prompts/analysis.md +34 -0
- package/skills/cm-dockit/prompts/api-reference.md +24 -0
- package/skills/cm-dockit/prompts/architecture.md +21 -0
- package/skills/cm-dockit/prompts/data-flow.md +20 -0
- package/skills/cm-dockit/prompts/database.md +21 -0
- package/skills/cm-dockit/prompts/deployment.md +22 -0
- package/skills/cm-dockit/prompts/flows.md +21 -0
- package/skills/cm-dockit/prompts/jtbd.md +20 -0
- package/skills/cm-dockit/prompts/personas.md +24 -0
- package/skills/cm-dockit/prompts/sop-modules.md +40 -0
- package/skills/cm-dockit/scripts/doc-gen.sh +121 -0
- package/skills/cm-dockit/scripts/dockit-dashboard.sh +142 -0
- package/skills/cm-dockit/scripts/dockit-runner.sh +607 -0
- package/skills/cm-dockit/scripts/dockit-task.sh +166 -0
- package/skills/cm-dockit/skills/analyze-codebase.md +174 -0
- package/skills/cm-dockit/skills/api-reference.md +237 -0
- package/skills/cm-dockit/skills/changelog-guide.md +195 -0
- package/skills/cm-dockit/skills/content-guidelines.md +190 -0
- package/skills/cm-dockit/skills/sop-guide.md +184 -0
- package/skills/cm-dockit/skills/tech-docs.md +287 -0
- package/skills/cm-dockit/templates/markdown/structure.md +60 -0
- package/skills/cm-dockit/templates/vitepress-premium/.vitepress/config.mts +110 -0
- package/skills/cm-dockit/templates/vitepress-premium/.vitepress/theme/custom.css +189 -0
- package/skills/cm-dockit/templates/vitepress-premium/.vitepress/theme/index.ts +4 -0
- package/skills/cm-dockit/templates/vitepress-premium/package.json +19 -0
- package/skills/cm-dockit/templates/vitepress-premium/tests/frontend.test.ts +45 -0
- package/skills/cm-dockit/tests/runner.test.ts +66 -0
- package/skills/cm-dockit/workflows/export-markdown.md +82 -0
- package/skills/cm-dockit/workflows/generate-docs.md +68 -0
- package/skills/cm-dockit/workflows/setup-vitepress.md +181 -0
- package/skills/cm-example/SKILL.md +26 -0
- package/skills/cm-execution/SKILL.md +268 -0
- package/skills/cm-git-worktrees/SKILL.md +164 -0
- package/skills/cm-how-it-work/SKILL.md +189 -0
- package/skills/cm-identity-guard/SKILL.md +412 -0
- package/skills/cm-jtbd/SKILL.md +98 -0
- package/skills/cm-planning/SKILL.md +130 -0
- package/skills/cm-project-bootstrap/SKILL.md +161 -0
- package/skills/cm-project-bootstrap/templates/AGENTS.md +42 -0
- package/skills/cm-project-bootstrap/templates/frontend-safety.test.js +51 -0
- package/skills/cm-project-bootstrap/templates/i18n-sync.test.js +38 -0
- package/skills/cm-project-bootstrap/templates/pr-template.md +12 -0
- package/skills/cm-project-bootstrap/templates/project-identity.json +29 -0
- package/skills/cm-project-bootstrap/templates/vitest.config.js +10 -0
- package/skills/cm-quality-gate/SKILL.md +218 -0
- package/skills/cm-readit/SKILL.md +289 -0
- package/skills/cm-readit/audio-player.md +206 -0
- package/skills/cm-readit/examples/blog-reader.js +352 -0
- package/skills/cm-readit/examples/voice-cro.js +390 -0
- package/skills/cm-readit/tts-engine.md +262 -0
- package/skills/cm-readit/ui-patterns.md +362 -0
- package/skills/cm-readit/voice-cro.md +223 -0
- package/skills/cm-safe-deploy/SKILL.md +120 -0
- package/skills/cm-safe-deploy/templates/deploy.sh +89 -0
- package/skills/cm-safe-i18n/SKILL.md +473 -0
- package/skills/cm-secret-shield/SKILL.md +580 -0
- package/skills/cm-skill-chain/SKILL.md +78 -0
- package/skills/cm-skill-index/SKILL.md +318 -0
- package/skills/cm-skill-mastery/SKILL.md +169 -0
- package/skills/cm-start/SKILL.md +65 -0
- package/skills/cm-status/SKILL.md +12 -0
- package/skills/cm-tdd/SKILL.md +370 -0
- package/skills/cm-terminal/SKILL.md +177 -0
- package/skills/cm-test-gate/SKILL.md +242 -0
- package/skills/cm-ui-preview/SKILL.md +291 -0
- package/skills/cm-ux-master/DESIGN_STANDARD_TEMPLATE.md +54 -0
- package/skills/cm-ux-master/SKILL.md +114 -0
- package/skills/cro-methodology/SKILL.md +98 -0
- package/skills/cro-methodology/references/COPYWRITING.md +178 -0
- package/skills/cro-methodology/references/OBJECTIONS.md +135 -0
- package/skills/cro-methodology/references/PERSUASION.md +158 -0
- package/skills/cro-methodology/references/RESEARCH.md +220 -0
- package/skills/cro-methodology/references/funnel-analysis.md +365 -0
- package/skills/cro-methodology/references/testing-methodology.md +330 -0
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cm-secret-shield
|
|
3
|
+
description: "Defense-in-depth security for AI-assisted development. Pre-commit secret scanning (Gitleaks + native fallback), repo-wide pattern detection, token lifecycle management, and AI agent safety rules. Prevents secret leaks at every stage: write → commit → push → deploy. Use BEFORE any git push or deploy, or when setting up new projects."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 🛡️ Secret Shield — Defense-in-Depth Security
|
|
7
|
+
|
|
8
|
+
> **Secrets leak at FIVE stages. Guard ALL five.**
|
|
9
|
+
> Write → Commit → Push → Deploy → Runtime
|
|
10
|
+
> One missed stage = one leaked key = one compromised system.
|
|
11
|
+
|
|
12
|
+
## The Iron Laws
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
NEVER commit secrets. EVER.
|
|
16
|
+
NEVER output secrets in logs, chat, or AI responses.
|
|
17
|
+
NEVER trust .gitignore alone — it doesn't protect git history.
|
|
18
|
+
PRE-COMMIT HOOKS are your FIRST line of defense.
|
|
19
|
+
ROTATION is not optional after a leak.
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## When to Use
|
|
23
|
+
|
|
24
|
+
**ALWAYS** when:
|
|
25
|
+
- Setting up a new project (called by `cm-project-bootstrap` Phase 0.5)
|
|
26
|
+
- Before first `git push` on any project
|
|
27
|
+
- After discovering a potential secret leak
|
|
28
|
+
- Setting up CI/CD pipelines
|
|
29
|
+
- Reviewing security posture of existing projects
|
|
30
|
+
- User says: "check secrets", "security audit", "leaked key", "rotate token"
|
|
31
|
+
|
|
32
|
+
**Integrates with:**
|
|
33
|
+
- `cm-project-bootstrap` — Security Foundation phase
|
|
34
|
+
- `cm-safe-deploy` — Gate 0 enhanced secret hygiene
|
|
35
|
+
- `cm-test-gate` — Layer 5 security scan
|
|
36
|
+
- `cm-identity-guard` — Token lifecycle management
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## The 5 Defense Layers
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
┌─────────────────────────────────────────────────────────┐
|
|
44
|
+
│ Layer 1: WRITE GUARD — AI agent behavior rules │
|
|
45
|
+
│ Layer 2: PRE-COMMIT GUARD — Block secrets at commit │
|
|
46
|
+
│ Layer 3: REPO SCAN — Full repo pattern check │
|
|
47
|
+
│ Layer 4: DEPLOY GATE — Pre-deploy secret audit │
|
|
48
|
+
│ Layer 5: RUNTIME GUARD — Env var hygiene & rotation│
|
|
49
|
+
└─────────────────────────────────────────────────────────┘
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Layer 1: Write Guard — AI Agent Safety Rules
|
|
55
|
+
|
|
56
|
+
> **Goal:** Prevent the AI agent itself from introducing secrets into code.
|
|
57
|
+
|
|
58
|
+
### Rules for AI Agents
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
✅ DO:
|
|
62
|
+
- Use environment variables: process.env.SECRET_KEY
|
|
63
|
+
- Use .dev.vars for local development
|
|
64
|
+
- Use platform-specific secret stores: wrangler secret put, Supabase vault
|
|
65
|
+
- Mask secrets in logs: console.log('Key:', key.slice(0,4) + '***')
|
|
66
|
+
- Reference secret NAMES, not VALUES
|
|
67
|
+
|
|
68
|
+
❌ NEVER:
|
|
69
|
+
- Hardcode API keys, tokens, or passwords in source code
|
|
70
|
+
- Put secrets in wrangler.jsonc, package.json, or any tracked file
|
|
71
|
+
- Output full secret values in chat, logs, or error messages
|
|
72
|
+
- Use placeholder secrets that look real (e.g., sk-1234567890abcdef)
|
|
73
|
+
- Store secrets in i18n files, README, or documentation
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Secret Patterns to NEVER Generate
|
|
77
|
+
|
|
78
|
+
```javascript
|
|
79
|
+
// ❌ NEVER write code like this:
|
|
80
|
+
const API_KEY = "sk-proj-abc123def456ghi789";
|
|
81
|
+
const SUPABASE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
|
|
82
|
+
const DB_PASSWORD = "MyP@ssw0rd123!";
|
|
83
|
+
fetch('https://api.example.com', { headers: { Authorization: 'Bearer sk-...' } });
|
|
84
|
+
|
|
85
|
+
// ✅ ALWAYS write code like this:
|
|
86
|
+
const API_KEY = process.env.API_KEY;
|
|
87
|
+
const SUPABASE_KEY = process.env.SUPABASE_ANON_KEY;
|
|
88
|
+
// For Cloudflare Workers:
|
|
89
|
+
export default { async fetch(req, env) { const key = env.API_KEY; } };
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Layer 2: Pre-Commit Guard — Block Secrets at Commit
|
|
95
|
+
|
|
96
|
+
> **Goal:** Automatically scan staged files BEFORE they enter git history.
|
|
97
|
+
|
|
98
|
+
### Option A: Gitleaks (Recommended — Industry Standard)
|
|
99
|
+
|
|
100
|
+
#### Step 1: Install Gitleaks
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# macOS
|
|
104
|
+
brew install gitleaks
|
|
105
|
+
|
|
106
|
+
# Linux
|
|
107
|
+
# Download from https://github.com/gitleaks/gitleaks/releases
|
|
108
|
+
|
|
109
|
+
# Verify installation
|
|
110
|
+
gitleaks version
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
#### Step 2: Create `.gitleaks.toml` (Project Root)
|
|
114
|
+
|
|
115
|
+
```toml
|
|
116
|
+
# .gitleaks.toml — CodyMaster Secret Shield Configuration
|
|
117
|
+
title = "CM Secret Shield — Gitleaks Config"
|
|
118
|
+
|
|
119
|
+
# Extend default rules (catches 100+ known patterns)
|
|
120
|
+
[extend]
|
|
121
|
+
useDefault = true
|
|
122
|
+
|
|
123
|
+
# Custom rules for CodyMaster projects
|
|
124
|
+
[[rules]]
|
|
125
|
+
id = "supabase-service-key"
|
|
126
|
+
description = "Supabase Service Role Key"
|
|
127
|
+
regex = '''eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+'''
|
|
128
|
+
tags = ["supabase", "jwt"]
|
|
129
|
+
|
|
130
|
+
[[rules]]
|
|
131
|
+
id = "cloudflare-api-token"
|
|
132
|
+
description = "Cloudflare API Token"
|
|
133
|
+
regex = '''[A-Za-z0-9_-]{40}'''
|
|
134
|
+
entropy = 4.5
|
|
135
|
+
secretGroup = 0
|
|
136
|
+
tags = ["cloudflare"]
|
|
137
|
+
|
|
138
|
+
[[rules]]
|
|
139
|
+
id = "generic-high-entropy"
|
|
140
|
+
description = "High entropy string that may be a secret"
|
|
141
|
+
regex = '''(?i)(api[_-]?key|secret[_-]?key|access[_-]?token|private[_-]?key|auth[_-]?token)\s*[=:]\s*['"][a-zA-Z0-9/+=]{20,}['"]'''
|
|
142
|
+
tags = ["generic"]
|
|
143
|
+
|
|
144
|
+
# Allow patterns (reduce false positives)
|
|
145
|
+
[allowlist]
|
|
146
|
+
paths = [
|
|
147
|
+
'''\.gitleaks\.toml$''',
|
|
148
|
+
'''\.dev\.vars\.example$''',
|
|
149
|
+
'''node_modules/''',
|
|
150
|
+
'''dist/''',
|
|
151
|
+
'''\.git/'''
|
|
152
|
+
]
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### Step 3: Setup Git Pre-Commit Hook
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# Create the hook
|
|
159
|
+
cat > .git/hooks/pre-commit << 'EOF'
|
|
160
|
+
#!/bin/bash
|
|
161
|
+
# CM Secret Shield — Pre-Commit Guard
|
|
162
|
+
# Scans staged files for secrets before allowing commit
|
|
163
|
+
|
|
164
|
+
echo "🛡️ Secret Shield: scanning staged files..."
|
|
165
|
+
|
|
166
|
+
# Check if gitleaks is installed
|
|
167
|
+
if command -v gitleaks >/dev/null 2>&1; then
|
|
168
|
+
gitleaks git --pre-commit --staged --verbose
|
|
169
|
+
if [ $? -ne 0 ]; then
|
|
170
|
+
echo ""
|
|
171
|
+
echo "❌ SECRET DETECTED! Commit blocked."
|
|
172
|
+
echo ""
|
|
173
|
+
echo "To fix:"
|
|
174
|
+
echo " 1. Remove the secret from your code"
|
|
175
|
+
echo " 2. Use environment variables instead"
|
|
176
|
+
echo " 3. If false positive: add to .gitleaks.toml allowlist"
|
|
177
|
+
echo ""
|
|
178
|
+
echo "To bypass (DANGEROUS): git commit --no-verify"
|
|
179
|
+
exit 1
|
|
180
|
+
fi
|
|
181
|
+
echo "✅ Secret Shield: no secrets detected"
|
|
182
|
+
else
|
|
183
|
+
# Fallback: basic pattern check without gitleaks
|
|
184
|
+
echo "⚠️ Gitleaks not installed. Running basic checks..."
|
|
185
|
+
STAGED=$(git diff --cached --name-only --diff-filter=ACM)
|
|
186
|
+
PATTERNS="SERVICE_KEY|ANON_KEY|PRIVATE_KEY|DB_PASSWORD|SECRET_KEY|API_SECRET|sk-[a-zA-Z0-9]{20,}|-----BEGIN.*KEY-----"
|
|
187
|
+
|
|
188
|
+
for file in $STAGED; do
|
|
189
|
+
if echo "$file" | grep -qE '\.(js|ts|jsx|tsx|json|toml|yaml|yml|env|cfg|conf|ini)$'; then
|
|
190
|
+
if git diff --cached "$file" | grep -qE "$PATTERNS"; then
|
|
191
|
+
echo "❌ Potential secret found in: $file"
|
|
192
|
+
echo " Run: git diff --cached $file | grep -E '$PATTERNS'"
|
|
193
|
+
exit 1
|
|
194
|
+
fi
|
|
195
|
+
fi
|
|
196
|
+
done
|
|
197
|
+
echo "✅ Basic check passed (install gitleaks for deeper scanning)"
|
|
198
|
+
fi
|
|
199
|
+
EOF
|
|
200
|
+
|
|
201
|
+
chmod +x .git/hooks/pre-commit
|
|
202
|
+
echo "✅ Pre-commit hook installed"
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Option B: Native Git Hook Only (No Dependencies)
|
|
206
|
+
|
|
207
|
+
For projects that can't install Gitleaks, the basic pattern check in the hook above works as a fallback.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Layer 3: Repo Scan — Full Repository Audit
|
|
212
|
+
|
|
213
|
+
> **Goal:** Scan the entire repository for secrets that may have been committed before the pre-commit hook was set up.
|
|
214
|
+
|
|
215
|
+
### Quick Scan Script
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
# scripts/security-scan.js — Repo-wide secret detection
|
|
219
|
+
node -e "
|
|
220
|
+
const fs = require('fs');
|
|
221
|
+
const path = require('path');
|
|
222
|
+
|
|
223
|
+
const DANGEROUS_PATTERNS = [
|
|
224
|
+
{ name: 'Service Key Variable', regex: /(?:SERVICE_KEY|SERVICE_ROLE)\s*[=:]\s*['\"][a-zA-Z0-9._\/-]{20,}/g },
|
|
225
|
+
{ name: 'Anon Key Variable', regex: /ANON_KEY\s*[=:]\s*['\"][a-zA-Z0-9._\/-]{20,}/g },
|
|
226
|
+
{ name: 'Private Key Block', regex: /-----BEGIN\s+(RSA|EC|DSA|OPENSSH)?\s*PRIVATE KEY-----/g },
|
|
227
|
+
{ name: 'JWT Token', regex: /eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g },
|
|
228
|
+
{ name: 'Generic API Key', regex: /(?:api[_-]?key|api[_-]?secret|access[_-]?token)\s*[=:]\s*['\"][a-zA-Z0-9\/+=]{20,}['\"/]/gi },
|
|
229
|
+
{ name: 'AWS Key', regex: /AKIA[0-9A-Z]{16}/g },
|
|
230
|
+
{ name: 'Slack Token', regex: /xox[baprs]-[0-9a-zA-Z-]{10,}/g },
|
|
231
|
+
{ name: 'GitHub Token', regex: /gh[ps]_[a-zA-Z0-9]{36,}/g },
|
|
232
|
+
{ name: 'Stripe Key', regex: /[sr]k_(test|live)_[a-zA-Z0-9]{20,}/g },
|
|
233
|
+
{ name: 'DB Password', regex: /(?:DB_PASSWORD|DATABASE_URL)\s*[=:]\s*['\"][^'\"]{8,}/gi },
|
|
234
|
+
];
|
|
235
|
+
|
|
236
|
+
const SKIP_DIRS = ['node_modules', '.git', 'dist', '.wrangler', '.next', 'coverage'];
|
|
237
|
+
const SCAN_EXTS = ['.js', '.ts', '.jsx', '.tsx', '.json', '.toml', '.yaml', '.yml',
|
|
238
|
+
'.env', '.cfg', '.conf', '.ini', '.md', '.html', '.jsonc'];
|
|
239
|
+
|
|
240
|
+
let findings = [];
|
|
241
|
+
|
|
242
|
+
function scanDir(dir) {
|
|
243
|
+
try {
|
|
244
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
245
|
+
for (const entry of entries) {
|
|
246
|
+
if (SKIP_DIRS.includes(entry.name)) continue;
|
|
247
|
+
const fullPath = path.join(dir, entry.name);
|
|
248
|
+
if (entry.isDirectory()) {
|
|
249
|
+
scanDir(fullPath);
|
|
250
|
+
} else if (entry.isFile() && SCAN_EXTS.some(ext => entry.name.endsWith(ext))) {
|
|
251
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
252
|
+
for (const pattern of DANGEROUS_PATTERNS) {
|
|
253
|
+
const matches = content.match(pattern.regex);
|
|
254
|
+
if (matches) {
|
|
255
|
+
findings.push({ file: fullPath, pattern: pattern.name, count: matches.length });
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
} catch (e) { /* skip unreadable dirs */ }
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
scanDir('.');
|
|
264
|
+
|
|
265
|
+
if (findings.length > 0) {
|
|
266
|
+
console.error('❌ SECRET SCAN FOUND ' + findings.length + ' POTENTIAL ISSUES:');
|
|
267
|
+
findings.forEach(f => {
|
|
268
|
+
console.error(' ⚠ ' + f.file + ' — ' + f.pattern + ' (' + f.count + ' match(es))');
|
|
269
|
+
});
|
|
270
|
+
console.error('');
|
|
271
|
+
console.error('Actions:');
|
|
272
|
+
console.error(' 1. Review each finding — some may be false positives');
|
|
273
|
+
console.error(' 2. Move real secrets to .dev.vars (local) or platform secrets (production)');
|
|
274
|
+
console.error(' 3. If secret was committed, rotate it IMMEDIATELY');
|
|
275
|
+
process.exit(1);
|
|
276
|
+
} else {
|
|
277
|
+
console.log('✅ Repo scan: no secrets detected in ' + SCAN_EXTS.length + ' file types');
|
|
278
|
+
}
|
|
279
|
+
"
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Add to package.json
|
|
283
|
+
|
|
284
|
+
```json
|
|
285
|
+
{
|
|
286
|
+
"scripts": {
|
|
287
|
+
"security:scan": "node scripts/security-scan.js",
|
|
288
|
+
"security:precommit": "gitleaks git --pre-commit --staged || echo 'Install gitleaks for deep scan'"
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Layer 4: Deploy Gate — Pre-Deploy Secret Audit
|
|
296
|
+
|
|
297
|
+
> **Goal:** Final check before code leaves the machine. Integrated with `cm-safe-deploy` Gate 0.
|
|
298
|
+
|
|
299
|
+
### Enhanced Gate 0 Check
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
# Run BEFORE deploy — catches what pre-commit might have missed
|
|
303
|
+
node -e "
|
|
304
|
+
const fs = require('fs');
|
|
305
|
+
|
|
306
|
+
// 1. Check tracked files for secrets
|
|
307
|
+
const dangerous = ['SERVICE_KEY', 'ANON_KEY', 'DB_PASSWORD', 'SECRET_KEY',
|
|
308
|
+
'PRIVATE_KEY', 'API_SECRET', 'AUTH_TOKEN'];
|
|
309
|
+
|
|
310
|
+
const filesToCheck = [
|
|
311
|
+
'wrangler.jsonc', 'wrangler.toml', 'wrangler.json',
|
|
312
|
+
'package.json', 'tsconfig.json',
|
|
313
|
+
...fs.readdirSync('src').filter(f => f.endsWith('.ts') || f.endsWith('.js')).map(f => 'src/' + f)
|
|
314
|
+
].filter(f => fs.existsSync(f));
|
|
315
|
+
|
|
316
|
+
let failed = false;
|
|
317
|
+
|
|
318
|
+
for (const file of filesToCheck) {
|
|
319
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
320
|
+
for (const key of dangerous) {
|
|
321
|
+
// Check for actual values (not just variable names)
|
|
322
|
+
const valuePattern = new RegExp(key + '\\\\s*[=:]\\\\s*[\"\\'][a-zA-Z0-9/+=]{20,}', 'g');
|
|
323
|
+
if (valuePattern.test(content)) {
|
|
324
|
+
console.error('❌ DANGER: ' + file + ' contains a ' + key + ' VALUE');
|
|
325
|
+
failed = true;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// 2. Check .gitignore has required patterns
|
|
331
|
+
if (fs.existsSync('.gitignore')) {
|
|
332
|
+
const gitignore = fs.readFileSync('.gitignore', 'utf-8');
|
|
333
|
+
const required = ['.env', '.dev.vars'];
|
|
334
|
+
const missing = required.filter(r => !gitignore.includes(r));
|
|
335
|
+
if (missing.length > 0) {
|
|
336
|
+
console.error('❌ .gitignore missing: ' + missing.join(', '));
|
|
337
|
+
failed = true;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// 3. Check .env files aren't tracked
|
|
342
|
+
const { execSync } = require('child_process');
|
|
343
|
+
try {
|
|
344
|
+
const tracked = execSync('git ls-files', { encoding: 'utf-8' });
|
|
345
|
+
const badFiles = ['.env', '.dev.vars', '.env.local', '.env.production'];
|
|
346
|
+
const trackedBad = badFiles.filter(f => tracked.split('\\n').includes(f));
|
|
347
|
+
if (trackedBad.length > 0) {
|
|
348
|
+
console.error('❌ CRITICAL: Secret files tracked by git: ' + trackedBad.join(', '));
|
|
349
|
+
console.error(' Fix: git rm --cached ' + trackedBad.join(' '));
|
|
350
|
+
failed = true;
|
|
351
|
+
}
|
|
352
|
+
} catch (e) { /* not a git repo */ }
|
|
353
|
+
|
|
354
|
+
if (failed) {
|
|
355
|
+
console.error('\\n🛡️ Secret Shield: Deploy blocked. Fix issues above.');
|
|
356
|
+
process.exit(1);
|
|
357
|
+
}
|
|
358
|
+
console.log('✅ Secret Shield: deploy gate passed');
|
|
359
|
+
"
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Layer 5: Runtime Guard — Token Lifecycle Management
|
|
365
|
+
|
|
366
|
+
> **Goal:** Manage secrets throughout their lifecycle — creation, usage, rotation, revocation.
|
|
367
|
+
|
|
368
|
+
### Token Rotation Schedule
|
|
369
|
+
|
|
370
|
+
| Platform | Token Type | Max Lifetime | Rotation Trigger |
|
|
371
|
+
|----------|-----------|-------------|-----------------|
|
|
372
|
+
| **Supabase** | `anon_key` | 90 days | Dashboard → Settings → API |
|
|
373
|
+
| **Supabase** | `service_role_key` | 30 days | Dashboard → Settings → API |
|
|
374
|
+
| **Cloudflare** | API Token | 90 days | Dashboard → My Profile → API Tokens |
|
|
375
|
+
| **GitHub** | Personal Access Token | 90 days | Settings → Developer Settings → PAT |
|
|
376
|
+
| **GitHub** | Fine-grained Token | 30-90 days | Use expiring tokens when possible |
|
|
377
|
+
| **OpenAI/Gemini** | API Key | 90 days | Rotate in platform dashboard |
|
|
378
|
+
|
|
379
|
+
### Secret Lifecycle File
|
|
380
|
+
|
|
381
|
+
Track secrets in `.secret-lifecycle.json` (add to `.gitignore`!):
|
|
382
|
+
|
|
383
|
+
```json
|
|
384
|
+
{
|
|
385
|
+
"_WARNING": "This file tracks secret metadata ONLY. NEVER put actual values here.",
|
|
386
|
+
"secrets": [
|
|
387
|
+
{
|
|
388
|
+
"name": "SUPABASE_ANON_KEY",
|
|
389
|
+
"platform": "supabase",
|
|
390
|
+
"store": "cloudflare-secrets",
|
|
391
|
+
"createdAt": "2026-03-01",
|
|
392
|
+
"rotateBy": "2026-06-01",
|
|
393
|
+
"lastRotated": "2026-03-01",
|
|
394
|
+
"status": "active"
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"name": "SUPABASE_SERVICE_KEY",
|
|
398
|
+
"platform": "supabase",
|
|
399
|
+
"store": "cloudflare-secrets",
|
|
400
|
+
"createdAt": "2026-03-01",
|
|
401
|
+
"rotateBy": "2026-04-01",
|
|
402
|
+
"lastRotated": "2026-03-01",
|
|
403
|
+
"status": "active"
|
|
404
|
+
}
|
|
405
|
+
]
|
|
406
|
+
}
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### Emergency Rotation Playbook
|
|
410
|
+
|
|
411
|
+
When a secret is leaked, follow this sequence **immediately**:
|
|
412
|
+
|
|
413
|
+
```
|
|
414
|
+
┌─────────────────────────────────────────────────────┐
|
|
415
|
+
│ 1. REVOKE — Disable the old key in platform dashboard│
|
|
416
|
+
│ 2. ROTATE — Generate a new key │
|
|
417
|
+
│ 3. UPDATE — Push new key to secret store │
|
|
418
|
+
│ 4. DEPLOY — Redeploy affected services │
|
|
419
|
+
│ 5. SCAN — Check git history for the old key │
|
|
420
|
+
│ 6. SCRUB — Remove from git history if needed │
|
|
421
|
+
│ 7. AUDIT — Review access logs for unauthorized use │
|
|
422
|
+
└─────────────────────────────────────────────────────┘
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
#### Per-Platform Rotation Commands
|
|
426
|
+
|
|
427
|
+
**Supabase:**
|
|
428
|
+
```bash
|
|
429
|
+
# 1. Go to Supabase Dashboard → Project Settings → API
|
|
430
|
+
# 2. Click "Regenerate" on the compromised key
|
|
431
|
+
# 3. Update Cloudflare Secrets:
|
|
432
|
+
wrangler secret put SUPABASE_ANON_KEY # Paste new value
|
|
433
|
+
wrangler secret put SUPABASE_SERVICE_KEY # Paste new value
|
|
434
|
+
# 4. Update local .dev.vars with new values
|
|
435
|
+
# 5. Redeploy
|
|
436
|
+
npm run deploy:staging
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
**Cloudflare API Token:**
|
|
440
|
+
```bash
|
|
441
|
+
# 1. Dashboard → My Profile → API Tokens → Roll
|
|
442
|
+
# 2. Update any CI/CD systems using this token
|
|
443
|
+
# 3. Verify with: wrangler whoami
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
**GitHub Token:**
|
|
447
|
+
```bash
|
|
448
|
+
# 1. Settings → Developer Settings → PAT → Regenerate
|
|
449
|
+
# 2. Update gh auth: gh auth login
|
|
450
|
+
# 3. Verify: gh auth status
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## Security Audit Checklist
|
|
456
|
+
|
|
457
|
+
Run this checklist for any project to assess its security posture:
|
|
458
|
+
|
|
459
|
+
```markdown
|
|
460
|
+
## 🛡️ Secret Shield Audit
|
|
461
|
+
|
|
462
|
+
### Layer 1: Write Guard
|
|
463
|
+
- [ ] No hardcoded secrets in source files
|
|
464
|
+
- [ ] Environment variables used for all secrets
|
|
465
|
+
- [ ] .dev.vars exists with local secrets (not committed)
|
|
466
|
+
- [ ] .dev.vars.example exists with placeholder names (committed)
|
|
467
|
+
|
|
468
|
+
### Layer 2: Pre-Commit Guard
|
|
469
|
+
- [ ] .git/hooks/pre-commit exists and is executable
|
|
470
|
+
- [ ] Gitleaks installed OR native fallback hook active
|
|
471
|
+
- [ ] .gitleaks.toml configured for project
|
|
472
|
+
|
|
473
|
+
### Layer 3: Repo Scan
|
|
474
|
+
- [ ] `npm run security:scan` passes clean
|
|
475
|
+
- [ ] No JWT tokens in tracked files
|
|
476
|
+
- [ ] No API keys in configuration files
|
|
477
|
+
- [ ] No private keys in repository
|
|
478
|
+
|
|
479
|
+
### Layer 4: Deploy Gate
|
|
480
|
+
- [ ] Gate 0 checks ALL source files (not just wrangler.jsonc)
|
|
481
|
+
- [ ] .gitignore includes: .env, .dev.vars, .env.local, .env.production
|
|
482
|
+
- [ ] No .env files tracked by git
|
|
483
|
+
- [ ] Cloudflare Secrets used for production values
|
|
484
|
+
|
|
485
|
+
### Layer 5: Runtime Guard
|
|
486
|
+
- [ ] .secret-lifecycle.json tracks all secrets (metadata only)
|
|
487
|
+
- [ ] No secrets past rotation deadline
|
|
488
|
+
- [ ] Emergency rotation playbook known by team
|
|
489
|
+
- [ ] Post-incident: keys rotated, history scrubbed
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
494
|
+
## Hardened .gitignore Template
|
|
495
|
+
|
|
496
|
+
Every project using Secret Shield should have AT MINIMUM these patterns:
|
|
497
|
+
|
|
498
|
+
```gitignore
|
|
499
|
+
# === Secret Shield: Mandatory Ignores ===
|
|
500
|
+
|
|
501
|
+
# Environment & secret files
|
|
502
|
+
.env
|
|
503
|
+
.env.*
|
|
504
|
+
!.env.example
|
|
505
|
+
!.env.test
|
|
506
|
+
.dev.vars
|
|
507
|
+
!.dev.vars.example
|
|
508
|
+
|
|
509
|
+
# Secret lifecycle tracking (contains metadata, not values)
|
|
510
|
+
.secret-lifecycle.json
|
|
511
|
+
|
|
512
|
+
# Platform-specific
|
|
513
|
+
.wrangler/
|
|
514
|
+
*.pem
|
|
515
|
+
*.key
|
|
516
|
+
*.p12
|
|
517
|
+
*.pfx
|
|
518
|
+
|
|
519
|
+
# OS artifacts
|
|
520
|
+
.DS_Store
|
|
521
|
+
Thumbs.db
|
|
522
|
+
|
|
523
|
+
# Dependencies
|
|
524
|
+
node_modules/
|
|
525
|
+
|
|
526
|
+
# Build output
|
|
527
|
+
dist/
|
|
528
|
+
build/
|
|
529
|
+
.next/
|
|
530
|
+
.nuxt/
|
|
531
|
+
|
|
532
|
+
# IDE
|
|
533
|
+
.vscode/settings.json
|
|
534
|
+
.idea/
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## Red Flags — STOP
|
|
540
|
+
|
|
541
|
+
| Thought | Reality |
|
|
542
|
+
|---------|---------|
|
|
543
|
+
| "It's just a dev key" | Dev keys have the same permissions as prod keys |
|
|
544
|
+
| ".gitignore will protect me" | It can't remove what's already in git history |
|
|
545
|
+
| "I'll rotate it later" | Later = never. Rotate NOW. |
|
|
546
|
+
| "It was only exposed briefly" | Bots scan GitHub in real-time for leaked keys |
|
|
547
|
+
| "This is a private repo" | Private doesn't mean secured. Colleagues, CI, forks all have access |
|
|
548
|
+
| "The pre-commit hook is annoying" | 3-second scan vs. hours of incident response |
|
|
549
|
+
| "I'll add --no-verify just this once" | That "once" is when the leak happens |
|
|
550
|
+
|
|
551
|
+
---
|
|
552
|
+
|
|
553
|
+
## Integration
|
|
554
|
+
|
|
555
|
+
| Skill | Relationship |
|
|
556
|
+
|-------|-------------|
|
|
557
|
+
| `cm-project-bootstrap` | Phase 0.5 calls Secret Shield for initial security setup |
|
|
558
|
+
| `cm-safe-deploy` | Gate 0 uses Layer 4 enhanced secret audit |
|
|
559
|
+
| `cm-test-gate` | Layer 5 security test uses Layer 3 patterns |
|
|
560
|
+
| `cm-identity-guard` | Layer 5 token rotation extends identity lifecycle |
|
|
561
|
+
| `cm-quality-gate` | Secret shield is a prerequisite gate |
|
|
562
|
+
|
|
563
|
+
### Lifecycle Position
|
|
564
|
+
|
|
565
|
+
```
|
|
566
|
+
cm-project-bootstrap → cm-secret-shield (setup) → development cycle
|
|
567
|
+
↓
|
|
568
|
+
cm-secret-shield (pre-commit) ← git commit
|
|
569
|
+
cm-secret-shield (gate 0) ← cm-safe-deploy
|
|
570
|
+
cm-secret-shield (scan) ← cm-test-gate
|
|
571
|
+
cm-secret-shield (rotation) ← cm-identity-guard
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
## The Bottom Line
|
|
575
|
+
|
|
576
|
+
**5 layers. Every stage. No exceptions.**
|
|
577
|
+
|
|
578
|
+
Write Guard → Pre-Commit → Repo Scan → Deploy Gate → Runtime Guard.
|
|
579
|
+
|
|
580
|
+
A 3-second scan prevents a 3-day incident. This is non-negotiable.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cm-skill-chain
|
|
3
|
+
description: Skill Chain Engine — compose skills into automated pipelines. One task triggers multi-skill workflows with progress tracking, auto-detection, and step management.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill Chain Engine
|
|
7
|
+
|
|
8
|
+
> **TRIZ #40 Composite Materials** — Skills compose into pipelines.
|
|
9
|
+
> One command → full workflow → automated step progression.
|
|
10
|
+
|
|
11
|
+
## When to Use
|
|
12
|
+
|
|
13
|
+
ALWAYS trigger for: chain, pipeline, workflow, multi-step, end-to-end,
|
|
14
|
+
"run the whole thing", "full process", "feature pipeline", "bug fix flow",
|
|
15
|
+
"from scratch to deploy", "brainstorm to ship", "skill chain", "full pipeline"
|
|
16
|
+
|
|
17
|
+
## Quick Reference
|
|
18
|
+
|
|
19
|
+
| Command | Description |
|
|
20
|
+
|---------|-------------|
|
|
21
|
+
| `cody chain list` | Show all available chains |
|
|
22
|
+
| `cody chain info <id>` | Show chain pipeline details |
|
|
23
|
+
| `cody chain auto "task"` | Auto-detect best chain & start |
|
|
24
|
+
| `cody chain start <id> "task"` | Start specific chain |
|
|
25
|
+
| `cody chain status [exec-id]` | Show progress |
|
|
26
|
+
| `cody chain advance <exec-id>` | Complete current step, move to next |
|
|
27
|
+
| `cody chain skip <exec-id>` | Skip current step |
|
|
28
|
+
| `cody chain abort <exec-id>` | Cancel chain |
|
|
29
|
+
| `cody chain history` | View past chain runs |
|
|
30
|
+
|
|
31
|
+
## Naming Convention
|
|
32
|
+
|
|
33
|
+
Step names use short-form identifiers — the `cm-` prefix is stripped by convention.
|
|
34
|
+
Full skill names: `cm-brainstorm-idea`, `cm-planning`, `cm-tdd`, `cm-execution`, `cm-quality-gate`,
|
|
35
|
+
`cm-safe-deploy`, `cm-debugging`, `cm-content-factory`, `cm-ads-tracker`, `cm-project-bootstrap`,
|
|
36
|
+
`cm-code-review`. Exception: `cro-methodology` has no `cm-` prefix.
|
|
37
|
+
|
|
38
|
+
## Built-in Chains
|
|
39
|
+
|
|
40
|
+
### 🚀 feature-development (6 steps)
|
|
41
|
+
`brainstorm-idea → planning → tdd → execution → quality-gate → safe-deploy`
|
|
42
|
+
|
|
43
|
+
### 🐛 bug-fix (3 steps)
|
|
44
|
+
`debugging → tdd → quality-gate`
|
|
45
|
+
|
|
46
|
+
### 📝 content-launch (3 steps)
|
|
47
|
+
`content-factory → ads-tracker → cro-methodology`
|
|
48
|
+
|
|
49
|
+
### 🏗️ new-project (6 steps)
|
|
50
|
+
`project-bootstrap → planning → tdd → execution → quality-gate → safe-deploy`
|
|
51
|
+
|
|
52
|
+
### 🔍 cm-code-review (3 steps)
|
|
53
|
+
`cm-code-review → quality-gate → safe-deploy`
|
|
54
|
+
|
|
55
|
+
## Workflow
|
|
56
|
+
|
|
57
|
+
1. **Start**: Use `chain auto` for auto-detection or `chain start` for specific chains
|
|
58
|
+
2. **Execute**: Work through each skill step, using `@[/skill-name]` to invoke
|
|
59
|
+
3. **Advance**: When step is done, run `chain advance <id> "summary"`
|
|
60
|
+
4. **Repeat**: Continue until all steps complete
|
|
61
|
+
5. **Track**: Use `chain status` to monitor progress anytime
|
|
62
|
+
|
|
63
|
+
## Integration with Other Skills
|
|
64
|
+
|
|
65
|
+
- **cm-continuity**: Chain progress persists across sessions via CONTINUITY.md working memory
|
|
66
|
+
- **cm-execution**: Each chain step delegates to cm-execution for actual implementation
|
|
67
|
+
- **cm-quality-gate**: Automatically runs at end of each development chain
|
|
68
|
+
|
|
69
|
+
## For AI Agents
|
|
70
|
+
|
|
71
|
+
When dispatching tasks that match a chain pattern:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
1. Check if task matches a chain: suggestChain(taskTitle)
|
|
75
|
+
2. If match found, suggest to user: "This task matches the X chain pipeline"
|
|
76
|
+
3. If user agrees, start the chain and invoke skills in order
|
|
77
|
+
4. After completing each skill, advance the chain
|
|
78
|
+
```
|