staff-mcp 1.0.1 → 1.0.3
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/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/lsp/manager.d.ts +32 -0
- package/dist/src/lsp/manager.js +263 -0
- package/dist/src/lsp/manager.js.map +1 -0
- package/dist/src/policies/workspace-artifact-policy.d.ts +1 -0
- package/dist/src/policies/workspace-artifact-policy.js +21 -0
- package/dist/src/policies/workspace-artifact-policy.js.map +1 -0
- package/dist/src/security.d.ts +1 -0
- package/dist/src/security.js +3 -0
- package/dist/src/security.js.map +1 -1
- package/dist/src/tools/file-tools.js +97 -50
- package/dist/src/tools/file-tools.js.map +1 -1
- package/dist/src/tools/lsp-tools.d.ts +0 -4
- package/dist/src/tools/lsp-tools.js +70 -38
- package/dist/src/tools/lsp-tools.js.map +1 -1
- package/dist/src/tools/system-tools.js +3 -0
- package/dist/src/tools/system-tools.js.map +1 -1
- package/dist/src/utils/paths.d.ts +6 -0
- package/dist/src/utils/paths.js +16 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/tool-utils.d.ts +13 -0
- package/dist/src/utils/tool-utils.js +120 -0
- package/dist/src/utils/tool-utils.js.map +1 -0
- package/dist/tests/system-tools.test.d.ts +1 -0
- package/dist/tests/system-tools.test.js +26 -0
- package/dist/tests/system-tools.test.js.map +1 -0
- package/package.json +2 -1
package/dist/src/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import * as path from "path";
|
|
|
4
4
|
import { createServer } from "./server.js";
|
|
5
5
|
import { startStdioServer } from "./transports/stdio.js";
|
|
6
6
|
import { startHttpServer } from "./transports/http.js";
|
|
7
|
+
import { ensureStaffDirs } from "./utils/paths.js";
|
|
7
8
|
const program = new Command();
|
|
8
9
|
program
|
|
9
10
|
.name("staff-mcp")
|
|
@@ -15,6 +16,7 @@ program
|
|
|
15
16
|
.option("-w, --working-dir <path>", "Working directory for the server (defaults to current execution path)", process.cwd())
|
|
16
17
|
.option("-d, --allowed-dir <paths...>", "Additional directories allowed for sandbox", [])
|
|
17
18
|
.action(async (options) => {
|
|
19
|
+
ensureStaffDirs();
|
|
18
20
|
const workingDir = path.resolve(options.workingDir);
|
|
19
21
|
const allowedDirs = options.allowedDir.map((d) => path.resolve(d));
|
|
20
22
|
const server = createServer("staff-mcp", "1.0.0", workingDir, allowedDirs);
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,oDAAoD,CAAC;KACjE,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,wBAAwB,EAAE,gCAAgC,EAAE,OAAO,CAAC;KAC3E,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,CAAC;KAC7D,MAAM,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,WAAW,CAAC;KACnE,MAAM,CAAC,0BAA0B,EAAE,uEAAuE,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC1H,MAAM,CAAC,8BAA8B,EAAE,4CAA4C,EAAE,EAAE,CAAC;KACxF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,eAAe,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAE3E,IAAI,OAAO,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QACjC,MAAM,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface LSPConfig {
|
|
2
|
+
command: string[];
|
|
3
|
+
installCommand?: string;
|
|
4
|
+
extensions: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare class LSPClient {
|
|
7
|
+
private config;
|
|
8
|
+
private rootPath;
|
|
9
|
+
private process;
|
|
10
|
+
private idCounter;
|
|
11
|
+
private handlers;
|
|
12
|
+
private buffer;
|
|
13
|
+
constructor(config: LSPConfig, rootPath: string);
|
|
14
|
+
start(): Promise<void>;
|
|
15
|
+
private notificationHandlers;
|
|
16
|
+
private handleData;
|
|
17
|
+
onNotification(method: string, handler: (params: any) => void): void;
|
|
18
|
+
request(method: string, params: any): Promise<any>;
|
|
19
|
+
notification(method: string, params: any): Promise<void>;
|
|
20
|
+
stop(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare class LSPManager {
|
|
23
|
+
readonly DEFAULT_CONFIGS: Record<string, LSPConfig>;
|
|
24
|
+
private clients;
|
|
25
|
+
constructor();
|
|
26
|
+
ensureServer(language: string): Promise<void>;
|
|
27
|
+
getClient(language: string, rootPath: string): Promise<LSPClient>;
|
|
28
|
+
getDiagnostics(filePath: string, rootPath: string): Promise<any[]>;
|
|
29
|
+
hover(filePath: string, line: number, character: number, rootPath: string): Promise<string>;
|
|
30
|
+
go_to_definition_internal(filePath: string, line: number, character: number, rootPath: string): Promise<string>;
|
|
31
|
+
}
|
|
32
|
+
export declare const lspManager: LSPManager;
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { spawn, execSync } from "child_process";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
import { STAFF_TOOLS_DIR, ensureStaffDirs } from "../utils/paths.js";
|
|
5
|
+
import { getPlatformCommand } from "../utils/tool-utils.js";
|
|
6
|
+
const STAFF_NODE_MODULES = path.join(STAFF_TOOLS_DIR, "node_modules");
|
|
7
|
+
const DEFAULT_CONFIGS = {
|
|
8
|
+
typescript: {
|
|
9
|
+
command: ["node", path.join(STAFF_NODE_MODULES, "typescript-language-server/lib/cli.mjs"), "--stdio"],
|
|
10
|
+
installCommand: `npm install typescript-language-server typescript`,
|
|
11
|
+
extensions: [".ts", ".tsx", ".js", ".jsx"]
|
|
12
|
+
},
|
|
13
|
+
python: {
|
|
14
|
+
command: ["node", path.join(STAFF_NODE_MODULES, "pyright/dist/pyright-langserver.js"), "--stdio"],
|
|
15
|
+
installCommand: `npm install pyright`,
|
|
16
|
+
extensions: [".py"]
|
|
17
|
+
},
|
|
18
|
+
go: {
|
|
19
|
+
command: ["gopls"],
|
|
20
|
+
installCommand: "go install golang.org/x/tools/gopls@latest",
|
|
21
|
+
extensions: [".go"]
|
|
22
|
+
},
|
|
23
|
+
rust: {
|
|
24
|
+
command: ["rust-analyzer"],
|
|
25
|
+
installCommand: "rustup component add rust-analyzer",
|
|
26
|
+
extensions: [".rs"]
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
export class LSPClient {
|
|
30
|
+
config;
|
|
31
|
+
rootPath;
|
|
32
|
+
process = null;
|
|
33
|
+
idCounter = 0;
|
|
34
|
+
handlers = new Map();
|
|
35
|
+
buffer = "";
|
|
36
|
+
constructor(config, rootPath) {
|
|
37
|
+
this.config = config;
|
|
38
|
+
this.rootPath = rootPath;
|
|
39
|
+
}
|
|
40
|
+
async start() {
|
|
41
|
+
const executable = getPlatformCommand(this.config.command[0]);
|
|
42
|
+
this.process = spawn(executable, this.config.command.slice(1), {
|
|
43
|
+
cwd: this.rootPath,
|
|
44
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
45
|
+
shell: true // Using shell helps with path resolution on Windows
|
|
46
|
+
});
|
|
47
|
+
this.process.stdout?.on("data", (data) => {
|
|
48
|
+
this.handleData(data.toString());
|
|
49
|
+
});
|
|
50
|
+
this.process.stderr?.on("data", (data) => {
|
|
51
|
+
console.error(`[LSP Error]: ${data.toString()}`);
|
|
52
|
+
});
|
|
53
|
+
// Initialize
|
|
54
|
+
await this.request("initialize", {
|
|
55
|
+
processId: process.pid,
|
|
56
|
+
rootUri: `file://${this.rootPath}`,
|
|
57
|
+
capabilities: {},
|
|
58
|
+
workspaceFolders: [{ uri: `file://${this.rootPath}`, name: "workspace" }]
|
|
59
|
+
});
|
|
60
|
+
await this.notification("initialized", {});
|
|
61
|
+
}
|
|
62
|
+
notificationHandlers = new Map();
|
|
63
|
+
handleData(data) {
|
|
64
|
+
this.buffer += data;
|
|
65
|
+
while (true) {
|
|
66
|
+
const match = this.buffer.match(/Content-Length: (\d+)\r\n\r\n/);
|
|
67
|
+
if (!match)
|
|
68
|
+
break;
|
|
69
|
+
const contentLength = parseInt(match[1]);
|
|
70
|
+
const headerLength = match[0].length;
|
|
71
|
+
const totalLength = headerLength + contentLength;
|
|
72
|
+
if (this.buffer.length < totalLength)
|
|
73
|
+
break;
|
|
74
|
+
const body = this.buffer.slice(headerLength, totalLength);
|
|
75
|
+
this.buffer = this.buffer.slice(totalLength);
|
|
76
|
+
try {
|
|
77
|
+
const response = JSON.parse(body);
|
|
78
|
+
if (response.id !== undefined) {
|
|
79
|
+
const handler = this.handlers.get(response.id);
|
|
80
|
+
if (handler) {
|
|
81
|
+
handler(response);
|
|
82
|
+
this.handlers.delete(response.id);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else if (response.method) {
|
|
86
|
+
const handler = this.notificationHandlers.get(response.method);
|
|
87
|
+
if (handler) {
|
|
88
|
+
handler(response.params);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
console.error("Failed to parse LSP response", e);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
onNotification(method, handler) {
|
|
98
|
+
this.notificationHandlers.set(method, handler);
|
|
99
|
+
}
|
|
100
|
+
async request(method, params) {
|
|
101
|
+
const id = this.idCounter++;
|
|
102
|
+
const message = {
|
|
103
|
+
jsonrpc: "2.0",
|
|
104
|
+
id,
|
|
105
|
+
method,
|
|
106
|
+
params
|
|
107
|
+
};
|
|
108
|
+
const json = JSON.stringify(message);
|
|
109
|
+
const header = `Content-Length: ${Buffer.byteLength(json, "utf8")}\r\n\r\n`;
|
|
110
|
+
return new Promise((resolve) => {
|
|
111
|
+
this.handlers.set(id, (res) => resolve(res.result));
|
|
112
|
+
this.process?.stdin?.write(header + json);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async notification(method, params) {
|
|
116
|
+
const message = {
|
|
117
|
+
jsonrpc: "2.0",
|
|
118
|
+
method,
|
|
119
|
+
params
|
|
120
|
+
};
|
|
121
|
+
const json = JSON.stringify(message);
|
|
122
|
+
const header = `Content-Length: ${Buffer.byteLength(json, "utf8")}\r\n\r\n`;
|
|
123
|
+
this.process?.stdin?.write(header + json);
|
|
124
|
+
}
|
|
125
|
+
stop() {
|
|
126
|
+
this.process?.kill();
|
|
127
|
+
this.process = null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export class LSPManager {
|
|
131
|
+
DEFAULT_CONFIGS = DEFAULT_CONFIGS;
|
|
132
|
+
clients = new Map();
|
|
133
|
+
constructor() {
|
|
134
|
+
ensureStaffDirs();
|
|
135
|
+
if (!fs.existsSync(STAFF_NODE_MODULES)) {
|
|
136
|
+
fs.mkdirSync(STAFF_NODE_MODULES, { recursive: true });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async ensureServer(language) {
|
|
140
|
+
const config = DEFAULT_CONFIGS[language];
|
|
141
|
+
if (!config)
|
|
142
|
+
return;
|
|
143
|
+
// Check if it's a node module we manage
|
|
144
|
+
const serverPath = config.command[1];
|
|
145
|
+
if (serverPath && path.isAbsolute(serverPath) && fs.existsSync(serverPath)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Check if the command exists in PATH
|
|
149
|
+
const cmd = config.command[0];
|
|
150
|
+
try {
|
|
151
|
+
const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `which ${cmd}`;
|
|
152
|
+
execSync(checkCmd, { stdio: 'ignore' });
|
|
153
|
+
return; // Found in PATH
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
if (config.installCommand) {
|
|
157
|
+
console.log(`LSP server '${cmd}' not found. Attempting auto-install for ${language}...`);
|
|
158
|
+
try {
|
|
159
|
+
const installParts = config.installCommand.split(" ");
|
|
160
|
+
const platformNpm = getPlatformCommand(installParts[0]);
|
|
161
|
+
const args = installParts.slice(1);
|
|
162
|
+
execSync(`${platformNpm} ${args.join(" ")}`, {
|
|
163
|
+
cwd: STAFF_TOOLS_DIR,
|
|
164
|
+
stdio: 'inherit',
|
|
165
|
+
shell: true
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
catch (e) {
|
|
169
|
+
console.error(`Failed to install LSP for ${language}:`, e);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async getClient(language, rootPath) {
|
|
175
|
+
const key = `${language}:${rootPath}`;
|
|
176
|
+
if (this.clients.has(key))
|
|
177
|
+
return this.clients.get(key);
|
|
178
|
+
await this.ensureServer(language);
|
|
179
|
+
const config = DEFAULT_CONFIGS[language];
|
|
180
|
+
if (!config)
|
|
181
|
+
throw new Error(`Unsupported language: ${language}`);
|
|
182
|
+
const client = new LSPClient(config, rootPath);
|
|
183
|
+
await client.start();
|
|
184
|
+
this.clients.set(key, client);
|
|
185
|
+
return client;
|
|
186
|
+
}
|
|
187
|
+
async getDiagnostics(filePath, rootPath) {
|
|
188
|
+
const ext = path.extname(filePath);
|
|
189
|
+
const lang = Object.keys(DEFAULT_CONFIGS).find(l => DEFAULT_CONFIGS[l].extensions.includes(ext));
|
|
190
|
+
if (!lang)
|
|
191
|
+
return [];
|
|
192
|
+
const client = await this.getClient(lang, rootPath);
|
|
193
|
+
const uri = `file://${filePath}`;
|
|
194
|
+
// Ensure file is opened and notified to server
|
|
195
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
196
|
+
await client.notification("textDocument/didOpen", {
|
|
197
|
+
textDocument: {
|
|
198
|
+
uri,
|
|
199
|
+
languageId: lang,
|
|
200
|
+
version: 1,
|
|
201
|
+
text: content
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
return new Promise(async (resolve) => {
|
|
205
|
+
let resolved = false;
|
|
206
|
+
const timeout = setTimeout(() => {
|
|
207
|
+
if (!resolved) {
|
|
208
|
+
resolved = true;
|
|
209
|
+
resolve([]);
|
|
210
|
+
}
|
|
211
|
+
}, 3000); // Wait for async diagnostics
|
|
212
|
+
client.onNotification("textDocument/publishDiagnostics", (params) => {
|
|
213
|
+
// Normalize path for comparison
|
|
214
|
+
const paramPath = params.uri.replace("file://", "");
|
|
215
|
+
const checkPath = filePath.startsWith("/") ? filePath : `/${filePath}`;
|
|
216
|
+
if (paramPath.endsWith(filePath) && !resolved) {
|
|
217
|
+
resolved = true;
|
|
218
|
+
clearTimeout(timeout);
|
|
219
|
+
resolve(params.diagnostics);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
async hover(filePath, line, character, rootPath) {
|
|
225
|
+
const ext = path.extname(filePath);
|
|
226
|
+
const lang = Object.keys(DEFAULT_CONFIGS).find(l => DEFAULT_CONFIGS[l].extensions.includes(ext));
|
|
227
|
+
if (!lang)
|
|
228
|
+
return "Unsupported language";
|
|
229
|
+
const client = await this.getClient(lang, rootPath);
|
|
230
|
+
const result = await client.request("textDocument/hover", {
|
|
231
|
+
textDocument: { uri: `file://${filePath}` },
|
|
232
|
+
position: { line, character }
|
|
233
|
+
});
|
|
234
|
+
if (!result || !result.contents)
|
|
235
|
+
return "No hover information found";
|
|
236
|
+
if (typeof result.contents === "string")
|
|
237
|
+
return result.contents;
|
|
238
|
+
if (Array.isArray(result.contents))
|
|
239
|
+
return result.contents.map((c) => typeof c === "string" ? c : c.value).join("\n");
|
|
240
|
+
return result.contents.value || "No hover information found";
|
|
241
|
+
}
|
|
242
|
+
async go_to_definition_internal(filePath, line, character, rootPath) {
|
|
243
|
+
const ext = path.extname(filePath);
|
|
244
|
+
const lang = Object.keys(DEFAULT_CONFIGS).find(l => DEFAULT_CONFIGS[l].extensions.includes(ext));
|
|
245
|
+
if (!lang)
|
|
246
|
+
throw new Error(`Unsupported language for extension ${ext}`);
|
|
247
|
+
const client = await this.getClient(lang, rootPath);
|
|
248
|
+
const result = await client.request("textDocument/definition", {
|
|
249
|
+
textDocument: { uri: `file://${filePath}` },
|
|
250
|
+
position: { line: line - 1, character: character - 1 }
|
|
251
|
+
});
|
|
252
|
+
if (!result)
|
|
253
|
+
return "Definition not found";
|
|
254
|
+
const locations = Array.isArray(result) ? result : [result];
|
|
255
|
+
return locations.map((loc) => {
|
|
256
|
+
const uri = loc.uri || loc.targetUri;
|
|
257
|
+
const range = loc.range || loc.targetSelectionRange;
|
|
258
|
+
return `${uri.replace('file://', '')}:${range.start.line + 1}`;
|
|
259
|
+
}).join("\n");
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
export const lspManager = new LSPManager();
|
|
263
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/lsp/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getWorkspaceArtifactPolicy(): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function getWorkspaceArtifactPolicy() {
|
|
2
|
+
return `
|
|
3
|
+
Workspace Artifact Policy:
|
|
4
|
+
Before creating any file, classify it as either a user-facing deliverable or an assistant-only working artifact.
|
|
5
|
+
|
|
6
|
+
Rules:
|
|
7
|
+
- User-facing deliverables should be placed according to the current task and the workspace's own conventions.
|
|
8
|
+
- Assistant-only working artifacts should be kept in a hidden assistant work area, defaulting to '.staff/', unless the workspace already defines another scratch location.
|
|
9
|
+
- Assistant-only working artifacts include temporary experiments, reproduction scripts, disposable test files, logs, progress notes, planning documents, checkpoints, derived metadata, and caches.
|
|
10
|
+
- Recommended default layout under '.staff/':
|
|
11
|
+
- '.staff/tmp/' for temporary experiments and one-off outputs
|
|
12
|
+
- '.staff/notes/' for plans, findings, and progress summaries
|
|
13
|
+
- '.staff/logs/' for command output, traces, and runtime logs
|
|
14
|
+
- '.staff/state/' for session or task state and checkpoints
|
|
15
|
+
- '.staff/cache/' for reusable derived data that is not part of the deliverable
|
|
16
|
+
- Do not mix assistant-only working artifacts with user deliverables unless explicitly requested.
|
|
17
|
+
- If unsure whether a file is a deliverable, treat it as an assistant-only working artifact first.
|
|
18
|
+
- If the target workspace already has explicit conventions for generated or scratch material, follow those conventions instead of the default hidden layout.
|
|
19
|
+
`.trim();
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=workspace-artifact-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-artifact-policy.js","sourceRoot":"","sources":["../../../src/policies/workspace-artifact-policy.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,0BAA0B;IACxC,OAAO;;;;;;;;;;;;;;;;;CAiBR,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
|
package/dist/src/security.d.ts
CHANGED
package/dist/src/security.js
CHANGED
package/dist/src/security.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,OAAO,eAAe;IAClB,WAAW,CAAW;IACtB,UAAU,CAAS;IAE3B,YAAY,UAAkB,EAAE,cAAwB,EAAE;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,sCAAsC;QACtC,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;IAED;;;;;;OAMG;IACI,sBAAsB,CAAC,UAAkB,EAAE,GAAY;QAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAEvD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,uCAAuC,CAAC,CAAC;QAChG,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH;;OAEG;IACI,iBAAiB,CAAC,OAAe;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,+BAA+B,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,cAAc;QACnB,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,OAAO,eAAe;IAClB,WAAW,CAAW;IACtB,UAAU,CAAS;IAE3B,YAAY,UAAkB,EAAE,cAAwB,EAAE;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,sCAAsC;QACtC,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;IAED;;;;;;OAMG;IACI,sBAAsB,CAAC,UAAkB,EAAE,GAAY;QAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAEvD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,uCAAuC,CAAC,CAAC;QAChG,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH;;OAEG;IACI,iBAAiB,CAAC,OAAe;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,+BAA+B,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,cAAc;QACnB,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import * as fs from "fs/promises";
|
|
2
2
|
import * as path from "path";
|
|
3
|
+
import { exec } from "child_process";
|
|
4
|
+
import { promisify } from "util";
|
|
3
5
|
import { z } from "zod";
|
|
4
6
|
import { CHARACTER_LIMIT } from "../constants.js";
|
|
5
|
-
import {
|
|
7
|
+
import { ensureRipgrep } from "../utils/tool-utils.js";
|
|
8
|
+
const execAsync = promisify(exec);
|
|
6
9
|
/**
|
|
7
10
|
* Registers file-related tools using the latest registerTool API.
|
|
8
11
|
*/
|
|
@@ -51,42 +54,39 @@ export function registerFileTools(server, security) {
|
|
|
51
54
|
oldText: z.string().describe("The exact text block to be replaced. Be as specific as possible to avoid wrong matches."),
|
|
52
55
|
newText: z.string().describe("The new text content to replace with."),
|
|
53
56
|
}).strict(),
|
|
54
|
-
}, async ({ path: filePath, oldText, newText }) => {
|
|
57
|
+
}, async ({ path: filePath, oldText: originalOldText, newText }) => {
|
|
55
58
|
try {
|
|
56
59
|
const validatedPath = security.resolveAndValidatePath(filePath);
|
|
57
60
|
const content = await fs.readFile(validatedPath, "utf-8");
|
|
58
|
-
|
|
61
|
+
let oldText = originalOldText;
|
|
59
62
|
let index = content.indexOf(oldText);
|
|
63
|
+
// If exact match fails, try fuzzy matching (ignoring whitespace differences)
|
|
60
64
|
if (index === -1) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
const escapedOld = originalOldText.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
66
|
+
// Replace whitespace sequences with \s+ to match any whitespace
|
|
67
|
+
const fuzzyRegex = new RegExp(escapedOld.replace(/\s+/g, '\\s+'), 'g');
|
|
68
|
+
const matches = [...content.matchAll(fuzzyRegex)];
|
|
69
|
+
if (matches.length === 1) {
|
|
70
|
+
index = matches[0].index;
|
|
71
|
+
oldText = matches[0][0]; // Use the actual matched text for replacement
|
|
72
|
+
}
|
|
73
|
+
else if (matches.length > 1) {
|
|
68
74
|
return {
|
|
69
|
-
content: [{ type: "text", text: `Error:
|
|
75
|
+
content: [{ type: "text", text: `Error: Multiple fuzzy matches found for the provided text. Please provide more context to uniquely identify the block.` }],
|
|
70
76
|
isError: true,
|
|
71
77
|
};
|
|
72
78
|
}
|
|
79
|
+
}
|
|
80
|
+
if (index === -1) {
|
|
73
81
|
return {
|
|
74
|
-
content: [{ type: "text", text: `Error: Could not find the text block to replace in ${filePath}.
|
|
82
|
+
content: [{ type: "text", text: `Error: Could not find the text block to replace in ${filePath}. Ensure the text matches exactly (including whitespace) or provide more surrounding context.` }],
|
|
75
83
|
isError: true,
|
|
76
84
|
};
|
|
77
85
|
}
|
|
78
86
|
const updatedContent = content.slice(0, index) + newText + content.slice(index + oldText.length);
|
|
79
87
|
await fs.writeFile(validatedPath, updatedContent, "utf-8");
|
|
80
|
-
let response = `Successfully updated ${filePath}`;
|
|
81
|
-
// Add diagnostics feedback for TS files
|
|
82
|
-
if (filePath.endsWith(".ts") || filePath.endsWith(".tsx")) {
|
|
83
|
-
const diagnostics = await getPathDiagnostics(filePath, security);
|
|
84
|
-
if (diagnostics) {
|
|
85
|
-
response += `\n\nWarning: TypeScript diagnostics found after editing:\n${diagnostics}`;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
88
|
return {
|
|
89
|
-
content: [{ type: "text", text:
|
|
89
|
+
content: [{ type: "text", text: `Successfully updated ${filePath}` }],
|
|
90
90
|
};
|
|
91
91
|
}
|
|
92
92
|
catch (error) {
|
|
@@ -108,16 +108,8 @@ export function registerFileTools(server, security) {
|
|
|
108
108
|
const validatedPath = security.resolveAndValidatePath(filePath);
|
|
109
109
|
await fs.mkdir(path.dirname(validatedPath), { recursive: true });
|
|
110
110
|
await fs.writeFile(validatedPath, content, "utf-8");
|
|
111
|
-
let response = `Successfully wrote file: ${filePath}`;
|
|
112
|
-
// Add diagnostics feedback for TS files
|
|
113
|
-
if (filePath.endsWith(".ts") || filePath.endsWith(".tsx")) {
|
|
114
|
-
const diagnostics = await getPathDiagnostics(filePath, security);
|
|
115
|
-
if (diagnostics) {
|
|
116
|
-
response += `\n\nWarning: TypeScript diagnostics found after writing:\n${diagnostics}`;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
111
|
return {
|
|
120
|
-
content: [{ type: "text", text:
|
|
112
|
+
content: [{ type: "text", text: `Successfully wrote file: ${filePath}` }],
|
|
121
113
|
};
|
|
122
114
|
}
|
|
123
115
|
catch (error) {
|
|
@@ -174,43 +166,98 @@ export function registerFileTools(server, security) {
|
|
|
174
166
|
});
|
|
175
167
|
// search_file_content
|
|
176
168
|
server.registerTool("search_file_content", {
|
|
177
|
-
description: "Perform a global
|
|
169
|
+
description: "Perform a global search for a pattern across all files in the project. Supports regex, case-sensitivity, and glob filters.",
|
|
178
170
|
inputSchema: z.object({
|
|
179
|
-
regex: z.string().describe("The
|
|
180
|
-
includeGlob: z.string().optional().describe("Glob pattern to limit the search (e.g. src/**/*.ts)."),
|
|
171
|
+
regex: z.string().describe("The pattern to search for (regex supported)."),
|
|
172
|
+
includeGlob: z.string().optional().describe("Glob pattern to limit the search (e.g. 'src/**/*.ts')."),
|
|
173
|
+
excludeGlob: z.string().optional().describe("Glob pattern to exclude from the search (e.g. 'node_modules/**')."),
|
|
174
|
+
caseSensitive: z.boolean().optional().describe("Whether the search should be case-sensitive (default: false)."),
|
|
175
|
+
wholeWord: z.boolean().optional().describe("Whether to match whole words only (default: false)."),
|
|
181
176
|
}).strict(),
|
|
182
|
-
}, async ({ regex, includeGlob }) => {
|
|
177
|
+
}, async ({ regex, includeGlob, excludeGlob, caseSensitive = false, wholeWord = false }) => {
|
|
183
178
|
try {
|
|
184
|
-
const searchRegex = new RegExp(regex, "g");
|
|
185
|
-
const results = [];
|
|
186
179
|
const baseDir = security.resolveAndValidatePath(".");
|
|
180
|
+
const rgPath = await ensureRipgrep();
|
|
181
|
+
if (rgPath) {
|
|
182
|
+
try {
|
|
183
|
+
let args = ["--line-number", "--column", "--no-heading", "--color", "never"];
|
|
184
|
+
if (!caseSensitive)
|
|
185
|
+
args.push("--ignore-case");
|
|
186
|
+
if (wholeWord)
|
|
187
|
+
args.push("--word-regexp");
|
|
188
|
+
if (includeGlob) {
|
|
189
|
+
args.push("--glob");
|
|
190
|
+
args.push(includeGlob);
|
|
191
|
+
}
|
|
192
|
+
if (excludeGlob) {
|
|
193
|
+
args.push("--glob");
|
|
194
|
+
args.push(`!${excludeGlob}`);
|
|
195
|
+
}
|
|
196
|
+
args.push("--");
|
|
197
|
+
args.push(regex);
|
|
198
|
+
args.push(baseDir);
|
|
199
|
+
// Use double quotes for all arguments to be safe on Windows
|
|
200
|
+
const command = `"${rgPath}" ${args.map(a => `"${a.replace(/"/g, '\\"')}"`).join(" ")}`;
|
|
201
|
+
const { stdout } = await execAsync(command);
|
|
202
|
+
const lines = stdout.trim().split("\n").filter(l => l.length > 0);
|
|
203
|
+
const formatted = lines.slice(0, 100).map(line => {
|
|
204
|
+
// Robust parsing for path:line:col:text, considering Windows drive letters
|
|
205
|
+
const match = line.match(/^((?:[a-zA-Z]:)?[^:]+):(\d+):(\d+):(.*)$/);
|
|
206
|
+
if (match) {
|
|
207
|
+
const [_, absPath, lineNum, colNum, context] = match;
|
|
208
|
+
const relPath = path.relative(baseDir, absPath);
|
|
209
|
+
return `${relPath}:${lineNum} - ${context.trim()}`;
|
|
210
|
+
}
|
|
211
|
+
return line;
|
|
212
|
+
});
|
|
213
|
+
if (lines.length > 100) {
|
|
214
|
+
formatted.push("... [Search results truncated after 100 matches]");
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
content: [{ type: "text", text: formatted.join("\n") || "No matches found." }],
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
catch (rgError) {
|
|
221
|
+
if (rgError.code === 1) { // rg exit code 1 means no matches
|
|
222
|
+
return { content: [{ type: "text", text: "No matches found." }] };
|
|
223
|
+
}
|
|
224
|
+
// If rg failed for other reasons, fall back to JS
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// JS Fallback
|
|
228
|
+
const results = [];
|
|
229
|
+
const searchRegex = new RegExp(wholeWord ? `\\b${regex}\\b` : regex, caseSensitive ? "g" : "gi");
|
|
187
230
|
async function searchRecursively(currentDir) {
|
|
188
231
|
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
|
189
232
|
for (const entry of entries) {
|
|
190
233
|
const fullPath = path.join(currentDir, entry.name);
|
|
191
|
-
|
|
192
|
-
if (entry.name === "node_modules" || entry.name === ".git")
|
|
234
|
+
const relPath = path.relative(baseDir, fullPath);
|
|
235
|
+
if (entry.name === "node_modules" || entry.name === ".git" || entry.name.startsWith("."))
|
|
193
236
|
continue;
|
|
194
237
|
if (entry.isDirectory()) {
|
|
195
238
|
await searchRecursively(fullPath);
|
|
196
239
|
}
|
|
197
240
|
else if (entry.isFile()) {
|
|
198
|
-
const relPath = path.relative(baseDir, fullPath);
|
|
199
|
-
// Basic glob matching (simple version)
|
|
200
241
|
if (includeGlob && !relPath.includes(includeGlob.replace(/\*/g, "")))
|
|
201
242
|
continue;
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
243
|
+
if (excludeGlob && relPath.includes(excludeGlob.replace(/\*/g, "")))
|
|
244
|
+
continue;
|
|
245
|
+
try {
|
|
246
|
+
const content = await fs.readFile(fullPath, "utf-8");
|
|
247
|
+
if (content.includes("\0"))
|
|
248
|
+
continue;
|
|
249
|
+
let match;
|
|
250
|
+
while ((match = searchRegex.exec(content)) !== null) {
|
|
251
|
+
const lineNum = content.substring(0, match.index).split(/\r?\n/).length;
|
|
252
|
+
const context = content.split(/\r?\n/)[lineNum - 1];
|
|
253
|
+
results.push(`${relPath}:${lineNum} - ${context.trim()}`);
|
|
254
|
+
if (results.length > 100) {
|
|
255
|
+
results.push("... [Search results truncated after 100 matches]");
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
212
258
|
}
|
|
213
259
|
}
|
|
260
|
+
catch (e) { }
|
|
214
261
|
}
|
|
215
262
|
}
|
|
216
263
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-tools.js","sourceRoot":"","sources":["../../../src/tools/file-tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-tools.js","sourceRoot":"","sources":["../../../src/tools/file-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { SecurityManager } from "../security.js";
|
|
3
|
-
/**
|
|
4
|
-
* Internal helper to get diagnostics for a specific path.
|
|
5
|
-
*/
|
|
6
|
-
export declare function getPathDiagnostics(checkPath: string, security: SecurityManager): Promise<string>;
|
|
7
3
|
/**
|
|
8
4
|
* Registers LSP-related tools using the latest registerTool API.
|
|
9
5
|
*/
|
|
@@ -1,48 +1,25 @@
|
|
|
1
1
|
import { Project } from "ts-morph";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
|
|
4
|
-
* Internal helper to get diagnostics for a specific path.
|
|
5
|
-
*/
|
|
6
|
-
export async function getPathDiagnostics(checkPath, security) {
|
|
7
|
-
const validatedPath = security.resolveAndValidatePath(checkPath);
|
|
8
|
-
const project = new Project();
|
|
9
|
-
project.addSourceFilesAtPaths([
|
|
10
|
-
validatedPath.endsWith(".ts") || validatedPath.endsWith(".js")
|
|
11
|
-
? validatedPath
|
|
12
|
-
: `${validatedPath}/**/*.{ts,js,tsx,jsx}`
|
|
13
|
-
]);
|
|
14
|
-
const diagnostics = project.getPreEmitDiagnostics();
|
|
15
|
-
return diagnostics.map(diag => {
|
|
16
|
-
const messageText = diag.getMessageText();
|
|
17
|
-
const line = diag.getLineNumber();
|
|
18
|
-
const file = diag.getSourceFile()?.getFilePath() || "Unknown file";
|
|
19
|
-
const formattedMessage = typeof messageText === "string" ? messageText : messageText.getMessageText();
|
|
20
|
-
return `[${file}:${line}] ${formattedMessage}`;
|
|
21
|
-
}).join("\n");
|
|
22
|
-
}
|
|
3
|
+
import { lspManager } from "../lsp/manager.js";
|
|
23
4
|
/**
|
|
24
5
|
* Registers LSP-related tools using the latest registerTool API.
|
|
25
6
|
*/
|
|
26
7
|
export function registerLspTools(server, security) {
|
|
27
|
-
//
|
|
28
|
-
server.registerTool("
|
|
29
|
-
description: "
|
|
8
|
+
// hover
|
|
9
|
+
server.registerTool("hover", {
|
|
10
|
+
description: "Get hover information (type, documentation) at a specific position.",
|
|
30
11
|
inputSchema: z.object({
|
|
31
|
-
path: z.string().describe("
|
|
12
|
+
path: z.string().describe("File path to inspect."),
|
|
13
|
+
line: z.number().describe("1-based line number."),
|
|
14
|
+
character: z.number().describe("1-based character position."),
|
|
32
15
|
}).strict(),
|
|
33
|
-
}, async ({ path: filePath }) => {
|
|
16
|
+
}, async ({ path: filePath, line, character }) => {
|
|
34
17
|
try {
|
|
35
18
|
const validatedPath = security.resolveAndValidatePath(filePath);
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
const symbols = [];
|
|
39
|
-
sourceFile.getClasses().forEach(c => symbols.push(`[Class] ${c.getName()} (Line ${c.getStartLineNumber()})`));
|
|
40
|
-
sourceFile.getInterfaces().forEach(i => symbols.push(`[Interface] ${i.getName()} (Line ${i.getStartLineNumber()})`));
|
|
41
|
-
sourceFile.getFunctions().forEach(f => symbols.push(`[Function] ${f.getName()} (Line ${f.getStartLineNumber()})`));
|
|
42
|
-
sourceFile.getEnums().forEach(e => symbols.push(`[Enum] ${e.getName()} (Line ${e.getStartLineNumber()})`));
|
|
43
|
-
sourceFile.getTypeAliases().forEach(t => symbols.push(`[TypeAlias] ${t.getName()} (Line ${t.getStartLineNumber()})`));
|
|
19
|
+
const rootPath = security.getWorkingDir();
|
|
20
|
+
const result = await lspManager.hover(validatedPath, line - 1, character - 1, rootPath);
|
|
44
21
|
return {
|
|
45
|
-
content: [{ type: "text", text:
|
|
22
|
+
content: [{ type: "text", text: result }],
|
|
46
23
|
};
|
|
47
24
|
}
|
|
48
25
|
catch (error) {
|
|
@@ -54,15 +31,70 @@ export function registerLspTools(server, security) {
|
|
|
54
31
|
});
|
|
55
32
|
// get_diagnostics
|
|
56
33
|
server.registerTool("get_diagnostics", {
|
|
57
|
-
description: "Get
|
|
34
|
+
description: "Get diagnostics/errors for a file (supports TS, JS, Python).",
|
|
58
35
|
inputSchema: z.object({
|
|
59
|
-
path: z.string().describe("File
|
|
36
|
+
path: z.string().describe("File path to check for diagnostics."),
|
|
60
37
|
}).strict(),
|
|
61
38
|
}, async ({ path: checkPath }) => {
|
|
62
39
|
try {
|
|
63
|
-
const
|
|
40
|
+
const validatedPath = security.resolveAndValidatePath(checkPath);
|
|
41
|
+
const rootPath = security.workingDir;
|
|
42
|
+
const diagnostics = await lspManager.getDiagnostics(validatedPath, rootPath);
|
|
43
|
+
const formatted = diagnostics.map((d) => `[Line ${d.range.start.line + 1}] ${d.message} (${d.severity === 1 ? 'Error' : 'Warning'})`).join("\n");
|
|
44
|
+
return {
|
|
45
|
+
content: [{ type: "text", text: formatted || "No diagnostics found." }],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
64
49
|
return {
|
|
65
|
-
content: [{ type: "text", text:
|
|
50
|
+
content: [{ type: "text", text: `LSP Error: ${error.message}` }],
|
|
51
|
+
isError: true,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// go_to_definition
|
|
56
|
+
server.registerTool("go_to_definition", {
|
|
57
|
+
description: "Find the definition of a symbol at a specific position.",
|
|
58
|
+
inputSchema: z.object({
|
|
59
|
+
path: z.string().describe("File path to inspect."),
|
|
60
|
+
line: z.number().describe("1-based line number."),
|
|
61
|
+
character: z.number().describe("1-based character position."),
|
|
62
|
+
}).strict(),
|
|
63
|
+
}, async ({ path: filePath, line, character }) => {
|
|
64
|
+
try {
|
|
65
|
+
const validatedPath = security.resolveAndValidatePath(filePath);
|
|
66
|
+
const rootPath = security.getWorkingDir();
|
|
67
|
+
const result = await lspManager.go_to_definition_internal(validatedPath, line, character, rootPath);
|
|
68
|
+
return {
|
|
69
|
+
content: [{ type: "text", text: result }],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return {
|
|
74
|
+
content: [{ type: "text", text: `LSP Error: ${error.message}` }],
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// get_document_symbols
|
|
80
|
+
server.registerTool("get_document_symbols", {
|
|
81
|
+
description: "Extract high-level symbols (classes, functions, interfaces) from a TypeScript file.",
|
|
82
|
+
inputSchema: z.object({
|
|
83
|
+
path: z.string().describe("TypeScript/JavaScript file path to analyze."),
|
|
84
|
+
}).strict(),
|
|
85
|
+
}, async ({ path: filePath }) => {
|
|
86
|
+
try {
|
|
87
|
+
const validatedPath = security.resolveAndValidatePath(filePath);
|
|
88
|
+
const project = new Project();
|
|
89
|
+
const sourceFile = project.addSourceFileAtPath(validatedPath);
|
|
90
|
+
const symbols = [];
|
|
91
|
+
sourceFile.getClasses().forEach(c => symbols.push(`[Class] ${c.getName()} (Line ${c.getStartLineNumber()})`));
|
|
92
|
+
sourceFile.getInterfaces().forEach(i => symbols.push(`[Interface] ${i.getName()} (Line ${i.getStartLineNumber()})`));
|
|
93
|
+
sourceFile.getFunctions().forEach(f => symbols.push(`[Function] ${f.getName()} (Line ${f.getStartLineNumber()})`));
|
|
94
|
+
sourceFile.getEnums().forEach(e => symbols.push(`[Enum] ${e.getName()} (Line ${e.getStartLineNumber()})`));
|
|
95
|
+
sourceFile.getTypeAliases().forEach(t => symbols.push(`[TypeAlias] ${t.getName()} (Line ${t.getStartLineNumber()})`));
|
|
96
|
+
return {
|
|
97
|
+
content: [{ type: "text", text: symbols.join("\n") || "(No significant symbols found)" }],
|
|
66
98
|
};
|
|
67
99
|
}
|
|
68
100
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lsp-tools.js","sourceRoot":"","sources":["../../../src/tools/lsp-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"lsp-tools.js","sourceRoot":"","sources":["../../../src/tools/lsp-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as os from "os";
|
|
2
2
|
import * as path from "path";
|
|
3
|
+
import { getWorkspaceArtifactPolicy } from "../policies/workspace-artifact-policy.js";
|
|
3
4
|
/**
|
|
4
5
|
* Returns a concise instruction string for the MCP server to guide tool usage.
|
|
5
6
|
* Focuses on environment context and tool relationships rather than defining identity.
|
|
@@ -31,6 +32,8 @@ Tool Usage Guidance:
|
|
|
31
32
|
4. Specialized Skills: If a '.staff/skills' or '.claude/skills' directory exists, use the 'skill' tool to load domain-specific workflows which will augment your current context.
|
|
32
33
|
5. Search & Replace: When refactoring, use 'search_file_content' to find all occurrences, then 'edit_file_by_replace' for precise, line-based replacements.
|
|
33
34
|
6. Verification: Use 'get_diagnostics' after editing code to ensure no errors were introduced.
|
|
35
|
+
|
|
36
|
+
${getWorkspaceArtifactPolicy()}
|
|
34
37
|
`.trim();
|
|
35
38
|
}
|
|
36
39
|
//# sourceMappingURL=system-tools.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-tools.js","sourceRoot":"","sources":["../../../src/tools/system-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"system-tools.js","sourceRoot":"","sources":["../../../src/tools/system-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAEtF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,QAAyB;IAC9E,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,CAAC;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;IACjF,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAE9C,OAAO;;;QAGD,QAAQ;mBACG,KAAK;uBACD,UAAU;2CACU,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;qBAC5C,IAAI,CAAC,GAAG;;;;;;;;;;;OAWtB,KAAK,CAAC,CAAC,CAAC,6HAA6H,CAAC,CAAC,CAAC,6GAA6G;;;;;EAK1P,0BAA0B,EAAE;CAC7B,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as os from "os";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
export const STAFF_DIR = path.join(os.homedir(), ".staff");
|
|
5
|
+
export const STAFF_TOOLS_DIR = path.join(STAFF_DIR, "tools");
|
|
6
|
+
/**
|
|
7
|
+
* Ensures the core .staff directories exist.
|
|
8
|
+
*/
|
|
9
|
+
export function ensureStaffDirs() {
|
|
10
|
+
[STAFF_DIR, STAFF_TOOLS_DIR].forEach(dir => {
|
|
11
|
+
if (!fs.existsSync(dir)) {
|
|
12
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAE7D;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gets the correct command name for the current platform (e.g. npm -> npm.cmd on Windows)
|
|
3
|
+
*/
|
|
4
|
+
export declare function getPlatformCommand(cmd: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Ensures a tool is available. If not found in .staff or system PATH,
|
|
7
|
+
* it attempts to install it into .staff/tools.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureTool(name: string, installCmd?: string): Promise<string>;
|
|
10
|
+
/**
|
|
11
|
+
* Specialized version for ripgrep since it's a critical dependency
|
|
12
|
+
*/
|
|
13
|
+
export declare function ensureRipgrep(): Promise<string>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import { exec, spawn } from "child_process";
|
|
4
|
+
import { promisify } from "util";
|
|
5
|
+
import { STAFF_TOOLS_DIR, ensureStaffDirs } from "./paths.js";
|
|
6
|
+
const execAsync = promisify(exec);
|
|
7
|
+
/**
|
|
8
|
+
* Gets the correct command name for the current platform (e.g. npm -> npm.cmd on Windows)
|
|
9
|
+
*/
|
|
10
|
+
export function getPlatformCommand(cmd) {
|
|
11
|
+
if (process.platform === "win32") {
|
|
12
|
+
if (cmd === "npm")
|
|
13
|
+
return "npm.cmd";
|
|
14
|
+
if (cmd === "npx")
|
|
15
|
+
return "npx.cmd";
|
|
16
|
+
}
|
|
17
|
+
return cmd;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Helper to check if a file/dir exists
|
|
21
|
+
*/
|
|
22
|
+
async function exists(p) {
|
|
23
|
+
try {
|
|
24
|
+
await fs.promises.access(p);
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Ensures a tool is available. If not found in .staff or system PATH,
|
|
33
|
+
* it attempts to install it into .staff/tools.
|
|
34
|
+
*/
|
|
35
|
+
export async function ensureTool(name, installCmd) {
|
|
36
|
+
ensureStaffDirs();
|
|
37
|
+
const binaryName = process.platform === "win32" ? `${name}.exe` : name;
|
|
38
|
+
const staffBinPath = path.join(STAFF_TOOLS_DIR, "bin", binaryName);
|
|
39
|
+
const staffBinPathAlt = path.join(STAFF_TOOLS_DIR, "bin", name); // Fallback for extensionless
|
|
40
|
+
const staffNodeModulesPath = path.join(STAFF_TOOLS_DIR, "node_modules");
|
|
41
|
+
// 1. Check .staff/tools/bin
|
|
42
|
+
if (await exists(staffBinPath))
|
|
43
|
+
return staffBinPath;
|
|
44
|
+
if (process.platform === "win32" && await exists(staffBinPathAlt))
|
|
45
|
+
return staffBinPathAlt;
|
|
46
|
+
// 2. Check system PATH
|
|
47
|
+
try {
|
|
48
|
+
const checkCmd = process.platform === "win32" ? `where ${name}` : `which ${name}`;
|
|
49
|
+
const { stdout } = await execAsync(checkCmd);
|
|
50
|
+
const resolvedPath = stdout.trim().split("\r\n")[0].split("\n")[0];
|
|
51
|
+
if (resolvedPath)
|
|
52
|
+
return resolvedPath;
|
|
53
|
+
}
|
|
54
|
+
catch { }
|
|
55
|
+
// 3. Check node_modules in .staff/tools
|
|
56
|
+
if (name === "rg") {
|
|
57
|
+
// Special check for @vscode/ripgrep if installed in the tool directory
|
|
58
|
+
const rgInStaff = path.join(staffNodeModulesPath, "@vscode", "ripgrep", "bin", binaryName);
|
|
59
|
+
const rgInStaffAlt = path.join(staffNodeModulesPath, "@vscode", "ripgrep", "bin", name);
|
|
60
|
+
if (await exists(rgInStaff))
|
|
61
|
+
return rgInStaff;
|
|
62
|
+
if (process.platform === "win32" && await exists(rgInStaffAlt))
|
|
63
|
+
return rgInStaffAlt;
|
|
64
|
+
}
|
|
65
|
+
// 4. Trigger Auto-Installation if missing
|
|
66
|
+
if (installCmd) {
|
|
67
|
+
console.log(`Tool '${name}' not found. Installing into ${STAFF_TOOLS_DIR}...`);
|
|
68
|
+
// Ensure node_modules exists
|
|
69
|
+
if (!fs.existsSync(staffNodeModulesPath)) {
|
|
70
|
+
fs.mkdirSync(staffNodeModulesPath, { recursive: true });
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
// Process the install command for platform compatibility
|
|
74
|
+
const parts = installCmd.split(" ");
|
|
75
|
+
const cmd = getPlatformCommand(parts[0]);
|
|
76
|
+
const args = parts.slice(1);
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
const proc = spawn(cmd, args, {
|
|
79
|
+
cwd: STAFF_TOOLS_DIR,
|
|
80
|
+
shell: true,
|
|
81
|
+
stdio: "inherit"
|
|
82
|
+
});
|
|
83
|
+
proc.on("close", (code) => {
|
|
84
|
+
if (code === 0) {
|
|
85
|
+
console.log(`Successfully installed ${name}.`);
|
|
86
|
+
// Try to find it again after installation
|
|
87
|
+
ensureTool(name).then(resolve).catch(reject);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
reject(new Error(`Installation of ${name} failed with code ${code}`));
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
throw new Error(`Failed to run install command for ${name}: ${e.message}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
throw new Error(`Tool '${name}' is not available and no install command was provided.`);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Specialized version for ripgrep since it's a critical dependency
|
|
103
|
+
*/
|
|
104
|
+
export async function ensureRipgrep() {
|
|
105
|
+
// Try to find it in the project's own node_modules first
|
|
106
|
+
const localRgPaths = [
|
|
107
|
+
path.join(process.cwd(), "node_modules", "@vscode", "ripgrep", "bin", process.platform === "win32" ? "rg.exe" : "rg"),
|
|
108
|
+
path.join(process.cwd(), "node_modules", "vscode-ripgrep", "bin", process.platform === "win32" ? "rg.exe" : "rg"),
|
|
109
|
+
// Fallback for missing .exe on Windows
|
|
110
|
+
path.join(process.cwd(), "node_modules", "@vscode", "ripgrep", "bin", "rg"),
|
|
111
|
+
path.join(process.cwd(), "node_modules", "vscode-ripgrep", "bin", "rg"),
|
|
112
|
+
];
|
|
113
|
+
for (const p of localRgPaths) {
|
|
114
|
+
if (await exists(p))
|
|
115
|
+
return p;
|
|
116
|
+
}
|
|
117
|
+
// Otherwise, fall back to global/staff installation
|
|
118
|
+
return ensureTool("rg", "npm install @vscode/ripgrep");
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=tool-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-utils.js","sourceRoot":"","sources":["../../../src/utils/tool-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import { SecurityManager } from "../src/security.js";
|
|
4
|
+
import { getMcpInstructions } from "../src/tools/system-tools.js";
|
|
5
|
+
test("getMcpInstructions - should describe a default hidden work area for assistant-only artifacts", () => {
|
|
6
|
+
const workingDir = "/tmp/workspace";
|
|
7
|
+
const security = new SecurityManager(workingDir);
|
|
8
|
+
const instructions = getMcpInstructions(workingDir, security);
|
|
9
|
+
assert.match(instructions, /Workspace Artifact Policy/);
|
|
10
|
+
assert.match(instructions, /assistant-only working artifacts/i);
|
|
11
|
+
assert.match(instructions, /hidden assistant work area, defaulting to '\.staff\/'/i);
|
|
12
|
+
assert.match(instructions, /\.staff\/tmp\//);
|
|
13
|
+
assert.match(instructions, /\.staff\/notes\//);
|
|
14
|
+
assert.match(instructions, /\.staff\/logs\//);
|
|
15
|
+
assert.match(instructions, /\.staff\/state\//);
|
|
16
|
+
assert.match(instructions, /\.staff\/cache\//);
|
|
17
|
+
});
|
|
18
|
+
test("getMcpInstructions - should prefer workspace conventions for deliverables and scratch material", () => {
|
|
19
|
+
const workingDir = "/tmp/workspace";
|
|
20
|
+
const security = new SecurityManager(workingDir);
|
|
21
|
+
const instructions = getMcpInstructions(workingDir, security);
|
|
22
|
+
assert.match(instructions, /User-facing deliverables should be placed according to the current task and the workspace's own conventions\./);
|
|
23
|
+
assert.match(instructions, /If the target workspace already has explicit conventions for generated or scratch material, follow those conventions instead of the default hidden layout\./);
|
|
24
|
+
assert.match(instructions, /Do not mix assistant-only working artifacts with user deliverables unless explicitly requested\./);
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=system-tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-tools.test.js","sourceRoot":"","sources":["../../tests/system-tools.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,IAAI,CAAC,8FAA8F,EAAE,GAAG,EAAE;IACxG,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE9D,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,2BAA2B,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,mCAAmC,CAAC,CAAC;IAChE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,wDAAwD,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gGAAgG,EAAE,GAAG,EAAE;IAC1G,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE9D,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,+GAA+G,CAAC,CAAC;IAC5I,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,6JAA6J,CAAC,CAAC;IAC1L,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,kGAAkG,CAAC,CAAC;AACjI,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "staff-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@modelcontextprotocol/sdk": "^1.1.0",
|
|
24
|
+
"@vscode/ripgrep": "^1.17.1",
|
|
24
25
|
"commander": "^12.1.0",
|
|
25
26
|
"cors": "^2.8.5",
|
|
26
27
|
"express": "^4.21.1",
|