@neurodock/cli 0.1.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 +13 -0
- package/LICENSE +11 -0
- package/README.md +101 -0
- package/dist/clients/claude-code.d.ts +3 -0
- package/dist/clients/claude-code.d.ts.map +1 -0
- package/dist/clients/claude-code.js +22 -0
- package/dist/clients/claude-code.js.map +1 -0
- package/dist/clients/claude-desktop.d.ts +3 -0
- package/dist/clients/claude-desktop.d.ts.map +1 -0
- package/dist/clients/claude-desktop.js +18 -0
- package/dist/clients/claude-desktop.js.map +1 -0
- package/dist/clients/cursor.d.ts +3 -0
- package/dist/clients/cursor.d.ts.map +1 -0
- package/dist/clients/cursor.js +22 -0
- package/dist/clients/cursor.js.map +1 -0
- package/dist/clients/index.d.ts +17 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +16 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +107 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +189 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/profile.d.ts +14 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +29 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/env.d.ts +11 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +37 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/json-patch.d.ts +22 -0
- package/dist/lib/json-patch.d.ts.map +1 -0
- package/dist/lib/json-patch.js +76 -0
- package/dist/lib/json-patch.js.map +1 -0
- package/dist/lib/mcp-entries.d.ts +9 -0
- package/dist/lib/mcp-entries.d.ts.map +1 -0
- package/dist/lib/mcp-entries.js +56 -0
- package/dist/lib/mcp-entries.js.map +1 -0
- package/dist/lib/paths.d.ts +23 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +91 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/profile/defaults.d.ts +29 -0
- package/dist/profile/defaults.d.ts.map +1 -0
- package/dist/profile/defaults.js +50 -0
- package/dist/profile/defaults.js.map +1 -0
- package/dist/profile/loader.d.ts +23 -0
- package/dist/profile/loader.d.ts.map +1 -0
- package/dist/profile/loader.js +52 -0
- package/dist/profile/loader.js.map +1 -0
- package/dist/profile/validator.d.ts +12 -0
- package/dist/profile/validator.d.ts.map +1 -0
- package/dist/profile/validator.js +62 -0
- package/dist/profile/validator.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/profile/defaults.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,6EAA6E;AAC7E,iEAAiE;AAyBjE,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,WAAW,EAAE;QACX,aAAa,EAAE,cAAc;QAC7B,cAAc,EAAE,CAAC;QACjB,iBAAiB,EAAE,uBAAuB;QAC1C,MAAM,EAAE,SAAS;KAClB;IACD,YAAY,EAAE;QACZ,wBAAwB,EAAE,EAAE;QAC5B,sBAAsB,EAAE,YAAY;KACrC;IACD,UAAU,EAAE;QACV,oBAAoB,EAAE,CAAC;QACvB,yBAAyB,EAAE,EAAE;QAC7B,gBAAgB,EAAE,MAAM;KACzB;IACD,OAAO,EAAE;QACP,UAAU,EAAE,OAAO;QACnB,SAAS,EAAE,KAAK;QAChB,eAAe,EAAE,KAAK;KACvB;CACF,CAAC;AAEF,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,GAAG,GAA4B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAErE,GAAG,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAClF,GAAG,CAAC,cAAc,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACrF,GAAG,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC/E,GAAG,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEtE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,QAAiB,EAAE,QAAiC;IACtE,MAAM,IAAI,GAA4B,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YACpE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Document } from "yaml";
|
|
2
|
+
export interface LoadedProfile {
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly raw: unknown;
|
|
5
|
+
readonly resolved: Record<string, unknown>;
|
|
6
|
+
readonly text: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function loadProfileFromFile(path: string): LoadedProfile;
|
|
9
|
+
export declare function parseProfileText(path: string, text: string): LoadedProfile;
|
|
10
|
+
export declare function profileExists(path: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Read a comment-preserving YAML Document so a future write of the user's
|
|
13
|
+
* profile.yaml can be round-tripped without losing comments (ADR 0004 §14).
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadProfileDocument(path: string): Document.Parsed;
|
|
16
|
+
export interface WriteProfileFromTemplateInput {
|
|
17
|
+
readonly templatePath: string;
|
|
18
|
+
readonly targetPath: string;
|
|
19
|
+
readonly displayName: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function writeProfileFromTemplate(input: WriteProfileFromTemplateInput): string;
|
|
22
|
+
export declare function renderResolvedYaml(resolved: Record<string, unknown>): string;
|
|
23
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/profile/loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmC,KAAK,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGtE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAG/D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAI1E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAGjE;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,GAAG,MAAM,CAsBrF;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAE5E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { parse, parseDocument, stringify } from "yaml";
|
|
4
|
+
import { applyDefaults } from "./defaults.js";
|
|
5
|
+
export function loadProfileFromFile(path) {
|
|
6
|
+
const text = readFileSync(path, "utf8");
|
|
7
|
+
return parseProfileText(path, text);
|
|
8
|
+
}
|
|
9
|
+
export function parseProfileText(path, text) {
|
|
10
|
+
const raw = parse(text);
|
|
11
|
+
const resolved = applyDefaults(raw);
|
|
12
|
+
return { path, raw, resolved, text };
|
|
13
|
+
}
|
|
14
|
+
export function profileExists(path) {
|
|
15
|
+
return existsSync(path);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Read a comment-preserving YAML Document so a future write of the user's
|
|
19
|
+
* profile.yaml can be round-tripped without losing comments (ADR 0004 §14).
|
|
20
|
+
*/
|
|
21
|
+
export function loadProfileDocument(path) {
|
|
22
|
+
const text = readFileSync(path, "utf8");
|
|
23
|
+
return parseDocument(text);
|
|
24
|
+
}
|
|
25
|
+
export function writeProfileFromTemplate(input) {
|
|
26
|
+
const templateText = readFileSync(input.templatePath, "utf8");
|
|
27
|
+
const doc = parseDocument(templateText);
|
|
28
|
+
// Set identity.display_name. parseDocument preserves comments and ordering.
|
|
29
|
+
const identity = doc.get("identity");
|
|
30
|
+
if (identity && typeof identity === "object" && "set" in identity) {
|
|
31
|
+
identity.set("display_name", input.displayName);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Fallback: re-parse, mutate the plain object, re-stringify (loses comments
|
|
35
|
+
// but only triggers if template is malformed, which we control).
|
|
36
|
+
const plain = parse(templateText);
|
|
37
|
+
const ident = plain["identity"] ?? {};
|
|
38
|
+
ident["display_name"] = input.displayName;
|
|
39
|
+
plain["identity"] = ident;
|
|
40
|
+
mkdirSync(dirname(input.targetPath), { recursive: true });
|
|
41
|
+
writeFileSync(input.targetPath, stringify(plain), "utf8");
|
|
42
|
+
return stringify(plain);
|
|
43
|
+
}
|
|
44
|
+
const text = doc.toString();
|
|
45
|
+
mkdirSync(dirname(input.targetPath), { recursive: true });
|
|
46
|
+
writeFileSync(input.targetPath, text, "utf8");
|
|
47
|
+
return text;
|
|
48
|
+
}
|
|
49
|
+
export function renderResolvedYaml(resolved) {
|
|
50
|
+
return stringify(resolved);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/profile/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAiB,MAAM,MAAM,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAS9C,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAY;IACzD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAY,CAAC;IACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAQD,MAAM,UAAU,wBAAwB,CAAC,KAAoC;IAC3E,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IACxC,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,IAAK,QAAmB,EAAE,CAAC;QAC7E,QAAqD,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAChG,CAAC;SAAM,CAAC;QACN,4EAA4E;QAC5E,iEAAiE;QACjE,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAA4B,CAAC;QAC7D,MAAM,KAAK,GAAI,KAAK,CAAC,UAAU,CAA6B,IAAI,EAAE,CAAC;QACnE,KAAK,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;QAC1C,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;QAC1B,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC5B,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAiC;IAClE,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ValidationViolation {
|
|
2
|
+
readonly path: string;
|
|
3
|
+
readonly message: string;
|
|
4
|
+
readonly keyword: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ValidationResult {
|
|
7
|
+
readonly valid: boolean;
|
|
8
|
+
readonly violations: ReadonlyArray<ValidationViolation>;
|
|
9
|
+
}
|
|
10
|
+
export declare function loadSchema(): object;
|
|
11
|
+
export declare function validateProfile(value: unknown): ValidationResult;
|
|
12
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/profile/validator.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;CACzD;AA2BD,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAYD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAahE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
2
|
+
import addFormats from "ajv-formats";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { dirname, join, resolve } from "node:path";
|
|
6
|
+
let cachedSchema = null;
|
|
7
|
+
let cachedValidator = null;
|
|
8
|
+
function resolveSchemaPath() {
|
|
9
|
+
// From dist/profile/validator.js → ../../../core/schemas/profile.schema.json
|
|
10
|
+
// From src/profile/validator.ts in tests → same relative ancestry via vitest.
|
|
11
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
// Try the compiled location first (dist/profile/) and fall back to src/profile/
|
|
13
|
+
const candidates = [
|
|
14
|
+
resolve(here, "..", "..", "..", "core", "schemas", "profile.schema.json"),
|
|
15
|
+
resolve(here, "..", "..", "..", "..", "core", "schemas", "profile.schema.json"),
|
|
16
|
+
resolve(here, "..", "..", "core", "schemas", "profile.schema.json"),
|
|
17
|
+
];
|
|
18
|
+
for (const c of candidates) {
|
|
19
|
+
try {
|
|
20
|
+
readFileSync(c, "utf8");
|
|
21
|
+
return c;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// keep trying
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Last resort: workspace root from cwd.
|
|
28
|
+
return join(process.cwd(), "packages", "core", "schemas", "profile.schema.json");
|
|
29
|
+
}
|
|
30
|
+
export function loadSchema() {
|
|
31
|
+
if (cachedSchema)
|
|
32
|
+
return cachedSchema;
|
|
33
|
+
const path = resolveSchemaPath();
|
|
34
|
+
const raw = readFileSync(path, "utf8");
|
|
35
|
+
cachedSchema = JSON.parse(raw);
|
|
36
|
+
return cachedSchema;
|
|
37
|
+
}
|
|
38
|
+
function getValidator() {
|
|
39
|
+
if (cachedValidator)
|
|
40
|
+
return cachedValidator;
|
|
41
|
+
const ajv = new Ajv2020({ allErrors: true, strict: false, allowUnionTypes: true });
|
|
42
|
+
// ajv-formats default export typing varies between ESM/CJS interop.
|
|
43
|
+
const addFormatsFn = addFormats ?? addFormats;
|
|
44
|
+
addFormatsFn(ajv);
|
|
45
|
+
cachedValidator = ajv.compile(loadSchema());
|
|
46
|
+
return cachedValidator;
|
|
47
|
+
}
|
|
48
|
+
export function validateProfile(value) {
|
|
49
|
+
const validate = getValidator();
|
|
50
|
+
const ok = validate(value);
|
|
51
|
+
if (ok) {
|
|
52
|
+
return { valid: true, violations: [] };
|
|
53
|
+
}
|
|
54
|
+
const errors = validate.errors ?? [];
|
|
55
|
+
const violations = errors.map((e) => ({
|
|
56
|
+
path: e.instancePath === "" ? "/" : e.instancePath,
|
|
57
|
+
message: e.message ?? "invalid",
|
|
58
|
+
keyword: e.keyword,
|
|
59
|
+
}));
|
|
60
|
+
return { valid: false, violations };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/profile/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export type Platform = "darwin" | "linux" | "win32";
|
|
2
|
+
export type ClientId = "claude-desktop" | "claude-code" | "cursor";
|
|
3
|
+
export interface ClientLocation {
|
|
4
|
+
readonly id: ClientId;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly scope: "user" | "project";
|
|
7
|
+
}
|
|
8
|
+
export interface DetectedClient extends ClientLocation {
|
|
9
|
+
readonly exists: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface McpServerEntry {
|
|
12
|
+
readonly command: string;
|
|
13
|
+
readonly args: ReadonlyArray<string>;
|
|
14
|
+
readonly cwd?: string;
|
|
15
|
+
readonly env?: Readonly<Record<string, string>>;
|
|
16
|
+
}
|
|
17
|
+
export interface McpClientConfig {
|
|
18
|
+
readonly mcpServers?: Readonly<Record<string, McpServerEntry>>;
|
|
19
|
+
readonly [extra: string]: unknown;
|
|
20
|
+
}
|
|
21
|
+
export interface InitOptions {
|
|
22
|
+
readonly client: ClientId | "all";
|
|
23
|
+
readonly profile: "minimal" | "example";
|
|
24
|
+
readonly dryRun: boolean;
|
|
25
|
+
readonly yes: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface InitDiff {
|
|
28
|
+
readonly profileAction: "create" | "exists" | "skipped";
|
|
29
|
+
readonly profilePath: string;
|
|
30
|
+
readonly clients: ReadonlyArray<ClientDiff>;
|
|
31
|
+
}
|
|
32
|
+
export interface ClientDiff {
|
|
33
|
+
readonly client: ClientId;
|
|
34
|
+
readonly path: string;
|
|
35
|
+
readonly action: "create" | "update" | "skip" | "no-change";
|
|
36
|
+
readonly added: ReadonlyArray<string>;
|
|
37
|
+
readonly collisions: ReadonlyArray<string>;
|
|
38
|
+
readonly reason?: string;
|
|
39
|
+
}
|
|
40
|
+
export type CheckStatus = "PASS" | "FAIL" | "SKIP";
|
|
41
|
+
export interface CheckResult {
|
|
42
|
+
readonly name: string;
|
|
43
|
+
readonly status: CheckStatus;
|
|
44
|
+
readonly detail?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ProfileEnvelope {
|
|
47
|
+
readonly raw: unknown;
|
|
48
|
+
readonly resolved: unknown;
|
|
49
|
+
readonly errors: ReadonlyArray<string>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,MAAM,MAAM,QAAQ,GAAG,gBAAgB,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/D,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,KAAK,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,aAAa,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACxC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2CAA2C"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@neurodock/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "NeuroDock installer and diagnostic CLI.",
|
|
5
|
+
"license": "AGPL-3.0-or-later",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"neurodock": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/tlennon-ie/neurodock.git",
|
|
18
|
+
"directory": "packages/cli"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/tlennon-ie/neurodock#readme",
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"CHANGELOG.md"
|
|
25
|
+
],
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"ajv": "^8.17.1",
|
|
28
|
+
"ajv-formats": "^3.0.1",
|
|
29
|
+
"chalk": "^5.3.0",
|
|
30
|
+
"commander": "^12.1.0",
|
|
31
|
+
"yaml": "^2.6.1"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^22.10.5",
|
|
35
|
+
"rimraf": "^6.0.1",
|
|
36
|
+
"tsx": "^4.19.2",
|
|
37
|
+
"typescript": "^5.7.2",
|
|
38
|
+
"vitest": "^2.1.8"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=22"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc -p tsconfig.json",
|
|
45
|
+
"lint": "echo 'cli: lint skipped (no eslint config in workspace yet)' && exit 0",
|
|
46
|
+
"test": "vitest run",
|
|
47
|
+
"test:watch": "vitest",
|
|
48
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
49
|
+
"clean": "rimraf dist .turbo"
|
|
50
|
+
}
|
|
51
|
+
}
|