statecli-mcp-server 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cross-file-impact.d.ts +85 -0
- package/dist/cross-file-impact.d.ts.map +1 -0
- package/dist/cross-file-impact.js +338 -0
- package/dist/cross-file-impact.js.map +1 -0
- package/dist/dependency-tracker.d.ts +78 -0
- package/dist/dependency-tracker.d.ts.map +1 -0
- package/dist/dependency-tracker.js +334 -0
- package/dist/dependency-tracker.js.map +1 -0
- package/dist/enhanced-mcp-server.d.ts +15 -0
- package/dist/enhanced-mcp-server.d.ts.map +1 -1
- package/dist/enhanced-mcp-server.js +240 -1
- package/dist/enhanced-mcp-server.js.map +1 -1
- package/dist/rollback-preview.d.ts +77 -0
- package/dist/rollback-preview.d.ts.map +1 -0
- package/dist/rollback-preview.js +244 -0
- package/dist/rollback-preview.js.map +1 -0
- package/dist/test-awareness.d.ts +85 -0
- package/dist/test-awareness.d.ts.map +1 -0
- package/dist/test-awareness.js +329 -0
- package/dist/test-awareness.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-File Impact - Predict which files will be affected by a change
|
|
3
|
+
*
|
|
4
|
+
* Analyzes code to predict ripple effects of changes.
|
|
5
|
+
*/
|
|
6
|
+
import { StateCLI } from './statecli';
|
|
7
|
+
export interface SymbolReference {
|
|
8
|
+
symbol: string;
|
|
9
|
+
file: string;
|
|
10
|
+
line: number;
|
|
11
|
+
type: 'definition' | 'usage' | 'import' | 'export';
|
|
12
|
+
}
|
|
13
|
+
export interface ChangeProposal {
|
|
14
|
+
file: string;
|
|
15
|
+
symbol?: string;
|
|
16
|
+
changeType: 'modify' | 'rename' | 'delete' | 'move';
|
|
17
|
+
newValue?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ImpactPrediction {
|
|
20
|
+
proposal: ChangeProposal;
|
|
21
|
+
affectedFiles: AffectedFile[];
|
|
22
|
+
totalFilesAffected: number;
|
|
23
|
+
riskScore: number;
|
|
24
|
+
breakingChanges: BreakingChange[];
|
|
25
|
+
suggestions: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface AffectedFile {
|
|
28
|
+
path: string;
|
|
29
|
+
reason: string;
|
|
30
|
+
references: SymbolReference[];
|
|
31
|
+
changeRequired: boolean;
|
|
32
|
+
suggestedFix?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface BreakingChange {
|
|
35
|
+
file: string;
|
|
36
|
+
line: number;
|
|
37
|
+
description: string;
|
|
38
|
+
severity: 'error' | 'warning';
|
|
39
|
+
}
|
|
40
|
+
export declare class CrossFileImpact {
|
|
41
|
+
private statecli;
|
|
42
|
+
private dependencyTracker;
|
|
43
|
+
private projectPath;
|
|
44
|
+
private symbolIndex;
|
|
45
|
+
constructor(statecli: StateCLI, projectPath?: string);
|
|
46
|
+
/**
|
|
47
|
+
* Build symbol index for the project
|
|
48
|
+
*/
|
|
49
|
+
buildIndex(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Predict impact of a proposed change
|
|
52
|
+
*/
|
|
53
|
+
predictImpact(proposal: ChangeProposal): ImpactPrediction;
|
|
54
|
+
/**
|
|
55
|
+
* Find all references to a symbol
|
|
56
|
+
*/
|
|
57
|
+
findSymbolReferences(symbol: string): SymbolReference[];
|
|
58
|
+
/**
|
|
59
|
+
* Analyze what would break if a file is deleted
|
|
60
|
+
*/
|
|
61
|
+
analyzeFileDeletion(filePath: string): ImpactPrediction;
|
|
62
|
+
/**
|
|
63
|
+
* Analyze what would break if a symbol is renamed
|
|
64
|
+
*/
|
|
65
|
+
analyzeRename(filePath: string, oldName: string, newName: string): ImpactPrediction;
|
|
66
|
+
/**
|
|
67
|
+
* Get a safe change order for multiple files
|
|
68
|
+
*/
|
|
69
|
+
getSafeChangeOrder(files: string[]): {
|
|
70
|
+
order: string[];
|
|
71
|
+
reason: string;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Check if a change is safe to make
|
|
75
|
+
*/
|
|
76
|
+
isChangeSafe(proposal: ChangeProposal): {
|
|
77
|
+
safe: boolean;
|
|
78
|
+
reasons: string[];
|
|
79
|
+
};
|
|
80
|
+
private scanForSymbols;
|
|
81
|
+
private extractSymbols;
|
|
82
|
+
private isSourceFile;
|
|
83
|
+
private calculateRiskScore;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=cross-file-impact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-file-impact.d.ts","sourceRoot":"","sources":["../src/cross-file-impact.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;CACpD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAA6C;gBAEpD,QAAQ,EAAE,QAAQ,EAAE,WAAW,GAAE,MAAY;IAMzD;;OAEG;IACH,UAAU,IAAI,IAAI;IAWlB;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,cAAc,GAAG,gBAAgB;IAoGzD;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE;IAIvD;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAOvD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB;IASnF;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;QACnC,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB;IAoBD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG;QACtC,IAAI,EAAE,OAAO,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB;IAoBD,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,cAAc;IAyEtB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,kBAAkB;CAwB3B"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cross-File Impact - Predict which files will be affected by a change
|
|
4
|
+
*
|
|
5
|
+
* Analyzes code to predict ripple effects of changes.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.CrossFileImpact = void 0;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const dependency_tracker_1 = require("./dependency-tracker");
|
|
45
|
+
class CrossFileImpact {
|
|
46
|
+
statecli;
|
|
47
|
+
dependencyTracker;
|
|
48
|
+
projectPath;
|
|
49
|
+
symbolIndex = new Map();
|
|
50
|
+
constructor(statecli, projectPath = '.') {
|
|
51
|
+
this.statecli = statecli;
|
|
52
|
+
this.projectPath = path.resolve(projectPath);
|
|
53
|
+
this.dependencyTracker = new dependency_tracker_1.DependencyTracker(statecli, projectPath);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Build symbol index for the project
|
|
57
|
+
*/
|
|
58
|
+
buildIndex() {
|
|
59
|
+
this.symbolIndex.clear();
|
|
60
|
+
this.dependencyTracker.buildGraph();
|
|
61
|
+
this.scanForSymbols(this.projectPath);
|
|
62
|
+
this.statecli.track('cross-file', 'index-built', {
|
|
63
|
+
symbolCount: this.symbolIndex.size,
|
|
64
|
+
timestamp: new Date().toISOString()
|
|
65
|
+
}, 'cross-file-impact');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Predict impact of a proposed change
|
|
69
|
+
*/
|
|
70
|
+
predictImpact(proposal) {
|
|
71
|
+
const affectedFiles = [];
|
|
72
|
+
const breakingChanges = [];
|
|
73
|
+
const suggestions = [];
|
|
74
|
+
// Get dependency impact
|
|
75
|
+
const depImpact = this.dependencyTracker.analyzeImpact(proposal.file);
|
|
76
|
+
// Add direct dependents
|
|
77
|
+
for (const dep of depImpact.directDependents) {
|
|
78
|
+
affectedFiles.push({
|
|
79
|
+
path: dep,
|
|
80
|
+
reason: 'Directly imports the changed file',
|
|
81
|
+
references: [],
|
|
82
|
+
changeRequired: proposal.changeType === 'delete' || proposal.changeType === 'move'
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Add transitive dependents for high-risk changes
|
|
86
|
+
if (proposal.changeType === 'delete' || proposal.changeType === 'rename') {
|
|
87
|
+
for (const dep of depImpact.transitiveDependents) {
|
|
88
|
+
if (!affectedFiles.find(f => f.path === dep)) {
|
|
89
|
+
affectedFiles.push({
|
|
90
|
+
path: dep,
|
|
91
|
+
reason: 'Transitively depends on the changed file',
|
|
92
|
+
references: [],
|
|
93
|
+
changeRequired: false
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// If changing a specific symbol, find all usages
|
|
99
|
+
if (proposal.symbol) {
|
|
100
|
+
const references = this.findSymbolReferences(proposal.symbol);
|
|
101
|
+
for (const ref of references) {
|
|
102
|
+
if (ref.file !== proposal.file) {
|
|
103
|
+
let existing = affectedFiles.find(f => f.path === ref.file);
|
|
104
|
+
if (!existing) {
|
|
105
|
+
existing = {
|
|
106
|
+
path: ref.file,
|
|
107
|
+
reason: `Uses symbol "${proposal.symbol}"`,
|
|
108
|
+
references: [],
|
|
109
|
+
changeRequired: proposal.changeType !== 'modify'
|
|
110
|
+
};
|
|
111
|
+
affectedFiles.push(existing);
|
|
112
|
+
}
|
|
113
|
+
existing.references.push(ref);
|
|
114
|
+
// Add breaking change if deleting or renaming
|
|
115
|
+
if (proposal.changeType === 'delete' || proposal.changeType === 'rename') {
|
|
116
|
+
breakingChanges.push({
|
|
117
|
+
file: ref.file,
|
|
118
|
+
line: ref.line,
|
|
119
|
+
description: `Reference to "${proposal.symbol}" will break`,
|
|
120
|
+
severity: 'error'
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Generate suggestions
|
|
127
|
+
if (proposal.changeType === 'rename' && proposal.newValue) {
|
|
128
|
+
suggestions.push(`Use find-and-replace to rename "${proposal.symbol}" to "${proposal.newValue}" across ${affectedFiles.length} files`);
|
|
129
|
+
}
|
|
130
|
+
if (proposal.changeType === 'delete') {
|
|
131
|
+
suggestions.push(`Remove or replace all ${breakingChanges.length} references before deleting`);
|
|
132
|
+
}
|
|
133
|
+
if (affectedFiles.length > 10) {
|
|
134
|
+
suggestions.push('Consider creating a checkpoint before making this change');
|
|
135
|
+
}
|
|
136
|
+
if (breakingChanges.length === 0 && affectedFiles.length > 0) {
|
|
137
|
+
suggestions.push('No breaking changes detected, but review affected files after change');
|
|
138
|
+
}
|
|
139
|
+
// Calculate risk score
|
|
140
|
+
const riskScore = this.calculateRiskScore(proposal, affectedFiles, breakingChanges);
|
|
141
|
+
// Track prediction
|
|
142
|
+
this.statecli.track('cross-file', 'impact-prediction', {
|
|
143
|
+
file: proposal.file,
|
|
144
|
+
changeType: proposal.changeType,
|
|
145
|
+
symbol: proposal.symbol,
|
|
146
|
+
affectedCount: affectedFiles.length,
|
|
147
|
+
breakingCount: breakingChanges.length,
|
|
148
|
+
riskScore
|
|
149
|
+
}, 'cross-file-impact');
|
|
150
|
+
return {
|
|
151
|
+
proposal,
|
|
152
|
+
affectedFiles,
|
|
153
|
+
totalFilesAffected: affectedFiles.length,
|
|
154
|
+
riskScore,
|
|
155
|
+
breakingChanges,
|
|
156
|
+
suggestions
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Find all references to a symbol
|
|
161
|
+
*/
|
|
162
|
+
findSymbolReferences(symbol) {
|
|
163
|
+
return this.symbolIndex.get(symbol) || [];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Analyze what would break if a file is deleted
|
|
167
|
+
*/
|
|
168
|
+
analyzeFileDeletion(filePath) {
|
|
169
|
+
return this.predictImpact({
|
|
170
|
+
file: filePath,
|
|
171
|
+
changeType: 'delete'
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Analyze what would break if a symbol is renamed
|
|
176
|
+
*/
|
|
177
|
+
analyzeRename(filePath, oldName, newName) {
|
|
178
|
+
return this.predictImpact({
|
|
179
|
+
file: filePath,
|
|
180
|
+
symbol: oldName,
|
|
181
|
+
changeType: 'rename',
|
|
182
|
+
newValue: newName
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get a safe change order for multiple files
|
|
187
|
+
*/
|
|
188
|
+
getSafeChangeOrder(files) {
|
|
189
|
+
// Sort by dependency order - change leaf nodes first
|
|
190
|
+
const scored = files.map(file => {
|
|
191
|
+
const impact = this.dependencyTracker.analyzeImpact(file);
|
|
192
|
+
return {
|
|
193
|
+
file,
|
|
194
|
+
score: impact.transitiveDependents.length
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
const order = scored
|
|
198
|
+
.sort((a, b) => a.score - b.score)
|
|
199
|
+
.map(s => s.file);
|
|
200
|
+
return {
|
|
201
|
+
order,
|
|
202
|
+
reason: 'Files sorted by dependency impact - change files with fewer dependents first'
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check if a change is safe to make
|
|
207
|
+
*/
|
|
208
|
+
isChangeSafe(proposal) {
|
|
209
|
+
const prediction = this.predictImpact(proposal);
|
|
210
|
+
const reasons = [];
|
|
211
|
+
if (prediction.breakingChanges.length > 0) {
|
|
212
|
+
reasons.push(`${prediction.breakingChanges.length} breaking changes detected`);
|
|
213
|
+
}
|
|
214
|
+
if (prediction.riskScore > 70) {
|
|
215
|
+
reasons.push(`High risk score: ${prediction.riskScore}`);
|
|
216
|
+
}
|
|
217
|
+
if (prediction.totalFilesAffected > 20) {
|
|
218
|
+
reasons.push(`Too many files affected: ${prediction.totalFilesAffected}`);
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
safe: reasons.length === 0,
|
|
222
|
+
reasons
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
scanForSymbols(dir) {
|
|
226
|
+
try {
|
|
227
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
228
|
+
for (const entry of entries) {
|
|
229
|
+
const fullPath = path.join(dir, entry.name);
|
|
230
|
+
if (entry.isDirectory()) {
|
|
231
|
+
if (!['node_modules', '.git', 'dist', 'build', '__pycache__'].includes(entry.name)) {
|
|
232
|
+
this.scanForSymbols(fullPath);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else if (entry.isFile() && this.isSourceFile(entry.name)) {
|
|
236
|
+
this.extractSymbols(fullPath);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
// Directory might not be readable
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
extractSymbols(filePath) {
|
|
245
|
+
try {
|
|
246
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
247
|
+
const lines = content.split('\n');
|
|
248
|
+
const relativePath = path.relative(this.projectPath, filePath).replace(/\\/g, '/');
|
|
249
|
+
// Patterns for symbol extraction
|
|
250
|
+
const patterns = [
|
|
251
|
+
// Function/class definitions
|
|
252
|
+
{ regex: /(?:export\s+)?(?:async\s+)?function\s+(\w+)/g, type: 'definition' },
|
|
253
|
+
{ regex: /(?:export\s+)?class\s+(\w+)/g, type: 'definition' },
|
|
254
|
+
{ regex: /(?:export\s+)?(?:const|let|var)\s+(\w+)/g, type: 'definition' },
|
|
255
|
+
{ regex: /(?:export\s+)?interface\s+(\w+)/g, type: 'definition' },
|
|
256
|
+
{ regex: /(?:export\s+)?type\s+(\w+)/g, type: 'definition' },
|
|
257
|
+
// Python definitions
|
|
258
|
+
{ regex: /^def\s+(\w+)/gm, type: 'definition' },
|
|
259
|
+
{ regex: /^class\s+(\w+)/gm, type: 'definition' },
|
|
260
|
+
// Imports
|
|
261
|
+
{ regex: /import\s+\{([^}]+)\}/g, type: 'import' },
|
|
262
|
+
{ regex: /import\s+(\w+)\s+from/g, type: 'import' },
|
|
263
|
+
];
|
|
264
|
+
for (const { regex, type } of patterns) {
|
|
265
|
+
let match;
|
|
266
|
+
while ((match = regex.exec(content)) !== null) {
|
|
267
|
+
const symbols = match[1].split(',').map(s => s.trim());
|
|
268
|
+
const lineNumber = content.substring(0, match.index).split('\n').length;
|
|
269
|
+
for (const symbol of symbols) {
|
|
270
|
+
if (symbol && symbol.length > 1) {
|
|
271
|
+
const ref = {
|
|
272
|
+
symbol,
|
|
273
|
+
file: relativePath,
|
|
274
|
+
line: lineNumber,
|
|
275
|
+
type
|
|
276
|
+
};
|
|
277
|
+
if (!this.symbolIndex.has(symbol)) {
|
|
278
|
+
this.symbolIndex.set(symbol, []);
|
|
279
|
+
}
|
|
280
|
+
this.symbolIndex.get(symbol).push(ref);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Find usages (identifiers that aren't definitions)
|
|
286
|
+
const identifierRegex = /\b([A-Z][a-zA-Z0-9]*)\b/g;
|
|
287
|
+
let match;
|
|
288
|
+
while ((match = identifierRegex.exec(content)) !== null) {
|
|
289
|
+
const symbol = match[1];
|
|
290
|
+
const lineNumber = content.substring(0, match.index).split('\n').length;
|
|
291
|
+
// Check if this is already tracked as a definition in this file
|
|
292
|
+
const existing = this.symbolIndex.get(symbol);
|
|
293
|
+
const isDefinitionHere = existing?.some(r => r.file === relativePath && r.type === 'definition' && r.line === lineNumber);
|
|
294
|
+
if (!isDefinitionHere && existing) {
|
|
295
|
+
existing.push({
|
|
296
|
+
symbol,
|
|
297
|
+
file: relativePath,
|
|
298
|
+
line: lineNumber,
|
|
299
|
+
type: 'usage'
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
// File might not be readable
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
isSourceFile(filename) {
|
|
309
|
+
const extensions = ['.ts', '.tsx', '.js', '.jsx', '.py', '.java', '.cs'];
|
|
310
|
+
return extensions.some(ext => filename.endsWith(ext));
|
|
311
|
+
}
|
|
312
|
+
calculateRiskScore(proposal, affectedFiles, breakingChanges) {
|
|
313
|
+
let score = 0;
|
|
314
|
+
// Base score by change type
|
|
315
|
+
switch (proposal.changeType) {
|
|
316
|
+
case 'modify':
|
|
317
|
+
score += 10;
|
|
318
|
+
break;
|
|
319
|
+
case 'rename':
|
|
320
|
+
score += 30;
|
|
321
|
+
break;
|
|
322
|
+
case 'move':
|
|
323
|
+
score += 40;
|
|
324
|
+
break;
|
|
325
|
+
case 'delete':
|
|
326
|
+
score += 50;
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
// Add for affected files
|
|
330
|
+
score += Math.min(affectedFiles.length * 3, 30);
|
|
331
|
+
// Add for breaking changes
|
|
332
|
+
score += Math.min(breakingChanges.length * 5, 20);
|
|
333
|
+
// Cap at 100
|
|
334
|
+
return Math.min(score, 100);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
exports.CrossFileImpact = CrossFileImpact;
|
|
338
|
+
//# sourceMappingURL=cross-file-impact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-file-impact.js","sourceRoot":"","sources":["../src/cross-file-impact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Tracker - Understand code dependencies
|
|
3
|
+
*
|
|
4
|
+
* Analyzes imports/exports to understand what code depends on what.
|
|
5
|
+
*/
|
|
6
|
+
import { StateCLI } from './statecli';
|
|
7
|
+
export interface Dependency {
|
|
8
|
+
source: string;
|
|
9
|
+
target: string;
|
|
10
|
+
type: 'import' | 'require' | 'export' | 'extends' | 'implements';
|
|
11
|
+
line?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface FileNode {
|
|
14
|
+
path: string;
|
|
15
|
+
imports: string[];
|
|
16
|
+
exports: string[];
|
|
17
|
+
dependsOn: string[];
|
|
18
|
+
dependedBy: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface DependencyGraph {
|
|
21
|
+
files: Map<string, FileNode>;
|
|
22
|
+
edges: Dependency[];
|
|
23
|
+
}
|
|
24
|
+
export interface ImpactAnalysis {
|
|
25
|
+
changedFile: string;
|
|
26
|
+
directDependents: string[];
|
|
27
|
+
transitiveDependents: string[];
|
|
28
|
+
riskLevel: 'low' | 'medium' | 'high' | 'critical';
|
|
29
|
+
recommendation: string;
|
|
30
|
+
}
|
|
31
|
+
export declare class DependencyTracker {
|
|
32
|
+
private statecli;
|
|
33
|
+
private projectPath;
|
|
34
|
+
private graph;
|
|
35
|
+
private fileExtensions;
|
|
36
|
+
constructor(statecli: StateCLI, projectPath?: string, options?: {
|
|
37
|
+
extensions?: string[];
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* Build dependency graph for the project
|
|
41
|
+
*/
|
|
42
|
+
buildGraph(rootDir?: string): DependencyGraph;
|
|
43
|
+
/**
|
|
44
|
+
* Analyze impact of changing a file
|
|
45
|
+
*/
|
|
46
|
+
analyzeImpact(filePath: string): ImpactAnalysis;
|
|
47
|
+
/**
|
|
48
|
+
* Get what a file depends on
|
|
49
|
+
*/
|
|
50
|
+
getDependencies(filePath: string): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Get what depends on a file
|
|
53
|
+
*/
|
|
54
|
+
getDependents(filePath: string): string[];
|
|
55
|
+
/**
|
|
56
|
+
* Find circular dependencies
|
|
57
|
+
*/
|
|
58
|
+
findCircularDependencies(): string[][];
|
|
59
|
+
/**
|
|
60
|
+
* Get dependency tree as a string for display
|
|
61
|
+
*/
|
|
62
|
+
getDependencyTree(filePath: string, maxDepth?: number): string;
|
|
63
|
+
/**
|
|
64
|
+
* Get most depended-upon files (core files)
|
|
65
|
+
*/
|
|
66
|
+
getCoreFiles(limit?: number): Array<{
|
|
67
|
+
file: string;
|
|
68
|
+
dependentCount: number;
|
|
69
|
+
}>;
|
|
70
|
+
private scanDirectory;
|
|
71
|
+
private analyzeFile;
|
|
72
|
+
private buildReverseLinks;
|
|
73
|
+
private resolveImportPath;
|
|
74
|
+
private normalizePath;
|
|
75
|
+
private getDirectDependents;
|
|
76
|
+
private getTransitiveDependents;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=dependency-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-tracker.d.ts","sourceRoot":"","sources":["../src/dependency-tracker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7B,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,cAAc,CAAW;gBAG/B,QAAQ,EAAE,QAAQ,EAClB,WAAW,GAAE,MAAY,EACzB,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB;IAQH;;OAEG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;IAiB7C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;IAmD/C;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAM3C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAMzC;;OAEG;IACH,wBAAwB,IAAI,MAAM,EAAE,EAAE;IAmCtC;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM;IAyBjE;;OAEG;IACH,YAAY,CAAC,KAAK,GAAE,MAAW,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAejF,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,WAAW;IAiDnB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,uBAAuB;CAkBhC"}
|