projscan 1.4.0 → 1.6.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 +24 -7
- package/dist/cli/commands/applyFix.d.ts +7 -0
- package/dist/cli/commands/applyFix.js +113 -0
- package/dist/cli/commands/applyFix.js.map +1 -0
- package/dist/cli/commands/coverage.js +13 -0
- package/dist/cli/commands/coverage.js.map +1 -1
- package/dist/cli/commands/doctor.js +18 -2
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/explain.js +1 -0
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/impact.js +25 -1
- package/dist/cli/commands/impact.js.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.js +70 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/installHook.d.ts +9 -0
- package/dist/cli/commands/installHook.js +90 -0
- package/dist/cli/commands/installHook.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +11 -0
- package/dist/cli/commands/memory.js +175 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/taint.d.ts +6 -0
- package/dist/cli/commands/taint.js +74 -0
- package/dist/cli/commands/taint.js.map +1 -0
- package/dist/cli/commands/workspace.d.ts +11 -0
- package/dist/cli/commands/workspace.js +115 -0
- package/dist/cli/commands/workspace.js.map +1 -0
- package/dist/cli/index.js +12 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/applyFix.d.ts +52 -0
- package/dist/core/applyFix.js +220 -0
- package/dist/core/applyFix.js.map +1 -0
- package/dist/core/ast.d.ts +9 -0
- package/dist/core/ast.js +35 -4
- package/dist/core/ast.js.map +1 -1
- package/dist/core/codeGraph.js +190 -241
- package/dist/core/codeGraph.js.map +1 -1
- package/dist/core/fileInspector.js +40 -44
- package/dist/core/fileInspector.js.map +1 -1
- package/dist/core/fixSuggest.d.ts +6 -0
- package/dist/core/fixSuggest.js +195 -0
- package/dist/core/fixSuggest.js.map +1 -1
- package/dist/core/hotspotAnalyzer.js +65 -19
- package/dist/core/hotspotAnalyzer.js.map +1 -1
- package/dist/core/impact.d.ts +8 -0
- package/dist/core/impact.js +41 -3
- package/dist/core/impact.js.map +1 -1
- package/dist/core/indexCache.js +4 -1
- package/dist/core/indexCache.js.map +1 -1
- package/dist/core/issueEngine.js +24 -0
- package/dist/core/issueEngine.js.map +1 -1
- package/dist/core/languages/csharpImports.js +6 -4
- package/dist/core/languages/csharpImports.js.map +1 -1
- package/dist/core/memory.d.ts +154 -0
- package/dist/core/memory.js +277 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/review.d.ts +25 -1
- package/dist/core/review.js +133 -2
- package/dist/core/review.js.map +1 -1
- package/dist/core/taint.d.ts +91 -0
- package/dist/core/taint.js +185 -0
- package/dist/core/taint.js.map +1 -0
- package/dist/core/workspace.d.ts +62 -0
- package/dist/core/workspace.js +127 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/mcp/prompts.js +274 -0
- package/dist/mcp/prompts.js.map +1 -1
- package/dist/mcp/server.js +162 -146
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tokenBudget.d.ts +22 -0
- package/dist/mcp/tokenBudget.js +26 -0
- package/dist/mcp/tokenBudget.js.map +1 -1
- package/dist/mcp/tools/applyFix.d.ts +16 -0
- package/dist/mcp/tools/applyFix.js +91 -0
- package/dist/mcp/tools/applyFix.js.map +1 -0
- package/dist/mcp/tools/doctor.js +65 -2
- package/dist/mcp/tools/doctor.js.map +1 -1
- package/dist/mcp/tools/explain.js +4 -3
- package/dist/mcp/tools/explain.js.map +1 -1
- package/dist/mcp/tools/explainIssue.js +3 -2
- package/dist/mcp/tools/explainIssue.js.map +1 -1
- package/dist/mcp/tools/file.js +3 -2
- package/dist/mcp/tools/file.js.map +1 -1
- package/dist/mcp/tools/graph.js +16 -11
- package/dist/mcp/tools/graph.js.map +1 -1
- package/dist/mcp/tools/impact.js +36 -3
- package/dist/mcp/tools/impact.js.map +1 -1
- package/dist/mcp/tools/memory.d.ts +19 -0
- package/dist/mcp/tools/memory.js +134 -0
- package/dist/mcp/tools/memory.js.map +1 -0
- package/dist/mcp/tools/review.js +25 -4
- package/dist/mcp/tools/review.js.map +1 -1
- package/dist/mcp/tools/taint.d.ts +15 -0
- package/dist/mcp/tools/taint.js +67 -0
- package/dist/mcp/tools/taint.js.map +1 -0
- package/dist/mcp/tools/upgrade.js +3 -2
- package/dist/mcp/tools/upgrade.js.map +1 -1
- package/dist/mcp/tools/workspaceGraph.d.ts +18 -0
- package/dist/mcp/tools/workspaceGraph.js +188 -0
- package/dist/mcp/tools/workspaceGraph.js.map +1 -0
- package/dist/mcp/tools.js +8 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/reporters/consoleReporter.d.ts +12 -1
- package/dist/reporters/consoleReporter.js +289 -179
- package/dist/reporters/consoleReporter.js.map +1 -1
- package/dist/reporters/markdownReporter.js +185 -128
- package/dist/reporters/markdownReporter.js.map +1 -1
- package/dist/tool-manifest.json +129 -6
- package/dist/types.d.ts +67 -0
- package/dist/utils/config.js +93 -53
- package/dist/utils/config.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Cross-repo workspace (1.6+).
|
|
5
|
+
*
|
|
6
|
+
* A workspace is a collection of registered sibling repos under a
|
|
7
|
+
* common root directory. Used for multi-repo intelligence — e.g.
|
|
8
|
+
* "what consumer apps import this SDK function?" or "did this PR
|
|
9
|
+
* to the SDK introduce a taint flow that reaches consumer X?"
|
|
10
|
+
*
|
|
11
|
+
* Disambiguation: this is DIFFERENT from `src/core/monorepo.ts`'s
|
|
12
|
+
* `WorkspaceInfo`, which detects intra-repo packages (npm/yarn/pnpm/
|
|
13
|
+
* Lerna/Nx) within a single repo. The cross-repo workspace lives at
|
|
14
|
+
* `<cwd>/.projscan-workspace.json`; the monorepo workspace is
|
|
15
|
+
* detected from package.json/pnpm-workspace.yaml/etc.
|
|
16
|
+
*
|
|
17
|
+
* Local-only state. No network. Schema-versioned. Best-effort writes
|
|
18
|
+
* (mirrors the session and memory modules' posture).
|
|
19
|
+
*/
|
|
20
|
+
export const WORKSPACE_SCHEMA_VERSION = 1;
|
|
21
|
+
const WORKSPACE_FILENAME = '.projscan-workspace.json';
|
|
22
|
+
/**
|
|
23
|
+
* Load the workspace at `rootPath` (the directory whose
|
|
24
|
+
* `.projscan-workspace.json` we read). Returns null if the file is
|
|
25
|
+
* missing, corrupt, or schema-mismatched. Never throws.
|
|
26
|
+
*/
|
|
27
|
+
export async function loadWorkspace(rootPath) {
|
|
28
|
+
const filePath = workspaceFilePath(rootPath);
|
|
29
|
+
let raw;
|
|
30
|
+
try {
|
|
31
|
+
raw = await fs.readFile(filePath, 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
let parsed;
|
|
37
|
+
try {
|
|
38
|
+
parsed = JSON.parse(raw);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
if (!isWorkspaceShape(parsed) || parsed.schemaVersion !== WORKSPACE_SCHEMA_VERSION) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return parsed;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Load the workspace, or create a fresh empty one. Useful for the
|
|
50
|
+
* `add` flow where the file may not yet exist.
|
|
51
|
+
*/
|
|
52
|
+
export async function loadOrCreateWorkspace(rootPath) {
|
|
53
|
+
const loaded = await loadWorkspace(rootPath);
|
|
54
|
+
if (loaded)
|
|
55
|
+
return loaded;
|
|
56
|
+
return {
|
|
57
|
+
schemaVersion: WORKSPACE_SCHEMA_VERSION,
|
|
58
|
+
createdAt: new Date().toISOString(),
|
|
59
|
+
repos: [],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Add a sibling repo to the workspace. `repoPath` is resolved to an
|
|
64
|
+
* absolute path. Duplicate detection is by absolute path. Returns
|
|
65
|
+
* the resulting repo entry; throws on validation errors.
|
|
66
|
+
*/
|
|
67
|
+
export function addRepo(workspace, repoPath, name) {
|
|
68
|
+
if (typeof repoPath !== 'string' || repoPath.length === 0) {
|
|
69
|
+
throw new Error('Repo path is required.');
|
|
70
|
+
}
|
|
71
|
+
const absolute = path.resolve(repoPath);
|
|
72
|
+
const existing = workspace.repos.find((r) => r.path === absolute);
|
|
73
|
+
if (existing) {
|
|
74
|
+
throw new Error(`Repo "${absolute}" is already registered (as "${existing.name}").`);
|
|
75
|
+
}
|
|
76
|
+
const repoName = (name && name.trim()) || path.basename(absolute);
|
|
77
|
+
if (workspace.repos.some((r) => r.name === repoName)) {
|
|
78
|
+
throw new Error(`A repo named "${repoName}" is already registered. Pass --name <new-name> to disambiguate.`);
|
|
79
|
+
}
|
|
80
|
+
const entry = { path: absolute, name: repoName };
|
|
81
|
+
workspace.repos.push(entry);
|
|
82
|
+
return entry;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Remove a sibling repo by absolute path or by name. Returns the
|
|
86
|
+
* removed entry, or null if no match was found.
|
|
87
|
+
*/
|
|
88
|
+
export function removeRepo(workspace, pathOrName) {
|
|
89
|
+
if (typeof pathOrName !== 'string' || pathOrName.length === 0)
|
|
90
|
+
return null;
|
|
91
|
+
const absoluteCandidate = path.isAbsolute(pathOrName) ? pathOrName : path.resolve(pathOrName);
|
|
92
|
+
const idx = workspace.repos.findIndex((r) => r.path === absoluteCandidate || r.name === pathOrName);
|
|
93
|
+
if (idx < 0)
|
|
94
|
+
return null;
|
|
95
|
+
const [removed] = workspace.repos.splice(idx, 1);
|
|
96
|
+
return removed;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Persist the workspace. Best-effort — failures are swallowed so a
|
|
100
|
+
* transient disk error doesn't break the calling tool. Mirrors the
|
|
101
|
+
* session / memory modules.
|
|
102
|
+
*/
|
|
103
|
+
export async function saveWorkspace(rootPath, workspace) {
|
|
104
|
+
try {
|
|
105
|
+
const filePath = workspaceFilePath(rootPath);
|
|
106
|
+
await fs.writeFile(filePath, JSON.stringify(workspace, null, 2), 'utf-8');
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// best-effort
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function workspaceFilePath(rootPath) {
|
|
113
|
+
return path.join(rootPath, WORKSPACE_FILENAME);
|
|
114
|
+
}
|
|
115
|
+
function isWorkspaceShape(value) {
|
|
116
|
+
if (!value || typeof value !== 'object')
|
|
117
|
+
return false;
|
|
118
|
+
const v = value;
|
|
119
|
+
return (typeof v.schemaVersion === 'number' &&
|
|
120
|
+
typeof v.createdAt === 'string' &&
|
|
121
|
+
Array.isArray(v.repos) &&
|
|
122
|
+
v.repos.every((r) => r !== null &&
|
|
123
|
+
typeof r === 'object' &&
|
|
124
|
+
typeof r.path === 'string' &&
|
|
125
|
+
typeof r.name === 'string'));
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/core/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAC1C,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AAoBtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,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,IAAI,CAAC;IACd,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,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,KAAK,wBAAwB,EAAE,CAAC;QACnF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IAC1D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,OAAO;QACL,aAAa,EAAE,wBAAwB;QACvC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,SAAoB,EAAE,QAAgB,EAAE,IAAa;IAC3E,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAClE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,gCAAgC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClE,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,iBAAiB,QAAQ,kEAAkE,CAC5F,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,SAAoB,EAAE,UAAkB;IACjE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9F,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAC7D,CAAC;IACF,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,SAAoB;IACxE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,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,SAAS,KAAK,QAAQ;QAC/B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QACtB,CAAC,CAAC,KAAK,CAAC,KAAK,CACX,CAAC,CAAU,EAAE,EAAE,CACb,CAAC,KAAK,IAAI;YACV,OAAO,CAAC,KAAK,QAAQ;YACrB,OAAQ,CAA6B,CAAC,IAAI,KAAK,QAAQ;YACvD,OAAQ,CAA6B,CAAC,IAAI,KAAK,QAAQ,CAC1D,CACF,CAAC;AACJ,CAAC"}
|
package/dist/mcp/prompts.js
CHANGED
|
@@ -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,224 @@ 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
|
+
newTaintFlows: review.newTaintFlows.slice(0, 5),
|
|
274
|
+
...(pkg ? { scopedToPackage: pkg } : {}),
|
|
275
|
+
}, null, 2);
|
|
276
|
+
const text = [
|
|
277
|
+
'You are doing a code review on a pull request. projscan has already analyzed the structural diff.',
|
|
278
|
+
'',
|
|
279
|
+
'Live PR review report:',
|
|
280
|
+
'',
|
|
281
|
+
'```json',
|
|
282
|
+
reviewBody,
|
|
283
|
+
'```',
|
|
284
|
+
'',
|
|
285
|
+
'Produce a PR-comment-ready review in this order:',
|
|
286
|
+
'',
|
|
287
|
+
'1. **Verdict line** — restate projscan\'s verdict and whether you concur after looking at the structural data.',
|
|
288
|
+
'2. **Security: NEW taint flows** — if `newTaintFlows` is non-empty, this is the lead concern. Name each flow (`source → sink` in `sourceFn`), say what an attacker would need to exploit it, and demand the author either neutralize it or justify why the source is trusted. A new taint flow is presumed `request-changes` unless the author closes the loop.',
|
|
289
|
+
'3. **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.',
|
|
290
|
+
'4. **Cycle / coupling concerns** — if `newCycles` is non-empty, name each and propose how to break or document it.',
|
|
291
|
+
'5. **Dependency concerns** — call out anything in `dependencyChanges` that warrants a closer look (major bumps, new deps with unclear purpose).',
|
|
292
|
+
'6. **Approval recommendation** — `approve` / `request-changes` / `comment` with rationale.',
|
|
293
|
+
'',
|
|
294
|
+
'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.',
|
|
295
|
+
].join('\n');
|
|
296
|
+
return {
|
|
297
|
+
description: `PR review brief (${review.base.ref} → ${review.head.ref})`,
|
|
298
|
+
messages: [{ role: 'user', content: { type: 'text', text } }],
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
async function safelyRenameSymbolPrompt(args, rootPath) {
|
|
302
|
+
const symbol = typeof args.symbol === 'string' ? args.symbol : '';
|
|
303
|
+
if (!symbol)
|
|
304
|
+
throw new Error('safely_rename_symbol requires a "symbol" argument');
|
|
305
|
+
const newName = typeof args.to === 'string' && args.to.length > 0 ? args.to : null;
|
|
306
|
+
const scan = await scanRepository(rootPath);
|
|
307
|
+
const graph = await buildCodeGraph(rootPath, scan.files);
|
|
308
|
+
const impact = computeImpact(graph, { kind: 'symbol', value: symbol });
|
|
309
|
+
const impactBody = JSON.stringify({
|
|
310
|
+
symbol,
|
|
311
|
+
newName,
|
|
312
|
+
available: impact.available,
|
|
313
|
+
reason: impact.reason,
|
|
314
|
+
definitionFiles: impact.definitionFiles,
|
|
315
|
+
directCallers: impact.directCallers,
|
|
316
|
+
reachableCount: impact.totalReachable,
|
|
317
|
+
reachableSample: impact.reachable.slice(0, 12),
|
|
318
|
+
truncated: impact.truncated,
|
|
319
|
+
}, null, 2);
|
|
320
|
+
const renameDirective = newName
|
|
321
|
+
? `Rename \`${symbol}\` → \`${newName}\` safely.`
|
|
322
|
+
: `Rename \`${symbol}\` safely (caller will tell you the new name).`;
|
|
323
|
+
const text = [
|
|
324
|
+
`You are producing a safe-rename plan for the exported symbol \`${symbol}\`.`,
|
|
325
|
+
'',
|
|
326
|
+
renameDirective,
|
|
327
|
+
'',
|
|
328
|
+
'Blast-radius report from projscan_impact (symbol mode):',
|
|
329
|
+
'',
|
|
330
|
+
'```json',
|
|
331
|
+
impactBody,
|
|
332
|
+
'```',
|
|
333
|
+
'',
|
|
334
|
+
'Output an ordered checklist that minimizes risk:',
|
|
335
|
+
'',
|
|
336
|
+
`1. **Definition-site change** — name the file(s) under \`definitionFiles\` and the exact rename to make there (export name, JSDoc, types).`,
|
|
337
|
+
'2. **Direct-caller updates** — for each file in `directCallers`, list the import / call-site changes required.',
|
|
338
|
+
'3. **Re-export sweep** — barrel files (`index.ts`, `__init__.py`) that may re-export the old name.',
|
|
339
|
+
'4. **Test updates** — every test file under `directCallers` and any explicit string match on the old symbol name.',
|
|
340
|
+
'5. **Verification** — the smallest test suite or manual check that confirms no caller is broken.',
|
|
341
|
+
'6. **Backout plan** — what to do if a transitive caller surfaces post-merge.',
|
|
342
|
+
'',
|
|
343
|
+
'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.',
|
|
344
|
+
].join('\n');
|
|
345
|
+
return {
|
|
346
|
+
description: `Safe-rename plan for ${symbol}${newName ? ` → ${newName}` : ''}`,
|
|
347
|
+
messages: [{ role: 'user', content: { type: 'text', text } }],
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
async function quietTheDoctorPrompt(rootPath) {
|
|
351
|
+
const memory = await loadMemory(rootPath);
|
|
352
|
+
const stable = findStableRules(memory);
|
|
353
|
+
if (stable.length === 0) {
|
|
354
|
+
const text = [
|
|
355
|
+
'You were asked to silence stable doctor rules in this project, but Project Memory has no candidates yet.',
|
|
356
|
+
'',
|
|
357
|
+
`Total runs recorded: **${memory.totalRuns}**.`,
|
|
358
|
+
`Rules tracked: **${Object.keys(memory.rules).length}**.`,
|
|
359
|
+
'',
|
|
360
|
+
'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.',
|
|
361
|
+
'',
|
|
362
|
+
'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.',
|
|
363
|
+
].join('\n');
|
|
364
|
+
return {
|
|
365
|
+
description: 'No stable rules to silence (Project Memory has insufficient signal)',
|
|
366
|
+
messages: [{ role: 'user', content: { type: 'text', text } }],
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
const snippet = JSON.stringify({ disableRules: stable.map((r) => r.ruleId) }, null, 2);
|
|
370
|
+
const detail = stable
|
|
371
|
+
.map((r) => `- \`${r.ruleId}\` — surfaced ${r.runCount} times since ${r.firstSeenAt.slice(0, 10)} (last seen ${r.lastSeenAt.slice(0, 10)})`)
|
|
372
|
+
.join('\n');
|
|
373
|
+
const text = [
|
|
374
|
+
'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.',
|
|
375
|
+
'',
|
|
376
|
+
`**${stable.length} stable rule${stable.length === 1 ? '' : 's'}** (across ${memory.totalRuns} runs):`,
|
|
377
|
+
'',
|
|
378
|
+
detail,
|
|
379
|
+
'',
|
|
380
|
+
'Suggested `.projscanrc.json` patch:',
|
|
381
|
+
'',
|
|
382
|
+
'```json',
|
|
383
|
+
snippet,
|
|
384
|
+
'```',
|
|
385
|
+
'',
|
|
386
|
+
'Output a PR-ready proposal in this exact shape:',
|
|
387
|
+
'',
|
|
388
|
+
`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.`,
|
|
389
|
+
'2. **The patch** — the exact `.projscanrc.json` change, merging cleanly with whatever \`disableRules\` already exists.',
|
|
390
|
+
'3. **Verification** — one command the user can run after applying the patch to confirm the doctor is quieter (typically `projscan ci --min-score 90`).',
|
|
391
|
+
'4. **Rollback note** — how to remove a single entry from `disableRules` if the user later wants the rule re-enabled.',
|
|
392
|
+
'',
|
|
393
|
+
'Tone: matter-of-fact. The user has already implicitly accepted these by not fixing them; you\'re documenting the acceptance, not advocating for it.',
|
|
394
|
+
].join('\n');
|
|
395
|
+
return {
|
|
396
|
+
description: `Quiet ${stable.length} stable rule${stable.length === 1 ? '' : 's'} via .projscanrc`,
|
|
397
|
+
messages: [{ role: 'user', content: { type: 'text', text } }],
|
|
398
|
+
};
|
|
399
|
+
}
|
|
126
400
|
//# sourceMappingURL=prompts.js.map
|
package/dist/mcp/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/mcp/prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAY7D,MAAM,iBAAiB,GAA0B;IAC/C;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,sHAAsH;QACxH,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,4CAA4C;gBACzD,QAAQ,EAAE,KAAK;aAChB;SACF;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,8HAA8H;QAChI,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,6CAA6C;gBAC1D,QAAQ,EAAE,IAAI;aACf;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB;IAClC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,IAA6B,EAC7B,QAAgB;IAEhB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,wBAAwB;YAC3B,OAAO,MAAM,2BAA2B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3D,KAAK,kBAAkB;YACrB,OAAO,MAAM,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACrD;YACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,IAA6B,EAC7B,QAAgB;IAEhB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QACrE,CAAC,CAAC,QAAQ,CAAC,QAAQ;aACd,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACZ,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;YAC/E,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,aAAa;gBACjD,CAAC,CAAC,mBAAmB,CAAC,CAAC,aAAa,GAAG;gBACvC,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,YAAY,WAAW,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,SAAS,EAAE,CAAC;QACjG,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC;QACf,CAAC,CAAC,+DAA+D,CAAC;IAEpE,MAAM,SAAS,GAAG,MAAM;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;SACtD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG;QACX,mGAAmG;QACnG,EAAE;QACF,mBAAmB,KAAK,KAAK,KAAK,kBAAkB,MAAM,CAAC,MAAM,GAAG;QACpE,EAAE;QACF,sEAAsE;QACtE,YAAY;QACZ,EAAE;QACF,oBAAoB;QACpB,SAAS,IAAI,QAAQ;QACrB,EAAE;QACF,yCAAyC;QACzC,iEAAiE;QACjE,mDAAmD;QACnD,iCAAiC;QACjC,EAAE;QACF,4EAA4E;KAC7E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACL,WAAW,EAAE,4DAA4D;QACzE,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;SAClD;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,IAA6B,EAC7B,QAAgB;IAEhB,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAE1E,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG;QACX,6CAA6C,IAAI,KAAK;QACtD,EAAE;QACF,kHAAkH;QAClH,EAAE;QACF,SAAS;QACT,IAAI;QACJ,KAAK;QACL,EAAE;QACF,mBAAmB;QACnB,yDAAyD;QACzD,sEAAsE;QACtE,qFAAqF;QACrF,uDAAuD;KACxD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACL,WAAW,EAAE,2BAA2B,IAAI,EAAE;QAC9C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,QAAgB;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/mcp/prompts.ts"],"names":[],"mappings":"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"}
|