@neurodock/cli 0.4.3 → 0.6.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/CHANGELOG.md +93 -0
- package/README.md +39 -12
- package/dist/assets/hooks/neurodock_daemon.py +506 -0
- package/dist/assets/hooks/proactive_guardrail.py +520 -0
- package/dist/commands/install-hooks.d.ts +20 -0
- package/dist/commands/install-hooks.d.ts.map +1 -0
- package/dist/commands/install-hooks.js +356 -0
- package/dist/commands/install-hooks.js.map +1 -0
- package/dist/commands/sync.d.ts +24 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +179 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/update.d.ts +13 -22
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +11 -176
- package/dist/commands/update.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -3
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
- package/LICENSE +0 -661
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neurodock install-hooks` — wire NeuroDock's proactive guardrails into
|
|
3
|
+
* Claude Code's hook system.
|
|
4
|
+
*
|
|
5
|
+
* What this does (idempotent):
|
|
6
|
+
*
|
|
7
|
+
* 1. Copies the bundled `proactive_guardrail.py` script to
|
|
8
|
+
* `~/.neurodock/hooks/proactive_guardrail.py` (creating dirs as needed).
|
|
9
|
+
* 2. Merges four hook entries (SessionStart / PreToolUse / PostToolUse /
|
|
10
|
+
* Stop) into `~/.claude/settings.json`, preserving any existing hooks
|
|
11
|
+
* from other tools and skipping if NeuroDock entries are already
|
|
12
|
+
* present.
|
|
13
|
+
* 3. Optionally runs the script's `self-test` to verify Python is on
|
|
14
|
+
* PATH and the heuristics fire.
|
|
15
|
+
*
|
|
16
|
+
* Why a CLI command and not just docs:
|
|
17
|
+
*
|
|
18
|
+
* The setup is fiddly enough that asking users to hand-edit JSON to
|
|
19
|
+
* wire four hooks is the kind of friction that defeats the whole
|
|
20
|
+
* proactive-guardrails purpose. The user types one command.
|
|
21
|
+
*
|
|
22
|
+
* Opt-out:
|
|
23
|
+
*
|
|
24
|
+
* `neurodock install-hooks --uninstall` removes the hook entries
|
|
25
|
+
* (leaves the script in place — re-enabling is just a re-run).
|
|
26
|
+
* Environment variable `NEURODOCK_GUARDRAILS=off` disables the hook
|
|
27
|
+
* without touching settings.json.
|
|
28
|
+
*/
|
|
29
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync, copyFileSync, } from "node:fs";
|
|
30
|
+
import { dirname, join, resolve } from "node:path";
|
|
31
|
+
import { fileURLToPath } from "node:url";
|
|
32
|
+
import { homedir } from "node:os";
|
|
33
|
+
import { spawnSync } from "node:child_process";
|
|
34
|
+
const HOOK_EVENTS = [
|
|
35
|
+
"SessionStart",
|
|
36
|
+
"PreToolUse",
|
|
37
|
+
"PostToolUse",
|
|
38
|
+
"Stop",
|
|
39
|
+
];
|
|
40
|
+
const SUBCOMMAND_FOR_EVENT = {
|
|
41
|
+
SessionStart: "session-start",
|
|
42
|
+
PreToolUse: "pre-tool",
|
|
43
|
+
PostToolUse: "post-tool",
|
|
44
|
+
Stop: "stop",
|
|
45
|
+
};
|
|
46
|
+
const NEURODOCK_MARKER = "neurodock-proactive-guardrail";
|
|
47
|
+
export async function runInstallHooks(options) {
|
|
48
|
+
const messages = [];
|
|
49
|
+
const hookDir = join(homedir(), ".neurodock", "hooks");
|
|
50
|
+
const targetScript = join(hookDir, "proactive_guardrail.py");
|
|
51
|
+
const settingsPath = join(homedir(), ".claude", "settings.json");
|
|
52
|
+
if (options.uninstall) {
|
|
53
|
+
return uninstallHooks(settingsPath, options.dryRun);
|
|
54
|
+
}
|
|
55
|
+
// 1. Copy the bundled script(s).
|
|
56
|
+
const sourceScript = resolveBundledScript("proactive_guardrail.py");
|
|
57
|
+
if (sourceScript === null) {
|
|
58
|
+
return {
|
|
59
|
+
messages: [
|
|
60
|
+
"[install-hooks] could not locate the bundled proactive_guardrail.py.",
|
|
61
|
+
" This is a packaging bug — the script should ship with @neurodock/cli.",
|
|
62
|
+
],
|
|
63
|
+
exitCode: 1,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const daemonSource = resolveBundledScript("neurodock_daemon.py");
|
|
67
|
+
const daemonTarget = join(hookDir, "neurodock_daemon.py");
|
|
68
|
+
if (options.dryRun) {
|
|
69
|
+
messages.push(`[install-hooks] would copy ${sourceScript} -> ${targetScript}`);
|
|
70
|
+
if (daemonSource !== null) {
|
|
71
|
+
messages.push(`[install-hooks] would copy ${daemonSource} -> ${daemonTarget}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
mkdirSync(hookDir, { recursive: true });
|
|
76
|
+
copyFileSync(sourceScript, targetScript);
|
|
77
|
+
messages.push(`[install-hooks] copied script -> ${targetScript}`);
|
|
78
|
+
if (daemonSource !== null) {
|
|
79
|
+
copyFileSync(daemonSource, daemonTarget);
|
|
80
|
+
messages.push(`[install-hooks] copied daemon -> ${daemonTarget}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// 2. Merge hook entries into settings.json.
|
|
84
|
+
const command = buildHookCommand(targetScript);
|
|
85
|
+
// Always echo the exact command string we're about to write. The
|
|
86
|
+
// Windows-path-escape bug (0.0.x ~/.neurodock/hooks/... mangled by
|
|
87
|
+
// bash) was a silent foot-gun precisely because the install summary
|
|
88
|
+
// didn't show it. Now it does, and a quick scan tells you whether
|
|
89
|
+
// forward slashes survived.
|
|
90
|
+
messages.push(`[install-hooks] hook command: ${command} <subcommand>`);
|
|
91
|
+
const merged = mergeSettings(settingsPath, command);
|
|
92
|
+
if (merged.changed) {
|
|
93
|
+
if (options.dryRun) {
|
|
94
|
+
messages.push("[install-hooks] would update ~/.claude/settings.json:");
|
|
95
|
+
for (const line of merged.diff)
|
|
96
|
+
messages.push(` ${line}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
mkdirSync(dirname(settingsPath), { recursive: true });
|
|
100
|
+
writeFileSync(settingsPath, merged.json + "\n", "utf8");
|
|
101
|
+
messages.push("[install-hooks] updated ~/.claude/settings.json");
|
|
102
|
+
for (const line of merged.diff)
|
|
103
|
+
messages.push(` ${line}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
messages.push("[install-hooks] settings.json already wired — no change needed.");
|
|
108
|
+
}
|
|
109
|
+
// 3. Optionally self-test.
|
|
110
|
+
if (options.selfTest && !options.dryRun) {
|
|
111
|
+
const selfTest = runSelfTest(targetScript);
|
|
112
|
+
messages.push(`[install-hooks] self-test: ${selfTest.summary}`);
|
|
113
|
+
if (selfTest.exitCode !== 0) {
|
|
114
|
+
return { messages, exitCode: 1 };
|
|
115
|
+
}
|
|
116
|
+
if (daemonSource !== null) {
|
|
117
|
+
const daemonSelfTest = runSelfTest(daemonTarget);
|
|
118
|
+
messages.push(`[install-hooks] daemon self-test: ${daemonSelfTest.summary}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// 4. Optionally wire the daemon at user-login autostart.
|
|
122
|
+
if (options.installDaemon === true && !options.dryRun) {
|
|
123
|
+
if (daemonSource === null) {
|
|
124
|
+
messages.push("[install-hooks] daemon script not bundled — skipping autostart.");
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const result = spawnSync("python", [daemonTarget, "install"], {
|
|
128
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
129
|
+
encoding: "utf8",
|
|
130
|
+
});
|
|
131
|
+
if (result.error) {
|
|
132
|
+
messages.push(`[install-hooks] daemon autostart skipped — python not on PATH (${result.error.message}).`);
|
|
133
|
+
}
|
|
134
|
+
else if (result.status !== 0) {
|
|
135
|
+
messages.push(`[install-hooks] daemon autostart failed: ${result.stderr.trim()}`);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
messages.push(`[install-hooks] daemon autostart: ${result.stdout.trim()}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (options.installDaemon === true && options.dryRun) {
|
|
143
|
+
messages.push("[install-hooks] would register daemon autostart (HKCU Run / LaunchAgent / systemd --user)");
|
|
144
|
+
}
|
|
145
|
+
messages.push("");
|
|
146
|
+
messages.push("Done. Open a new Claude Code session to activate the hooks.");
|
|
147
|
+
messages.push("Opt out anytime by setting NEURODOCK_GUARDRAILS=off in your environment,");
|
|
148
|
+
messages.push("or run: neurodock install-hooks --uninstall");
|
|
149
|
+
return { messages, exitCode: 0 };
|
|
150
|
+
}
|
|
151
|
+
function uninstallHooks(settingsPath, dryRun) {
|
|
152
|
+
const messages = [];
|
|
153
|
+
// 0.0.23: also try to remove the daemon autostart entry. Best-effort
|
|
154
|
+
// — if the daemon was never installed, the uninstall is a no-op.
|
|
155
|
+
if (!dryRun) {
|
|
156
|
+
const daemonTarget = join(homedir(), ".neurodock", "hooks", "neurodock_daemon.py");
|
|
157
|
+
if (existsSync(daemonTarget)) {
|
|
158
|
+
const result = spawnSync("python", [daemonTarget, "uninstall"], {
|
|
159
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
160
|
+
encoding: "utf8",
|
|
161
|
+
});
|
|
162
|
+
if (!result.error && result.status === 0) {
|
|
163
|
+
messages.push("[install-hooks] removed daemon autostart entry");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
messages.push("[install-hooks] would also remove daemon autostart entry");
|
|
169
|
+
}
|
|
170
|
+
if (!existsSync(settingsPath)) {
|
|
171
|
+
return {
|
|
172
|
+
messages: [
|
|
173
|
+
...messages,
|
|
174
|
+
"[install-hooks] no ~/.claude/settings.json to clean — nothing to do.",
|
|
175
|
+
],
|
|
176
|
+
exitCode: 0,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const raw = readFileSync(settingsPath, "utf8");
|
|
180
|
+
const settings = parseSettings(raw);
|
|
181
|
+
const hooks = isObject(settings.hooks) ? { ...settings.hooks } : {};
|
|
182
|
+
let removedAny = false;
|
|
183
|
+
for (const event of HOOK_EVENTS) {
|
|
184
|
+
const entries = hooks[event];
|
|
185
|
+
if (!Array.isArray(entries))
|
|
186
|
+
continue;
|
|
187
|
+
const filtered = entries.filter((entry) => !isNeurodockHookEntry(entry));
|
|
188
|
+
if (filtered.length !== entries.length) {
|
|
189
|
+
removedAny = true;
|
|
190
|
+
if (filtered.length === 0) {
|
|
191
|
+
delete hooks[event];
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
hooks[event] = filtered;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (!removedAny) {
|
|
199
|
+
return {
|
|
200
|
+
messages: [
|
|
201
|
+
"[install-hooks] no NeuroDock hook entries found — nothing to do.",
|
|
202
|
+
],
|
|
203
|
+
exitCode: 0,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const next = { ...settings, hooks };
|
|
207
|
+
// Drop empty hooks object so we don't leave dead structure behind.
|
|
208
|
+
if (Object.keys(hooks).length === 0)
|
|
209
|
+
delete next["hooks"];
|
|
210
|
+
const formatted = JSON.stringify(next, null, 2);
|
|
211
|
+
if (dryRun) {
|
|
212
|
+
messages.push("[install-hooks] would remove NeuroDock entries from ~/.claude/settings.json");
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
writeFileSync(settingsPath, formatted + "\n", "utf8");
|
|
216
|
+
messages.push("[install-hooks] removed NeuroDock entries from ~/.claude/settings.json");
|
|
217
|
+
}
|
|
218
|
+
messages.push("Hook script left at ~/.neurodock/hooks/ — delete manually if you want it gone.");
|
|
219
|
+
return { messages, exitCode: 0 };
|
|
220
|
+
}
|
|
221
|
+
function mergeSettings(settingsPath, command) {
|
|
222
|
+
let raw = "{}";
|
|
223
|
+
if (existsSync(settingsPath)) {
|
|
224
|
+
try {
|
|
225
|
+
raw = readFileSync(settingsPath, "utf8");
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
raw = "{}";
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const settings = parseSettings(raw);
|
|
232
|
+
const hooks = isObject(settings.hooks) ? { ...settings.hooks } : {};
|
|
233
|
+
const diff = [];
|
|
234
|
+
let changed = false;
|
|
235
|
+
for (const event of HOOK_EVENTS) {
|
|
236
|
+
const existing = Array.isArray(hooks[event]) ? [...hooks[event]] : [];
|
|
237
|
+
if (existing.some(isNeurodockHookEntry))
|
|
238
|
+
continue;
|
|
239
|
+
const newEntry = buildHookEntry(event, command);
|
|
240
|
+
existing.push(newEntry);
|
|
241
|
+
hooks[event] = existing;
|
|
242
|
+
diff.push(`+ ${event} -> ${SUBCOMMAND_FOR_EVENT[event]}`);
|
|
243
|
+
changed = true;
|
|
244
|
+
}
|
|
245
|
+
if (!changed) {
|
|
246
|
+
return { changed: false, json: raw, diff: [] };
|
|
247
|
+
}
|
|
248
|
+
const next = { ...settings, hooks };
|
|
249
|
+
return {
|
|
250
|
+
changed: true,
|
|
251
|
+
json: JSON.stringify(next, null, 2),
|
|
252
|
+
diff,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
function buildHookEntry(event, command) {
|
|
256
|
+
const subcommand = SUBCOMMAND_FOR_EVENT[event];
|
|
257
|
+
return {
|
|
258
|
+
// Claude Code reads this as a "matcher group". An empty matcher
|
|
259
|
+
// applies to all events of this type, which is what we want — the
|
|
260
|
+
// proactive guardrail evaluates on every event and decides whether
|
|
261
|
+
// to fire based on its own state.
|
|
262
|
+
matcher: "",
|
|
263
|
+
hooks: [
|
|
264
|
+
{
|
|
265
|
+
type: "command",
|
|
266
|
+
command: `${command} ${subcommand}`,
|
|
267
|
+
// Tag the entry so neurodock install-hooks can find and remove
|
|
268
|
+
// it later without scanning the entire command string.
|
|
269
|
+
description: NEURODOCK_MARKER,
|
|
270
|
+
},
|
|
271
|
+
],
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
function buildHookCommand(scriptPath) {
|
|
275
|
+
// Always normalise to forward slashes. Python accepts them on Windows,
|
|
276
|
+
// and bash-style shells (Git Bash / MinGW — what Claude Code uses on
|
|
277
|
+
// Windows) strip backslashes from unquoted Windows paths, mangling
|
|
278
|
+
// the path passed to python. Quoting alone isn't enough because the
|
|
279
|
+
// JSON-decoded value goes through one more shell pass that strips
|
|
280
|
+
// escape sequences like `\U`, `\h`. Forward slashes side-step it.
|
|
281
|
+
const normalised = scriptPath.replace(/\\/g, "/");
|
|
282
|
+
const quoted = `"${normalised}"`;
|
|
283
|
+
return `python ${quoted}`;
|
|
284
|
+
}
|
|
285
|
+
function isNeurodockHookEntry(entry) {
|
|
286
|
+
if (!isObject(entry))
|
|
287
|
+
return false;
|
|
288
|
+
const hooks = entry.hooks;
|
|
289
|
+
if (!Array.isArray(hooks))
|
|
290
|
+
return false;
|
|
291
|
+
return hooks.some((h) => {
|
|
292
|
+
if (!isObject(h))
|
|
293
|
+
return false;
|
|
294
|
+
const command = h.command;
|
|
295
|
+
if (typeof command === "string" &&
|
|
296
|
+
command.includes("proactive_guardrail.py")) {
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
const description = h.description;
|
|
300
|
+
return typeof description === "string" && description === NEURODOCK_MARKER;
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
function parseSettings(raw) {
|
|
304
|
+
try {
|
|
305
|
+
const parsed = JSON.parse(raw);
|
|
306
|
+
return isObject(parsed) ? parsed : {};
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
return {};
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function isObject(value) {
|
|
313
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
314
|
+
}
|
|
315
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
316
|
+
// Locate the bundled script in dev (monorepo) and prod (npm install)
|
|
317
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
318
|
+
function resolveBundledScript(filename) {
|
|
319
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
320
|
+
const candidates = [
|
|
321
|
+
// Built: dist/commands/install-hooks.js -> ../assets/hooks/...
|
|
322
|
+
resolve(here, "..", "assets", "hooks", filename),
|
|
323
|
+
// Monorepo source: src/commands/install-hooks.ts -> ../assets/hooks/...
|
|
324
|
+
resolve(here, "..", "..", "src", "assets", "hooks", filename),
|
|
325
|
+
// node_modules install
|
|
326
|
+
resolve(here, "..", "..", "node_modules", "@neurodock", "cli", "dist", "assets", "hooks", filename),
|
|
327
|
+
];
|
|
328
|
+
for (const c of candidates) {
|
|
329
|
+
if (existsSync(c))
|
|
330
|
+
return c;
|
|
331
|
+
}
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
function runSelfTest(scriptPath) {
|
|
335
|
+
const result = spawnSync("python", [scriptPath, "self-test"], {
|
|
336
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
337
|
+
encoding: "utf8",
|
|
338
|
+
});
|
|
339
|
+
if (result.error) {
|
|
340
|
+
return {
|
|
341
|
+
summary: `python not on PATH (${result.error.message}). Install Python 3.11+ and re-run.`,
|
|
342
|
+
exitCode: 1,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
if (result.status !== 0) {
|
|
346
|
+
return {
|
|
347
|
+
summary: `self-test failed (exit ${result.status}): ${result.stderr.trim()}`,
|
|
348
|
+
exitCode: result.status ?? 1,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
return {
|
|
352
|
+
summary: result.stdout.trim() || "passed",
|
|
353
|
+
exitCode: 0,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=install-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/commands/install-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ClientId } from "../types.js";
|
|
2
|
+
import { readEnv } from "../lib/env.js";
|
|
3
|
+
export interface SyncOptions {
|
|
4
|
+
readonly client: ClientId | "all";
|
|
5
|
+
readonly dryRun: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface SyncClientDiff {
|
|
8
|
+
readonly client: ClientId;
|
|
9
|
+
readonly path: string;
|
|
10
|
+
readonly action: "updated" | "no-change" | "skip" | "not-wired";
|
|
11
|
+
readonly updatedKeys: ReadonlyArray<string>;
|
|
12
|
+
readonly preservedKeys: ReadonlyArray<string>;
|
|
13
|
+
readonly reason?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface SyncRunResult {
|
|
16
|
+
readonly clients: ReadonlyArray<SyncClientDiff>;
|
|
17
|
+
readonly applied: boolean;
|
|
18
|
+
readonly messages: ReadonlyArray<string>;
|
|
19
|
+
}
|
|
20
|
+
export interface SyncDependencies {
|
|
21
|
+
readonly envOverrides?: Parameters<typeof readEnv>[0];
|
|
22
|
+
}
|
|
23
|
+
export declare function runSync(options: SyncOptions, deps?: SyncDependencies): Promise<SyncRunResult>;
|
|
24
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAMxC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,KAAK,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CACvD;AAID,wBAAsB,OAAO,CAC3B,OAAO,EAAE,WAAW,EACpB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,aAAa,CAAC,CA6DxB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { readEnv } from "../lib/env.js";
|
|
4
|
+
import { detectClients } from "../lib/paths.js";
|
|
5
|
+
import { adapterFor } from "../clients/index.js";
|
|
6
|
+
import { parseJsonSafely } from "../lib/json-patch.js";
|
|
7
|
+
import { buildMcpServers, detectRepoRoot } from "../lib/mcp-entries.js";
|
|
8
|
+
const NEURODOCK_PREFIX = "neurodock-";
|
|
9
|
+
export async function runSync(options, deps = {}) {
|
|
10
|
+
const env = readEnv(deps.envOverrides ?? {});
|
|
11
|
+
const messages = [];
|
|
12
|
+
const detections = detectClients(env);
|
|
13
|
+
const targets = pickTargets(detections, options.client).filter((t) => t.exists);
|
|
14
|
+
if (targets.length === 0) {
|
|
15
|
+
messages.push("No client configs found to update.");
|
|
16
|
+
if (options.client !== "all") {
|
|
17
|
+
messages.push(`Looked for ${options.client} but no existing config was found.`);
|
|
18
|
+
}
|
|
19
|
+
return { clients: [], applied: false, messages };
|
|
20
|
+
}
|
|
21
|
+
const repoRoot = detectRepoRoot(env);
|
|
22
|
+
const desiredServers = buildMcpServers({
|
|
23
|
+
...(repoRoot !== undefined ? { repoRoot } : {}),
|
|
24
|
+
});
|
|
25
|
+
const diffs = [];
|
|
26
|
+
for (const target of targets) {
|
|
27
|
+
diffs.push(diffClient(target, desiredServers));
|
|
28
|
+
}
|
|
29
|
+
if (options.dryRun) {
|
|
30
|
+
return {
|
|
31
|
+
clients: diffs,
|
|
32
|
+
applied: false,
|
|
33
|
+
messages: [
|
|
34
|
+
"Dry run. No changes written.",
|
|
35
|
+
...messages,
|
|
36
|
+
...formatDiffs(diffs),
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
for (const d of diffs) {
|
|
41
|
+
if (d.action === "updated") {
|
|
42
|
+
applyDiff(d, desiredServers);
|
|
43
|
+
messages.push(`Updated ${d.client} at ${d.path}: ${d.updatedKeys.join(", ")}.`);
|
|
44
|
+
}
|
|
45
|
+
else if (d.action === "no-change") {
|
|
46
|
+
messages.push(`${d.client} at ${d.path} already up to date.`);
|
|
47
|
+
}
|
|
48
|
+
else if (d.action === "not-wired") {
|
|
49
|
+
messages.push(`${d.client} at ${d.path} has no NeuroDock servers wired. Run 'neurodock init' first.`);
|
|
50
|
+
}
|
|
51
|
+
else if (d.action === "skip") {
|
|
52
|
+
messages.push(`Skipped ${d.client} at ${d.path}: ${d.reason ?? "unable to parse"}.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return { clients: diffs, applied: true, messages };
|
|
56
|
+
}
|
|
57
|
+
function pickTargets(detections, client) {
|
|
58
|
+
if (client === "all")
|
|
59
|
+
return detections;
|
|
60
|
+
return detections.filter((d) => d.id === client);
|
|
61
|
+
}
|
|
62
|
+
function diffClient(target, desired) {
|
|
63
|
+
const raw = readFileSync(target.path, "utf8");
|
|
64
|
+
const parsed = parseJsonSafely(raw);
|
|
65
|
+
if (!parsed.ok) {
|
|
66
|
+
return {
|
|
67
|
+
client: target.id,
|
|
68
|
+
path: target.path,
|
|
69
|
+
action: "skip",
|
|
70
|
+
updatedKeys: [],
|
|
71
|
+
preservedKeys: [],
|
|
72
|
+
reason: `existing config is not valid JSON: ${parsed.error}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const existing = (parsed.value ?? {});
|
|
76
|
+
const existingServers = existing.mcpServers ?? {};
|
|
77
|
+
const allKeys = Object.keys(existingServers);
|
|
78
|
+
const neurodockKeys = allKeys.filter((k) => k.startsWith(NEURODOCK_PREFIX));
|
|
79
|
+
const preservedKeys = allKeys.filter((k) => !k.startsWith(NEURODOCK_PREFIX));
|
|
80
|
+
if (neurodockKeys.length === 0) {
|
|
81
|
+
return {
|
|
82
|
+
client: target.id,
|
|
83
|
+
path: target.path,
|
|
84
|
+
action: "not-wired",
|
|
85
|
+
updatedKeys: [],
|
|
86
|
+
preservedKeys,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const updatedKeys = [];
|
|
90
|
+
for (const key of neurodockKeys) {
|
|
91
|
+
const desiredEntry = desired[key];
|
|
92
|
+
if (desiredEntry === undefined)
|
|
93
|
+
continue;
|
|
94
|
+
if (!entriesEqual(existingServers[key], desiredEntry)) {
|
|
95
|
+
updatedKeys.push(key);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (updatedKeys.length === 0) {
|
|
99
|
+
return {
|
|
100
|
+
client: target.id,
|
|
101
|
+
path: target.path,
|
|
102
|
+
action: "no-change",
|
|
103
|
+
updatedKeys: [],
|
|
104
|
+
preservedKeys,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
client: target.id,
|
|
109
|
+
path: target.path,
|
|
110
|
+
action: "updated",
|
|
111
|
+
updatedKeys,
|
|
112
|
+
preservedKeys,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function applyDiff(diff, desired) {
|
|
116
|
+
const adapter = adapterFor(diff.client);
|
|
117
|
+
const raw = readFileSync(diff.path, "utf8");
|
|
118
|
+
const parsed = parseJsonSafely(raw);
|
|
119
|
+
if (!parsed.ok)
|
|
120
|
+
return;
|
|
121
|
+
const existing = (parsed.value ?? {});
|
|
122
|
+
const existingServers = existing.mcpServers ?? {};
|
|
123
|
+
const nextServers = { ...existingServers };
|
|
124
|
+
for (const key of diff.updatedKeys) {
|
|
125
|
+
const next = desired[key];
|
|
126
|
+
if (next !== undefined)
|
|
127
|
+
nextServers[key] = next;
|
|
128
|
+
}
|
|
129
|
+
const shaped = adapter.shapeConfig(existing, nextServers);
|
|
130
|
+
mkdirSync(dirname(diff.path), { recursive: true });
|
|
131
|
+
writeFileSync(diff.path, `${JSON.stringify(shaped, null, 2)}\n`, "utf8");
|
|
132
|
+
}
|
|
133
|
+
function entriesEqual(a, b) {
|
|
134
|
+
if (a === undefined)
|
|
135
|
+
return false;
|
|
136
|
+
if (a.command !== b.command)
|
|
137
|
+
return false;
|
|
138
|
+
if (a.cwd !== b.cwd)
|
|
139
|
+
return false;
|
|
140
|
+
const aArgs = a.args ?? [];
|
|
141
|
+
const bArgs = b.args ?? [];
|
|
142
|
+
if (aArgs.length !== bArgs.length)
|
|
143
|
+
return false;
|
|
144
|
+
for (let i = 0; i < aArgs.length; i += 1) {
|
|
145
|
+
if (aArgs[i] !== bArgs[i])
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
return envEqual(a.env, b.env);
|
|
149
|
+
}
|
|
150
|
+
function envEqual(a, b) {
|
|
151
|
+
if (a === b)
|
|
152
|
+
return true;
|
|
153
|
+
const ka = a ? Object.keys(a).sort() : [];
|
|
154
|
+
const kb = b ? Object.keys(b).sort() : [];
|
|
155
|
+
if (ka.length !== kb.length)
|
|
156
|
+
return false;
|
|
157
|
+
for (let i = 0; i < ka.length; i += 1) {
|
|
158
|
+
const key = ka[i];
|
|
159
|
+
if (key !== kb[i])
|
|
160
|
+
return false;
|
|
161
|
+
if (key !== undefined && a?.[key] !== b?.[key])
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
function formatDiffs(diffs) {
|
|
167
|
+
const out = [];
|
|
168
|
+
for (const d of diffs) {
|
|
169
|
+
out.push(`Client ${d.client} (${d.action}): ${d.path}`);
|
|
170
|
+
for (const k of d.updatedKeys)
|
|
171
|
+
out.push(` ~ mcpServers.${k}`);
|
|
172
|
+
for (const k of d.preservedKeys)
|
|
173
|
+
out.push(` = mcpServers.${k} (preserved)`);
|
|
174
|
+
if (d.reason)
|
|
175
|
+
out.push(` reason: ${d.reason}`);
|
|
176
|
+
}
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,15 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
export interface UpdateRunResult {
|
|
16
|
-
readonly clients: ReadonlyArray<UpdateClientDiff>;
|
|
17
|
-
readonly applied: boolean;
|
|
18
|
-
readonly messages: ReadonlyArray<string>;
|
|
19
|
-
}
|
|
20
|
-
export interface UpdateDependencies {
|
|
21
|
-
readonly envOverrides?: Parameters<typeof readEnv>[0];
|
|
22
|
-
}
|
|
1
|
+
import { type InstallAllOptions, type InstallAllDependencies, type InstallAllResult } from "./install-all.js";
|
|
2
|
+
export type UpdateOptions = InstallAllOptions;
|
|
3
|
+
export type UpdateDependencies = InstallAllDependencies;
|
|
4
|
+
export type UpdateRunResult = InstallAllResult;
|
|
5
|
+
/**
|
|
6
|
+
* `neurodock update` upgrades all NeuroDock MCP servers (pip/uv install
|
|
7
|
+
* --upgrade) and refreshes wired client configs. It is the same code
|
|
8
|
+
* path as `neurodock install-all` — re-running install IS the update
|
|
9
|
+
* mechanism. The dedicated verb exists because users look for it.
|
|
10
|
+
*
|
|
11
|
+
* The previous behavior of `update` (re-shape client configs only,
|
|
12
|
+
* without upgrading packages) moved to `neurodock sync` in 0.5.0.
|
|
13
|
+
*/
|
|
23
14
|
export declare function runUpdate(options: UpdateOptions, deps?: UpdateDependencies): Promise<UpdateRunResult>;
|
|
24
15
|
//# sourceMappingURL=update.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC9C,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAE/C;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B"}
|