projscan 1.3.0 → 1.5.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 (76) hide show
  1. package/README.md +98 -9
  2. package/dist/cli/commands/doctor.js +18 -2
  3. package/dist/cli/commands/doctor.js.map +1 -1
  4. package/dist/cli/commands/explain.js +1 -0
  5. package/dist/cli/commands/explain.js.map +1 -1
  6. package/dist/cli/commands/memory.d.ts +11 -0
  7. package/dist/cli/commands/memory.js +175 -0
  8. package/dist/cli/commands/memory.js.map +1 -0
  9. package/dist/cli/commands/session.d.ts +12 -0
  10. package/dist/cli/commands/session.js +200 -0
  11. package/dist/cli/commands/session.js.map +1 -0
  12. package/dist/cli/index.js +4 -0
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/core/codeGraph.js +190 -241
  15. package/dist/core/codeGraph.js.map +1 -1
  16. package/dist/core/fileInspector.js +40 -44
  17. package/dist/core/fileInspector.js.map +1 -1
  18. package/dist/core/hotspotAnalyzer.js +65 -19
  19. package/dist/core/hotspotAnalyzer.js.map +1 -1
  20. package/dist/core/issueEngine.js +24 -0
  21. package/dist/core/issueEngine.js.map +1 -1
  22. package/dist/core/languages/csharpImports.js +6 -4
  23. package/dist/core/languages/csharpImports.js.map +1 -1
  24. package/dist/core/memory.d.ts +154 -0
  25. package/dist/core/memory.js +277 -0
  26. package/dist/core/memory.js.map +1 -0
  27. package/dist/core/review.d.ts +25 -1
  28. package/dist/core/review.js +84 -0
  29. package/dist/core/review.js.map +1 -1
  30. package/dist/core/session.d.ts +94 -0
  31. package/dist/core/session.js +187 -0
  32. package/dist/core/session.js.map +1 -0
  33. package/dist/mcp/prompts.js +272 -0
  34. package/dist/mcp/prompts.js.map +1 -1
  35. package/dist/mcp/server.js +198 -128
  36. package/dist/mcp/server.js.map +1 -1
  37. package/dist/mcp/sessionTouchScanner.d.ts +16 -0
  38. package/dist/mcp/sessionTouchScanner.js +112 -0
  39. package/dist/mcp/sessionTouchScanner.js.map +1 -0
  40. package/dist/mcp/tokenBudget.d.ts +22 -0
  41. package/dist/mcp/tokenBudget.js +26 -0
  42. package/dist/mcp/tokenBudget.js.map +1 -1
  43. package/dist/mcp/tools/doctor.js +65 -2
  44. package/dist/mcp/tools/doctor.js.map +1 -1
  45. package/dist/mcp/tools/explain.js +4 -3
  46. package/dist/mcp/tools/explain.js.map +1 -1
  47. package/dist/mcp/tools/explainIssue.js +3 -2
  48. package/dist/mcp/tools/explainIssue.js.map +1 -1
  49. package/dist/mcp/tools/file.js +3 -2
  50. package/dist/mcp/tools/file.js.map +1 -1
  51. package/dist/mcp/tools/graph.js +16 -11
  52. package/dist/mcp/tools/graph.js.map +1 -1
  53. package/dist/mcp/tools/impact.js +2 -2
  54. package/dist/mcp/tools/impact.js.map +1 -1
  55. package/dist/mcp/tools/memory.d.ts +19 -0
  56. package/dist/mcp/tools/memory.js +134 -0
  57. package/dist/mcp/tools/memory.js.map +1 -0
  58. package/dist/mcp/tools/review.js +25 -4
  59. package/dist/mcp/tools/review.js.map +1 -1
  60. package/dist/mcp/tools/session.d.ts +22 -0
  61. package/dist/mcp/tools/session.js +140 -0
  62. package/dist/mcp/tools/session.js.map +1 -0
  63. package/dist/mcp/tools/upgrade.js +3 -2
  64. package/dist/mcp/tools/upgrade.js.map +1 -1
  65. package/dist/mcp/tools.js +4 -0
  66. package/dist/mcp/tools.js.map +1 -1
  67. package/dist/reporters/consoleReporter.d.ts +12 -1
  68. package/dist/reporters/consoleReporter.js +289 -179
  69. package/dist/reporters/consoleReporter.js.map +1 -1
  70. package/dist/reporters/markdownReporter.js +185 -128
  71. package/dist/reporters/markdownReporter.js.map +1 -1
  72. package/dist/tool-manifest.json +79 -6
  73. package/dist/types.d.ts +21 -0
  74. package/dist/utils/config.js +76 -51
  75. package/dist/utils/config.js.map +1 -1
  76. package/package.json +8 -1
@@ -0,0 +1,187 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ /**
5
+ * Session — durable cross-invocation state for projscan (1.4+).
6
+ *
7
+ * Persisted at `.projscan-cache/session.json`. A new session starts when
8
+ * the previous session has been idle for longer than `IDLE_TIMEOUT_MS`
9
+ * (default 1 hour) or when none exists. Multiple agents calling the MCP
10
+ * server against the same project share the same session as long as
11
+ * they're within the idle window.
12
+ *
13
+ * Session purpose: let one agent answer "what has been touched since I
14
+ * arrived?" without having to call git or grep. Touched files come from
15
+ * (a) tool results that surface file paths, and (b) `notifications/file_changed`
16
+ * push events from `projscan mcp --watch`.
17
+ *
18
+ * Schema is versioned (`schemaVersion`) so future evolution can detect
19
+ * and migrate older session files instead of crashing.
20
+ */
21
+ export const SESSION_SCHEMA_VERSION = 1;
22
+ export const DEFAULT_IDLE_TIMEOUT_MS = 60 * 60 * 1000; // 1 hour
23
+ const SESSION_DIR = '.projscan-cache';
24
+ const SESSION_FILENAME = 'session.json';
25
+ const MAX_EVENTS = 500;
26
+ /**
27
+ * Load the session for `rootPath`. If the on-disk session has been idle
28
+ * for longer than `idleTimeoutMs`, returns a fresh session. If no session
29
+ * exists, returns a fresh session. Failures to read or parse the file
30
+ * (corruption, schema mismatch) also produce a fresh session — this
31
+ * function never throws under normal operation.
32
+ *
33
+ * Returns the session object PLUS a `created` flag so the caller can tell
34
+ * whether they're attaching to an existing session or starting a new one.
35
+ */
36
+ export async function loadSession(rootPath, idleTimeoutMs = DEFAULT_IDLE_TIMEOUT_MS) {
37
+ const filePath = sessionFilePath(rootPath);
38
+ const now = new Date();
39
+ let raw;
40
+ try {
41
+ raw = await fs.readFile(filePath, 'utf-8');
42
+ }
43
+ catch {
44
+ return { session: createFreshSession(now), created: true };
45
+ }
46
+ let parsed;
47
+ try {
48
+ parsed = JSON.parse(raw);
49
+ }
50
+ catch {
51
+ return { session: createFreshSession(now), created: true };
52
+ }
53
+ if (!isSessionShape(parsed)) {
54
+ return { session: createFreshSession(now), created: true };
55
+ }
56
+ // Schema-version gate: if a future writer bumps the version we don't
57
+ // understand, treat it as a fresh session rather than corrupting their
58
+ // newer data.
59
+ if (parsed.schemaVersion !== SESSION_SCHEMA_VERSION) {
60
+ return { session: createFreshSession(now), created: true };
61
+ }
62
+ const lastActivityMs = Date.parse(parsed.lastActivityAt);
63
+ if (!Number.isFinite(lastActivityMs) ||
64
+ now.getTime() - lastActivityMs > idleTimeoutMs) {
65
+ return { session: createFreshSession(now), created: true };
66
+ }
67
+ return { session: parsed, created: false };
68
+ }
69
+ /**
70
+ * Record a file touch in-place on the session. Updates the per-file
71
+ * count + lastTouchedAt and the session's lastActivityAt. Caller is
72
+ * responsible for `saveSession()` afterwards (batched persist).
73
+ *
74
+ * `file` should be repo-relative POSIX-separator. Paths with `..` or
75
+ * absolute paths are silently ignored — sessions only track in-repo state.
76
+ */
77
+ export function recordTouch(session, file, source) {
78
+ const normalized = normalizeFile(file);
79
+ if (!normalized)
80
+ return;
81
+ const nowIso = new Date().toISOString();
82
+ const existing = session.touchedFiles[normalized];
83
+ if (existing) {
84
+ existing.count += 1;
85
+ existing.lastTouchedAt = nowIso;
86
+ // First-seen source wins; promotes 'fs-watch' over a later 'tool-result'
87
+ // if the watcher saw the file first. This is mostly informational.
88
+ }
89
+ else {
90
+ session.touchedFiles[normalized] = {
91
+ file: normalized,
92
+ source,
93
+ lastTouchedAt: nowIso,
94
+ count: 1,
95
+ };
96
+ }
97
+ session.lastActivityAt = nowIso;
98
+ }
99
+ /**
100
+ * Append an event to the session's bounded log. The log keeps the last
101
+ * MAX_EVENTS entries and drops the oldest when over capacity.
102
+ */
103
+ export function recordEvent(session, kind, data) {
104
+ const event = {
105
+ at: new Date().toISOString(),
106
+ kind,
107
+ ...(data ? { data } : {}),
108
+ };
109
+ session.events.push(event);
110
+ if (session.events.length > MAX_EVENTS) {
111
+ session.events = session.events.slice(-MAX_EVENTS);
112
+ }
113
+ session.lastActivityAt = event.at;
114
+ }
115
+ /**
116
+ * Persist the session to disk. Best-effort; failures are swallowed so
117
+ * a transient write error doesn't break the calling tool.
118
+ *
119
+ * Last-write-wins semantics for now. If two MCP servers run against the
120
+ * same repo concurrently, the later writer overwrites the earlier; this
121
+ * is acceptable for the v1 scope (the multi-process case is rare and the
122
+ * downside is just a slightly stale touched-file count, not corruption).
123
+ */
124
+ export async function saveSession(rootPath, session) {
125
+ try {
126
+ const dir = path.join(rootPath, SESSION_DIR);
127
+ await fs.mkdir(dir, { recursive: true });
128
+ const filePath = sessionFilePath(rootPath);
129
+ await fs.writeFile(filePath, JSON.stringify(session, null, 2), 'utf-8');
130
+ }
131
+ catch {
132
+ // Swallow — sessions are best-effort.
133
+ }
134
+ }
135
+ /**
136
+ * Reset the session: discard the on-disk file and return a fresh one.
137
+ * Useful for the `projscan_session { action: "reset" }` MCP path.
138
+ */
139
+ export async function resetSession(rootPath) {
140
+ const filePath = sessionFilePath(rootPath);
141
+ try {
142
+ await fs.unlink(filePath);
143
+ }
144
+ catch {
145
+ // Already absent; nothing to do.
146
+ }
147
+ const fresh = createFreshSession(new Date());
148
+ await saveSession(rootPath, fresh);
149
+ return fresh;
150
+ }
151
+ function createFreshSession(now) {
152
+ const iso = now.toISOString();
153
+ return {
154
+ schemaVersion: SESSION_SCHEMA_VERSION,
155
+ id: randomUUID(),
156
+ startedAt: iso,
157
+ lastActivityAt: iso,
158
+ touchedFiles: {},
159
+ events: [],
160
+ };
161
+ }
162
+ function sessionFilePath(rootPath) {
163
+ return path.join(rootPath, SESSION_DIR, SESSION_FILENAME);
164
+ }
165
+ function normalizeFile(file) {
166
+ if (typeof file !== 'string' || file.length === 0)
167
+ return null;
168
+ if (file.includes('..'))
169
+ return null;
170
+ if (path.isAbsolute(file))
171
+ return null;
172
+ // Convert any backslashes (Windows paths) to forward slashes for
173
+ // cross-platform consistency in the session file.
174
+ return file.split(path.sep).join('/').split('\\').join('/');
175
+ }
176
+ function isSessionShape(value) {
177
+ if (!value || typeof value !== 'object')
178
+ return false;
179
+ const v = value;
180
+ return (typeof v.schemaVersion === 'number' &&
181
+ typeof v.id === 'string' &&
182
+ typeof v.startedAt === 'string' &&
183
+ typeof v.lastActivityAt === 'string' &&
184
+ typeof v.touchedFiles === 'object' &&
185
+ Array.isArray(v.events));
186
+ }
187
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,10 @@ import { collectIssues } from '../core/issueEngine.js';
3
3
  import { analyzeHotspots } from '../core/hotspotAnalyzer.js';
4
4
  import { inspectFile } from '../core/fileInspector.js';
5
5
  import { calculateScore } from '../utils/scoreCalculator.js';
6
+ import { buildCodeGraph } from '../core/codeGraph.js';
7
+ import { computeImpact } from '../core/impact.js';
8
+ import { computeReview } from '../core/review.js';
9
+ import { findStableRules, loadMemory } from '../core/memory.js';
6
10
  const promptDefinitions = [
7
11
  {
8
12
  name: 'prioritize_refactoring',
@@ -26,6 +30,46 @@ const promptDefinitions = [
26
30
  },
27
31
  ],
28
32
  },
33
+ {
34
+ name: 'refactor_hotspot',
35
+ description: 'Concrete refactor plan for one specific hotspot file. Pulls the file detail (purpose, risk score, ownership, per-function CC, related issues) and the project-level health context, then asks for a step-by-step refactor with risk acknowledgement.',
36
+ arguments: [
37
+ { name: 'file', description: 'Path to the hotspot file (relative to project root)', required: true },
38
+ ],
39
+ },
40
+ {
41
+ name: 'triage_doctor_issues',
42
+ description: 'Order the open health issues by what to fix first. Groups by severity and category, surfaces score impact, and asks for an "in this order, here is why" plan.',
43
+ arguments: [
44
+ {
45
+ name: 'severity',
46
+ description: 'Optional. Restrict to "error" / "warning" / "info" / "all" (default: all).',
47
+ required: false,
48
+ },
49
+ ],
50
+ },
51
+ {
52
+ name: 'review_this_pr',
53
+ description: 'Step-by-step PR review primed with the structural diff, per-file risk, new cycles, risky function additions, and the verdict from projscan_review. Asks the agent to produce a code-review comment in priority order.',
54
+ arguments: [
55
+ { name: 'base', description: 'Base ref. Default: origin/main.', required: false },
56
+ { name: 'head', description: 'Head ref. Default: HEAD.', required: false },
57
+ { name: 'package', description: 'Optional. Workspace package name to scope the review.', required: false },
58
+ ],
59
+ },
60
+ {
61
+ name: 'safely_rename_symbol',
62
+ description: 'A safe-rename plan for an exported symbol. Pulls the symbol\'s definition site(s), every direct caller, and the transitive blast radius via projscan_impact, then asks for an ordered rename + verification checklist.',
63
+ arguments: [
64
+ { name: 'symbol', description: 'The exported symbol name to rename.', required: true },
65
+ { name: 'to', description: 'Optional. The new name (used in the generated plan).', required: false },
66
+ ],
67
+ },
68
+ {
69
+ name: 'quiet_the_doctor',
70
+ description: 'Propose silencing rules that have been open across many doctor runs without being addressed. Reads Project Memory\'s stable-rule list, frames the .projscanrc snippet, asks the agent to commit it (with a per-rule rationale).',
71
+ arguments: [],
72
+ },
29
73
  ];
30
74
  export function getPromptDefinitions() {
31
75
  return promptDefinitions;
@@ -36,6 +80,16 @@ export async function getPrompt(name, args, rootPath) {
36
80
  return await prioritizeRefactoringPrompt(args, rootPath);
37
81
  case 'investigate_file':
38
82
  return await investigateFilePrompt(args, rootPath);
83
+ case 'refactor_hotspot':
84
+ return await refactorHotspotPrompt(args, rootPath);
85
+ case 'triage_doctor_issues':
86
+ return await triageDoctorIssuesPrompt(args, rootPath);
87
+ case 'review_this_pr':
88
+ return await reviewThisPrPrompt(args, rootPath);
89
+ case 'safely_rename_symbol':
90
+ return await safelyRenameSymbolPrompt(args, rootPath);
91
+ case 'quiet_the_doctor':
92
+ return await quietTheDoctorPrompt(rootPath);
39
93
  default:
40
94
  throw new Error(`Unknown prompt: ${name}`);
41
95
  }
@@ -123,4 +177,222 @@ function coerceLimit(value, fallback) {
123
177
  }
124
178
  return fallback;
125
179
  }
180
+ async function refactorHotspotPrompt(args, rootPath) {
181
+ const file = typeof args.file === 'string' ? args.file : '';
182
+ if (!file)
183
+ throw new Error('refactor_hotspot requires a "file" argument');
184
+ const insp = await inspectFile(rootPath, file);
185
+ const fileBody = JSON.stringify(insp, null, 2);
186
+ const text = [
187
+ `You are a senior engineer producing a concrete refactor plan for \`${file}\`.`,
188
+ '',
189
+ 'Live projscan report on this file (purpose, risk score, ownership, per-function CC, related issues):',
190
+ '',
191
+ '```json',
192
+ fileBody,
193
+ '```',
194
+ '',
195
+ 'Output a step-by-step refactor plan with the following sections:',
196
+ '',
197
+ '1. **Why this file is risky now** — cite the evidence above (CC, churn, fan-in/out, ownership).',
198
+ '2. **Refactor strategy** — the high-level move (e.g. extract module, split god-function, invert dependency).',
199
+ '3. **Step-by-step changes** — ordered, each step independently shippable.',
200
+ '4. **Test coverage gaps to close before / during the refactor.**',
201
+ '5. **Risk acknowledgement** — what could break, who to coordinate with (if `busFactorOne` is set in the report, name the primary author).',
202
+ '6. **Estimated effort** (S / M / L) and verification checklist.',
203
+ '',
204
+ 'Be specific. Reference actual function names from the per-function CC table. Do not propose generic "add tests" without naming what to test.',
205
+ ].join('\n');
206
+ return {
207
+ description: `Refactor plan for ${file}`,
208
+ messages: [{ role: 'user', content: { type: 'text', text } }],
209
+ };
210
+ }
211
+ async function triageDoctorIssuesPrompt(args, rootPath) {
212
+ const rawSeverity = typeof args.severity === 'string' ? args.severity.toLowerCase() : 'all';
213
+ const severity = ['error', 'warning', 'info'].includes(rawSeverity) ? rawSeverity : 'all';
214
+ const scan = await scanRepository(rootPath);
215
+ const issues = await collectIssues(rootPath, scan.files);
216
+ const { score, grade } = calculateScore(issues);
217
+ const filtered = severity === 'all' ? issues : issues.filter((i) => i.severity === severity);
218
+ // Group by category for the agent's quick read.
219
+ const byCategory = {};
220
+ for (const issue of filtered) {
221
+ const key = issue.category ?? 'other';
222
+ (byCategory[key] ||= []).push(issue);
223
+ }
224
+ const grouped = Object.entries(byCategory)
225
+ .sort((a, b) => b[1].length - a[1].length)
226
+ .map(([cat, list]) => {
227
+ const top = list
228
+ .slice(0, 8)
229
+ .map((i) => ` - [${i.severity}] ${i.title}${i.id ? ` (id: ${i.id})` : ''}`)
230
+ .join('\n');
231
+ return `### ${cat} (${list.length})\n${top}${list.length > 8 ? `\n - … and ${list.length - 8} more` : ''}`;
232
+ })
233
+ .join('\n\n');
234
+ const text = [
235
+ 'You are triaging the open health issues from projscan. Produce a fix-this-first plan.',
236
+ '',
237
+ `Project health: **${grade} (${score}/100)**.`,
238
+ `Total issues${severity !== 'all' ? ` (severity=${severity})` : ''}: **${filtered.length}**.`,
239
+ '',
240
+ 'Issues grouped by category:',
241
+ '',
242
+ grouped || '(no issues at this severity)',
243
+ '',
244
+ 'Output a triage plan in this exact shape:',
245
+ '',
246
+ '1. **Critical (fix this week)** — list issues that block correctness, security, or shipping. For each: issue id (if any), why it\'s critical, the projscan_fix_suggest call to invoke.',
247
+ '2. **Important (fix this sprint)** — issues that meaningfully reduce risk but aren\'t blockers.',
248
+ '3. **Backlog** — defer-able with rationale (e.g. "low signal, will be fixed by an upcoming refactor").',
249
+ '4. **Score impact** — estimate how many points the project would gain by clearing items 1-2.',
250
+ '',
251
+ 'For each item, the next-action MUST be a concrete projscan tool call (`projscan_fix_suggest <issue_id>`, `projscan_explain_issue <issue_id>`, or a code change scoped to a specific file).',
252
+ ].join('\n');
253
+ return {
254
+ description: 'Triage plan for current open health issues',
255
+ messages: [{ role: 'user', content: { type: 'text', text } }],
256
+ };
257
+ }
258
+ async function reviewThisPrPrompt(args, rootPath) {
259
+ const base = typeof args.base === 'string' ? args.base : undefined;
260
+ const head = typeof args.head === 'string' ? args.head : undefined;
261
+ const pkg = typeof args.package === 'string' ? args.package : undefined;
262
+ const review = await computeReview(rootPath, { base, head });
263
+ const reviewBody = JSON.stringify({
264
+ verdict: review.verdict,
265
+ summary: review.summary,
266
+ base: review.base,
267
+ head: review.head,
268
+ filesChanged: review.changedFiles.length,
269
+ topChangedFiles: review.changedFiles.slice(0, 6),
270
+ newCycles: review.newCycles.slice(0, 3),
271
+ riskyFunctions: review.riskyFunctions.slice(0, 5),
272
+ dependencyChanges: review.dependencyChanges.slice(0, 5),
273
+ ...(pkg ? { scopedToPackage: pkg } : {}),
274
+ }, null, 2);
275
+ const text = [
276
+ 'You are doing a code review on a pull request. projscan has already analyzed the structural diff.',
277
+ '',
278
+ 'Live PR review report:',
279
+ '',
280
+ '```json',
281
+ reviewBody,
282
+ '```',
283
+ '',
284
+ 'Produce a PR-comment-ready review in this order:',
285
+ '',
286
+ '1. **Verdict line** — restate projscan\'s verdict and whether you concur after looking at the structural data.',
287
+ '2. **Must-look-at** — the highest-risk file(s) from `topChangedFiles` and `riskyFunctions`. For each: one sentence on why, and a concrete question to ask the author.',
288
+ '3. **Cycle / coupling concerns** — if `newCycles` is non-empty, name each and propose how to break or document it.',
289
+ '4. **Dependency concerns** — call out anything in `dependencyChanges` that warrants a closer look (major bumps, new deps with unclear purpose).',
290
+ '5. **Approval recommendation** — `approve` / `request-changes` / `comment` with rationale.',
291
+ '',
292
+ 'Stay grounded in the data above. Do not speculate about code you can\'t see; if you need to inspect a file, request `projscan_file <path>` for it.',
293
+ ].join('\n');
294
+ return {
295
+ description: `PR review brief (${review.base.ref} → ${review.head.ref})`,
296
+ messages: [{ role: 'user', content: { type: 'text', text } }],
297
+ };
298
+ }
299
+ async function safelyRenameSymbolPrompt(args, rootPath) {
300
+ const symbol = typeof args.symbol === 'string' ? args.symbol : '';
301
+ if (!symbol)
302
+ throw new Error('safely_rename_symbol requires a "symbol" argument');
303
+ const newName = typeof args.to === 'string' && args.to.length > 0 ? args.to : null;
304
+ const scan = await scanRepository(rootPath);
305
+ const graph = await buildCodeGraph(rootPath, scan.files);
306
+ const impact = computeImpact(graph, { kind: 'symbol', value: symbol });
307
+ const impactBody = JSON.stringify({
308
+ symbol,
309
+ newName,
310
+ available: impact.available,
311
+ reason: impact.reason,
312
+ definitionFiles: impact.definitionFiles,
313
+ directCallers: impact.directCallers,
314
+ reachableCount: impact.totalReachable,
315
+ reachableSample: impact.reachable.slice(0, 12),
316
+ truncated: impact.truncated,
317
+ }, null, 2);
318
+ const renameDirective = newName
319
+ ? `Rename \`${symbol}\` → \`${newName}\` safely.`
320
+ : `Rename \`${symbol}\` safely (caller will tell you the new name).`;
321
+ const text = [
322
+ `You are producing a safe-rename plan for the exported symbol \`${symbol}\`.`,
323
+ '',
324
+ renameDirective,
325
+ '',
326
+ 'Blast-radius report from projscan_impact (symbol mode):',
327
+ '',
328
+ '```json',
329
+ impactBody,
330
+ '```',
331
+ '',
332
+ 'Output an ordered checklist that minimizes risk:',
333
+ '',
334
+ `1. **Definition-site change** — name the file(s) under \`definitionFiles\` and the exact rename to make there (export name, JSDoc, types).`,
335
+ '2. **Direct-caller updates** — for each file in `directCallers`, list the import / call-site changes required.',
336
+ '3. **Re-export sweep** — barrel files (`index.ts`, `__init__.py`) that may re-export the old name.',
337
+ '4. **Test updates** — every test file under `directCallers` and any explicit string match on the old symbol name.',
338
+ '5. **Verification** — the smallest test suite or manual check that confirms no caller is broken.',
339
+ '6. **Backout plan** — what to do if a transitive caller surfaces post-merge.',
340
+ '',
341
+ 'Sequence the steps so each one is independently committable. If `truncated: true` appears, recommend a follow-up `projscan_impact` call with a higher `max_distance` before merging.',
342
+ ].join('\n');
343
+ return {
344
+ description: `Safe-rename plan for ${symbol}${newName ? ` → ${newName}` : ''}`,
345
+ messages: [{ role: 'user', content: { type: 'text', text } }],
346
+ };
347
+ }
348
+ async function quietTheDoctorPrompt(rootPath) {
349
+ const memory = await loadMemory(rootPath);
350
+ const stable = findStableRules(memory);
351
+ if (stable.length === 0) {
352
+ const text = [
353
+ 'You were asked to silence stable doctor rules in this project, but Project Memory has no candidates yet.',
354
+ '',
355
+ `Total runs recorded: **${memory.totalRuns}**.`,
356
+ `Rules tracked: **${Object.keys(memory.rules).length}**.`,
357
+ '',
358
+ 'A rule becomes "stable" after surfacing in ≥ 3 runs over ≥ 7 days without ever being fixed. None of the tracked rules meet that threshold yet — either the project is being actively cleaned, or memory needs more runs to accumulate signal.',
359
+ '',
360
+ 'Tell the user there\'s nothing to silence and recommend running the doctor a few more times to build memory, OR proposing a sweep of the existing open issues if they\'re willing to work through them.',
361
+ ].join('\n');
362
+ return {
363
+ description: 'No stable rules to silence (Project Memory has insufficient signal)',
364
+ messages: [{ role: 'user', content: { type: 'text', text } }],
365
+ };
366
+ }
367
+ const snippet = JSON.stringify({ disableRules: stable.map((r) => r.ruleId) }, null, 2);
368
+ const detail = stable
369
+ .map((r) => `- \`${r.ruleId}\` — surfaced ${r.runCount} times since ${r.firstSeenAt.slice(0, 10)} (last seen ${r.lastSeenAt.slice(0, 10)})`)
370
+ .join('\n');
371
+ const text = [
372
+ 'You are silencing analyzer rules that this project has been carrying across many doctor runs without ever fixing — i.e. the user has implicitly accepted them. Project Memory tracked this; here\'s the recommendation.',
373
+ '',
374
+ `**${stable.length} stable rule${stable.length === 1 ? '' : 's'}** (across ${memory.totalRuns} runs):`,
375
+ '',
376
+ detail,
377
+ '',
378
+ 'Suggested `.projscanrc.json` patch:',
379
+ '',
380
+ '```json',
381
+ snippet,
382
+ '```',
383
+ '',
384
+ 'Output a PR-ready proposal in this exact shape:',
385
+ '',
386
+ `1. **Rationale per rule** — for each of the ${stable.length} rule${stable.length === 1 ? '' : 's'}, one sentence explaining what it flags and why silencing is appropriate (e.g. "this dependency is loaded via a build script, not an import"). Be specific to the rule id.`,
387
+ '2. **The patch** — the exact `.projscanrc.json` change, merging cleanly with whatever \`disableRules\` already exists.',
388
+ '3. **Verification** — one command the user can run after applying the patch to confirm the doctor is quieter (typically `projscan ci --min-score 90`).',
389
+ '4. **Rollback note** — how to remove a single entry from `disableRules` if the user later wants the rule re-enabled.',
390
+ '',
391
+ 'Tone: matter-of-fact. The user has already implicitly accepted these by not fixing them; you\'re documenting the acceptance, not advocating for it.',
392
+ ].join('\n');
393
+ return {
394
+ description: `Quiet ${stable.length} stable rule${stable.length === 1 ? '' : 's'} via .projscanrc`,
395
+ messages: [{ role: 'user', content: { type: 'text', text } }],
396
+ };
397
+ }
126
398
  //# sourceMappingURL=prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/mcp/prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/mcp/prompts.ts"],"names":[],"mappings":"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"}