cerber-core 1.0.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/.cerber-example/BIBLE.md +132 -0
- package/.cerber-example/CERBER_LAW.md +200 -0
- package/.cerber-example/connections/contracts/booking-to-pricing.json +44 -0
- package/.cerber-example/connections/contracts/pricing-to-booking.json +37 -0
- package/.cerber-example/modules/booking-calendar/MODULE.md +225 -0
- package/.cerber-example/modules/booking-calendar/contract.json +106 -0
- package/.cerber-example/modules/booking-calendar/dependencies.json +8 -0
- package/.cerber-example/modules/pricing-engine/MODULE.md +160 -0
- package/.cerber-example/modules/pricing-engine/contract.json +64 -0
- package/.cerber-example/modules/pricing-engine/dependencies.json +8 -0
- package/CHANGELOG.md +68 -0
- package/LICENSE +21 -0
- package/README.md +1379 -0
- package/bin/cerber +105 -0
- package/bin/cerber-focus +31 -0
- package/bin/cerber-guardian +90 -0
- package/bin/cerber-health +113 -0
- package/bin/cerber-morning +19 -0
- package/bin/cerber-repair +21 -0
- package/dist/cerber/index.d.ts +47 -0
- package/dist/cerber/index.d.ts.map +1 -0
- package/dist/cerber/index.js +154 -0
- package/dist/cerber/index.js.map +1 -0
- package/dist/guardian/index.d.ts +70 -0
- package/dist/guardian/index.d.ts.map +1 -0
- package/dist/guardian/index.js +271 -0
- package/dist/guardian/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/examples/backend-schema.ts +72 -0
- package/examples/frontend-schema.ts +67 -0
- package/examples/health-checks.ts +196 -0
- package/examples/solo-integration/README.md +457 -0
- package/examples/solo-integration/package.json +47 -0
- package/examples/team-integration/README.md +347 -0
- package/examples/team-integration/package.json +23 -0
- package/package.json +104 -0
- package/solo/README.md +258 -0
- package/solo/config/performance-budget.json +53 -0
- package/solo/config/solo-contract.json +71 -0
- package/solo/lib/feature-flags.ts +177 -0
- package/solo/scripts/cerber-auto-repair.js +260 -0
- package/solo/scripts/cerber-daily-check.js +282 -0
- package/solo/scripts/cerber-dashboard.js +191 -0
- package/solo/scripts/cerber-deps-health.js +247 -0
- package/solo/scripts/cerber-docs-sync.js +304 -0
- package/solo/scripts/cerber-flags-check.js +229 -0
- package/solo/scripts/cerber-performance-budget.js +271 -0
- package/solo/scripts/cerber-rollback.js +229 -0
- package/solo/scripts/cerber-snapshot.js +319 -0
- package/team/README.md +327 -0
- package/team/config/team-contract.json +27 -0
- package/team/lib/module-system.ts +157 -0
- package/team/scripts/cerber-add-module.sh +195 -0
- package/team/scripts/cerber-connections-check.sh +186 -0
- package/team/scripts/cerber-focus.sh +170 -0
- package/team/scripts/cerber-module-check.sh +165 -0
- package/team/scripts/cerber-team-morning.sh +210 -0
- package/team/templates/BIBLE_TEMPLATE.md +52 -0
- package/team/templates/CONNECTION_TEMPLATE.json +20 -0
- package/team/templates/MODULE_TEMPLATE.md +60 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Cerber SOLO - Snapshot Tool
|
|
5
|
+
*
|
|
6
|
+
* Extends Cerber Core with automation for solo developers
|
|
7
|
+
*
|
|
8
|
+
* Captures:
|
|
9
|
+
* - Git statistics
|
|
10
|
+
* - File counts
|
|
11
|
+
* - LOC metrics
|
|
12
|
+
* - Guardian status
|
|
13
|
+
* - Saves to .cerber/snapshots/ (30-day retention)
|
|
14
|
+
*
|
|
15
|
+
* @author Stefan Pitek
|
|
16
|
+
* @copyright 2026 Stefan Pitek
|
|
17
|
+
* @license MIT
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const fs = require('fs');
|
|
21
|
+
const path = require('path');
|
|
22
|
+
const { execSync } = require('child_process');
|
|
23
|
+
|
|
24
|
+
console.log('📸 Cerber SOLO - Daily Snapshot\n');
|
|
25
|
+
|
|
26
|
+
const snapshotDir = path.join(process.cwd(), '.cerber', 'snapshots');
|
|
27
|
+
const date = new Date();
|
|
28
|
+
const dateStr = date.toISOString().split('T')[0];
|
|
29
|
+
const timestamp = date.toISOString();
|
|
30
|
+
|
|
31
|
+
// Create snapshot directory
|
|
32
|
+
if (!fs.existsSync(snapshotDir)) {
|
|
33
|
+
fs.mkdirSync(snapshotDir, { recursive: true });
|
|
34
|
+
console.log(`✅ Created snapshot directory: ${snapshotDir}\n`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const snapshot = {
|
|
38
|
+
date: dateStr,
|
|
39
|
+
timestamp: timestamp,
|
|
40
|
+
version: '2.0-solo'
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Capture Git statistics
|
|
45
|
+
*/
|
|
46
|
+
function captureGitStats() {
|
|
47
|
+
console.log('📊 Capturing Git statistics...');
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
// Total commits
|
|
51
|
+
const totalCommits = execSync('git rev-list --all --count', {
|
|
52
|
+
encoding: 'utf8',
|
|
53
|
+
stdio: 'pipe'
|
|
54
|
+
}).trim();
|
|
55
|
+
|
|
56
|
+
snapshot.git = {
|
|
57
|
+
totalCommits: parseInt(totalCommits)
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// Today's commits
|
|
61
|
+
const todayCommits = execSync(`git log --since="00:00:00" --oneline | wc -l`, {
|
|
62
|
+
encoding: 'utf8',
|
|
63
|
+
stdio: 'pipe'
|
|
64
|
+
}).trim();
|
|
65
|
+
|
|
66
|
+
snapshot.git.commitsToday = parseInt(todayCommits);
|
|
67
|
+
|
|
68
|
+
// Current branch
|
|
69
|
+
const branch = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
70
|
+
encoding: 'utf8',
|
|
71
|
+
stdio: 'pipe'
|
|
72
|
+
}).trim();
|
|
73
|
+
|
|
74
|
+
snapshot.git.branch = branch;
|
|
75
|
+
|
|
76
|
+
// Get today's stats
|
|
77
|
+
try {
|
|
78
|
+
const stats = execSync(`git diff --shortstat HEAD~1..HEAD 2>/dev/null || echo "0 files changed"`, {
|
|
79
|
+
encoding: 'utf8',
|
|
80
|
+
stdio: 'pipe'
|
|
81
|
+
}).trim();
|
|
82
|
+
|
|
83
|
+
const filesMatch = stats.match(/(\d+) file[s]? changed/);
|
|
84
|
+
const insertionsMatch = stats.match(/(\d+) insertion[s]?\(\+\)/);
|
|
85
|
+
const deletionsMatch = stats.match(/(\d+) deletion[s]?\(-\)/);
|
|
86
|
+
|
|
87
|
+
snapshot.git.filesChanged = filesMatch ? parseInt(filesMatch[1]) : 0;
|
|
88
|
+
snapshot.git.linesAdded = insertionsMatch ? parseInt(insertionsMatch[1]) : 0;
|
|
89
|
+
snapshot.git.linesRemoved = deletionsMatch ? parseInt(deletionsMatch[1]) : 0;
|
|
90
|
+
} catch (error) {
|
|
91
|
+
// First commit or no changes
|
|
92
|
+
snapshot.git.filesChanged = 0;
|
|
93
|
+
snapshot.git.linesAdded = 0;
|
|
94
|
+
snapshot.git.linesRemoved = 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
console.log(` ✅ Total commits: ${snapshot.git.totalCommits}`);
|
|
98
|
+
console.log(` ✅ Today's commits: ${snapshot.git.commitsToday}`);
|
|
99
|
+
console.log(` ✅ Branch: ${snapshot.git.branch}`);
|
|
100
|
+
console.log(` ✅ Files changed: ${snapshot.git.filesChanged}`);
|
|
101
|
+
console.log(` ✅ Lines: +${snapshot.git.linesAdded} -${snapshot.git.linesRemoved}`);
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.log(' ⚠️ Not a git repository');
|
|
104
|
+
snapshot.git = { error: 'Not a git repository' };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
console.log();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Count files by type
|
|
112
|
+
*/
|
|
113
|
+
function captureFileCounts() {
|
|
114
|
+
console.log('📁 Counting files...');
|
|
115
|
+
|
|
116
|
+
const extensions = {
|
|
117
|
+
'.ts': 0,
|
|
118
|
+
'.tsx': 0,
|
|
119
|
+
'.js': 0,
|
|
120
|
+
'.jsx': 0,
|
|
121
|
+
'.json': 0,
|
|
122
|
+
'.md': 0
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
function countFiles(dir) {
|
|
126
|
+
if (!fs.existsSync(dir)) return;
|
|
127
|
+
|
|
128
|
+
// Skip node_modules, dist, build, etc.
|
|
129
|
+
const skipDirs = ['node_modules', 'dist', 'build', '.git', '.next', 'out', 'coverage'];
|
|
130
|
+
const dirName = path.basename(dir);
|
|
131
|
+
if (skipDirs.includes(dirName)) return;
|
|
132
|
+
|
|
133
|
+
const files = fs.readdirSync(dir);
|
|
134
|
+
|
|
135
|
+
files.forEach(file => {
|
|
136
|
+
const filePath = path.join(dir, file);
|
|
137
|
+
const stat = fs.statSync(filePath);
|
|
138
|
+
|
|
139
|
+
if (stat.isDirectory()) {
|
|
140
|
+
countFiles(filePath);
|
|
141
|
+
} else {
|
|
142
|
+
const ext = path.extname(file);
|
|
143
|
+
if (extensions.hasOwnProperty(ext)) {
|
|
144
|
+
extensions[ext]++;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
countFiles(process.cwd());
|
|
151
|
+
|
|
152
|
+
snapshot.files = extensions;
|
|
153
|
+
|
|
154
|
+
const total = Object.values(extensions).reduce((a, b) => a + b, 0);
|
|
155
|
+
console.log(` ✅ Total files: ${total}`);
|
|
156
|
+
Object.entries(extensions).forEach(([ext, count]) => {
|
|
157
|
+
if (count > 0) {
|
|
158
|
+
console.log(` ${ext}: ${count}`);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
console.log();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Count lines of code
|
|
167
|
+
*/
|
|
168
|
+
function captureLOC() {
|
|
169
|
+
console.log('📏 Counting lines of code...');
|
|
170
|
+
|
|
171
|
+
try {
|
|
172
|
+
// Use cloc if available, otherwise use simple wc
|
|
173
|
+
try {
|
|
174
|
+
const clocOutput = execSync('cloc . --json 2>/dev/null', {
|
|
175
|
+
encoding: 'utf8',
|
|
176
|
+
maxBuffer: 10 * 1024 * 1024
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
const clocData = JSON.parse(clocOutput);
|
|
180
|
+
|
|
181
|
+
if (clocData.SUM) {
|
|
182
|
+
snapshot.loc = {
|
|
183
|
+
total: clocData.SUM.code || 0,
|
|
184
|
+
comments: clocData.SUM.comment || 0,
|
|
185
|
+
blank: clocData.SUM.blank || 0
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
console.log(` ✅ Code lines: ${snapshot.loc.total}`);
|
|
189
|
+
console.log(` ✅ Comments: ${snapshot.loc.comments}`);
|
|
190
|
+
console.log(` ✅ Blank lines: ${snapshot.loc.blank}`);
|
|
191
|
+
}
|
|
192
|
+
} catch (error) {
|
|
193
|
+
// cloc not available, use simple line count
|
|
194
|
+
const tsLines = execSync(`find . -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" | grep -v node_modules | xargs wc -l 2>/dev/null | tail -1 | awk '{print $1}' || echo 0`, {
|
|
195
|
+
encoding: 'utf8'
|
|
196
|
+
}).trim();
|
|
197
|
+
|
|
198
|
+
snapshot.loc = {
|
|
199
|
+
total: parseInt(tsLines) || 0,
|
|
200
|
+
method: 'simple'
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
console.log(` ✅ Estimated lines: ${snapshot.loc.total}`);
|
|
204
|
+
console.log(' ℹ️ Install cloc for detailed stats');
|
|
205
|
+
}
|
|
206
|
+
} catch (error) {
|
|
207
|
+
console.log(' ⚠️ Could not count LOC');
|
|
208
|
+
snapshot.loc = { error: error.message };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
console.log();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Check Guardian status
|
|
216
|
+
*/
|
|
217
|
+
function captureGuardianStatus() {
|
|
218
|
+
console.log('🛡️ Checking Guardian status...');
|
|
219
|
+
|
|
220
|
+
const guardianPaths = [
|
|
221
|
+
'scripts/validate-schema.mjs',
|
|
222
|
+
'scripts/validate-schema.js',
|
|
223
|
+
'.husky/pre-commit'
|
|
224
|
+
];
|
|
225
|
+
|
|
226
|
+
const guardianExists = guardianPaths.some(p =>
|
|
227
|
+
fs.existsSync(path.join(process.cwd(), p))
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
snapshot.guardian = {
|
|
231
|
+
installed: guardianExists
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
console.log(` ${guardianExists ? '✅' : '⚠️'} Guardian: ${guardianExists ? 'installed' : 'not detected'}`);
|
|
235
|
+
console.log();
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Check package.json info
|
|
240
|
+
*/
|
|
241
|
+
function capturePackageInfo() {
|
|
242
|
+
console.log('📦 Checking package info...');
|
|
243
|
+
|
|
244
|
+
const packagePath = path.join(process.cwd(), 'package.json');
|
|
245
|
+
|
|
246
|
+
if (fs.existsSync(packagePath)) {
|
|
247
|
+
try {
|
|
248
|
+
const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
|
249
|
+
|
|
250
|
+
snapshot.package = {
|
|
251
|
+
name: packageData.name || 'unknown',
|
|
252
|
+
version: packageData.version || '0.0.0',
|
|
253
|
+
dependencies: Object.keys(packageData.dependencies || {}).length,
|
|
254
|
+
devDependencies: Object.keys(packageData.devDependencies || {}).length
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
console.log(` ✅ Project: ${snapshot.package.name}@${snapshot.package.version}`);
|
|
258
|
+
console.log(` ✅ Dependencies: ${snapshot.package.dependencies}`);
|
|
259
|
+
console.log(` ✅ Dev dependencies: ${snapshot.package.devDependencies}`);
|
|
260
|
+
} catch (error) {
|
|
261
|
+
console.log(' ⚠️ Could not parse package.json');
|
|
262
|
+
}
|
|
263
|
+
} else {
|
|
264
|
+
console.log(' ℹ️ No package.json found');
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
console.log();
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Capture all data
|
|
271
|
+
captureGitStats();
|
|
272
|
+
captureFileCounts();
|
|
273
|
+
captureLOC();
|
|
274
|
+
captureGuardianStatus();
|
|
275
|
+
capturePackageInfo();
|
|
276
|
+
|
|
277
|
+
// Save snapshot
|
|
278
|
+
const snapshotPath = path.join(snapshotDir, `${dateStr}.json`);
|
|
279
|
+
fs.writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf8');
|
|
280
|
+
|
|
281
|
+
console.log('💾 Snapshot saved!');
|
|
282
|
+
console.log(` Location: ${snapshotPath}\n`);
|
|
283
|
+
|
|
284
|
+
// Cleanup old snapshots (keep 30 days)
|
|
285
|
+
console.log('🧹 Cleaning up old snapshots...');
|
|
286
|
+
|
|
287
|
+
try {
|
|
288
|
+
const files = fs.readdirSync(snapshotDir);
|
|
289
|
+
const now = Date.now();
|
|
290
|
+
const thirtyDaysAgo = now - (30 * 24 * 60 * 60 * 1000);
|
|
291
|
+
|
|
292
|
+
let deleted = 0;
|
|
293
|
+
|
|
294
|
+
files.forEach(file => {
|
|
295
|
+
const filePath = path.join(snapshotDir, file);
|
|
296
|
+
const stat = fs.statSync(filePath);
|
|
297
|
+
|
|
298
|
+
if (stat.mtime.getTime() < thirtyDaysAgo) {
|
|
299
|
+
fs.unlinkSync(filePath);
|
|
300
|
+
deleted++;
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
if (deleted > 0) {
|
|
305
|
+
console.log(` ✅ Deleted ${deleted} old snapshot(s)`);
|
|
306
|
+
} else {
|
|
307
|
+
console.log(` ✅ No old snapshots to delete`);
|
|
308
|
+
}
|
|
309
|
+
} catch (error) {
|
|
310
|
+
console.log(' ⚠️ Could not cleanup old snapshots');
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
console.log();
|
|
314
|
+
console.log('='.repeat(60));
|
|
315
|
+
console.log('\n✅ Snapshot complete!\n');
|
|
316
|
+
console.log('📊 View your snapshots in: .cerber/snapshots/\n');
|
|
317
|
+
console.log('='.repeat(60));
|
|
318
|
+
|
|
319
|
+
process.exit(0);
|
package/team/README.md
ADDED
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# 🛡️ Cerber TEAM - Quick Start
|
|
2
|
+
|
|
3
|
+
**Team collaboration layer for large codebases**
|
|
4
|
+
|
|
5
|
+
Author: Stefan Pitek
|
|
6
|
+
Version: 2.0-team
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## What is Cerber TEAM?
|
|
11
|
+
|
|
12
|
+
Cerber TEAM adds module system and focus mode to help teams work on large codebases more efficiently.
|
|
13
|
+
|
|
14
|
+
**Key Features:**
|
|
15
|
+
- **📦 Module System** - Clear boundaries between components
|
|
16
|
+
- **🎯 Focus Mode** - AI gets 500 LOC instead of 10,000 LOC (10x faster)
|
|
17
|
+
- **🔗 Connection Contracts** - Explicit interfaces between modules
|
|
18
|
+
- **📖 BIBLE.md** - Master project map
|
|
19
|
+
- **✅ Validation** - Enforce module boundaries automatically
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Quick Start (5 minutes)
|
|
24
|
+
|
|
25
|
+
### 1. Setup
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Create .cerber directory
|
|
29
|
+
mkdir -p .cerber/modules
|
|
30
|
+
mkdir -p .cerber/connections/contracts
|
|
31
|
+
|
|
32
|
+
# Create project BIBLE
|
|
33
|
+
cp team/templates/BIBLE_TEMPLATE.md .cerber/BIBLE.md
|
|
34
|
+
|
|
35
|
+
# Edit BIBLE.md to describe your project
|
|
36
|
+
nano .cerber/BIBLE.md
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 2. Create Your First Module
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Create module
|
|
43
|
+
bash team/scripts/cerber-add-module.sh my-first-module
|
|
44
|
+
|
|
45
|
+
# Output:
|
|
46
|
+
# ✅ Created .cerber/modules/my-first-module/
|
|
47
|
+
# ✅ MODULE.md created from template
|
|
48
|
+
# ✅ contract.json initialized
|
|
49
|
+
# ✅ dependencies.json created
|
|
50
|
+
# ✅ BIBLE.md updated
|
|
51
|
+
|
|
52
|
+
# Edit module documentation
|
|
53
|
+
nano .cerber/modules/my-first-module/MODULE.md
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 3. Use Focus Mode
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Generate focus context (10x faster AI)
|
|
60
|
+
bash team/scripts/cerber-focus.sh my-first-module
|
|
61
|
+
|
|
62
|
+
# Output:
|
|
63
|
+
# ✅ Focus context created: .cerber/FOCUS_CONTEXT.md
|
|
64
|
+
# 📖 Context contains 500 LOC (vs 10,000 LOC for whole project)
|
|
65
|
+
# 🤖 AI can now work 10x faster
|
|
66
|
+
|
|
67
|
+
# View the context
|
|
68
|
+
cat .cerber/FOCUS_CONTEXT.md
|
|
69
|
+
|
|
70
|
+
# Share this with AI instead of entire codebase!
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 4. Validate
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Validate module
|
|
77
|
+
bash team/scripts/cerber-module-check.sh my-first-module
|
|
78
|
+
|
|
79
|
+
# Output:
|
|
80
|
+
# ✅ MODULE.md exists
|
|
81
|
+
# ✅ contract.json valid
|
|
82
|
+
# ✅ All dependencies declared
|
|
83
|
+
# ✅ MODULE CHECK PASSED
|
|
84
|
+
|
|
85
|
+
# Validate connections
|
|
86
|
+
bash team/scripts/cerber-connections-check.sh
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 5. Daily Workflow
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Morning dashboard
|
|
93
|
+
bash team/scripts/cerber-team-morning.sh
|
|
94
|
+
|
|
95
|
+
# Shows:
|
|
96
|
+
# - All modules and their health
|
|
97
|
+
# - Connection contracts status
|
|
98
|
+
# - Recent activity
|
|
99
|
+
# - Today's focus
|
|
100
|
+
|
|
101
|
+
# Work on a module
|
|
102
|
+
bash team/scripts/cerber-focus.sh my-module
|
|
103
|
+
# [Share FOCUS_CONTEXT.md with AI]
|
|
104
|
+
# [Make changes]
|
|
105
|
+
|
|
106
|
+
# Validate before commit
|
|
107
|
+
bash team/scripts/cerber-module-check.sh my-module
|
|
108
|
+
git commit
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Scripts Reference
|
|
114
|
+
|
|
115
|
+
### cerber-add-module.sh
|
|
116
|
+
Creates new module from template
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
bash team/scripts/cerber-add-module.sh <module-name>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### cerber-focus.sh ⭐ MOST IMPORTANT
|
|
123
|
+
Generates FOCUS_CONTEXT.md for a module (10x faster AI)
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
bash team/scripts/cerber-focus.sh <module-name>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### cerber-module-check.sh
|
|
130
|
+
Validates single module
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
bash team/scripts/cerber-module-check.sh <module-name>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### cerber-connections-check.sh
|
|
137
|
+
Validates all connection contracts
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
bash team/scripts/cerber-connections-check.sh
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### cerber-team-morning.sh
|
|
144
|
+
Team morning dashboard
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
bash team/scripts/cerber-team-morning.sh
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Module Structure
|
|
153
|
+
|
|
154
|
+
Every module has:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
.cerber/modules/my-module/
|
|
158
|
+
├── MODULE.md # Complete documentation
|
|
159
|
+
├── contract.json # Public interface (versioned)
|
|
160
|
+
└── dependencies.json # List of dependencies
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**MODULE.md** - Human-readable documentation:
|
|
164
|
+
- Purpose and responsibilities
|
|
165
|
+
- Public interface (functions, parameters, returns)
|
|
166
|
+
- Dependencies and why
|
|
167
|
+
- File structure
|
|
168
|
+
- Testing instructions
|
|
169
|
+
|
|
170
|
+
**contract.json** - Machine-readable interface:
|
|
171
|
+
- Version (semver)
|
|
172
|
+
- Public functions with types
|
|
173
|
+
- Dependencies list
|
|
174
|
+
|
|
175
|
+
**dependencies.json** - Explicit dependencies:
|
|
176
|
+
- List of modules this module uses
|
|
177
|
+
- Reason for each dependency
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Connection Contracts
|
|
182
|
+
|
|
183
|
+
Document how modules communicate:
|
|
184
|
+
|
|
185
|
+
```json
|
|
186
|
+
{
|
|
187
|
+
"id": "module-a-to-module-b",
|
|
188
|
+
"from": "module-a",
|
|
189
|
+
"to": "module-b",
|
|
190
|
+
"type": "function-call",
|
|
191
|
+
"interface": {
|
|
192
|
+
"function": "processData",
|
|
193
|
+
"input": { "type": "ProcessParams", "fields": [...] },
|
|
194
|
+
"output": { "type": "ProcessResult", "fields": [...] }
|
|
195
|
+
},
|
|
196
|
+
"version": "1.0.0",
|
|
197
|
+
"breaking_changes": []
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Create contract:**
|
|
202
|
+
```bash
|
|
203
|
+
cp team/templates/CONNECTION_TEMPLATE.json \
|
|
204
|
+
.cerber/connections/contracts/module-a-to-module-b.json
|
|
205
|
+
|
|
206
|
+
# Edit the contract
|
|
207
|
+
nano .cerber/connections/contracts/module-a-to-module-b.json
|
|
208
|
+
|
|
209
|
+
# Validate
|
|
210
|
+
bash team/scripts/cerber-connections-check.sh
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## BIBLE.md
|
|
216
|
+
|
|
217
|
+
Master project map showing:
|
|
218
|
+
- Architecture overview
|
|
219
|
+
- All modules and owners
|
|
220
|
+
- Connections between modules
|
|
221
|
+
- Team responsibilities
|
|
222
|
+
- Tech stack
|
|
223
|
+
|
|
224
|
+
**Create BIBLE:**
|
|
225
|
+
```bash
|
|
226
|
+
cp team/templates/BIBLE_TEMPLATE.md .cerber/BIBLE.md
|
|
227
|
+
nano .cerber/BIBLE.md
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Integration with Guardian + Cerber + SOLO
|
|
233
|
+
|
|
234
|
+
Cerber TEAM works alongside existing tools:
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
Morning:
|
|
238
|
+
bash team/scripts/cerber-team-morning.sh (TEAM dashboard)
|
|
239
|
+
|
|
240
|
+
Development:
|
|
241
|
+
bash team/scripts/cerber-focus.sh <module> (TEAM focus mode)
|
|
242
|
+
git commit (Guardian validates)
|
|
243
|
+
|
|
244
|
+
Pre-push:
|
|
245
|
+
npm run cerber:pre-push (SOLO checks)
|
|
246
|
+
|
|
247
|
+
Deploy:
|
|
248
|
+
curl /api/health (Cerber 2.1 validates)
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Add to package.json
|
|
254
|
+
|
|
255
|
+
```json
|
|
256
|
+
{
|
|
257
|
+
"scripts": {
|
|
258
|
+
"cerber:morning": "bash team/scripts/cerber-team-morning.sh",
|
|
259
|
+
"cerber:focus": "bash team/scripts/cerber-focus.sh",
|
|
260
|
+
"cerber:add-module": "bash team/scripts/cerber-add-module.sh",
|
|
261
|
+
"cerber:check-module": "bash team/scripts/cerber-module-check.sh",
|
|
262
|
+
"cerber:check-connections": "bash team/scripts/cerber-connections-check.sh"
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## Example Project
|
|
270
|
+
|
|
271
|
+
See `.cerber-example/` for complete working example:
|
|
272
|
+
- BIBLE.md
|
|
273
|
+
- CERBER_LAW.md
|
|
274
|
+
- Two complete modules (pricing-engine, booking-calendar)
|
|
275
|
+
- Connection contracts
|
|
276
|
+
|
|
277
|
+
Study these files to understand best practices!
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Documentation
|
|
282
|
+
|
|
283
|
+
**Full documentation:** [docs/TEAM.md](../docs/TEAM.md) (20+ KB)
|
|
284
|
+
|
|
285
|
+
Topics covered:
|
|
286
|
+
- Complete installation guide
|
|
287
|
+
- Module system deep dive
|
|
288
|
+
- Focus mode workflow
|
|
289
|
+
- Connection contracts guide
|
|
290
|
+
- Team collaboration workflows
|
|
291
|
+
- Best practices
|
|
292
|
+
- Troubleshooting
|
|
293
|
+
- FAQ
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## Benefits
|
|
298
|
+
|
|
299
|
+
**Before TEAM:**
|
|
300
|
+
- AI processes 10,000 LOC → 60 seconds
|
|
301
|
+
- Unclear module boundaries
|
|
302
|
+
- Hidden dependencies
|
|
303
|
+
- Documentation drift
|
|
304
|
+
|
|
305
|
+
**After TEAM:**
|
|
306
|
+
- AI processes 500 LOC → 6 seconds (10x faster ⚡)
|
|
307
|
+
- Clear module boundaries
|
|
308
|
+
- Explicit dependencies
|
|
309
|
+
- Living documentation
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## License
|
|
314
|
+
|
|
315
|
+
MIT © 2026 Stefan Pitek
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## Support
|
|
320
|
+
|
|
321
|
+
- **Documentation:** [docs/TEAM.md](../docs/TEAM.md)
|
|
322
|
+
- **Examples:** `.cerber-example/`
|
|
323
|
+
- **Issues:** https://github.com/Agaslez/cerber-core/issues
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
**Built with ❤️ by Stefan Pitek**
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0-team",
|
|
3
|
+
"extends": "cerber-core",
|
|
4
|
+
"team": {
|
|
5
|
+
"enabled": true,
|
|
6
|
+
"modulesPath": ".cerber/modules",
|
|
7
|
+
"connectionsPath": ".cerber/connections/contracts",
|
|
8
|
+
"biblePath": ".cerber/BIBLE.md"
|
|
9
|
+
},
|
|
10
|
+
"moduleValidation": {
|
|
11
|
+
"requireModuleMd": true,
|
|
12
|
+
"requireContract": true,
|
|
13
|
+
"requireDependencies": true,
|
|
14
|
+
"forbiddenCrossModuleImports": true
|
|
15
|
+
},
|
|
16
|
+
"focusMode": {
|
|
17
|
+
"enabled": true,
|
|
18
|
+
"outputPath": ".cerber/FOCUS_CONTEXT.md",
|
|
19
|
+
"includeContracts": true,
|
|
20
|
+
"includeDependencies": true
|
|
21
|
+
},
|
|
22
|
+
"connectionValidation": {
|
|
23
|
+
"requireBidirectional": true,
|
|
24
|
+
"checkBreakingChanges": true,
|
|
25
|
+
"detectCircular": true
|
|
26
|
+
}
|
|
27
|
+
}
|