@codeledger/cli 0.6.6 → 0.6.8

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 (111) hide show
  1. package/dist/architecture-graph/dependency-scanner.d.ts +16 -0
  2. package/dist/architecture-graph/dependency-scanner.d.ts.map +1 -0
  3. package/dist/architecture-graph/dependency-scanner.js +96 -0
  4. package/dist/architecture-graph/dependency-scanner.js.map +1 -0
  5. package/dist/architecture-graph/graph-builder.d.ts +70 -0
  6. package/dist/architecture-graph/graph-builder.d.ts.map +1 -0
  7. package/dist/architecture-graph/graph-builder.js +231 -0
  8. package/dist/architecture-graph/graph-builder.js.map +1 -0
  9. package/dist/architecture-graph/index.d.ts +4 -0
  10. package/dist/architecture-graph/index.d.ts.map +1 -0
  11. package/dist/architecture-graph/index.js +7 -0
  12. package/dist/architecture-graph/index.js.map +1 -0
  13. package/dist/architecture-graph/service-scanner.d.ts +22 -0
  14. package/dist/architecture-graph/service-scanner.d.ts.map +1 -0
  15. package/dist/architecture-graph/service-scanner.js +181 -0
  16. package/dist/architecture-graph/service-scanner.js.map +1 -0
  17. package/dist/commands/audit-export.d.ts +8 -0
  18. package/dist/commands/audit-export.d.ts.map +1 -0
  19. package/dist/commands/audit-export.js +190 -0
  20. package/dist/commands/audit-export.js.map +1 -0
  21. package/dist/commands/fix.d.ts +7 -0
  22. package/dist/commands/fix.d.ts.map +1 -0
  23. package/dist/commands/fix.js +107 -0
  24. package/dist/commands/fix.js.map +1 -0
  25. package/dist/commands/graph.d.ts +8 -0
  26. package/dist/commands/graph.d.ts.map +1 -0
  27. package/dist/commands/graph.js +29 -0
  28. package/dist/commands/graph.js.map +1 -0
  29. package/dist/commands/learn.d.ts +8 -0
  30. package/dist/commands/learn.d.ts.map +1 -0
  31. package/dist/commands/learn.js +33 -0
  32. package/dist/commands/learn.js.map +1 -0
  33. package/dist/commands/pack.d.ts +12 -0
  34. package/dist/commands/pack.d.ts.map +1 -0
  35. package/dist/commands/pack.js +75 -0
  36. package/dist/commands/pack.js.map +1 -0
  37. package/dist/commands/serve.d.ts +13 -0
  38. package/dist/commands/serve.d.ts.map +1 -0
  39. package/dist/commands/serve.js +179 -0
  40. package/dist/commands/serve.js.map +1 -0
  41. package/dist/commands/setup-ci.d.ts +6 -4
  42. package/dist/commands/setup-ci.d.ts.map +1 -1
  43. package/dist/commands/setup-ci.js +216 -23
  44. package/dist/commands/setup-ci.js.map +1 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +82 -3
  47. package/dist/index.js.map +1 -1
  48. package/dist/review-intelligence/detectors/cjs-named-import.d.ts +13 -0
  49. package/dist/review-intelligence/detectors/cjs-named-import.d.ts.map +1 -0
  50. package/dist/review-intelligence/detectors/cjs-named-import.js +134 -0
  51. package/dist/review-intelligence/detectors/cjs-named-import.js.map +1 -0
  52. package/dist/review-intelligence/detectors/exact-count-assertion.d.ts +17 -0
  53. package/dist/review-intelligence/detectors/exact-count-assertion.d.ts.map +1 -0
  54. package/dist/review-intelligence/detectors/exact-count-assertion.js +93 -0
  55. package/dist/review-intelligence/detectors/exact-count-assertion.js.map +1 -0
  56. package/dist/review-intelligence/detectors/exports-map-missing.d.ts +14 -0
  57. package/dist/review-intelligence/detectors/exports-map-missing.d.ts.map +1 -0
  58. package/dist/review-intelligence/detectors/exports-map-missing.js +131 -0
  59. package/dist/review-intelligence/detectors/exports-map-missing.js.map +1 -0
  60. package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts +12 -0
  61. package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts.map +1 -0
  62. package/dist/review-intelligence/detectors/fixture-keyword-drift.js +82 -0
  63. package/dist/review-intelligence/detectors/fixture-keyword-drift.js.map +1 -0
  64. package/dist/review-intelligence/detectors/optional-infra-crash.d.ts +12 -0
  65. package/dist/review-intelligence/detectors/optional-infra-crash.d.ts.map +1 -0
  66. package/dist/review-intelligence/detectors/optional-infra-crash.js +97 -0
  67. package/dist/review-intelligence/detectors/optional-infra-crash.js.map +1 -0
  68. package/dist/review-intelligence/detectors/undeclared-dependency.d.ts +11 -0
  69. package/dist/review-intelligence/detectors/undeclared-dependency.d.ts.map +1 -0
  70. package/dist/review-intelligence/detectors/undeclared-dependency.js +100 -0
  71. package/dist/review-intelligence/detectors/undeclared-dependency.js.map +1 -0
  72. package/dist/review-intelligence/engine/ast-parser.d.ts +90 -0
  73. package/dist/review-intelligence/engine/ast-parser.d.ts.map +1 -0
  74. package/dist/review-intelligence/engine/ast-parser.js +266 -0
  75. package/dist/review-intelligence/engine/ast-parser.js.map +1 -0
  76. package/dist/review-intelligence/engine/dataflow.d.ts +34 -0
  77. package/dist/review-intelligence/engine/dataflow.d.ts.map +1 -0
  78. package/dist/review-intelligence/engine/dataflow.js +115 -0
  79. package/dist/review-intelligence/engine/dataflow.js.map +1 -0
  80. package/dist/review-intelligence/engine/index.d.ts +7 -0
  81. package/dist/review-intelligence/engine/index.d.ts.map +1 -0
  82. package/dist/review-intelligence/engine/index.js +7 -0
  83. package/dist/review-intelligence/engine/index.js.map +1 -0
  84. package/dist/review-intelligence/engine/symbol-resolver.d.ts +34 -0
  85. package/dist/review-intelligence/engine/symbol-resolver.d.ts.map +1 -0
  86. package/dist/review-intelligence/engine/symbol-resolver.js +106 -0
  87. package/dist/review-intelligence/engine/symbol-resolver.js.map +1 -0
  88. package/dist/review-intelligence/fixes/index.d.ts +36 -0
  89. package/dist/review-intelligence/fixes/index.d.ts.map +1 -0
  90. package/dist/review-intelligence/fixes/index.js +157 -0
  91. package/dist/review-intelligence/fixes/index.js.map +1 -0
  92. package/dist/review-intelligence/index.d.ts.map +1 -1
  93. package/dist/review-intelligence/index.js +2 -0
  94. package/dist/review-intelligence/index.js.map +1 -1
  95. package/dist/review-intelligence/invariants.d.ts.map +1 -1
  96. package/dist/review-intelligence/invariants.js +14 -1
  97. package/dist/review-intelligence/invariants.js.map +1 -1
  98. package/dist/review-intelligence/learning/index.d.ts +39 -0
  99. package/dist/review-intelligence/learning/index.d.ts.map +1 -0
  100. package/dist/review-intelligence/learning/index.js +265 -0
  101. package/dist/review-intelligence/learning/index.js.map +1 -0
  102. package/dist/review-intelligence/packs/index.d.ts +69 -0
  103. package/dist/review-intelligence/packs/index.d.ts.map +1 -0
  104. package/dist/review-intelligence/packs/index.js +168 -0
  105. package/dist/review-intelligence/packs/index.js.map +1 -0
  106. package/dist/review-intelligence/repair-guidance.d.ts.map +1 -1
  107. package/dist/review-intelligence/repair-guidance.js +46 -0
  108. package/dist/review-intelligence/repair-guidance.js.map +1 -1
  109. package/dist/review-intelligence/types.d.ts +6 -1
  110. package/dist/review-intelligence/types.d.ts.map +1 -1
  111. package/package.json +9 -9
@@ -0,0 +1,36 @@
1
+ import type { ReviewFinding } from '../types.js';
2
+ /** Result of applying an auto-fix */
3
+ export interface FixResult {
4
+ /** The rule ID that was fixed */
5
+ rule_id: string;
6
+ /** File that was modified */
7
+ file: string;
8
+ /** New file content after fix */
9
+ newContent: string;
10
+ /** Human-readable description of what was changed */
11
+ description: string;
12
+ }
13
+ /** A fixer function */
14
+ export type Fixer = (finding: ReviewFinding, content: string) => FixResult | undefined;
15
+ /**
16
+ * Check if a finding has an auto-fix available.
17
+ */
18
+ export declare function isFixable(finding: ReviewFinding): boolean;
19
+ /**
20
+ * Apply an auto-fix to a finding.
21
+ * Returns undefined if no fix is available or the fix cannot be applied safely.
22
+ */
23
+ export declare function applyFix(finding: ReviewFinding, content: string): FixResult | undefined;
24
+ /**
25
+ * Apply all available fixes to a file's findings.
26
+ * Applies fixes in reverse line order to preserve line numbers.
27
+ */
28
+ export declare function applyAllFixes(findings: ReviewFinding[], content: string): {
29
+ newContent: string;
30
+ applied: FixResult[];
31
+ };
32
+ /**
33
+ * Get all fixable rule IDs.
34
+ */
35
+ export declare function getFixableRuleIds(): string[];
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/review-intelligence/fixes/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,qCAAqC;AACrC,MAAM,WAAW,SAAS;IACxB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,uBAAuB;AACvB,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;AAUvF;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAEzD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAIvF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,MAAM,GACd;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,EAAE,CAAA;CAAE,CAiB9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C"}
@@ -0,0 +1,157 @@
1
+ // ─── Auto-Fix Engine ────────────────────────────────────────────────────────
2
+ //
3
+ // Each fixer takes a ReviewFinding and file content, and returns a patched
4
+ // version of the content (or undefined if no fix can be applied).
5
+ /** Registry of fixers by rule_id */
6
+ const FIXERS = {
7
+ 'RI-RV-001': fixRuntimeValidationMissing,
8
+ 'RI-PH-001': fixHelperDriftErrorResponse,
9
+ 'RI-CJS-001': fixCjsNamedImport,
10
+ 'RI-UD-001': fixUndeclaredDependency,
11
+ };
12
+ /**
13
+ * Check if a finding has an auto-fix available.
14
+ */
15
+ export function isFixable(finding) {
16
+ return finding.rule_id in FIXERS;
17
+ }
18
+ /**
19
+ * Apply an auto-fix to a finding.
20
+ * Returns undefined if no fix is available or the fix cannot be applied safely.
21
+ */
22
+ export function applyFix(finding, content) {
23
+ const fixer = FIXERS[finding.rule_id];
24
+ if (!fixer)
25
+ return undefined;
26
+ return fixer(finding, content);
27
+ }
28
+ /**
29
+ * Apply all available fixes to a file's findings.
30
+ * Applies fixes in reverse line order to preserve line numbers.
31
+ */
32
+ export function applyAllFixes(findings, content) {
33
+ const fixable = findings.filter(isFixable);
34
+ // Sort by line descending to apply from bottom to top
35
+ const sorted = [...fixable].sort((a, b) => b.line - a.line);
36
+ let currentContent = content;
37
+ const applied = [];
38
+ for (const finding of sorted) {
39
+ const result = applyFix(finding, currentContent);
40
+ if (result) {
41
+ currentContent = result.newContent;
42
+ applied.push(result);
43
+ }
44
+ }
45
+ return { newContent: currentContent, applied };
46
+ }
47
+ /**
48
+ * Get all fixable rule IDs.
49
+ */
50
+ export function getFixableRuleIds() {
51
+ return Object.keys(FIXERS);
52
+ }
53
+ // ─── Individual Fixers ──────────────────────────────────────────────────────
54
+ function fixRuntimeValidationMissing(finding, content) {
55
+ const lines = content.split('\n');
56
+ const targetLine = finding.line - 1;
57
+ if (targetLine < 0 || targetLine >= lines.length)
58
+ return undefined;
59
+ // Find the route handler opening brace
60
+ let handlerStart = -1;
61
+ for (let i = targetLine; i < Math.min(targetLine + 10, lines.length); i++) {
62
+ if (lines[i].includes('{')) {
63
+ handlerStart = i;
64
+ break;
65
+ }
66
+ }
67
+ if (handlerStart === -1)
68
+ return undefined;
69
+ const validationSnippet = [
70
+ ' // TODO: Add runtime validation for request body',
71
+ ' // const parsed = YourSchema.safeParse(request.body);',
72
+ ' // if (!parsed.success) return reply.status(400).send({ error: parsed.error });',
73
+ ].join('\n');
74
+ const newLines = [...lines];
75
+ newLines.splice(handlerStart + 1, 0, validationSnippet);
76
+ return {
77
+ rule_id: finding.rule_id,
78
+ file: finding.file,
79
+ newContent: newLines.join('\n'),
80
+ description: 'Added runtime validation scaffold (requires completion)',
81
+ };
82
+ }
83
+ function fixHelperDriftErrorResponse(finding, content) {
84
+ if (!finding.repo_standard)
85
+ return undefined;
86
+ const helperName = finding.repo_standard.helper_name;
87
+ const lines = content.split('\n');
88
+ const targetLine = finding.line - 1;
89
+ if (targetLine < 0 || targetLine >= lines.length)
90
+ return undefined;
91
+ const line = lines[targetLine];
92
+ // Match reply.status(4xx).send(...) or res.status(4xx).send(...)
93
+ const errorPattern = /(\b(?:reply|res|response))\s*\.\s*(?:status|code)\s*\(\s*(4\d{2}|5\d{2})\s*\)\s*\.\s*send\s*\(([^)]*)\)/;
94
+ const match = errorPattern.exec(line);
95
+ if (!match)
96
+ return undefined;
97
+ const replyVar = match[1];
98
+ const statusCode = match[2];
99
+ // Replace with helper call
100
+ const replacement = line.replace(errorPattern, `${helperName}(${replyVar}, ${statusCode})`);
101
+ const newLines = [...lines];
102
+ newLines[targetLine] = replacement;
103
+ // Check if we need to add an import for the helper
104
+ const hasImport = content.includes(helperName);
105
+ let newContent = newLines.join('\n');
106
+ if (!hasImport && finding.repo_standard.example_paths.length > 0) {
107
+ newContent = `import { ${helperName} } from '${finding.repo_standard.example_paths[0]}';\n` + newContent;
108
+ }
109
+ return {
110
+ rule_id: finding.rule_id,
111
+ file: finding.file,
112
+ newContent,
113
+ description: `Replaced raw error response with ${helperName}`,
114
+ };
115
+ }
116
+ function fixCjsNamedImport(finding, content) {
117
+ const lines = content.split('\n');
118
+ const targetLine = finding.line - 1;
119
+ if (targetLine < 0 || targetLine >= lines.length)
120
+ return undefined;
121
+ const line = lines[targetLine];
122
+ // Match: import { a, b } from 'package'
123
+ const namedImportPattern = /^(import\s+)\{([^}]+)\}\s+(from\s+['"][^'"]+['"])/;
124
+ const match = namedImportPattern.exec(line.trim());
125
+ if (!match)
126
+ return undefined;
127
+ const namedImports = match[2].split(',').map((n) => n.trim());
128
+ const fromClause = match[3];
129
+ // Extract package name for the default import variable
130
+ const pkgMatch = /from\s+['"]([^'"]+)['"]/.exec(fromClause);
131
+ if (!pkgMatch)
132
+ return undefined;
133
+ const pkgName = pkgMatch[1]
134
+ .split('/')
135
+ .pop()
136
+ .replace(/[^a-zA-Z0-9]/g, '');
137
+ const defaultVarName = pkgName || 'mod';
138
+ // Rewrite: import pkg from 'package'; const { a, b } = pkg;
139
+ const indent = line.match(/^(\s*)/)?.[1] ?? '';
140
+ const newImport = `${indent}import ${defaultVarName} ${fromClause};`;
141
+ const destructure = `${indent}const { ${namedImports.join(', ')} } = ${defaultVarName};`;
142
+ const newLines = [...lines];
143
+ newLines[targetLine] = newImport + '\n' + destructure;
144
+ return {
145
+ rule_id: finding.rule_id,
146
+ file: finding.file,
147
+ newContent: newLines.join('\n'),
148
+ description: `Rewrote named CJS import to default import with destructure`,
149
+ };
150
+ }
151
+ function fixUndeclaredDependency(_finding, _content) {
152
+ // For undeclared dependencies, we return a scaffold — the actual
153
+ // package.json edit should be done by the CLI command, not inline.
154
+ // This fixer returns undefined to signal manual intervention needed.
155
+ return undefined;
156
+ }
157
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/review-intelligence/fixes/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/review-intelligence/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EAIzB,MAAM,YAAY,CAAC;AAcpB,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC9G,OAAO,EACL,YAAY,EACZ,0BAA0B,IAAI,cAAc,EAC5C,YAAY,EACZ,eAAe,IAAI,iBAAiB,EACpC,cAAc,IAAI,iBAAiB,EACnC,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAEvB,mEAAmE;AACnE,eAAO,MAAM,kCAAkC,EAAE,wBAQhD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,CAsH1B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/review-intelligence/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EAIzB,MAAM,YAAY,CAAC;AAcpB,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC9G,OAAO,EACL,YAAY,EACZ,0BAA0B,IAAI,cAAc,EAC5C,YAAY,EACZ,eAAe,IAAI,iBAAiB,EACpC,cAAc,IAAI,iBAAiB,EACnC,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAEvB,mEAAmE;AACnE,eAAO,MAAM,kCAAkC,EAAE,wBAUhD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,CAsH1B"}
@@ -16,6 +16,8 @@ export const DEFAULT_REVIEW_INTELLIGENCE_POLICY = {
16
16
  runtime_validation: { enabled: true },
17
17
  outbound_io: { enabled: true },
18
18
  platform_helpers: { enabled: true },
19
+ build_runtime: { enabled: true },
20
+ test_integrity: { enabled: true },
19
21
  },
20
22
  };
21
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/review-intelligence/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/review-intelligence/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../src/review-intelligence/invariants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAY9E;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,wBAAwB,EAChC,eAAe,CAAC,EAAE,MAAM,GACvB,iBAAiB,EAAE,CAWrB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD"}
1
+ {"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../src/review-intelligence/invariants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAwB9E;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,wBAAwB,EAChC,eAAe,CAAC,EAAE,MAAM,GACvB,iBAAiB,EAAE,CAWrB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAGrD"}
@@ -1,11 +1,23 @@
1
1
  import { runtimeValidationDetector } from './detectors/runtime-validation.js';
2
2
  import { outboundIODetector } from './detectors/outbound-io.js';
3
3
  import { platformHelpersDetector } from './detectors/platform-helpers.js';
4
+ import { undeclaredDependencyDetector } from './detectors/undeclared-dependency.js';
5
+ import { exportsMapMissingDetector } from './detectors/exports-map-missing.js';
6
+ import { cjsNamedImportDetector } from './detectors/cjs-named-import.js';
7
+ import { optionalInfraCrashDetector } from './detectors/optional-infra-crash.js';
8
+ import { fixtureKeywordDriftDetector } from './detectors/fixture-keyword-drift.js';
9
+ import { exactCountAssertionDetector } from './detectors/exact-count-assertion.js';
4
10
  /** Registry of all invariant detector modules */
5
11
  const ALL_DETECTORS = [
6
12
  runtimeValidationDetector,
7
13
  outboundIODetector,
8
14
  platformHelpersDetector,
15
+ undeclaredDependencyDetector,
16
+ exportsMapMissingDetector,
17
+ cjsNamedImportDetector,
18
+ optionalInfraCrashDetector,
19
+ fixtureKeywordDriftDetector,
20
+ exactCountAssertionDetector,
9
21
  ];
10
22
  /**
11
23
  * Get enabled detectors based on policy configuration and optional filter.
@@ -24,6 +36,7 @@ export function getEnabledDetectors(policy, invariantFilter) {
24
36
  * Get all available detector names (for --invariant flag validation).
25
37
  */
26
38
  export function getAvailableInvariantNames() {
27
- return ALL_DETECTORS.map((d) => d.name);
39
+ const unique = new Set(ALL_DETECTORS.map((d) => d.name));
40
+ return [...unique];
28
41
  }
29
42
  //# sourceMappingURL=invariants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../src/review-intelligence/invariants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,iDAAiD;AACjD,MAAM,aAAa,GAAwB;IACzC,yBAAyB;IACzB,kBAAkB;IAClB,uBAAuB;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAgC,EAChC,eAAwB;IAExB,IAAI,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAI,eAAe,EAAE,CAAC;QACpB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../src/review-intelligence/invariants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAEnF,iDAAiD;AACjD,MAAM,aAAa,GAAwB;IACzC,yBAAyB;IACzB,kBAAkB;IAClB,uBAAuB;IACvB,4BAA4B;IAC5B,yBAAyB;IACzB,sBAAsB;IACtB,0BAA0B;IAC1B,2BAA2B;IAC3B,2BAA2B;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAgC,EAChC,eAAwB;IAExB,IAAI,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAI,eAAe,EAAE,CAAC;QACpB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { InvariantPack } from '../packs/index.js';
2
+ /** A discovered convention */
3
+ export interface DiscoveredConvention {
4
+ /** Category of convention */
5
+ category: ConventionCategory;
6
+ /** The helper/wrapper/pattern name */
7
+ name: string;
8
+ /** Usage count across the codebase */
9
+ usageCount: number;
10
+ /** Total callsites checked for this category */
11
+ totalInCategory: number;
12
+ /** Usage percentage */
13
+ percentage: number;
14
+ /** Files where this is defined */
15
+ definedIn: string[];
16
+ /** Sample usage locations */
17
+ sampleUsages: string[];
18
+ }
19
+ export type ConventionCategory = 'outbound_http' | 'cache_key' | 'error_response' | 'database_query' | 'logging' | 'validation';
20
+ /** Result of repository learning */
21
+ export interface LearnResult {
22
+ /** All discovered conventions */
23
+ conventions: DiscoveredConvention[];
24
+ /** Files scanned */
25
+ filesScanned: number;
26
+ /** Duration in milliseconds */
27
+ durationMs: number;
28
+ /** Generated pack suggestion (if conventions found) */
29
+ suggestedPack?: InvariantPack;
30
+ }
31
+ /**
32
+ * Scan the repository and discover conventions.
33
+ */
34
+ export declare function learnConventions(cwd: string): LearnResult;
35
+ /**
36
+ * Format learn results for human-readable console output.
37
+ */
38
+ export declare function formatLearnOutput(result: LearnResult): string;
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/review-intelligence/learning/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,mBAAmB,CAAC;AAEjE,8BAA8B;AAC9B,MAAM,WAAW,oBAAoB;IACnC,6BAA6B;IAC7B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAC1B,eAAe,GACf,WAAW,GACX,gBAAgB,GAChB,gBAAgB,GAChB,SAAS,GACT,YAAY,CAAC;AAEjB,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AA4DD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAsCzD;AAuGD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAuC7D"}
@@ -0,0 +1,265 @@
1
+ // ─── Repository Convention Learning ─────────────────────────────────────────
2
+ //
3
+ // Analyzes repository usage patterns to discover canonical helpers,
4
+ // wrappers, and conventions. Generates invariant pack suggestions.
5
+ import { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';
6
+ import { join, extname, relative } from 'node:path';
7
+ const CONVENTION_PATTERNS = [
8
+ {
9
+ category: 'outbound_http',
10
+ callsitePattern: /\b(?:fetch|axios|http\.request|https\.request|got|needle|superagent|request)\s*[.(]/g,
11
+ wrapperPatterns: [
12
+ /\b(\w*(?:safe|wrapped|internal|platform|sanctioned)\w*(?:Fetch|Http|Request|Api|Call))\s*\(/gi,
13
+ /\b(\w*(?:fetch|http|request|api|call)\w*(?:Safe|Wrapped|Internal|Platform))\s*\(/gi,
14
+ ],
15
+ ruleDescription: 'Outbound HTTP calls must use sanctioned wrapper',
16
+ },
17
+ {
18
+ category: 'cache_key',
19
+ callsitePattern: /\b(?:redis|cache|client)\s*\.\s*(?:get|set|del|hget|hset|expire)\s*\(/g,
20
+ wrapperPatterns: [
21
+ /\b(build\w*(?:Cache|Redis|Tenant)\w*Key)\s*\(/gi,
22
+ /\b(\w*(?:cache|redis)Key(?:Builder|Factory|Helper)?)\s*\(/gi,
23
+ ],
24
+ ruleDescription: 'Cache keys must use shared cache key builder',
25
+ },
26
+ {
27
+ category: 'error_response',
28
+ callsitePattern: /\b(?:reply|res|response)\s*\.\s*(?:status|code)\s*\(\s*(?:4|5)\d{2}\s*\)/g,
29
+ wrapperPatterns: [
30
+ /\b(send(?:Invalid|Bad|NotFound|Unauthorized|Forbidden|Error)\w*)\s*\(/gi,
31
+ /\b(\w*(?:error|err)(?:Response|Reply|Handler|Helper))\s*\(/gi,
32
+ ],
33
+ ruleDescription: 'Error responses must use shared error helper',
34
+ },
35
+ {
36
+ category: 'database_query',
37
+ callsitePattern: /\b(?:db|knex|prisma|sequelize|pool|client)\s*\.\s*(?:query|raw|execute|\$queryRaw)\s*[(`]/g,
38
+ wrapperPatterns: [
39
+ /\b(\w*(?:safe|wrapped|platform)\w*(?:Query|Exec|Db))\s*\(/gi,
40
+ ],
41
+ ruleDescription: 'Database queries should use sanctioned query helpers',
42
+ },
43
+ {
44
+ category: 'logging',
45
+ callsitePattern: /\bconsole\s*\.\s*(?:log|warn|error|info|debug)\s*\(/g,
46
+ wrapperPatterns: [
47
+ /\b(logger|log)\s*\.\s*(?:info|warn|error|debug)\s*\(/gi,
48
+ /\b(\w*(?:Logger|Logging|Log)\w*)\s*\.\s*\w+\s*\(/gi,
49
+ ],
50
+ ruleDescription: 'Use structured logger instead of console',
51
+ },
52
+ ];
53
+ /**
54
+ * Scan the repository and discover conventions.
55
+ */
56
+ export function learnConventions(cwd) {
57
+ const startTime = Date.now();
58
+ const files = collectSourceFiles(cwd);
59
+ const fileContents = new Map();
60
+ for (const file of files) {
61
+ try {
62
+ fileContents.set(file, readFileSync(join(cwd, file), 'utf-8'));
63
+ }
64
+ catch {
65
+ // Skip unreadable files
66
+ }
67
+ }
68
+ const conventions = [];
69
+ for (const pattern of CONVENTION_PATTERNS) {
70
+ const result = analyzeConventionPattern(cwd, fileContents, pattern);
71
+ if (result) {
72
+ conventions.push(result);
73
+ }
74
+ }
75
+ // Sort by percentage descending
76
+ conventions.sort((a, b) => b.percentage - a.percentage);
77
+ // Generate pack suggestion if we found conventions
78
+ let suggestedPack;
79
+ const significantConventions = conventions.filter((c) => c.percentage >= 60);
80
+ if (significantConventions.length > 0) {
81
+ suggestedPack = generatePackFromConventions(significantConventions);
82
+ }
83
+ return {
84
+ conventions,
85
+ filesScanned: files.length,
86
+ durationMs: Date.now() - startTime,
87
+ suggestedPack,
88
+ };
89
+ }
90
+ /**
91
+ * Analyze a single convention pattern across all files.
92
+ */
93
+ function analyzeConventionPattern(_cwd, fileContents, pattern) {
94
+ // Count total raw callsites
95
+ let totalCallsites = 0;
96
+ const wrapperUsage = new Map();
97
+ for (const [filePath, content] of fileContents) {
98
+ // Skip test files for convention mining
99
+ if (isTestFile(filePath))
100
+ continue;
101
+ // Skip definition files (helpers directory)
102
+ if (isHelperFile(filePath))
103
+ continue;
104
+ // Count raw callsites
105
+ const rawMatches = content.match(pattern.callsitePattern);
106
+ if (rawMatches) {
107
+ totalCallsites += rawMatches.length;
108
+ }
109
+ // Find wrapper usages
110
+ for (const wrapperPattern of pattern.wrapperPatterns) {
111
+ // Reset lastIndex since we're reusing the regex
112
+ wrapperPattern.lastIndex = 0;
113
+ let match;
114
+ while ((match = wrapperPattern.exec(content)) !== null) {
115
+ const wrapperName = match[1];
116
+ const existing = wrapperUsage.get(wrapperName);
117
+ if (existing) {
118
+ existing.count++;
119
+ if (!existing.files.includes(filePath)) {
120
+ existing.files.push(filePath);
121
+ }
122
+ }
123
+ else {
124
+ wrapperUsage.set(wrapperName, { count: 1, files: [filePath] });
125
+ }
126
+ }
127
+ }
128
+ }
129
+ if (totalCallsites === 0)
130
+ return undefined;
131
+ // Find the most common wrapper
132
+ let bestWrapper;
133
+ let bestCount = 0;
134
+ let bestFiles = [];
135
+ for (const [name, info] of wrapperUsage) {
136
+ if (info.count > bestCount) {
137
+ bestWrapper = name;
138
+ bestCount = info.count;
139
+ bestFiles = info.files;
140
+ }
141
+ }
142
+ if (!bestWrapper || bestCount < 2)
143
+ return undefined;
144
+ const percentage = Math.round((bestCount / totalCallsites) * 100);
145
+ return {
146
+ category: pattern.category,
147
+ name: bestWrapper,
148
+ usageCount: bestCount,
149
+ totalInCategory: totalCallsites,
150
+ percentage,
151
+ definedIn: bestFiles.slice(0, 3),
152
+ sampleUsages: bestFiles.slice(0, 5),
153
+ };
154
+ }
155
+ /**
156
+ * Generate an invariant pack from discovered conventions.
157
+ */
158
+ function generatePackFromConventions(conventions) {
159
+ const rules = [];
160
+ for (const conv of conventions) {
161
+ const matchingPattern = CONVENTION_PATTERNS.find((p) => p.category === conv.category);
162
+ rules.push({
163
+ rule_id: `LEARNED-${conv.category.toUpperCase().replace(/_/g, '-')}-001`,
164
+ description: `${matchingPattern?.ruleDescription ?? conv.category}: use ${conv.name} (${conv.percentage}% adoption)`,
165
+ kind: 'required_wrapper',
166
+ helper: conv.name,
167
+ severity: conv.percentage >= 80 ? 'P1' : 'P2',
168
+ });
169
+ }
170
+ return {
171
+ name: 'learned-conventions',
172
+ description: 'Auto-generated invariant pack from repository convention analysis',
173
+ version: '1.0.0',
174
+ enabled: false,
175
+ rules,
176
+ };
177
+ }
178
+ /**
179
+ * Format learn results for human-readable console output.
180
+ */
181
+ export function formatLearnOutput(result) {
182
+ const lines = [];
183
+ lines.push('');
184
+ lines.push('Detected Repository Conventions');
185
+ lines.push('───────────────────────────────');
186
+ lines.push(` Files scanned: ${result.filesScanned}`);
187
+ lines.push(` Duration: ${result.durationMs}ms`);
188
+ lines.push('');
189
+ if (result.conventions.length === 0) {
190
+ lines.push(' No strong conventions detected.');
191
+ lines.push(' Tip: Conventions are detected when a wrapper/helper is used in >50% of callsites.');
192
+ lines.push('');
193
+ return lines.join('\n');
194
+ }
195
+ for (const conv of result.conventions) {
196
+ const bar = '█'.repeat(Math.round(conv.percentage / 5)) + '░'.repeat(20 - Math.round(conv.percentage / 5));
197
+ lines.push(` ${conv.name}`);
198
+ lines.push(` ${bar} ${conv.percentage}% of ${conv.category.replace(/_/g, ' ')} calls`);
199
+ lines.push(` (${conv.usageCount}/${conv.totalInCategory} callsites)`);
200
+ lines.push('');
201
+ }
202
+ if (result.suggestedPack) {
203
+ lines.push(' Suggested Invariant Pack');
204
+ lines.push(' ───────────────────────');
205
+ lines.push(` Name: ${result.suggestedPack.name}`);
206
+ lines.push(` Rules: ${result.suggestedPack.rules.length}`);
207
+ for (const rule of result.suggestedPack.rules) {
208
+ lines.push(` [${rule.severity}] ${rule.description}`);
209
+ }
210
+ lines.push('');
211
+ lines.push(' Run `codeledger pack enable learned-conventions` to activate.');
212
+ }
213
+ lines.push('');
214
+ return lines.join('\n');
215
+ }
216
+ // ─── File Collection ─────────────────────────────────────────────────────────
217
+ const MAX_FILES = 500;
218
+ const ANALYZABLE_EXTS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mts', '.mjs']);
219
+ function collectSourceFiles(cwd) {
220
+ const files = [];
221
+ const scanDirs = ['src', 'lib', 'packages'];
222
+ for (const scanDir of scanDirs) {
223
+ const fullDir = join(cwd, scanDir);
224
+ if (existsSync(fullDir)) {
225
+ collectFilesRecursive(fullDir, cwd, files);
226
+ }
227
+ }
228
+ return files.slice(0, MAX_FILES);
229
+ }
230
+ function collectFilesRecursive(dir, cwd, files) {
231
+ if (files.length >= MAX_FILES)
232
+ return;
233
+ try {
234
+ const entries = readdirSync(dir);
235
+ for (const entry of entries) {
236
+ if (files.length >= MAX_FILES)
237
+ return;
238
+ if (entry.startsWith('.') || entry === 'node_modules' || entry === 'dist' || entry === 'build')
239
+ continue;
240
+ const fullPath = join(dir, entry);
241
+ try {
242
+ const stat = statSync(fullPath);
243
+ if (stat.isDirectory()) {
244
+ collectFilesRecursive(fullPath, cwd, files);
245
+ }
246
+ else if (ANALYZABLE_EXTS.has(extname(entry))) {
247
+ files.push(relative(cwd, fullPath));
248
+ }
249
+ }
250
+ catch {
251
+ // Skip inaccessible
252
+ }
253
+ }
254
+ }
255
+ catch {
256
+ // Skip unreadable directories
257
+ }
258
+ }
259
+ function isTestFile(filePath) {
260
+ return /\.(?:test|spec|e2e)\./.test(filePath) || /[/\\](?:__tests__|test|tests)[/\\]/.test(filePath);
261
+ }
262
+ function isHelperFile(filePath) {
263
+ return /[/\\](?:utils|helpers|lib|shared|common)[/\\]/.test(filePath);
264
+ }
265
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/review-intelligence/learning/index.ts"],"names":[],"mappings":"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"}