@amrishkhan05/frankly 0.1.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 (123) hide show
  1. package/.claude-plugin/marketplace.json +27 -0
  2. package/.claude-plugin/plugin.json +11 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
  4. package/.github/ISSUE_TEMPLATE/documentation.md +15 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
  6. package/.github/PULL_REQUEST_TEMPLATE.md +20 -0
  7. package/.github/copilot-instructions.md +12 -0
  8. package/.github/plugin/marketplace.json +20 -0
  9. package/.github/plugin/plugin.json +16 -0
  10. package/.mcp.json +10 -0
  11. package/LICENSE +21 -0
  12. package/README.md +394 -0
  13. package/commands/frankly-help.toml +2 -0
  14. package/commands/frankly-plan.toml +2 -0
  15. package/commands/frankly-review.toml +2 -0
  16. package/commands/frankly-verify.toml +2 -0
  17. package/commands/frankly.toml +2 -0
  18. package/dist/analysis/change-classifier.d.ts +65 -0
  19. package/dist/analysis/change-classifier.d.ts.map +1 -0
  20. package/dist/analysis/change-classifier.js +241 -0
  21. package/dist/analysis/change-classifier.js.map +1 -0
  22. package/dist/analysis/repository-intelligence.d.ts +15 -0
  23. package/dist/analysis/repository-intelligence.d.ts.map +1 -0
  24. package/dist/analysis/repository-intelligence.js +179 -0
  25. package/dist/analysis/repository-intelligence.js.map +1 -0
  26. package/dist/core/config.d.ts +393 -0
  27. package/dist/core/config.d.ts.map +1 -0
  28. package/dist/core/config.js +130 -0
  29. package/dist/core/config.js.map +1 -0
  30. package/dist/core/engine.d.ts +20 -0
  31. package/dist/core/engine.d.ts.map +1 -0
  32. package/dist/core/engine.js +117 -0
  33. package/dist/core/engine.js.map +1 -0
  34. package/dist/core/errors.d.ts +27 -0
  35. package/dist/core/errors.d.ts.map +1 -0
  36. package/dist/core/errors.js +48 -0
  37. package/dist/core/errors.js.map +1 -0
  38. package/dist/core/index.d.ts +8 -0
  39. package/dist/core/index.d.ts.map +1 -0
  40. package/dist/core/index.js +8 -0
  41. package/dist/core/index.js.map +1 -0
  42. package/dist/core/models.d.ts +155 -0
  43. package/dist/core/models.d.ts.map +1 -0
  44. package/dist/core/models.js +6 -0
  45. package/dist/core/models.js.map +1 -0
  46. package/dist/git/index.d.ts +7 -0
  47. package/dist/git/index.d.ts.map +1 -0
  48. package/dist/git/index.js +6 -0
  49. package/dist/git/index.js.map +1 -0
  50. package/dist/git/repository.d.ts +44 -0
  51. package/dist/git/repository.d.ts.map +1 -0
  52. package/dist/git/repository.js +198 -0
  53. package/dist/git/repository.js.map +1 -0
  54. package/dist/graph/symbols.d.ts +45 -0
  55. package/dist/graph/symbols.d.ts.map +1 -0
  56. package/dist/graph/symbols.js +204 -0
  57. package/dist/graph/symbols.js.map +1 -0
  58. package/dist/integrations/claude/checkpoint.d.ts +2 -0
  59. package/dist/integrations/claude/checkpoint.d.ts.map +1 -0
  60. package/dist/integrations/claude/checkpoint.js +33 -0
  61. package/dist/integrations/claude/checkpoint.js.map +1 -0
  62. package/dist/integrations/cli/demo.d.ts +3 -0
  63. package/dist/integrations/cli/demo.d.ts.map +1 -0
  64. package/dist/integrations/cli/demo.js +31 -0
  65. package/dist/integrations/cli/demo.js.map +1 -0
  66. package/dist/integrations/cli/index.d.ts +7 -0
  67. package/dist/integrations/cli/index.d.ts.map +1 -0
  68. package/dist/integrations/cli/index.js +181 -0
  69. package/dist/integrations/cli/index.js.map +1 -0
  70. package/dist/integrations/mcp/index.d.ts +3 -0
  71. package/dist/integrations/mcp/index.d.ts.map +1 -0
  72. package/dist/integrations/mcp/index.js +7 -0
  73. package/dist/integrations/mcp/index.js.map +1 -0
  74. package/dist/integrations/mcp/server.d.ts +14 -0
  75. package/dist/integrations/mcp/server.d.ts.map +1 -0
  76. package/dist/integrations/mcp/server.js +232 -0
  77. package/dist/integrations/mcp/server.js.map +1 -0
  78. package/dist/project/detector.d.ts +70 -0
  79. package/dist/project/detector.d.ts.map +1 -0
  80. package/dist/project/detector.js +214 -0
  81. package/dist/project/detector.js.map +1 -0
  82. package/dist/report/json.d.ts +26 -0
  83. package/dist/report/json.d.ts.map +1 -0
  84. package/dist/report/json.js +148 -0
  85. package/dist/report/json.js.map +1 -0
  86. package/dist/review/red-ink-review.d.ts +26 -0
  87. package/dist/review/red-ink-review.d.ts.map +1 -0
  88. package/dist/review/red-ink-review.js +103 -0
  89. package/dist/review/red-ink-review.js.map +1 -0
  90. package/fixtures/retry-429/README.md +8 -0
  91. package/fixtures/retry-429/baseline/package.json +4 -0
  92. package/fixtures/retry-429/baseline/src/client.test.ts +8 -0
  93. package/fixtures/retry-429/baseline/src/client.ts +3 -0
  94. package/fixtures/retry-429/baseline/src/retry-policy.ts +1 -0
  95. package/fixtures/retry-429/baseline/tsconfig.json +7 -0
  96. package/fixtures/retry-429/candidate/src/client.ts +5 -0
  97. package/fixtures/retry-429/candidate/src/retry-strategy.ts +9 -0
  98. package/fixtures/retry-429/candidate/src/unrelated-format.ts +1 -0
  99. package/hooks/copilot-activate.js +9 -0
  100. package/hooks/copilot-hooks.json +13 -0
  101. package/hooks/hooks.json +13 -0
  102. package/package.json +70 -0
  103. package/scripts/run.cjs +32 -0
  104. package/skills/frankly/SKILL.md +12 -0
  105. package/src/analysis/change-classifier.ts +285 -0
  106. package/src/analysis/repository-intelligence.ts +236 -0
  107. package/src/core/config.ts +149 -0
  108. package/src/core/engine.ts +143 -0
  109. package/src/core/errors.ts +56 -0
  110. package/src/core/index.ts +8 -0
  111. package/src/core/models.ts +280 -0
  112. package/src/git/index.ts +7 -0
  113. package/src/git/repository.ts +207 -0
  114. package/src/graph/symbols.ts +254 -0
  115. package/src/integrations/claude/checkpoint.ts +40 -0
  116. package/src/integrations/cli/demo.ts +34 -0
  117. package/src/integrations/cli/index.ts +211 -0
  118. package/src/integrations/mcp/index.ts +7 -0
  119. package/src/integrations/mcp/server.ts +257 -0
  120. package/src/project/detector.ts +242 -0
  121. package/src/report/json.ts +175 -0
  122. package/src/review/red-ink-review.ts +125 -0
  123. package/src/tests/phase1.test.ts +57 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Change analysis and classification
3
+ * Determines necessity and classification of changed symbols
4
+ */
5
+ import type { ChangedFile, ChangedSymbol, ChangeClassification, Evidence } from "../core/models.js";
6
+ import { type FileDiff } from "../git/repository.js";
7
+ import type { ExtractedSymbol } from "../graph/symbols.js";
8
+ export interface ChangeAnalysisInput {
9
+ task: string;
10
+ files: FileDiff[];
11
+ symbols: Map<string, ExtractedSymbol[]>;
12
+ }
13
+ export interface ClassifiedChange {
14
+ symbol: ChangedSymbol | ChangedFile;
15
+ classification: ChangeClassification;
16
+ confidence: "high" | "medium" | "low";
17
+ justification: string;
18
+ evidence: Evidence[];
19
+ }
20
+ export declare class ChangeAnalyzer {
21
+ /**
22
+ * Classify all changes
23
+ */
24
+ classifyChanges(input: ChangeAnalysisInput): ClassifiedChange[];
25
+ /**
26
+ * Extract keywords from task description
27
+ */
28
+ extractTaskKeywords(task: string): string[];
29
+ /**
30
+ * Normalize a task into a compact intent string.
31
+ */
32
+ normalizeTaskIntent(task: string): string;
33
+ /**
34
+ * Check if word is a common English word
35
+ */
36
+ private isCommonWord;
37
+ /**
38
+ * Classify a file change
39
+ */
40
+ private classifyFile;
41
+ private toChangedSymbol;
42
+ /**
43
+ * Calculate how much a file path matches task keywords
44
+ */
45
+ private calculatePathMatchScore;
46
+ /**
47
+ * Check if file is a test file
48
+ */
49
+ private isTestFile;
50
+ /**
51
+ * Check if file is a config file
52
+ */
53
+ private isConfigFile;
54
+ private isGeneratedFile;
55
+ /**
56
+ * Detect scope drift percentage
57
+ */
58
+ detectScopeDrift(classifications: ClassifiedChange[], totalChanges: number): number;
59
+ /**
60
+ * Detect refactor contamination
61
+ */
62
+ detectRefactorContamination(classifications: ClassifiedChange[]): string[];
63
+ }
64
+ export declare function createChangeAnalyzer(): ChangeAnalyzer;
65
+ //# sourceMappingURL=change-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-classifier.d.ts","sourceRoot":"","sources":["../../src/analysis/change-classifier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACR,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,aAAa,GAAG,WAAW,CAAC;IACpC,cAAc,EAAE,oBAAoB,CAAC;IACrC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,qBAAa,cAAc;IACvB;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,gBAAgB,EAAE;IAgC/D;;OAEG;IACI,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAQlD;;OAEG;IACI,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKhD;;OAEG;IACH,OAAO,CAAC,YAAY;IA6BpB;;OAEG;IACH,OAAO,CAAC,YAAY;IA+EpB,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,gBAAgB,CACZ,eAAe,EAAE,gBAAgB,EAAE,EACnC,YAAY,EAAE,MAAM,GACrB,MAAM;IAKT;;OAEG;IACH,2BAA2B,CAAC,eAAe,EAAE,gBAAgB,EAAE,GAAG,MAAM,EAAE;CAK7E;AAMD,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Change analysis and classification
3
+ * Determines necessity and classification of changed symbols
4
+ */
5
+ import { countDiffLines } from "../git/repository.js";
6
+ export class ChangeAnalyzer {
7
+ /**
8
+ * Classify all changes
9
+ */
10
+ classifyChanges(input) {
11
+ const taskKeywords = this.extractTaskKeywords(input.task);
12
+ const classifications = [];
13
+ // Classify files
14
+ for (const file of input.files) {
15
+ const classification = this.classifyFile(file, taskKeywords);
16
+ classifications.push(classification);
17
+ for (const symbol of (input.symbols.get(file.path) || []).filter((item) => file.status === "added" || file.hunks.some((hunk) => rangesOverlap(item.lineRange, [hunk.newStart, hunk.newStart + Math.max(0, hunk.newLines - 1)])))) {
18
+ const changed = this.toChangedSymbol(file, symbol);
19
+ const matched = taskKeywords.some((keyword) => changed.name.toLowerCase().includes(keyword));
20
+ classifications.push({
21
+ symbol: changed,
22
+ classification: this.isTestFile(file.path) ? "TEST" : matched ? "REQUIRED" : "SUPPORTING",
23
+ confidence: matched ? "high" : "medium",
24
+ justification: matched ? "Changed symbol matches task intent" : "Symbol is inside a changed hunk",
25
+ evidence: [{
26
+ type: matched ? "TASK_MATCH" : "DIFF_DEPENDENT",
27
+ confidence: matched ? "high" : "medium",
28
+ explanation: matched ? `Symbol ${changed.name} matches task keywords` : `Symbol ${changed.name} overlaps a changed hunk`,
29
+ reference: changed.id,
30
+ }],
31
+ });
32
+ }
33
+ }
34
+ return classifications;
35
+ }
36
+ /**
37
+ * Extract keywords from task description
38
+ */
39
+ extractTaskKeywords(task) {
40
+ return task
41
+ .toLowerCase()
42
+ .replace(/[^a-z0-9\s]/g, " ")
43
+ .split(/\s+/)
44
+ .filter((word) => word.length > 2 && !this.isCommonWord(word));
45
+ }
46
+ /**
47
+ * Normalize a task into a compact intent string.
48
+ */
49
+ normalizeTaskIntent(task) {
50
+ const keywords = this.extractTaskKeywords(task);
51
+ return keywords.join(" ") || task.trim();
52
+ }
53
+ /**
54
+ * Check if word is a common English word
55
+ */
56
+ isCommonWord(word) {
57
+ const common = new Set([
58
+ "the",
59
+ "and",
60
+ "for",
61
+ "with",
62
+ "that",
63
+ "this",
64
+ "from",
65
+ "have",
66
+ "will",
67
+ "when",
68
+ "can",
69
+ "are",
70
+ "all",
71
+ "each",
72
+ "where",
73
+ "should",
74
+ "add",
75
+ "fix",
76
+ "update",
77
+ "change",
78
+ "modify",
79
+ "remove",
80
+ "create",
81
+ ]);
82
+ return common.has(word);
83
+ }
84
+ /**
85
+ * Classify a file change
86
+ */
87
+ classifyFile(file, taskKeywords) {
88
+ const evidence = [];
89
+ // Check if file matches task keywords
90
+ const pathMatch = this.calculatePathMatchScore(`${file.path}\n${file.hunks.map((hunk) => hunk.content).join("\n")}`, taskKeywords);
91
+ if (pathMatch > 0) {
92
+ evidence.push({
93
+ type: "TASK_MATCH",
94
+ confidence: "high",
95
+ explanation: `File path matches task keywords: ${file.path}`,
96
+ });
97
+ }
98
+ // Calculate additions/deletions/changes
99
+ const { additions, deletions } = countDiffLines(file);
100
+ const changes = file.hunks.length;
101
+ let classification = "UNEXPLAINED";
102
+ let confidence = "low";
103
+ let justification = "File change appears unrelated to task";
104
+ if (this.isGeneratedFile(file.path)) {
105
+ classification = "GENERATED";
106
+ confidence = "high";
107
+ justification = "Generated artifact changed with the patch";
108
+ }
109
+ else if (file.status === "deleted") {
110
+ classification = "UNEXPLAINED";
111
+ confidence = "high";
112
+ justification = "Deleted file - requires explanation";
113
+ }
114
+ else if (file.status === "added") {
115
+ if (pathMatch > 0) {
116
+ classification = "SUPPORTING";
117
+ confidence = "high";
118
+ justification = "New file related to task";
119
+ }
120
+ else {
121
+ classification = "SUSPICIOUS";
122
+ confidence = "medium";
123
+ justification = "New file with unclear relationship to task";
124
+ }
125
+ }
126
+ else if (file.status === "modified") {
127
+ if (pathMatch > 0) {
128
+ classification = "REQUIRED";
129
+ confidence = "high";
130
+ justification = "File directly related to task";
131
+ }
132
+ else if (this.isTestFile(file.path)) {
133
+ classification = "TEST";
134
+ confidence = "medium";
135
+ justification = "Test file modification";
136
+ }
137
+ else if (this.isConfigFile(file.path)) {
138
+ classification = "SUPPORTING";
139
+ confidence = "medium";
140
+ justification = "Configuration file change";
141
+ }
142
+ else {
143
+ classification = "SUSPICIOUS";
144
+ confidence = "low";
145
+ justification = "File change weakly related to task";
146
+ }
147
+ }
148
+ else if (file.status === "renamed") {
149
+ classification = "SUSPICIOUS";
150
+ confidence = "medium";
151
+ justification = "File rename requires explanation";
152
+ }
153
+ return {
154
+ symbol: {
155
+ path: file.path,
156
+ changeType: file.status,
157
+ additions,
158
+ deletions,
159
+ changes,
160
+ symbols: [],
161
+ },
162
+ classification,
163
+ confidence,
164
+ justification,
165
+ evidence,
166
+ };
167
+ }
168
+ toChangedSymbol(file, symbol) {
169
+ return {
170
+ id: `${file.path}:${symbol.name}:${symbol.lineRange[0]}`,
171
+ name: symbol.name,
172
+ type: symbol.type,
173
+ filePath: file.path,
174
+ lineRange: symbol.lineRange,
175
+ changeType: file.status,
176
+ visibility: symbol.visibility,
177
+ isExported: symbol.isExported,
178
+ callers: [],
179
+ callees: [],
180
+ implementations: [],
181
+ interfaces: [],
182
+ referencedContracts: [],
183
+ relatedTests: [],
184
+ evidence: [],
185
+ };
186
+ }
187
+ /**
188
+ * Calculate how much a file path matches task keywords
189
+ */
190
+ calculatePathMatchScore(filePath, keywords) {
191
+ if (keywords.length === 0)
192
+ return 0;
193
+ const pathParts = filePath.toLowerCase().split(/[\\/\.]/);
194
+ let matches = 0;
195
+ for (const keyword of keywords) {
196
+ if (pathParts.some((part) => part.includes(keyword))) {
197
+ matches++;
198
+ }
199
+ }
200
+ return matches / keywords.length;
201
+ }
202
+ /**
203
+ * Check if file is a test file
204
+ */
205
+ isTestFile(filePath) {
206
+ return /\.(test|spec)\.(ts|js|tsx|jsx)$/.test(filePath) || filePath.includes("__tests__");
207
+ }
208
+ /**
209
+ * Check if file is a config file
210
+ */
211
+ isConfigFile(filePath) {
212
+ return (/\.(config|rc)\.(ts|js|json)$/.test(filePath) ||
213
+ /^\./.test(filePath) ||
214
+ ["package.json", "tsconfig.json", "jest.config.js"].includes(filePath.split("/").pop() || ""));
215
+ }
216
+ isGeneratedFile(filePath) {
217
+ return /(?:^|\/)(?:dist|build|generated)\//.test(filePath) || /(?:-lock\.json|pnpm-lock\.yaml|yarn\.lock|\.snap)$/.test(filePath);
218
+ }
219
+ /**
220
+ * Detect scope drift percentage
221
+ */
222
+ detectScopeDrift(classifications, totalChanges) {
223
+ const suspiciousCount = classifications.filter((c) => c.classification === "SUSPICIOUS").length;
224
+ return suspiciousCount / Math.max(totalChanges, 1);
225
+ }
226
+ /**
227
+ * Detect refactor contamination
228
+ */
229
+ detectRefactorContamination(classifications) {
230
+ return classifications
231
+ .filter((c) => c.classification === "REFACTOR")
232
+ .map((c) => (typeof c.symbol === "object" && "path" in c.symbol) ? c.symbol.path : "unknown");
233
+ }
234
+ }
235
+ function rangesOverlap(left, right) {
236
+ return left[0] <= right[1] && right[0] <= left[1];
237
+ }
238
+ export function createChangeAnalyzer() {
239
+ return new ChangeAnalyzer();
240
+ }
241
+ //# sourceMappingURL=change-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-classifier.js","sourceRoot":"","sources":["../../src/analysis/change-classifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { BehavioralChangeType, ChangedSymbol, ContractChange, CorrectionPlan, ExecutedTest, Finding, PredictedTest } from "../core/models.js";
2
+ import type { FileDiff } from "../git/repository.js";
3
+ export interface RepositoryIntelligence {
4
+ directCallers: string[];
5
+ transitiveCallers: string[];
6
+ packages: string[];
7
+ predictedTests: PredictedTest[];
8
+ contracts: ContractChange[];
9
+ behavioralChanges: BehavioralChangeType[];
10
+ reuseCandidates: string[];
11
+ findings: Finding[];
12
+ correction?: CorrectionPlan;
13
+ }
14
+ export declare function inspectRepository(root: string, taskKeywords: string[], diffs: FileDiff[], changedSymbols: ChangedSymbol[], executedTests?: ExecutedTest[]): RepositoryIntelligence;
15
+ //# sourceMappingURL=repository-intelligence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-intelligence.d.ts","sourceRoot":"","sources":["../../src/analysis/repository-intelligence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,cAAc,EAEd,YAAY,EACZ,OAAO,EACP,aAAa,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,iBAAiB,EAAE,oBAAoB,EAAE,CAAC;IAC1C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAMD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,QAAQ,EAAE,EACjB,cAAc,EAAE,aAAa,EAAE,EAC/B,aAAa,GAAE,YAAY,EAAO,GACjC,sBAAsB,CAyHxB"}
@@ -0,0 +1,179 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import * as ts from "typescript";
4
+ const SOURCE_RE = /\.[cm]?[jt]sx?$/;
5
+ const TEST_RE = /(?:^|\/)(?:__tests__\/.*|.*\.(?:test|spec))\.[cm]?[jt]sx?$/;
6
+ const SKIP = new Set([".git", "node_modules", "dist", "build", "coverage", ".next"]);
7
+ export function inspectRepository(root, taskKeywords, diffs, changedSymbols, executedTests = []) {
8
+ const sourceFiles = walk(root).filter((file) => SOURCE_RE.test(file));
9
+ const relativeFiles = sourceFiles.map((file) => path.relative(root, file).split(path.sep).join("/"));
10
+ const changed = new Set(diffs.map((file) => file.path));
11
+ const imports = new Map();
12
+ const contents = new Map();
13
+ for (const relative of relativeFiles) {
14
+ const content = fs.readFileSync(path.join(root, relative), "utf8");
15
+ contents.set(relative, content);
16
+ imports.set(relative, extractImports(content).map((specifier) => resolveImport(relative, specifier, relativeFiles)).filter(Boolean));
17
+ }
18
+ const directCallers = relativeFiles.filter((file) => imports.get(file)?.some((target) => changed.has(target)));
19
+ const transitive = new Set(directCallers);
20
+ let frontier = [...directCallers];
21
+ while (frontier.length) {
22
+ const targets = new Set(frontier);
23
+ frontier = relativeFiles.filter((file) => !transitive.has(file) && imports.get(file)?.some((target) => targets.has(target)));
24
+ frontier.forEach((file) => transitive.add(file));
25
+ }
26
+ const predictedTests = relativeFiles.filter((file) => TEST_RE.test(file)).flatMap((file) => {
27
+ const body = contents.get(file) || "";
28
+ const related = directCallers.includes(file) || imports.get(file)?.some((target) => changed.has(target));
29
+ const mentionsSymbol = changedSymbols.some((symbol) => body.includes(symbol.name.split(".").pop() || symbol.name));
30
+ const sameStem = diffs.some((diff) => path.basename(file).includes(path.basename(diff.path).replace(/\.[^.]+$/, "")));
31
+ if (!related && !mentionsSymbol && !sameStem)
32
+ return [];
33
+ const status = related || mentionsSymbol ? "LIKELY_AFFECTED" : "POSSIBLY_AFFECTED";
34
+ return [{
35
+ path: file,
36
+ name: path.basename(file),
37
+ status,
38
+ evidence: [{
39
+ type: related ? "IMPORT_DEPENDENCY" : "TEST_REFERENCE",
40
+ confidence: related ? "high" : "medium",
41
+ explanation: related ? "Test imports a changed module" : "Test name or contents reference a changed symbol",
42
+ reference: file,
43
+ }],
44
+ }];
45
+ });
46
+ const contracts = changedSymbols.filter((symbol) => symbol.isExported).map((symbol) => ({
47
+ type: symbol.changeType === "added" ? "ADDED" : symbol.changeType === "deleted" ? "REMOVED" : "CHANGED",
48
+ location: `${symbol.filePath}:${symbol.lineRange[0]} ${symbol.name}`,
49
+ severity: symbol.changeType === "added" ? "compatible" : "potentially-breaking",
50
+ confidence: symbol.changeType === "added" ? "high" : "medium",
51
+ affectedCallers: directCallers.filter((file) => imports.get(file)?.includes(symbol.filePath)),
52
+ }));
53
+ const diffText = diffs.flatMap((file) => file.hunks.map((hunk) => hunk.content)).join("\n").toLowerCase();
54
+ const behavioralChanges = behaviorFrom(diffText, diffs);
55
+ const reuseCandidates = findReuseCandidates(taskKeywords, changed, contents, root);
56
+ const findings = [];
57
+ if (reuseCandidates[0])
58
+ findings.push(finding("reuse-candidate", "warning", "medium", "Existing code may be reusable", `${reuseCandidates[0]} contains task-related symbols or text and is unchanged by this patch.`, [reuseCandidates[0]], "Inspect this existing mechanism before keeping a parallel implementation.", { type: "EXISTING_UTILITY", confidence: "medium", explanation: "Unchanged repository code matches task intent", reference: reuseCandidates[0] }));
59
+ for (const symbol of changedSymbols.filter((item) => item.changeType === "added" && ["interface", "class"].includes(item.type))) {
60
+ const uses = [...contents.values()].reduce((count, body) => count + occurrences(body, symbol.name), 0);
61
+ if (uses <= 2)
62
+ findings.push(finding("unnecessary-abstraction", "warning", "medium", "Possible unnecessary abstraction", `${symbol.type} ${symbol.name} has no evidence of reuse outside its declaration.`, [symbol.id], "Keep it local unless another consumer requires the abstraction.", { type: "SYMBOL_REFERENCE", confidence: "medium", explanation: `Found ${Math.max(0, uses - 1)} use(s) outside the declaration`, reference: symbol.id }));
63
+ }
64
+ for (const file of diffs.filter((item) => item.path === "package.json" && item.status === "modified")) {
65
+ const additions = file.hunks.flatMap((hunk) => hunk.content.split("\n")).filter((line) => /^\+\s*"[^"]+"\s*:/.test(line));
66
+ if (additions.length)
67
+ findings.push(finding("dependency-addition", "warning", "high", "Dependency addition needs justification", `package.json adds ${additions.length} dependency entry or entries.`, [file.path], "Use the runtime or an existing dependency unless the task requires this package.", { type: "DEPENDENCY_USAGE", confidence: "high", explanation: additions.join(", "), reference: file.path }));
68
+ }
69
+ if (behavioralChanges.some((type) => type !== "TEST_ONLY" && type !== "REFACTOR_ONLY") && predictedTests.length === 0) {
70
+ findings.push(finding("missing-regression-test", "warning", "medium", "Missing regression coverage", `Behavioral change detected (${behavioralChanges.join(", ")}) but no related test was found.`, [], "Add one regression test for the changed behavior.", { type: "TEST_REFERENCE", confidence: "medium", explanation: "No test imports or references the changed code" }));
71
+ }
72
+ const packages = new Set([...changed, ...directCallers].map((file) => packageFor(root, file)).filter(Boolean));
73
+ const removalPaths = diffs.filter((file) => !taskKeywords.some((word) => file.path.toLowerCase().includes(word))
74
+ && !TEST_RE.test(file.path)
75
+ && !imports.get(file.path)?.some((target) => changed.has(target))).map((file) => file.path);
76
+ const evidence = removalPaths.map((file) => ({ type: "TASK_MATCH", confidence: "medium", explanation: "No task keyword matched this path", reference: file }));
77
+ const correction = findings.length || removalPaths.length ? {
78
+ pass: 1,
79
+ removals: removalPaths,
80
+ simplifications: findings.filter((item) => item.id.startsWith("unnecessary-abstraction")).map((item) => ({ symbol: item.affectedSymbols[0], suggestion: item.recommendation || "Inline it" })),
81
+ evidence,
82
+ instruction: correctionInstruction([...findings, ...removalPaths.map((file) => finding("scope", "warning", "medium", "Weak task evidence", file, [file], "Remove or justify it", evidence.find((item) => item.reference === file)))]),
83
+ } : undefined;
84
+ return {
85
+ directCallers,
86
+ transitiveCallers: [...transitive].filter((file) => !directCallers.includes(file)),
87
+ packages: [...packages],
88
+ predictedTests,
89
+ contracts,
90
+ behavioralChanges,
91
+ reuseCandidates,
92
+ findings,
93
+ correction,
94
+ };
95
+ }
96
+ function walk(root) {
97
+ const files = [];
98
+ const visit = (directory) => {
99
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
100
+ if (SKIP.has(entry.name))
101
+ continue;
102
+ const full = path.join(directory, entry.name);
103
+ if (entry.isDirectory())
104
+ visit(full);
105
+ else if (entry.isFile())
106
+ files.push(full);
107
+ }
108
+ };
109
+ visit(root);
110
+ return files;
111
+ }
112
+ function extractImports(content) {
113
+ const source = ts.createSourceFile("file.ts", content, ts.ScriptTarget.Latest, true);
114
+ return source.statements.flatMap((statement) => {
115
+ if ((ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement)) && statement.moduleSpecifier && ts.isStringLiteral(statement.moduleSpecifier))
116
+ return [statement.moduleSpecifier.text];
117
+ return [];
118
+ });
119
+ }
120
+ function resolveImport(from, specifier, files) {
121
+ if (!specifier.startsWith("."))
122
+ return undefined;
123
+ const base = path.posix.normalize(path.posix.join(path.posix.dirname(from), specifier)).replace(/\.js$/, "");
124
+ return files.find((file) => file.replace(/\.[^.]+$/, "") === base || file.replace(/\/index\.[^.]+$/, "") === base);
125
+ }
126
+ function findReuseCandidates(keywords, changed, contents, root) {
127
+ const scored = [];
128
+ for (const [file, body] of contents) {
129
+ if (changed.has(file) || TEST_RE.test(file))
130
+ continue;
131
+ const lower = `${file}\n${body}`.toLowerCase();
132
+ const pathScore = keywords.filter((word) => file.toLowerCase().includes(word)).length;
133
+ const score = pathScore * 10 + keywords.filter((word) => lower.includes(word)).length;
134
+ if (score)
135
+ scored.push([file, score]);
136
+ }
137
+ return scored.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).slice(0, 5).map(([file]) => path.relative(root, path.join(root, file)));
138
+ }
139
+ function behaviorFrom(text, diffs) {
140
+ const found = new Set();
141
+ const rules = [
142
+ [/throw|catch|error/, "ERROR_HANDLING"], [/retry|429|backoff/, "RETRY"], [/cache|memo/, "CACHE"],
143
+ [/auth|permission|role/, "AUTHORIZATION"], [/insert|update|delete|save|write/, "STATE_MUTATION"],
144
+ [/route|request|response|status/, "API_BEHAVIOR"], [/env|config/, "CONFIGURATION"], [/promise|async|await|lock/, "CONCURRENCY"],
145
+ ];
146
+ rules.forEach(([pattern, type]) => { if (pattern.test(text))
147
+ found.add(type); });
148
+ if (diffs.every((file) => TEST_RE.test(file.path)))
149
+ found.add("TEST_ONLY");
150
+ return [...found];
151
+ }
152
+ function packageFor(root, file) {
153
+ let directory = path.dirname(path.join(root, file));
154
+ while (directory.startsWith(root)) {
155
+ const manifest = path.join(directory, "package.json");
156
+ if (fs.existsSync(manifest)) {
157
+ try {
158
+ return JSON.parse(fs.readFileSync(manifest, "utf8")).name || path.relative(root, directory) || "root";
159
+ }
160
+ catch {
161
+ return path.relative(root, directory) || "root";
162
+ }
163
+ }
164
+ if (directory === root)
165
+ break;
166
+ directory = path.dirname(directory);
167
+ }
168
+ return undefined;
169
+ }
170
+ function occurrences(body, word) {
171
+ return body.match(new RegExp(`\\b${word.replace(/[.*+?^${}()|[\\]\\]/g, "\\$&")}\\b`, "g"))?.length || 0;
172
+ }
173
+ function finding(id, severity, confidence, title, description, affectedSymbols, recommendation, evidence) {
174
+ return { id: `${id}-${affectedSymbols[0] || "change"}`, severity, confidence, title, description, affectedSymbols, recommendation, evidence: [evidence], autoCorrectible: severity !== "error" };
175
+ }
176
+ function correctionInstruction(findings) {
177
+ return `Revisit the current patch once. Preserve requested behavior and all validation, security, accessibility, data integrity, error handling, and regression coverage. Do not add functionality. Resolve or justify these red marks:\n${findings.map((item) => `- ${item.title}: ${item.description}`).join("\n")}\nReturn the smallest safe patch that satisfies the task.`;
178
+ }
179
+ //# sourceMappingURL=repository-intelligence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-intelligence.js","sourceRoot":"","sources":["../../src/analysis/repository-intelligence.ts"],"names":[],"mappings":"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"}