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.
Files changed (67) hide show
  1. package/.cerber-example/BIBLE.md +132 -0
  2. package/.cerber-example/CERBER_LAW.md +200 -0
  3. package/.cerber-example/connections/contracts/booking-to-pricing.json +44 -0
  4. package/.cerber-example/connections/contracts/pricing-to-booking.json +37 -0
  5. package/.cerber-example/modules/booking-calendar/MODULE.md +225 -0
  6. package/.cerber-example/modules/booking-calendar/contract.json +106 -0
  7. package/.cerber-example/modules/booking-calendar/dependencies.json +8 -0
  8. package/.cerber-example/modules/pricing-engine/MODULE.md +160 -0
  9. package/.cerber-example/modules/pricing-engine/contract.json +64 -0
  10. package/.cerber-example/modules/pricing-engine/dependencies.json +8 -0
  11. package/CHANGELOG.md +68 -0
  12. package/LICENSE +21 -0
  13. package/README.md +1379 -0
  14. package/bin/cerber +105 -0
  15. package/bin/cerber-focus +31 -0
  16. package/bin/cerber-guardian +90 -0
  17. package/bin/cerber-health +113 -0
  18. package/bin/cerber-morning +19 -0
  19. package/bin/cerber-repair +21 -0
  20. package/dist/cerber/index.d.ts +47 -0
  21. package/dist/cerber/index.d.ts.map +1 -0
  22. package/dist/cerber/index.js +154 -0
  23. package/dist/cerber/index.js.map +1 -0
  24. package/dist/guardian/index.d.ts +70 -0
  25. package/dist/guardian/index.d.ts.map +1 -0
  26. package/dist/guardian/index.js +271 -0
  27. package/dist/guardian/index.js.map +1 -0
  28. package/dist/index.d.ts +9 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +9 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/types.d.ts +76 -0
  33. package/dist/types.d.ts.map +1 -0
  34. package/dist/types.js +5 -0
  35. package/dist/types.js.map +1 -0
  36. package/examples/backend-schema.ts +72 -0
  37. package/examples/frontend-schema.ts +67 -0
  38. package/examples/health-checks.ts +196 -0
  39. package/examples/solo-integration/README.md +457 -0
  40. package/examples/solo-integration/package.json +47 -0
  41. package/examples/team-integration/README.md +347 -0
  42. package/examples/team-integration/package.json +23 -0
  43. package/package.json +104 -0
  44. package/solo/README.md +258 -0
  45. package/solo/config/performance-budget.json +53 -0
  46. package/solo/config/solo-contract.json +71 -0
  47. package/solo/lib/feature-flags.ts +177 -0
  48. package/solo/scripts/cerber-auto-repair.js +260 -0
  49. package/solo/scripts/cerber-daily-check.js +282 -0
  50. package/solo/scripts/cerber-dashboard.js +191 -0
  51. package/solo/scripts/cerber-deps-health.js +247 -0
  52. package/solo/scripts/cerber-docs-sync.js +304 -0
  53. package/solo/scripts/cerber-flags-check.js +229 -0
  54. package/solo/scripts/cerber-performance-budget.js +271 -0
  55. package/solo/scripts/cerber-rollback.js +229 -0
  56. package/solo/scripts/cerber-snapshot.js +319 -0
  57. package/team/README.md +327 -0
  58. package/team/config/team-contract.json +27 -0
  59. package/team/lib/module-system.ts +157 -0
  60. package/team/scripts/cerber-add-module.sh +195 -0
  61. package/team/scripts/cerber-connections-check.sh +186 -0
  62. package/team/scripts/cerber-focus.sh +170 -0
  63. package/team/scripts/cerber-module-check.sh +165 -0
  64. package/team/scripts/cerber-team-morning.sh +210 -0
  65. package/team/templates/BIBLE_TEMPLATE.md +52 -0
  66. package/team/templates/CONNECTION_TEMPLATE.json +20 -0
  67. 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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"}
@@ -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,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.js.map
@@ -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"}
@@ -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,5 @@
1
+ /**
2
+ * Type Definitions for Guardian + Cerber
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -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;