@basegrid_tech/mcp 0.11.1 → 0.13.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/dist/index.js +183 -7
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -28,6 +28,11 @@ var DEFAULT_WORKSPACE = {
|
|
|
28
28
|
iconColor: "#6b7280",
|
|
29
29
|
order: 0
|
|
30
30
|
};
|
|
31
|
+
var QUICK_COMMAND_LIMITS = {
|
|
32
|
+
maxCommands: 40,
|
|
33
|
+
maxLabel: 80,
|
|
34
|
+
maxBody: 4e3
|
|
35
|
+
};
|
|
31
36
|
|
|
32
37
|
// ../shared/src/agent-defaults.ts
|
|
33
38
|
var DEFAULT_AGENT_COMMANDS = {
|
|
@@ -134,6 +139,66 @@ var DEFAULT_NO_PROXY_HOSTS = [
|
|
|
134
139
|
];
|
|
135
140
|
var DEFAULT_NO_PROXY = DEFAULT_NO_PROXY_HOSTS.join(",");
|
|
136
141
|
|
|
142
|
+
// ../shared/src/quick-commands.ts
|
|
143
|
+
function normalizeQuickCommands(input) {
|
|
144
|
+
if (!Array.isArray(input)) return [];
|
|
145
|
+
const seenIds = /* @__PURE__ */ new Set();
|
|
146
|
+
const result = [];
|
|
147
|
+
for (const raw of input) {
|
|
148
|
+
if (result.length >= QUICK_COMMAND_LIMITS.maxCommands) break;
|
|
149
|
+
const cmd = normalizeOne(raw, seenIds);
|
|
150
|
+
if (cmd) {
|
|
151
|
+
seenIds.add(cmd.id);
|
|
152
|
+
result.push(cmd);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
function normalizeOne(raw, seenIds) {
|
|
158
|
+
if (!raw || typeof raw !== "object") return null;
|
|
159
|
+
const obj = raw;
|
|
160
|
+
const id = ensureUniqueId(typeof obj.id === "string" ? obj.id.trim() : "", seenIds);
|
|
161
|
+
if (!id) return null;
|
|
162
|
+
const label = clampString(obj.label, QUICK_COMMAND_LIMITS.maxLabel);
|
|
163
|
+
if (!label) return null;
|
|
164
|
+
const scope = normalizeScope(obj.scope);
|
|
165
|
+
const kind = obj.kind === "terminal" ? "terminal" : obj.kind === "agent" ? "agent" : null;
|
|
166
|
+
if (!kind) return null;
|
|
167
|
+
if (kind === "agent") {
|
|
168
|
+
const prompt = clampString(obj.prompt, QUICK_COMMAND_LIMITS.maxBody);
|
|
169
|
+
if (!prompt) return null;
|
|
170
|
+
const agentType = typeof obj.agentType === "string" ? obj.agentType : "claude";
|
|
171
|
+
const model = clampString(obj.model, QUICK_COMMAND_LIMITS.maxLabel);
|
|
172
|
+
return { id, label, scope, kind, agentType, prompt, ...model ? { model } : {} };
|
|
173
|
+
}
|
|
174
|
+
const command = clampString(obj.command, QUICK_COMMAND_LIMITS.maxBody);
|
|
175
|
+
if (!command) return null;
|
|
176
|
+
return {
|
|
177
|
+
id,
|
|
178
|
+
label,
|
|
179
|
+
scope,
|
|
180
|
+
kind,
|
|
181
|
+
command,
|
|
182
|
+
appendEnter: obj.appendEnter !== false
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function normalizeScope(_scope) {
|
|
186
|
+
return { type: "global" };
|
|
187
|
+
}
|
|
188
|
+
function clampString(value, max) {
|
|
189
|
+
if (typeof value !== "string") return "";
|
|
190
|
+
return value.trim().slice(0, max);
|
|
191
|
+
}
|
|
192
|
+
function ensureUniqueId(id, seenIds) {
|
|
193
|
+
if (!id) return "";
|
|
194
|
+
if (!seenIds.has(id)) return id;
|
|
195
|
+
for (let i = 2; i < 1e3; i++) {
|
|
196
|
+
const candidate = `${id}-${i}`;
|
|
197
|
+
if (!seenIds.has(candidate)) return candidate;
|
|
198
|
+
}
|
|
199
|
+
return "";
|
|
200
|
+
}
|
|
201
|
+
|
|
137
202
|
// ../server/src/default-workflows.ts
|
|
138
203
|
var DEFAULT_TASK_WORKFLOW_ID = "system:default-task-workflow";
|
|
139
204
|
function buildDefaultTaskWorkflow() {
|
|
@@ -364,7 +429,8 @@ function createSchema() {
|
|
|
364
429
|
icon TEXT,
|
|
365
430
|
icon_color TEXT,
|
|
366
431
|
host_ids TEXT,
|
|
367
|
-
project_id TEXT
|
|
432
|
+
project_id TEXT,
|
|
433
|
+
basegrid_config TEXT
|
|
368
434
|
);
|
|
369
435
|
-- UNIQUE INDEX \u043F\u043E project_id \u0441\u043E\u0437\u0434\u0430\u0451\u0442\u0441\u044F \u0432 \u043C\u0438\u0433\u0440\u0430\u0446\u0438\u0438 v17 (\u0441\u043C. migrateSchema):
|
|
370
436
|
-- \u043D\u0430 upgrade-\u0441\u0446\u0435\u043D\u0430\u0440\u0438\u0438 \u043A\u043E\u043B\u043E\u043D\u043A\u0438 project_id \u0435\u0449\u0451 \u043D\u0435\u0442, \u0438 CREATE INDEX \u0437\u0434\u0435\u0441\u044C \u043F\u0430\u0434\u0430\u043B \u0431\u044B.
|
|
@@ -391,6 +457,22 @@ function createSchema() {
|
|
|
391
457
|
fallback_args TEXT
|
|
392
458
|
);
|
|
393
459
|
|
|
460
|
+
-- Quick commands (\u043F\u043E\u0440\u0442 \u0444\u0438\u0447\u0438 \u0438\u0437 orca): \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B.
|
|
461
|
+
-- kind='agent' \u2192 \u0437\u0430\u043F\u0443\u0441\u043A \u0430\u0433\u0435\u043D\u0442\u0430 \u0441 \u043F\u0440\u043E\u043C\u043F\u0442\u043E\u043C; kind='terminal' \u2192 \u0448\u0435\u043B\u043B-\u043A\u043E\u043C\u0430\u043D\u0434\u0430.
|
|
462
|
+
-- scope \u0445\u0440\u0430\u043D\u0438\u0442\u0441\u044F JSON-\u0441\u0442\u0440\u043E\u043A\u043E\u0439 \u0434\u043B\u044F \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u043F\u0440\u0438\u0432\u044F\u0437\u043A\u0438 \u043A \u043F\u0440\u043E\u0435\u043A\u0442\u0443 (\u0441\u0435\u0439\u0447\u0430\u0441 global).
|
|
463
|
+
CREATE TABLE IF NOT EXISTS quick_commands (
|
|
464
|
+
id TEXT PRIMARY KEY,
|
|
465
|
+
label TEXT NOT NULL,
|
|
466
|
+
kind TEXT NOT NULL,
|
|
467
|
+
scope TEXT NOT NULL DEFAULT '{"type":"global"}',
|
|
468
|
+
agent_type TEXT,
|
|
469
|
+
prompt TEXT,
|
|
470
|
+
model TEXT,
|
|
471
|
+
command TEXT,
|
|
472
|
+
append_enter INTEGER NOT NULL DEFAULT 1,
|
|
473
|
+
position INTEGER NOT NULL DEFAULT 0
|
|
474
|
+
);
|
|
475
|
+
|
|
394
476
|
CREATE TABLE IF NOT EXISTS remote_hosts (
|
|
395
477
|
id TEXT PRIMARY KEY,
|
|
396
478
|
label TEXT NOT NULL,
|
|
@@ -623,6 +705,19 @@ function createSchema() {
|
|
|
623
705
|
ON usage_metrics(project_path, timestamp);
|
|
624
706
|
CREATE INDEX IF NOT EXISTS idx_usage_metrics_ts
|
|
625
707
|
ON usage_metrics(timestamp);
|
|
708
|
+
|
|
709
|
+
CREATE TABLE IF NOT EXISTS usage_limit_snapshots (
|
|
710
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
711
|
+
window_type TEXT NOT NULL,
|
|
712
|
+
snapshot_at INTEGER NOT NULL,
|
|
713
|
+
used_percent REAL NOT NULL,
|
|
714
|
+
resets_at INTEGER
|
|
715
|
+
);
|
|
716
|
+
|
|
717
|
+
-- Unique per (window, fetch time): also serves the ordered range scan the
|
|
718
|
+
-- sparkline reads with, so no extra index is needed.
|
|
719
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_usage_limit_snap_unique
|
|
720
|
+
ON usage_limit_snapshots(window_type, snapshot_at);
|
|
626
721
|
`);
|
|
627
722
|
migrateSchema(d);
|
|
628
723
|
verifySchema(d);
|
|
@@ -1193,6 +1288,18 @@ function migrateSchema(d) {
|
|
|
1193
1288
|
})();
|
|
1194
1289
|
logger_default.info("[database] migrated schema to version 26 (worktree is_auto_generated flag)");
|
|
1195
1290
|
}
|
|
1291
|
+
if (version < 27) {
|
|
1292
|
+
d.transaction(() => {
|
|
1293
|
+
const cols = d.prepare("PRAGMA table_info(projects)").all();
|
|
1294
|
+
if (!cols.some((c) => c.name === "basegrid_config")) {
|
|
1295
|
+
d.exec("ALTER TABLE projects ADD COLUMN basegrid_config TEXT");
|
|
1296
|
+
}
|
|
1297
|
+
d.prepare(
|
|
1298
|
+
"INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('schema_version', '27')"
|
|
1299
|
+
).run();
|
|
1300
|
+
})();
|
|
1301
|
+
logger_default.info("[database] migrated schema to version 27 (projects.basegrid_config overrides)");
|
|
1302
|
+
}
|
|
1196
1303
|
}
|
|
1197
1304
|
function verifySchema(d) {
|
|
1198
1305
|
const expectedTables = [
|
|
@@ -1263,6 +1370,10 @@ function verifySchema(d) {
|
|
|
1263
1370
|
{
|
|
1264
1371
|
column: "project_id",
|
|
1265
1372
|
ddl: "ALTER TABLE projects ADD COLUMN project_id TEXT"
|
|
1373
|
+
},
|
|
1374
|
+
{
|
|
1375
|
+
column: "basegrid_config",
|
|
1376
|
+
ddl: "ALTER TABLE projects ADD COLUMN basegrid_config TEXT"
|
|
1266
1377
|
}
|
|
1267
1378
|
],
|
|
1268
1379
|
workflows: [
|
|
@@ -1379,6 +1490,7 @@ function loadConfig() {
|
|
|
1379
1490
|
const projects = loadProjects(d);
|
|
1380
1491
|
const agentCommands = loadAgentCommands(d);
|
|
1381
1492
|
const workflows = loadWorkflows(d);
|
|
1493
|
+
const quickCommands = loadQuickCommands(d);
|
|
1382
1494
|
const remoteHosts = loadRemoteHosts(d);
|
|
1383
1495
|
const tasks = loadTasks(d);
|
|
1384
1496
|
const workspaces = loadWorkspaces(d);
|
|
@@ -1388,6 +1500,7 @@ function loadConfig() {
|
|
|
1388
1500
|
projects,
|
|
1389
1501
|
agentCommands: Object.keys(agentCommands).length > 0 ? agentCommands : { ...DEFAULT_AGENT_COMMANDS },
|
|
1390
1502
|
workflows,
|
|
1503
|
+
quickCommands,
|
|
1391
1504
|
remoteHosts,
|
|
1392
1505
|
tasks,
|
|
1393
1506
|
workspaces,
|
|
@@ -1493,6 +1606,28 @@ function loadWorkflows(d) {
|
|
|
1493
1606
|
const rows = d.prepare("SELECT * FROM workflows").all();
|
|
1494
1607
|
return rows.map(rowToWorkflow);
|
|
1495
1608
|
}
|
|
1609
|
+
function loadQuickCommands(d) {
|
|
1610
|
+
const rows = d.prepare("SELECT * FROM quick_commands ORDER BY position ASC").all();
|
|
1611
|
+
const raw = rows.map((r) => ({
|
|
1612
|
+
id: r.id,
|
|
1613
|
+
label: r.label,
|
|
1614
|
+
kind: r.kind,
|
|
1615
|
+
scope: r.scope ? safeParseJson(r.scope) : { type: "global" },
|
|
1616
|
+
agentType: r.agent_type ?? void 0,
|
|
1617
|
+
prompt: r.prompt ?? void 0,
|
|
1618
|
+
model: r.model ?? void 0,
|
|
1619
|
+
command: r.command ?? void 0,
|
|
1620
|
+
appendEnter: r.append_enter !== 0
|
|
1621
|
+
}));
|
|
1622
|
+
return normalizeQuickCommands(raw);
|
|
1623
|
+
}
|
|
1624
|
+
function safeParseJson(s) {
|
|
1625
|
+
try {
|
|
1626
|
+
return JSON.parse(s);
|
|
1627
|
+
} catch {
|
|
1628
|
+
return void 0;
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1496
1631
|
function loadAgentCommands(d) {
|
|
1497
1632
|
const rows = d.prepare("SELECT * FROM agent_commands").all();
|
|
1498
1633
|
const result = {};
|
|
@@ -1546,7 +1681,7 @@ function saveConfig(config) {
|
|
|
1546
1681
|
}
|
|
1547
1682
|
d.prepare("DELETE FROM projects").run();
|
|
1548
1683
|
const insertProject = d.prepare(
|
|
1549
|
-
"INSERT INTO projects (name, path, preferred_agents, icon, icon_color, host_ids, workspace_id, project_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
|
|
1684
|
+
"INSERT INTO projects (name, path, preferred_agents, icon, icon_color, host_ids, workspace_id, project_id, basegrid_config) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
|
1550
1685
|
);
|
|
1551
1686
|
for (const p of config.projects) {
|
|
1552
1687
|
const projectId = p.projectId ?? existingIds.get(p.name) ?? randomUUID();
|
|
@@ -1558,7 +1693,8 @@ function saveConfig(config) {
|
|
|
1558
1693
|
p.iconColor ?? null,
|
|
1559
1694
|
p.hostIds ? JSON.stringify(p.hostIds) : null,
|
|
1560
1695
|
p.workspaceId ?? "personal",
|
|
1561
|
-
projectId
|
|
1696
|
+
projectId,
|
|
1697
|
+
serializeBasegridConfig(p.basegridConfig)
|
|
1562
1698
|
);
|
|
1563
1699
|
}
|
|
1564
1700
|
d.prepare("DELETE FROM workflows").run();
|
|
@@ -1581,6 +1717,26 @@ function saveConfig(config) {
|
|
|
1581
1717
|
w.workspaceId ?? "personal"
|
|
1582
1718
|
);
|
|
1583
1719
|
}
|
|
1720
|
+
d.prepare("DELETE FROM quick_commands").run();
|
|
1721
|
+
const insertQuickCommand = d.prepare(
|
|
1722
|
+
`INSERT INTO quick_commands (id, label, kind, scope, agent_type, prompt, model, command, append_enter, position)
|
|
1723
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
1724
|
+
);
|
|
1725
|
+
const normalizedQuickCommands = normalizeQuickCommands(config.quickCommands ?? []);
|
|
1726
|
+
normalizedQuickCommands.forEach((q, index) => {
|
|
1727
|
+
insertQuickCommand.run(
|
|
1728
|
+
q.id,
|
|
1729
|
+
q.label,
|
|
1730
|
+
q.kind,
|
|
1731
|
+
JSON.stringify(q.scope),
|
|
1732
|
+
q.kind === "agent" ? q.agentType : null,
|
|
1733
|
+
q.kind === "agent" ? q.prompt : null,
|
|
1734
|
+
q.kind === "agent" ? q.model ?? null : null,
|
|
1735
|
+
q.kind === "terminal" ? q.command : null,
|
|
1736
|
+
q.kind === "terminal" && q.appendEnter ? 1 : 0,
|
|
1737
|
+
index
|
|
1738
|
+
);
|
|
1739
|
+
});
|
|
1584
1740
|
d.prepare("DELETE FROM agent_commands").run();
|
|
1585
1741
|
const insertAgent = d.prepare(
|
|
1586
1742
|
"INSERT INTO agent_commands (agent_type, command, args, headless_args, fallback_command, fallback_args) VALUES (?, ?, ?, ?, ?, ?)"
|
|
@@ -1750,7 +1906,7 @@ function dbGetProject(name) {
|
|
|
1750
1906
|
function dbInsertProject(project) {
|
|
1751
1907
|
const projectId = project.projectId ?? randomUUID();
|
|
1752
1908
|
getDb().prepare(
|
|
1753
|
-
"INSERT INTO projects (name, path, preferred_agents, icon, icon_color, host_ids, workspace_id, project_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
|
|
1909
|
+
"INSERT INTO projects (name, path, preferred_agents, icon, icon_color, host_ids, workspace_id, project_id, basegrid_config) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
|
1754
1910
|
).run(
|
|
1755
1911
|
project.name,
|
|
1756
1912
|
project.path,
|
|
@@ -1759,7 +1915,8 @@ function dbInsertProject(project) {
|
|
|
1759
1915
|
project.iconColor ?? null,
|
|
1760
1916
|
project.hostIds ? JSON.stringify(project.hostIds) : null,
|
|
1761
1917
|
project.workspaceId ?? "personal",
|
|
1762
|
-
projectId
|
|
1918
|
+
projectId,
|
|
1919
|
+
serializeBasegridConfig(project.basegridConfig)
|
|
1763
1920
|
);
|
|
1764
1921
|
}
|
|
1765
1922
|
function dbUpdateProject(name, updates) {
|
|
@@ -1789,6 +1946,10 @@ function dbUpdateProject(name, updates) {
|
|
|
1789
1946
|
sets.push("workspace_id = ?");
|
|
1790
1947
|
params.push(updates.workspaceId);
|
|
1791
1948
|
}
|
|
1949
|
+
if (updates.basegridConfig !== void 0) {
|
|
1950
|
+
sets.push("basegrid_config = ?");
|
|
1951
|
+
params.push(serializeBasegridConfig(updates.basegridConfig));
|
|
1952
|
+
}
|
|
1792
1953
|
if (sets.length === 0) return;
|
|
1793
1954
|
params.push(name);
|
|
1794
1955
|
getDb().prepare(`UPDATE projects SET ${sets.join(", ")} WHERE name = ?`).run(...params);
|
|
@@ -1932,6 +2093,7 @@ function rowToTask(r) {
|
|
|
1932
2093
|
};
|
|
1933
2094
|
}
|
|
1934
2095
|
function rowToProject(r) {
|
|
2096
|
+
const basegridConfig = parseBasegridConfig(r.basegrid_config);
|
|
1935
2097
|
return {
|
|
1936
2098
|
name: r.name,
|
|
1937
2099
|
path: r.path,
|
|
@@ -1940,9 +2102,23 @@ function rowToProject(r) {
|
|
|
1940
2102
|
...r.icon_color != null && { iconColor: r.icon_color },
|
|
1941
2103
|
...r.host_ids != null && { hostIds: JSON.parse(r.host_ids) },
|
|
1942
2104
|
workspaceId: r.workspace_id ?? "personal",
|
|
1943
|
-
...r.project_id != null && r.project_id !== "" && { projectId: r.project_id }
|
|
2105
|
+
...r.project_id != null && r.project_id !== "" && { projectId: r.project_id },
|
|
2106
|
+
...basegridConfig && { basegridConfig }
|
|
1944
2107
|
};
|
|
1945
2108
|
}
|
|
2109
|
+
function parseBasegridConfig(raw) {
|
|
2110
|
+
if (!raw) return null;
|
|
2111
|
+
try {
|
|
2112
|
+
const parsed = JSON.parse(raw);
|
|
2113
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
2114
|
+
} catch {
|
|
2115
|
+
return null;
|
|
2116
|
+
}
|
|
2117
|
+
}
|
|
2118
|
+
function serializeBasegridConfig(cfg) {
|
|
2119
|
+
if (!cfg || Object.keys(cfg).length === 0) return null;
|
|
2120
|
+
return JSON.stringify(cfg);
|
|
2121
|
+
}
|
|
1946
2122
|
function rowToWorkflow(r) {
|
|
1947
2123
|
return {
|
|
1948
2124
|
id: r.id,
|
|
@@ -3586,7 +3762,7 @@ console.warn = (...args) => _origError("[mcp:warn]", ...args);
|
|
|
3586
3762
|
console.error = (...args) => _origError("[mcp:error]", ...args);
|
|
3587
3763
|
async function main() {
|
|
3588
3764
|
configManager.init();
|
|
3589
|
-
const version = true ? "0.
|
|
3765
|
+
const version = true ? "0.13.0" : createRequire(import.meta.url)("../package.json").version;
|
|
3590
3766
|
const server = createMcpServer(version);
|
|
3591
3767
|
const transport = new StdioServerTransport();
|
|
3592
3768
|
await server.connect(transport);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@basegrid_tech/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "BaseGrid MCP server — task management, git, and workflow tools for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"zod": "^4.3.6"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@basegrid/server": "0.
|
|
46
|
-
"@basegrid/shared": "0.
|
|
45
|
+
"@basegrid/server": "0.13.0",
|
|
46
|
+
"@basegrid/shared": "0.13.0",
|
|
47
47
|
"tsup": "^8.5.1",
|
|
48
48
|
"tsx": "^4.21.0",
|
|
49
49
|
"typescript": "^6.0.3"
|