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
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { loadSession } from '../../core/session.js';
|
|
2
|
+
const DEFAULT_STREAM_INTERVAL_S = 10;
|
|
3
|
+
const MIN_STREAM_INTERVAL_S = 2;
|
|
4
|
+
const MAX_STREAM_INTERVAL_S = 600;
|
|
2
5
|
/**
|
|
3
6
|
* 1.7+ — `projscan_cost_summary`. Aggregate token-cost analytics
|
|
4
7
|
* derived from the session event log. Builds on the `_cost` sidecar
|
|
@@ -25,68 +28,275 @@ import { loadSession } from '../../core/session.js';
|
|
|
25
28
|
*/
|
|
26
29
|
export const costSummaryTool = {
|
|
27
30
|
name: 'projscan_cost_summary',
|
|
28
|
-
description: 'Aggregate token-cost analytics from the current session\'s tool-call history.
|
|
31
|
+
description: 'Aggregate token-cost analytics from the current session\'s tool-call history. action:"snapshot" (default) returns total tokens spent, top spenders, per-tool typical/p95 estimates, and a static expected-cost catalog so the agent can budget pre-call. 1.10+: action:"start_stream" / "stop_stream" / "list_streams" turns this into a live cost dashboard — the server polls the session log on an interval and emits notifications/projscan/cost_delta whenever new tool calls have accrued, with the per-tool deltas and the new cumulative totals inline. Pairs with the `_cost` sidecar attached to every tool result. Read-only. Note: the session event log is bounded at 500 entries — for long-running sessions, older calls are dropped from the snapshot.',
|
|
29
32
|
inputSchema: {
|
|
30
33
|
type: 'object',
|
|
31
34
|
properties: {
|
|
35
|
+
action: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
enum: ['snapshot', 'start_stream', 'stop_stream', 'list_streams'],
|
|
38
|
+
description: '"snapshot" (default) returns the current aggregate. "start_stream" begins a live cost-delta watch. "stop_stream" cancels by stream_id. "list_streams" enumerates active streams.',
|
|
39
|
+
},
|
|
32
40
|
top: {
|
|
33
41
|
type: 'number',
|
|
34
|
-
description: 'Optional. Number of top spenders to return. Default: 10.',
|
|
42
|
+
description: 'Optional. Number of top spenders to return. Default: 10. (snapshot + start_stream)',
|
|
43
|
+
},
|
|
44
|
+
interval_seconds: {
|
|
45
|
+
type: 'number',
|
|
46
|
+
description: `Stream poll interval in seconds. Default: ${DEFAULT_STREAM_INTERVAL_S}. Min: ${MIN_STREAM_INTERVAL_S}, max: ${MAX_STREAM_INTERVAL_S}. (start_stream only)`,
|
|
47
|
+
},
|
|
48
|
+
stream_id: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: 'Stream identifier returned by a previous start_stream. (stop_stream only)',
|
|
35
51
|
},
|
|
36
52
|
},
|
|
37
53
|
},
|
|
38
|
-
handler: async (args, rootPath) => {
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
54
|
+
handler: async (args, rootPath, context) => {
|
|
55
|
+
const action = typeof args.action === 'string' ? args.action : 'snapshot';
|
|
56
|
+
switch (action) {
|
|
57
|
+
case 'snapshot':
|
|
58
|
+
return computeSnapshot(rootPath, args);
|
|
59
|
+
case 'start_stream':
|
|
60
|
+
return startStream(rootPath, args, context);
|
|
61
|
+
case 'stop_stream':
|
|
62
|
+
return stopStream(args, context);
|
|
63
|
+
case 'list_streams':
|
|
64
|
+
return listStreams();
|
|
65
|
+
default:
|
|
66
|
+
throw new Error(`Unknown action "${action}". Known: snapshot, start_stream, stop_stream, list_streams.`);
|
|
49
67
|
}
|
|
50
|
-
|
|
51
|
-
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
const streams = new Map();
|
|
71
|
+
async function computeSnapshot(rootPath, args) {
|
|
72
|
+
const top = typeof args.top === 'number' && Number.isFinite(args.top) && args.top > 0
|
|
73
|
+
? Math.min(50, Math.floor(args.top))
|
|
74
|
+
: 10;
|
|
75
|
+
const { session } = await loadSession(rootPath);
|
|
76
|
+
const buckets = bucketize(session.events);
|
|
77
|
+
let totalCalls = 0;
|
|
78
|
+
let totalEstimatedTokens = 0;
|
|
79
|
+
for (const bucket of buckets.values()) {
|
|
80
|
+
totalCalls += bucket.callCount;
|
|
81
|
+
totalEstimatedTokens += bucket.totalTokens;
|
|
82
|
+
}
|
|
83
|
+
const ranked = [...buckets.values()].sort((a, b) => b.totalTokens - a.totalTokens);
|
|
84
|
+
const topSpenders = ranked.slice(0, top).map((b) => ({
|
|
85
|
+
tool: b.tool,
|
|
86
|
+
totalTokens: b.totalTokens,
|
|
87
|
+
callCount: b.callCount,
|
|
88
|
+
averageTokens: b.callCount > 0 ? Math.round(b.totalTokens / b.callCount) : 0,
|
|
89
|
+
}));
|
|
90
|
+
// 1.8+ — only report a real p95 when we have enough samples for it
|
|
91
|
+
// to be meaningful. With < MIN_P95_SAMPLES, sorted[len*0.95] just
|
|
92
|
+
// returns the observed maximum, which agents misinterpret as a
|
|
93
|
+
// representative high-water mark for budgeting. We surface null and
|
|
94
|
+
// an explicit `insufficientSamples: true` flag so the agent knows
|
|
95
|
+
// to fall back to expectedTokens or wait for more data.
|
|
96
|
+
const MIN_P95_SAMPLES = 20;
|
|
97
|
+
const perToolCatalog = ranked.map((b) => {
|
|
98
|
+
const sorted = [...b.tokenSamples].sort((x, y) => x - y);
|
|
99
|
+
const median = sorted.length === 0 ? 0 : sorted[Math.floor(sorted.length / 2)];
|
|
100
|
+
const hasEnoughForP95 = sorted.length >= MIN_P95_SAMPLES;
|
|
101
|
+
const p95 = hasEnoughForP95
|
|
102
|
+
? sorted[Math.min(sorted.length - 1, Math.floor(sorted.length * 0.95))]
|
|
103
|
+
: null;
|
|
104
|
+
return {
|
|
52
105
|
tool: b.tool,
|
|
53
|
-
|
|
106
|
+
observedTypicalTokens: median,
|
|
107
|
+
observedP95Tokens: p95,
|
|
108
|
+
observedP95InsufficientSamples: !hasEnoughForP95,
|
|
54
109
|
callCount: b.callCount,
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
110
|
+
expectedTokens: STATIC_EXPECTED_TOKENS[b.tool] ?? null,
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
sessionId: session.id,
|
|
115
|
+
totalCalls,
|
|
116
|
+
totalEstimatedTokens,
|
|
117
|
+
averageTokens: totalCalls > 0 ? Math.round(totalEstimatedTokens / totalCalls) : 0,
|
|
118
|
+
topSpenders,
|
|
119
|
+
perToolCatalog,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
async function startStream(rootPath, args, context) {
|
|
123
|
+
const requested = typeof args.interval_seconds === 'number' && Number.isFinite(args.interval_seconds)
|
|
124
|
+
? args.interval_seconds
|
|
125
|
+
: DEFAULT_STREAM_INTERVAL_S;
|
|
126
|
+
const intervalSeconds = clamp(requested, MIN_STREAM_INTERVAL_S, MAX_STREAM_INTERVAL_S);
|
|
127
|
+
const intervalMs = Math.round(intervalSeconds * 1000);
|
|
128
|
+
// Seed last-seen counts so the first tick after start reports only NEW
|
|
129
|
+
// calls — the initial snapshot is the baseline. Without this, every
|
|
130
|
+
// existing event in the session log would be reported as a delta.
|
|
131
|
+
const { session } = await loadSession(rootPath);
|
|
132
|
+
const initialBuckets = bucketize(session.events);
|
|
133
|
+
const lastSeenCalls = {};
|
|
134
|
+
let lastTotalCalls = 0;
|
|
135
|
+
let lastTotalTokens = 0;
|
|
136
|
+
for (const b of initialBuckets.values()) {
|
|
137
|
+
lastSeenCalls[b.tool] = b.callCount;
|
|
138
|
+
lastTotalCalls += b.callCount;
|
|
139
|
+
lastTotalTokens += b.totalTokens;
|
|
140
|
+
}
|
|
141
|
+
if (!context?.registerWatch || !context.notify) {
|
|
80
142
|
return {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
143
|
+
action: 'start_stream',
|
|
144
|
+
streamId: null,
|
|
145
|
+
registered: false,
|
|
146
|
+
reason: 'No notify channel — server was started without one (or this is a non-MCP caller). Subscribe to the MCP notify channel to receive cost_delta updates.',
|
|
147
|
+
intervalSeconds,
|
|
148
|
+
baseline: { totalCalls: lastTotalCalls, totalEstimatedTokens: lastTotalTokens },
|
|
87
149
|
};
|
|
88
|
-
}
|
|
89
|
-
|
|
150
|
+
}
|
|
151
|
+
let timer = null;
|
|
152
|
+
const streamId = context.registerWatch(() => {
|
|
153
|
+
if (timer)
|
|
154
|
+
clearInterval(timer);
|
|
155
|
+
timer = null;
|
|
156
|
+
streams.delete(streamId);
|
|
157
|
+
});
|
|
158
|
+
streams.set(streamId, {
|
|
159
|
+
streamId,
|
|
160
|
+
intervalMs,
|
|
161
|
+
startedAt: new Date().toISOString(),
|
|
162
|
+
ticks: 0,
|
|
163
|
+
lastSeenCalls,
|
|
164
|
+
lastTotalTokens,
|
|
165
|
+
lastTotalCalls,
|
|
166
|
+
inFlight: false,
|
|
167
|
+
});
|
|
168
|
+
const tick = () => {
|
|
169
|
+
void runCostTick(rootPath, streamId, context);
|
|
170
|
+
};
|
|
171
|
+
timer = setInterval(tick, intervalMs);
|
|
172
|
+
// Don't keep the process alive on the polling timer alone.
|
|
173
|
+
if (typeof timer.unref === 'function')
|
|
174
|
+
timer.unref();
|
|
175
|
+
return {
|
|
176
|
+
action: 'start_stream',
|
|
177
|
+
streamId,
|
|
178
|
+
registered: true,
|
|
179
|
+
intervalSeconds,
|
|
180
|
+
baseline: { totalCalls: lastTotalCalls, totalEstimatedTokens: lastTotalTokens },
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async function runCostTick(rootPath, streamId, context) {
|
|
184
|
+
const state = streams.get(streamId);
|
|
185
|
+
if (!state)
|
|
186
|
+
return;
|
|
187
|
+
// Single-flight guard. Session reads are fast but disk hiccups (slow
|
|
188
|
+
// NFS, contended writes) could overlap; we don't queue, the next tick
|
|
189
|
+
// picks up the latest state.
|
|
190
|
+
if (state.inFlight)
|
|
191
|
+
return;
|
|
192
|
+
state.inFlight = true;
|
|
193
|
+
state.ticks += 1;
|
|
194
|
+
try {
|
|
195
|
+
let session;
|
|
196
|
+
try {
|
|
197
|
+
const loaded = await loadSession(rootPath);
|
|
198
|
+
session = loaded.session;
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
context.notify?.('notifications/projscan/cost_stream_error', {
|
|
202
|
+
streamId,
|
|
203
|
+
error: err instanceof Error ? err.message : String(err),
|
|
204
|
+
});
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const buckets = bucketize(session.events);
|
|
208
|
+
const perToolDelta = [];
|
|
209
|
+
let newTotalCalls = 0;
|
|
210
|
+
let newTotalTokens = 0;
|
|
211
|
+
const seen = new Set();
|
|
212
|
+
for (const b of buckets.values()) {
|
|
213
|
+
seen.add(b.tool);
|
|
214
|
+
newTotalCalls += b.callCount;
|
|
215
|
+
newTotalTokens += b.totalTokens;
|
|
216
|
+
const prevCalls = state.lastSeenCalls[b.tool] ?? 0;
|
|
217
|
+
const callsAdded = b.callCount - prevCalls;
|
|
218
|
+
if (callsAdded > 0) {
|
|
219
|
+
// The session log is bounded to 500 entries — a per-tool count can
|
|
220
|
+
// also DECREASE when old events for that tool roll off. We only
|
|
221
|
+
// surface positive deltas (new calls); a decrease just adjusts
|
|
222
|
+
// the running baseline without firing a delta event.
|
|
223
|
+
const tokensAdded = b.totalTokens - (prevToolTokens(state, b, prevCalls) ?? 0);
|
|
224
|
+
perToolDelta.push({
|
|
225
|
+
tool: b.tool,
|
|
226
|
+
callsAdded,
|
|
227
|
+
tokensAdded: Math.max(0, tokensAdded),
|
|
228
|
+
cumulativeCalls: b.callCount,
|
|
229
|
+
cumulativeTokens: b.totalTokens,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
state.lastSeenCalls[b.tool] = b.callCount;
|
|
233
|
+
}
|
|
234
|
+
// Drop tools that have fully aged out of the log so the state map
|
|
235
|
+
// doesn't grow forever.
|
|
236
|
+
for (const tool of Object.keys(state.lastSeenCalls)) {
|
|
237
|
+
if (!seen.has(tool))
|
|
238
|
+
delete state.lastSeenCalls[tool];
|
|
239
|
+
}
|
|
240
|
+
if (perToolDelta.length === 0)
|
|
241
|
+
return; // nothing new — silent tick
|
|
242
|
+
state.lastTotalCalls = newTotalCalls;
|
|
243
|
+
state.lastTotalTokens = newTotalTokens;
|
|
244
|
+
context.notify?.('notifications/projscan/cost_delta', {
|
|
245
|
+
streamId,
|
|
246
|
+
sessionId: session.id,
|
|
247
|
+
perTool: perToolDelta,
|
|
248
|
+
cumulative: {
|
|
249
|
+
totalCalls: newTotalCalls,
|
|
250
|
+
totalEstimatedTokens: newTotalTokens,
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
finally {
|
|
255
|
+
state.inFlight = false;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* The session event log is bounded; we don't carry per-tool token history
|
|
260
|
+
* across ticks beyond a single call count. Approximating tokens-added by
|
|
261
|
+
* (current total - prior average × prior count) is fragile, so we just
|
|
262
|
+
* round up using the bucket's own token-per-call ratio. Good enough for
|
|
263
|
+
* an at-a-glance dashboard; downstream agents that need exact attribution
|
|
264
|
+
* can call action:"snapshot" for the canonical view.
|
|
265
|
+
*/
|
|
266
|
+
function prevToolTokens(state, bucket, prevCalls) {
|
|
267
|
+
if (bucket.callCount === 0 || prevCalls === 0)
|
|
268
|
+
return 0;
|
|
269
|
+
return Math.round((bucket.totalTokens / bucket.callCount) * prevCalls);
|
|
270
|
+
}
|
|
271
|
+
function stopStream(args, context) {
|
|
272
|
+
const streamId = typeof args.stream_id === 'string' ? args.stream_id : '';
|
|
273
|
+
if (!streamId)
|
|
274
|
+
throw new Error('stop_stream action requires a "stream_id" argument');
|
|
275
|
+
const knownLocally = streams.has(streamId);
|
|
276
|
+
// The server's registerWatch cancel callback already deletes from `streams`.
|
|
277
|
+
const cancelled = context?.unregisterWatch?.(streamId) ?? false;
|
|
278
|
+
// If the server didn't know about the watch (e.g., cross-transport),
|
|
279
|
+
// make sure our local map is also clean.
|
|
280
|
+
if (streams.has(streamId))
|
|
281
|
+
streams.delete(streamId);
|
|
282
|
+
return { action: 'stop_stream', streamId, cancelled: cancelled || knownLocally };
|
|
283
|
+
}
|
|
284
|
+
function listStreams() {
|
|
285
|
+
return {
|
|
286
|
+
action: 'list_streams',
|
|
287
|
+
streams: [...streams.values()].map((s) => ({
|
|
288
|
+
streamId: s.streamId,
|
|
289
|
+
startedAt: s.startedAt,
|
|
290
|
+
intervalMs: s.intervalMs,
|
|
291
|
+
ticks: s.ticks,
|
|
292
|
+
lastTotalCalls: s.lastTotalCalls,
|
|
293
|
+
lastTotalTokens: s.lastTotalTokens,
|
|
294
|
+
})),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
function clamp(v, lo, hi) {
|
|
298
|
+
return Math.max(lo, Math.min(hi, v));
|
|
299
|
+
}
|
|
90
300
|
function bucketize(events) {
|
|
91
301
|
const buckets = new Map();
|
|
92
302
|
for (const ev of events) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"costSummary.js","sourceRoot":"","sources":["../../../src/mcp/tools/costSummary.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"costSummary.js","sourceRoot":"","sources":["../../../src/mcp/tools/costSummary.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools/memory.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { computeRuleConfidence, computeRuleConfidenceScore, findAcceptedHotspots, findStableRules, forgetHotspot, forgetRule, loadMemory, saveMemory, } from '../../core/memory.js';
|
|
1
|
+
import { computeRuleConfidence, computeRuleConfidenceScore, computeSeverityDrift, findAcceptedHotspots, findStableRules, forgetHotspot, forgetRule, loadMemory, saveMemory, } from '../../core/memory.js';
|
|
2
2
|
/**
|
|
3
3
|
* `projscan_memory` (1.5+) — surface the local Project Memory store
|
|
4
4
|
* so an agent (or the user via the CLI) can see which issues this
|
|
@@ -25,7 +25,7 @@ export const memoryTool = {
|
|
|
25
25
|
action: {
|
|
26
26
|
type: 'string',
|
|
27
27
|
enum: ['current', 'stable', 'runs', 'accepted', 'confidence', 'forget', 'forget-hotspot'],
|
|
28
|
-
description: 'Subaction. "current" returns aggregate counts. "stable" returns long-running rules with a config-snippet suggestion. "runs" returns every tracked rule. "accepted" (1.5+) returns files Project Memory marks as accepted load-bearing debt (top-K hotspot for ≥ 5 runs over ≥ 7 days without improving). "confidence" (1.7+) returns each tracked rule labelled high/medium/low based on observed fix-rate — high = user has fixed instances; low = persistently ignored. "forget" drops one rule. "forget-hotspot" drops one file from hotspot memory.',
|
|
28
|
+
description: 'Subaction. "current" returns aggregate counts. "stable" returns long-running rules with a config-snippet suggestion. "runs" returns every tracked rule. "accepted" (1.5+) returns files Project Memory marks as accepted load-bearing debt (top-K hotspot for ≥ 5 runs over ≥ 7 days without improving). "confidence" (1.7+) returns each tracked rule labelled high/medium/low based on observed fix-rate — high = user has fixed instances; low = persistently ignored. 1.9+: each rule also carries a `drift` label (stable / noisy / cry-wolf) so the agent can deprioritize rules the user has effectively classified as false positives. "forget" drops one rule. "forget-hotspot" drops one file from hotspot memory.',
|
|
29
29
|
},
|
|
30
30
|
rule: {
|
|
31
31
|
type: 'string',
|
|
@@ -149,18 +149,23 @@ function confidenceView(memory) {
|
|
|
149
149
|
ruleId,
|
|
150
150
|
level: computeRuleConfidence(memory, ruleId),
|
|
151
151
|
score: Number(computeRuleConfidenceScore(memory, ruleId).toFixed(3)),
|
|
152
|
+
drift: computeSeverityDrift(memory, ruleId),
|
|
152
153
|
runCount: obs.runCount,
|
|
153
154
|
fixedCount: obs.fixedCount,
|
|
154
155
|
};
|
|
155
156
|
})
|
|
156
157
|
.sort((a, b) => b.score - a.score);
|
|
157
158
|
const counts = { high: 0, medium: 0, low: 0 };
|
|
158
|
-
|
|
159
|
+
const driftCounts = { stable: 0, noisy: 0, 'cry-wolf': 0 };
|
|
160
|
+
for (const r of ranked) {
|
|
159
161
|
counts[r.level] += 1;
|
|
162
|
+
driftCounts[r.drift] += 1;
|
|
163
|
+
}
|
|
160
164
|
return {
|
|
161
165
|
totalRuns: memory.totalRuns,
|
|
162
166
|
rulesTracked: ranked.length,
|
|
163
167
|
counts,
|
|
168
|
+
driftCounts,
|
|
164
169
|
rules: ranked,
|
|
165
170
|
};
|
|
166
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { McpTool } from './_shared.js';
|
|
2
|
+
/**
|
|
3
|
+
* `projscan_plugin` (1.10+ preview) — discover and validate third-party
|
|
4
|
+
* analyzer plugins under `<root>/.projscan-plugins/*.projscan-plugin.json`.
|
|
5
|
+
*
|
|
6
|
+
* Behind the PROJSCAN_PLUGINS_PREVIEW=1 feature flag. The tool is always
|
|
7
|
+
* registered (so agents can probe for it), but `action:"list"` returns
|
|
8
|
+
* `enabled:false` and an empty list when the flag is off, so callers can
|
|
9
|
+
* detect that the preview is dark without an extra `enabled` check.
|
|
10
|
+
*
|
|
11
|
+
* The plugin schema and discovery path may still change before 2.0.
|
|
12
|
+
*/
|
|
13
|
+
export declare const pluginTool: McpTool;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { PLUGIN_PREVIEW_FLAG, discoverPluginManifests, pluginsEnabled, validateManifest, } from '../../core/plugins.js';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
/**
|
|
4
|
+
* `projscan_plugin` (1.10+ preview) — discover and validate third-party
|
|
5
|
+
* analyzer plugins under `<root>/.projscan-plugins/*.projscan-plugin.json`.
|
|
6
|
+
*
|
|
7
|
+
* Behind the PROJSCAN_PLUGINS_PREVIEW=1 feature flag. The tool is always
|
|
8
|
+
* registered (so agents can probe for it), but `action:"list"` returns
|
|
9
|
+
* `enabled:false` and an empty list when the flag is off, so callers can
|
|
10
|
+
* detect that the preview is dark without an extra `enabled` check.
|
|
11
|
+
*
|
|
12
|
+
* The plugin schema and discovery path may still change before 2.0.
|
|
13
|
+
*/
|
|
14
|
+
export const pluginTool = {
|
|
15
|
+
name: 'projscan_plugin',
|
|
16
|
+
description: '1.10+ preview. Discover and validate third-party analyzer plugins under .projscan-plugins/. Gated by the PROJSCAN_PLUGINS_PREVIEW=1 env flag; the schema is preview-only and may shift before 2.0. Use action:"list" to see what is discoverable today, action:"validate" to check a manifest before committing it.',
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
action: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
enum: ['list', 'validate'],
|
|
23
|
+
description: '"list" enumerates manifests under <root>/.projscan-plugins/ with discovery status. "validate" lints a manifest at the given path against the 1.10 schema.',
|
|
24
|
+
},
|
|
25
|
+
manifest_path: {
|
|
26
|
+
type: 'string',
|
|
27
|
+
description: '"validate" only — repo-relative or absolute path to a *.projscan-plugin.json file.',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
handler: async (args, rootPath) => {
|
|
32
|
+
const action = typeof args.action === 'string' ? args.action : 'list';
|
|
33
|
+
switch (action) {
|
|
34
|
+
case 'list': {
|
|
35
|
+
const entries = await discoverPluginManifests(rootPath);
|
|
36
|
+
return {
|
|
37
|
+
enabled: pluginsEnabled(),
|
|
38
|
+
envFlag: PLUGIN_PREVIEW_FLAG,
|
|
39
|
+
count: entries.length,
|
|
40
|
+
plugins: entries.map((e) => ({
|
|
41
|
+
manifestPath: e.manifestPath,
|
|
42
|
+
ok: e.manifest !== null,
|
|
43
|
+
...(e.manifest
|
|
44
|
+
? {
|
|
45
|
+
name: e.manifest.name,
|
|
46
|
+
kind: e.manifest.kind,
|
|
47
|
+
module: e.manifest.module,
|
|
48
|
+
category: e.manifest.category,
|
|
49
|
+
description: e.manifest.description,
|
|
50
|
+
}
|
|
51
|
+
: { error: e.error }),
|
|
52
|
+
})),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
case 'validate': {
|
|
56
|
+
const p = typeof args.manifest_path === 'string' ? args.manifest_path : '';
|
|
57
|
+
if (!p)
|
|
58
|
+
throw new Error('validate action requires a "manifest_path" argument');
|
|
59
|
+
let raw;
|
|
60
|
+
try {
|
|
61
|
+
raw = await fs.readFile(p, 'utf-8');
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
return {
|
|
65
|
+
ok: false,
|
|
66
|
+
error: `unable to read manifest: ${err instanceof Error ? err.message : String(err)}`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
let parsed;
|
|
70
|
+
try {
|
|
71
|
+
parsed = JSON.parse(raw);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
return {
|
|
75
|
+
ok: false,
|
|
76
|
+
error: `invalid JSON: ${err instanceof Error ? err.message : String(err)}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const v = validateManifest(parsed);
|
|
80
|
+
return v.ok ? { ok: true, manifest: v.manifest } : { ok: false, error: v.reason };
|
|
81
|
+
}
|
|
82
|
+
default:
|
|
83
|
+
throw new Error(`Unknown action "${action}". Known: list, validate.`);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/mcp/tools/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools/review.js
CHANGED
|
@@ -3,7 +3,7 @@ import { detectWorkspaces, filterFilesByPackage } from '../../core/monorepo.js';
|
|
|
3
3
|
import { emitProgress } from '../progress.js';
|
|
4
4
|
export const reviewTool = {
|
|
5
5
|
name: 'projscan_review',
|
|
6
|
-
description: 'One-call PR review. Combines projscan_pr_diff + per-changed-file risk score + new/expanded import cycles + risky function additions + dependency changes, plus a verdict ("ok" | "review" | "block") with a one-line summary. Use when an agent is asked "is this PR safe to merge?" Defaults: base=origin/main (falls back to main/master/HEAD~1), head=HEAD. Pass `max_cost_tokens` (1.5+) to get a budget-shaped response: <3000 returns verdict-only, <7000 returns a summary, otherwise the full review.',
|
|
6
|
+
description: 'One-call PR review. Combines projscan_pr_diff + per-changed-file risk score + new/expanded import cycles + risky function additions + dependency changes, plus a verdict ("ok" | "review" | "block") with a one-line summary. Use when an agent is asked "is this PR safe to merge?" Defaults: base=origin/main (falls back to main/master/HEAD~1), head=HEAD. Pass `max_cost_tokens` (1.5+) to get a budget-shaped response: <3000 returns verdict-only, <7000 returns a summary, otherwise the full review. 1.9+: pass `intent` (a free-text PR description like "refactor auth middleware" or "docs: fix codex setup") to get an intent-grounded review — each finding is labelled expected / unexpected / out-of-scope against the stated intent. Verdict is unchanged; this is an extra narration layer.',
|
|
7
7
|
inputSchema: {
|
|
8
8
|
type: 'object',
|
|
9
9
|
properties: {
|
|
@@ -24,14 +24,19 @@ export const reviewTool = {
|
|
|
24
24
|
type: 'string',
|
|
25
25
|
description: 'Optional. Workspace package name to scope all sections of the review to a single package.',
|
|
26
26
|
},
|
|
27
|
+
intent: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: '1.9+ — free-text description of what the PR is trying to do. projscan parses this into an action (feature / fix / refactor / perf / test / docs / chore / remove) plus scope tokens, then labels every finding as expected / unexpected / out-of-scope against that intent. Returns an `intent` echo and an `intentAnalysis` summary; per-finding labels appear as `intentAlignment` on each changedFile / riskyFunction / newCycle / newTaintFlow / dependencyChange. Does NOT change the verdict (verdict stays structural).',
|
|
30
|
+
},
|
|
27
31
|
},
|
|
28
32
|
},
|
|
29
33
|
handler: async (args, rootPath) => {
|
|
30
34
|
emitProgress(0, 4, 'resolving refs');
|
|
31
35
|
const base = typeof args.base === 'string' ? args.base : undefined;
|
|
32
36
|
const head = typeof args.head === 'string' ? args.head : undefined;
|
|
37
|
+
const intent = typeof args.intent === 'string' ? args.intent : undefined;
|
|
33
38
|
emitProgress(1, 4, 'building base + head graphs');
|
|
34
|
-
const report = await computeReview(rootPath, { base, head });
|
|
39
|
+
const report = await computeReview(rootPath, { base, head, intent });
|
|
35
40
|
if (typeof args.package === 'string' && args.package.length > 0 && report.available) {
|
|
36
41
|
emitProgress(2, 4, 'scoping to workspace');
|
|
37
42
|
const ws = await detectWorkspaces(rootPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/mcp/tools/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,CAAC,MAAM,UAAU,GAAY;IACjC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,+
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/mcp/tools/review.ts"],"names":[],"mappings":"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"}
|