custodex 1.0.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.
@@ -0,0 +1,27 @@
1
+ /**
2
+ * IDE Detection Module
3
+ *
4
+ * Scans the local system for installed AI coding tools by checking
5
+ * well-known config directories and CLI binaries.
6
+ */
7
+ /** Represents a detected (or not detected) AI coding IDE. */
8
+ export interface DetectedIDE {
9
+ /** Human-readable name */
10
+ name: string;
11
+ /** Internal identifier */
12
+ id: "claude" | "cursor" | "gemini" | "opencode";
13
+ /** Whether the tool was found on this system */
14
+ detected: boolean;
15
+ /** Version string from CLI --version, if available */
16
+ version?: string;
17
+ /** Absolute path where governance hooks config is written */
18
+ globalConfigPath: string;
19
+ /** Whether governance hooks are enforced hard or soft */
20
+ enforcement: "mandatory" | "advisory";
21
+ }
22
+ /**
23
+ * Detect all installed AI coding IDEs and return their metadata.
24
+ * Every IDE is always returned; check `detected` to filter installed ones.
25
+ */
26
+ export declare function detectIDEs(): DetectedIDE[];
27
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,EAAE,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IAChD,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,gBAAgB,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,WAAW,EAAE,WAAW,GAAG,UAAU,CAAC;CACvC;AA8BD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,WAAW,EAAE,CA6E1C"}
package/dist/detect.js ADDED
@@ -0,0 +1,108 @@
1
+ /**
2
+ * IDE Detection Module
3
+ *
4
+ * Scans the local system for installed AI coding tools by checking
5
+ * well-known config directories and CLI binaries.
6
+ */
7
+ import * as fs from "fs";
8
+ import * as os from "os";
9
+ import * as path from "path";
10
+ import { execSync } from "child_process";
11
+ /**
12
+ * Attempt to run a CLI binary and capture its version output.
13
+ * Returns undefined if the binary is not found or exits with error.
14
+ */
15
+ function tryGetVersion(binary) {
16
+ try {
17
+ const output = execSync(`${binary} --version 2>/dev/null`, {
18
+ encoding: "utf8",
19
+ timeout: 3000,
20
+ }).trim();
21
+ return output.length > 0 ? output : undefined;
22
+ }
23
+ catch {
24
+ return undefined;
25
+ }
26
+ }
27
+ /**
28
+ * Check whether a binary is available on PATH via `which`.
29
+ */
30
+ function whichExists(binary) {
31
+ try {
32
+ execSync(`which ${binary} 2>/dev/null`, { timeout: 3000 });
33
+ return true;
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ /**
40
+ * Detect all installed AI coding IDEs and return their metadata.
41
+ * Every IDE is always returned; check `detected` to filter installed ones.
42
+ */
43
+ export function detectIDEs() {
44
+ const home = os.homedir();
45
+ // ─── Claude Code ───────────────────────────────────────────────────────────
46
+ const claudeConfigDir = path.join(home, ".claude");
47
+ const claudeDetected = fs.existsSync(claudeConfigDir) || whichExists("claude");
48
+ let claudeVersion;
49
+ if (claudeDetected) {
50
+ claudeVersion = tryGetVersion("claude");
51
+ }
52
+ // ─── Cursor ────────────────────────────────────────────────────────────────
53
+ const cursorConfigDir = path.join(home, ".cursor");
54
+ const cursorDetected = fs.existsSync(cursorConfigDir);
55
+ let cursorVersion;
56
+ if (cursorDetected) {
57
+ cursorVersion = tryGetVersion("cursor");
58
+ }
59
+ // ─── Gemini CLI ────────────────────────────────────────────────────────────
60
+ const geminiConfigDir = path.join(home, ".gemini");
61
+ const geminiDetected = fs.existsSync(geminiConfigDir) || whichExists("gemini");
62
+ let geminiVersion;
63
+ if (geminiDetected) {
64
+ geminiVersion = tryGetVersion("gemini");
65
+ }
66
+ // ─── OpenCode ──────────────────────────────────────────────────────────────
67
+ const openCodeConfigDir = path.join(home, ".config", "opencode");
68
+ const openCodeDetected = fs.existsSync(openCodeConfigDir);
69
+ let openCodeVersion;
70
+ if (openCodeDetected) {
71
+ openCodeVersion = tryGetVersion("opencode");
72
+ }
73
+ return [
74
+ {
75
+ name: "Claude Code",
76
+ id: "claude",
77
+ detected: claudeDetected,
78
+ version: claudeVersion,
79
+ globalConfigPath: path.join(home, ".claude", "settings.json"),
80
+ enforcement: "mandatory",
81
+ },
82
+ {
83
+ name: "Cursor",
84
+ id: "cursor",
85
+ detected: cursorDetected,
86
+ version: cursorVersion,
87
+ globalConfigPath: path.join(home, ".cursor", "hooks.json"),
88
+ enforcement: "mandatory",
89
+ },
90
+ {
91
+ name: "Gemini CLI",
92
+ id: "gemini",
93
+ detected: geminiDetected,
94
+ version: geminiVersion,
95
+ globalConfigPath: path.join(home, ".gemini", "settings.json"),
96
+ enforcement: "advisory",
97
+ },
98
+ {
99
+ name: "OpenCode",
100
+ id: "opencode",
101
+ detected: openCodeDetected,
102
+ version: openCodeVersion,
103
+ globalConfigPath: path.join(home, ".config", "opencode", "plugins", "custodex-opencode.ts"),
104
+ enforcement: "advisory",
105
+ },
106
+ ];
107
+ }
108
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Custodex CLI — Entry Point
4
+ *
5
+ * Usage:
6
+ * npx custodex # run interactive wizard
7
+ * npx custodex init # same as above
8
+ * npx custodex --api-key <key> # skip API key prompt
9
+ * npx custodex --yes # auto-confirm all prompts
10
+ * npx custodex --uninstall # remove all governance hooks
11
+ * npx custodex --status # show current config
12
+ * npx custodex --help # show this help
13
+ * npx custodex --version # show version
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
package/dist/index.js ADDED
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Custodex CLI — Entry Point
4
+ *
5
+ * Usage:
6
+ * npx custodex # run interactive wizard
7
+ * npx custodex init # same as above
8
+ * npx custodex --api-key <key> # skip API key prompt
9
+ * npx custodex --yes # auto-confirm all prompts
10
+ * npx custodex --uninstall # remove all governance hooks
11
+ * npx custodex --status # show current config
12
+ * npx custodex --help # show this help
13
+ * npx custodex --version # show version
14
+ */
15
+ import { runWizard, runStatus } from "./wizard.js";
16
+ import { runUninstall } from "./uninstall.js";
17
+ const VERSION = "1.0.0";
18
+ // ─── Help text ────────────────────────────────────────────────────────────────
19
+ function printHelp() {
20
+ process.stdout.write(`
21
+ CUSTODEX — Universal AI Governance
22
+ v${VERSION}
23
+
24
+ Usage:
25
+ npx custodex [command] [options]
26
+
27
+ Commands:
28
+ init Run the interactive setup wizard (default)
29
+ --uninstall Remove all Custodex governance hooks
30
+ --status Show current configuration and detected tools
31
+
32
+ Options:
33
+ --api-key <key> Skip the API key prompt
34
+ --yes, -y Auto-confirm all prompts
35
+ --base-url <url> Override the Custodex backend URL
36
+ --help, -h Show this help message
37
+ --version, -v Show version number
38
+
39
+ Examples:
40
+ npx custodex
41
+ npx custodex init --api-key cus_abc123... --yes
42
+ npx custodex --uninstall
43
+ npx custodex --status
44
+
45
+ `);
46
+ }
47
+ function parseArgs(argv) {
48
+ const args = argv.slice(2); // drop "node" and script path
49
+ const result = {
50
+ command: "init",
51
+ autoYes: false,
52
+ };
53
+ let i = 0;
54
+ while (i < args.length) {
55
+ const arg = args[i];
56
+ switch (arg) {
57
+ case "init":
58
+ result.command = "init";
59
+ break;
60
+ case "--uninstall":
61
+ case "uninstall":
62
+ result.command = "uninstall";
63
+ break;
64
+ case "--status":
65
+ case "status":
66
+ result.command = "status";
67
+ break;
68
+ case "--help":
69
+ case "-h":
70
+ case "help":
71
+ result.command = "help";
72
+ break;
73
+ case "--version":
74
+ case "-v":
75
+ case "version":
76
+ result.command = "version";
77
+ break;
78
+ case "--yes":
79
+ case "-y":
80
+ result.autoYes = true;
81
+ break;
82
+ case "--api-key": {
83
+ const next = args[i + 1];
84
+ if (next !== undefined && !next.startsWith("-")) {
85
+ result.apiKey = next;
86
+ i++;
87
+ }
88
+ else {
89
+ process.stderr.write(" Error: --api-key requires a value.\n");
90
+ process.exit(1);
91
+ }
92
+ break;
93
+ }
94
+ case "--base-url": {
95
+ const next = args[i + 1];
96
+ if (next !== undefined && !next.startsWith("-")) {
97
+ result.baseUrl = next;
98
+ i++;
99
+ }
100
+ else {
101
+ process.stderr.write(" Error: --base-url requires a value.\n");
102
+ process.exit(1);
103
+ }
104
+ break;
105
+ }
106
+ default:
107
+ // Unknown flag — warn but continue
108
+ if (arg.startsWith("-")) {
109
+ process.stderr.write(` Warning: Unknown option "${arg}" (ignored).\n`);
110
+ }
111
+ break;
112
+ }
113
+ i++;
114
+ }
115
+ return result;
116
+ }
117
+ // ─── Main ─────────────────────────────────────────────────────────────────────
118
+ async function main() {
119
+ const args = parseArgs(process.argv);
120
+ switch (args.command) {
121
+ case "help":
122
+ printHelp();
123
+ break;
124
+ case "version":
125
+ process.stdout.write(`custodex v${VERSION}\n`);
126
+ break;
127
+ case "uninstall":
128
+ runUninstall();
129
+ break;
130
+ case "status":
131
+ runStatus();
132
+ break;
133
+ case "init":
134
+ default:
135
+ await runWizard({
136
+ apiKey: args.apiKey,
137
+ autoYes: args.autoYes,
138
+ baseUrl: args.baseUrl,
139
+ });
140
+ break;
141
+ }
142
+ }
143
+ main().catch((err) => {
144
+ process.stderr.write(`\n Fatal error: ${String(err)}\n\n`);
145
+ process.exit(1);
146
+ });
147
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Installation Module
3
+ *
4
+ * Writes governance hook configs for each detected IDE and registers
5
+ * a Custodex admin agent with the backend.
6
+ */
7
+ import type { DetectedIDE } from "./detect.js";
8
+ /** Config stored at ~/.custodex/config.json */
9
+ export interface CustodexConfig {
10
+ apiKey: string;
11
+ baseUrl: string;
12
+ version: string;
13
+ installedAt: number;
14
+ }
15
+ /** Result of a single IDE installation attempt */
16
+ export interface InstallResult {
17
+ id: string;
18
+ name: string;
19
+ success: boolean;
20
+ error?: string;
21
+ }
22
+ /**
23
+ * Write ~/.custodex/config.json and install the hook script.
24
+ * The hook script is copied from the package's hooks/ directory.
25
+ */
26
+ export declare function writeSharedConfig(config: CustodexConfig): void;
27
+ /**
28
+ * Install governance hooks into Claude Code's global settings.json.
29
+ * Preserves all existing hook configuration — only appends new entries.
30
+ */
31
+ export declare function installClaude(): InstallResult;
32
+ /**
33
+ * Install governance hooks into Cursor's hooks.json.
34
+ * Creates the file if absent; merges if present.
35
+ */
36
+ export declare function installCursor(): InstallResult;
37
+ /**
38
+ * Install governance hooks into Gemini CLI's settings.json.
39
+ * Note: Gemini uses milliseconds for timeout values.
40
+ */
41
+ export declare function installGemini(): InstallResult;
42
+ /**
43
+ * Install the OpenCode plugin by symlinking the shared plugin file into
44
+ * the OpenCode plugins directory.
45
+ */
46
+ export declare function installOpenCode(): InstallResult;
47
+ /**
48
+ * Dispatch installation for a single IDE by its ID.
49
+ */
50
+ export declare function installIDE(ide: DetectedIDE): InstallResult;
51
+ /**
52
+ * Register a Custodex admin agent with the backend.
53
+ * Returns the new agent's ID and API key on success.
54
+ */
55
+ export declare function registerAdminAgent(apiKey: string, baseUrl: string): Promise<{
56
+ agentId: string;
57
+ agentApiKey: string;
58
+ } | null>;
59
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwGD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAgE9D;AAID;;;GAGG;AACH,wBAAgB,aAAa,IAAI,aAAa,CAgE7C;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,aAAa,CAuD7C;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,aAAa,CAsD7C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,aAAa,CA6B/C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,aAAa,CAkB1D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA+B1D"}