@vibegrid/mcp 0.4.0-beta.0 → 0.4.0-beta.2
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/index.js +164 -2
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -237,7 +237,8 @@ function createSchema() {
|
|
|
237
237
|
remote_host_label TEXT,
|
|
238
238
|
hook_session_id TEXT,
|
|
239
239
|
status_source TEXT,
|
|
240
|
-
saved_at INTEGER
|
|
240
|
+
saved_at INTEGER,
|
|
241
|
+
sort_order INTEGER NOT NULL DEFAULT 0
|
|
241
242
|
);
|
|
242
243
|
|
|
243
244
|
CREATE TABLE IF NOT EXISTS schedule_log (
|
|
@@ -300,6 +301,34 @@ function createSchema() {
|
|
|
300
301
|
CREATE INDEX IF NOT EXISTS idx_workflow_runs_task ON workflow_runs(trigger_task_id);
|
|
301
302
|
CREATE INDEX IF NOT EXISTS idx_workflow_run_nodes_run ON workflow_run_nodes(run_id);
|
|
302
303
|
CREATE INDEX IF NOT EXISTS idx_workflow_run_nodes_task ON workflow_run_nodes(task_id);
|
|
304
|
+
|
|
305
|
+
CREATE TABLE IF NOT EXISTS session_logs (
|
|
306
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
307
|
+
task_id TEXT NOT NULL,
|
|
308
|
+
session_id TEXT NOT NULL,
|
|
309
|
+
agent_type TEXT,
|
|
310
|
+
branch TEXT,
|
|
311
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
312
|
+
started_at TEXT NOT NULL,
|
|
313
|
+
completed_at TEXT,
|
|
314
|
+
exit_code INTEGER,
|
|
315
|
+
logs TEXT,
|
|
316
|
+
project_name TEXT
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
CREATE INDEX IF NOT EXISTS idx_session_logs_task ON session_logs(task_id);
|
|
320
|
+
CREATE INDEX IF NOT EXISTS idx_session_logs_session ON session_logs(session_id);
|
|
321
|
+
|
|
322
|
+
CREATE TABLE IF NOT EXISTS session_events (
|
|
323
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
324
|
+
session_id TEXT NOT NULL,
|
|
325
|
+
event_type TEXT NOT NULL,
|
|
326
|
+
timestamp TEXT NOT NULL,
|
|
327
|
+
metadata TEXT
|
|
328
|
+
);
|
|
329
|
+
|
|
330
|
+
CREATE INDEX IF NOT EXISTS idx_session_events_session ON session_events(session_id, timestamp DESC);
|
|
331
|
+
CREATE INDEX IF NOT EXISTS idx_session_events_type ON session_events(event_type, timestamp DESC);
|
|
303
332
|
`);
|
|
304
333
|
migrateSchema(d);
|
|
305
334
|
}
|
|
@@ -359,6 +388,18 @@ function migrateSchema(d) {
|
|
|
359
388
|
})();
|
|
360
389
|
logger_default.info("[database] migrated schema to version 2 (ssh credential vault)");
|
|
361
390
|
}
|
|
391
|
+
if (version < 3) {
|
|
392
|
+
d.transaction(() => {
|
|
393
|
+
const sessionCols = d.prepare("PRAGMA table_info(sessions)").all();
|
|
394
|
+
if (!sessionCols.some((c) => c.name === "sort_order")) {
|
|
395
|
+
d.exec("ALTER TABLE sessions ADD COLUMN sort_order INTEGER NOT NULL DEFAULT 0");
|
|
396
|
+
}
|
|
397
|
+
d.prepare(
|
|
398
|
+
"INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('schema_version', '3')"
|
|
399
|
+
).run();
|
|
400
|
+
})();
|
|
401
|
+
logger_default.info("[database] migrated schema to version 3 (session sort order)");
|
|
402
|
+
}
|
|
362
403
|
}
|
|
363
404
|
function loadConfig() {
|
|
364
405
|
const d = getDb();
|
|
@@ -1648,6 +1689,91 @@ function registerSessionTools(server) {
|
|
|
1648
1689
|
}
|
|
1649
1690
|
}
|
|
1650
1691
|
);
|
|
1692
|
+
server.tool(
|
|
1693
|
+
"rename_session",
|
|
1694
|
+
"Rename a terminal session. Changes the display name shown in the UI.",
|
|
1695
|
+
{
|
|
1696
|
+
id: V.id.describe("Session ID"),
|
|
1697
|
+
display_name: V.shortText.describe("New display name")
|
|
1698
|
+
},
|
|
1699
|
+
async (args) => {
|
|
1700
|
+
try {
|
|
1701
|
+
await rpcCall("terminal:rename", { id: args.id, displayName: args.display_name });
|
|
1702
|
+
return {
|
|
1703
|
+
content: [{ type: "text", text: `Renamed session ${args.id} to "${args.display_name}"` }]
|
|
1704
|
+
};
|
|
1705
|
+
} catch (err) {
|
|
1706
|
+
return {
|
|
1707
|
+
content: [
|
|
1708
|
+
{
|
|
1709
|
+
type: "text",
|
|
1710
|
+
text: `Error renaming session: ${err instanceof Error ? err.message : err}`
|
|
1711
|
+
}
|
|
1712
|
+
],
|
|
1713
|
+
isError: true
|
|
1714
|
+
};
|
|
1715
|
+
}
|
|
1716
|
+
}
|
|
1717
|
+
);
|
|
1718
|
+
server.tool(
|
|
1719
|
+
"reorder_sessions",
|
|
1720
|
+
"Reorder terminal sessions in the grid. Provide session IDs in the desired display order.",
|
|
1721
|
+
{
|
|
1722
|
+
session_ids: z4.array(V.id).min(1, "At least one session ID is required").describe("Session IDs in desired order")
|
|
1723
|
+
},
|
|
1724
|
+
async (args) => {
|
|
1725
|
+
try {
|
|
1726
|
+
await rpcCall("terminal:reorder", args.session_ids);
|
|
1727
|
+
return {
|
|
1728
|
+
content: [
|
|
1729
|
+
{
|
|
1730
|
+
type: "text",
|
|
1731
|
+
text: `Reordered ${args.session_ids.length} sessions`
|
|
1732
|
+
}
|
|
1733
|
+
]
|
|
1734
|
+
};
|
|
1735
|
+
} catch (err) {
|
|
1736
|
+
return {
|
|
1737
|
+
content: [
|
|
1738
|
+
{
|
|
1739
|
+
type: "text",
|
|
1740
|
+
text: `Error reordering sessions: ${err instanceof Error ? err.message : err}`
|
|
1741
|
+
}
|
|
1742
|
+
],
|
|
1743
|
+
isError: true
|
|
1744
|
+
};
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1747
|
+
);
|
|
1748
|
+
server.tool(
|
|
1749
|
+
"read_session_output",
|
|
1750
|
+
"Read terminal output from a running session. Output is stored in a rolling 1000-line buffer with ANSI codes stripped.",
|
|
1751
|
+
{
|
|
1752
|
+
id: V.id.describe("Session ID"),
|
|
1753
|
+
lines: z4.number().int().min(1).max(1e3).optional().describe("Number of lines to read from the end (default: all)")
|
|
1754
|
+
},
|
|
1755
|
+
async (args) => {
|
|
1756
|
+
try {
|
|
1757
|
+
const output = await rpcCall("terminal:readOutput", {
|
|
1758
|
+
id: args.id,
|
|
1759
|
+
lines: args.lines
|
|
1760
|
+
});
|
|
1761
|
+
return {
|
|
1762
|
+
content: [{ type: "text", text: output.join("\n") }]
|
|
1763
|
+
};
|
|
1764
|
+
} catch (err) {
|
|
1765
|
+
return {
|
|
1766
|
+
content: [
|
|
1767
|
+
{
|
|
1768
|
+
type: "text",
|
|
1769
|
+
text: `Error reading session output: ${err instanceof Error ? err.message : err}`
|
|
1770
|
+
}
|
|
1771
|
+
],
|
|
1772
|
+
isError: true
|
|
1773
|
+
};
|
|
1774
|
+
}
|
|
1775
|
+
}
|
|
1776
|
+
);
|
|
1651
1777
|
server.tool(
|
|
1652
1778
|
"write_to_terminal",
|
|
1653
1779
|
"Send input to a running terminal session. Requires the VibeGrid app to be running.",
|
|
@@ -1674,6 +1800,42 @@ function registerSessionTools(server) {
|
|
|
1674
1800
|
}
|
|
1675
1801
|
}
|
|
1676
1802
|
);
|
|
1803
|
+
server.tool(
|
|
1804
|
+
"list_session_events",
|
|
1805
|
+
"List session lifecycle events (created, exited, task_linked, renamed, archived, unarchived). Use for post-mortem analysis and multi-agent coordination.",
|
|
1806
|
+
{
|
|
1807
|
+
session_id: V.id.optional().describe("Filter by session ID"),
|
|
1808
|
+
event_type: z4.enum(["created", "exited", "task_linked", "renamed", "archived", "unarchived"]).optional().describe("Filter by event type"),
|
|
1809
|
+
limit: z4.number().int().min(1).max(200).optional().describe("Max events to return (default: 50)")
|
|
1810
|
+
},
|
|
1811
|
+
async (args) => {
|
|
1812
|
+
try {
|
|
1813
|
+
let events;
|
|
1814
|
+
if (args.session_id) {
|
|
1815
|
+
events = await rpcCall("sessionEvent:listBySession", {
|
|
1816
|
+
sessionId: args.session_id,
|
|
1817
|
+
limit: args.limit ?? 50
|
|
1818
|
+
});
|
|
1819
|
+
} else {
|
|
1820
|
+
events = await rpcCall("sessionEvent:list", {
|
|
1821
|
+
eventType: args.event_type,
|
|
1822
|
+
limit: args.limit ?? 50
|
|
1823
|
+
});
|
|
1824
|
+
}
|
|
1825
|
+
return { content: [{ type: "text", text: JSON.stringify(events, null, 2) }] };
|
|
1826
|
+
} catch (err) {
|
|
1827
|
+
return {
|
|
1828
|
+
content: [
|
|
1829
|
+
{
|
|
1830
|
+
type: "text",
|
|
1831
|
+
text: `Error listing session events: ${err instanceof Error ? err.message : err}`
|
|
1832
|
+
}
|
|
1833
|
+
],
|
|
1834
|
+
isError: true
|
|
1835
|
+
};
|
|
1836
|
+
}
|
|
1837
|
+
}
|
|
1838
|
+
);
|
|
1677
1839
|
}
|
|
1678
1840
|
|
|
1679
1841
|
// src/tools/workflows.ts
|
|
@@ -2053,7 +2215,7 @@ console.warn = (...args) => _origError("[mcp:warn]", ...args);
|
|
|
2053
2215
|
console.error = (...args) => _origError("[mcp:error]", ...args);
|
|
2054
2216
|
async function main() {
|
|
2055
2217
|
configManager.init();
|
|
2056
|
-
const version = true ? "0.4.0-beta.
|
|
2218
|
+
const version = true ? "0.4.0-beta.2" : createRequire(import.meta.url)("../package.json").version;
|
|
2057
2219
|
const server = createMcpServer(version);
|
|
2058
2220
|
const transport = new StdioServerTransport();
|
|
2059
2221
|
await server.connect(transport);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibegrid/mcp",
|
|
3
|
-
"version": "0.4.0-beta.
|
|
3
|
+
"version": "0.4.0-beta.2",
|
|
4
4
|
"description": "VibeGrid MCP server — task management, git, and workflow tools for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
35
35
|
"libsql": "^0.5.22",
|
|
36
|
-
"pino": "^
|
|
36
|
+
"pino": "^10.3.1",
|
|
37
37
|
"ws": "^8.18.0",
|
|
38
38
|
"zod": "^3.23.0"
|
|
39
39
|
},
|