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.
- package/dist/detect.d.ts +27 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +108 -0
- package/dist/detect.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +147 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +59 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +410 -0
- package/dist/install.js.map +1 -0
- package/dist/uninstall.d.ts +11 -0
- package/dist/uninstall.d.ts.map +1 -0
- package/dist/uninstall.js +176 -0
- package/dist/uninstall.js.map +1 -0
- package/dist/wizard.d.ts +20 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +332 -0
- package/dist/wizard.js.map +1 -0
- package/hooks/hook.sh +724 -0
- package/package.json +21 -0
- package/plugins/custodex-opencode.ts +330 -0
package/dist/detect.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|