@towry/mcp 0.1.7 → 0.3.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 +13 -126
- package/dist/checkpoints.d.ts +17 -0
- package/dist/checkpoints.d.ts.map +1 -0
- package/dist/checkpoints.js +358 -0
- package/dist/checkpoints.js.map +1 -0
- package/dist/checkpoints.test.d.ts +2 -0
- package/dist/checkpoints.test.d.ts.map +1 -0
- package/dist/checkpoints.test.js +277 -0
- package/dist/checkpoints.test.js.map +1 -0
- package/dist/checkpoints.validation.test.d.ts +2 -0
- package/dist/checkpoints.validation.test.d.ts.map +1 -0
- package/dist/checkpoints.validation.test.js +28 -0
- package/dist/checkpoints.validation.test.js.map +1 -0
- package/dist/index.d.ts +3 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -557
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/tmux.d.ts +0 -128
- package/dist/tmux.d.ts.map +0 -1
- package/dist/tmux.js +0 -797
- package/dist/tmux.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,578 +1,28 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* @towry/mcp -
|
|
3
|
+
* @towry/mcp - Grep MCP Server
|
|
4
4
|
*
|
|
5
5
|
* Provides tools for:
|
|
6
|
-
* -
|
|
7
|
-
* - Tmux pane management and control
|
|
6
|
+
* - Fast grep-based code search
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
* - KG_API_URL: API base URL (default: http://localhost:8361)
|
|
11
|
-
* - KG_API_KEY or KG_API_TOKEN: API authentication key
|
|
12
|
-
*
|
|
13
|
-
* Keywords: mcp, knowledge-graph, document-management, tmux, ai-tools, llm-server
|
|
8
|
+
* Keywords: mcp, grep, ai-tools, llm-server
|
|
14
9
|
*/
|
|
15
|
-
import { spawn } from "node:child_process";
|
|
16
|
-
import { z } from "zod";
|
|
17
10
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
18
11
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
19
|
-
import { TmuxCLI, getCurrentPaneInfo, shellQuote } from "./tmux.js";
|
|
20
12
|
import { registerGrepFastTools } from "./grep-fast.js";
|
|
21
|
-
|
|
22
|
-
// Knowledge Graph Types
|
|
23
|
-
// ============================================================================
|
|
24
|
-
const DocTypeEnum = z.enum(["note", "doc", "task", "plan", "agent_session"]);
|
|
25
|
-
const TaskStatusEnum = z.enum(["pending", "in_progress", "done", "blocked"]);
|
|
26
|
-
// ============================================================================
|
|
27
|
-
// Knowledge Graph API Client
|
|
28
|
-
// ============================================================================
|
|
29
|
-
function getKgBaseUrl() {
|
|
30
|
-
return process.env.KG_API_URL ?? "http://localhost:8361";
|
|
31
|
-
}
|
|
32
|
-
function getKgApiKey() {
|
|
33
|
-
return process.env.KG_API_KEY ?? process.env.KG_API_TOKEN ?? "kg-dev-api-key";
|
|
34
|
-
}
|
|
35
|
-
async function kgApiRequest(method, path, body) {
|
|
36
|
-
const url = `${getKgBaseUrl()}${path}`;
|
|
37
|
-
const headers = {
|
|
38
|
-
"X-API-Key": getKgApiKey(),
|
|
39
|
-
"Content-Type": "application/json",
|
|
40
|
-
};
|
|
41
|
-
const res = await fetch(url, {
|
|
42
|
-
method,
|
|
43
|
-
headers,
|
|
44
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
45
|
-
});
|
|
46
|
-
if (!res.ok) {
|
|
47
|
-
const text = await res.text();
|
|
48
|
-
throw new Error(`API error ${res.status}: ${text}`);
|
|
49
|
-
}
|
|
50
|
-
return res.json();
|
|
51
|
-
}
|
|
52
|
-
// ============================================================================
|
|
53
|
-
// Tmux CLI Instance
|
|
54
|
-
// ============================================================================
|
|
55
|
-
const tmux = new TmuxCLI();
|
|
56
|
-
const DEFAULT_CWD = process.cwd();
|
|
13
|
+
import { registerCheckpointTools } from "./checkpoints.js";
|
|
57
14
|
// ============================================================================
|
|
58
15
|
// MCP Server
|
|
59
16
|
// ============================================================================
|
|
60
17
|
const server = new McpServer({
|
|
61
18
|
name: "towry-mcp",
|
|
62
|
-
version: "0.
|
|
63
|
-
});
|
|
64
|
-
// ============================================================================
|
|
65
|
-
// Knowledge Graph Tools
|
|
66
|
-
// ============================================================================
|
|
67
|
-
// kg_create_doc - Create or update a document
|
|
68
|
-
server.registerTool("kg_create_doc", {
|
|
69
|
-
description: "Create or update a document. Use 'note' for session learnings (ephemeral), 'doc' for stable reference docs, 'plan' for roadmaps, 'task' for actionable items. For insights from current chat, prefer kg_insight_save.",
|
|
70
|
-
inputSchema: {
|
|
71
|
-
title: z.string().describe("Document title"),
|
|
72
|
-
body: z.string().describe("Document content"),
|
|
73
|
-
doc_type: DocTypeEnum.describe("note: session learnings (ephemeral), doc: stable reference, task: actionable items, plan: roadmaps, agent_session: chat logs"),
|
|
74
|
-
id: z.string().optional().describe("UUID to update existing doc"),
|
|
75
|
-
project_repo: z.string().optional().describe("Project repo (owner/repo)"),
|
|
76
|
-
tags: z.array(z.string()).optional().describe("Tags for categorization"),
|
|
77
|
-
status: TaskStatusEnum.optional().describe("Task status (only for task type)"),
|
|
78
|
-
parent_id: z
|
|
79
|
-
.string()
|
|
80
|
-
.optional()
|
|
81
|
-
.describe("Parent document ID for hierarchy"),
|
|
82
|
-
},
|
|
83
|
-
}, async (params) => {
|
|
84
|
-
const result = await kgApiRequest("POST", "/api/docs", {
|
|
85
|
-
...params,
|
|
86
|
-
doc_type: params.doc_type ?? "note",
|
|
87
|
-
});
|
|
88
|
-
return {
|
|
89
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
90
|
-
};
|
|
91
|
-
});
|
|
92
|
-
// kg_get_doc - Get full document by ID
|
|
93
|
-
server.registerTool("kg_get_doc", {
|
|
94
|
-
description: "Get full document by ID. Use AFTER kg_search when you need the complete body (snippets are truncated).",
|
|
95
|
-
inputSchema: {
|
|
96
|
-
id: z.string().describe("Document UUID"),
|
|
97
|
-
},
|
|
98
|
-
}, async (params) => {
|
|
99
|
-
const result = await kgApiRequest("GET", `/api/docs/${params.id}`);
|
|
100
|
-
return {
|
|
101
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
102
|
-
};
|
|
103
|
-
});
|
|
104
|
-
// kg_delete_doc - Delete a document
|
|
105
|
-
server.registerTool("kg_delete_doc", {
|
|
106
|
-
description: "Delete a document from the knowledge graph.",
|
|
107
|
-
inputSchema: {
|
|
108
|
-
id: z.string().describe("Document UUID to delete"),
|
|
109
|
-
},
|
|
110
|
-
}, async (params) => {
|
|
111
|
-
const result = await kgApiRequest("DELETE", `/api/docs/${params.id}`);
|
|
112
|
-
return {
|
|
113
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
114
|
-
};
|
|
115
|
-
});
|
|
116
|
-
// kg_search - Search documents
|
|
117
|
-
server.registerTool("kg_search", {
|
|
118
|
-
description: "Find plans, tasks, or docs. Use doc_type='plan' for plans, tag='insight' for insights. Returns snippets - use kg_get_doc for full content.",
|
|
119
|
-
inputSchema: {
|
|
120
|
-
q: z
|
|
121
|
-
.string()
|
|
122
|
-
.optional()
|
|
123
|
-
.describe("Search query (optional - omit to list all of doc_type)"),
|
|
124
|
-
doc_type: DocTypeEnum.optional().describe("Filter by type: 'plan' for plans, 'note' for insights/learnings"),
|
|
125
|
-
project_repo: z.string().optional().describe("Filter by project repo"),
|
|
126
|
-
status: TaskStatusEnum.optional().describe("Filter by task status"),
|
|
127
|
-
tag: z.string().optional().describe("Filter by tag"),
|
|
128
|
-
limit: z.number().int().min(1).max(100).default(20).optional(),
|
|
129
|
-
offset: z.number().int().min(0).default(0).optional(),
|
|
130
|
-
},
|
|
131
|
-
}, async (params) => {
|
|
132
|
-
const searchParams = new URLSearchParams();
|
|
133
|
-
if (params.q)
|
|
134
|
-
searchParams.set("q", params.q);
|
|
135
|
-
if (params.doc_type)
|
|
136
|
-
searchParams.set("doc_type", params.doc_type);
|
|
137
|
-
if (params.project_repo)
|
|
138
|
-
searchParams.set("project_repo", params.project_repo);
|
|
139
|
-
if (params.status)
|
|
140
|
-
searchParams.set("status", params.status);
|
|
141
|
-
if (params.tag)
|
|
142
|
-
searchParams.set("tag", params.tag);
|
|
143
|
-
if (params.limit)
|
|
144
|
-
searchParams.set("limit", String(params.limit));
|
|
145
|
-
if (params.offset)
|
|
146
|
-
searchParams.set("offset", String(params.offset));
|
|
147
|
-
const result = await kgApiRequest("GET", `/api/docs/search?${searchParams.toString()}`);
|
|
148
|
-
return {
|
|
149
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
150
|
-
};
|
|
151
|
-
});
|
|
152
|
-
// kg_semantic_search - Semantic search using embeddings
|
|
153
|
-
server.registerTool("kg_semantic_search", {
|
|
154
|
-
description: "Semantic search using embeddings in the knowledge graph.",
|
|
155
|
-
inputSchema: {
|
|
156
|
-
q: z.string().describe("Search query (required)"),
|
|
157
|
-
embedding_keywords: z
|
|
158
|
-
.array(z.string())
|
|
159
|
-
.optional()
|
|
160
|
-
.describe("Keywords for embedding search. If provided, searches with these keywords. If not, fetches latest 2 docs."),
|
|
161
|
-
doc_type: DocTypeEnum.optional().describe("Filter by document type"),
|
|
162
|
-
project_repo: z.string().optional().describe("Filter by project repo"),
|
|
163
|
-
tag: z.string().optional().describe("Filter by tag"),
|
|
164
|
-
limit: z.number().int().min(1).max(20).default(5).optional(),
|
|
165
|
-
},
|
|
166
|
-
}, async (params) => {
|
|
167
|
-
const searchParams = new URLSearchParams();
|
|
168
|
-
const searchQuery = params.embedding_keywords && params.embedding_keywords.length > 0
|
|
169
|
-
? params.embedding_keywords.join(" ")
|
|
170
|
-
: params.q;
|
|
171
|
-
searchParams.set("q", searchQuery);
|
|
172
|
-
if (params.doc_type)
|
|
173
|
-
searchParams.set("doc_type", params.doc_type);
|
|
174
|
-
if (params.project_repo)
|
|
175
|
-
searchParams.set("project_repo", params.project_repo);
|
|
176
|
-
if (params.tag)
|
|
177
|
-
searchParams.set("tag", params.tag);
|
|
178
|
-
if (params.limit)
|
|
179
|
-
searchParams.set("limit", String(params.limit));
|
|
180
|
-
const result = await kgApiRequest("GET", `/api/docs/semantic?${searchParams.toString()}`);
|
|
181
|
-
return {
|
|
182
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
183
|
-
};
|
|
184
|
-
});
|
|
185
|
-
// kg_status - Get document statistics
|
|
186
|
-
server.registerTool("kg_status", {
|
|
187
|
-
description: "Get document statistics: total count, breakdown by type (plan/task/doc/note) and by repo. Use to check what's stored before searching.",
|
|
188
|
-
inputSchema: {},
|
|
189
|
-
}, async () => {
|
|
190
|
-
const result = await kgApiRequest("GET", "/api/docs/status");
|
|
191
|
-
return {
|
|
192
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
193
|
-
};
|
|
194
|
-
});
|
|
195
|
-
// ============================================================================
|
|
196
|
-
// Tmux Tools
|
|
197
|
-
// ============================================================================
|
|
198
|
-
// tmux_list_sessions - List all tmux sessions
|
|
199
|
-
server.registerTool("tmux_list_sessions", {
|
|
200
|
-
description: "List all tmux sessions with their windows count and attachment status",
|
|
201
|
-
inputSchema: {},
|
|
202
|
-
}, async () => {
|
|
203
|
-
try {
|
|
204
|
-
const sessions = await tmux.listTmuxSessions();
|
|
205
|
-
return {
|
|
206
|
-
content: [{ type: "text", text: JSON.stringify(sessions, null, 2) }],
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
catch (err) {
|
|
210
|
-
return {
|
|
211
|
-
content: [{ type: "text", text: String(err) }],
|
|
212
|
-
isError: true,
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
// tmux_create_session - Create a new tmux session
|
|
217
|
-
server.registerTool("tmux_create_session", {
|
|
218
|
-
description: "Create a new detached tmux session",
|
|
219
|
-
inputSchema: {
|
|
220
|
-
name: z.string().describe("Session name"),
|
|
221
|
-
command: z
|
|
222
|
-
.string()
|
|
223
|
-
.optional()
|
|
224
|
-
.describe("Optional command to run in the new session"),
|
|
225
|
-
cwd: z
|
|
226
|
-
.string()
|
|
227
|
-
.optional()
|
|
228
|
-
.describe("Working directory for the session. Must be an absolute path that exists."),
|
|
229
|
-
},
|
|
230
|
-
}, async (params) => {
|
|
231
|
-
try {
|
|
232
|
-
const result = await tmux.createTmuxSession(params.name, params.command, params.cwd);
|
|
233
|
-
if (!result) {
|
|
234
|
-
return {
|
|
235
|
-
content: [{ type: "text", text: "failed to create session" }],
|
|
236
|
-
isError: true,
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
return {
|
|
240
|
-
content: [{ type: "text", text: `created session: ${result}` }],
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
catch (err) {
|
|
244
|
-
return {
|
|
245
|
-
content: [{ type: "text", text: String(err) }],
|
|
246
|
-
isError: true,
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
// tmux_kill_session - Kill a tmux session
|
|
251
|
-
server.registerTool("tmux_kill_session", {
|
|
252
|
-
description: "Kill a tmux session. Cannot kill the current session you are attached to.",
|
|
253
|
-
inputSchema: {
|
|
254
|
-
name: z.string().describe("Session name to kill"),
|
|
255
|
-
},
|
|
256
|
-
}, async (params) => {
|
|
257
|
-
try {
|
|
258
|
-
const result = await tmux.killTmuxSession(params.name);
|
|
259
|
-
if (!result) {
|
|
260
|
-
return {
|
|
261
|
-
content: [{ type: "text", text: "failed to kill session" }],
|
|
262
|
-
isError: true,
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
return {
|
|
266
|
-
content: [{ type: "text", text: `killed session: ${params.name}` }],
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
catch (err) {
|
|
270
|
-
return {
|
|
271
|
-
content: [{ type: "text", text: String(err) }],
|
|
272
|
-
isError: true,
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
// tmux_create_window - Create a new window
|
|
277
|
-
server.registerTool("tmux_create_window", {
|
|
278
|
-
description: "Create a new window in the current or specified session. Window is created in background by default (detached).",
|
|
279
|
-
inputSchema: {
|
|
280
|
-
name: z.string().optional().describe("Window name"),
|
|
281
|
-
command: z
|
|
282
|
-
.string()
|
|
283
|
-
.optional()
|
|
284
|
-
.describe("Optional command to run in the new window"),
|
|
285
|
-
session: z
|
|
286
|
-
.string()
|
|
287
|
-
.optional()
|
|
288
|
-
.describe("Target session. Defaults to current session."),
|
|
289
|
-
cwd: z
|
|
290
|
-
.string()
|
|
291
|
-
.optional()
|
|
292
|
-
.describe("Working directory for the window. Must be an absolute path that exists."),
|
|
293
|
-
detached: z
|
|
294
|
-
.boolean()
|
|
295
|
-
.default(true)
|
|
296
|
-
.optional()
|
|
297
|
-
.describe("Create window in background without switching to it. Default: true."),
|
|
298
|
-
},
|
|
299
|
-
}, async (params) => {
|
|
300
|
-
try {
|
|
301
|
-
const paneId = await tmux.createTmuxWindow({
|
|
302
|
-
name: params.name,
|
|
303
|
-
command: params.command,
|
|
304
|
-
session: params.session,
|
|
305
|
-
cwd: params.cwd,
|
|
306
|
-
detached: params.detached ?? true,
|
|
307
|
-
});
|
|
308
|
-
if (!paneId) {
|
|
309
|
-
return {
|
|
310
|
-
content: [{ type: "text", text: "failed to create window" }],
|
|
311
|
-
isError: true,
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
return {
|
|
315
|
-
content: [{ type: "text", text: `created window in pane ${paneId}` }],
|
|
316
|
-
};
|
|
317
|
-
}
|
|
318
|
-
catch (err) {
|
|
319
|
-
return {
|
|
320
|
-
content: [{ type: "text", text: String(err) }],
|
|
321
|
-
isError: true,
|
|
322
|
-
};
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
|
-
// tmux_list_panes - List all tmux panes
|
|
326
|
-
server.registerTool("tmux_list_panes", {
|
|
327
|
-
description: "List all tmux panes in the current session (or specified session) across all windows.",
|
|
328
|
-
inputSchema: {
|
|
329
|
-
session: z
|
|
330
|
-
.string()
|
|
331
|
-
.optional()
|
|
332
|
-
.describe("Session name to list panes from. If omitted, lists panes in current window."),
|
|
333
|
-
},
|
|
334
|
-
}, async (params) => {
|
|
335
|
-
try {
|
|
336
|
-
const panes = await tmux.listTmuxPanes(params.session);
|
|
337
|
-
// Filter out current pane to prevent self-operations
|
|
338
|
-
const currentPane = process.env.TMUX_PANE || (await getCurrentPaneInfo()).id;
|
|
339
|
-
const filtered = currentPane
|
|
340
|
-
? panes.filter((p) => p.id !== currentPane)
|
|
341
|
-
: panes;
|
|
342
|
-
return {
|
|
343
|
-
content: [{ type: "text", text: JSON.stringify(filtered, null, 2) }],
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
catch (err) {
|
|
347
|
-
return {
|
|
348
|
-
content: [{ type: "text", text: String(err) }],
|
|
349
|
-
isError: true,
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
});
|
|
353
|
-
// tmux_send - Send keys to a pane
|
|
354
|
-
server.registerTool("tmux_send", {
|
|
355
|
-
description: "Send keys to a tmux pane with pane id, after you send, wait for notify from target pane or user, do not polling for result",
|
|
356
|
-
inputSchema: {
|
|
357
|
-
pane: z
|
|
358
|
-
.string()
|
|
359
|
-
.describe("Target pane id in %N format (e.g., %886). Note: pane id is different from pane index. Use tmux_list_panes to get pane ids."),
|
|
360
|
-
keys: z.string().describe("Keys to send"),
|
|
361
|
-
enter: z.boolean().default(true).optional().describe("Send Enter after"),
|
|
362
|
-
},
|
|
363
|
-
}, async (params) => {
|
|
364
|
-
const targetPane = params.pane;
|
|
365
|
-
const currentPane = process.env.TMUX_PANE;
|
|
366
|
-
if (currentPane && targetPane === currentPane) {
|
|
367
|
-
return {
|
|
368
|
-
content: [{ type: "text", text: "cannot send keys to current pane" }],
|
|
369
|
-
isError: true,
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
try {
|
|
373
|
-
const paneInfo = await getCurrentPaneInfo();
|
|
374
|
-
const signature = paneInfo.id
|
|
375
|
-
? ` [from ${paneInfo.id}${paneInfo.title ? `: ${paneInfo.title}` : ""}]`
|
|
376
|
-
: "";
|
|
377
|
-
const keysWithSig = params.keys + signature;
|
|
378
|
-
await tmux.sendTmuxKeys(keysWithSig, {
|
|
379
|
-
pane: targetPane,
|
|
380
|
-
enter: params.enter ?? true,
|
|
381
|
-
});
|
|
382
|
-
return {
|
|
383
|
-
content: [
|
|
384
|
-
{
|
|
385
|
-
type: "text",
|
|
386
|
-
text: `sent to ${targetPane}${params.enter === false ? " (no enter)" : ""}`,
|
|
387
|
-
},
|
|
388
|
-
],
|
|
389
|
-
};
|
|
390
|
-
}
|
|
391
|
-
catch (err) {
|
|
392
|
-
return {
|
|
393
|
-
content: [{ type: "text", text: String(err) }],
|
|
394
|
-
isError: true,
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
});
|
|
398
|
-
// tmux_kill_pane - Kill a pane
|
|
399
|
-
server.registerTool("tmux_kill_pane", {
|
|
400
|
-
description: "Kill a tmux pane by index (cannot close the last page)",
|
|
401
|
-
inputSchema: {
|
|
402
|
-
pane: z
|
|
403
|
-
.string()
|
|
404
|
-
.describe("Pane ID in %N format (e.g., %886). Do NOT use session:window.pane format - indices shift when panes are killed."),
|
|
405
|
-
},
|
|
406
|
-
}, async (params) => {
|
|
407
|
-
// Reject volatile formatted IDs
|
|
408
|
-
if (params.pane.includes(":") || params.pane.includes(".")) {
|
|
409
|
-
return {
|
|
410
|
-
content: [
|
|
411
|
-
{
|
|
412
|
-
type: "text",
|
|
413
|
-
text: `Invalid pane ID format: "${params.pane}". Use stable %N format (e.g., %886), not session:window.pane format which shifts when panes are killed.`,
|
|
414
|
-
},
|
|
415
|
-
],
|
|
416
|
-
isError: true,
|
|
417
|
-
};
|
|
418
|
-
}
|
|
419
|
-
const normalize = (id) => (id.startsWith("%") ? id : `%${id}`);
|
|
420
|
-
const inputNorm = normalize(params.pane);
|
|
421
|
-
// Safety: prevent killing current pane
|
|
422
|
-
const envPane = process.env.TMUX_PANE;
|
|
423
|
-
if (envPane && inputNorm === normalize(envPane)) {
|
|
424
|
-
return {
|
|
425
|
-
content: [{ type: "text", text: "cannot kill current pane (self)" }],
|
|
426
|
-
isError: true,
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
if (!envPane) {
|
|
430
|
-
const currentInfo = await getCurrentPaneInfo();
|
|
431
|
-
if (currentInfo.id && inputNorm === normalize(currentInfo.id)) {
|
|
432
|
-
return {
|
|
433
|
-
content: [{ type: "text", text: "cannot kill current pane (self)" }],
|
|
434
|
-
isError: true,
|
|
435
|
-
};
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
try {
|
|
439
|
-
await tmux.killTmuxPane(inputNorm);
|
|
440
|
-
return {
|
|
441
|
-
content: [{ type: "text", text: "killed" }],
|
|
442
|
-
};
|
|
443
|
-
}
|
|
444
|
-
catch (err) {
|
|
445
|
-
return {
|
|
446
|
-
content: [{ type: "text", text: String(err) }],
|
|
447
|
-
isError: true,
|
|
448
|
-
};
|
|
449
|
-
}
|
|
450
|
-
});
|
|
451
|
-
// tmux_capture - Capture pane content
|
|
452
|
-
server.registerTool("tmux_capture", {
|
|
453
|
-
description: "Capture the content of a tmux pane. Defaults to last 10 lines. Use filter for grep with context. Do not use this for checking result, just wait for notify.",
|
|
454
|
-
inputSchema: {
|
|
455
|
-
pane: z.string().describe("Target pane id to capture"),
|
|
456
|
-
lines: z
|
|
457
|
-
.number()
|
|
458
|
-
.optional()
|
|
459
|
-
.describe("Number of lines to capture from end (default: 10)"),
|
|
460
|
-
filter: z
|
|
461
|
-
.string()
|
|
462
|
-
.optional()
|
|
463
|
-
.describe("Grep pattern (case-insensitive, extended regex). Use | for OR: 'error|fail|warning'"),
|
|
464
|
-
},
|
|
465
|
-
}, async (params) => {
|
|
466
|
-
const currentPane = process.env.TMUX_PANE;
|
|
467
|
-
if (currentPane && params.pane === currentPane) {
|
|
468
|
-
return {
|
|
469
|
-
content: [{ type: "text", text: "cannot capture current pane" }],
|
|
470
|
-
isError: true,
|
|
471
|
-
};
|
|
472
|
-
}
|
|
473
|
-
try {
|
|
474
|
-
let output = await tmux.captureTmuxPane({
|
|
475
|
-
pane: params.pane,
|
|
476
|
-
lines: params.lines ?? 10,
|
|
477
|
-
});
|
|
478
|
-
if (params.filter?.trim()) {
|
|
479
|
-
const grepProc = spawn("grep", ["-i", "-E", "-C3", params.filter.trim()], {
|
|
480
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
481
|
-
});
|
|
482
|
-
grepProc.stdin.write(output);
|
|
483
|
-
grepProc.stdin.end();
|
|
484
|
-
output = await new Promise((resolve) => {
|
|
485
|
-
let out = "";
|
|
486
|
-
grepProc.stdout.on("data", (d) => (out += d.toString()));
|
|
487
|
-
grepProc.on("close", () => resolve(out.trim()));
|
|
488
|
-
});
|
|
489
|
-
}
|
|
490
|
-
return {
|
|
491
|
-
content: [{ type: "text", text: output || "(no matching content)" }],
|
|
492
|
-
};
|
|
493
|
-
}
|
|
494
|
-
catch (err) {
|
|
495
|
-
return {
|
|
496
|
-
content: [{ type: "text", text: String(err) }],
|
|
497
|
-
isError: true,
|
|
498
|
-
};
|
|
499
|
-
}
|
|
500
|
-
});
|
|
501
|
-
// tmux_run - Run command in new pane
|
|
502
|
-
server.registerTool("tmux_run", {
|
|
503
|
-
description: "Run a long-running command in a new tmux pane. Checks for existing panes with same name to prevent duplicates (e.g., port conflicts).",
|
|
504
|
-
inputSchema: {
|
|
505
|
-
command: z.string().describe("Command to run"),
|
|
506
|
-
name: z
|
|
507
|
-
.string()
|
|
508
|
-
.optional()
|
|
509
|
-
.describe("Unique identifier for duplicate detection. If omitted, derived from command."),
|
|
510
|
-
cwd: z
|
|
511
|
-
.string()
|
|
512
|
-
.optional()
|
|
513
|
-
.describe("Working directory for the command. Defaults to current project cwd."),
|
|
514
|
-
},
|
|
515
|
-
}, async (params) => {
|
|
516
|
-
if (!params.command?.trim()) {
|
|
517
|
-
return {
|
|
518
|
-
content: [{ type: "text", text: "command is required" }],
|
|
519
|
-
isError: true,
|
|
520
|
-
};
|
|
521
|
-
}
|
|
522
|
-
const workingDir = params.cwd || DEFAULT_CWD;
|
|
523
|
-
// Derive title
|
|
524
|
-
const cmdSlug = params.command
|
|
525
|
-
.trim()
|
|
526
|
-
.slice(0, 40)
|
|
527
|
-
.replace(/[^a-zA-Z0-9 _\-.]/g, "")
|
|
528
|
-
.trim();
|
|
529
|
-
const title = params.name?.trim()
|
|
530
|
-
? `pi-run:${cmdSlug}:${params.name.trim()}`
|
|
531
|
-
: `pi-run:${cmdSlug}`;
|
|
532
|
-
try {
|
|
533
|
-
// Check for existing pane with same title
|
|
534
|
-
const panes = await tmux.listTmuxPanes();
|
|
535
|
-
const existing = panes.find((pane) => pane.title === title);
|
|
536
|
-
if (existing) {
|
|
537
|
-
return {
|
|
538
|
-
content: [
|
|
539
|
-
{
|
|
540
|
-
type: "text",
|
|
541
|
-
text: `pane "${title}" already exists: ${existing.id}. Kill it first to restart.`,
|
|
542
|
-
},
|
|
543
|
-
],
|
|
544
|
-
isError: true,
|
|
545
|
-
};
|
|
546
|
-
}
|
|
547
|
-
// Build command with title setting
|
|
548
|
-
const startCommand = `cd ${shellQuote(workingDir)} && tmux set-option -p allow-set-title off && tmux select-pane -T ${shellQuote(title)} && ${params.command}`;
|
|
549
|
-
const paneId = await tmux.launchTmuxPane(startCommand, {
|
|
550
|
-
vertical: true,
|
|
551
|
-
size: 50,
|
|
552
|
-
});
|
|
553
|
-
if (!paneId) {
|
|
554
|
-
return {
|
|
555
|
-
content: [{ type: "text", text: "launch failed" }],
|
|
556
|
-
isError: true,
|
|
557
|
-
};
|
|
558
|
-
}
|
|
559
|
-
return {
|
|
560
|
-
content: [
|
|
561
|
-
{ type: "text", text: `started in pane ${paneId}. title: ${title}` },
|
|
562
|
-
],
|
|
563
|
-
};
|
|
564
|
-
}
|
|
565
|
-
catch (err) {
|
|
566
|
-
return {
|
|
567
|
-
content: [{ type: "text", text: String(err) }],
|
|
568
|
-
isError: true,
|
|
569
|
-
};
|
|
570
|
-
}
|
|
19
|
+
version: "0.3.0",
|
|
571
20
|
});
|
|
572
21
|
// ============================================================================
|
|
573
|
-
//
|
|
22
|
+
// Tools Registration
|
|
574
23
|
// ============================================================================
|
|
575
24
|
registerGrepFastTools(server);
|
|
25
|
+
registerCheckpointTools(server);
|
|
576
26
|
// ============================================================================
|
|
577
27
|
// Start Server
|
|
578
28
|
// ============================================================================
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAEhC,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|