@neurodock/cli 0.1.1 → 0.2.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 +21 -2
- package/README.md +22 -0
- package/dist/commands/host.d.ts +11 -0
- package/dist/commands/host.d.ts.map +1 -0
- package/dist/commands/host.js +63 -0
- package/dist/commands/host.js.map +1 -0
- package/dist/commands/uninstall.d.ts +36 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +180 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +24 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +175 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +24 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +154 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +92 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +6 -2
- package/dist/lib/paths.js.map +1 -1
- package/package.json +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
# @neurodock/cli changelog
|
|
2
2
|
|
|
3
|
-
## 0.
|
|
3
|
+
## 0.2.0 (unreleased)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- `neurodock host install` and `neurodock host uninstall` subcommands.
|
|
8
|
+
Wire / unwire the optional Chrome Native Messaging host
|
|
9
|
+
(`@neurodock/native-host`) so the browser extension reads and writes
|
|
10
|
+
`~/.neurodock/profile.yaml` directly. Per-platform manifest dispatch
|
|
11
|
+
lives in the host package; the CLI is a thin commander wrapper.
|
|
12
|
+
- `@neurodock/native-host` is now a workspace dependency.
|
|
13
|
+
|
|
14
|
+
Adds three top-level subcommands and bumps `prompts` into the dependency set.
|
|
15
|
+
|
|
16
|
+
- `neurodock validate` — Ajv-driven schema validation against `packages/core/schemas/profile.schema.json`. Reports field-path violations with `file:line` references. Supports `--file <path>` to validate an alternate file and `--strict` to flag unknown keys (default remains forward-compat per ADR 0004).
|
|
17
|
+
- `neurodock update` — re-runs the install adapters and rewrites stale NeuroDock MCP entries (version drift, command/args/cwd changes) in Claude Desktop, Claude Code, and Cursor configs. Non-NeuroDock entries and unrelated top-level keys round-trip untouched. Supports `--client <id>` and `--dry-run`.
|
|
18
|
+
- `neurodock uninstall` — reverses what `init` did. Removes NeuroDock MCP entries from each client config while preserving customisations. Asks (interactively) whether to delete `~/.neurodock/profile.yaml` and `~/.neurodock/cognitive-graph.sqlite`; defaults to no. `--yes` skips prompts but still preserves data unless `--purge` is passed. `--dry-run` prints the planned diff without writing.
|
|
19
|
+
- Adds `prompts@^2` (runtime) and `@types/prompts@^2` (dev) for the uninstall confirmation flow.
|
|
20
|
+
- New tests: `tests/validate.test.ts`, `tests/update.test.ts`, `tests/uninstall.test.ts`.
|
|
21
|
+
|
|
22
|
+
## 0.1.0
|
|
23
|
+
|
|
24
|
+
First implementation. Phase 1 deliverable.
|
|
6
25
|
|
|
7
26
|
- `neurodock init` — detect Claude Desktop, Claude Code, and Cursor on macOS, Linux, and Windows; install profile from `profile.example.yaml` (default) or `profile.minimal.yaml`; wire three Python MCP servers into the detected client configs.
|
|
8
27
|
- `neurodock doctor` — checklist diagnostic: Node >= 22, `uv` available, Python available, profile presence + schema validity, client config JSON syntax, NeuroDock server wiring.
|
package/README.md
CHANGED
|
@@ -32,6 +32,8 @@ published install this matures into `uv tool install neurodock-mcp-*`.
|
|
|
32
32
|
| `neurodock doctor` | Diagnose your install — profile validity, client wiring, tool availability. |
|
|
33
33
|
| `neurodock profile validate` | Validate `~/.neurodock/profile.yaml` against the v0.1 schema. |
|
|
34
34
|
| `neurodock profile show` | Print the resolved profile with loader defaults applied. |
|
|
35
|
+
| `neurodock host install` | Register the optional native messaging host so the browser extension can read `~/.neurodock/profile.yaml` directly. |
|
|
36
|
+
| `neurodock host uninstall` | Remove all NeuroDock native-host manifests and registry pointers. |
|
|
35
37
|
|
|
36
38
|
### `neurodock init`
|
|
37
39
|
|
|
@@ -66,6 +68,26 @@ key are skipped unless `--yes` is supplied.
|
|
|
66
68
|
| Claude Code | All | `./.claude/settings.json` (project, preferred) then `~/.claude/settings.json` (user) |
|
|
67
69
|
| Cursor | All | `./.cursor/mcp.json` (project, preferred) then `~/.cursor/mcp.json` (user) |
|
|
68
70
|
|
|
71
|
+
### `neurodock host install` / `uninstall`
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
neurodock host install [--extension-id <id>]
|
|
75
|
+
neurodock host uninstall
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`host install` registers `com.neurodock.profile` (a Chrome Native
|
|
79
|
+
Messaging host shipped as `@neurodock/native-host`) with every supported
|
|
80
|
+
browser on the machine. After install, the browser extension reads and
|
|
81
|
+
writes `~/.neurodock/profile.yaml` directly instead of maintaining a
|
|
82
|
+
duplicate in `chrome.storage.local`.
|
|
83
|
+
|
|
84
|
+
`--extension-id` is repeatable. Pass the published extension id once it
|
|
85
|
+
is allocated by the store; while the package is unpublished the default
|
|
86
|
+
is a placeholder.
|
|
87
|
+
|
|
88
|
+
The host is OPTIONAL. The extension keeps working without it — the
|
|
89
|
+
popup just shows `Profile sync: extension-local`.
|
|
90
|
+
|
|
69
91
|
### Profile precedence
|
|
70
92
|
|
|
71
93
|
Loader precedence (highest first):
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RegistrationOutcome } from "@neurodock/native-host/dist/registration/index.js";
|
|
2
|
+
export interface HostInstallOptions {
|
|
3
|
+
readonly extensionIds: ReadonlyArray<string>;
|
|
4
|
+
}
|
|
5
|
+
export interface HostCommandResult {
|
|
6
|
+
readonly platform: string;
|
|
7
|
+
readonly outcomes: ReadonlyArray<RegistrationOutcome>;
|
|
8
|
+
}
|
|
9
|
+
export declare function runHostInstall(opts: HostInstallOptions): HostCommandResult;
|
|
10
|
+
export declare function runHostUninstall(): HostCommandResult;
|
|
11
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/commands/host.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAC;AAO7F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;CACvD;AAiCD,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,CAM1E;AAED,wBAAgB,gBAAgB,IAAI,iBAAiB,CAIpD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neurodock host` subcommands.
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper that delegates to `@neurodock/native-host`'s registration
|
|
5
|
+
* module. We do not re-implement the per-OS dispatch here — the host
|
|
6
|
+
* package owns it and exposes register / unregister functions.
|
|
7
|
+
*
|
|
8
|
+
* The host package's bin (`neurodock-native-host run`) is the script Chrome
|
|
9
|
+
* actually launches; this CLI subcommand only handles registering /
|
|
10
|
+
* deregistering manifests and registry pointers.
|
|
11
|
+
*/
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { existsSync, realpathSync } from "node:fs";
|
|
14
|
+
import { join, resolve, dirname } from "node:path";
|
|
15
|
+
import { register, unregister, detectPlatform } from "@neurodock/native-host/dist/registration/index.js";
|
|
16
|
+
const DEFAULT_EXTENSION_IDS = [
|
|
17
|
+
// Placeholder until the Chrome Web Store ID is allocated.
|
|
18
|
+
"__NEURODOCK_EXTENSION_ID__",
|
|
19
|
+
];
|
|
20
|
+
function resolveHostBinPath() {
|
|
21
|
+
// The bin lives at `<native-host package>/dist/cli.js`. We resolve it
|
|
22
|
+
// relative to this module so the path works both from a checkout
|
|
23
|
+
// (where the file is under packages/native-host/dist) and from a
|
|
24
|
+
// published install (where it is under node_modules/@neurodock/native-host/dist).
|
|
25
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
const candidates = [
|
|
27
|
+
// dist/commands/host.js -> ../../node_modules/@neurodock/native-host/dist/cli.js
|
|
28
|
+
resolve(here, "..", "..", "node_modules", "@neurodock", "native-host", "dist", "cli.js"),
|
|
29
|
+
// monorepo: dist/commands/host.js -> ../../../native-host/dist/cli.js
|
|
30
|
+
resolve(here, "..", "..", "..", "native-host", "dist", "cli.js"),
|
|
31
|
+
// monorepo sibling: dist/commands/host.js (cli) -> ../../../packages/native-host/dist/cli.js
|
|
32
|
+
resolve(here, "..", "..", "..", "..", "packages", "native-host", "dist", "cli.js"),
|
|
33
|
+
// From cwd
|
|
34
|
+
join(process.cwd(), "packages", "native-host", "dist", "cli.js"),
|
|
35
|
+
];
|
|
36
|
+
for (const c of candidates) {
|
|
37
|
+
if (existsSync(c)) {
|
|
38
|
+
try {
|
|
39
|
+
return realpathSync(c);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return c;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Fall back to "neurodock-native-host" on PATH; reg/manifest will still
|
|
47
|
+
// be written but the actual host path may be unresolvable. Surface that
|
|
48
|
+
// to the caller via the outcome rather than crashing.
|
|
49
|
+
return "neurodock-native-host";
|
|
50
|
+
}
|
|
51
|
+
export function runHostInstall(opts) {
|
|
52
|
+
const ids = opts.extensionIds.length > 0 ? opts.extensionIds : DEFAULT_EXTENSION_IDS;
|
|
53
|
+
const platform = detectPlatform();
|
|
54
|
+
const hostPath = resolveHostBinPath();
|
|
55
|
+
const outcomes = register({ hostPath, allowedExtensionIds: ids });
|
|
56
|
+
return { platform, outcomes };
|
|
57
|
+
}
|
|
58
|
+
export function runHostUninstall() {
|
|
59
|
+
const platform = detectPlatform();
|
|
60
|
+
const outcomes = unregister();
|
|
61
|
+
return { platform, outcomes };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/commands/host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mDAAmD,CAAC;AAGzG,MAAM,qBAAqB,GAA0B;IACnD,0DAA0D;IAC1D,4BAA4B;CAC7B,CAAC;AAWF,SAAS,kBAAkB;IACzB,sEAAsE;IACtE,iEAAiE;IACjE,iEAAiE;IACjE,kFAAkF;IAClF,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG;QACjB,iFAAiF;QACjF,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC;QACxF,sEAAsE;QACtE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC;QAChE,6FAA6F;QAC7F,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC;QAClF,WAAW;QACX,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC;KACjE,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,wEAAwE;IACxE,wEAAwE;IACxE,sDAAsD;IACtD,OAAO,uBAAuB,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAwB;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC;IACrF,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ClientId } from "../types.js";
|
|
2
|
+
import { readEnv } from "../lib/env.js";
|
|
3
|
+
export interface UninstallOptions {
|
|
4
|
+
readonly client: ClientId | "all";
|
|
5
|
+
readonly dryRun: boolean;
|
|
6
|
+
readonly yes: boolean;
|
|
7
|
+
readonly purge: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface UninstallClientDiff {
|
|
10
|
+
readonly client: ClientId;
|
|
11
|
+
readonly path: string;
|
|
12
|
+
readonly action: "removed" | "no-change" | "skip" | "untouched";
|
|
13
|
+
readonly removedKeys: ReadonlyArray<string>;
|
|
14
|
+
readonly preservedKeys: ReadonlyArray<string>;
|
|
15
|
+
readonly reason?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface UninstallDataDiff {
|
|
18
|
+
readonly profilePath: string;
|
|
19
|
+
readonly profileExists: boolean;
|
|
20
|
+
readonly graphPath: string;
|
|
21
|
+
readonly graphExists: boolean;
|
|
22
|
+
readonly profileWillDelete: boolean;
|
|
23
|
+
readonly graphWillDelete: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface UninstallRunResult {
|
|
26
|
+
readonly clients: ReadonlyArray<UninstallClientDiff>;
|
|
27
|
+
readonly data: UninstallDataDiff;
|
|
28
|
+
readonly applied: boolean;
|
|
29
|
+
readonly messages: ReadonlyArray<string>;
|
|
30
|
+
}
|
|
31
|
+
export interface UninstallDependencies {
|
|
32
|
+
readonly envOverrides?: Parameters<typeof readEnv>[0];
|
|
33
|
+
readonly confirmDelete?: (target: "profile" | "graph", path: string) => Promise<boolean>;
|
|
34
|
+
}
|
|
35
|
+
export declare function runUninstall(options: UninstallOptions, deps?: UninstallDependencies): Promise<UninstallRunResult>;
|
|
36
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAKxC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,KAAK,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,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,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1F;AAID,wBAAsB,YAAY,CAChC,OAAO,EAAE,gBAAgB,EACzB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAyF7B"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import prompts from "prompts";
|
|
4
|
+
import { readEnv } from "../lib/env.js";
|
|
5
|
+
import { detectClients, profileDir, profilePath } from "../lib/paths.js";
|
|
6
|
+
import { adapterFor } from "../clients/index.js";
|
|
7
|
+
import { parseJsonSafely } from "../lib/json-patch.js";
|
|
8
|
+
const NEURODOCK_PREFIX = "neurodock-";
|
|
9
|
+
export async function runUninstall(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
|
+
const clientDiffs = [];
|
|
15
|
+
for (const target of targets) {
|
|
16
|
+
clientDiffs.push(diffClient(target));
|
|
17
|
+
}
|
|
18
|
+
const dir = profileDir(env);
|
|
19
|
+
const pPath = profilePath(env);
|
|
20
|
+
const gPath = join(dir, "cognitive-graph.sqlite");
|
|
21
|
+
const profileExists = existsSync(pPath);
|
|
22
|
+
const graphExists = existsSync(gPath);
|
|
23
|
+
let profileWillDelete = false;
|
|
24
|
+
let graphWillDelete = false;
|
|
25
|
+
if (options.purge) {
|
|
26
|
+
profileWillDelete = profileExists;
|
|
27
|
+
graphWillDelete = graphExists;
|
|
28
|
+
}
|
|
29
|
+
else if (!options.yes && !options.dryRun) {
|
|
30
|
+
const confirm = deps.confirmDelete ?? defaultConfirm;
|
|
31
|
+
if (profileExists)
|
|
32
|
+
profileWillDelete = await confirm("profile", pPath);
|
|
33
|
+
if (graphExists)
|
|
34
|
+
graphWillDelete = await confirm("graph", gPath);
|
|
35
|
+
}
|
|
36
|
+
// --yes without --purge: both remain false (preserve data).
|
|
37
|
+
const data = {
|
|
38
|
+
profilePath: pPath,
|
|
39
|
+
profileExists,
|
|
40
|
+
graphPath: gPath,
|
|
41
|
+
graphExists,
|
|
42
|
+
profileWillDelete,
|
|
43
|
+
graphWillDelete,
|
|
44
|
+
};
|
|
45
|
+
messages.push(...formatDiff(clientDiffs, data));
|
|
46
|
+
if (options.dryRun) {
|
|
47
|
+
return {
|
|
48
|
+
clients: clientDiffs,
|
|
49
|
+
data,
|
|
50
|
+
applied: false,
|
|
51
|
+
messages: ["Dry run. No changes written.", ...messages],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
for (const d of clientDiffs) {
|
|
55
|
+
if (d.action === "removed") {
|
|
56
|
+
applyClientDiff(d);
|
|
57
|
+
messages.push(`Removed NeuroDock entries from ${d.client} at ${d.path}.`);
|
|
58
|
+
}
|
|
59
|
+
else if (d.action === "untouched") {
|
|
60
|
+
messages.push(`${d.client} at ${d.path}: no NeuroDock entries to remove.`);
|
|
61
|
+
}
|
|
62
|
+
else if (d.action === "skip") {
|
|
63
|
+
messages.push(`Skipped ${d.client} at ${d.path}: ${d.reason ?? "parse error"}.`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (profileWillDelete) {
|
|
67
|
+
try {
|
|
68
|
+
rmSync(pPath, { force: true });
|
|
69
|
+
messages.push(`Deleted ${pPath}.`);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
messages.push(`Failed to delete ${pPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else if (profileExists) {
|
|
76
|
+
messages.push(`Preserved ${pPath}.`);
|
|
77
|
+
}
|
|
78
|
+
if (graphWillDelete) {
|
|
79
|
+
try {
|
|
80
|
+
rmSync(gPath, { force: true });
|
|
81
|
+
messages.push(`Deleted ${gPath}.`);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
messages.push(`Failed to delete ${gPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (graphExists) {
|
|
88
|
+
messages.push(`Preserved ${gPath}.`);
|
|
89
|
+
}
|
|
90
|
+
return { clients: clientDiffs, data, applied: true, messages };
|
|
91
|
+
}
|
|
92
|
+
function pickTargets(detections, client) {
|
|
93
|
+
if (client === "all")
|
|
94
|
+
return detections;
|
|
95
|
+
return detections.filter((d) => d.id === client);
|
|
96
|
+
}
|
|
97
|
+
function diffClient(target) {
|
|
98
|
+
const raw = readFileSync(target.path, "utf8");
|
|
99
|
+
const parsed = parseJsonSafely(raw);
|
|
100
|
+
if (!parsed.ok) {
|
|
101
|
+
return {
|
|
102
|
+
client: target.id,
|
|
103
|
+
path: target.path,
|
|
104
|
+
action: "skip",
|
|
105
|
+
removedKeys: [],
|
|
106
|
+
preservedKeys: [],
|
|
107
|
+
reason: `existing config is not valid JSON: ${parsed.error}`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const existing = (parsed.value ?? {});
|
|
111
|
+
const servers = existing.mcpServers ?? {};
|
|
112
|
+
const removedKeys = Object.keys(servers).filter((k) => k.startsWith(NEURODOCK_PREFIX));
|
|
113
|
+
const preservedKeys = Object.keys(servers).filter((k) => !k.startsWith(NEURODOCK_PREFIX));
|
|
114
|
+
if (removedKeys.length === 0) {
|
|
115
|
+
return {
|
|
116
|
+
client: target.id,
|
|
117
|
+
path: target.path,
|
|
118
|
+
action: "untouched",
|
|
119
|
+
removedKeys: [],
|
|
120
|
+
preservedKeys,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
client: target.id,
|
|
125
|
+
path: target.path,
|
|
126
|
+
action: "removed",
|
|
127
|
+
removedKeys,
|
|
128
|
+
preservedKeys,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function applyClientDiff(diff) {
|
|
132
|
+
const adapter = adapterFor(diff.client);
|
|
133
|
+
const raw = readFileSync(diff.path, "utf8");
|
|
134
|
+
const parsed = parseJsonSafely(raw);
|
|
135
|
+
if (!parsed.ok)
|
|
136
|
+
return;
|
|
137
|
+
const existing = (parsed.value ?? {});
|
|
138
|
+
const servers = { ...(existing.mcpServers ?? {}) };
|
|
139
|
+
for (const key of diff.removedKeys) {
|
|
140
|
+
delete servers[key];
|
|
141
|
+
}
|
|
142
|
+
const baseWithoutServers = { ...existing };
|
|
143
|
+
delete baseWithoutServers["mcpServers"];
|
|
144
|
+
const shaped = adapter.shapeConfig(baseWithoutServers, servers);
|
|
145
|
+
mkdirSync(dirname(diff.path), { recursive: true });
|
|
146
|
+
writeFileSync(diff.path, `${JSON.stringify(shaped, null, 2)}\n`, "utf8");
|
|
147
|
+
}
|
|
148
|
+
async function defaultConfirm(target, path) {
|
|
149
|
+
const label = target === "profile"
|
|
150
|
+
? `Delete profile at ${path}?`
|
|
151
|
+
: `Delete cognitive graph at ${path}?`;
|
|
152
|
+
const response = await prompts({
|
|
153
|
+
type: "confirm",
|
|
154
|
+
name: "ok",
|
|
155
|
+
message: label,
|
|
156
|
+
initial: false,
|
|
157
|
+
});
|
|
158
|
+
return response.ok === true;
|
|
159
|
+
}
|
|
160
|
+
function formatDiff(clients, data) {
|
|
161
|
+
const out = [];
|
|
162
|
+
out.push("Planned changes:");
|
|
163
|
+
if (clients.length === 0) {
|
|
164
|
+
out.push(" (no client configs detected)");
|
|
165
|
+
}
|
|
166
|
+
for (const d of clients) {
|
|
167
|
+
out.push(`Client ${d.client} (${d.action}): ${d.path}`);
|
|
168
|
+
for (const k of d.removedKeys)
|
|
169
|
+
out.push(` - mcpServers.${k}`);
|
|
170
|
+
for (const k of d.preservedKeys)
|
|
171
|
+
out.push(` = mcpServers.${k} (preserved)`);
|
|
172
|
+
if (d.reason)
|
|
173
|
+
out.push(` reason: ${d.reason}`);
|
|
174
|
+
}
|
|
175
|
+
out.push("Data files:");
|
|
176
|
+
out.push(` profile: ${data.profilePath} (${data.profileExists ? (data.profileWillDelete ? "will delete" : "preserve") : "absent"})`);
|
|
177
|
+
out.push(` graph: ${data.graphPath} (${data.graphExists ? (data.graphWillDelete ? "will delete" : "preserve") : "absent"})`);
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.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 UpdateOptions {
|
|
4
|
+
readonly client: ClientId | "all";
|
|
5
|
+
readonly dryRun: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface UpdateClientDiff {
|
|
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 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
|
+
}
|
|
23
|
+
export declare function runUpdate(options: UpdateOptions, deps?: UpdateDependencies): Promise<UpdateRunResult>;
|
|
24
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAMxC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,KAAK,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,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,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CACvD;AAID,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAiD1B"}
|
|
@@ -0,0 +1,175 @@
|
|
|
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 runUpdate(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: ["Dry run. No changes written.", ...messages, ...formatDiffs(diffs)],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
for (const d of diffs) {
|
|
37
|
+
if (d.action === "updated") {
|
|
38
|
+
applyDiff(d, desiredServers);
|
|
39
|
+
messages.push(`Updated ${d.client} at ${d.path}: ${d.updatedKeys.join(", ")}.`);
|
|
40
|
+
}
|
|
41
|
+
else if (d.action === "no-change") {
|
|
42
|
+
messages.push(`${d.client} at ${d.path} already up to date.`);
|
|
43
|
+
}
|
|
44
|
+
else if (d.action === "not-wired") {
|
|
45
|
+
messages.push(`${d.client} at ${d.path} has no NeuroDock servers wired. Run 'neurodock init' first.`);
|
|
46
|
+
}
|
|
47
|
+
else if (d.action === "skip") {
|
|
48
|
+
messages.push(`Skipped ${d.client} at ${d.path}: ${d.reason ?? "unable to parse"}.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { clients: diffs, applied: true, messages };
|
|
52
|
+
}
|
|
53
|
+
function pickTargets(detections, client) {
|
|
54
|
+
if (client === "all")
|
|
55
|
+
return detections;
|
|
56
|
+
return detections.filter((d) => d.id === client);
|
|
57
|
+
}
|
|
58
|
+
function diffClient(target, desired) {
|
|
59
|
+
const raw = readFileSync(target.path, "utf8");
|
|
60
|
+
const parsed = parseJsonSafely(raw);
|
|
61
|
+
if (!parsed.ok) {
|
|
62
|
+
return {
|
|
63
|
+
client: target.id,
|
|
64
|
+
path: target.path,
|
|
65
|
+
action: "skip",
|
|
66
|
+
updatedKeys: [],
|
|
67
|
+
preservedKeys: [],
|
|
68
|
+
reason: `existing config is not valid JSON: ${parsed.error}`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const existing = (parsed.value ?? {});
|
|
72
|
+
const existingServers = existing.mcpServers ?? {};
|
|
73
|
+
const allKeys = Object.keys(existingServers);
|
|
74
|
+
const neurodockKeys = allKeys.filter((k) => k.startsWith(NEURODOCK_PREFIX));
|
|
75
|
+
const preservedKeys = allKeys.filter((k) => !k.startsWith(NEURODOCK_PREFIX));
|
|
76
|
+
if (neurodockKeys.length === 0) {
|
|
77
|
+
return {
|
|
78
|
+
client: target.id,
|
|
79
|
+
path: target.path,
|
|
80
|
+
action: "not-wired",
|
|
81
|
+
updatedKeys: [],
|
|
82
|
+
preservedKeys,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const updatedKeys = [];
|
|
86
|
+
for (const key of neurodockKeys) {
|
|
87
|
+
const desiredEntry = desired[key];
|
|
88
|
+
if (desiredEntry === undefined)
|
|
89
|
+
continue;
|
|
90
|
+
if (!entriesEqual(existingServers[key], desiredEntry)) {
|
|
91
|
+
updatedKeys.push(key);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (updatedKeys.length === 0) {
|
|
95
|
+
return {
|
|
96
|
+
client: target.id,
|
|
97
|
+
path: target.path,
|
|
98
|
+
action: "no-change",
|
|
99
|
+
updatedKeys: [],
|
|
100
|
+
preservedKeys,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
client: target.id,
|
|
105
|
+
path: target.path,
|
|
106
|
+
action: "updated",
|
|
107
|
+
updatedKeys,
|
|
108
|
+
preservedKeys,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function applyDiff(diff, desired) {
|
|
112
|
+
const adapter = adapterFor(diff.client);
|
|
113
|
+
const raw = readFileSync(diff.path, "utf8");
|
|
114
|
+
const parsed = parseJsonSafely(raw);
|
|
115
|
+
if (!parsed.ok)
|
|
116
|
+
return;
|
|
117
|
+
const existing = (parsed.value ?? {});
|
|
118
|
+
const existingServers = existing.mcpServers ?? {};
|
|
119
|
+
const nextServers = { ...existingServers };
|
|
120
|
+
for (const key of diff.updatedKeys) {
|
|
121
|
+
const next = desired[key];
|
|
122
|
+
if (next !== undefined)
|
|
123
|
+
nextServers[key] = next;
|
|
124
|
+
}
|
|
125
|
+
const shaped = adapter.shapeConfig(existing, nextServers);
|
|
126
|
+
mkdirSync(dirname(diff.path), { recursive: true });
|
|
127
|
+
writeFileSync(diff.path, `${JSON.stringify(shaped, null, 2)}\n`, "utf8");
|
|
128
|
+
}
|
|
129
|
+
function entriesEqual(a, b) {
|
|
130
|
+
if (a === undefined)
|
|
131
|
+
return false;
|
|
132
|
+
if (a.command !== b.command)
|
|
133
|
+
return false;
|
|
134
|
+
if (a.cwd !== b.cwd)
|
|
135
|
+
return false;
|
|
136
|
+
const aArgs = a.args ?? [];
|
|
137
|
+
const bArgs = b.args ?? [];
|
|
138
|
+
if (aArgs.length !== bArgs.length)
|
|
139
|
+
return false;
|
|
140
|
+
for (let i = 0; i < aArgs.length; i += 1) {
|
|
141
|
+
if (aArgs[i] !== bArgs[i])
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
return envEqual(a.env, b.env);
|
|
145
|
+
}
|
|
146
|
+
function envEqual(a, b) {
|
|
147
|
+
if (a === b)
|
|
148
|
+
return true;
|
|
149
|
+
const ka = a ? Object.keys(a).sort() : [];
|
|
150
|
+
const kb = b ? Object.keys(b).sort() : [];
|
|
151
|
+
if (ka.length !== kb.length)
|
|
152
|
+
return false;
|
|
153
|
+
for (let i = 0; i < ka.length; i += 1) {
|
|
154
|
+
const key = ka[i];
|
|
155
|
+
if (key !== kb[i])
|
|
156
|
+
return false;
|
|
157
|
+
if (key !== undefined && a?.[key] !== b?.[key])
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
function formatDiffs(diffs) {
|
|
163
|
+
const out = [];
|
|
164
|
+
for (const d of diffs) {
|
|
165
|
+
out.push(`Client ${d.client} (${d.action}): ${d.path}`);
|
|
166
|
+
for (const k of d.updatedKeys)
|
|
167
|
+
out.push(` ~ mcpServers.${k}`);
|
|
168
|
+
for (const k of d.preservedKeys)
|
|
169
|
+
out.push(` = mcpServers.${k} (preserved)`);
|
|
170
|
+
if (d.reason)
|
|
171
|
+
out.push(` reason: ${d.reason}`);
|
|
172
|
+
}
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { readEnv } from "../lib/env.js";
|
|
2
|
+
export interface ValidateOptions {
|
|
3
|
+
readonly file?: string;
|
|
4
|
+
readonly strict: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface ValidateRunViolation {
|
|
7
|
+
readonly path: string;
|
|
8
|
+
readonly message: string;
|
|
9
|
+
readonly keyword: string;
|
|
10
|
+
readonly line?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ValidateRunResult {
|
|
13
|
+
readonly resolvedPath: string;
|
|
14
|
+
readonly missing: boolean;
|
|
15
|
+
readonly parseError?: string;
|
|
16
|
+
readonly valid: boolean;
|
|
17
|
+
readonly violations: ReadonlyArray<ValidateRunViolation>;
|
|
18
|
+
}
|
|
19
|
+
export interface ValidateDependencies {
|
|
20
|
+
readonly envOverrides?: Parameters<typeof readEnv>[0];
|
|
21
|
+
}
|
|
22
|
+
export declare function runValidate(options: ValidateOptions, deps?: ValidateDependencies): Promise<ValidateRunResult>;
|
|
23
|
+
export declare function formatViolation(v: ValidateRunViolation, file: string): string;
|
|
24
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIxC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CACvD;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,eAAe,EACxB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,iBAAiB,CAAC,CAgF5B;AA2ED,wBAAgB,eAAe,CAAC,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7E"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
3
|
+
import addFormats from "ajv-formats";
|
|
4
|
+
import { LineCounter, parseDocument } from "yaml";
|
|
5
|
+
import { readEnv } from "../lib/env.js";
|
|
6
|
+
import { profilePath } from "../lib/paths.js";
|
|
7
|
+
import { loadSchema } from "../profile/validator.js";
|
|
8
|
+
export async function runValidate(options, deps = {}) {
|
|
9
|
+
const env = readEnv(deps.envOverrides ?? {});
|
|
10
|
+
const resolvedPath = options.file !== undefined && options.file.trim().length > 0
|
|
11
|
+
? options.file
|
|
12
|
+
: profilePath(env);
|
|
13
|
+
if (!existsSync(resolvedPath)) {
|
|
14
|
+
return {
|
|
15
|
+
resolvedPath,
|
|
16
|
+
missing: true,
|
|
17
|
+
valid: false,
|
|
18
|
+
violations: [
|
|
19
|
+
{ path: "/", message: "profile file does not exist", keyword: "missing" },
|
|
20
|
+
],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const text = readFileSync(resolvedPath, "utf8");
|
|
24
|
+
const lineCounter = new LineCounter();
|
|
25
|
+
let parsed;
|
|
26
|
+
try {
|
|
27
|
+
const doc = parseDocument(text, { lineCounter });
|
|
28
|
+
if (doc.errors.length > 0) {
|
|
29
|
+
const first = doc.errors[0];
|
|
30
|
+
const message = first?.message ?? "YAML parse error";
|
|
31
|
+
return {
|
|
32
|
+
resolvedPath,
|
|
33
|
+
missing: false,
|
|
34
|
+
parseError: message,
|
|
35
|
+
valid: false,
|
|
36
|
+
violations: [
|
|
37
|
+
{
|
|
38
|
+
path: "/",
|
|
39
|
+
message,
|
|
40
|
+
keyword: "parse",
|
|
41
|
+
...(first?.linePos?.[0]?.line !== undefined
|
|
42
|
+
? { line: first.linePos[0].line }
|
|
43
|
+
: {}),
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
parsed = doc.toJS();
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
52
|
+
return {
|
|
53
|
+
resolvedPath,
|
|
54
|
+
missing: false,
|
|
55
|
+
parseError: message,
|
|
56
|
+
valid: false,
|
|
57
|
+
violations: [{ path: "/", message, keyword: "parse" }],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const validator = buildValidator(options.strict);
|
|
61
|
+
const ok = validator(parsed);
|
|
62
|
+
if (ok) {
|
|
63
|
+
return { resolvedPath, missing: false, valid: true, violations: [] };
|
|
64
|
+
}
|
|
65
|
+
const errors = validator.errors ?? [];
|
|
66
|
+
const violations = errors.map((e) => {
|
|
67
|
+
const instancePath = e.instancePath === "" ? "/" : e.instancePath;
|
|
68
|
+
const path = e.keyword === "additionalProperties" &&
|
|
69
|
+
typeof e.params["additionalProperty"] === "string"
|
|
70
|
+
? `${instancePath}/${e.params["additionalProperty"] ?? ""}`
|
|
71
|
+
: instancePath;
|
|
72
|
+
const line = locateLine(text, instancePath, lineCounter);
|
|
73
|
+
const out = {
|
|
74
|
+
path,
|
|
75
|
+
message: e.message ?? "invalid",
|
|
76
|
+
keyword: e.keyword,
|
|
77
|
+
...(line !== undefined ? { line } : {}),
|
|
78
|
+
};
|
|
79
|
+
return out;
|
|
80
|
+
});
|
|
81
|
+
return { resolvedPath, missing: false, valid: false, violations };
|
|
82
|
+
}
|
|
83
|
+
let cachedStrict = null;
|
|
84
|
+
let cachedLenient = null;
|
|
85
|
+
function buildValidator(strict) {
|
|
86
|
+
if (strict && cachedStrict)
|
|
87
|
+
return cachedStrict;
|
|
88
|
+
if (!strict && cachedLenient)
|
|
89
|
+
return cachedLenient;
|
|
90
|
+
const schema = JSON.parse(JSON.stringify(loadSchema()));
|
|
91
|
+
if (strict)
|
|
92
|
+
forceAdditionalPropertiesFalse(schema);
|
|
93
|
+
const ajv = new Ajv2020({ allErrors: true, strict: false, allowUnionTypes: true });
|
|
94
|
+
const addFormatsFn = addFormats ?? addFormats;
|
|
95
|
+
addFormatsFn(ajv);
|
|
96
|
+
const compiled = ajv.compile(schema);
|
|
97
|
+
if (strict)
|
|
98
|
+
cachedStrict = compiled;
|
|
99
|
+
else
|
|
100
|
+
cachedLenient = compiled;
|
|
101
|
+
return compiled;
|
|
102
|
+
}
|
|
103
|
+
function forceAdditionalPropertiesFalse(node) {
|
|
104
|
+
if (Array.isArray(node)) {
|
|
105
|
+
for (const item of node)
|
|
106
|
+
forceAdditionalPropertiesFalse(item);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (!isObject(node))
|
|
110
|
+
return;
|
|
111
|
+
if (node["type"] === "object" || isObject(node["properties"])) {
|
|
112
|
+
node["additionalProperties"] = false;
|
|
113
|
+
}
|
|
114
|
+
for (const value of Object.values(node)) {
|
|
115
|
+
if (isObject(value) || Array.isArray(value)) {
|
|
116
|
+
forceAdditionalPropertiesFalse(value);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function isObject(x) {
|
|
121
|
+
return typeof x === "object" && x !== null && !Array.isArray(x);
|
|
122
|
+
}
|
|
123
|
+
function locateLine(source, instancePath, lineCounter) {
|
|
124
|
+
if (instancePath === "" || instancePath === "/")
|
|
125
|
+
return undefined;
|
|
126
|
+
const segments = instancePath
|
|
127
|
+
.split("/")
|
|
128
|
+
.filter((s) => s.length > 0)
|
|
129
|
+
.map((s) => s.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
130
|
+
if (segments.length === 0)
|
|
131
|
+
return undefined;
|
|
132
|
+
try {
|
|
133
|
+
const doc = parseDocument(source, { lineCounter });
|
|
134
|
+
let node = doc.getIn(segments, true);
|
|
135
|
+
if (node === undefined || node === null) {
|
|
136
|
+
for (let depth = segments.length - 1; depth >= 1 && (node === undefined || node === null); depth -= 1) {
|
|
137
|
+
node = doc.getIn(segments.slice(0, depth), true);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const range = node?.range;
|
|
141
|
+
if (!range || range.length === 0 || range[0] === undefined)
|
|
142
|
+
return undefined;
|
|
143
|
+
const pos = lineCounter.linePos(range[0]);
|
|
144
|
+
return pos.line;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export function formatViolation(v, file) {
|
|
151
|
+
const loc = v.line !== undefined ? `${file}:${v.line}` : file;
|
|
152
|
+
return ` ${loc} ${v.path} (${v.keyword}): ${v.message}`;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,wBAAgB,YAAY,IAAI,OAAO,CA+KtC"}
|
package/dist/index.js
CHANGED
|
@@ -4,8 +4,12 @@ import chalk from "chalk";
|
|
|
4
4
|
import { runInit } from "./commands/init.js";
|
|
5
5
|
import { runDoctor } from "./commands/doctor.js";
|
|
6
6
|
import { runProfileValidate, runProfileShow } from "./commands/profile.js";
|
|
7
|
+
import { runValidate, formatViolation } from "./commands/validate.js";
|
|
8
|
+
import { runUpdate } from "./commands/update.js";
|
|
9
|
+
import { runUninstall } from "./commands/uninstall.js";
|
|
10
|
+
import { runHostInstall, runHostUninstall } from "./commands/host.js";
|
|
7
11
|
import { colorEnabled } from "./lib/env.js";
|
|
8
|
-
export const CLI_VERSION = "0.
|
|
12
|
+
export const CLI_VERSION = "0.2.0";
|
|
9
13
|
export function buildProgram() {
|
|
10
14
|
const program = new Command();
|
|
11
15
|
program
|
|
@@ -73,6 +77,93 @@ export function buildProgram() {
|
|
|
73
77
|
process.stdout.write(r.yaml);
|
|
74
78
|
process.exit(0);
|
|
75
79
|
});
|
|
80
|
+
program
|
|
81
|
+
.command("validate")
|
|
82
|
+
.description("validate a NeuroDock profile against the canonical schema")
|
|
83
|
+
.option("--file <path>", "path to the profile file (default: resolved profile path)")
|
|
84
|
+
.option("--strict", "also flag unknown keys (default allows forward-compat extras)", false)
|
|
85
|
+
.action(async (opts) => {
|
|
86
|
+
const r = await runValidate({
|
|
87
|
+
...(opts.file !== undefined ? { file: opts.file } : {}),
|
|
88
|
+
strict: opts.strict === true,
|
|
89
|
+
});
|
|
90
|
+
if (r.missing) {
|
|
91
|
+
print(`No profile at ${r.resolvedPath}. Run 'neurodock init' to create one.`);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
if (r.parseError) {
|
|
95
|
+
print(`Parse error in ${r.resolvedPath}: ${r.parseError}`);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
if (r.valid) {
|
|
99
|
+
print(`Valid: ${r.resolvedPath}`);
|
|
100
|
+
process.exit(0);
|
|
101
|
+
}
|
|
102
|
+
print(`Invalid: ${r.resolvedPath}`);
|
|
103
|
+
for (const v of r.violations) {
|
|
104
|
+
print(formatViolation(v, r.resolvedPath));
|
|
105
|
+
}
|
|
106
|
+
process.exit(1);
|
|
107
|
+
});
|
|
108
|
+
program
|
|
109
|
+
.command("update")
|
|
110
|
+
.description("re-run install adapters to refresh existing NeuroDock MCP entries")
|
|
111
|
+
.option("--client <id>", "claude-desktop | claude-code | cursor | all", "all")
|
|
112
|
+
.option("--dry-run", "print the diff without writing anything", false)
|
|
113
|
+
.action(async (opts) => {
|
|
114
|
+
const client = validateClient(opts.client);
|
|
115
|
+
const r = await runUpdate({ client, dryRun: opts.dryRun === true });
|
|
116
|
+
for (const m of r.messages)
|
|
117
|
+
print(m);
|
|
118
|
+
process.exit(0);
|
|
119
|
+
});
|
|
120
|
+
program
|
|
121
|
+
.command("uninstall")
|
|
122
|
+
.description("remove NeuroDock MCP entries from your clients; optionally purge data")
|
|
123
|
+
.option("--client <id>", "claude-desktop | claude-code | cursor | all", "all")
|
|
124
|
+
.option("--dry-run", "print the diff without writing anything", false)
|
|
125
|
+
.option("--yes", "skip interactive prompts (still preserves data unless --purge)", false)
|
|
126
|
+
.option("--purge", "also delete ~/.neurodock/profile.yaml and cognitive-graph.sqlite", false)
|
|
127
|
+
.action(async (opts) => {
|
|
128
|
+
const client = validateClient(opts.client);
|
|
129
|
+
const r = await runUninstall({
|
|
130
|
+
client,
|
|
131
|
+
dryRun: opts.dryRun === true,
|
|
132
|
+
yes: opts.yes === true,
|
|
133
|
+
purge: opts.purge === true,
|
|
134
|
+
});
|
|
135
|
+
for (const m of r.messages)
|
|
136
|
+
print(m);
|
|
137
|
+
process.exit(0);
|
|
138
|
+
});
|
|
139
|
+
const hostCmd = program
|
|
140
|
+
.command("host")
|
|
141
|
+
.description("manage the optional native messaging host (browser extension <-> ~/.neurodock/profile.yaml)");
|
|
142
|
+
hostCmd
|
|
143
|
+
.command("install")
|
|
144
|
+
.description("register the NeuroDock native messaging host with installed browsers")
|
|
145
|
+
.option("--extension-id <id>", "browser extension id allowed to connect (repeatable)", (value, prev) => [...prev, value], [])
|
|
146
|
+
.action((opts) => {
|
|
147
|
+
const result = runHostInstall({ extensionIds: opts.extensionId });
|
|
148
|
+
print(`Installing com.neurodock.profile (platform=${result.platform})`);
|
|
149
|
+
for (const o of result.outcomes) {
|
|
150
|
+
const detail = o.detail ? ` — ${o.detail}` : "";
|
|
151
|
+
print(` [${o.action.padEnd(6)}] ${o.browser.padEnd(10)} ${o.manifestPath}${detail}`);
|
|
152
|
+
}
|
|
153
|
+
process.exit(0);
|
|
154
|
+
});
|
|
155
|
+
hostCmd
|
|
156
|
+
.command("uninstall")
|
|
157
|
+
.description("remove the NeuroDock native messaging host manifests / registry pointers")
|
|
158
|
+
.action(() => {
|
|
159
|
+
const result = runHostUninstall();
|
|
160
|
+
print(`Removing com.neurodock.profile (platform=${result.platform})`);
|
|
161
|
+
for (const o of result.outcomes) {
|
|
162
|
+
const detail = o.detail ? ` — ${o.detail}` : "";
|
|
163
|
+
print(` [${o.action.padEnd(6)}] ${o.browser.padEnd(10)} ${o.manifestPath}${detail}`);
|
|
164
|
+
}
|
|
165
|
+
process.exit(0);
|
|
166
|
+
});
|
|
76
167
|
return program;
|
|
77
168
|
}
|
|
78
169
|
function validateClient(value) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,UAAU,CAAC;AAErD,wBAAgB,WAAW,CAAC,GAAG,GAAE,WAAuB,GAAG,MAAM,CAchE;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,WAAuB,GAAG,MAAM,CAU/D;AAOD,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,WAAuB,GAAG,MAAM,CAY5E;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,WAAuB,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,UAAU,CAAC;AAErD,wBAAgB,WAAW,CAAC,GAAG,GAAE,WAAuB,GAAG,MAAM,CAchE;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,WAAuB,GAAG,MAAM,CAU/D;AAOD,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,WAAuB,GAAG,MAAM,CAY5E;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,WAAuB,GAAG,eAAe,CASnF;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,WAAuB,GAAG,WAAW,CAK3E;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,WAAuB,GAAG,aAAa,CAAC,cAAc,CAAC,CAU3F;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAAC,GAAG,GAAE,WAAuB,GAAG,aAAa,CAAC,eAAe,CAAC,CAE1F;AAED,wBAAgB,UAAU,CACxB,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC,EAC1C,SAAS,EAAE,QAAQ,GAAG,KAAK,GAC1B,aAAa,CAAC,eAAe,CAAC,CAKhC;AAWD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE7C"}
|
package/dist/lib/paths.js
CHANGED
|
@@ -45,9 +45,13 @@ export function claudeDesktopConfigPath(env = readEnv()) {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
export function claudeCodeConfigPaths(env = readEnv()) {
|
|
48
|
+
// Claude Code reads MCP server config from ~/.claude.json (flat file in
|
|
49
|
+
// $HOME, dot prefix). The ~/.claude/settings.json file is for plugins +
|
|
50
|
+
// marketplace state — NOT MCP servers. Project-scoped MCP config lives
|
|
51
|
+
// in <project>/.mcp.json (different filename from the user-scoped file).
|
|
48
52
|
return {
|
|
49
|
-
user: join(env.home, ".claude
|
|
50
|
-
project: join(env.cwd, ".
|
|
53
|
+
user: join(env.home, ".claude.json"),
|
|
54
|
+
project: join(env.cwd, ".mcp.json"),
|
|
51
55
|
};
|
|
52
56
|
}
|
|
53
57
|
export function cursorConfigPaths(env = readEnv()) {
|
package/dist/lib/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neurodock/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "NeuroDock installer and diagnostic CLI.",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"type": "module",
|
|
@@ -24,14 +24,17 @@
|
|
|
24
24
|
"CHANGELOG.md"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
+
"@neurodock/native-host": "^0.1.0",
|
|
27
28
|
"ajv": "^8.17.1",
|
|
28
29
|
"ajv-formats": "^3.0.1",
|
|
29
30
|
"chalk": "^5.3.0",
|
|
30
31
|
"commander": "^12.1.0",
|
|
32
|
+
"prompts": "^2.4.2",
|
|
31
33
|
"yaml": "^2.6.1"
|
|
32
34
|
},
|
|
33
35
|
"devDependencies": {
|
|
34
36
|
"@types/node": "^22.10.5",
|
|
37
|
+
"@types/prompts": "^2.4.9",
|
|
35
38
|
"rimraf": "^6.0.1",
|
|
36
39
|
"tsx": "^4.19.2",
|
|
37
40
|
"typescript": "^5.7.2",
|