@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.
Files changed (2) hide show
  1. package/dist/index.js +183 -7
  2. 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.11.1" : createRequire(import.meta.url)("../package.json").version;
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.11.1",
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.11.1",
46
- "@basegrid/shared": "0.11.1",
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"