semantic-change-tracker 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.
Files changed (42) hide show
  1. package/README.md +122 -0
  2. package/dist/analyzer/functionDiff.d.ts +14 -0
  3. package/dist/analyzer/functionDiff.d.ts.map +1 -0
  4. package/dist/analyzer/functionDiff.js +173 -0
  5. package/dist/analyzer/functionDiff.js.map +1 -0
  6. package/dist/analyzer/reasonAggregator.d.ts +8 -0
  7. package/dist/analyzer/reasonAggregator.d.ts.map +1 -0
  8. package/dist/analyzer/reasonAggregator.js +269 -0
  9. package/dist/analyzer/reasonAggregator.js.map +1 -0
  10. package/dist/analyzer/ruleEngine.d.ts +5 -0
  11. package/dist/analyzer/ruleEngine.d.ts.map +1 -0
  12. package/dist/analyzer/ruleEngine.js +129 -0
  13. package/dist/analyzer/ruleEngine.js.map +1 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +124 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/config/default.d.ts +18 -0
  19. package/dist/config/default.d.ts.map +1 -0
  20. package/dist/config/default.js +20 -0
  21. package/dist/config/default.js.map +1 -0
  22. package/dist/config/loader.d.ts +3 -0
  23. package/dist/config/loader.d.ts.map +1 -0
  24. package/dist/config/loader.js +63 -0
  25. package/dist/config/loader.js.map +1 -0
  26. package/dist/git/diff.d.ts +10 -0
  27. package/dist/git/diff.d.ts.map +1 -0
  28. package/dist/git/diff.js +58 -0
  29. package/dist/git/diff.js.map +1 -0
  30. package/dist/index.d.ts +8 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +24 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/model/semanticChange.d.ts +12 -0
  35. package/dist/model/semanticChange.d.ts.map +1 -0
  36. package/dist/model/semanticChange.js +3 -0
  37. package/dist/model/semanticChange.js.map +1 -0
  38. package/dist/parser/tsParser.d.ts +15 -0
  39. package/dist/parser/tsParser.d.ts.map +1 -0
  40. package/dist/parser/tsParser.js +158 -0
  41. package/dist/parser/tsParser.js.map +1 -0
  42. package/package.json +45 -0
package/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # Semantic Change Tracker (SCT)
2
+
3
+ **Version 0.x (Experimental)**
4
+
5
+ An experimental CLI tool that analyzes Git code changes to help engineers quickly understand potential risks in TypeScript/JavaScript codebases.
6
+
7
+ ⚠️ **This is an early-stage experimental tool. Output requires human interpretation and should not replace engineering judgment.**
8
+
9
+ ## What This Tool Is
10
+
11
+ SCT reads `git diff`, parses TypeScript/JavaScript AST structures, and applies rule-based heuristics to identify:
12
+ - Changes to exported functions (potential API surface changes)
13
+ - Changes to control flow or return logic (potential behavior changes)
14
+ - Functions modified without corresponding test updates
15
+
16
+ ## What This Tool Is NOT
17
+
18
+ - **Not a linter** — Does not enforce code style or quality standards
19
+ - **Not a gatekeeper** — Should not be used to block commits or deployments
20
+ - **Not a CI blocker** — Output is advisory, not prescriptive
21
+ - **Not guaranteed correct** — Heuristic-based analysis may produce false positives or miss changes
22
+ - **Not a replacement for code review** — Human engineering judgment is required
23
+
24
+ ## Version Status
25
+
26
+ This tool is **version 0.x** and is under active development:
27
+ - APIs, output format, and behavior may change without notice
28
+ - Backward compatibility is not guaranteed
29
+ - Configuration schema may evolve
30
+
31
+ ## Installation
32
+
33
+ ```bash
34
+ npm install
35
+ npm run build
36
+ npm link # Optional: to use `sct` globally
37
+ ```
38
+
39
+ **Requirements:**
40
+ - Node.js ≥ 18
41
+ - Git repository
42
+ - TypeScript/JavaScript codebase
43
+
44
+ ## Usage
45
+
46
+ ### Initialize Configuration
47
+
48
+ ```bash
49
+ sct init
50
+ ```
51
+
52
+ This creates a basic `sct.config.json` file.
53
+
54
+ ### Analyze Changes
55
+
56
+ ```bash
57
+ sct analyze
58
+ ```
59
+
60
+ Outputs a JSON object to stdout with detected changes and estimated risk level.
61
+
62
+ ### Output Structure (Example)
63
+
64
+ ```json
65
+ {
66
+ "changeType": "ApiChange",
67
+ "behaviorChanged": true,
68
+ "riskLevel": "High",
69
+ "reasons": [
70
+ "Return behavior of HTTP methods 'get', 'post' changed",
71
+ "No test changes detected for 'get', 'post'"
72
+ ],
73
+ "touchedFunctions": ["get", "post"],
74
+ "suggestedTests": [
75
+ "No test updates detected for API surface changes ('get', 'post')"
76
+ ]
77
+ }
78
+ ```
79
+
80
+ **Fields:**
81
+ - `changeType` — Detected change category (ApiChange, BehaviorChange, Refactor)
82
+ - `behaviorChanged` — Boolean indicating potential behavior modification
83
+ - `riskLevel` — Heuristic risk assessment (Low, Medium, High)
84
+ - `reasons` — List of detected change patterns
85
+ - `touchedFunctions` — Functions modified in the diff
86
+ - `suggestedTests` — Advisory test suggestions (may be empty)
87
+
88
+ ## Configuration (Optional)
89
+
90
+ Basic `sct.config.json`:
91
+
92
+ ```json
93
+ {
94
+ "languages": ["ts", "js"],
95
+ "exclude": ["**/*.spec.ts", "**/*.test.ts"],
96
+ "domains": {
97
+ "Order": ["order", "checkout"]
98
+ }
99
+ }
100
+ ```
101
+
102
+ ## How It Works
103
+
104
+ 1. Reads `git diff HEAD` to find changed files
105
+ 2. Parses TypeScript AST for function signatures, control flow, and export status
106
+ 3. Compares before/after AST structures
107
+ 4. Applies rule-based heuristics to classify changes
108
+ 5. Aggregates similar changes and assigns risk scores
109
+
110
+ **Detection rules are deterministic and AST-based. No AI or network calls are made.**
111
+
112
+ ## Limitations
113
+
114
+ - Only supports TypeScript and JavaScript
115
+ - Only analyzes function-level changes (does not track variable usage, call graphs, etc.)
116
+ - Export detection may be incomplete for complex module patterns
117
+ - Risk scoring is heuristic-based and may not align with actual project risk
118
+ - No analysis of runtime behavior or type-checking correctness
119
+
120
+ ## License
121
+
122
+ MIT
@@ -0,0 +1,14 @@
1
+ import { FunctionInfo } from "../parser/tsParser";
2
+ import { ChangeType } from "../model/semanticChange";
3
+ export interface FunctionDiff {
4
+ functionName: string;
5
+ changeType: ChangeType;
6
+ behaviorChanged: boolean;
7
+ reasons: string[];
8
+ oldFunction?: FunctionInfo;
9
+ newFunction?: FunctionInfo;
10
+ isExported: boolean;
11
+ isNewFunction: boolean;
12
+ }
13
+ export declare function compareFunctions(oldFunctions: FunctionInfo[], newFunctions: FunctionInfo[], filePath?: string): FunctionDiff[];
14
+ //# sourceMappingURL=functionDiff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functionDiff.d.ts","sourceRoot":"","sources":["../../src/analyzer/functionDiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,YAAY,EAAE,EAC5B,YAAY,EAAE,YAAY,EAAE,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB,YAAY,EAAE,CA8ChB"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compareFunctions = compareFunctions;
4
+ function compareFunctions(oldFunctions, newFunctions, filePath) {
5
+ const diffs = [];
6
+ const oldFuncMap = new Map(oldFunctions.map((f) => [f.name, f]));
7
+ const newFuncMap = new Map(newFunctions.map((f) => [f.name, f]));
8
+ for (const [name, newFunc] of newFuncMap) {
9
+ const oldFunc = oldFuncMap.get(name);
10
+ if (!oldFunc) {
11
+ const { changeType, reasons } = classifyNewFunction(newFunc, filePath);
12
+ diffs.push({
13
+ functionName: name,
14
+ changeType,
15
+ behaviorChanged: true,
16
+ reasons,
17
+ newFunction: newFunc,
18
+ isExported: newFunc.isExported,
19
+ isNewFunction: true,
20
+ });
21
+ continue;
22
+ }
23
+ const diff = detectChanges(oldFunc, newFunc);
24
+ if (diff.reasons.length > 0) {
25
+ diffs.push(diff);
26
+ }
27
+ }
28
+ for (const [name, oldFunc] of oldFuncMap) {
29
+ if (!newFuncMap.has(name)) {
30
+ const { changeType, reasons } = classifyRemovedFunction(oldFunc, filePath);
31
+ diffs.push({
32
+ functionName: name,
33
+ changeType,
34
+ behaviorChanged: true,
35
+ reasons,
36
+ oldFunction: oldFunc,
37
+ isExported: oldFunc.isExported,
38
+ isNewFunction: false,
39
+ });
40
+ }
41
+ }
42
+ return diffs;
43
+ }
44
+ function classifyNewFunction(func, filePath) {
45
+ const reasons = [];
46
+ let changeType = "BehaviorChange";
47
+ if (func.isExported) {
48
+ changeType = "ApiChange";
49
+ if (func.isMethodDeclaration) {
50
+ reasons.push(`New ${func.visibility} method '${func.name}' detected`);
51
+ }
52
+ else {
53
+ reasons.push(`New exported function '${func.name}' detected`);
54
+ }
55
+ }
56
+ else {
57
+ if (func.isMethodDeclaration && func.visibility === "private") {
58
+ reasons.push(`New private method '${func.name}' added to class`);
59
+ }
60
+ else if (func.isMethodDeclaration && func.visibility === "protected") {
61
+ reasons.push(`New protected method '${func.name}' added to class`);
62
+ }
63
+ else {
64
+ reasons.push(`New internal function '${func.name}' added`);
65
+ }
66
+ if (filePath && isLikelyApiPath(filePath)) {
67
+ reasons.push(`Function '${func.name}' location suggests API usage (file path contains 'api' or 'controller')`);
68
+ changeType = "BehaviorChange";
69
+ }
70
+ }
71
+ if (func.hasConditionals) {
72
+ reasons.push(`Function '${func.name}' introduces new conditional logic`);
73
+ }
74
+ return { changeType, reasons };
75
+ }
76
+ function classifyRemovedFunction(func, filePath) {
77
+ const reasons = [];
78
+ let changeType = "BehaviorChange";
79
+ if (func.isExported) {
80
+ changeType = "ApiChange";
81
+ if (func.isMethodDeclaration) {
82
+ reasons.push(`Exported ${func.visibility} method '${func.name}' removed from module`);
83
+ }
84
+ else {
85
+ reasons.push(`Exported function '${func.name}' removed from module`);
86
+ }
87
+ }
88
+ else {
89
+ if (func.isMethodDeclaration && func.visibility === "private") {
90
+ reasons.push(`Private method '${func.name}' removed from class`);
91
+ }
92
+ else if (func.isMethodDeclaration && func.visibility === "protected") {
93
+ reasons.push(`Protected method '${func.name}' removed from class`);
94
+ }
95
+ else {
96
+ reasons.push(`Internal function '${func.name}' removed`);
97
+ }
98
+ }
99
+ return { changeType, reasons };
100
+ }
101
+ function isLikelyApiPath(filePath) {
102
+ const lowerPath = filePath.toLowerCase();
103
+ return lowerPath.includes('/api/') ||
104
+ lowerPath.includes('/controller') ||
105
+ lowerPath.includes('\\api\\') ||
106
+ lowerPath.includes('\\controller');
107
+ }
108
+ function detectChanges(oldFunc, newFunc) {
109
+ const reasons = [];
110
+ let changeType = "Refactor";
111
+ let behaviorChanged = false;
112
+ const isExported = newFunc.isExported || oldFunc.isExported;
113
+ if (oldFunc.parameters.length !== newFunc.parameters.length ||
114
+ oldFunc.parameters.some((p, i) => p !== newFunc.parameters[i])) {
115
+ const oldParams = oldFunc.parameters.join(", ");
116
+ const newParams = newFunc.parameters.join(", ");
117
+ reasons.push(`Function '${newFunc.name}' signature changed from (${oldParams}) to (${newParams})`);
118
+ changeType = isExported ? "ApiChange" : "BehaviorChange";
119
+ behaviorChanged = true;
120
+ }
121
+ if (oldFunc.returnType !== newFunc.returnType) {
122
+ reasons.push(`Function '${newFunc.name}' return type changed from '${oldFunc.returnType}' to '${newFunc.returnType}'`);
123
+ changeType = isExported ? "ApiChange" : "BehaviorChange";
124
+ behaviorChanged = true;
125
+ }
126
+ if (!oldFunc.isAsync && newFunc.isAsync) {
127
+ reasons.push(`Function '${newFunc.name}' became async`);
128
+ changeType = "BehaviorChange";
129
+ behaviorChanged = true;
130
+ }
131
+ else if (oldFunc.isAsync && !newFunc.isAsync) {
132
+ reasons.push(`Function '${newFunc.name}' is no longer async`);
133
+ changeType = "BehaviorChange";
134
+ behaviorChanged = true;
135
+ }
136
+ if (!oldFunc.hasConditionals && newFunc.hasConditionals) {
137
+ reasons.push(`Function '${newFunc.name}' introduces new conditional logic`);
138
+ changeType = "BehaviorChange";
139
+ behaviorChanged = true;
140
+ }
141
+ if (oldFunc.hasConditionals && !newFunc.hasConditionals) {
142
+ reasons.push(`Function '${newFunc.name}' removed conditional logic`);
143
+ changeType = "BehaviorChange";
144
+ behaviorChanged = true;
145
+ }
146
+ if (!oldFunc.hasEarlyReturn && newFunc.hasEarlyReturn) {
147
+ reasons.push(`Function '${newFunc.name}' added early return path`);
148
+ changeType = "BehaviorChange";
149
+ behaviorChanged = true;
150
+ }
151
+ if (oldFunc.returnExpressions.length !== newFunc.returnExpressions.length ||
152
+ oldFunc.returnExpressions.some((expr, i) => expr !== newFunc.returnExpressions[i])) {
153
+ reasons.push(`Function '${newFunc.name}' return logic modified`);
154
+ changeType = "BehaviorChange";
155
+ behaviorChanged = true;
156
+ }
157
+ if (oldFunc.bodyHash !== newFunc.bodyHash && reasons.length === 0) {
158
+ reasons.push(`Function '${newFunc.name}' body refactored without detected behavior change`);
159
+ changeType = "Refactor";
160
+ behaviorChanged = false;
161
+ }
162
+ return {
163
+ functionName: newFunc.name,
164
+ changeType,
165
+ behaviorChanged,
166
+ reasons,
167
+ oldFunction: oldFunc,
168
+ newFunction: newFunc,
169
+ isExported,
170
+ isNewFunction: false,
171
+ };
172
+ }
173
+ //# sourceMappingURL=functionDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functionDiff.js","sourceRoot":"","sources":["../../src/analyzer/functionDiff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { FunctionDiff } from "./functionDiff";
2
+ export interface AggregatedReason {
3
+ priority: number;
4
+ reason: string;
5
+ affectedFunctions: string[];
6
+ }
7
+ export declare function aggregateReasons(diffs: FunctionDiff[]): AggregatedReason[];
8
+ //# sourceMappingURL=reasonAggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasonAggregator.d.ts","sourceRoot":"","sources":["../../src/analyzer/reasonAggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAQD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,gBAAgB,EAAE,CA0D1E"}
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.aggregateReasons = aggregateReasons;
4
+ function aggregateReasons(diffs) {
5
+ const patterns = [];
6
+ const aggregated = [];
7
+ // Group changes by pattern
8
+ const returnTypeChanges = findReturnTypeChanges(diffs);
9
+ const returnLogicChanges = findReturnLogicChanges(diffs);
10
+ const newExportedFunctions = findNewExportedFunctions(diffs);
11
+ const removedExportedFunctions = findRemovedExportedFunctions(diffs);
12
+ const signatureChanges = findSignatureChanges(diffs);
13
+ const asyncChanges = findAsyncChanges(diffs);
14
+ const controlFlowChanges = findControlFlowChanges(diffs);
15
+ const newInternalHelpers = findNewInternalHelpers(diffs);
16
+ const refactorOnlyChanges = findRefactorOnlyChanges(diffs);
17
+ // Priority 1: API Surface Changes (highest)
18
+ if (removedExportedFunctions.length > 0) {
19
+ aggregated.push(createApiRemovalReason(removedExportedFunctions));
20
+ }
21
+ if (newExportedFunctions.length > 0) {
22
+ aggregated.push(createApiAdditionReason(newExportedFunctions));
23
+ }
24
+ if (signatureChanges.length > 0) {
25
+ aggregated.push(createSignatureChangeReason(signatureChanges));
26
+ }
27
+ // Priority 2: Behavioral Changes
28
+ if (asyncChanges.length > 0) {
29
+ aggregated.push(createAsyncChangeReason(asyncChanges));
30
+ }
31
+ if (returnTypeChanges.length > 0 && returnLogicChanges.length > 0) {
32
+ // Aggregate return type + logic changes together
33
+ const combined = combineReturnChanges(returnTypeChanges, returnLogicChanges);
34
+ aggregated.push(createReturnBehaviorReason(combined));
35
+ }
36
+ else if (returnTypeChanges.length > 0) {
37
+ aggregated.push(createReturnTypeReason(returnTypeChanges));
38
+ }
39
+ else if (returnLogicChanges.length > 0) {
40
+ aggregated.push(createReturnLogicReason(returnLogicChanges));
41
+ }
42
+ if (controlFlowChanges.length > 0) {
43
+ aggregated.push(createControlFlowReason(controlFlowChanges));
44
+ }
45
+ // Priority 3: Structural / Internal Changes (lowest)
46
+ if (newInternalHelpers.length > 0) {
47
+ aggregated.push(createInternalHelpersReason(newInternalHelpers));
48
+ }
49
+ if (refactorOnlyChanges.length > 0 && aggregated.length === 0) {
50
+ // Only mention refactors if nothing else was detected
51
+ aggregated.push(createRefactorReason(refactorOnlyChanges));
52
+ }
53
+ return aggregated;
54
+ }
55
+ // Pattern detection functions
56
+ function findReturnTypeChanges(diffs) {
57
+ return diffs.filter(d => d.reasons.some(r => r.includes("return type changed")));
58
+ }
59
+ function findReturnLogicChanges(diffs) {
60
+ return diffs.filter(d => d.reasons.some(r => r.includes("return logic modified")));
61
+ }
62
+ function findNewExportedFunctions(diffs) {
63
+ return diffs.filter(d => d.isNewFunction && d.isExported);
64
+ }
65
+ function findRemovedExportedFunctions(diffs) {
66
+ return diffs.filter(d => !d.isNewFunction && d.isExported && d.reasons.some(r => r.includes("removed")));
67
+ }
68
+ function findSignatureChanges(diffs) {
69
+ return diffs.filter(d => d.isExported && d.reasons.some(r => r.includes("signature changed")));
70
+ }
71
+ function findAsyncChanges(diffs) {
72
+ return diffs.filter(d => d.reasons.some(r => r.includes("async") || r.includes("no longer async")));
73
+ }
74
+ function findControlFlowChanges(diffs) {
75
+ return diffs.filter(d => d.reasons.some(r => r.includes("conditional logic") ||
76
+ r.includes("early return")));
77
+ }
78
+ function findNewInternalHelpers(diffs) {
79
+ return diffs.filter(d => d.isNewFunction &&
80
+ !d.isExported &&
81
+ (d.functionName.includes("helper") ||
82
+ d.functionName.includes("util") ||
83
+ d.functionName.includes("format") ||
84
+ d.functionName.startsWith("_")));
85
+ }
86
+ function findRefactorOnlyChanges(diffs) {
87
+ return diffs.filter(d => d.changeType === "Refactor" &&
88
+ d.reasons.some(r => r.includes("refactored without detected behavior change")));
89
+ }
90
+ function combineReturnChanges(typeChanges, logicChanges) {
91
+ const combined = new Map();
92
+ typeChanges.forEach(d => combined.set(d.functionName, d));
93
+ logicChanges.forEach(d => {
94
+ if (!combined.has(d.functionName)) {
95
+ combined.set(d.functionName, d);
96
+ }
97
+ });
98
+ return Array.from(combined.values());
99
+ }
100
+ // Reason creation functions
101
+ function createApiRemovalReason(diffs) {
102
+ const names = diffs.map(d => `'${d.functionName}'`);
103
+ if (names.length === 1) {
104
+ return {
105
+ priority: 1,
106
+ reason: `Exported function ${names[0]} was removed`,
107
+ affectedFunctions: diffs.map(d => d.functionName),
108
+ };
109
+ }
110
+ return {
111
+ priority: 1,
112
+ reason: `Exported functions ${names.slice(0, 3).join(", ")}${names.length > 3 ? ` and ${names.length - 3} more` : ""} were removed`,
113
+ affectedFunctions: diffs.map(d => d.functionName),
114
+ };
115
+ }
116
+ function createApiAdditionReason(diffs) {
117
+ const names = diffs.map(d => `'${d.functionName}'`);
118
+ if (names.length === 1) {
119
+ return {
120
+ priority: 1,
121
+ reason: `New exported function ${names[0]} detected`,
122
+ affectedFunctions: diffs.map(d => d.functionName),
123
+ };
124
+ }
125
+ return {
126
+ priority: 1,
127
+ reason: `New exported functions ${names.slice(0, 3).join(", ")}${names.length > 3 ? ` and ${names.length - 3} more` : ""} detected`,
128
+ affectedFunctions: diffs.map(d => d.functionName),
129
+ };
130
+ }
131
+ function createSignatureChangeReason(diffs) {
132
+ const names = diffs.map(d => `'${d.functionName}'`);
133
+ if (names.length === 1) {
134
+ return {
135
+ priority: 1,
136
+ reason: `Function signature of ${names[0]} changed`,
137
+ affectedFunctions: diffs.map(d => d.functionName),
138
+ };
139
+ }
140
+ return {
141
+ priority: 1,
142
+ reason: `Function signatures changed in ${names.slice(0, 3).join(", ")}${names.length > 3 ? ` and ${names.length - 3} more` : ""}`,
143
+ affectedFunctions: diffs.map(d => d.functionName),
144
+ };
145
+ }
146
+ function createAsyncChangeReason(diffs) {
147
+ const names = diffs.map(d => `'${d.functionName}'`);
148
+ if (names.length === 1) {
149
+ return {
150
+ priority: 2,
151
+ reason: `Function ${names[0]} execution model changed (async behavior)`,
152
+ affectedFunctions: diffs.map(d => d.functionName),
153
+ };
154
+ }
155
+ return {
156
+ priority: 2,
157
+ reason: `Execution model changed in ${names.slice(0, 3).join(", ")}${names.length > 3 ? ` and ${names.length - 3} more` : ""} (async behavior)`,
158
+ affectedFunctions: diffs.map(d => d.functionName),
159
+ };
160
+ }
161
+ function createReturnBehaviorReason(diffs) {
162
+ const names = diffs.map(d => `'${d.functionName}'`);
163
+ // Check if these are HTTP methods
164
+ const httpMethods = ["get", "post", "put", "delete", "patch", "head", "options"];
165
+ const allHttpMethods = diffs.every(d => httpMethods.some(method => d.functionName.toLowerCase().includes(method)));
166
+ if (allHttpMethods && diffs.length > 1) {
167
+ return {
168
+ priority: 2,
169
+ reason: `Return behavior of HTTP methods ${names.slice(0, 3).join(", ")}${names.length > 3 ? ` and ${names.length - 3} more` : ""} changed`,
170
+ affectedFunctions: diffs.map(d => d.functionName),
171
+ };
172
+ }
173
+ if (names.length === 1) {
174
+ return {
175
+ priority: 2,
176
+ reason: `Return behavior of ${names[0]} changed`,
177
+ affectedFunctions: diffs.map(d => d.functionName),
178
+ };
179
+ }
180
+ return {
181
+ priority: 2,
182
+ reason: `Return behavior changed in ${names.slice(0, 3).join(", ")}${names.length > 3 ? ` and ${names.length - 3} more` : ""}`,
183
+ affectedFunctions: diffs.map(d => d.functionName),
184
+ };
185
+ }
186
+ function createReturnTypeReason(diffs) {
187
+ const names = diffs.map(d => `'${d.functionName}'`);
188
+ if (names.length === 1) {
189
+ return {
190
+ priority: 2,
191
+ reason: `Return type of ${names[0]} changed`,
192
+ affectedFunctions: diffs.map(d => d.functionName),
193
+ };
194
+ }
195
+ return {
196
+ priority: 2,
197
+ reason: `Return types changed in ${names.slice(0, 3).join(", ")}${names.length > 3 ? ` and ${names.length - 3} more` : ""}`,
198
+ affectedFunctions: diffs.map(d => d.functionName),
199
+ };
200
+ }
201
+ function createReturnLogicReason(diffs) {
202
+ const names = diffs.map(d => `'${d.functionName}'`);
203
+ if (names.length === 1) {
204
+ return {
205
+ priority: 2,
206
+ reason: `Return logic of ${names[0]} modified`,
207
+ affectedFunctions: diffs.map(d => d.functionName),
208
+ };
209
+ }
210
+ return {
211
+ priority: 2,
212
+ reason: `Return logic modified in ${names.slice(0, 3).join(", ")}${names.length > 3 ? ` and ${names.length - 3} more` : ""}`,
213
+ affectedFunctions: diffs.map(d => d.functionName),
214
+ };
215
+ }
216
+ function createControlFlowReason(diffs) {
217
+ const names = diffs.map(d => `'${d.functionName}'`);
218
+ if (names.length === 1) {
219
+ return {
220
+ priority: 2,
221
+ reason: `Control flow changed in ${names[0]}`,
222
+ affectedFunctions: diffs.map(d => d.functionName),
223
+ };
224
+ }
225
+ return {
226
+ priority: 2,
227
+ reason: `Control flow changes detected in ${names.slice(0, 3).join(", ")}${names.length > 3 ? ` and ${names.length - 3} more` : ""}`,
228
+ affectedFunctions: diffs.map(d => d.functionName),
229
+ };
230
+ }
231
+ function createInternalHelpersReason(diffs) {
232
+ const count = diffs.length;
233
+ const names = diffs.map(d => `'${d.functionName}'`).slice(0, 2);
234
+ if (count === 1) {
235
+ return {
236
+ priority: 3,
237
+ reason: `New internal helper ${names[0]} added`,
238
+ affectedFunctions: diffs.map(d => d.functionName),
239
+ };
240
+ }
241
+ if (count === 2) {
242
+ return {
243
+ priority: 3,
244
+ reason: `New internal helpers ${names.join(" and ")} added`,
245
+ affectedFunctions: diffs.map(d => d.functionName),
246
+ };
247
+ }
248
+ return {
249
+ priority: 3,
250
+ reason: `Multiple internal helper functions added (${count} total)`,
251
+ affectedFunctions: diffs.map(d => d.functionName),
252
+ };
253
+ }
254
+ function createRefactorReason(diffs) {
255
+ const names = diffs.map(d => `'${d.functionName}'`);
256
+ if (names.length === 1) {
257
+ return {
258
+ priority: 3,
259
+ reason: `Function ${names[0]} refactored without detected behavior change`,
260
+ affectedFunctions: diffs.map(d => d.functionName),
261
+ };
262
+ }
263
+ return {
264
+ priority: 3,
265
+ reason: `${names.length} functions refactored without detected behavior changes`,
266
+ affectedFunctions: diffs.map(d => d.functionName),
267
+ };
268
+ }
269
+ //# sourceMappingURL=reasonAggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasonAggregator.js","sourceRoot":"","sources":["../../src/analyzer/reasonAggregator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { FunctionDiff } from "./functionDiff";
2
+ import { SemanticChange } from "../model/semanticChange";
3
+ import { SctConfig } from "../config/default";
4
+ export declare function analyzeChanges(diffs: FunctionDiff[], config: SctConfig, changedFiles: string[], testFilesChanged: boolean): SemanticChange;
5
+ //# sourceMappingURL=ruleEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleEngine.d.ts","sourceRoot":"","sources":["../../src/analyzer/ruleEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAc,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,wBAAgB,cAAc,CAC5B,KAAK,EAAE,YAAY,EAAE,EACrB,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,gBAAgB,EAAE,OAAO,GACxB,cAAc,CA8BhB"}