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/install.js
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
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 * as fs from "fs";
|
|
8
|
+
import * as os from "os";
|
|
9
|
+
import * as path from "path";
|
|
10
|
+
import * as https from "https";
|
|
11
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Read a JSON file and return the parsed object, or an empty object if
|
|
14
|
+
* the file does not exist or cannot be parsed.
|
|
15
|
+
*/
|
|
16
|
+
function readJsonFile(filePath) {
|
|
17
|
+
try {
|
|
18
|
+
const raw = fs.readFileSync(filePath, "utf8");
|
|
19
|
+
return JSON.parse(raw);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Atomically write a JSON file, creating parent directories if needed.
|
|
27
|
+
*/
|
|
28
|
+
function writeJsonFile(filePath, data) {
|
|
29
|
+
const dir = path.dirname(filePath);
|
|
30
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
31
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf8");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Deep merge source into target. Arrays are concatenated and de-duplicated
|
|
35
|
+
* by stringified value. Objects are merged recursively.
|
|
36
|
+
*/
|
|
37
|
+
function deepMerge(target, source) {
|
|
38
|
+
const result = { ...target };
|
|
39
|
+
for (const key of Object.keys(source)) {
|
|
40
|
+
const sv = source[key];
|
|
41
|
+
const tv = target[key];
|
|
42
|
+
if (sv !== null &&
|
|
43
|
+
typeof sv === "object" &&
|
|
44
|
+
!Array.isArray(sv) &&
|
|
45
|
+
tv !== null &&
|
|
46
|
+
typeof tv === "object" &&
|
|
47
|
+
!Array.isArray(tv)) {
|
|
48
|
+
result[key] = deepMerge(tv, sv);
|
|
49
|
+
}
|
|
50
|
+
else if (Array.isArray(sv) && Array.isArray(tv)) {
|
|
51
|
+
// Merge arrays: append source items not already present (by JSON equality)
|
|
52
|
+
const existingSet = new Set(tv.map((v) => JSON.stringify(v)));
|
|
53
|
+
const newItems = sv.filter((v) => !existingSet.has(JSON.stringify(v)));
|
|
54
|
+
result[key] = [...tv, ...newItems];
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
result[key] = sv;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Make an HTTPS POST request and return { status, body }.
|
|
64
|
+
*/
|
|
65
|
+
function httpsPost(url, body, apiKey) {
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
const payload = JSON.stringify(body);
|
|
68
|
+
const parsed = new URL(url);
|
|
69
|
+
const options = {
|
|
70
|
+
hostname: parsed.hostname,
|
|
71
|
+
port: parsed.port || 443,
|
|
72
|
+
path: parsed.pathname + parsed.search,
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: {
|
|
75
|
+
"Content-Type": "application/json",
|
|
76
|
+
"Content-Length": Buffer.byteLength(payload),
|
|
77
|
+
Authorization: `Bearer ${apiKey}`,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
const req = https.request(options, (res) => {
|
|
81
|
+
let data = "";
|
|
82
|
+
res.on("data", (chunk) => {
|
|
83
|
+
data += chunk.toString();
|
|
84
|
+
});
|
|
85
|
+
res.on("end", () => {
|
|
86
|
+
resolve({ status: res.statusCode ?? 0, body: data });
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
req.on("error", reject);
|
|
90
|
+
req.setTimeout(10_000, () => {
|
|
91
|
+
req.destroy(new Error("Request timed out"));
|
|
92
|
+
});
|
|
93
|
+
req.write(payload);
|
|
94
|
+
req.end();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// ─── Shared config ──────────────────────────────────────────────────────────
|
|
98
|
+
/**
|
|
99
|
+
* Write ~/.custodex/config.json and install the hook script.
|
|
100
|
+
* The hook script is copied from the package's hooks/ directory.
|
|
101
|
+
*/
|
|
102
|
+
export function writeSharedConfig(config) {
|
|
103
|
+
const custodexDir = path.join(os.homedir(), ".custodex");
|
|
104
|
+
fs.mkdirSync(custodexDir, { recursive: true });
|
|
105
|
+
fs.mkdirSync(path.join(custodexDir, "plugins"), { recursive: true });
|
|
106
|
+
// Write config
|
|
107
|
+
const configPath = path.join(custodexDir, "config.json");
|
|
108
|
+
writeJsonFile(configPath, config);
|
|
109
|
+
// Copy hook.sh from package hooks/ → ~/.custodex/hook.sh
|
|
110
|
+
const hookDst = path.join(custodexDir, "hook.sh");
|
|
111
|
+
// Compiled output lives in dist/install.js; package root is one level up.
|
|
112
|
+
const packageRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
|
|
113
|
+
const hookSrc = path.join(packageRoot, "hooks", "hook.sh");
|
|
114
|
+
if (fs.existsSync(hookSrc)) {
|
|
115
|
+
fs.copyFileSync(hookSrc, hookDst);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// Write a minimal hook if the package hook is missing (e.g. dev environment)
|
|
119
|
+
fs.writeFileSync(hookDst, `#!/usr/bin/env bash
|
|
120
|
+
# Custodex governance hook
|
|
121
|
+
# Reads event JSON from stdin and forwards to the Custodex backend.
|
|
122
|
+
|
|
123
|
+
set -euo pipefail
|
|
124
|
+
|
|
125
|
+
CUSTODEX_CONFIG="${custodexDir}/config.json"
|
|
126
|
+
if [ ! -f "$CUSTODEX_CONFIG" ]; then
|
|
127
|
+
exit 0
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
API_KEY=$(node -e "const c=require('$CUSTODEX_CONFIG');process.stdout.write(c.apiKey||'')" 2>/dev/null || true)
|
|
131
|
+
BASE_URL=$(node -e "const c=require('$CUSTODEX_CONFIG');process.stdout.write(c.baseUrl||'')" 2>/dev/null || true)
|
|
132
|
+
|
|
133
|
+
if [ -z "$API_KEY" ] || [ -z "$BASE_URL" ]; then
|
|
134
|
+
exit 0
|
|
135
|
+
fi
|
|
136
|
+
|
|
137
|
+
# Read event payload from stdin (Claude Code / Cursor pass JSON here)
|
|
138
|
+
PAYLOAD=$(cat -)
|
|
139
|
+
|
|
140
|
+
# Fire-and-forget telemetry — never block the IDE
|
|
141
|
+
curl -s -X POST "$BASE_URL/api/telemetry" \\
|
|
142
|
+
-H "Authorization: Bearer $API_KEY" \\
|
|
143
|
+
-H "Content-Type: application/json" \\
|
|
144
|
+
-d "$PAYLOAD" \\
|
|
145
|
+
--max-time 3 >/dev/null 2>&1 || true
|
|
146
|
+
|
|
147
|
+
exit 0
|
|
148
|
+
`, { encoding: "utf8" });
|
|
149
|
+
}
|
|
150
|
+
fs.chmodSync(hookDst, 0o755);
|
|
151
|
+
// Copy OpenCode plugin
|
|
152
|
+
const pluginDst = path.join(custodexDir, "plugins", "custodex-opencode.ts");
|
|
153
|
+
const pluginSrc = path.join(packageRoot, "plugins", "custodex-opencode.ts");
|
|
154
|
+
if (fs.existsSync(pluginSrc)) {
|
|
155
|
+
fs.copyFileSync(pluginSrc, pluginDst);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// ─── Per-IDE installers ──────────────────────────────────────────────────────
|
|
159
|
+
/**
|
|
160
|
+
* Install governance hooks into Claude Code's global settings.json.
|
|
161
|
+
* Preserves all existing hook configuration — only appends new entries.
|
|
162
|
+
*/
|
|
163
|
+
export function installClaude() {
|
|
164
|
+
try {
|
|
165
|
+
const home = os.homedir();
|
|
166
|
+
const hookCmd = `${home}/.custodex/hook.sh`;
|
|
167
|
+
const settingsPath = path.join(home, ".claude", "settings.json");
|
|
168
|
+
fs.mkdirSync(path.join(home, ".claude"), { recursive: true });
|
|
169
|
+
const existing = readJsonFile(settingsPath);
|
|
170
|
+
const custodexHooks = {
|
|
171
|
+
hooks: {
|
|
172
|
+
SessionStart: [
|
|
173
|
+
{
|
|
174
|
+
matcher: "*",
|
|
175
|
+
hooks: [{ type: "command", command: hookCmd, timeout: 5 }],
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
SubagentStart: [
|
|
179
|
+
{
|
|
180
|
+
matcher: "*",
|
|
181
|
+
hooks: [{ type: "command", command: hookCmd, timeout: 5 }],
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
PreToolUse: [
|
|
185
|
+
{
|
|
186
|
+
matcher: "Write|Edit|Bash|Task|Agent|mcp__.*",
|
|
187
|
+
hooks: [{ type: "command", command: hookCmd, timeout: 5 }],
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
PostToolUse: [
|
|
191
|
+
{
|
|
192
|
+
matcher: "*",
|
|
193
|
+
hooks: [
|
|
194
|
+
{ type: "command", command: hookCmd, timeout: 5, async: true },
|
|
195
|
+
],
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
UserPromptSubmit: [
|
|
199
|
+
{
|
|
200
|
+
matcher: "*",
|
|
201
|
+
hooks: [
|
|
202
|
+
{ type: "command", command: hookCmd, timeout: 5, async: true },
|
|
203
|
+
],
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
const merged = deepMerge(existing, custodexHooks);
|
|
209
|
+
writeJsonFile(settingsPath, merged);
|
|
210
|
+
return { id: "claude", name: "Claude Code", success: true };
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
return {
|
|
214
|
+
id: "claude",
|
|
215
|
+
name: "Claude Code",
|
|
216
|
+
success: false,
|
|
217
|
+
error: String(err),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Install governance hooks into Cursor's hooks.json.
|
|
223
|
+
* Creates the file if absent; merges if present.
|
|
224
|
+
*/
|
|
225
|
+
export function installCursor() {
|
|
226
|
+
try {
|
|
227
|
+
const home = os.homedir();
|
|
228
|
+
const hookCmd = `${home}/.custodex/hook.sh`;
|
|
229
|
+
const hooksPath = path.join(home, ".cursor", "hooks.json");
|
|
230
|
+
fs.mkdirSync(path.join(home, ".cursor"), { recursive: true });
|
|
231
|
+
const existing = readJsonFile(hooksPath);
|
|
232
|
+
const custodexHooks = {
|
|
233
|
+
version: 1,
|
|
234
|
+
hooks: {
|
|
235
|
+
sessionStart: [
|
|
236
|
+
{ type: "command", command: hookCmd, timeout: 5 },
|
|
237
|
+
],
|
|
238
|
+
subagentStart: [
|
|
239
|
+
{ type: "command", command: hookCmd, timeout: 5 },
|
|
240
|
+
],
|
|
241
|
+
preToolUse: [
|
|
242
|
+
{ type: "command", command: hookCmd, timeout: 5 },
|
|
243
|
+
],
|
|
244
|
+
beforeShellExecution: [
|
|
245
|
+
{ type: "command", command: hookCmd, timeout: 5, failClosed: true },
|
|
246
|
+
],
|
|
247
|
+
beforeMCPExecution: [
|
|
248
|
+
{ type: "command", command: hookCmd, timeout: 5, failClosed: true },
|
|
249
|
+
],
|
|
250
|
+
postToolUse: [
|
|
251
|
+
{ type: "command", command: hookCmd, timeout: 5 },
|
|
252
|
+
],
|
|
253
|
+
afterShellExecution: [
|
|
254
|
+
{ type: "command", command: hookCmd, timeout: 5 },
|
|
255
|
+
],
|
|
256
|
+
afterFileEdit: [
|
|
257
|
+
{ type: "command", command: hookCmd, timeout: 5 },
|
|
258
|
+
],
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
const merged = deepMerge(existing, custodexHooks);
|
|
262
|
+
writeJsonFile(hooksPath, merged);
|
|
263
|
+
return { id: "cursor", name: "Cursor", success: true };
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
return {
|
|
267
|
+
id: "cursor",
|
|
268
|
+
name: "Cursor",
|
|
269
|
+
success: false,
|
|
270
|
+
error: String(err),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Install governance hooks into Gemini CLI's settings.json.
|
|
276
|
+
* Note: Gemini uses milliseconds for timeout values.
|
|
277
|
+
*/
|
|
278
|
+
export function installGemini() {
|
|
279
|
+
try {
|
|
280
|
+
const home = os.homedir();
|
|
281
|
+
const hookCmd = `${home}/.custodex/hook.sh`;
|
|
282
|
+
const settingsPath = path.join(home, ".gemini", "settings.json");
|
|
283
|
+
fs.mkdirSync(path.join(home, ".gemini"), { recursive: true });
|
|
284
|
+
const existing = readJsonFile(settingsPath);
|
|
285
|
+
const custodexHooks = {
|
|
286
|
+
hooks: {
|
|
287
|
+
SessionStart: [
|
|
288
|
+
{
|
|
289
|
+
matcher: "*",
|
|
290
|
+
hooks: [{ type: "command", command: hookCmd, timeout: 5000 }],
|
|
291
|
+
},
|
|
292
|
+
],
|
|
293
|
+
BeforeTool: [
|
|
294
|
+
{
|
|
295
|
+
matcher: ".*",
|
|
296
|
+
hooks: [{ type: "command", command: hookCmd, timeout: 5000 }],
|
|
297
|
+
},
|
|
298
|
+
],
|
|
299
|
+
AfterTool: [
|
|
300
|
+
{
|
|
301
|
+
matcher: ".*",
|
|
302
|
+
hooks: [{ type: "command", command: hookCmd, timeout: 5000 }],
|
|
303
|
+
},
|
|
304
|
+
],
|
|
305
|
+
BeforeAgent: [
|
|
306
|
+
{
|
|
307
|
+
matcher: "*",
|
|
308
|
+
hooks: [{ type: "command", command: hookCmd, timeout: 5000 }],
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
const merged = deepMerge(existing, custodexHooks);
|
|
314
|
+
writeJsonFile(settingsPath, merged);
|
|
315
|
+
return { id: "gemini", name: "Gemini CLI", success: true };
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
return {
|
|
319
|
+
id: "gemini",
|
|
320
|
+
name: "Gemini CLI",
|
|
321
|
+
success: false,
|
|
322
|
+
error: String(err),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Install the OpenCode plugin by symlinking the shared plugin file into
|
|
328
|
+
* the OpenCode plugins directory.
|
|
329
|
+
*/
|
|
330
|
+
export function installOpenCode() {
|
|
331
|
+
const home = os.homedir();
|
|
332
|
+
const pluginSrc = `${home}/.custodex/plugins/custodex-opencode.ts`;
|
|
333
|
+
const pluginDir = path.join(home, ".config", "opencode", "plugins");
|
|
334
|
+
const pluginDst = path.join(pluginDir, "custodex-opencode.ts");
|
|
335
|
+
try {
|
|
336
|
+
fs.mkdirSync(pluginDir, { recursive: true });
|
|
337
|
+
// Remove any existing file or symlink at the destination.
|
|
338
|
+
// Use lstatSync (not existsSync) so broken symlinks are also removed.
|
|
339
|
+
try {
|
|
340
|
+
fs.lstatSync(pluginDst);
|
|
341
|
+
fs.unlinkSync(pluginDst);
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
// Nothing at that path — nothing to remove.
|
|
345
|
+
}
|
|
346
|
+
fs.symlinkSync(pluginSrc, pluginDst);
|
|
347
|
+
return { id: "opencode", name: "OpenCode", success: true };
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
return {
|
|
351
|
+
id: "opencode",
|
|
352
|
+
name: "OpenCode",
|
|
353
|
+
success: false,
|
|
354
|
+
error: String(err),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Dispatch installation for a single IDE by its ID.
|
|
360
|
+
*/
|
|
361
|
+
export function installIDE(ide) {
|
|
362
|
+
switch (ide.id) {
|
|
363
|
+
case "claude":
|
|
364
|
+
return installClaude();
|
|
365
|
+
case "cursor":
|
|
366
|
+
return installCursor();
|
|
367
|
+
case "gemini":
|
|
368
|
+
return installGemini();
|
|
369
|
+
case "opencode":
|
|
370
|
+
return installOpenCode();
|
|
371
|
+
default:
|
|
372
|
+
return {
|
|
373
|
+
id: ide.id,
|
|
374
|
+
name: ide.name,
|
|
375
|
+
success: false,
|
|
376
|
+
error: "Unknown IDE id",
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Register a Custodex admin agent with the backend.
|
|
382
|
+
* Returns the new agent's ID and API key on success.
|
|
383
|
+
*/
|
|
384
|
+
export async function registerAdminAgent(apiKey, baseUrl) {
|
|
385
|
+
try {
|
|
386
|
+
const payload = {
|
|
387
|
+
name: `${os.hostname()}-custodex-admin`,
|
|
388
|
+
scopes: ["*"],
|
|
389
|
+
metadata: {
|
|
390
|
+
source: "custodex-cli",
|
|
391
|
+
hostname: os.hostname(),
|
|
392
|
+
installedAt: Date.now(),
|
|
393
|
+
},
|
|
394
|
+
protocol: "mcp",
|
|
395
|
+
};
|
|
396
|
+
const result = await httpsPost(`${baseUrl}/api/agents/register`, payload, apiKey);
|
|
397
|
+
if (result.status >= 200 && result.status < 300) {
|
|
398
|
+
const parsed = JSON.parse(result.body);
|
|
399
|
+
return {
|
|
400
|
+
agentId: parsed.agentId ?? "",
|
|
401
|
+
agentApiKey: parsed.apiKey ?? "",
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
return null;
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall Module
|
|
3
|
+
*
|
|
4
|
+
* Cleanly removes all Custodex governance hooks from each IDE's config
|
|
5
|
+
* and deletes the ~/.custodex directory.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Remove all Custodex governance configuration from the system.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runUninstall(): void;
|
|
11
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgLH;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CA+BnC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall Module
|
|
3
|
+
*
|
|
4
|
+
* Cleanly removes all Custodex governance hooks from each IDE's config
|
|
5
|
+
* and deletes the ~/.custodex directory.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from "fs";
|
|
8
|
+
import * as os from "os";
|
|
9
|
+
import * as path from "path";
|
|
10
|
+
/** Read a JSON file; return empty object on any error. */
|
|
11
|
+
function readJsonFile(filePath) {
|
|
12
|
+
try {
|
|
13
|
+
const raw = fs.readFileSync(filePath, "utf8");
|
|
14
|
+
return JSON.parse(raw);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Atomically write a JSON file. */
|
|
21
|
+
function writeJsonFile(filePath, data) {
|
|
22
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf8");
|
|
23
|
+
}
|
|
24
|
+
/** Hook command path that custodex installs. */
|
|
25
|
+
function hookCmd() {
|
|
26
|
+
return `${os.homedir()}/.custodex/hook.sh`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Remove all hook entries whose `command` matches the custodex hook
|
|
30
|
+
* from an array of hook entries (supports both flat arrays and arrays of
|
|
31
|
+
* `{ matcher, hooks }` wrapper objects used by Claude / Gemini).
|
|
32
|
+
*/
|
|
33
|
+
function filterHookEntries(entries) {
|
|
34
|
+
const cmd = hookCmd();
|
|
35
|
+
return entries
|
|
36
|
+
.map((entry) => {
|
|
37
|
+
// Claude/Gemini style: { matcher, hooks: [...] }
|
|
38
|
+
if (entry !== null &&
|
|
39
|
+
typeof entry === "object" &&
|
|
40
|
+
"hooks" in entry &&
|
|
41
|
+
Array.isArray(entry["hooks"])) {
|
|
42
|
+
const inner = entry.hooks.filter((h) => !(typeof h === "object" &&
|
|
43
|
+
h !== null &&
|
|
44
|
+
h["command"] === cmd));
|
|
45
|
+
if (inner.length === 0)
|
|
46
|
+
return null; // whole wrapper can be removed
|
|
47
|
+
return { ...entry, hooks: inner };
|
|
48
|
+
}
|
|
49
|
+
// Cursor style: flat { type, command, ... }
|
|
50
|
+
if (entry !== null &&
|
|
51
|
+
typeof entry === "object" &&
|
|
52
|
+
entry["command"] === cmd) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return entry;
|
|
56
|
+
})
|
|
57
|
+
.filter((e) => e !== null);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Strip custodex hook entries from a hooks map (object keyed by event name).
|
|
61
|
+
*/
|
|
62
|
+
function stripHooksFromMap(hooksMap) {
|
|
63
|
+
const cleaned = {};
|
|
64
|
+
for (const event of Object.keys(hooksMap)) {
|
|
65
|
+
const entries = hooksMap[event];
|
|
66
|
+
if (Array.isArray(entries)) {
|
|
67
|
+
const filtered = filterHookEntries(entries);
|
|
68
|
+
if (filtered.length > 0) {
|
|
69
|
+
cleaned[event] = filtered;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
cleaned[event] = entries;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return cleaned;
|
|
77
|
+
}
|
|
78
|
+
/** Remove Custodex hooks from Claude Code's settings.json */
|
|
79
|
+
function removeClaude() {
|
|
80
|
+
const settingsPath = path.join(os.homedir(), ".claude", "settings.json");
|
|
81
|
+
if (!fs.existsSync(settingsPath))
|
|
82
|
+
return;
|
|
83
|
+
const settings = readJsonFile(settingsPath);
|
|
84
|
+
if (typeof settings["hooks"] === "object" &&
|
|
85
|
+
settings["hooks"] !== null &&
|
|
86
|
+
!Array.isArray(settings["hooks"])) {
|
|
87
|
+
settings["hooks"] = stripHooksFromMap(settings["hooks"]);
|
|
88
|
+
}
|
|
89
|
+
writeJsonFile(settingsPath, settings);
|
|
90
|
+
}
|
|
91
|
+
/** Remove Custodex hooks from Cursor's hooks.json */
|
|
92
|
+
function removeCursor() {
|
|
93
|
+
const hooksPath = path.join(os.homedir(), ".cursor", "hooks.json");
|
|
94
|
+
if (!fs.existsSync(hooksPath))
|
|
95
|
+
return;
|
|
96
|
+
const config = readJsonFile(hooksPath);
|
|
97
|
+
if (typeof config["hooks"] === "object" &&
|
|
98
|
+
config["hooks"] !== null &&
|
|
99
|
+
!Array.isArray(config["hooks"])) {
|
|
100
|
+
config["hooks"] = stripHooksFromMap(config["hooks"]);
|
|
101
|
+
}
|
|
102
|
+
writeJsonFile(hooksPath, config);
|
|
103
|
+
}
|
|
104
|
+
/** Remove Custodex hooks from Gemini CLI's settings.json */
|
|
105
|
+
function removeGemini() {
|
|
106
|
+
const settingsPath = path.join(os.homedir(), ".gemini", "settings.json");
|
|
107
|
+
if (!fs.existsSync(settingsPath))
|
|
108
|
+
return;
|
|
109
|
+
const settings = readJsonFile(settingsPath);
|
|
110
|
+
if (typeof settings["hooks"] === "object" &&
|
|
111
|
+
settings["hooks"] !== null &&
|
|
112
|
+
!Array.isArray(settings["hooks"])) {
|
|
113
|
+
settings["hooks"] = stripHooksFromMap(settings["hooks"]);
|
|
114
|
+
}
|
|
115
|
+
writeJsonFile(settingsPath, settings);
|
|
116
|
+
}
|
|
117
|
+
/** Remove the OpenCode plugin symlink */
|
|
118
|
+
function removeOpenCode() {
|
|
119
|
+
const pluginPath = path.join(os.homedir(), ".config", "opencode", "plugins", "custodex-opencode.ts");
|
|
120
|
+
try {
|
|
121
|
+
// lstatSync works for symlinks without following them
|
|
122
|
+
fs.lstatSync(pluginPath);
|
|
123
|
+
fs.unlinkSync(pluginPath);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// File/symlink doesn't exist — nothing to do
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Recursively remove a directory (cross-platform, no external deps). */
|
|
130
|
+
function rmrf(dirPath) {
|
|
131
|
+
if (!fs.existsSync(dirPath))
|
|
132
|
+
return;
|
|
133
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
134
|
+
for (const entry of entries) {
|
|
135
|
+
const full = path.join(dirPath, entry.name);
|
|
136
|
+
if (entry.isDirectory()) {
|
|
137
|
+
rmrf(full);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
fs.unlinkSync(full);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
fs.rmdirSync(dirPath);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Remove all Custodex governance configuration from the system.
|
|
147
|
+
*/
|
|
148
|
+
export function runUninstall() {
|
|
149
|
+
process.stdout.write("Removing Custodex governance hooks...\n\n");
|
|
150
|
+
const steps = [
|
|
151
|
+
{ label: "Claude Code", fn: removeClaude },
|
|
152
|
+
{ label: "Cursor", fn: removeCursor },
|
|
153
|
+
{ label: "Gemini CLI", fn: removeGemini },
|
|
154
|
+
{ label: "OpenCode", fn: removeOpenCode },
|
|
155
|
+
];
|
|
156
|
+
for (const step of steps) {
|
|
157
|
+
try {
|
|
158
|
+
step.fn();
|
|
159
|
+
process.stdout.write(` [OK] ${step.label}\n`);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
process.stdout.write(` [--] ${step.label}: ${String(err)}\n`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Remove ~/.custodex directory last
|
|
166
|
+
const custodexDir = path.join(os.homedir(), ".custodex");
|
|
167
|
+
try {
|
|
168
|
+
rmrf(custodexDir);
|
|
169
|
+
process.stdout.write(`\n [OK] Removed ${custodexDir}\n`);
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
process.stdout.write(`\n [--] Could not remove ${custodexDir}: ${String(err)}\n`);
|
|
173
|
+
}
|
|
174
|
+
process.stdout.write("\nCustodex governance removed. Restart your IDEs.\n");
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"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"}
|
package/dist/wizard.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive Wizard
|
|
3
|
+
*
|
|
4
|
+
* Guides the user through detecting installed AI coding tools and wiring
|
|
5
|
+
* Custodex governance hooks into each one. Uses only Node.js built-ins.
|
|
6
|
+
*/
|
|
7
|
+
export interface WizardOptions {
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
autoYes?: boolean;
|
|
10
|
+
baseUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Run the interactive installation wizard.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runWizard(options?: WizardOptions): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Print the current Custodex configuration status without modifying anything.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runStatus(): void;
|
|
20
|
+
//# sourceMappingURL=wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmJH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmN1E;AAID;;GAEG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAoDhC"}
|