@codeledger/cli 0.6.7 → 0.6.9
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/dist/architecture-graph/dependency-scanner.d.ts +16 -0
- package/dist/architecture-graph/dependency-scanner.d.ts.map +1 -0
- package/dist/architecture-graph/dependency-scanner.js +96 -0
- package/dist/architecture-graph/dependency-scanner.js.map +1 -0
- package/dist/architecture-graph/graph-builder.d.ts +70 -0
- package/dist/architecture-graph/graph-builder.d.ts.map +1 -0
- package/dist/architecture-graph/graph-builder.js +231 -0
- package/dist/architecture-graph/graph-builder.js.map +1 -0
- package/dist/architecture-graph/index.d.ts +4 -0
- package/dist/architecture-graph/index.d.ts.map +1 -0
- package/dist/architecture-graph/index.js +7 -0
- package/dist/architecture-graph/index.js.map +1 -0
- package/dist/architecture-graph/service-scanner.d.ts +22 -0
- package/dist/architecture-graph/service-scanner.d.ts.map +1 -0
- package/dist/architecture-graph/service-scanner.js +181 -0
- package/dist/architecture-graph/service-scanner.js.map +1 -0
- package/dist/commands/activate.d.ts.map +1 -1
- package/dist/commands/activate.js +16 -1
- package/dist/commands/activate.js.map +1 -1
- package/dist/commands/audit-export.d.ts +8 -0
- package/dist/commands/audit-export.d.ts.map +1 -0
- package/dist/commands/audit-export.js +190 -0
- package/dist/commands/audit-export.js.map +1 -0
- package/dist/commands/commit-msg.d.ts +58 -0
- package/dist/commands/commit-msg.d.ts.map +1 -0
- package/dist/commands/commit-msg.js +461 -0
- package/dist/commands/commit-msg.js.map +1 -0
- package/dist/commands/fix.d.ts +7 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +107 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/graph.d.ts +8 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +29 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +14 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/intent.d.ts +3 -1
- package/dist/commands/intent.d.ts.map +1 -1
- package/dist/commands/intent.js +68 -2
- package/dist/commands/intent.js.map +1 -1
- package/dist/commands/learn.d.ts +8 -0
- package/dist/commands/learn.d.ts.map +1 -0
- package/dist/commands/learn.js +33 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/pack.d.ts +12 -0
- package/dist/commands/pack.d.ts.map +1 -0
- package/dist/commands/pack.js +75 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/pr-summary.d.ts +59 -0
- package/dist/commands/pr-summary.d.ts.map +1 -0
- package/dist/commands/pr-summary.js +524 -0
- package/dist/commands/pr-summary.js.map +1 -0
- package/dist/commands/serve.d.ts +13 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +179 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/session-cleanup.js +1 -0
- package/dist/commands/session-cleanup.js.map +1 -1
- package/dist/commands/session-summary.d.ts.map +1 -1
- package/dist/commands/session-summary.js +135 -3
- package/dist/commands/session-summary.js.map +1 -1
- package/dist/commands/setup-ci.d.ts +6 -4
- package/dist/commands/setup-ci.d.ts.map +1 -1
- package/dist/commands/setup-ci.js +228 -23
- package/dist/commands/setup-ci.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +35 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +127 -4
- package/dist/index.js.map +1 -1
- package/dist/intent/extractor.d.ts +15 -0
- package/dist/intent/extractor.d.ts.map +1 -0
- package/dist/intent/extractor.js +149 -0
- package/dist/intent/extractor.js.map +1 -0
- package/dist/intent/fetcher.d.ts +33 -0
- package/dist/intent/fetcher.d.ts.map +1 -0
- package/dist/intent/fetcher.js +364 -0
- package/dist/intent/fetcher.js.map +1 -0
- package/dist/intent/loader.d.ts +26 -0
- package/dist/intent/loader.d.ts.map +1 -0
- package/dist/intent/loader.js +80 -0
- package/dist/intent/loader.js.map +1 -0
- package/dist/intent/types.d.ts +33 -0
- package/dist/intent/types.d.ts.map +1 -0
- package/dist/intent/types.js +9 -0
- package/dist/intent/types.js.map +1 -0
- package/dist/project-config.d.ts +38 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +206 -0
- package/dist/project-config.js.map +1 -0
- package/dist/review-intelligence/detectors/architecture-graph.d.ts +18 -0
- package/dist/review-intelligence/detectors/architecture-graph.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/architecture-graph.js +73 -0
- package/dist/review-intelligence/detectors/architecture-graph.js.map +1 -0
- package/dist/review-intelligence/detectors/cjs-named-import.d.ts +13 -0
- package/dist/review-intelligence/detectors/cjs-named-import.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/cjs-named-import.js +134 -0
- package/dist/review-intelligence/detectors/cjs-named-import.js.map +1 -0
- package/dist/review-intelligence/detectors/exact-count-assertion.d.ts +17 -0
- package/dist/review-intelligence/detectors/exact-count-assertion.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/exact-count-assertion.js +93 -0
- package/dist/review-intelligence/detectors/exact-count-assertion.js.map +1 -0
- package/dist/review-intelligence/detectors/exports-map-missing.d.ts +14 -0
- package/dist/review-intelligence/detectors/exports-map-missing.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/exports-map-missing.js +131 -0
- package/dist/review-intelligence/detectors/exports-map-missing.js.map +1 -0
- package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts +12 -0
- package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/fixture-keyword-drift.js +82 -0
- package/dist/review-intelligence/detectors/fixture-keyword-drift.js.map +1 -0
- package/dist/review-intelligence/detectors/optional-infra-crash.d.ts +12 -0
- package/dist/review-intelligence/detectors/optional-infra-crash.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/optional-infra-crash.js +97 -0
- package/dist/review-intelligence/detectors/optional-infra-crash.js.map +1 -0
- package/dist/review-intelligence/detectors/pack-rules.d.ts +16 -0
- package/dist/review-intelligence/detectors/pack-rules.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/pack-rules.js +107 -0
- package/dist/review-intelligence/detectors/pack-rules.js.map +1 -0
- package/dist/review-intelligence/detectors/undeclared-dependency.d.ts +11 -0
- package/dist/review-intelligence/detectors/undeclared-dependency.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/undeclared-dependency.js +100 -0
- package/dist/review-intelligence/detectors/undeclared-dependency.js.map +1 -0
- package/dist/review-intelligence/engine/ast-parser.d.ts +90 -0
- package/dist/review-intelligence/engine/ast-parser.d.ts.map +1 -0
- package/dist/review-intelligence/engine/ast-parser.js +266 -0
- package/dist/review-intelligence/engine/ast-parser.js.map +1 -0
- package/dist/review-intelligence/engine/dataflow.d.ts +34 -0
- package/dist/review-intelligence/engine/dataflow.d.ts.map +1 -0
- package/dist/review-intelligence/engine/dataflow.js +115 -0
- package/dist/review-intelligence/engine/dataflow.js.map +1 -0
- package/dist/review-intelligence/engine/index.d.ts +7 -0
- package/dist/review-intelligence/engine/index.d.ts.map +1 -0
- package/dist/review-intelligence/engine/index.js +7 -0
- package/dist/review-intelligence/engine/index.js.map +1 -0
- package/dist/review-intelligence/engine/symbol-resolver.d.ts +34 -0
- package/dist/review-intelligence/engine/symbol-resolver.d.ts.map +1 -0
- package/dist/review-intelligence/engine/symbol-resolver.js +106 -0
- package/dist/review-intelligence/engine/symbol-resolver.js.map +1 -0
- package/dist/review-intelligence/fixes/index.d.ts +54 -0
- package/dist/review-intelligence/fixes/index.d.ts.map +1 -0
- package/dist/review-intelligence/fixes/index.js +346 -0
- package/dist/review-intelligence/fixes/index.js.map +1 -0
- package/dist/review-intelligence/index.d.ts +4 -1
- package/dist/review-intelligence/index.d.ts.map +1 -1
- package/dist/review-intelligence/index.js +22 -3
- package/dist/review-intelligence/index.js.map +1 -1
- package/dist/review-intelligence/invariants.d.ts +15 -0
- package/dist/review-intelligence/invariants.d.ts.map +1 -1
- package/dist/review-intelligence/invariants.js +48 -4
- package/dist/review-intelligence/invariants.js.map +1 -1
- package/dist/review-intelligence/learning/index.d.ts +39 -0
- package/dist/review-intelligence/learning/index.d.ts.map +1 -0
- package/dist/review-intelligence/learning/index.js +265 -0
- package/dist/review-intelligence/learning/index.js.map +1 -0
- package/dist/review-intelligence/packs/index.d.ts +69 -0
- package/dist/review-intelligence/packs/index.d.ts.map +1 -0
- package/dist/review-intelligence/packs/index.js +168 -0
- package/dist/review-intelligence/packs/index.js.map +1 -0
- package/dist/review-intelligence/repair-guidance.d.ts.map +1 -1
- package/dist/review-intelligence/repair-guidance.js +46 -0
- package/dist/review-intelligence/repair-guidance.js.map +1 -1
- package/dist/review-intelligence/types.d.ts +18 -9
- package/dist/review-intelligence/types.d.ts.map +1 -1
- package/dist/review-intelligence/types.js +9 -1
- package/dist/review-intelligence/types.js.map +1 -1
- package/dist/templates/claude-md.d.ts.map +1 -1
- package/dist/templates/claude-md.js +23 -128
- package/dist/templates/claude-md.js.map +1 -1
- package/dist/templates/hooks.d.ts.map +1 -1
- package/dist/templates/hooks.js +39 -0
- package/dist/templates/hooks.js.map +1 -1
- package/package.json +9 -9
|
@@ -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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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/** A rule within an invariant pack */
|
|
2
|
+
export interface PackRule {
|
|
3
|
+
/** Rule identifier */
|
|
4
|
+
rule_id: string;
|
|
5
|
+
/** Human-readable description */
|
|
6
|
+
description: string;
|
|
7
|
+
/** The kind of constraint */
|
|
8
|
+
kind: 'required_wrapper' | 'required_helper' | 'forbidden_pattern' | 'required_pattern';
|
|
9
|
+
/** The helper/wrapper name that should be used */
|
|
10
|
+
helper?: string;
|
|
11
|
+
/** Regex pattern that triggers the rule */
|
|
12
|
+
trigger_pattern?: string;
|
|
13
|
+
/** Severity if violated */
|
|
14
|
+
severity: 'P0' | 'P1' | 'P2' | 'P3';
|
|
15
|
+
}
|
|
16
|
+
/** An invariant pack */
|
|
17
|
+
export interface InvariantPack {
|
|
18
|
+
/** Pack identifier */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Human-readable description */
|
|
21
|
+
description: string;
|
|
22
|
+
/** Pack version */
|
|
23
|
+
version: string;
|
|
24
|
+
/** Whether this pack is enabled */
|
|
25
|
+
enabled: boolean;
|
|
26
|
+
/** Rules in this pack */
|
|
27
|
+
rules: PackRule[];
|
|
28
|
+
}
|
|
29
|
+
/** Pack registry file format */
|
|
30
|
+
export interface PackRegistry {
|
|
31
|
+
version: 1;
|
|
32
|
+
packs: InvariantPack[];
|
|
33
|
+
}
|
|
34
|
+
export declare const PLATFORM_API_PACK: InvariantPack;
|
|
35
|
+
export declare const BUILD_RUNTIME_PACK: InvariantPack;
|
|
36
|
+
export declare const BUILTIN_PACKS: InvariantPack[];
|
|
37
|
+
/**
|
|
38
|
+
* Load the pack registry from disk.
|
|
39
|
+
*/
|
|
40
|
+
export declare function loadPackRegistry(cwd: string): PackRegistry;
|
|
41
|
+
/**
|
|
42
|
+
* Save the pack registry to disk.
|
|
43
|
+
*/
|
|
44
|
+
export declare function savePackRegistry(cwd: string, registry: PackRegistry): void;
|
|
45
|
+
/**
|
|
46
|
+
* List all available packs (built-in + custom).
|
|
47
|
+
*/
|
|
48
|
+
export declare function listPacks(cwd: string): InvariantPack[];
|
|
49
|
+
/**
|
|
50
|
+
* Enable a pack by name.
|
|
51
|
+
*/
|
|
52
|
+
export declare function enablePack(cwd: string, packName: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Disable a pack by name.
|
|
55
|
+
*/
|
|
56
|
+
export declare function disablePack(cwd: string, packName: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Add a custom pack (e.g. from `codeledger learn`).
|
|
59
|
+
*/
|
|
60
|
+
export declare function addPack(cwd: string, pack: InvariantPack): void;
|
|
61
|
+
/**
|
|
62
|
+
* Get all enabled pack rules.
|
|
63
|
+
*/
|
|
64
|
+
export declare function getEnabledPackRules(cwd: string): PackRule[];
|
|
65
|
+
/**
|
|
66
|
+
* Save a generated pack as YAML-like config.
|
|
67
|
+
*/
|
|
68
|
+
export declare function saveGeneratedPack(cwd: string, pack: InvariantPack): string;
|
|
69
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/review-intelligence/packs/index.ts"],"names":[],"mappings":"AASA,sCAAsC;AACtC,MAAM,WAAW,QAAQ;IACvB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;IACxF,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CACrC;AAED,wBAAwB;AACxB,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,yBAAyB;IACzB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,gCAAgC;AAChC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAOD,eAAO,MAAM,iBAAiB,EAAE,aA+B/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,aA0BhC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,aAAa,EAGxC,CAAC;AAIF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAa1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAI1E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,CAGtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQlE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAY9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAW3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAO1E"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// ─── Invariant Packs ────────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Invariant packs define reusable sets of repository-specific rules.
|
|
4
|
+
// They can be built-in, generated by `codeledger learn`, or manually
|
|
5
|
+
// authored.
|
|
6
|
+
import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
7
|
+
import { join, dirname } from 'node:path';
|
|
8
|
+
const DEFAULT_PACKS_DIR = '.codeledger/packs';
|
|
9
|
+
const REGISTRY_FILE = '.codeledger/pack-registry.json';
|
|
10
|
+
// ─── Built-in Packs ─────────────────────────────────────────────────────────
|
|
11
|
+
export const PLATFORM_API_PACK = {
|
|
12
|
+
name: 'platform-api-pack',
|
|
13
|
+
description: 'API platform conventions: sanctioned wrappers, error helpers, auth middleware',
|
|
14
|
+
version: '1.0.0',
|
|
15
|
+
enabled: false,
|
|
16
|
+
rules: [
|
|
17
|
+
{
|
|
18
|
+
rule_id: 'PACK-API-001',
|
|
19
|
+
description: 'Outbound HTTP calls must use the sanctioned fetch wrapper',
|
|
20
|
+
kind: 'required_wrapper',
|
|
21
|
+
helper: 'safeFetch',
|
|
22
|
+
trigger_pattern: '\\bfetch\\s*\\(',
|
|
23
|
+
severity: 'P1',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
rule_id: 'PACK-API-002',
|
|
27
|
+
description: 'Error responses must use the shared error helper',
|
|
28
|
+
kind: 'required_helper',
|
|
29
|
+
helper: 'sendInvalidRequest',
|
|
30
|
+
trigger_pattern: '\\breply\\.status\\s*\\(\\s*4\\d{2}',
|
|
31
|
+
severity: 'P2',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
rule_id: 'PACK-API-003',
|
|
35
|
+
description: 'Cache keys must use the shared cache key builder',
|
|
36
|
+
kind: 'required_helper',
|
|
37
|
+
helper: 'buildTenantCacheKey',
|
|
38
|
+
trigger_pattern: '\\bredis\\s*\\.\\s*(?:get|set|del)',
|
|
39
|
+
severity: 'P2',
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
export const BUILD_RUNTIME_PACK = {
|
|
44
|
+
name: 'build-runtime-pack',
|
|
45
|
+
description: 'Build and runtime contract checks: dependencies, exports, ESM/CJS',
|
|
46
|
+
version: '1.0.0',
|
|
47
|
+
enabled: false,
|
|
48
|
+
rules: [
|
|
49
|
+
{
|
|
50
|
+
rule_id: 'PACK-BR-001',
|
|
51
|
+
description: 'All imported packages must be declared in package.json',
|
|
52
|
+
kind: 'required_pattern',
|
|
53
|
+
severity: 'P1',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
rule_id: 'PACK-BR-002',
|
|
57
|
+
description: 'Subpath imports must have matching exports map entries',
|
|
58
|
+
kind: 'required_pattern',
|
|
59
|
+
severity: 'P1',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
rule_id: 'PACK-BR-003',
|
|
63
|
+
description: 'Named imports from CJS modules must use default import pattern',
|
|
64
|
+
kind: 'forbidden_pattern',
|
|
65
|
+
trigger_pattern: 'import\\s*\\{.*\\}\\s*from',
|
|
66
|
+
severity: 'P1',
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
export const BUILTIN_PACKS = [
|
|
71
|
+
PLATFORM_API_PACK,
|
|
72
|
+
BUILD_RUNTIME_PACK,
|
|
73
|
+
];
|
|
74
|
+
// ─── Pack Management ─────────────────────────────────────────────────────────
|
|
75
|
+
/**
|
|
76
|
+
* Load the pack registry from disk.
|
|
77
|
+
*/
|
|
78
|
+
export function loadPackRegistry(cwd) {
|
|
79
|
+
const registryPath = join(cwd, REGISTRY_FILE);
|
|
80
|
+
if (!existsSync(registryPath)) {
|
|
81
|
+
return { version: 1, packs: [...BUILTIN_PACKS] };
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const raw = JSON.parse(readFileSync(registryPath, 'utf-8'));
|
|
85
|
+
return raw;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return { version: 1, packs: [...BUILTIN_PACKS] };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Save the pack registry to disk.
|
|
93
|
+
*/
|
|
94
|
+
export function savePackRegistry(cwd, registry) {
|
|
95
|
+
const registryPath = join(cwd, REGISTRY_FILE);
|
|
96
|
+
mkdirSync(dirname(registryPath), { recursive: true });
|
|
97
|
+
writeFileSync(registryPath, JSON.stringify(registry, null, 2) + '\n');
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* List all available packs (built-in + custom).
|
|
101
|
+
*/
|
|
102
|
+
export function listPacks(cwd) {
|
|
103
|
+
const registry = loadPackRegistry(cwd);
|
|
104
|
+
return registry.packs;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Enable a pack by name.
|
|
108
|
+
*/
|
|
109
|
+
export function enablePack(cwd, packName) {
|
|
110
|
+
const registry = loadPackRegistry(cwd);
|
|
111
|
+
const pack = registry.packs.find((p) => p.name === packName);
|
|
112
|
+
if (!pack)
|
|
113
|
+
return false;
|
|
114
|
+
pack.enabled = true;
|
|
115
|
+
savePackRegistry(cwd, registry);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Disable a pack by name.
|
|
120
|
+
*/
|
|
121
|
+
export function disablePack(cwd, packName) {
|
|
122
|
+
const registry = loadPackRegistry(cwd);
|
|
123
|
+
const pack = registry.packs.find((p) => p.name === packName);
|
|
124
|
+
if (!pack)
|
|
125
|
+
return false;
|
|
126
|
+
pack.enabled = false;
|
|
127
|
+
savePackRegistry(cwd, registry);
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Add a custom pack (e.g. from `codeledger learn`).
|
|
132
|
+
*/
|
|
133
|
+
export function addPack(cwd, pack) {
|
|
134
|
+
const registry = loadPackRegistry(cwd);
|
|
135
|
+
// Replace if already exists
|
|
136
|
+
const existingIdx = registry.packs.findIndex((p) => p.name === pack.name);
|
|
137
|
+
if (existingIdx >= 0) {
|
|
138
|
+
registry.packs[existingIdx] = pack;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
registry.packs.push(pack);
|
|
142
|
+
}
|
|
143
|
+
savePackRegistry(cwd, registry);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get all enabled pack rules.
|
|
147
|
+
*/
|
|
148
|
+
export function getEnabledPackRules(cwd) {
|
|
149
|
+
const registry = loadPackRegistry(cwd);
|
|
150
|
+
const rules = [];
|
|
151
|
+
for (const pack of registry.packs) {
|
|
152
|
+
if (pack.enabled) {
|
|
153
|
+
rules.push(...pack.rules);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return rules;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Save a generated pack as YAML-like config.
|
|
160
|
+
*/
|
|
161
|
+
export function saveGeneratedPack(cwd, pack) {
|
|
162
|
+
const packsDir = join(cwd, DEFAULT_PACKS_DIR);
|
|
163
|
+
mkdirSync(packsDir, { recursive: true });
|
|
164
|
+
const filePath = join(packsDir, `${pack.name}.json`);
|
|
165
|
+
writeFileSync(filePath, JSON.stringify(pack, null, 2) + '\n');
|
|
166
|
+
return filePath;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/review-intelligence/packs/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repair-guidance.d.ts","sourceRoot":"","sources":["../../src/review-intelligence/repair-guidance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"repair-guidance.d.ts","sourceRoot":"","sources":["../../src/review-intelligence/repair-guidance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA2HrE;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,YAAY,EAAE,GACxB,MAAM,CAgBR"}
|
|
@@ -65,6 +65,52 @@ export function generateRepairGuidance(finding) {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
break;
|
|
68
|
+
case 'RI-UD-001':
|
|
69
|
+
lines.push('Add the missing dependency to package.json:');
|
|
70
|
+
lines.push('');
|
|
71
|
+
lines.push(' npm install <package-name>');
|
|
72
|
+
lines.push(' # or: pnpm add <package-name>');
|
|
73
|
+
break;
|
|
74
|
+
case 'RI-EM-001':
|
|
75
|
+
lines.push('Add the subpath to the package exports map in package.json:');
|
|
76
|
+
lines.push('');
|
|
77
|
+
lines.push(' "exports": {');
|
|
78
|
+
lines.push(' "./<subpath>": { "import": "./dist/<subpath>.js" }');
|
|
79
|
+
lines.push(' }');
|
|
80
|
+
break;
|
|
81
|
+
case 'RI-CJS-001':
|
|
82
|
+
lines.push('Rewrite named import to default import with destructure:');
|
|
83
|
+
lines.push('');
|
|
84
|
+
lines.push(' // Before:');
|
|
85
|
+
lines.push(' import { method } from \'package\';');
|
|
86
|
+
lines.push(' // After:');
|
|
87
|
+
lines.push(' import pkg from \'package\';');
|
|
88
|
+
lines.push(' const { method } = pkg;');
|
|
89
|
+
break;
|
|
90
|
+
case 'RI-IC-001':
|
|
91
|
+
lines.push('Wrap optional infrastructure init in try/catch:');
|
|
92
|
+
lines.push('');
|
|
93
|
+
lines.push(' try {');
|
|
94
|
+
lines.push(' initTelemetry();');
|
|
95
|
+
lines.push(' } catch (err) {');
|
|
96
|
+
lines.push(' logger.warn(\'Telemetry init failed, continuing\', err);');
|
|
97
|
+
lines.push(' }');
|
|
98
|
+
break;
|
|
99
|
+
case 'RI-FK-001':
|
|
100
|
+
lines.push('Extract expected value from fixture data:');
|
|
101
|
+
lines.push('');
|
|
102
|
+
lines.push(' const keyword = fixtures[0].searchableField;');
|
|
103
|
+
lines.push(' const results = search(keyword);');
|
|
104
|
+
lines.push(' expect(results).toContainEqual(expect.objectContaining({ field: keyword }));');
|
|
105
|
+
break;
|
|
106
|
+
case 'RI-EC-001':
|
|
107
|
+
lines.push('Replace exact count with range assertion:');
|
|
108
|
+
lines.push('');
|
|
109
|
+
lines.push(' // Before:');
|
|
110
|
+
lines.push(' expect(results.length).toBe(5);');
|
|
111
|
+
lines.push(' // After:');
|
|
112
|
+
lines.push(' expect(results.length).toBeGreaterThan(0);');
|
|
113
|
+
break;
|
|
68
114
|
default:
|
|
69
115
|
lines.push('Review the finding and apply the recommended fix.');
|
|
70
116
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repair-guidance.js","sourceRoot":"","sources":["../../src/review-intelligence/repair-guidance.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"repair-guidance.js","sourceRoot":"","sources":["../../src/review-intelligence/repair-guidance.ts"],"names":[],"mappings":"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"}
|