projscan 1.8.1 → 1.10.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 (55) hide show
  1. package/README.md +2 -2
  2. package/dist/analyzers/securityCheck.js +5 -1
  3. package/dist/analyzers/securityCheck.js.map +1 -1
  4. package/dist/cli/commands/plugin.d.ts +6 -0
  5. package/dist/cli/commands/plugin.js +118 -0
  6. package/dist/cli/commands/plugin.js.map +1 -0
  7. package/dist/cli/index.js +2 -0
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/core/applyFix.d.ts +9 -0
  10. package/dist/core/applyFix.js +77 -1
  11. package/dist/core/applyFix.js.map +1 -1
  12. package/dist/core/codeGraph.js +14 -2
  13. package/dist/core/codeGraph.js.map +1 -1
  14. package/dist/core/intent.d.ts +94 -0
  15. package/dist/core/intent.js +472 -0
  16. package/dist/core/intent.js.map +1 -0
  17. package/dist/core/issueEngine.js +12 -0
  18. package/dist/core/issueEngine.js.map +1 -1
  19. package/dist/core/memory.d.ts +28 -0
  20. package/dist/core/memory.js +22 -0
  21. package/dist/core/memory.js.map +1 -1
  22. package/dist/core/plugins.d.ts +83 -0
  23. package/dist/core/plugins.js +209 -0
  24. package/dist/core/plugins.js.map +1 -0
  25. package/dist/core/prDiff.js +18 -4
  26. package/dist/core/prDiff.js.map +1 -1
  27. package/dist/core/repositoryScanner.js +6 -1
  28. package/dist/core/repositoryScanner.js.map +1 -1
  29. package/dist/core/review.d.ts +8 -0
  30. package/dist/core/review.js +56 -4
  31. package/dist/core/review.js.map +1 -1
  32. package/dist/core/taint.js +27 -4
  33. package/dist/core/taint.js.map +1 -1
  34. package/dist/core/watcher.d.ts +8 -0
  35. package/dist/core/watcher.js +56 -18
  36. package/dist/core/watcher.js.map +1 -1
  37. package/dist/mcp/tools/costSummary.js +259 -49
  38. package/dist/mcp/tools/costSummary.js.map +1 -1
  39. package/dist/mcp/tools/memory.js +8 -3
  40. package/dist/mcp/tools/memory.js.map +1 -1
  41. package/dist/mcp/tools/plugin.d.ts +13 -0
  42. package/dist/mcp/tools/plugin.js +87 -0
  43. package/dist/mcp/tools/plugin.js.map +1 -0
  44. package/dist/mcp/tools/review.js +7 -2
  45. package/dist/mcp/tools/review.js.map +1 -1
  46. package/dist/mcp/tools/reviewWatch.d.ts +121 -0
  47. package/dist/mcp/tools/reviewWatch.js +153 -17
  48. package/dist/mcp/tools/reviewWatch.js.map +1 -1
  49. package/dist/mcp/tools.js +2 -0
  50. package/dist/mcp/tools.js.map +1 -1
  51. package/dist/tool-manifest.json +51 -8
  52. package/dist/types.d.ts +35 -0
  53. package/dist/utils/changedFiles.js +25 -0
  54. package/dist/utils/changedFiles.js.map +1 -1
  55. 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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"}
@@ -14,6 +14,7 @@ import { check as pythonLinterCheck } from '../analyzers/pythonLinterCheck.js';
14
14
  import { check as pythonDependencyRiskCheck } from '../analyzers/pythonDependencyRiskCheck.js';
15
15
  import { check as pythonUnusedDependencyCheck } from '../analyzers/pythonUnusedDependencyCheck.js';
16
16
  import { loadMemory, recordRun, saveMemory } from './memory.js';
17
+ import { loadPlugins, runAnalyzerPlugins, pluginsEnabled } from './plugins.js';
17
18
  const checkers = [
18
19
  eslintCheck,
19
20
  prettierCheck,
@@ -39,6 +40,17 @@ const checkers = [
39
40
  export async function collectIssues(rootPath, files) {
40
41
  const results = await Promise.all(checkers.map((check) => check(rootPath, files)));
41
42
  const issues = results.flat();
43
+ // 1.10+ — fold in issues from loaded analyzer plugins. No-op unless
44
+ // PROJSCAN_PLUGINS_PREVIEW=1 is set; loadPlugins() short-circuits to []
45
+ // when the env flag is off, so users who haven't opted into the preview
46
+ // pay zero cost.
47
+ if (pluginsEnabled()) {
48
+ const plugins = await loadPlugins(rootPath);
49
+ if (plugins.length > 0) {
50
+ const pluginIssues = await runAnalyzerPlugins(plugins, rootPath, files);
51
+ issues.push(...pluginIssues);
52
+ }
53
+ }
42
54
  // Sort by severity: error > warning > info
43
55
  const severityOrder = { error: 0, warning: 1, info: 2 };
44
56
  issues.sort((a, b) => (severityOrder[a.severity] ?? 3) - (severityOrder[b.severity] ?? 3));
@@ -1 +1 @@
1
- {"version":3,"file":"issueEngine.js","sourceRoot":"","sources":["../../src/core/issueEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"issueEngine.js","sourceRoot":"","sources":["../../src/core/issueEngine.ts"],"names":[],"mappings":"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"}
@@ -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`
@@ -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`
@@ -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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"}