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,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardian - Pre-Commit Architecture Validator
|
|
3
|
+
* Blocks commits that violate architecture rules
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
export class Guardian {
|
|
8
|
+
schema;
|
|
9
|
+
errors = [];
|
|
10
|
+
warnings = [];
|
|
11
|
+
approvals = [];
|
|
12
|
+
constructor(schema) {
|
|
13
|
+
this.schema = schema;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Main validation entry point
|
|
17
|
+
*/
|
|
18
|
+
async validate() {
|
|
19
|
+
console.log('═══════════════════════════════════════════════════');
|
|
20
|
+
console.log('🛡️ GUARDIAN VALIDATOR');
|
|
21
|
+
console.log('═══════════════════════════════════════════════════');
|
|
22
|
+
this.checkRequiredFiles();
|
|
23
|
+
await this.checkForbiddenPatterns();
|
|
24
|
+
this.checkRequiredImports();
|
|
25
|
+
this.checkPackageLockSync();
|
|
26
|
+
return this.getResult();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if required files exist
|
|
30
|
+
*/
|
|
31
|
+
checkRequiredFiles() {
|
|
32
|
+
console.log('\n📁 Checking required files...');
|
|
33
|
+
for (const file of this.schema.requiredFiles || []) {
|
|
34
|
+
const filePath = path.join(process.cwd(), file);
|
|
35
|
+
if (!fs.existsSync(filePath)) {
|
|
36
|
+
this.addError(`MISSING REQUIRED FILE: ${file}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (this.errors.length === 0) {
|
|
40
|
+
console.log(' ✅ All required files present');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check for forbidden patterns with architect approval support
|
|
45
|
+
*/
|
|
46
|
+
async checkForbiddenPatterns() {
|
|
47
|
+
console.log('\n🔍 Checking for forbidden patterns...');
|
|
48
|
+
const srcPath = path.join(process.cwd(), 'src');
|
|
49
|
+
if (!fs.existsSync(srcPath)) {
|
|
50
|
+
console.log(' ⚠️ No src/ directory found');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
await this.scanDirectory(srcPath);
|
|
54
|
+
if (this.errors.length === 0) {
|
|
55
|
+
console.log(' ✅ No forbidden patterns found');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Recursively scan directory for violations
|
|
60
|
+
*/
|
|
61
|
+
async scanDirectory(dir) {
|
|
62
|
+
const files = fs.readdirSync(dir, { withFileTypes: true });
|
|
63
|
+
for (const file of files) {
|
|
64
|
+
const fullPath = path.join(dir, file.name);
|
|
65
|
+
if (file.isDirectory()) {
|
|
66
|
+
if (!file.name.startsWith('.') && file.name !== 'node_modules') {
|
|
67
|
+
await this.scanDirectory(fullPath);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (file.isFile()) {
|
|
71
|
+
const ext = path.extname(file.name);
|
|
72
|
+
if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {
|
|
73
|
+
await this.scanFile(fullPath);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Scan single file for violations
|
|
80
|
+
*/
|
|
81
|
+
async scanFile(filePath) {
|
|
82
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
83
|
+
const lines = content.split('\n');
|
|
84
|
+
const relativePath = path.relative(process.cwd(), filePath);
|
|
85
|
+
for (const forbidden of this.schema.forbiddenPatterns || []) {
|
|
86
|
+
for (let i = 0; i < lines.length; i++) {
|
|
87
|
+
const line = lines[i];
|
|
88
|
+
const matches = line.match(forbidden.pattern);
|
|
89
|
+
if (matches) {
|
|
90
|
+
// Check exceptions
|
|
91
|
+
const isException = this.isException(relativePath, forbidden.exceptions);
|
|
92
|
+
if (!isException) {
|
|
93
|
+
// Check for architect approval
|
|
94
|
+
const approval = this.checkArchitectApproval(lines, i);
|
|
95
|
+
if (approval) {
|
|
96
|
+
this.approvals.push({
|
|
97
|
+
file: relativePath,
|
|
98
|
+
line: i + 1,
|
|
99
|
+
...approval,
|
|
100
|
+
});
|
|
101
|
+
console.log(` ✅ Approved deviation: ${relativePath}:${i + 1} (${approval.reason})`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.addError(`FORBIDDEN PATTERN '${forbidden.name}' found in ${relativePath}:${i + 1}\n` +
|
|
105
|
+
` Line: "${line.trim()}"`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if file is in exception list
|
|
114
|
+
*/
|
|
115
|
+
isException(filePath, exceptions) {
|
|
116
|
+
if (!exceptions)
|
|
117
|
+
return false;
|
|
118
|
+
return exceptions.some(exc => filePath.includes(exc));
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check for architect approval comment
|
|
122
|
+
* Format: // ARCHITECT_APPROVED: [reason] - [date] - [architect]
|
|
123
|
+
*/
|
|
124
|
+
checkArchitectApproval(lines, lineIndex) {
|
|
125
|
+
const approvalPattern = /\/\/\s*ARCHITECT_APPROVED:\s*(.+?)\s*-\s*(\d{4}-\d{2}-\d{2})\s*-\s*([A-Za-z\s]+)/;
|
|
126
|
+
// Check same line
|
|
127
|
+
const sameLine = lines[lineIndex];
|
|
128
|
+
if (sameLine) {
|
|
129
|
+
const match = sameLine.match(approvalPattern);
|
|
130
|
+
if (match) {
|
|
131
|
+
return {
|
|
132
|
+
reason: match[1].trim(),
|
|
133
|
+
date: match[2],
|
|
134
|
+
architect: match[3].trim(),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Check line above
|
|
139
|
+
if (lineIndex > 0) {
|
|
140
|
+
const lineAbove = lines[lineIndex - 1];
|
|
141
|
+
if (lineAbove) {
|
|
142
|
+
const match = lineAbove.match(approvalPattern);
|
|
143
|
+
if (match) {
|
|
144
|
+
return {
|
|
145
|
+
reason: match[1].trim(),
|
|
146
|
+
date: match[2],
|
|
147
|
+
architect: match[3].trim(),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check required imports
|
|
156
|
+
*/
|
|
157
|
+
checkRequiredImports() {
|
|
158
|
+
console.log('\n📦 Checking required imports...');
|
|
159
|
+
for (const [filePath, imports] of Object.entries(this.schema.requiredImports || {})) {
|
|
160
|
+
const fullPath = path.join(process.cwd(), filePath);
|
|
161
|
+
if (!fs.existsSync(fullPath)) {
|
|
162
|
+
this.addWarning(`File ${filePath} not found (skipping import check)`);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
166
|
+
for (const requiredImport of imports) {
|
|
167
|
+
if (!content.includes(requiredImport)) {
|
|
168
|
+
this.addError(`MISSING IMPORT in ${filePath}: ${requiredImport}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (this.errors.length === 0) {
|
|
173
|
+
console.log(' ✅ All required imports present');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Check package.json and package-lock.json sync
|
|
178
|
+
*/
|
|
179
|
+
checkPackageLockSync() {
|
|
180
|
+
console.log('\n🔒 Checking package-lock.json sync...');
|
|
181
|
+
const packageJson = path.join(process.cwd(), 'package.json');
|
|
182
|
+
const packageLock = path.join(process.cwd(), 'package-lock.json');
|
|
183
|
+
if (!fs.existsSync(packageJson) || !fs.existsSync(packageLock)) {
|
|
184
|
+
this.addError('package.json or package-lock.json missing');
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
const pkgData = JSON.parse(fs.readFileSync(packageJson, 'utf-8'));
|
|
189
|
+
const lockData = JSON.parse(fs.readFileSync(packageLock, 'utf-8'));
|
|
190
|
+
if (pkgData.name !== lockData.name) {
|
|
191
|
+
this.addError('package.json and package-lock.json name mismatch');
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
console.log(' ✅ package-lock.json in sync');
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
const error = err;
|
|
198
|
+
this.addError(`Error checking package files: ${error.message}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Add error message
|
|
203
|
+
*/
|
|
204
|
+
addError(message) {
|
|
205
|
+
this.errors.push(message);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Add warning message
|
|
209
|
+
*/
|
|
210
|
+
addWarning(message) {
|
|
211
|
+
this.warnings.push(message);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get validation result
|
|
215
|
+
*/
|
|
216
|
+
getResult() {
|
|
217
|
+
console.log('\n═══════════════════════════════════════════════════');
|
|
218
|
+
console.log('📊 VALIDATION RESULTS');
|
|
219
|
+
console.log('═══════════════════════════════════════════════════');
|
|
220
|
+
// Show approvals
|
|
221
|
+
if (this.approvals.length > 0) {
|
|
222
|
+
console.log('\n✅ ARCHITECT APPROVALS:');
|
|
223
|
+
this.approvals.forEach(a => {
|
|
224
|
+
console.log(` 📄 ${a.file}:${a.line}`);
|
|
225
|
+
console.log(` Reason: ${a.reason}`);
|
|
226
|
+
console.log(` Approved by: ${a.architect} on ${a.date}`);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
// Show warnings
|
|
230
|
+
if (this.warnings.length > 0) {
|
|
231
|
+
console.log('\n⚠️ WARNINGS:');
|
|
232
|
+
this.warnings.forEach(w => console.log(` ${w}`));
|
|
233
|
+
}
|
|
234
|
+
// Show errors
|
|
235
|
+
if (this.errors.length > 0) {
|
|
236
|
+
console.log('\n❌ ERRORS:');
|
|
237
|
+
this.errors.forEach(e => console.log(` ${e}`));
|
|
238
|
+
console.log('\n❌ COMMIT BLOCKED - Fix errors above!');
|
|
239
|
+
console.log('\n💡 TIP: Add architect approval to allow:');
|
|
240
|
+
console.log(' // ARCHITECT_APPROVED: [reason] - YYYY-MM-DD - [name]');
|
|
241
|
+
console.log('═══════════════════════════════════════════════════\n');
|
|
242
|
+
return {
|
|
243
|
+
success: false,
|
|
244
|
+
errors: this.errors,
|
|
245
|
+
warnings: this.warnings,
|
|
246
|
+
approvals: this.approvals,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
console.log('\n✅ ALL CHECKS PASSED');
|
|
250
|
+
console.log('✅ Commit allowed');
|
|
251
|
+
console.log('═══════════════════════════════════════════════════\n');
|
|
252
|
+
return {
|
|
253
|
+
success: true,
|
|
254
|
+
errors: [],
|
|
255
|
+
warnings: this.warnings,
|
|
256
|
+
approvals: this.approvals,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Main validation function for CLI
|
|
262
|
+
*/
|
|
263
|
+
export async function validateGuardian(options) {
|
|
264
|
+
// Load schema
|
|
265
|
+
const schemaPath = path.resolve(process.cwd(), options.schema);
|
|
266
|
+
const schema = await import(schemaPath).then(m => m.default || m.SCHEMA);
|
|
267
|
+
// Run validation
|
|
268
|
+
const guardian = new Guardian(schema);
|
|
269
|
+
return guardian.validate();
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guardian/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardian + Cerber - Main Entry Point
|
|
3
|
+
* @package cerber-core
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
export { Cerber, makeIssue, runHealthChecks } from './cerber';
|
|
7
|
+
export { Guardian } from './guardian';
|
|
8
|
+
export * from './types';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,cAAc,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,cAAc,SAAS,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type Definitions for Guardian + Cerber
|
|
3
|
+
*/
|
|
4
|
+
export interface GuardianSchema {
|
|
5
|
+
requiredFiles?: string[];
|
|
6
|
+
forbiddenPatterns?: ForbiddenPattern[];
|
|
7
|
+
requiredImports?: Record<string, string[]>;
|
|
8
|
+
packageJsonRules?: PackageJsonRules;
|
|
9
|
+
}
|
|
10
|
+
export interface ForbiddenPattern {
|
|
11
|
+
pattern: RegExp;
|
|
12
|
+
name: string;
|
|
13
|
+
exceptions?: string[];
|
|
14
|
+
severity?: 'error' | 'warning';
|
|
15
|
+
}
|
|
16
|
+
export interface PackageJsonRules {
|
|
17
|
+
requiredScripts?: string[];
|
|
18
|
+
requiredDevDependencies?: string[];
|
|
19
|
+
requiredDependencies?: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface ArchitectApproval {
|
|
22
|
+
file?: string;
|
|
23
|
+
line?: number;
|
|
24
|
+
reason: string;
|
|
25
|
+
date: string;
|
|
26
|
+
architect: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ValidationResult {
|
|
29
|
+
success: boolean;
|
|
30
|
+
errors: string[];
|
|
31
|
+
warnings: string[];
|
|
32
|
+
approvals: ArchitectApproval[];
|
|
33
|
+
}
|
|
34
|
+
export interface CerberCheckContext {
|
|
35
|
+
rootDir: string;
|
|
36
|
+
[key: string]: any;
|
|
37
|
+
}
|
|
38
|
+
export type CerberCheck = (ctx: CerberCheckContext) => Promise<CerberIssue[]>;
|
|
39
|
+
export interface CerberIssue {
|
|
40
|
+
code: string;
|
|
41
|
+
component?: string;
|
|
42
|
+
severity: 'critical' | 'error' | 'warning' | 'info';
|
|
43
|
+
message: string;
|
|
44
|
+
rootCause?: string;
|
|
45
|
+
fix?: string;
|
|
46
|
+
durationMs?: number;
|
|
47
|
+
details?: Record<string, any>;
|
|
48
|
+
}
|
|
49
|
+
export interface CerberResult {
|
|
50
|
+
timestamp: string;
|
|
51
|
+
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
52
|
+
app: {
|
|
53
|
+
version: string;
|
|
54
|
+
env: string;
|
|
55
|
+
uptime: number;
|
|
56
|
+
nodeVersion: string;
|
|
57
|
+
};
|
|
58
|
+
components: Array<{
|
|
59
|
+
id: string;
|
|
60
|
+
name: string;
|
|
61
|
+
severity: string;
|
|
62
|
+
message: string;
|
|
63
|
+
details?: Record<string, any>;
|
|
64
|
+
fix?: string;
|
|
65
|
+
}>;
|
|
66
|
+
summary: {
|
|
67
|
+
totalChecks: number;
|
|
68
|
+
failedChecks: number;
|
|
69
|
+
criticalIssues: number;
|
|
70
|
+
errorIssues: number;
|
|
71
|
+
warningIssues: number;
|
|
72
|
+
};
|
|
73
|
+
durationMs: number;
|
|
74
|
+
}
|
|
75
|
+
export type CerberIssueInstance = CerberIssue;
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,GAAG,EAAE;QACH,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,UAAU,EAAE,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example Backend Schema for Guardian
|
|
3
|
+
* Shows typical architecture rules for Node.js/Express backends
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { GuardianSchema } from '../src/types';
|
|
7
|
+
|
|
8
|
+
export const backendSchema: GuardianSchema = {
|
|
9
|
+
requiredFiles: [
|
|
10
|
+
'package.json',
|
|
11
|
+
'package-lock.json',
|
|
12
|
+
'tsconfig.json',
|
|
13
|
+
'.env.example',
|
|
14
|
+
'.gitignore',
|
|
15
|
+
'README.md',
|
|
16
|
+
],
|
|
17
|
+
|
|
18
|
+
forbiddenPatterns: [
|
|
19
|
+
{
|
|
20
|
+
pattern: /password\s*=\s*['"][^'"]+['"]/i,
|
|
21
|
+
name: 'Hardcoded passwords',
|
|
22
|
+
severity: 'error',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
pattern: /api[_-]?key\s*=\s*['"][^'"]+['"]/i,
|
|
26
|
+
name: 'Hardcoded API keys',
|
|
27
|
+
severity: 'error',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
pattern: /mongodb:\/\/[^'"]+:[^'"]+@/,
|
|
31
|
+
name: 'MongoDB connection string with credentials',
|
|
32
|
+
exceptions: ['.env.example'],
|
|
33
|
+
severity: 'error',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
pattern: /console\.(log|debug|info)/,
|
|
37
|
+
name: 'Console statements - use logger instead',
|
|
38
|
+
exceptions: ['src/utils/logger.ts', 'scripts/**'],
|
|
39
|
+
severity: 'warning',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
pattern: /eval\(|new Function\(/,
|
|
43
|
+
name: 'Dangerous eval() or Function() constructor',
|
|
44
|
+
severity: 'error',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
pattern: /app\.use\(cors\(\)\)/,
|
|
48
|
+
name: 'CORS enabled for all origins - specify allowed origins',
|
|
49
|
+
exceptions: ['src/middleware/cors.ts'],
|
|
50
|
+
severity: 'error',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
pattern: /\.findOne\(|\.find\(|\.updateOne\(/,
|
|
54
|
+
name: 'Direct Mongoose calls - use repository pattern',
|
|
55
|
+
exceptions: ['src/repositories/**', 'src/models/**'],
|
|
56
|
+
severity: 'warning',
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
|
|
60
|
+
requiredImports: {
|
|
61
|
+
'src/routes/**/*.ts': ['import express', 'import { Router'],
|
|
62
|
+
'src/controllers/**/*.ts': ['import { Request, Response'],
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
packageJsonRules: {
|
|
66
|
+
requiredScripts: ['start', 'dev', 'build', 'test', 'lint'],
|
|
67
|
+
requiredDependencies: ['express', 'dotenv'],
|
|
68
|
+
requiredDevDependencies: ['typescript', '@types/node', '@types/express'],
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export default backendSchema;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example Frontend Schema for Guardian
|
|
3
|
+
* Shows typical architecture rules for React/Vue frontends
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { GuardianSchema } from '../src/types';
|
|
7
|
+
|
|
8
|
+
export const frontendSchema: GuardianSchema = {
|
|
9
|
+
requiredFiles: [
|
|
10
|
+
'package.json',
|
|
11
|
+
'package-lock.json',
|
|
12
|
+
'tsconfig.json',
|
|
13
|
+
'vite.config.ts', // or webpack.config.js
|
|
14
|
+
'.gitignore',
|
|
15
|
+
'README.md',
|
|
16
|
+
],
|
|
17
|
+
|
|
18
|
+
forbiddenPatterns: [
|
|
19
|
+
{
|
|
20
|
+
pattern: /console\.(log|debug|info)/,
|
|
21
|
+
name: 'Console statements in production code',
|
|
22
|
+
exceptions: ['src/utils/logger.ts', 'src/dev/**'],
|
|
23
|
+
severity: 'warning',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
pattern: /any\s+as\s+any|:\s*any/,
|
|
27
|
+
name: 'TypeScript any type',
|
|
28
|
+
exceptions: ['src/legacy/**'],
|
|
29
|
+
severity: 'error',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
pattern: /fetch\(/,
|
|
33
|
+
name: 'Direct fetch() calls - use apiClient instead',
|
|
34
|
+
exceptions: ['src/api/apiClient.ts'],
|
|
35
|
+
severity: 'error',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
pattern: /localStorage\.|sessionStorage\./,
|
|
39
|
+
name: 'Direct storage access - use storageService',
|
|
40
|
+
exceptions: ['src/services/storageService.ts'],
|
|
41
|
+
severity: 'warning',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
pattern: /process\.env/,
|
|
45
|
+
name: 'Direct environment variable access - use config',
|
|
46
|
+
exceptions: ['src/config/env.ts', 'vite.config.ts'],
|
|
47
|
+
severity: 'error',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
pattern: /\.test\.skip\(|\.describe\.skip\(/,
|
|
51
|
+
name: 'Skipped tests',
|
|
52
|
+
severity: 'warning',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
|
|
56
|
+
requiredImports: {
|
|
57
|
+
'src/components/**/*.tsx': ['import React', "import { FC, ReactNode"],
|
|
58
|
+
'src/pages/**/*.tsx': ['import React'],
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
packageJsonRules: {
|
|
62
|
+
requiredScripts: ['dev', 'build', 'test', 'lint'],
|
|
63
|
+
requiredDevDependencies: ['typescript', 'vite', '@types/node'],
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export default frontendSchema;
|