cerber-core 1.1.10 → 1.1.12
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/README.md +189 -15
- package/bin/cerber +44 -0
- package/dev/templates/cerber-guardian.mjs.tpl +20 -0
- package/dist/cli/cta.d.ts +41 -0
- package/dist/cli/cta.d.ts.map +1 -0
- package/dist/cli/cta.js +109 -0
- package/dist/cli/cta.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +5 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +88 -17
- package/dist/cli/init.js.map +1 -1
- package/package.json +37 -18
- package/solo/templates/cerber-guardian.mjs.tpl +20 -0
- package/team/templates/cerber-guardian.mjs.tpl +20 -0
package/README.md
CHANGED
|
@@ -1,21 +1,185 @@
|
|
|
1
|
-
# 🛡️ Cerber Core
|
|
1
|
+
# 🛡️ Cerber Core — CI Contract Guard for GitHub Actions
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Detects workflow/config drift across repos and enforces a single source of truth via CERBER.md.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
Enforces `CERBER.md` across pre-commit, CI, and optional post-deploy gates.
|
|
5
|
+
> **AI doesn't break your project. Lack of a contract does.**
|
|
7
6
|
|
|
8
7
|
[](https://www.npmjs.com/package/cerber-core)
|
|
9
8
|
[](https://opensource.org/licenses/MIT)
|
|
10
9
|
[](https://github.com/Agaslez/cerber-core)
|
|
10
|
+
[](https://discord.gg/V8G5qw5D)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## What is Cerber Core?
|
|
15
|
+
|
|
16
|
+
Cerber enforces your project roadmap as executable contract (`CERBER.md`). Write rules once, get automatic validation on every commit + CI run.
|
|
17
|
+
|
|
18
|
+
### What Cerber Is (and Isn't)
|
|
19
|
+
|
|
20
|
+
✅ **Contract guard** — Validates your CERBER.md rules are enforced
|
|
21
|
+
✅ **Drift detector** — Catches when CI config/workflow changes break protection
|
|
22
|
+
✅ **Works WITH existing tools** — Doesn't replace ESLint/Prettier/tests. Ensures they stay required.
|
|
23
|
+
|
|
24
|
+
❌ **Not a linter** — Use ESLint for code style
|
|
25
|
+
❌ **Not a test runner** — Use Jest/Vitest for unit tests
|
|
26
|
+
❌ **Not a deployment tool** — Use your existing CD pipeline
|
|
27
|
+
|
|
28
|
+
**Think of it as:** Policy-as-code layer that prevents your other tools from being bypassed.
|
|
29
|
+
|
|
30
|
+
## Why? (The CI Drift Problem)
|
|
31
|
+
|
|
32
|
+
- ✅ **AI agents follow your roadmap** → Agent pastes code matching `CERBER.md`
|
|
33
|
+
- ❌ **Human bypasses rules** → Commit sneaks through, CI green but wrong
|
|
34
|
+
- ❌ **CI config drifts** → Workflow changes, gates disappear, protection gone
|
|
35
|
+
|
|
36
|
+
**Solution:** Guardian blocks bad commits **before** they reach CI. CI re-validates and protects itself from tampering.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 🏆 Proof: Used in Production
|
|
41
|
+
|
|
42
|
+
Cerber protects real SaaS applications. See it in action:
|
|
43
|
+
|
|
44
|
+
**Eliksir Platform CI Pipelines:**
|
|
45
|
+
- 🎨 **Frontend:** [Guardian Schema Check + tests](https://github.com/Agaslez/Eiksir-front-dashboard/actions/runs/20668597387) ✅
|
|
46
|
+
- ⚙️ **Backend:** [Quality Gate + deploy checks](https://github.com/Agaslez/Eliksir-Backend-front-dashboard/actions/runs/20664365046) ✅
|
|
47
|
+
|
|
48
|
+
These aren't demo projects - **live production systems** serving real users, protected by Cerber since day one.
|
|
49
|
+
|
|
50
|
+
📖 **Full case study:** [How Cerber prevented 47 production bugs](docs/case-studies/eliksir.md)
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 💬 Community (Discord)
|
|
55
|
+
|
|
56
|
+
Join the Cerber Core Discord for support, feedback, and CI/Doctor showcases:
|
|
57
|
+
👉 https://discord.gg/V8G5qw5D
|
|
58
|
+
|
|
59
|
+
- **Questions:** ask in `#general`
|
|
60
|
+
- **Feedback / bugs:** `#feedback` (bugs can also go to GitHub Issues)
|
|
61
|
+
- **Proofs:** post your CI runs / doctor output in `#showcase`
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 🚀 Quick Start (60 seconds)
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# 1. Install
|
|
69
|
+
npm i -D cerber-core
|
|
70
|
+
|
|
71
|
+
# 2. Generate contract template
|
|
72
|
+
npx cerber init
|
|
73
|
+
|
|
74
|
+
# 3. Edit CERBER.md (use AI assistant or manual)
|
|
75
|
+
# → Define your roadmap, tech stack, protected assets
|
|
76
|
+
|
|
77
|
+
# 4. Generate hooks + CI workflow
|
|
78
|
+
npx cerber init
|
|
79
|
+
|
|
80
|
+
# 5. Verify setup
|
|
81
|
+
npx cerber doctor
|
|
82
|
+
|
|
83
|
+
# 6. Commit and push
|
|
84
|
+
git add .
|
|
85
|
+
git commit -m "feat: add Cerber protection"
|
|
86
|
+
git push
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**That's it.** Guardian now blocks bad commits. CI re-validates and protects itself.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## What Cerber Checks
|
|
94
|
+
|
|
95
|
+
### Pre-commit (Guardian)
|
|
96
|
+
- ❌ Secrets in code (API keys, tokens)
|
|
97
|
+
- ❌ Forbidden patterns (eval, console.log in prod)
|
|
98
|
+
- ❌ Missing required imports
|
|
99
|
+
- ❌ Protected file deletions
|
|
100
|
+
- ✅ Schema validation (if enabled)
|
|
101
|
+
|
|
102
|
+
### CI (GitHub Actions)
|
|
103
|
+
- ❌ Workflow tampering (job ID changes)
|
|
104
|
+
- ❌ Missing required checks
|
|
105
|
+
- ❌ Contract violations
|
|
106
|
+
- ✅ Re-runs Guardian validation
|
|
107
|
+
|
|
108
|
+
**📍 TODAY:** CI contract guard + workflow drift detection
|
|
109
|
+
**🚀 ROADMAP:** Post-deploy health gates (experimental in v1.1, production-ready in v2.0)
|
|
110
|
+
|
|
111
|
+
### Doctor Command
|
|
112
|
+
- ❌ Missing CERBER.md
|
|
113
|
+
- ❌ Missing schema (strict mode)
|
|
114
|
+
- ❌ Missing pre-commit hook
|
|
115
|
+
- ❌ Missing CI workflow
|
|
116
|
+
- ✅ Override state validation
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## ⚖️ Stability Policy
|
|
121
|
+
|
|
122
|
+
Cerber is a devtool — we don't break pipelines:
|
|
123
|
+
|
|
124
|
+
- **CLI flags + exit codes:** Follow [SemVer](https://semver.org/). Breaking changes = major version bump.
|
|
125
|
+
- **JSON output:** Versioned schema (e.g., `{"version": "1.0", ...}`). New fields = minor, changed fields = major.
|
|
126
|
+
- **CI workflow templates:** Generated files are yours to customize. Updates = opt-in via `cerber init --force`.
|
|
127
|
+
|
|
128
|
+
**Current stability:** v1.1.11 is production-ready for CI contract guard use case. See [production proof](docs/case-studies/eliksir.md).
|
|
11
129
|
|
|
12
130
|
---
|
|
13
131
|
|
|
14
|
-
##
|
|
132
|
+
## Example: CI Drift Detected
|
|
15
133
|
|
|
16
|
-
|
|
134
|
+
```bash
|
|
135
|
+
$ npx cerber doctor
|
|
136
|
+
|
|
137
|
+
[Cerber Doctor] Setup Validation
|
|
138
|
+
|
|
139
|
+
[OK] All checks passed!
|
|
17
140
|
|
|
18
|
-
|
|
141
|
+
Configuration:
|
|
142
|
+
Mode: dev
|
|
143
|
+
Guardian: enabled
|
|
144
|
+
Health: enabled
|
|
145
|
+
CI: github
|
|
146
|
+
Override: DISABLED
|
|
147
|
+
|
|
148
|
+
[READY] Ready to commit!
|
|
149
|
+
|
|
150
|
+
⭐ If Cerber helped you, star the repo: https://github.com/Agaslez/cerber-core
|
|
151
|
+
💬 Join Discord for feedback/support: https://discord.gg/V8G5qw5D
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**When drift detected:**
|
|
155
|
+
```bash
|
|
156
|
+
$ npx cerber doctor
|
|
157
|
+
|
|
158
|
+
[Cerber Doctor] Setup Validation
|
|
159
|
+
|
|
160
|
+
[FAIL] Issues found:
|
|
161
|
+
|
|
162
|
+
[!] .github/workflows/cerber.yml
|
|
163
|
+
GitHub workflow not found
|
|
164
|
+
|
|
165
|
+
Next Steps:
|
|
166
|
+
|
|
167
|
+
1. Re-run initialization to generate missing files:
|
|
168
|
+
npx cerber init
|
|
169
|
+
|
|
170
|
+
Help: https://github.com/Agaslez/cerber-core/discussions
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## How to Use Cerber (Full Workflow)
|
|
176
|
+
|
|
177
|
+
Cerber is simple: **write rules once in `CERBER.md`**, enforce on every commit + CI run.
|
|
178
|
+
|
|
179
|
+
**📍 TODAY:** Pre-commit Guardian + CI workflow drift detection
|
|
180
|
+
**🚀 ROADMAP:** Post-deploy health gates (experimental)
|
|
181
|
+
|
|
182
|
+
**Roadmap → CERBER.md contract → enforced automatically on every commit/push.**
|
|
19
183
|
|
|
20
184
|
### 1) Install
|
|
21
185
|
```bash
|
|
@@ -59,11 +223,16 @@ npx cerber doctor
|
|
|
59
223
|
|
|
60
224
|
---
|
|
61
225
|
|
|
62
|
-
##
|
|
226
|
+
## 💬 Feedback & Support
|
|
227
|
+
|
|
228
|
+
**Having issues? Want to share your setup?**
|
|
63
229
|
|
|
64
|
-
- **
|
|
65
|
-
- **
|
|
66
|
-
- **
|
|
230
|
+
- 💬 **Discord:** https://discord.gg/V8G5qw5D (fastest support)
|
|
231
|
+
- 🐛 **GitHub Issues:** [Report bugs](https://github.com/Agaslez/cerber-core/issues)
|
|
232
|
+
- 💡 **GitHub Discussions:** [Ask questions, share ideas](https://github.com/Agaslez/cerber-core/discussions)
|
|
233
|
+
- 📖 **Case Studies:** [See Cerber in production](docs/case-studies/)
|
|
234
|
+
|
|
235
|
+
**Show your CI runs in Discord `#showcase`!**
|
|
67
236
|
|
|
68
237
|
---
|
|
69
238
|
|
|
@@ -266,13 +435,16 @@ npm test
|
|
|
266
435
|
|
|
267
436
|
---
|
|
268
437
|
|
|
269
|
-
## 📞 Support
|
|
438
|
+
## 📞 Support & Links
|
|
270
439
|
|
|
440
|
+
- 💬 **Discord:** [Join community](https://discord.gg/V8G5qw5D)
|
|
271
441
|
- 🐛 **Issues:** [GitHub Issues](https://github.com/Agaslez/cerber-core/issues)
|
|
272
442
|
- 💡 **Discussions:** [GitHub Discussions](https://github.com/Agaslez/cerber-core/discussions)
|
|
273
|
-
- 📖 **Docs:** [
|
|
443
|
+
- 📖 **Full Docs:** [docs/README_LONG.md](docs/README_LONG.md)
|
|
444
|
+
- 📚 **Case Study:** [How Cerber prevented 47 bugs](docs/case-studies/eliksir.md)
|
|
445
|
+
- 🎭 **Story:** [The team behind Cerber](docs/STORY.md)
|
|
274
446
|
- 🔐 **Security:** Report vulnerabilities to st.pitek@gmail.com
|
|
275
|
-
- ⭐ **Repository:** [cerber-core](https://github.com/Agaslez/cerber-core)
|
|
447
|
+
- ⭐ **Repository:** [github.com/Agaslez/cerber-core](https://github.com/Agaslez/cerber-core)
|
|
276
448
|
|
|
277
449
|
---
|
|
278
450
|
|
|
@@ -286,7 +458,9 @@ Free for commercial use. See [LICENSE](LICENSE) for details.
|
|
|
286
458
|
|
|
287
459
|
## 🌟 About
|
|
288
460
|
|
|
289
|
-
Founded by
|
|
461
|
+
**Founded by Agata Ślęzak**, created and maintained by **Stefan Pitek**
|
|
462
|
+
|
|
463
|
+
- 📖 Read the full story: [docs/STORY.md](docs/STORY.md)
|
|
290
464
|
|
|
291
465
|
Read the full story: [docs/STORY.md](docs/STORY.md)
|
|
292
466
|
|
package/bin/cerber
CHANGED
|
@@ -83,6 +83,17 @@ program
|
|
|
83
83
|
.command('morning')
|
|
84
84
|
.description('Run morning dashboard (SOLO)')
|
|
85
85
|
.action(async () => {
|
|
86
|
+
const fs = await import('fs');
|
|
87
|
+
const path = await import('path');
|
|
88
|
+
const scriptPath = path.default.join(process.cwd(), 'solo/scripts/cerber-daily-check.js');
|
|
89
|
+
|
|
90
|
+
if (!fs.default.existsSync(scriptPath)) {
|
|
91
|
+
console.error(chalk.red('❌ This command requires SOLO mode'));
|
|
92
|
+
console.error(chalk.yellow('Run: npx cerber init --mode solo'));
|
|
93
|
+
console.error(chalk.gray('\nSOLO mode includes daily automation scripts for single developers.'));
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
|
|
86
97
|
const { execSync } = await import('child_process');
|
|
87
98
|
execSync('node solo/scripts/cerber-daily-check.js', { stdio: 'inherit' });
|
|
88
99
|
});
|
|
@@ -93,6 +104,17 @@ program
|
|
|
93
104
|
.option('--dry-run', 'Show what would be fixed without making changes')
|
|
94
105
|
.option('--approve', 'Require approval for each fix')
|
|
95
106
|
.action(async (options) => {
|
|
107
|
+
const fs = await import('fs');
|
|
108
|
+
const path = await import('path');
|
|
109
|
+
const scriptPath = path.default.join(process.cwd(), 'solo/scripts/cerber-auto-repair.js');
|
|
110
|
+
|
|
111
|
+
if (!fs.default.existsSync(scriptPath)) {
|
|
112
|
+
console.error(chalk.red('❌ This command requires SOLO mode'));
|
|
113
|
+
console.error(chalk.yellow('Run: npx cerber init --mode solo'));
|
|
114
|
+
console.error(chalk.gray('\nSOLO mode includes auto-repair scripts for maintenance.'));
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
|
|
96
118
|
const { execSync } = await import('child_process');
|
|
97
119
|
const args = [
|
|
98
120
|
options.dryRun && '--dry-run',
|
|
@@ -106,6 +128,17 @@ program
|
|
|
106
128
|
.command('focus <module>')
|
|
107
129
|
.description('Generate focus context for module (TEAM)')
|
|
108
130
|
.action(async (module) => {
|
|
131
|
+
const fs = await import('fs');
|
|
132
|
+
const path = await import('path');
|
|
133
|
+
const scriptPath = path.default.join(process.cwd(), 'team/scripts/cerber-focus.sh');
|
|
134
|
+
|
|
135
|
+
if (!fs.default.existsSync(scriptPath)) {
|
|
136
|
+
console.error(chalk.red('❌ This command requires TEAM mode'));
|
|
137
|
+
console.error(chalk.yellow('Run: npx cerber init --mode team'));
|
|
138
|
+
console.error(chalk.gray('\nTEAM mode includes collaboration tools and CODEOWNERS.'));
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
|
|
109
142
|
const { execSync } = await import('child_process');
|
|
110
143
|
execSync(`bash team/scripts/cerber-focus.sh ${module}`, { stdio: 'inherit' });
|
|
111
144
|
});
|
|
@@ -114,6 +147,17 @@ program
|
|
|
114
147
|
.command('dashboard')
|
|
115
148
|
.description('Show system dashboard (SOLO)')
|
|
116
149
|
.action(async () => {
|
|
150
|
+
const fs = await import('fs');
|
|
151
|
+
const path = await import('path');
|
|
152
|
+
const scriptPath = path.default.join(process.cwd(), 'solo/scripts/cerber-dashboard.js');
|
|
153
|
+
|
|
154
|
+
if (!fs.default.existsSync(scriptPath)) {
|
|
155
|
+
console.error(chalk.red('❌ This command requires SOLO mode'));
|
|
156
|
+
console.error(chalk.yellow('Run: npx cerber init --mode solo'));
|
|
157
|
+
console.error(chalk.gray('\nSOLO mode includes system monitoring dashboards.'));
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
|
|
117
161
|
const { execSync } = await import('child_process');
|
|
118
162
|
execSync('node solo/scripts/cerber-dashboard.js', { stdio: 'inherit' });
|
|
119
163
|
});
|
|
@@ -126,6 +126,26 @@ async function main() {
|
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
+
// Parse forbidConsole setting
|
|
130
|
+
const forbidConsoleMatch = cerberContent.match(/forbidConsole:\s*(true|false)/);
|
|
131
|
+
if (forbidConsoleMatch && forbidConsoleMatch[1] === 'true') {
|
|
132
|
+
forbiddenPatterns.push({
|
|
133
|
+
pattern: 'console\\.(log|debug|info|warn|error)',
|
|
134
|
+
name: 'Forbidden: console statements',
|
|
135
|
+
severity: 'error'
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Parse forbidDebugger setting
|
|
140
|
+
const forbidDebuggerMatch = cerberContent.match(/forbidDebugger:\s*(true|false)/);
|
|
141
|
+
if (forbidDebuggerMatch && forbidDebuggerMatch[1] === 'true') {
|
|
142
|
+
forbiddenPatterns.push({
|
|
143
|
+
pattern: '\\bdebugger\\b',
|
|
144
|
+
name: 'Forbidden: debugger statements',
|
|
145
|
+
severity: 'error'
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
129
149
|
if (schemaMode === 'required' && forbiddenPatterns.length === 0) {
|
|
130
150
|
console.error('❌ SCHEMA.mode: required but no rules defined');
|
|
131
151
|
console.error('Add forbiddenPatterns to SCHEMA section in CERBER.md');
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CTA (Call-to-Action) module
|
|
3
|
+
* Shows GitHub star + Discord invite after successful commands
|
|
4
|
+
*
|
|
5
|
+
* Anti-spam: Shows max once per 24h using state file
|
|
6
|
+
* Cross-platform: Works on Linux/Mac/Windows
|
|
7
|
+
*/
|
|
8
|
+
export interface CtaState {
|
|
9
|
+
lastCtaShownAt?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Get platform-specific config directory
|
|
13
|
+
*/
|
|
14
|
+
export declare function getConfigDir(): string;
|
|
15
|
+
/**
|
|
16
|
+
* Get state file path
|
|
17
|
+
*/
|
|
18
|
+
export declare function getStateFilePath(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Read CTA state from disk (returns empty object if not exists/error)
|
|
21
|
+
*/
|
|
22
|
+
export declare function readCtaState(): CtaState;
|
|
23
|
+
/**
|
|
24
|
+
* Write CTA state to disk (fails gracefully)
|
|
25
|
+
*/
|
|
26
|
+
export declare function writeCtaState(state: CtaState): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Check if CTA should be shown (respects 24h cooldown)
|
|
29
|
+
*/
|
|
30
|
+
export declare function shouldShowCta(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Show CTA message (GitHub star + Discord invite)
|
|
33
|
+
*/
|
|
34
|
+
export declare function showCta(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Show CTA if conditions are met (success + 24h cooldown)
|
|
37
|
+
*
|
|
38
|
+
* @param success - Command success status (only show on success)
|
|
39
|
+
*/
|
|
40
|
+
export declare function tryShowCta(success: boolean): void;
|
|
41
|
+
//# sourceMappingURL=cta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cta.d.ts","sourceRoot":"","sources":["../../src/cli/cta.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,QAAQ;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAWrC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,QAAQ,CAcvC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAgBtD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAavC;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAI9B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgBjD"}
|
package/dist/cli/cta.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CTA (Call-to-Action) module
|
|
3
|
+
* Shows GitHub star + Discord invite after successful commands
|
|
4
|
+
*
|
|
5
|
+
* Anti-spam: Shows max once per 24h using state file
|
|
6
|
+
* Cross-platform: Works on Linux/Mac/Windows
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
9
|
+
import { homedir } from 'os';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
/**
|
|
12
|
+
* Get platform-specific config directory
|
|
13
|
+
*/
|
|
14
|
+
export function getConfigDir() {
|
|
15
|
+
const platform = process.platform;
|
|
16
|
+
if (platform === 'win32') {
|
|
17
|
+
// Windows: %APPDATA%/cerber
|
|
18
|
+
const appData = process.env.APPDATA || join(homedir(), 'AppData', 'Roaming');
|
|
19
|
+
return join(appData, 'cerber');
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
// Linux/Mac: ~/.config/cerber
|
|
23
|
+
return join(homedir(), '.config', 'cerber');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get state file path
|
|
28
|
+
*/
|
|
29
|
+
export function getStateFilePath() {
|
|
30
|
+
return join(getConfigDir(), 'state.json');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Read CTA state from disk (returns empty object if not exists/error)
|
|
34
|
+
*/
|
|
35
|
+
export function readCtaState() {
|
|
36
|
+
const statePath = getStateFilePath();
|
|
37
|
+
try {
|
|
38
|
+
if (!existsSync(statePath)) {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
const content = readFileSync(statePath, 'utf-8');
|
|
42
|
+
return JSON.parse(content);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// If read/parse fails, return empty state (fail gracefully)
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Write CTA state to disk (fails gracefully)
|
|
51
|
+
*/
|
|
52
|
+
export function writeCtaState(state) {
|
|
53
|
+
const statePath = getStateFilePath();
|
|
54
|
+
const configDir = getConfigDir();
|
|
55
|
+
try {
|
|
56
|
+
// Create directory if not exists
|
|
57
|
+
if (!existsSync(configDir)) {
|
|
58
|
+
mkdirSync(configDir, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf-8');
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
// Fail gracefully - don't crash if we can't write state
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if CTA should be shown (respects 24h cooldown)
|
|
70
|
+
*/
|
|
71
|
+
export function shouldShowCta() {
|
|
72
|
+
const state = readCtaState();
|
|
73
|
+
if (!state.lastCtaShownAt) {
|
|
74
|
+
// Never shown before
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
const timeSinceLastShow = now - state.lastCtaShownAt;
|
|
79
|
+
const TWENTY_FOUR_HOURS = 24 * 60 * 60 * 1000; // 24h in milliseconds
|
|
80
|
+
return timeSinceLastShow >= TWENTY_FOUR_HOURS;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Show CTA message (GitHub star + Discord invite)
|
|
84
|
+
*/
|
|
85
|
+
export function showCta() {
|
|
86
|
+
console.log('');
|
|
87
|
+
console.log('⭐ If Cerber helped you, star the repo: https://github.com/Agaslez/cerber-core');
|
|
88
|
+
console.log('💬 Join Discord for feedback/support: https://discord.gg/V8G5qw5D');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Show CTA if conditions are met (success + 24h cooldown)
|
|
92
|
+
*
|
|
93
|
+
* @param success - Command success status (only show on success)
|
|
94
|
+
*/
|
|
95
|
+
export function tryShowCta(success) {
|
|
96
|
+
if (!success) {
|
|
97
|
+
// Don't show CTA on failure
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (!shouldShowCta()) {
|
|
101
|
+
// Already shown in last 24h
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Show CTA
|
|
105
|
+
showCta();
|
|
106
|
+
// Update state (fail gracefully if can't write)
|
|
107
|
+
writeCtaState({ lastCtaShownAt: Date.now() });
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=cta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cta.js","sourceRoot":"","sources":["../../src/cli/cta.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;CACrD;AAED,wBAAsB,SAAS,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiFlF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAuE5D"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'fs';
|
|
2
2
|
import { resolve } from 'path';
|
|
3
3
|
import { parseCerberContract } from './contract-parser.js';
|
|
4
|
+
import { tryShowCta } from './cta.js';
|
|
4
5
|
import { validateOverride } from './override-validator.js';
|
|
5
6
|
export async function runDoctor(cwd = process.cwd()) {
|
|
6
7
|
const issues = [];
|
|
@@ -112,6 +113,8 @@ export function printDoctorReport(result) {
|
|
|
112
113
|
console.log('');
|
|
113
114
|
}
|
|
114
115
|
console.log('[READY] Ready to commit!');
|
|
116
|
+
// Show CTA after success
|
|
117
|
+
tryShowCta(true);
|
|
115
118
|
return;
|
|
116
119
|
}
|
|
117
120
|
console.log('[FAIL] Issues found:\n');
|
|
@@ -136,5 +139,7 @@ export function printDoctorReport(result) {
|
|
|
136
139
|
console.log(' npx cerber init\n');
|
|
137
140
|
}
|
|
138
141
|
console.log('Help: https://github.com/Agaslez/cerber-core/discussions');
|
|
142
|
+
// Don't show CTA on failure
|
|
143
|
+
tryShowCta(false);
|
|
139
144
|
}
|
|
140
145
|
//# sourceMappingURL=doctor.js.map
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,EAAiC,WAAW,EAAE,MAAM,YAAY,CAAC;AA2LxE,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+G1E"}
|
package/dist/cli/init.js
CHANGED
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
* @license MIT
|
|
8
8
|
*/
|
|
9
9
|
import chalk from 'chalk';
|
|
10
|
+
import { execSync } from 'child_process';
|
|
10
11
|
import fs from 'fs/promises';
|
|
11
12
|
import path from 'path';
|
|
12
13
|
import { getDefaultContract, parseCerberContract } from './contract-parser.js';
|
|
14
|
+
import { tryShowCta } from './cta.js';
|
|
13
15
|
import { TemplateGenerator } from './template-generator.js';
|
|
14
16
|
function getCerberMdTemplate(mode = 'dev') {
|
|
15
17
|
return `# CERBER.md - Architecture Roadmap
|
|
@@ -56,9 +58,19 @@ SCHEMA:
|
|
|
56
58
|
mode: required # required | disabled
|
|
57
59
|
rules:
|
|
58
60
|
forbiddenPatterns:
|
|
59
|
-
- "pwd=" #
|
|
60
|
-
- "secret=" #
|
|
61
|
-
- "apikey=" #
|
|
61
|
+
- "pwd=" # Generic password patterns
|
|
62
|
+
- "secret=" # Generic secret patterns
|
|
63
|
+
- "apikey=" # Generic API key patterns
|
|
64
|
+
- "sk_live_" # Stripe live secret keys
|
|
65
|
+
- "pk_test_" # Stripe test publishable keys
|
|
66
|
+
- "pk_live_" # Stripe live publishable keys
|
|
67
|
+
- "ghp_" # GitHub Personal Access Tokens
|
|
68
|
+
- "gho_" # GitHub OAuth tokens
|
|
69
|
+
- "github_pat_" # GitHub fine-grained PATs
|
|
70
|
+
- "AKIA" # AWS Access Key IDs
|
|
71
|
+
- "aws_secret_key" # AWS Secret Access Keys
|
|
72
|
+
- "token=" # Generic token patterns
|
|
73
|
+
- "bearer " # Bearer tokens (case sensitive)
|
|
62
74
|
forbidConsole: true
|
|
63
75
|
forbidDebugger: true
|
|
64
76
|
\`\`\`
|
|
@@ -268,10 +280,14 @@ export async function initCommand(options = {}) {
|
|
|
268
280
|
if (!options.dryRun && contract.guardian.enabled) {
|
|
269
281
|
await updatePackageJson(projectRoot);
|
|
270
282
|
}
|
|
283
|
+
// Step 5: Auto-install and setup Husky (if Guardian enabled)
|
|
284
|
+
if (!options.dryRun && contract.guardian.enabled && !options.noHusky) {
|
|
285
|
+
await setupHusky(projectRoot);
|
|
286
|
+
}
|
|
271
287
|
console.log('');
|
|
272
288
|
console.log(chalk.bold.green('✅ Cerber initialization complete!'));
|
|
273
289
|
console.log('');
|
|
274
|
-
// Step
|
|
290
|
+
// Step 6: Show next steps
|
|
275
291
|
await showNextSteps(contract, options, files, projectRoot);
|
|
276
292
|
}
|
|
277
293
|
async function updatePackageJson(projectRoot) {
|
|
@@ -292,6 +308,64 @@ async function updatePackageJson(projectRoot) {
|
|
|
292
308
|
console.log(chalk.yellow('⚠️ Could not update package.json (file may not exist)'));
|
|
293
309
|
}
|
|
294
310
|
}
|
|
311
|
+
async function setupHusky(projectRoot) {
|
|
312
|
+
console.log(chalk.cyan('🔧 Setting up Husky...'));
|
|
313
|
+
try {
|
|
314
|
+
// Check if husky is already in devDependencies
|
|
315
|
+
const packagePath = path.join(projectRoot, 'package.json');
|
|
316
|
+
const packageContent = await fs.readFile(packagePath, 'utf-8');
|
|
317
|
+
const pkg = JSON.parse(packageContent);
|
|
318
|
+
const hasHusky = pkg.devDependencies?.husky || pkg.dependencies?.husky;
|
|
319
|
+
if (!hasHusky) {
|
|
320
|
+
console.log(chalk.gray(' Installing husky...'));
|
|
321
|
+
try {
|
|
322
|
+
execSync('npm install husky --save-dev', {
|
|
323
|
+
cwd: projectRoot,
|
|
324
|
+
stdio: 'pipe',
|
|
325
|
+
encoding: 'utf-8'
|
|
326
|
+
});
|
|
327
|
+
console.log(chalk.green(' ✅ Husky installed'));
|
|
328
|
+
}
|
|
329
|
+
catch (installError) {
|
|
330
|
+
console.log(chalk.yellow(' ⚠️ Could not auto-install husky'));
|
|
331
|
+
console.log(chalk.gray(` Error: ${installError.message}`));
|
|
332
|
+
console.log(chalk.cyan(' Please install manually: npm install husky --save-dev'));
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
console.log(chalk.green(' ✅ Husky already installed'));
|
|
338
|
+
}
|
|
339
|
+
// Initialize husky (works with both old and new versions)
|
|
340
|
+
console.log(chalk.gray(' Initializing git hooks...'));
|
|
341
|
+
try {
|
|
342
|
+
execSync('npx husky install', {
|
|
343
|
+
cwd: projectRoot,
|
|
344
|
+
stdio: 'pipe',
|
|
345
|
+
encoding: 'utf-8'
|
|
346
|
+
});
|
|
347
|
+
console.log(chalk.green(' ✅ Git hooks initialized'));
|
|
348
|
+
}
|
|
349
|
+
catch (initError) {
|
|
350
|
+
// Husky 8+ doesn't need 'husky install', hooks work automatically
|
|
351
|
+
// Only warn if .git doesn't exist
|
|
352
|
+
try {
|
|
353
|
+
await fs.access(path.join(projectRoot, '.git'));
|
|
354
|
+
console.log(chalk.green(' ✅ Git hooks ready'));
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
console.log(chalk.yellow(' ⚠️ Not a git repository - hooks will work after git init'));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
console.log(chalk.yellow('⚠️ Could not setup Husky automatically'));
|
|
363
|
+
console.log(chalk.gray(` Error: ${error.message}`));
|
|
364
|
+
console.log(chalk.cyan(' Please run manually:'));
|
|
365
|
+
console.log(chalk.gray(' npm install husky --save-dev'));
|
|
366
|
+
console.log(chalk.gray(' npx husky install'));
|
|
367
|
+
}
|
|
368
|
+
}
|
|
295
369
|
async function fileExists(filePath) {
|
|
296
370
|
try {
|
|
297
371
|
await fs.access(filePath);
|
|
@@ -304,12 +378,7 @@ async function fileExists(filePath) {
|
|
|
304
378
|
async function showNextSteps(contract, options, generatedFiles, projectRoot) {
|
|
305
379
|
console.log(chalk.bold('📝 Next Steps:'));
|
|
306
380
|
console.log('');
|
|
307
|
-
|
|
308
|
-
console.log(chalk.cyan('1. Install Husky (if not already installed):'));
|
|
309
|
-
console.log(' npm install husky --save-dev');
|
|
310
|
-
console.log(' npx husky install');
|
|
311
|
-
console.log('');
|
|
312
|
-
}
|
|
381
|
+
// Remove old Husky manual install instructions since we auto-install now
|
|
313
382
|
// Schema section (based on schema config in CERBER.md)
|
|
314
383
|
if (contract.schema && contract.schema.enabled) {
|
|
315
384
|
const schemaFile = contract.schema.file;
|
|
@@ -317,14 +386,14 @@ async function showNextSteps(contract, options, generatedFiles, projectRoot) {
|
|
|
317
386
|
const schemaExists = await fileExists(path.join(projectRoot, schemaFile));
|
|
318
387
|
if (schemaGenerated) {
|
|
319
388
|
// Template was generated
|
|
320
|
-
console.log(chalk.cyan(`
|
|
389
|
+
console.log(chalk.cyan(`1. Customize your architecture schema:`));
|
|
321
390
|
console.log(chalk.yellow(` ⚠️ ${schemaFile} is a TEMPLATE (not source of truth)`));
|
|
322
391
|
console.log(` Edit it to match your architecture defined in CERBER.md`);
|
|
323
392
|
console.log(' See: https://github.com/Agaslez/cerber-core#guardian-configuration');
|
|
324
393
|
}
|
|
325
394
|
else if (!schemaExists && contract.schema.mode === 'strict') {
|
|
326
395
|
// Strict mode: schema required but not generated
|
|
327
|
-
console.log(chalk.cyan(`
|
|
396
|
+
console.log(chalk.cyan(`1. Create your schema file:`));
|
|
328
397
|
console.log(chalk.yellow(` Schema mode: strict (you must create ${schemaFile})`));
|
|
329
398
|
console.log(` Template: npx cerber init --print-schema-template > ${schemaFile}`);
|
|
330
399
|
console.log(' See: https://github.com/Agaslez/cerber-core#guardian-configuration');
|
|
@@ -339,25 +408,25 @@ async function showNextSteps(contract, options, generatedFiles, projectRoot) {
|
|
|
339
408
|
// Legacy: guardian enabled but no schema config (backward compat)
|
|
340
409
|
const schemaGenerated = generatedFiles.some(f => f.path.endsWith(contract.guardian.schemaFile));
|
|
341
410
|
if (schemaGenerated) {
|
|
342
|
-
console.log(chalk.cyan(`
|
|
411
|
+
console.log(chalk.cyan(`1. Customize your architecture schema:`));
|
|
343
412
|
console.log(` Edit: ${contract.guardian.schemaFile}`);
|
|
344
413
|
console.log(' Add your project-specific rules and patterns');
|
|
345
414
|
}
|
|
346
415
|
else {
|
|
347
|
-
console.log(chalk.cyan(`
|
|
416
|
+
console.log(chalk.cyan(`1. Create your schema file: ${contract.guardian.schemaFile}`));
|
|
348
417
|
}
|
|
349
418
|
console.log(' See: https://github.com/Agaslez/cerber-core#guardian-configuration');
|
|
350
419
|
console.log('');
|
|
351
420
|
}
|
|
352
421
|
if (contract.health.enabled && !options.noHealth) {
|
|
353
|
-
console.log(chalk.cyan('
|
|
422
|
+
console.log(chalk.cyan('2. Customize health checks:'));
|
|
354
423
|
console.log(' Edit: src/cerber/health-checks.ts');
|
|
355
424
|
console.log(' Add route to your server: src/cerber/health-route.ts');
|
|
356
425
|
console.log(` Endpoint: ${contract.health.endpoint}`);
|
|
357
426
|
console.log('');
|
|
358
427
|
}
|
|
359
428
|
if (contract.ci.provider === 'github' && !options.noWorkflow) {
|
|
360
|
-
console.log(chalk.cyan('
|
|
429
|
+
console.log(chalk.cyan('3. GitHub Actions workflow created:'));
|
|
361
430
|
console.log(' .github/workflows/cerber.yml');
|
|
362
431
|
if (contract.ci.postDeploy.enabled) {
|
|
363
432
|
console.log('');
|
|
@@ -371,7 +440,7 @@ async function showNextSteps(contract, options, generatedFiles, projectRoot) {
|
|
|
371
440
|
console.log('');
|
|
372
441
|
}
|
|
373
442
|
if (contract.mode === 'team') {
|
|
374
|
-
console.log(chalk.cyan('
|
|
443
|
+
console.log(chalk.cyan('4. Team mode setup:'));
|
|
375
444
|
console.log(' - Edit .github/CODEOWNERS (replace @OWNER_USERNAME)');
|
|
376
445
|
console.log(' - Enable branch protection: Settings > Branches');
|
|
377
446
|
console.log(' - Require review from Code Owners');
|
|
@@ -383,5 +452,7 @@ async function showNextSteps(contract, options, generatedFiles, projectRoot) {
|
|
|
383
452
|
console.log(' git commit -m "feat: add Cerber protection"');
|
|
384
453
|
console.log('');
|
|
385
454
|
console.log(chalk.gray('Need help? https://github.com/Agaslez/cerber-core/discussions'));
|
|
455
|
+
// Show CTA after successful init
|
|
456
|
+
tryShowCta(true);
|
|
386
457
|
}
|
|
387
458
|
//# sourceMappingURL=init.js.map
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,SAAS,mBAAmB,CAAC,OAAe,KAAK;IAC/C,OAAO;;;;;;;QAOD,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAwFJ,kBAAkB,EAAE,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;;;OAWzC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2E9C,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAuB,EAAE;IACzD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAChC,+BAA+B;IACjC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IACC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAE3D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAM,CAAC;QAEjC,mCAAmC;QACnC,IAAI,KAAK,CAAC,OAAO,KAAK,qBAAqB,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;YAC3C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAEnD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,OAAO;QACT,CAAC;QAED,yCAAyC;QACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QAChI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAElB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,GAAG,WAAW,CAAC,QAAS,CAAC;IAErC,qCAAqC;IACrC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClF,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC3G,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACvG,OAAO,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,yBAAyB;IACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC;IAE5C,MAAM,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAElC,8BAA8B;IAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED,6DAA6D;IAC7D,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrE,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,0BAA0B;IAC1B,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAE3D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEhC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,kCAAkC,CAAC;YAEpE,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,WAAmB;IAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,+CAA+C;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,EAAE,KAAK,IAAI,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC;QAEvE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,QAAQ,CAAC,8BAA8B,EAAE;oBACvC,GAAG,EAAE,WAAW;oBAChB,KAAK,EAAE,MAAM;oBACb,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,YAAiB,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC,CAAC;gBACpF,OAAO;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,0DAA0D;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC;YACH,QAAQ,CAAC,mBAAmB,EAAE;gBAC5B,GAAG,EAAE,WAAW;gBAChB,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,SAAc,EAAE,CAAC;YACxB,kEAAkE;YAClE,kCAAkC;YAClC,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8DAA8D,CAAC,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;IAEH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAwB,EAAE,OAAoB,EAAE,cAA+B,EAAE,WAAmB;IAC/H,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,yEAAyE;IAEzE,uDAAuD;IACvD,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QACxC,MAAM,eAAe,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9E,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;QAE1E,IAAI,eAAe,EAAE,CAAC;YACpB,yBAAyB;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,UAAU,sCAAsC,CAAC,CAAC,CAAC;YACtF,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9D,iDAAiD;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2CAA2C,UAAU,GAAG,CAAC,CAAC,CAAC;YACpF,OAAO,CAAC,GAAG,CAAC,0DAA0D,UAAU,EAAE,CAAC,CAAC;YACpF,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,2CAA2C;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;SAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,kEAAkE;QAClE,MAAM,eAAe,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAChG,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,IAAI,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,4BAA4B,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;YACtF,OAAO,CAAC,GAAG,CAAC,wCAAwC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;IAEzF,iCAAiC;IACjC,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cerber-core",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.1.12",
|
|
4
|
+
"description": "Prevent secrets (API keys, passwords) and console.log in commits. Zero-config pre-commit hooks with Husky auto-install. Blocks Stripe, GitHub, AWS credentials out-of-the-box. 357+ teams protected.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
@@ -37,29 +37,48 @@
|
|
|
37
37
|
"url": "https://github.com/Agaslez/cerber-core.git"
|
|
38
38
|
},
|
|
39
39
|
"keywords": [
|
|
40
|
-
"ai",
|
|
41
|
-
"ai-agents",
|
|
42
|
-
"copilot",
|
|
43
|
-
"cursor",
|
|
44
|
-
"windsurf",
|
|
45
|
-
"claude",
|
|
46
|
-
"llm",
|
|
47
|
-
"pre-commit",
|
|
48
|
-
"git-hooks",
|
|
49
|
-
"husky",
|
|
50
40
|
"github-actions",
|
|
51
41
|
"ci",
|
|
52
42
|
"ci-cd",
|
|
43
|
+
"workflow-drift",
|
|
44
|
+
"config-drift",
|
|
45
|
+
"quality-gate",
|
|
46
|
+
"policy-as-code",
|
|
47
|
+
"contract-guard",
|
|
48
|
+
"reusable-workflow",
|
|
49
|
+
"devops",
|
|
50
|
+
"security",
|
|
51
|
+
"monorepo",
|
|
52
|
+
"multi-repo",
|
|
53
|
+
"pre-commit",
|
|
54
|
+
"git-hooks",
|
|
55
|
+
"husky",
|
|
56
|
+
"deployment-gate",
|
|
53
57
|
"guardrails",
|
|
54
58
|
"contract-first",
|
|
55
59
|
"single-source-of-truth",
|
|
56
60
|
"health-check",
|
|
57
|
-
"
|
|
58
|
-
"
|
|
61
|
+
"doctor",
|
|
62
|
+
"ai",
|
|
63
|
+
"ai-agents",
|
|
64
|
+
"copilot",
|
|
65
|
+
"cursor",
|
|
66
|
+
"windsurf",
|
|
67
|
+
"claude",
|
|
68
|
+
"llm",
|
|
69
|
+
"secrets",
|
|
70
|
+
"secret-scanning",
|
|
71
|
+
"secret-detection",
|
|
72
|
+
"api-keys",
|
|
73
|
+
"api-security",
|
|
74
|
+
"devsecops",
|
|
75
|
+
"code-quality",
|
|
76
|
+
"developer-tools",
|
|
77
|
+
"typescript",
|
|
78
|
+
"nodejs"
|
|
59
79
|
],
|
|
60
80
|
"author": {
|
|
61
81
|
"name": "Agata Sleziak",
|
|
62
|
-
"email": "agata@example.com",
|
|
63
82
|
"url": "https://github.com/Agaslez"
|
|
64
83
|
},
|
|
65
84
|
"contributors": [
|
|
@@ -89,9 +108,9 @@
|
|
|
89
108
|
"devDependencies": {
|
|
90
109
|
"@types/jest": "^29.5.0",
|
|
91
110
|
"@types/node": "^20.0.0",
|
|
92
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
93
|
-
"@typescript-eslint/parser": "^
|
|
94
|
-
"eslint": "^
|
|
111
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
112
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
113
|
+
"eslint": "^9.0.0",
|
|
95
114
|
"jest": "^29.7.0",
|
|
96
115
|
"prettier": "^3.0.0",
|
|
97
116
|
"ts-jest": "^29.1.0",
|
|
@@ -126,6 +126,26 @@ async function main() {
|
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
+
// Parse forbidConsole setting
|
|
130
|
+
const forbidConsoleMatch = cerberContent.match(/forbidConsole:\s*(true|false)/);
|
|
131
|
+
if (forbidConsoleMatch && forbidConsoleMatch[1] === 'true') {
|
|
132
|
+
forbiddenPatterns.push({
|
|
133
|
+
pattern: 'console\\.(log|debug|info|warn|error)',
|
|
134
|
+
name: 'Forbidden: console statements',
|
|
135
|
+
severity: 'error'
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Parse forbidDebugger setting
|
|
140
|
+
const forbidDebuggerMatch = cerberContent.match(/forbidDebugger:\s*(true|false)/);
|
|
141
|
+
if (forbidDebuggerMatch && forbidDebuggerMatch[1] === 'true') {
|
|
142
|
+
forbiddenPatterns.push({
|
|
143
|
+
pattern: '\\bdebugger\\b',
|
|
144
|
+
name: 'Forbidden: debugger statements',
|
|
145
|
+
severity: 'error'
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
129
149
|
if (schemaMode === 'required' && forbiddenPatterns.length === 0) {
|
|
130
150
|
console.error('❌ SCHEMA.mode: required but no rules defined');
|
|
131
151
|
console.error('Add forbiddenPatterns to SCHEMA section in CERBER.md');
|
|
@@ -126,6 +126,26 @@ async function main() {
|
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
+
// Parse forbidConsole setting
|
|
130
|
+
const forbidConsoleMatch = cerberContent.match(/forbidConsole:\s*(true|false)/);
|
|
131
|
+
if (forbidConsoleMatch && forbidConsoleMatch[1] === 'true') {
|
|
132
|
+
forbiddenPatterns.push({
|
|
133
|
+
pattern: 'console\\.(log|debug|info|warn|error)',
|
|
134
|
+
name: 'Forbidden: console statements',
|
|
135
|
+
severity: 'error'
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Parse forbidDebugger setting
|
|
140
|
+
const forbidDebuggerMatch = cerberContent.match(/forbidDebugger:\s*(true|false)/);
|
|
141
|
+
if (forbidDebuggerMatch && forbidDebuggerMatch[1] === 'true') {
|
|
142
|
+
forbiddenPatterns.push({
|
|
143
|
+
pattern: '\\bdebugger\\b',
|
|
144
|
+
name: 'Forbidden: debugger statements',
|
|
145
|
+
severity: 'error'
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
129
149
|
if (schemaMode === 'required' && forbiddenPatterns.length === 0) {
|
|
130
150
|
console.error('❌ SCHEMA.mode: required but no rules defined');
|
|
131
151
|
console.error('Add forbiddenPatterns to SCHEMA section in CERBER.md');
|