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.
- package/README.md +2 -2
- package/dist/analyzers/securityCheck.js +5 -1
- package/dist/analyzers/securityCheck.js.map +1 -1
- package/dist/cli/commands/plugin.d.ts +6 -0
- package/dist/cli/commands/plugin.js +118 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/applyFix.d.ts +9 -0
- package/dist/core/applyFix.js +77 -1
- package/dist/core/applyFix.js.map +1 -1
- package/dist/core/codeGraph.js +14 -2
- 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/issueEngine.js +12 -0
- package/dist/core/issueEngine.js.map +1 -1
- 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/plugins.d.ts +83 -0
- package/dist/core/plugins.js +209 -0
- package/dist/core/plugins.js.map +1 -0
- 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/taint.js +27 -4
- package/dist/core/taint.js.map +1 -1
- package/dist/core/watcher.d.ts +8 -0
- package/dist/core/watcher.js +56 -18
- package/dist/core/watcher.js.map +1 -1
- package/dist/mcp/tools/costSummary.js +259 -49
- package/dist/mcp/tools/costSummary.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/plugin.d.ts +13 -0
- package/dist/mcp/tools/plugin.js +87 -0
- package/dist/mcp/tools/plugin.js.map +1 -0
- 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/mcp/tools.js +2 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/tool-manifest.json +51 -8
- package/dist/types.d.ts +35 -0
- package/dist/utils/changedFiles.js +25 -0
- package/dist/utils/changedFiles.js.map +1 -1
- 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":"AAqGA,wEAAwE;AAExE;;;;;;GAMG;AACH,MAAM,eAAe,GAAuD;IAC1E,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC;IACtF,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC;IAC7F,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;IAC5F,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;IACrE,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC;IAC3G,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC;IAC3F,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC;IACvG,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;CAC/F,CAAC;AAEF;;;;GAIG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS;IAChC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IACpF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;IAC7E,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;IAC5E,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;IAC5E,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IAC5E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IACrE,kBAAkB;IAClB,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IACtE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ;IAC1E,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK;IAC1D,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ;IACzE,oEAAoE;IACpE,mEAAmE;IACnE,mEAAmE;IACnE,mEAAmE;IACnE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;IAC/D,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO;CACrE,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,SAAS,eAAe,CAAC,KAAa;IACpC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,GAA8B;IACxD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,qEAAqE;IACrE,gEAAgE;IAChE,8DAA8D;IAC9D,kEAAkE;IAClE,qEAAqE;IACrE,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzF,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,oEAAoE;IACpE,mEAAmE;IACnE,wDAAwD;IACxD,yCAAyC;IACzC,IAAI,UAAU,GAAiB,SAAS,CAAC;IACzC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAE9D,EAAE,CAAC;QACF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC1D,gEAAgE;YAChE,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,gBAAgB,OAAO,eAAe,EAAE,GAAG,CAAC,CAAC;YACnE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,OAAO;gBAAE,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YACtB,SAAS,GAAG,KAAK,CAAC;YAClB,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,iDAAiD;IACjD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC7B,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACjC,IAAI,eAAe,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,kEAAkE;QAClE,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,mEAAmE;QACnE,sDAAsD;QACtD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC9B,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAClC,IAAI,eAAe,CAAC,IAAI,CAAC;gBAAE,SAAS;YACpC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE;KAChC,CAAC;AACJ,CAAC;AAED,wEAAwE;AAExE;;;;;;;;;;GAUG;AACH,MAAM,YAAY,GAA2C;IAC3D,OAAO,EAAE,IAAI,GAAG,CAAc;QAC5B,YAAY;QACZ,eAAe;QACf,gBAAgB;QAChB,WAAW;QACX,YAAY;KACb,CAAC;IACF,GAAG,EAAE,IAAI,GAAG,CAAc;QACxB,eAAe;QACf,iBAAiB;QACjB,4BAA4B;KAC7B,CAAC;IACF,QAAQ,EAAE,IAAI,GAAG,CAAc;QAC7B,YAAY;QACZ,eAAe;QACf,cAAc;QACd,gBAAgB;QAChB,iBAAiB;QACjB,4BAA4B;QAC5B,WAAW;QACX,gBAAgB;KACjB,CAAC;IACF,IAAI,EAAE,IAAI,GAAG,CAAc;QACzB,eAAe;QACf,gBAAgB;QAChB,iBAAiB;QACjB,4BAA4B;KAC7B,CAAC;IACF,IAAI,EAAE,IAAI,GAAG,CAAc;QACzB,YAAY;QACZ,eAAe;QACf,cAAc;KACf,CAAC;IACF,IAAI,EAAE,IAAI,GAAG,CAAc;QACzB,YAAY;QACZ,eAAe;QACf,cAAc;KACf,CAAC;IACF,KAAK,EAAE,IAAI,GAAG,CAAc;QAC1B,WAAW;QACX,aAAa;QACb,YAAY;QACZ,eAAe;KAChB,CAAC;IACF,MAAM,EAAE,IAAI,GAAG,CAAc;QAC3B,cAAc;QACd,aAAa;KACd,CAAC;IACF,OAAO,EAAE,IAAI,GAAG,EAAe;CAChC,CAAC;AAEF;;;;;GAKG;AACH,SAAS,UAAU,CAAC,CAAS;IAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9B,OAAO,2CAA2C,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5D,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9B,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;QACpC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,sBAAsB,CAAC,KAAa,EAAE,MAAc;IAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7B,gEAAgE;IAChE,yDAAyD;IACzD,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3E,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACjE,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,EAAU;IAChC,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC;AAC3F,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAqB,EAAE,IAAY;IAC3D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,2BAA2B;IACtE,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAqB,EAAE,MAAc;IAC/D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CACf,MAAoB,EACpB,IAAiB,EACjB,OAAgB,EAChB,QAAiB;IAEjB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAClD,qEAAqE;IACrE,kEAAkE;IAClE,iEAAiE;IACjE,iEAAiE;IACjE,gEAAgE;IAChE,wDAAwD;IACxD,IAAI,gBAAgB,GAAG,OAAO,CAAC;IAC/B,IAAI,CAAC,gBAAgB,IAAI,QAAQ,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC;YAAE,gBAAgB,GAAG,IAAI,CAAC;QAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC;YAAE,gBAAgB,GAAG,IAAI,CAAC;IAChF,CAAC;IACD,iEAAiE;IACjE,+DAA+D;IAC/D,YAAY;IACZ,IAAI,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,QAAQ,GAAG,KAAK,CAAC;QACxE,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,QAAQ,GAAG,KAAK,CAAC;IAC1E,CAAC;IACD,IAAI,QAAQ,IAAI,gBAAgB;QAAE,OAAO,UAAU,CAAC;IACpD,IAAI,QAAQ,IAAI,CAAC,gBAAgB;QAAE,OAAO,cAAc,CAAC;IACzD,IAAI,gBAAgB;QAAE,OAAO,YAAY,CAAC;IAC1C,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,wEAAwE;AAExE;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAoB,EACpB,MAAoB;IAEpB,MAAM,MAAM,GAAoC;QAC9C,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,CAAC;QACb,cAAc,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;KACX,CAAC;IACF,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACpC,MAAM,IAAI,GACR,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC;QAClG,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;QAClE,CAAC,CAAC,eAAe,GAAG,SAAS,CAAC;QAC9B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,YAAY,EAAE;gBACtC,SAAS;gBACT,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GACR,EAAE,CAAC,MAAM,KAAK,OAAO;YACnB,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,QAAQ;gBACtB,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,4BAA4B,CAAC;QACrC,MAAM,OAAO,GACX,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACnG,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3D,EAAE,CAAC,eAAe,GAAG,SAAS,CAAC;QAC/B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,oBAAoB,GAAG;gBACzE,SAAS;gBACT,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC;aACzD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAgB,CAAC,CAAC,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACtF,sDAAsD;QACtD,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC,CAAC,eAAe,GAAG,SAAS,CAAC;QAC9B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,GAAG,CAAC,CAAC,cAAc,WAAW,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACvH,SAAS;gBACT,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,eAAe,GAAG,SAAS,CAAC;QAC9B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,GAAG,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,MAAM,GAAG;gBAC9D,SAAS;gBACT,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC3C,6DAA6D;QAC7D,iEAAiE;QACjE,sDAAsD;QACtD,MAAM,OAAO,GACX,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;QAC7F,MAAM,WAAW,GAAG;YAClB,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/B,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACjC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACjC,CAAC;QACF,MAAM,OAAO,GACX,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,YAAY,CAAC;YACtD,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACrD,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC;QAChC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,GAAG,GAAG,CAAC,YAAY,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC/F,SAAS;gBACT,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,IAAI,GAAoC;YAC5C,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;YACjB,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;SACX,CAAC;QACF,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAChB,MAAoB,EACpB,IAAiB,EACjB,OAAgB,EAChB,QAAiB;IAEjB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,wCAAwC,CAAC;IAClD,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,IAAI,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO,wDAAwD,CAAC;IAClE,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,IAAI,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO,+CAA+C,CAAC;IACzD,CAAC;IACD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW,CAAC;QACjB,KAAK,gBAAgB;YACnB,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1G,OAAO,cAAc,MAAM,yCAAyC,CAAC;YACvE,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,KAAK,WAAW;YACd,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACpF,OAAO,cAAc,MAAM,kCAAkC,CAAC;YAChE,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,KAAK,YAAY;YACf,OAAO,cAAc,MAAM,sDAAsD,CAAC;QACpF,KAAK,gBAAgB;YACnB,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC1C,OAAO,cAAc,MAAM,4CAA4C,CAAC;YAC1E,CAAC;YACD,OAAO,EAAE,CAAC;QACZ;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAiB,EACjB,QAAwB;IAExB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC3E,MAAM,IAAI,GACR,MAAM,CAAC,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,YAAY,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;QAC1K,CAAC,CAAC,iBAAiB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IAC/G,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CACV,GAAG,MAAM,CAAC,UAAU,yCAAyC,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CACxG,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,uCAAuC,CAAC,CAAC;IACjF,CAAC;AACH,CAAC"}
|
package/dist/core/issueEngine.js
CHANGED
|
@@ -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":"AACA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,KAAK,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,KAAK,IAAI,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,KAAK,IAAI,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAC3F,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,KAAK,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,KAAK,IAAI,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAC/F,OAAO,EAAE,KAAK,IAAI,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"issueEngine.js","sourceRoot":"","sources":["../../src/core/issueEngine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,KAAK,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,KAAK,IAAI,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,KAAK,IAAI,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAC3F,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,KAAK,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,KAAK,IAAI,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAC/F,OAAO,EAAE,KAAK,IAAI,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI/E,MAAM,QAAQ,GAAc;IAC1B,WAAW;IACX,aAAa;IACb,SAAS;IACT,iBAAiB;IACjB,mBAAmB;IACnB,aAAa;IACb,qBAAqB;IACrB,aAAa;IACb,uEAAuE;IACvE,0EAA0E;IAC1E,UAAU;IACV,wEAAwE;IACxE,qEAAqE;IACrE,uBAAuB;IACvB,uEAAuE;IACvE,uBAAuB;IACvB,eAAe;IACf,iBAAiB;IACjB,yBAAyB;IACzB,2BAA2B;CAC5B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,KAAkB;IACtE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE9B,oEAAoE;IACpE,wEAAwE;IACxE,wEAAwE;IACxE,iBAAiB;IACjB,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,MAAM,aAAa,GAA2B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAChF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3F,qEAAqE;IACrE,sEAAsE;IACtE,qEAAqE;IACrE,oEAAoE;IACpE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,OAAO;YAAE,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC;IAC/C,CAAC;IAED,qEAAqE;IACrE,oEAAoE;IACpE,sEAAsE;IACtE,oEAAoE;IACpE,mEAAmE;IACnE,KAAK,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,MAAe;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC;QACzF,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACvB,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC"}
|
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":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AACtC,MAAM,eAAe,GAAG,aAAa,CAAC;AACtC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC,4CAA4C;AAC5C,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC;AA+D1B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,KAAK,qBAAqB,EAAE,CAAC;QAC7E,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,gEAAgE;IAChE,kDAAkD;IAClD,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,MAAqB;IACtE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CACvB,MAAqB,EACrB,UAA4B,EAC5B,gBAAkC,EAAE;IAEpC,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IAE7C,oEAAoE;IACpE,mDAAmD;IACnD,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,gBAAgB,GACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC;QAC9E,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;YAC9E,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC;YAC7B,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC;YACvB,QAAQ,CAAC,kBAAkB,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;gBACrB,MAAM;gBACN,WAAW,EAAE,MAAM;gBACnB,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,CAAC;gBACX,UAAU,EAAE,CAAC;gBACb,kBAAkB,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;aAC9C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,8BAA8B;IAC9B,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,QAAQ;YAAE,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACtB,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,gBAAgB,GAAG,UAAU,CAAC;IAC/C,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAI,GAAG,CAAC,kBAAkB;YAAE,SAAS;QACrC,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC;YAAE,SAAS;QACjC,IAAI,GAAG,CAAC,QAAQ,GAAG,qBAAqB;YAAE,SAAS;QACnD,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,QAAQ;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IACD,qDAAqD;IACrD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC;AACb,CAAC;AAsBD,MAAM,UAAU,qBAAqB,CAAC,MAAqB,EAAE,MAAc;IACzE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC1B,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,GAAG,CAAC,QAAQ,GAAG,qBAAqB;QAAE,OAAO,QAAQ,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,gBAAgB,GAAG,UAAU,CAAC;IAC/C,sEAAsE;IACtE,sEAAsE;IACtE,gEAAgE;IAChE,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAqB,EAAE,MAAc;IAC9E,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,2DAA2D;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,MAAqB,EAAE,MAAc;IAC9D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAqB,EACrB,QAA2E;IAE3E,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC;YAC7B,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC;YACvB,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;gBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,MAAM;gBACnB,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,KAAK,CAAC,EAAE;gBAChB,SAAS,EAAE,KAAK,CAAC,KAAK;aACvB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,UAAU,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1D,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM;YAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAqB;IACxD,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;IACpC,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,IAAI,GAAG,CAAC,QAAQ,GAAG,aAAa;YAAE,SAAS;QAC3C,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,MAAqB,EAAE,IAAY;IAC/D,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAqB;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,UAAU,CAAC;IACzD,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,aAAa,EAAE,qBAAqB;QACpC,aAAa,EAAE,GAAG;QAClB,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,CAAC;KACb,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CACL,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ;QACnC,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ;QACnC,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAC/B,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAC5B,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"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"}
|