projscan 1.8.1 → 1.9.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 +2 -2
- package/dist/analyzers/securityCheck.js +5 -1
- package/dist/analyzers/securityCheck.js.map +1 -1
- package/dist/core/applyFix.js +6 -1
- package/dist/core/applyFix.js.map +1 -1
- package/dist/core/codeGraph.js +6 -1
- package/dist/core/codeGraph.js.map +1 -1
- package/dist/core/intent.d.ts +94 -0
- package/dist/core/intent.js +472 -0
- package/dist/core/intent.js.map +1 -0
- package/dist/core/memory.d.ts +28 -0
- package/dist/core/memory.js +22 -0
- package/dist/core/memory.js.map +1 -1
- package/dist/core/prDiff.js +18 -4
- package/dist/core/prDiff.js.map +1 -1
- package/dist/core/repositoryScanner.js +6 -1
- package/dist/core/repositoryScanner.js.map +1 -1
- package/dist/core/review.d.ts +8 -0
- package/dist/core/review.js +56 -4
- package/dist/core/review.js.map +1 -1
- package/dist/core/watcher.js +8 -0
- package/dist/core/watcher.js.map +1 -1
- package/dist/mcp/tools/memory.js +8 -3
- package/dist/mcp/tools/memory.js.map +1 -1
- package/dist/mcp/tools/review.js +7 -2
- package/dist/mcp/tools/review.js.map +1 -1
- package/dist/mcp/tools/reviewWatch.d.ts +121 -0
- package/dist/mcp/tools/reviewWatch.js +153 -17
- package/dist/mcp/tools/reviewWatch.js.map +1 -1
- package/dist/tool-manifest.json +9 -5
- package/dist/types.d.ts +35 -0
- package/package.json +2 -2
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
// ── parsing ──────────────────────────────────────────────────────────
|
|
2
|
+
/**
|
|
3
|
+
* Action keyword table. Ordered loosely from most-specific to most-
|
|
4
|
+
* generic. Each list contains lowercase prefix tokens; matching is
|
|
5
|
+
* whole-word case-insensitive against the intent prose. `parseIntent`
|
|
6
|
+
* scores each action by counted keyword hits and returns the highest
|
|
7
|
+
* — ties resolved by the iteration order of the table.
|
|
8
|
+
*/
|
|
9
|
+
const ACTION_KEYWORDS = {
|
|
10
|
+
test: ['test', 'tests', 'testing', 'spec', 'specs', 'unit', 'integration', 'coverage'],
|
|
11
|
+
docs: ['doc', 'docs', 'documentation', 'readme', 'comment', 'comments', 'changelog', 'guide'],
|
|
12
|
+
chore: ['bump', 'upgrade', 'deps', 'dependencies', 'lint', 'format', 'pin', 'lock', 'chore'],
|
|
13
|
+
remove: ['remove', 'delete', 'deprecate', 'drop', 'retire', 'unused'],
|
|
14
|
+
perf: ['optimize', 'optimise', 'perf', 'performance', 'faster', 'speed', 'cache', 'memoize', 'parallelize'],
|
|
15
|
+
fix: ['fix', 'bug', 'bugfix', 'resolve', 'patch', 'repair', 'correct', 'address', 'hotfix'],
|
|
16
|
+
refactor: ['refactor', 'rename', 'extract', 'restructure', 'rewrite', 'consolidate', 'tidy', 'cleanup'],
|
|
17
|
+
feature: ['add', 'adding', 'implement', 'introduce', 'support', 'enable', 'create', 'feature'],
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Tokens NEVER counted as scope. English stopwords, common PR-prose
|
|
21
|
+
* filler, and the action keywords themselves (they belong to the
|
|
22
|
+
* action classifier, not the scope).
|
|
23
|
+
*/
|
|
24
|
+
const STOPWORDS = new Set([
|
|
25
|
+
'the', 'and', 'for', 'with', 'that', 'this', 'from', 'into', 'when', 'where', 'what',
|
|
26
|
+
'which', 'their', 'them', 'they', 'have', 'has', 'are', 'was', 'were', 'will',
|
|
27
|
+
'should', 'would', 'could', 'can', 'not', 'but', 'all', 'any', 'some', 'one',
|
|
28
|
+
'two', 'three', 'first', 'last', 'before', 'after', 'while', 'over', 'under',
|
|
29
|
+
'between', 'against', 'across', 'during', 'because', 'about', 'also', 'just',
|
|
30
|
+
'only', 'than', 'then', 'these', 'those', 'how', 'why', 'who', 'whom',
|
|
31
|
+
// common PR-prose
|
|
32
|
+
'pr', 'mr', 'feature', 'feat', 'request', 'requested', 'merge', 'pull',
|
|
33
|
+
'review', 'reviewed', 'change', 'changes', 'changed', 'changing', 'update',
|
|
34
|
+
'updates', 'updated', 'updating', 'work', 'working', 'wip',
|
|
35
|
+
'project', 'projscan', 'code', 'codebase', 'repository', 'repo', 'branch',
|
|
36
|
+
// 1.9+ — very generic path-component tokens that match nearly every
|
|
37
|
+
// file. Including these as scope would make almost any change look
|
|
38
|
+
// "in scope," defeating the purpose. The path-boundary regex below
|
|
39
|
+
// already narrows the match shape; this set narrows the token set.
|
|
40
|
+
'src', 'lib', 'dist', 'build', 'test', 'tests', 'spec', 'specs',
|
|
41
|
+
'app', 'apps', 'pkg', 'pkgs', 'package', 'packages', 'main', 'index',
|
|
42
|
+
]);
|
|
43
|
+
/**
|
|
44
|
+
* 1.9+ — Maximum intent string length. Caps the input to a sane bound
|
|
45
|
+
* before any regex / tokenization work runs. Without this, a 10MB
|
|
46
|
+
* intent argument would force the action-keyword scoring loop into
|
|
47
|
+
* ~50 regex scans across the full payload (catastrophic backtracking
|
|
48
|
+
* risk with repeated keywords). Agents passing real PR descriptions
|
|
49
|
+
* stay well under this cap; anything bigger is almost certainly a
|
|
50
|
+
* mistake or an attack on resources.
|
|
51
|
+
*/
|
|
52
|
+
const MAX_INTENT_LENGTH = 8192;
|
|
53
|
+
function isActionKeyword(token) {
|
|
54
|
+
for (const list of Object.values(ACTION_KEYWORDS)) {
|
|
55
|
+
if (list.includes(token))
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parse a free-text intent string. Returns null when the input is
|
|
62
|
+
* empty / whitespace-only. Returns an intent with `action: 'unknown'`
|
|
63
|
+
* when no action keyword matched — callers should treat that as
|
|
64
|
+
* "scope known, action unclassified" and downgrade alignment labels
|
|
65
|
+
* to 'unknown'.
|
|
66
|
+
*/
|
|
67
|
+
export function parseIntent(raw) {
|
|
68
|
+
if (typeof raw !== 'string')
|
|
69
|
+
return null;
|
|
70
|
+
// Cap length before any regex work — protects against a pathological
|
|
71
|
+
// mega-string forcing 50+ regex passes over megabytes of input.
|
|
72
|
+
// Slicing in the middle of a word is fine; the action-keyword
|
|
73
|
+
// scoring is robust to truncated keywords (the keyword just won't
|
|
74
|
+
// match), and a real PR description fits comfortably under 8K chars.
|
|
75
|
+
const truncated = raw.length > MAX_INTENT_LENGTH ? raw.slice(0, MAX_INTENT_LENGTH) : raw;
|
|
76
|
+
const trimmed = truncated.trim();
|
|
77
|
+
if (trimmed.length === 0)
|
|
78
|
+
return null;
|
|
79
|
+
const lower = trimmed.toLowerCase();
|
|
80
|
+
// Score actions by counted keyword hits. Use word-boundary matching
|
|
81
|
+
// so "tested" doesn't trip "test", but treat hyphens / underscores
|
|
82
|
+
// as boundaries since PR prose often runs them together
|
|
83
|
+
// ("feat-add-caching", "refactor_auth").
|
|
84
|
+
let bestAction = 'unknown';
|
|
85
|
+
let bestScore = 0;
|
|
86
|
+
for (const [action, keywords] of Object.entries(ACTION_KEYWORDS)) {
|
|
87
|
+
let score = 0;
|
|
88
|
+
for (const kw of keywords) {
|
|
89
|
+
const escaped = kw.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
90
|
+
// Word-ish boundary: anything that isn't an ASCII letter/digit.
|
|
91
|
+
const re = new RegExp(`(^|[^a-z0-9])${escaped}([^a-z0-9]|$)`, 'g');
|
|
92
|
+
const matches = lower.match(re);
|
|
93
|
+
if (matches)
|
|
94
|
+
score += matches.length;
|
|
95
|
+
}
|
|
96
|
+
if (score > bestScore) {
|
|
97
|
+
bestScore = score;
|
|
98
|
+
bestAction = action;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Extract scope tokens. Tokenize on whitespace and most punctuation;
|
|
102
|
+
// keep _, -, ., /, : as identifier-like joiners.
|
|
103
|
+
const tokens = new Set();
|
|
104
|
+
const rawTokens = lower.split(/[^a-z0-9_\-./:]+/).filter(Boolean);
|
|
105
|
+
for (const tok of rawTokens) {
|
|
106
|
+
if (tok.length < 3)
|
|
107
|
+
continue;
|
|
108
|
+
if (STOPWORDS.has(tok))
|
|
109
|
+
continue;
|
|
110
|
+
if (isActionKeyword(tok))
|
|
111
|
+
continue;
|
|
112
|
+
// Skip pure numerics ("1", "20", "v2") — too generic to scope by.
|
|
113
|
+
if (/^[0-9]+$/.test(tok))
|
|
114
|
+
continue;
|
|
115
|
+
tokens.add(tok);
|
|
116
|
+
// Also add path / dot components individually: "src/auth/index.ts"
|
|
117
|
+
// contributes "src", "auth", "index.ts", and "index".
|
|
118
|
+
for (const part of tok.split(/[./]/).filter(Boolean)) {
|
|
119
|
+
if (part.length < 3)
|
|
120
|
+
continue;
|
|
121
|
+
if (STOPWORDS.has(part))
|
|
122
|
+
continue;
|
|
123
|
+
if (isActionKeyword(part))
|
|
124
|
+
continue;
|
|
125
|
+
tokens.add(part);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
raw: trimmed,
|
|
130
|
+
action: bestAction,
|
|
131
|
+
scopeTokens: [...tokens].sort(),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// ── alignment classification ─────────────────────────────────────────
|
|
135
|
+
/**
|
|
136
|
+
* Per-action expectation table. Maps `(action, findingKind)` to true
|
|
137
|
+
* when the finding kind is *typical* for that action — that is, the
|
|
138
|
+
* reviewer should not be surprised to see it.
|
|
139
|
+
*
|
|
140
|
+
* The table is intentionally generous: when in doubt, treat a finding
|
|
141
|
+
* as "expected for the action" so we don't flag honest PRs as
|
|
142
|
+
* unexpected. The signal value comes from the cases where there's a
|
|
143
|
+
* clear semantic mismatch (test PR touches non-test code, docs PR
|
|
144
|
+
* adds high-CC functions, etc.).
|
|
145
|
+
*/
|
|
146
|
+
const EXPECTATIONS = {
|
|
147
|
+
feature: new Set([
|
|
148
|
+
'file-added',
|
|
149
|
+
'file-modified',
|
|
150
|
+
'function-added',
|
|
151
|
+
'dep-added',
|
|
152
|
+
'dep-bumped',
|
|
153
|
+
]),
|
|
154
|
+
fix: new Set([
|
|
155
|
+
'file-modified',
|
|
156
|
+
'function-jumped',
|
|
157
|
+
'function-crossed-threshold',
|
|
158
|
+
]),
|
|
159
|
+
refactor: new Set([
|
|
160
|
+
'file-added',
|
|
161
|
+
'file-modified',
|
|
162
|
+
'file-removed',
|
|
163
|
+
'function-added',
|
|
164
|
+
'function-jumped',
|
|
165
|
+
'function-crossed-threshold',
|
|
166
|
+
'cycle-new',
|
|
167
|
+
'cycle-expanded',
|
|
168
|
+
]),
|
|
169
|
+
perf: new Set([
|
|
170
|
+
'file-modified',
|
|
171
|
+
'function-added',
|
|
172
|
+
'function-jumped',
|
|
173
|
+
'function-crossed-threshold',
|
|
174
|
+
]),
|
|
175
|
+
test: new Set([
|
|
176
|
+
'file-added',
|
|
177
|
+
'file-modified',
|
|
178
|
+
'file-removed',
|
|
179
|
+
]),
|
|
180
|
+
docs: new Set([
|
|
181
|
+
'file-added',
|
|
182
|
+
'file-modified',
|
|
183
|
+
'file-removed',
|
|
184
|
+
]),
|
|
185
|
+
chore: new Set([
|
|
186
|
+
'dep-added',
|
|
187
|
+
'dep-removed',
|
|
188
|
+
'dep-bumped',
|
|
189
|
+
'file-modified',
|
|
190
|
+
]),
|
|
191
|
+
remove: new Set([
|
|
192
|
+
'file-removed',
|
|
193
|
+
'dep-removed',
|
|
194
|
+
]),
|
|
195
|
+
unknown: new Set(),
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Test / docs PRs have an extra constraint: the file path itself must
|
|
199
|
+
* "look like" a test or docs file for the finding to count as
|
|
200
|
+
* expected. Otherwise we'd treat any modified file in a "test:" PR as
|
|
201
|
+
* expected — which defeats the entire purpose of intent grounding.
|
|
202
|
+
*/
|
|
203
|
+
function isTestPath(p) {
|
|
204
|
+
const lower = p.toLowerCase();
|
|
205
|
+
return /(^|\/)(tests?|__tests__|spec|specs)(\/|$)/.test(lower) ||
|
|
206
|
+
/\.(test|spec)\.[a-z0-9]+$/.test(lower);
|
|
207
|
+
}
|
|
208
|
+
function isDocsPath(p) {
|
|
209
|
+
const lower = p.toLowerCase();
|
|
210
|
+
return /(^|\/)docs?(\/|$)/.test(lower) ||
|
|
211
|
+
/\.(md|mdx|rst|txt|adoc)$/.test(lower) ||
|
|
212
|
+
lower.endsWith('readme') ||
|
|
213
|
+
lower.endsWith('changelog');
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* 1.9+ — Match a token against a path at component boundaries. A
|
|
217
|
+
* naive `includes` was too generous: token "src" would match
|
|
218
|
+
* "src/anything", token "api" would match "rapid_test.js", silently
|
|
219
|
+
* declaring nearly every finding in-scope.
|
|
220
|
+
*
|
|
221
|
+
* Boundary semantics: the token matches when surrounded by path
|
|
222
|
+
* separators (`/`, `.`, `-`, `_`, `:`) or by the start/end of the
|
|
223
|
+
* string. So "auth" matches "src/auth/index.ts" and "use_auth_hook"
|
|
224
|
+
* (`_` boundary on each side), but NOT "authority/database.ts" or
|
|
225
|
+
* "useauthhook" (no boundaries).
|
|
226
|
+
*/
|
|
227
|
+
function tokenMatchesAtBoundary(token, target) {
|
|
228
|
+
const lowerTarget = target.toLowerCase();
|
|
229
|
+
const idx = lowerTarget.indexOf(token);
|
|
230
|
+
if (idx === -1)
|
|
231
|
+
return false;
|
|
232
|
+
// Scan all occurrences — the first hit might be inside a larger
|
|
233
|
+
// word, but a later occurrence could land at a boundary.
|
|
234
|
+
let pos = idx;
|
|
235
|
+
while (pos !== -1) {
|
|
236
|
+
const before = pos === 0 ? '/' : lowerTarget[pos - 1];
|
|
237
|
+
const afterIdx = pos + token.length;
|
|
238
|
+
const after = afterIdx >= lowerTarget.length ? '/' : lowerTarget[afterIdx];
|
|
239
|
+
if (isBoundaryChar(before) && isBoundaryChar(after))
|
|
240
|
+
return true;
|
|
241
|
+
pos = lowerTarget.indexOf(token, pos + 1);
|
|
242
|
+
}
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
function isBoundaryChar(ch) {
|
|
246
|
+
return ch === '/' || ch === '.' || ch === '-' || ch === '_' || ch === ':' || ch === '\\';
|
|
247
|
+
}
|
|
248
|
+
function pathMatchesScope(scopeTokens, path) {
|
|
249
|
+
if (scopeTokens.length === 0)
|
|
250
|
+
return true; // no scope → everything in
|
|
251
|
+
for (const tok of scopeTokens) {
|
|
252
|
+
if (tokenMatchesAtBoundary(tok, path))
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
function symbolMatchesScope(scopeTokens, symbol) {
|
|
258
|
+
if (scopeTokens.length === 0)
|
|
259
|
+
return true;
|
|
260
|
+
for (const tok of scopeTokens) {
|
|
261
|
+
if (tokenMatchesAtBoundary(tok, symbol))
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
function classify(intent, kind, inScope, pathHint) {
|
|
267
|
+
if (intent.action === 'unknown')
|
|
268
|
+
return 'unknown';
|
|
269
|
+
// Type-rooted intents (docs / test): the action implies a path type.
|
|
270
|
+
// If the file's path matches that type, treat it as in-scope even
|
|
271
|
+
// without an explicit scope-token hit — "docs PR" + README.md is
|
|
272
|
+
// intrinsically in scope, the agent shouldn't have to name every
|
|
273
|
+
// file. Scope tokens still narrow when present; this just lifts
|
|
274
|
+
// type-matching paths out of the "out-of-scope" bucket.
|
|
275
|
+
let effectiveInScope = inScope;
|
|
276
|
+
if (!effectiveInScope && pathHint) {
|
|
277
|
+
if (intent.action === 'docs' && isDocsPath(pathHint))
|
|
278
|
+
effectiveInScope = true;
|
|
279
|
+
if (intent.action === 'test' && isTestPath(pathHint))
|
|
280
|
+
effectiveInScope = true;
|
|
281
|
+
}
|
|
282
|
+
// Extra constraint for test / docs intents: the *path* must also
|
|
283
|
+
// match the action's path expectation for the kind to count as
|
|
284
|
+
// expected.
|
|
285
|
+
let expected = EXPECTATIONS[intent.action].has(kind);
|
|
286
|
+
if (expected && pathHint) {
|
|
287
|
+
if (intent.action === 'test' && !isTestPath(pathHint))
|
|
288
|
+
expected = false;
|
|
289
|
+
if (intent.action === 'docs' && !isDocsPath(pathHint))
|
|
290
|
+
expected = false;
|
|
291
|
+
}
|
|
292
|
+
if (expected && effectiveInScope)
|
|
293
|
+
return 'expected';
|
|
294
|
+
if (expected && !effectiveInScope)
|
|
295
|
+
return 'out-of-scope';
|
|
296
|
+
if (effectiveInScope)
|
|
297
|
+
return 'unexpected';
|
|
298
|
+
return 'out-of-scope';
|
|
299
|
+
}
|
|
300
|
+
// ── annotation ───────────────────────────────────────────────────────
|
|
301
|
+
/**
|
|
302
|
+
* Annotate a review report's findings in place with `intentAlignment`
|
|
303
|
+
* and return the aggregate IntentAnalysis. Mutates the input report
|
|
304
|
+
* (computeReview is already building it; cheaper than a deep clone).
|
|
305
|
+
*
|
|
306
|
+
* Callers passing in a `null` intent get a no-op analysis with
|
|
307
|
+
* everything labelled 'unknown'.
|
|
308
|
+
*/
|
|
309
|
+
export function annotateReviewWithIntent(report, intent) {
|
|
310
|
+
const totals = {
|
|
311
|
+
expected: 0,
|
|
312
|
+
unexpected: 0,
|
|
313
|
+
'out-of-scope': 0,
|
|
314
|
+
unknown: 0,
|
|
315
|
+
};
|
|
316
|
+
const notable = [];
|
|
317
|
+
for (const f of report.changedFiles) {
|
|
318
|
+
const kind = f.status === 'added' ? 'file-added' : f.status === 'removed' ? 'file-removed' : 'file-modified';
|
|
319
|
+
const inScope = pathMatchesScope(intent.scopeTokens, f.relativePath);
|
|
320
|
+
const alignment = classify(intent, kind, inScope, f.relativePath);
|
|
321
|
+
f.intentAlignment = alignment;
|
|
322
|
+
totals[alignment] += 1;
|
|
323
|
+
if (alignment === 'unexpected' || alignment === 'out-of-scope') {
|
|
324
|
+
notable.push({
|
|
325
|
+
kind: 'file',
|
|
326
|
+
label: `${f.status} ${f.relativePath}`,
|
|
327
|
+
alignment,
|
|
328
|
+
reason: reasonFor(intent.action, kind, inScope, f.relativePath),
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
for (const fn of report.riskyFunctions) {
|
|
333
|
+
const kind = fn.reason === 'added'
|
|
334
|
+
? 'function-added'
|
|
335
|
+
: fn.reason === 'jumped'
|
|
336
|
+
? 'function-jumped'
|
|
337
|
+
: 'function-crossed-threshold';
|
|
338
|
+
const inScope = pathMatchesScope(intent.scopeTokens, fn.file) || symbolMatchesScope(intent.scopeTokens, fn.name);
|
|
339
|
+
const alignment = classify(intent, kind, inScope, fn.file);
|
|
340
|
+
fn.intentAlignment = alignment;
|
|
341
|
+
totals[alignment] += 1;
|
|
342
|
+
if (alignment === 'unexpected' || alignment === 'out-of-scope') {
|
|
343
|
+
notable.push({
|
|
344
|
+
kind: 'function',
|
|
345
|
+
label: `${fn.file}:${fn.line} ${fn.name} (CC ${fn.cyclomaticComplexity})`,
|
|
346
|
+
alignment,
|
|
347
|
+
reason: reasonFor(intent.action, kind, inScope, fn.file),
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
for (const c of report.newCycles) {
|
|
352
|
+
const kind = c.classification === 'new' ? 'cycle-new' : 'cycle-expanded';
|
|
353
|
+
// A cycle "matches" scope when ANY of its files does.
|
|
354
|
+
const inScope = c.files.some((f) => pathMatchesScope(intent.scopeTokens, f));
|
|
355
|
+
const alignment = classify(intent, kind, inScope);
|
|
356
|
+
c.intentAlignment = alignment;
|
|
357
|
+
totals[alignment] += 1;
|
|
358
|
+
if (alignment === 'unexpected' || alignment === 'out-of-scope') {
|
|
359
|
+
notable.push({
|
|
360
|
+
kind: 'cycle',
|
|
361
|
+
label: `${c.classification} cycle (${c.size} files): ${c.files.slice(0, 3).join(', ')}${c.files.length > 3 ? '…' : ''}`,
|
|
362
|
+
alignment,
|
|
363
|
+
reason: reasonFor(intent.action, kind, inScope),
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
for (const t of report.newTaintFlows) {
|
|
368
|
+
const inScope = t.files.some((f) => pathMatchesScope(intent.scopeTokens, f));
|
|
369
|
+
const alignment = classify(intent, 'taint-flow', inScope);
|
|
370
|
+
t.intentAlignment = alignment;
|
|
371
|
+
totals[alignment] += 1;
|
|
372
|
+
if (alignment === 'unexpected' || alignment === 'out-of-scope') {
|
|
373
|
+
notable.push({
|
|
374
|
+
kind: 'taint',
|
|
375
|
+
label: `${t.source} → ${t.sink} (${t.sourceFn} → ${t.sinkFn})`,
|
|
376
|
+
alignment,
|
|
377
|
+
reason: reasonFor(intent.action, 'taint-flow', inScope),
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
for (const dep of report.dependencyChanges) {
|
|
382
|
+
// For dependency changes, "in scope" means the manifest path
|
|
383
|
+
// matches the scope tokens, or the package name does. We use the
|
|
384
|
+
// most-impactful sub-kind (added > removed > bumped).
|
|
385
|
+
const subKind = dep.added.length > 0 ? 'dep-added' : dep.removed.length > 0 ? 'dep-removed' : 'dep-bumped';
|
|
386
|
+
const allDepNames = [
|
|
387
|
+
...dep.added.map((a) => a.name),
|
|
388
|
+
...dep.removed.map((r) => r.name),
|
|
389
|
+
...dep.bumped.map((b) => b.name),
|
|
390
|
+
];
|
|
391
|
+
const inScope = pathMatchesScope(intent.scopeTokens, dep.manifestFile) ||
|
|
392
|
+
allDepNames.some((n) => symbolMatchesScope(intent.scopeTokens, n));
|
|
393
|
+
const alignment = classify(intent, subKind, inScope);
|
|
394
|
+
dep.intentAlignment = alignment;
|
|
395
|
+
totals[alignment] += 1;
|
|
396
|
+
if (alignment === 'unexpected' || alignment === 'out-of-scope') {
|
|
397
|
+
notable.push({
|
|
398
|
+
kind: 'dependency',
|
|
399
|
+
label: `${dep.manifestFile}: +${dep.added.length} -${dep.removed.length} ~${dep.bumped.length}`,
|
|
400
|
+
alignment,
|
|
401
|
+
reason: reasonFor(intent.action, subKind, inScope),
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
// Notable: bias toward unexpected, then out-of-scope. Cap to 5.
|
|
406
|
+
notable.sort((a, b) => {
|
|
407
|
+
const rank = {
|
|
408
|
+
unexpected: 0,
|
|
409
|
+
'out-of-scope': 1,
|
|
410
|
+
expected: 2,
|
|
411
|
+
unknown: 3,
|
|
412
|
+
};
|
|
413
|
+
return rank[a.alignment] - rank[b.alignment];
|
|
414
|
+
});
|
|
415
|
+
const trimmed = notable.slice(0, 5);
|
|
416
|
+
return { intent, totals, notable: trimmed };
|
|
417
|
+
}
|
|
418
|
+
function reasonFor(action, kind, inScope, pathHint) {
|
|
419
|
+
if (!inScope) {
|
|
420
|
+
return `outside the area implied by the intent`;
|
|
421
|
+
}
|
|
422
|
+
if (action === 'test' && pathHint && !isTestPath(pathHint)) {
|
|
423
|
+
return `intent is a test change but this touches non-test code`;
|
|
424
|
+
}
|
|
425
|
+
if (action === 'docs' && pathHint && !isDocsPath(pathHint)) {
|
|
426
|
+
return `intent is a docs change but this touches code`;
|
|
427
|
+
}
|
|
428
|
+
switch (kind) {
|
|
429
|
+
case 'cycle-new':
|
|
430
|
+
case 'cycle-expanded':
|
|
431
|
+
if (action === 'fix' || action === 'docs' || action === 'test' || action === 'chore' || action === 'perf') {
|
|
432
|
+
return `intent is "${action}" but a new import cycle was introduced`;
|
|
433
|
+
}
|
|
434
|
+
return '';
|
|
435
|
+
case 'dep-added':
|
|
436
|
+
if (action === 'fix' || action === 'docs' || action === 'test' || action === 'perf') {
|
|
437
|
+
return `intent is "${action}" but a new dependency was added`;
|
|
438
|
+
}
|
|
439
|
+
return '';
|
|
440
|
+
case 'taint-flow':
|
|
441
|
+
return `intent is "${action}" but a new source-to-sink taint flow was introduced`;
|
|
442
|
+
case 'function-added':
|
|
443
|
+
if (action === 'docs' || action === 'fix') {
|
|
444
|
+
return `intent is "${action}" but a high-complexity function was added`;
|
|
445
|
+
}
|
|
446
|
+
return '';
|
|
447
|
+
default:
|
|
448
|
+
return '';
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Append intent-related bullets to a review's `summary` array. Called
|
|
453
|
+
* from computeReview after annotation. Keeps the summary readable —
|
|
454
|
+
* one bullet per high-signal observation.
|
|
455
|
+
*/
|
|
456
|
+
export function appendIntentToSummary(summary, analysis) {
|
|
457
|
+
const { intent, totals, notable } = analysis;
|
|
458
|
+
if (intent.action === 'unknown' && intent.scopeTokens.length === 0)
|
|
459
|
+
return;
|
|
460
|
+
const head = intent.action !== 'unknown'
|
|
461
|
+
? `Intent: "${intent.action}"${intent.scopeTokens.length > 0 ? ` (scope: ${intent.scopeTokens.slice(0, 4).join(', ')}${intent.scopeTokens.length > 4 ? '…' : ''})` : ''}.`
|
|
462
|
+
: `Intent scope: ${intent.scopeTokens.slice(0, 4).join(', ')}${intent.scopeTokens.length > 4 ? '…' : ''}.`;
|
|
463
|
+
summary.push(head);
|
|
464
|
+
if (totals.unexpected > 0) {
|
|
465
|
+
const sample = notable.find((n) => n.alignment === 'unexpected');
|
|
466
|
+
summary.push(`${totals.unexpected} finding(s) unexpected for this intent${sample ? ` — e.g. ${sample.label}` : ''}.`);
|
|
467
|
+
}
|
|
468
|
+
if (totals['out-of-scope'] > 0) {
|
|
469
|
+
summary.push(`${totals['out-of-scope']} finding(s) outside the stated scope.`);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
//# sourceMappingURL=intent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent.js","sourceRoot":"","sources":["../../src/core/intent.ts"],"names":[],"mappings":"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"}
|
package/dist/core/memory.d.ts
CHANGED
|
@@ -147,6 +147,34 @@ export declare function findStableRules(memory: ProjectMemory): RuleObservation[
|
|
|
147
147
|
*/
|
|
148
148
|
export type RuleConfidence = 'high' | 'medium' | 'low';
|
|
149
149
|
export declare function computeRuleConfidence(memory: ProjectMemory, ruleId: string): RuleConfidence;
|
|
150
|
+
/**
|
|
151
|
+
* 1.9+ — Project Memory loop #4: per-rule severity drift.
|
|
152
|
+
*
|
|
153
|
+
* Confidence (loop #3) asks "does the user fix this?" Drift asks the
|
|
154
|
+
* separate question "has the user been crying wolf on this rule for
|
|
155
|
+
* so long that its severity has effectively slipped?"
|
|
156
|
+
*
|
|
157
|
+
* "stable" — normal. Either the rule has fix activity, or has
|
|
158
|
+
* not surfaced enough times to judge.
|
|
159
|
+
* "noisy" — surfaced in ≥ NOISY_RUN_COUNT runs with a fix-rate
|
|
160
|
+
* below NOISY_FIX_RATE. The user mostly ignores it.
|
|
161
|
+
* Doctors / reviewers should de-emphasize.
|
|
162
|
+
* "cry-wolf" — surfaced in ≥ CRY_WOLF_RUN_COUNT runs with ZERO
|
|
163
|
+
* fix activity. Effectively a false-positive class for
|
|
164
|
+
* this repo. The driving agent should treat severity
|
|
165
|
+
* as one level lower than the rule's declared
|
|
166
|
+
* severity (error → warning, warning → info, info → drop).
|
|
167
|
+
*
|
|
168
|
+
* Returns "stable" for unknown rules — the absence of signal means we
|
|
169
|
+
* have no basis to claim drift. The thresholds are conservative to
|
|
170
|
+
* avoid quieting genuinely-important rules that simply have not had a
|
|
171
|
+
* chance to be fixed yet.
|
|
172
|
+
*/
|
|
173
|
+
export type SeverityDrift = 'stable' | 'noisy' | 'cry-wolf';
|
|
174
|
+
export declare const CRY_WOLF_RUN_COUNT = 10;
|
|
175
|
+
export declare const NOISY_RUN_COUNT = 5;
|
|
176
|
+
export declare const NOISY_FIX_RATE = 0.2;
|
|
177
|
+
export declare function computeSeverityDrift(memory: ProjectMemory, ruleId: string): SeverityDrift;
|
|
150
178
|
/**
|
|
151
179
|
* 1.7+ — A simple numeric score in [0, 1] that ranks suggestions by how
|
|
152
180
|
* likely the user is to act on them. Pairs with `computeRuleConfidence`
|
package/dist/core/memory.js
CHANGED
|
@@ -184,6 +184,28 @@ export function computeRuleConfidence(memory, ruleId) {
|
|
|
184
184
|
return 'low';
|
|
185
185
|
return 'medium';
|
|
186
186
|
}
|
|
187
|
+
export const CRY_WOLF_RUN_COUNT = 10;
|
|
188
|
+
export const NOISY_RUN_COUNT = 5;
|
|
189
|
+
export const NOISY_FIX_RATE = 0.2;
|
|
190
|
+
export function computeSeverityDrift(memory, ruleId) {
|
|
191
|
+
const obs = memory.rules[ruleId];
|
|
192
|
+
if (!obs)
|
|
193
|
+
return 'stable';
|
|
194
|
+
// Suppressed-in-config means the user has *explicitly* silenced the
|
|
195
|
+
// rule — that's a deliberate signal, not drift. Don't classify it
|
|
196
|
+
// here; the rule won't fire anyway and double-counting it as
|
|
197
|
+
// "cry-wolf" inflates the noisy-rules count in the confidence view.
|
|
198
|
+
if (obs.suppressedInConfig)
|
|
199
|
+
return 'stable';
|
|
200
|
+
if (obs.runCount >= CRY_WOLF_RUN_COUNT && obs.fixedCount === 0)
|
|
201
|
+
return 'cry-wolf';
|
|
202
|
+
if (obs.runCount >= NOISY_RUN_COUNT) {
|
|
203
|
+
const fixRate = obs.fixedCount / obs.runCount;
|
|
204
|
+
if (fixRate < NOISY_FIX_RATE)
|
|
205
|
+
return 'noisy';
|
|
206
|
+
}
|
|
207
|
+
return 'stable';
|
|
208
|
+
}
|
|
187
209
|
/**
|
|
188
210
|
* 1.7+ — A simple numeric score in [0, 1] that ranks suggestions by how
|
|
189
211
|
* likely the user is to act on them. Pairs with `computeRuleConfidence`
|
package/dist/core/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/core/prDiff.js
CHANGED
|
@@ -262,20 +262,34 @@ async function pickDefaultBase(rootPath) {
|
|
|
262
262
|
async function mkTempWorktreeDir() {
|
|
263
263
|
return fs.mkdtemp(path.join(os.tmpdir(), 'projscan-pr-diff-'));
|
|
264
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* 1.9+ — Default cap on any single `git` invocation. Previously git
|
|
267
|
+
* could hang forever if it landed in a credential prompt (a fetch
|
|
268
|
+
* against an inaccessible remote), a custom git hook that blocks on
|
|
269
|
+
* stdin, or a network filesystem that stalls. The MCP server inherits
|
|
270
|
+
* stdin from the host process — an interactive prompt has nowhere to
|
|
271
|
+
* return to and the watch/review/prDiff tool would hang the entire
|
|
272
|
+
* server. 30s is well above any honest local-repo operation and
|
|
273
|
+
* forces the hang to surface as an explicit timeout error.
|
|
274
|
+
*/
|
|
275
|
+
const DEFAULT_GIT_TIMEOUT_MS = 30_000;
|
|
265
276
|
function runGit(cwd, args, opts = {}) {
|
|
266
277
|
return new Promise((resolve, reject) => {
|
|
267
|
-
|
|
278
|
+
// Detach stdin so a git hook or credential prompt can't block
|
|
279
|
+
// waiting for input — it'll see EOF and exit instead of hanging.
|
|
280
|
+
const child = spawn('git', args, { cwd, env: process.env, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
268
281
|
let stdout = '';
|
|
269
282
|
let stderr = '';
|
|
270
283
|
let settled = false;
|
|
271
|
-
const
|
|
284
|
+
const effectiveTimeoutMs = opts.timeoutMs ?? DEFAULT_GIT_TIMEOUT_MS;
|
|
285
|
+
const timeout = effectiveTimeoutMs > 0
|
|
272
286
|
? setTimeout(() => {
|
|
273
287
|
if (settled)
|
|
274
288
|
return;
|
|
275
289
|
settled = true;
|
|
276
290
|
child.kill('SIGKILL');
|
|
277
|
-
reject(new Error(
|
|
278
|
-
},
|
|
291
|
+
reject(new Error(`git command timed out after ${effectiveTimeoutMs}ms`));
|
|
292
|
+
}, effectiveTimeoutMs)
|
|
279
293
|
: null;
|
|
280
294
|
child.stdout.on('data', (d) => (stdout += d.toString()));
|
|
281
295
|
child.stderr.on('data', (d) => (stderr += d.toString()));
|