@dmsdc-ai/aigentry-deliberation 0.0.36 → 0.0.38

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/install.js +63 -21
  2. package/package.json +1 -1
package/install.js CHANGED
@@ -10,7 +10,7 @@
10
10
  * What it does:
11
11
  * 1. Copies server files to ~/.local/lib/mcp-deliberation/
12
12
  * 2. Installs npm dependencies
13
- * 3. Registers MCP server in ~/.claude/.mcp.json (Claude Code)
13
+ * 3. Registers MCP server via `claude mcp add` (Claude Code)
14
14
  * 4. Registers MCP server in ~/.gemini/settings.json (Gemini CLI)
15
15
  * 5. Ready to use — next Claude Code or Gemini CLI session will auto-load
16
16
  * 6. Installs skill file (~/.claude/skills/deliberation-gate/SKILL.md)
@@ -61,6 +61,15 @@ function log(msg) {
61
61
  console.log(` ${msg}`);
62
62
  }
63
63
 
64
+ function commandExists(cmd) {
65
+ try {
66
+ execSync(IS_WIN ? `where ${cmd}` : `command -v ${cmd}`, { stdio: "pipe" });
67
+ return true;
68
+ } catch {
69
+ return false;
70
+ }
71
+ }
72
+
64
73
  function copyFileIfExists(src, dest) {
65
74
  if (fs.existsSync(src)) {
66
75
  fs.copyFileSync(src, dest);
@@ -121,32 +130,55 @@ function install() {
121
130
  log(" Manual fix: cd ~/.local/lib/mcp-deliberation && npm install");
122
131
  }
123
132
 
124
- // Step 4: Register MCP server
133
+ // Step 4: Register MCP server (Claude Code)
125
134
  log("šŸ”§ Registering Claude Code MCP server...");
126
- const claudeDir = path.join(HOME, ".claude");
127
- fs.mkdirSync(claudeDir, { recursive: true });
135
+ const serverEntryPoint = toForwardSlash(path.join(INSTALL_DIR, "index.js"));
136
+ let claudeRegistered = false;
128
137
 
129
- let mcpConfig = {};
130
- if (fs.existsSync(MCP_CONFIG)) {
138
+ // Prefer `claude mcp add` — this is the only method Claude Code reliably reads
139
+ if (commandExists("claude")) {
131
140
  try {
132
- mcpConfig = JSON.parse(fs.readFileSync(MCP_CONFIG, "utf-8"));
133
- } catch {
134
- mcpConfig = {};
141
+ // Remove existing registration first (ignore errors if not registered)
142
+ try { execSync("claude mcp remove deliberation -s user", { stdio: "pipe" }); } catch { /* ok */ }
143
+ execSync(`claude mcp add deliberation -s user -- node "${serverEntryPoint}"`, {
144
+ stdio: "pipe",
145
+ });
146
+ log(" → Registered via 'claude mcp add' (user scope)");
147
+ claudeRegistered = true;
148
+ } catch (err) {
149
+ log(` āš ļø 'claude mcp add' failed: ${err.message}`);
135
150
  }
136
151
  }
137
152
 
138
- if (!mcpConfig.mcpServers) mcpConfig.mcpServers = {};
153
+ // Fallback: write ~/.claude/.mcp.json (legacy, may not be read by Claude Code)
154
+ if (!claudeRegistered) {
155
+ const claudeDir = path.join(HOME, ".claude");
156
+ fs.mkdirSync(claudeDir, { recursive: true });
139
157
 
140
- const alreadyRegistered = !!mcpConfig.mcpServers.deliberation;
141
- mcpConfig.mcpServers.deliberation = {
142
- command: "node",
143
- args: [toForwardSlash(path.join(INSTALL_DIR, "index.js"))],
144
- };
158
+ let mcpConfig = {};
159
+ if (fs.existsSync(MCP_CONFIG)) {
160
+ try {
161
+ mcpConfig = JSON.parse(fs.readFileSync(MCP_CONFIG, "utf-8"));
162
+ } catch {
163
+ mcpConfig = {};
164
+ }
165
+ }
166
+
167
+ if (!mcpConfig.mcpServers) mcpConfig.mcpServers = {};
168
+
169
+ const alreadyRegistered = !!mcpConfig.mcpServers.deliberation;
170
+ mcpConfig.mcpServers.deliberation = {
171
+ command: "node",
172
+ args: [serverEntryPoint],
173
+ };
145
174
 
146
- fs.writeFileSync(MCP_CONFIG, JSON.stringify(mcpConfig, null, 2));
147
- log(alreadyRegistered
148
- ? " → Existing registration updated"
149
- : " → Registered successfully");
175
+ fs.writeFileSync(MCP_CONFIG, JSON.stringify(mcpConfig, null, 2));
176
+ log(alreadyRegistered
177
+ ? " → Fallback: existing registration updated in .mcp.json"
178
+ : " → Fallback: registered in .mcp.json");
179
+ log(" āš ļø Claude CLI not found. Run manually if server isn't detected:");
180
+ log(` claude mcp add deliberation -s user -- node "${serverEntryPoint}"`);
181
+ }
150
182
 
151
183
  // Step 5: Register Gemini CLI MCP server
152
184
  log("šŸ”§ Registering Gemini CLI MCP server...");
@@ -283,14 +315,24 @@ Skill path: ${SKILL_DEST}
283
315
  } else if (args.includes("--uninstall") || args.includes("uninstall")) {
284
316
  console.log("\nšŸ—‘ļø Deliberation MCP Server — Uninstalling\n");
285
317
 
286
- // Remove from Claude MCP config
318
+ // Remove from Claude Code MCP registration
319
+ let claudeUnregistered = false;
320
+ if (commandExists("claude")) {
321
+ try {
322
+ execSync("claude mcp remove deliberation -s user", { stdio: "pipe" });
323
+ log("Claude Code MCP server unregistered via 'claude mcp remove'");
324
+ claudeUnregistered = true;
325
+ } catch { /* may not exist */ }
326
+ }
327
+
328
+ // Also clean up legacy .mcp.json fallback
287
329
  if (fs.existsSync(MCP_CONFIG)) {
288
330
  try {
289
331
  const mcpConfig = JSON.parse(fs.readFileSync(MCP_CONFIG, "utf-8"));
290
332
  if (mcpConfig.mcpServers?.deliberation) {
291
333
  delete mcpConfig.mcpServers.deliberation;
292
334
  fs.writeFileSync(MCP_CONFIG, JSON.stringify(mcpConfig, null, 2));
293
- log("Claude Code MCP server unregistered");
335
+ if (!claudeUnregistered) log("Claude Code MCP server unregistered from .mcp.json");
294
336
  }
295
337
  } catch { /* ignore */ }
296
338
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dmsdc-ai/aigentry-deliberation",
3
- "version": "0.0.36",
3
+ "version": "0.0.38",
4
4
  "description": "MCP Deliberation Server — Multi-session AI deliberation with smart speaker ordering and persona roles",
5
5
  "type": "module",
6
6
  "license": "MIT",