cxgrd 0.1.15 ā 0.1.17
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/commands/scan.d.ts +1 -0
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +33 -4
- package/dist/commands/scan.js.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/utils/blast-radius-analyzer.d.ts +8 -39
- package/dist/utils/blast-radius-analyzer.d.ts.map +1 -1
- package/dist/utils/blast-radius-analyzer.js +72 -138
- package/dist/utils/blast-radius-analyzer.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/scan.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,WAAW,CAC/B,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,WAAW,CAC/B,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CA0Jf"}
|
package/dist/commands/scan.js
CHANGED
|
@@ -20,8 +20,24 @@ async function scanCommand(projectPath, options = {}) {
|
|
|
20
20
|
console.log(chalk_1.default.blue('š Scanning project...'));
|
|
21
21
|
console.log(chalk_1.default.gray(` Path: ${rootPath}`));
|
|
22
22
|
try {
|
|
23
|
-
// Check free tier audit limit before running
|
|
24
23
|
const session = await (0, auth_session_1.resolveActiveSession)();
|
|
24
|
+
// āā Team flag validation āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
25
|
+
if (options.team) {
|
|
26
|
+
if (!session) {
|
|
27
|
+
console.error(chalk_1.default.red('\nā Not authenticated. Run: cxgrd auth login'));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
if (session.plan !== 'team') {
|
|
31
|
+
console.error(chalk_1.default.red('\nā --team requires a Team plan. Upgrade at https://cxgrd.com/upgrade'));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
if (!session.orgId) {
|
|
35
|
+
console.error(chalk_1.default.red('\nā No team associated with your account. Ask your team owner to invite you.'));
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
console.log(chalk_1.default.gray(` Team: ${session.orgName ?? session.orgId} (${session.role})`));
|
|
39
|
+
}
|
|
40
|
+
// āā Free tier audit limit āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
25
41
|
if (!session || session.plan === 'free') {
|
|
26
42
|
try {
|
|
27
43
|
await (0, audit_usage_1.checkFreeAuditLimit)();
|
|
@@ -92,15 +108,28 @@ async function scanCommand(projectPath, options = {}) {
|
|
|
92
108
|
await (0, audit_usage_1.incrementAuditCount)();
|
|
93
109
|
await (0, audit_usage_1.printAuditUsageStatus)();
|
|
94
110
|
}
|
|
95
|
-
//
|
|
96
|
-
|
|
111
|
+
// āā Sync logic āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
112
|
+
// --team always syncs. --sync or cloud_sync feature syncs for pro/team.
|
|
113
|
+
const shouldSync = options.team ||
|
|
114
|
+
options.sync ||
|
|
115
|
+
(session && (0, plans_1.planIncludesFeature)(session.plan, 'cloud_sync'));
|
|
97
116
|
if (shouldSync && session) {
|
|
98
117
|
try {
|
|
99
118
|
await (0, graph_sync_1.syncPush)(cgDir, rootPath, session);
|
|
100
|
-
|
|
119
|
+
if (options.team) {
|
|
120
|
+
console.log(chalk_1.default.green(`ā Shared graph updated (team: ${session.orgName ?? session.orgId})`));
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.log(chalk_1.default.green('ā Synced graph to cloud'));
|
|
124
|
+
}
|
|
101
125
|
}
|
|
102
126
|
catch (syncErr) {
|
|
103
127
|
const msg = syncErr instanceof Error ? syncErr.message : String(syncErr);
|
|
128
|
+
// --team makes sync errors fatal so the dev knows the shared graph wasn't updated
|
|
129
|
+
if (options.team) {
|
|
130
|
+
console.error(chalk_1.default.red(`ā Team sync failed: ${msg}`));
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
104
133
|
console.log(chalk_1.default.yellow(` Sync skipped: ${msg}`));
|
|
105
134
|
}
|
|
106
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -26,11 +26,16 @@ async function main() {
|
|
|
26
26
|
type: 'string',
|
|
27
27
|
})
|
|
28
28
|
.option('sync', {
|
|
29
|
-
describe: 'Push graph to
|
|
29
|
+
describe: 'Push graph to cloud after scan',
|
|
30
|
+
type: 'boolean',
|
|
31
|
+
default: false,
|
|
32
|
+
})
|
|
33
|
+
.option('team', {
|
|
34
|
+
describe: 'Require team session and push to shared team graph (Team plan)',
|
|
30
35
|
type: 'boolean',
|
|
31
36
|
default: false,
|
|
32
37
|
}), async (argv) => {
|
|
33
|
-
await (0, scan_1.scanCommand)(argv.path, { sync: argv.sync });
|
|
38
|
+
await (0, scan_1.scanCommand)(argv.path, { sync: argv.sync, team: argv.team });
|
|
34
39
|
})
|
|
35
40
|
.command('input <description>', 'Analyze blast radius of a change', (y) => y
|
|
36
41
|
.positional('description', {
|
|
@@ -44,7 +49,7 @@ async function main() {
|
|
|
44
49
|
}), async (argv) => {
|
|
45
50
|
await (0, input_1.inputCommand)(argv.description, argv.path);
|
|
46
51
|
})
|
|
47
|
-
.command('prompt <description>', 'Generate LLM-enriched AI prompt (Pro / Team
|
|
52
|
+
.command('prompt <description>', 'Generate LLM-enriched AI prompt (Pro / Team)', (y) => y
|
|
48
53
|
.positional('description', {
|
|
49
54
|
describe: 'Description of the change',
|
|
50
55
|
type: 'string',
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,kDAAkD;AAClD,2CAAwC;AACxC,kDAA0B;AAC1B,0CAA8C;AAC9C,4CAAgD;AAChD,8CAAkD;AAClD,4CAAgD;AAChD,sDAAyD;AACzD,4CAAgD;AAChD,8CAAkD;AAClD,0CAAyF;AACzF,sCAA4C;AAG5C,KAAK,UAAU,IAAI;IACjB,MAAM,IAAA,kBAAY,GAAE,CAAC;IAErB,IAAI,CAAC;QACH,MAAM,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAC/B,OAAO,CACN,aAAa,EACb,yCAAyC,EACzC,CAAC,CAAM,EAAE,EAAE,CACT,CAAC;aACE,UAAU,CAAC,MAAM,EAAE;YAClB,QAAQ,EAAE,2CAA2C;YACrD,IAAI,EAAE,QAAQ;SACf,CAAC;aACD,MAAM,CAAC,MAAM,EAAE;YACd,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Enhanced Blast Radius Analyzer
|
|
3
|
-
*
|
|
4
|
-
* Determines what breaks when you change a file:
|
|
5
|
-
* - Direct impact (files that import/depend on the changed file)
|
|
6
|
-
* - Transitive impact (files that depend on the dependent files)
|
|
7
|
-
* - Severity scoring (high/medium/low based on multiple factors)
|
|
8
|
-
* - Change classification (what type of change is it)
|
|
9
|
-
*/
|
|
10
1
|
export interface ChangeType {
|
|
11
2
|
type: 'function' | 'class' | 'type' | 'export' | 'import' | 'schema' | 'config' | 'unknown';
|
|
12
3
|
description: string;
|
|
@@ -39,8 +30,6 @@ interface FileNode {
|
|
|
39
30
|
type: string;
|
|
40
31
|
}>;
|
|
41
32
|
symbols: string[];
|
|
42
|
-
imports?: string[];
|
|
43
|
-
exports?: string[];
|
|
44
33
|
}
|
|
45
34
|
interface DependencyGraph {
|
|
46
35
|
files: Record<string, FileNode>;
|
|
@@ -51,44 +40,24 @@ export declare class BlastRadiusAnalyzer {
|
|
|
51
40
|
private reverseGraph;
|
|
52
41
|
constructor(graph: DependencyGraph);
|
|
53
42
|
/**
|
|
54
|
-
*
|
|
43
|
+
* Normalize an import string to possible file paths.
|
|
44
|
+
* Python: "app.oauth" ā ["app/oauth.py", "app/oauth/__init__.py"]
|
|
45
|
+
* JS/TS: "./utils/auth" ā ["utils/auth.ts", "utils/auth.js", ...]
|
|
55
46
|
*/
|
|
56
|
-
private
|
|
47
|
+
private normalizeImportToFilePath;
|
|
57
48
|
/**
|
|
58
|
-
*
|
|
49
|
+
* Build reverse dependency graph.
|
|
50
|
+
* Stores both raw import strings AND normalized file paths so lookups
|
|
51
|
+
* work regardless of whether the caller uses "app.oauth" or "app/oauth.py".
|
|
59
52
|
*/
|
|
53
|
+
private buildReverseGraph;
|
|
60
54
|
analyze(changedFiles: string[]): BlastRadiusResult;
|
|
61
|
-
/**
|
|
62
|
-
* Recursively find all files impacted by a change
|
|
63
|
-
*/
|
|
64
55
|
private findImpactedFiles;
|
|
65
|
-
/**
|
|
66
|
-
* Generate human-readable reason for impact
|
|
67
|
-
*/
|
|
68
|
-
private generateReason;
|
|
69
|
-
/**
|
|
70
|
-
* Classify the type of change being made
|
|
71
|
-
*/
|
|
72
56
|
private classifyChanges;
|
|
73
|
-
/**
|
|
74
|
-
* Calculate severity for each impacted file based on multiple factors
|
|
75
|
-
*/
|
|
76
57
|
private calculateSeverities;
|
|
77
|
-
/**
|
|
78
|
-
* Heuristics to identify important files
|
|
79
|
-
*/
|
|
80
58
|
private isImportantFile;
|
|
81
|
-
/**
|
|
82
|
-
* Aggregate results and generate recommendations
|
|
83
|
-
*/
|
|
84
59
|
private aggregateResults;
|
|
85
|
-
/**
|
|
86
|
-
* Generate actionable recommendations based on analysis
|
|
87
|
-
*/
|
|
88
60
|
private generateRecommendations;
|
|
89
|
-
/**
|
|
90
|
-
* Detailed analysis for a specific file
|
|
91
|
-
*/
|
|
92
61
|
analyzeFile(filePath: string): any;
|
|
93
62
|
}
|
|
94
63
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blast-radius-analyzer.d.ts","sourceRoot":"","sources":["../../src/utils/blast-radius-analyzer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"blast-radius-analyzer.d.ts","sourceRoot":"","sources":["../../src/utils/blast-radius-analyzer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5F,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,QAAQ,GAAG,YAAY,GAAG,WAAW,CAAC;IAClD,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,YAAY,CAAuC;gBAE/C,KAAK,EAAE,eAAe;IAKlC;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IAkBjC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,iBAAiB;IAmBlD,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,gBAAgB;IAiCxB,OAAO,CAAC,uBAAuB;IAkC/B,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG;CAWnC"}
|
|
@@ -1,159 +1,130 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Enhanced Blast Radius Analyzer
|
|
4
|
-
*
|
|
5
|
-
* Determines what breaks when you change a file:
|
|
6
|
-
* - Direct impact (files that import/depend on the changed file)
|
|
7
|
-
* - Transitive impact (files that depend on the dependent files)
|
|
8
|
-
* - Severity scoring (high/medium/low based on multiple factors)
|
|
9
|
-
* - Change classification (what type of change is it)
|
|
10
|
-
*/
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.BlastRadiusAnalyzer = void 0;
|
|
13
4
|
class BlastRadiusAnalyzer {
|
|
14
5
|
graph;
|
|
15
|
-
reverseGraph = new Map();
|
|
6
|
+
reverseGraph = new Map();
|
|
16
7
|
constructor(graph) {
|
|
17
8
|
this.graph = graph;
|
|
18
9
|
this.buildReverseGraph();
|
|
19
10
|
}
|
|
20
11
|
/**
|
|
21
|
-
*
|
|
12
|
+
* Normalize an import string to possible file paths.
|
|
13
|
+
* Python: "app.oauth" ā ["app/oauth.py", "app/oauth/__init__.py"]
|
|
14
|
+
* JS/TS: "./utils/auth" ā ["utils/auth.ts", "utils/auth.js", ...]
|
|
15
|
+
*/
|
|
16
|
+
normalizeImportToFilePath(importPath, language) {
|
|
17
|
+
const candidates = [];
|
|
18
|
+
if (language === 'python') {
|
|
19
|
+
const slashPath = importPath.replace(/\./g, '/');
|
|
20
|
+
candidates.push(`${slashPath}.py`);
|
|
21
|
+
candidates.push(`${slashPath}/__init__.py`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const clean = importPath.replace(/^\.\.?\//, '');
|
|
25
|
+
candidates.push(`${clean}.ts`, `${clean}.tsx`, `${clean}.js`, `${clean}.jsx`, `${clean}/index.ts`, `${clean}/index.js`);
|
|
26
|
+
}
|
|
27
|
+
return candidates;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build reverse dependency graph.
|
|
31
|
+
* Stores both raw import strings AND normalized file paths so lookups
|
|
32
|
+
* work regardless of whether the caller uses "app.oauth" or "app/oauth.py".
|
|
22
33
|
*/
|
|
23
34
|
buildReverseGraph() {
|
|
24
35
|
for (const [filePath, node] of Object.entries(this.graph.files || {})) {
|
|
25
36
|
for (const dep of node.dependencies || []) {
|
|
37
|
+
// Raw key (e.g. "app.oauth")
|
|
26
38
|
if (!this.reverseGraph.has(dep.to)) {
|
|
27
39
|
this.reverseGraph.set(dep.to, new Set());
|
|
28
40
|
}
|
|
29
41
|
this.reverseGraph.get(dep.to).add(filePath);
|
|
42
|
+
// Normalized file-path keys (e.g. "app/oauth.py")
|
|
43
|
+
const normalized = this.normalizeImportToFilePath(dep.to, node.language);
|
|
44
|
+
for (const candidate of normalized) {
|
|
45
|
+
if (!this.reverseGraph.has(candidate)) {
|
|
46
|
+
this.reverseGraph.set(candidate, new Set());
|
|
47
|
+
}
|
|
48
|
+
this.reverseGraph.get(candidate).add(filePath);
|
|
49
|
+
}
|
|
30
50
|
}
|
|
31
51
|
}
|
|
32
52
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Analyze impact of changing specific files
|
|
35
|
-
*/
|
|
36
53
|
analyze(changedFiles) {
|
|
37
54
|
const affected = new Map();
|
|
38
55
|
const visited = new Set();
|
|
39
|
-
// Find all impacted files recursively
|
|
40
56
|
for (const file of changedFiles) {
|
|
41
57
|
this.findImpactedFiles(file, 1, affected, visited);
|
|
42
58
|
}
|
|
43
|
-
// Classify changes and calculate severity
|
|
44
59
|
const changeTypes = this.classifyChanges(changedFiles);
|
|
45
60
|
const impactedArray = Array.from(affected.values());
|
|
46
61
|
const severityMap = this.calculateSeverities(impactedArray, changeTypes);
|
|
47
|
-
// Update severities
|
|
48
62
|
impactedArray.forEach(file => {
|
|
49
63
|
file.severity = severityMap.get(file.path) || 'low';
|
|
50
64
|
});
|
|
51
|
-
|
|
52
|
-
const result = this.aggregateResults(impactedArray, changeTypes);
|
|
53
|
-
return result;
|
|
65
|
+
return this.aggregateResults(impactedArray, changeTypes);
|
|
54
66
|
}
|
|
55
|
-
/**
|
|
56
|
-
* Recursively find all files impacted by a change
|
|
57
|
-
*/
|
|
58
67
|
findImpactedFiles(file, depth, affected, visited, maxDepth = 5) {
|
|
59
68
|
if (visited.has(file) || depth > maxDepth)
|
|
60
69
|
return;
|
|
61
70
|
visited.add(file);
|
|
62
|
-
// Find files that depend on the current file
|
|
63
71
|
const dependents = this.reverseGraph.get(file) || new Set();
|
|
64
72
|
for (const dependent of dependents) {
|
|
65
73
|
if (!affected.has(dependent)) {
|
|
66
74
|
affected.set(dependent, {
|
|
67
75
|
path: dependent,
|
|
68
|
-
reason:
|
|
69
|
-
severity: 'medium',
|
|
76
|
+
reason: `Depends on ${file.split('/').pop() || file}`,
|
|
77
|
+
severity: 'medium',
|
|
70
78
|
distance: depth,
|
|
71
79
|
impactType: depth === 1 ? 'direct' : 'transitive',
|
|
72
80
|
changeRequired: true,
|
|
73
81
|
});
|
|
74
82
|
}
|
|
75
|
-
// Recursively find transitive dependencies
|
|
76
83
|
if (depth < 3) {
|
|
77
84
|
this.findImpactedFiles(dependent, depth + 1, affected, visited, maxDepth);
|
|
78
85
|
}
|
|
79
86
|
}
|
|
80
87
|
}
|
|
81
|
-
/**
|
|
82
|
-
* Generate human-readable reason for impact
|
|
83
|
-
*/
|
|
84
|
-
generateReason(from, to) {
|
|
85
|
-
const fromName = from.split('/').pop() || from;
|
|
86
|
-
const toName = to.split('/').pop() || to;
|
|
87
|
-
return `Depends on ${fromName}`;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Classify the type of change being made
|
|
91
|
-
*/
|
|
92
88
|
classifyChanges(changedFiles) {
|
|
93
89
|
const changes = [];
|
|
94
|
-
const keywords = {
|
|
95
|
-
function: ['function', 'method', 'handler', 'callback'],
|
|
96
|
-
class: ['class', 'interface', 'type', 'abstract'],
|
|
97
|
-
export: ['export', 'default export'],
|
|
98
|
-
schema: ['schema', 'model', 'entity', 'database'],
|
|
99
|
-
config: ['config', 'settings', '.env', 'constants'],
|
|
100
|
-
};
|
|
101
90
|
for (const file of changedFiles) {
|
|
102
|
-
const
|
|
103
|
-
let
|
|
91
|
+
const f = file.toLowerCase();
|
|
92
|
+
let type = 'unknown';
|
|
104
93
|
let confidence = 0.3;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
matchedType = 'schema';
|
|
94
|
+
if (f.includes('schema') || f.includes('model')) {
|
|
95
|
+
type = 'schema';
|
|
108
96
|
confidence = 0.8;
|
|
109
97
|
}
|
|
110
|
-
else if (
|
|
111
|
-
|
|
98
|
+
else if (f.includes('config') || f.includes('const')) {
|
|
99
|
+
type = 'config';
|
|
112
100
|
confidence = 0.8;
|
|
113
101
|
}
|
|
114
|
-
else if (
|
|
115
|
-
|
|
102
|
+
else if (f.includes('service') || f.includes('handler')) {
|
|
103
|
+
type = 'function';
|
|
116
104
|
confidence = 0.6;
|
|
117
105
|
}
|
|
118
|
-
else if (
|
|
119
|
-
|
|
106
|
+
else if (f.includes('component') || f.includes('util')) {
|
|
107
|
+
type = 'class';
|
|
120
108
|
confidence = 0.5;
|
|
121
109
|
}
|
|
122
|
-
|
|
123
|
-
matchedType = 'unknown';
|
|
124
|
-
confidence = 0.3;
|
|
125
|
-
}
|
|
126
|
-
changes.push({
|
|
127
|
-
type: matchedType,
|
|
128
|
-
description: `${matchedType} change detected`,
|
|
129
|
-
confidence,
|
|
130
|
-
});
|
|
110
|
+
changes.push({ type, description: `${type} change detected`, confidence });
|
|
131
111
|
}
|
|
132
112
|
return changes;
|
|
133
113
|
}
|
|
134
|
-
/**
|
|
135
|
-
* Calculate severity for each impacted file based on multiple factors
|
|
136
|
-
*/
|
|
137
114
|
calculateSeverities(files, changeTypes) {
|
|
138
115
|
const severities = new Map();
|
|
116
|
+
const avgConfidence = changeTypes.length > 0
|
|
117
|
+
? changeTypes.reduce((s, c) => s + c.confidence, 0) / changeTypes.length
|
|
118
|
+
: 0.5;
|
|
139
119
|
for (const file of files) {
|
|
140
|
-
let score =
|
|
141
|
-
// Factor 1: Distance (closer = higher severity)
|
|
142
|
-
score += (4 - file.distance) * 20; // 0-80 points
|
|
143
|
-
// Factor 2: Impact type
|
|
120
|
+
let score = (4 - Math.min(file.distance, 3)) * 20;
|
|
144
121
|
if (file.impactType === 'direct')
|
|
145
122
|
score += 15;
|
|
146
123
|
else if (file.impactType === 'transitive')
|
|
147
124
|
score += 5;
|
|
148
|
-
// Factor 3: File importance heuristics
|
|
149
125
|
if (this.isImportantFile(file.path))
|
|
150
126
|
score += 10;
|
|
151
|
-
|
|
152
|
-
const avgChangeConfidence = changeTypes.length > 0
|
|
153
|
-
? changeTypes.reduce((sum, c) => sum + c.confidence, 0) / changeTypes.length
|
|
154
|
-
: 0.5;
|
|
155
|
-
score += avgChangeConfidence * 20;
|
|
156
|
-
// Determine severity level
|
|
127
|
+
score += avgConfidence * 20;
|
|
157
128
|
if (score >= 80)
|
|
158
129
|
severities.set(file.path, 'critical');
|
|
159
130
|
else if (score >= 60)
|
|
@@ -165,36 +136,17 @@ class BlastRadiusAnalyzer {
|
|
|
165
136
|
}
|
|
166
137
|
return severities;
|
|
167
138
|
}
|
|
168
|
-
/**
|
|
169
|
-
* Heuristics to identify important files
|
|
170
|
-
*/
|
|
171
139
|
isImportantFile(path) {
|
|
172
|
-
const important = [
|
|
173
|
-
|
|
174
|
-
'main',
|
|
175
|
-
'app',
|
|
176
|
-
'core',
|
|
177
|
-
'api',
|
|
178
|
-
'server',
|
|
179
|
-
'middleware',
|
|
180
|
-
'auth',
|
|
181
|
-
'schema',
|
|
182
|
-
];
|
|
183
|
-
const lowerPath = path.toLowerCase();
|
|
184
|
-
return important.some(keyword => lowerPath.includes(keyword));
|
|
140
|
+
const important = ['index', 'main', 'app', 'core', 'api', 'server', 'middleware', 'auth', 'schema'];
|
|
141
|
+
return important.some(k => path.toLowerCase().includes(k));
|
|
185
142
|
}
|
|
186
|
-
/**
|
|
187
|
-
* Aggregate results and generate recommendations
|
|
188
|
-
*/
|
|
189
143
|
aggregateResults(files, changeTypes) {
|
|
190
144
|
const critical = files.filter(f => f.severity === 'critical').length;
|
|
191
145
|
const high = files.filter(f => f.severity === 'high').length;
|
|
192
146
|
const medium = files.filter(f => f.severity === 'medium').length;
|
|
193
147
|
const low = files.filter(f => f.severity === 'low').length;
|
|
194
|
-
// Calculate overall risk (0-100)
|
|
195
148
|
let totalRisk = critical * 25 + high * 15 + medium * 8 + low * 2;
|
|
196
149
|
totalRisk = Math.min(100, totalRisk / Math.max(1, files.length) + files.length * 2);
|
|
197
|
-
// Determine risk level
|
|
198
150
|
let riskLevel = 'low';
|
|
199
151
|
if (totalRisk >= 75)
|
|
200
152
|
riskLevel = 'critical';
|
|
@@ -202,7 +154,6 @@ class BlastRadiusAnalyzer {
|
|
|
202
154
|
riskLevel = 'high';
|
|
203
155
|
else if (totalRisk >= 25)
|
|
204
156
|
riskLevel = 'medium';
|
|
205
|
-
// Generate recommendations
|
|
206
157
|
const recommendations = this.generateRecommendations(files, changeTypes, riskLevel);
|
|
207
158
|
const direct = files.filter(f => f.distance === 1).length;
|
|
208
159
|
const transitive = files.filter(f => f.distance > 1).length;
|
|
@@ -213,68 +164,51 @@ class BlastRadiusAnalyzer {
|
|
|
213
164
|
totalRisk: Math.round(totalRisk),
|
|
214
165
|
riskLevel,
|
|
215
166
|
affectedFiles: files.sort((a, b) => {
|
|
216
|
-
const
|
|
217
|
-
return (
|
|
167
|
+
const order = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
168
|
+
return (order[a.severity] ?? 4) - (order[b.severity] ?? 4);
|
|
218
169
|
}),
|
|
219
170
|
changeTypes,
|
|
220
171
|
recommendations,
|
|
221
172
|
};
|
|
222
173
|
}
|
|
223
|
-
/**
|
|
224
|
-
* Generate actionable recommendations based on analysis
|
|
225
|
-
*/
|
|
226
174
|
generateRecommendations(files, changeTypes, riskLevel) {
|
|
227
|
-
const
|
|
228
|
-
// Critical files
|
|
175
|
+
const recs = [];
|
|
229
176
|
const criticalFiles = files.filter(f => f.severity === 'critical');
|
|
230
177
|
if (criticalFiles.length > 0) {
|
|
231
|
-
|
|
178
|
+
recs.push(`ā ļø ${criticalFiles.length} critical file(s) impacted ā review carefully`);
|
|
232
179
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
else if (
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
else if (change.type === 'config') {
|
|
242
|
-
recommendations.push('āļø Configuration change: Verify environment variables across deployment');
|
|
243
|
-
}
|
|
180
|
+
for (const c of changeTypes) {
|
|
181
|
+
if (c.type === 'schema')
|
|
182
|
+
recs.push('š Schema change: update database migrations and models');
|
|
183
|
+
else if (c.type === 'export')
|
|
184
|
+
recs.push('š¤ Export change: update all imports in affected files');
|
|
185
|
+
else if (c.type === 'config')
|
|
186
|
+
recs.push('āļø Config change: verify environment variables across deployments');
|
|
244
187
|
}
|
|
245
|
-
// Risk-level recommendations
|
|
246
188
|
if (riskLevel === 'critical' || riskLevel === 'high') {
|
|
247
|
-
|
|
248
|
-
|
|
189
|
+
recs.push('šØ Write additional tests for affected modules');
|
|
190
|
+
recs.push('š Run full test suite before deploying');
|
|
249
191
|
}
|
|
250
192
|
else if (riskLevel === 'medium') {
|
|
251
|
-
|
|
193
|
+
recs.push('ā Run tests for directly affected modules');
|
|
252
194
|
}
|
|
253
|
-
// Hotfix recommendations
|
|
254
195
|
if (files.length > 15) {
|
|
255
|
-
|
|
196
|
+
recs.push(`š” Large blast radius (${files.length} files) ā consider smaller PRs`);
|
|
256
197
|
}
|
|
257
|
-
if (
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
return recommendations;
|
|
198
|
+
if (recs.length === 0)
|
|
199
|
+
recs.push('ā Low risk change. Proceed with caution.');
|
|
200
|
+
return recs;
|
|
261
201
|
}
|
|
262
|
-
/**
|
|
263
|
-
* Detailed analysis for a specific file
|
|
264
|
-
*/
|
|
265
202
|
analyzeFile(filePath) {
|
|
266
203
|
const node = this.graph.files[filePath];
|
|
267
204
|
if (!node)
|
|
268
205
|
return null;
|
|
269
|
-
const dependsOn = node.dependencies || [];
|
|
270
|
-
const dependedOnBy = Array.from(this.reverseGraph.get(filePath) || []);
|
|
271
206
|
return {
|
|
272
207
|
path: filePath,
|
|
273
208
|
language: node.language,
|
|
274
|
-
dependsOn,
|
|
275
|
-
dependedOnBy,
|
|
209
|
+
dependsOn: node.dependencies || [],
|
|
210
|
+
dependedOnBy: Array.from(this.reverseGraph.get(filePath) || []),
|
|
276
211
|
symbols: node.symbols || [],
|
|
277
|
-
riskScore: dependedOnBy.length * 2 + dependsOn.length,
|
|
278
212
|
};
|
|
279
213
|
}
|
|
280
214
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blast-radius-analyzer.js","sourceRoot":"","sources":["../../src/utils/blast-radius-analyzer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"blast-radius-analyzer.js","sourceRoot":"","sources":["../../src/utils/blast-radius-analyzer.ts"],"names":[],"mappings":"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"}
|