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.
- package/README.md +122 -0
- package/dist/analyzer/functionDiff.d.ts +14 -0
- package/dist/analyzer/functionDiff.d.ts.map +1 -0
- package/dist/analyzer/functionDiff.js +173 -0
- package/dist/analyzer/functionDiff.js.map +1 -0
- package/dist/analyzer/reasonAggregator.d.ts +8 -0
- package/dist/analyzer/reasonAggregator.d.ts.map +1 -0
- package/dist/analyzer/reasonAggregator.js +269 -0
- package/dist/analyzer/reasonAggregator.js.map +1 -0
- package/dist/analyzer/ruleEngine.d.ts +5 -0
- package/dist/analyzer/ruleEngine.d.ts.map +1 -0
- package/dist/analyzer/ruleEngine.js +129 -0
- package/dist/analyzer/ruleEngine.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +124 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/default.d.ts +18 -0
- package/dist/config/default.d.ts.map +1 -0
- package/dist/config/default.js +20 -0
- package/dist/config/default.js.map +1 -0
- package/dist/config/loader.d.ts +3 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +63 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/git/diff.d.ts +10 -0
- package/dist/git/diff.d.ts.map +1 -0
- package/dist/git/diff.js +58 -0
- package/dist/git/diff.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/model/semanticChange.d.ts +12 -0
- package/dist/model/semanticChange.d.ts.map +1 -0
- package/dist/model/semanticChange.js +3 -0
- package/dist/model/semanticChange.js.map +1 -0
- package/dist/parser/tsParser.d.ts +15 -0
- package/dist/parser/tsParser.d.ts.map +1 -0
- package/dist/parser/tsParser.js +158 -0
- package/dist/parser/tsParser.js.map +1 -0
- 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"}
|