@tryglen/cli 0.5.0 → 0.5.1
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/_utils/codex-app-server.d.ts +11 -0
- package/dist/_utils/codex-app-server.js +90 -0
- package/dist/_utils/codex-app-server.js.map +1 -0
- package/dist/_utils/codex-hooks-merge.d.ts +20 -0
- package/dist/_utils/codex-hooks-merge.js +63 -0
- package/dist/_utils/codex-hooks-merge.js.map +1 -0
- package/dist/_utils/codex-hooks-setup.d.ts +8 -0
- package/dist/_utils/codex-hooks-setup.js +152 -0
- package/dist/_utils/codex-hooks-setup.js.map +1 -0
- package/dist/_utils/codex-paths.d.ts +4 -0
- package/dist/_utils/codex-paths.js +10 -0
- package/dist/_utils/codex-paths.js.map +1 -0
- package/dist/_utils/codex-repair-trace.d.ts +11 -0
- package/dist/_utils/codex-repair-trace.js +42 -0
- package/dist/_utils/codex-repair-trace.js.map +1 -0
- package/dist/_utils/codex-trust-toml.d.ts +7 -0
- package/dist/_utils/codex-trust-toml.js +42 -0
- package/dist/_utils/codex-trust-toml.js.map +1 -0
- package/dist/bin.js +28 -2
- package/dist/bin.js.map +1 -1
- package/dist/commands/doctor.d.ts +4 -3
- package/dist/commands/doctor.js +47 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/ingest.js +24 -4
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/install.d.ts +1 -1
- package/dist/commands/install.js +80 -25
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/session-start.d.ts +1 -1
- package/dist/commands/session-start.js +21 -4
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/uninstall.d.ts +11 -0
- package/dist/commands/uninstall.js +41 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Result } from "./result.js";
|
|
2
|
+
type CodexHookEntry = {
|
|
3
|
+
readonly key: string;
|
|
4
|
+
readonly command: string;
|
|
5
|
+
readonly source: string;
|
|
6
|
+
readonly currentHash: string;
|
|
7
|
+
readonly trustStatus: string;
|
|
8
|
+
};
|
|
9
|
+
declare const listCodexHooks: (cwd: string) => Promise<Result<CodexHookEntry[], string>>;
|
|
10
|
+
export { listCodexHooks };
|
|
11
|
+
export type { CodexHookEntry };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { err, ok } from "./result.js";
|
|
3
|
+
import { cliVersion } from "./version.js";
|
|
4
|
+
const TIMEOUT_MS = 15_000;
|
|
5
|
+
const extractEntries = (msg) => {
|
|
6
|
+
const result = msg.result;
|
|
7
|
+
if (!result || !Array.isArray(result.data))
|
|
8
|
+
return null;
|
|
9
|
+
const entries = [];
|
|
10
|
+
for (const item of result.data) {
|
|
11
|
+
if (!Array.isArray(item.hooks))
|
|
12
|
+
continue;
|
|
13
|
+
for (const h of item.hooks) {
|
|
14
|
+
if (typeof h.key === "string" &&
|
|
15
|
+
typeof h.command === "string" &&
|
|
16
|
+
typeof h.source === "string" &&
|
|
17
|
+
typeof h.currentHash === "string" &&
|
|
18
|
+
typeof h.trustStatus === "string") {
|
|
19
|
+
entries.push({
|
|
20
|
+
key: h.key,
|
|
21
|
+
command: h.command,
|
|
22
|
+
source: h.source,
|
|
23
|
+
currentHash: h.currentHash,
|
|
24
|
+
trustStatus: h.trustStatus,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return entries;
|
|
30
|
+
};
|
|
31
|
+
const rpc = (id, method, params) => `${JSON.stringify({ jsonrpc: "2.0", id, method, params })}\n`;
|
|
32
|
+
const listCodexHooks = (cwd) => new Promise((resolve) => {
|
|
33
|
+
const child = spawn("codex", ["app-server"], {
|
|
34
|
+
stdio: ["pipe", "pipe", "ignore"],
|
|
35
|
+
});
|
|
36
|
+
const finish = (r) => {
|
|
37
|
+
clearTimeout(timer);
|
|
38
|
+
child.kill();
|
|
39
|
+
resolve(r);
|
|
40
|
+
};
|
|
41
|
+
const timer = setTimeout(() => finish(err("codex app-server timed out")), TIMEOUT_MS);
|
|
42
|
+
child.on("error", () => finish(err("could not spawn codex app-server")));
|
|
43
|
+
child.on("close", () => finish(err("codex app-server exited before answering")));
|
|
44
|
+
const state = { buf: "" };
|
|
45
|
+
child.stdout.on("data", (chunk) => {
|
|
46
|
+
state.buf += chunk.toString();
|
|
47
|
+
const lines = state.buf.split("\n");
|
|
48
|
+
state.buf = lines.pop() ?? "";
|
|
49
|
+
for (const line of lines) {
|
|
50
|
+
if (line.trim() === "")
|
|
51
|
+
continue;
|
|
52
|
+
const parsed = (() => {
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(line);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
})();
|
|
60
|
+
if (!parsed || typeof parsed !== "object")
|
|
61
|
+
continue;
|
|
62
|
+
const id = parsed.id;
|
|
63
|
+
const rpcError = parsed.error;
|
|
64
|
+
if ((id === 1 || id === 2) && rpcError) {
|
|
65
|
+
const msg = typeof rpcError.message === "string"
|
|
66
|
+
? rpcError.message
|
|
67
|
+
: "unknown error";
|
|
68
|
+
finish(err(`codex app-server error: ${msg}`));
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (id === 1) {
|
|
72
|
+
child.stdin.write(rpc(2, "hooks/list", { cwds: [cwd] }));
|
|
73
|
+
}
|
|
74
|
+
if (id === 2) {
|
|
75
|
+
const entries = extractEntries(parsed);
|
|
76
|
+
finish(entries ? ok(entries) : err("unexpected hooks/list response shape"));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Defer the handshake one microtask so an immediate spawn failure
|
|
81
|
+
// (ENOENT — codex not installed) wins the race and resolves err before
|
|
82
|
+
// we start talking to a process that never existed.
|
|
83
|
+
queueMicrotask(() => {
|
|
84
|
+
child.stdin.write(rpc(1, "initialize", {
|
|
85
|
+
clientInfo: { name: "glen", title: "glen CLI", version: cliVersion },
|
|
86
|
+
}));
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
export { listCodexHooks };
|
|
90
|
+
//# sourceMappingURL=codex-app-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-app-server.js","sourceRoot":"","sources":["../../src/_utils/codex-app-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
declare const GLEN_CODEX_HOOK_ENTRIES: {
|
|
2
|
+
readonly SessionStart: "glen session-start --agent codex";
|
|
3
|
+
readonly UserPromptSubmit: "glen ingest --agent codex";
|
|
4
|
+
};
|
|
5
|
+
declare const GLEN_OWNER_PREFIX = "glen ";
|
|
6
|
+
type HookHandler = {
|
|
7
|
+
type: string;
|
|
8
|
+
command: string;
|
|
9
|
+
} & Record<string, unknown>;
|
|
10
|
+
type MatcherGroup = {
|
|
11
|
+
hooks: HookHandler[];
|
|
12
|
+
} & Record<string, unknown>;
|
|
13
|
+
type HooksFile = {
|
|
14
|
+
hooks: Record<string, MatcherGroup[]>;
|
|
15
|
+
};
|
|
16
|
+
declare const normalizeHooksFile: (parsed: unknown) => HooksFile | null;
|
|
17
|
+
declare const stripGlenHooks: (file: HooksFile) => HooksFile;
|
|
18
|
+
declare const withGlenHooks: (file: HooksFile) => HooksFile;
|
|
19
|
+
export { GLEN_CODEX_HOOK_ENTRIES, GLEN_OWNER_PREFIX, normalizeHooksFile, stripGlenHooks, withGlenHooks, };
|
|
20
|
+
export type { HooksFile };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// The canonical glen hook lines for Codex. FROZEN: must stay identical to
|
|
2
|
+
// packages/codex-plugin/hooks/hooks.json (enforced by ingest.contract.test.ts).
|
|
3
|
+
const GLEN_CODEX_HOOK_ENTRIES = {
|
|
4
|
+
SessionStart: "glen session-start --agent codex",
|
|
5
|
+
UserPromptSubmit: "glen ingest --agent codex",
|
|
6
|
+
};
|
|
7
|
+
// Owner marker: any handler whose command starts with "glen " is ours.
|
|
8
|
+
// Our commands are bare global-CLI invocations (no absolute paths), so this
|
|
9
|
+
// prefix is stable across machines and versions.
|
|
10
|
+
const GLEN_OWNER_PREFIX = "glen ";
|
|
11
|
+
const isGlenHandler = (h) => typeof h.command === "string" &&
|
|
12
|
+
h.command.trimStart().startsWith(GLEN_OWNER_PREFIX);
|
|
13
|
+
const isMatcherGroup = (g) => typeof g === "object" &&
|
|
14
|
+
g !== null &&
|
|
15
|
+
Array.isArray(g.hooks);
|
|
16
|
+
// Accepts Codex's wrapped form {"hooks": {...}} and the legacy root-level
|
|
17
|
+
// form (events at the JSON root — older supermemory versions wrote this).
|
|
18
|
+
// Returns null for anything that doesn't look like a hooks file (caller
|
|
19
|
+
// backs the file up and starts fresh).
|
|
20
|
+
const normalizeHooksFile = (parsed) => {
|
|
21
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const obj = parsed;
|
|
25
|
+
const root = typeof obj.hooks === "object" &&
|
|
26
|
+
obj.hooks !== null &&
|
|
27
|
+
!Array.isArray(obj.hooks)
|
|
28
|
+
? obj.hooks
|
|
29
|
+
: obj;
|
|
30
|
+
const events = {};
|
|
31
|
+
for (const [event, value] of Object.entries(root)) {
|
|
32
|
+
if (!Array.isArray(value) || !value.every(isMatcherGroup))
|
|
33
|
+
return null;
|
|
34
|
+
events[event] = value;
|
|
35
|
+
}
|
|
36
|
+
return { hooks: events };
|
|
37
|
+
};
|
|
38
|
+
const stripGlenHooks = (file) => {
|
|
39
|
+
const events = {};
|
|
40
|
+
for (const [event, groups] of Object.entries(file.hooks)) {
|
|
41
|
+
const kept = groups
|
|
42
|
+
.map((g) => ({ ...g, hooks: g.hooks.filter((h) => !isGlenHandler(h)) }))
|
|
43
|
+
.filter((g) => g.hooks.length > 0);
|
|
44
|
+
if (kept.length > 0)
|
|
45
|
+
events[event] = kept;
|
|
46
|
+
}
|
|
47
|
+
return { hooks: events };
|
|
48
|
+
};
|
|
49
|
+
// Idempotent strip-and-replace: remove any glen-owned entries, then append
|
|
50
|
+
// the canonical ones. Other tools' groups are preserved verbatim.
|
|
51
|
+
const withGlenHooks = (file) => {
|
|
52
|
+
const base = stripGlenHooks(file);
|
|
53
|
+
const events = { ...base.hooks };
|
|
54
|
+
for (const [event, command] of Object.entries(GLEN_CODEX_HOOK_ENTRIES)) {
|
|
55
|
+
events[event] = [
|
|
56
|
+
...(events[event] ?? []),
|
|
57
|
+
{ hooks: [{ type: "command", command }] },
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
return { hooks: events };
|
|
61
|
+
};
|
|
62
|
+
export { GLEN_CODEX_HOOK_ENTRIES, GLEN_OWNER_PREFIX, normalizeHooksFile, stripGlenHooks, withGlenHooks, };
|
|
63
|
+
//# sourceMappingURL=codex-hooks-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-hooks-merge.js","sourceRoot":"","sources":["../../src/_utils/codex-hooks-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Result } from "./result.js";
|
|
2
|
+
declare const isCodexHooksInstalled: () => Promise<boolean>;
|
|
3
|
+
declare const installCodexHooks: () => Promise<Result<{
|
|
4
|
+
trusted: boolean;
|
|
5
|
+
backedUp: boolean;
|
|
6
|
+
}, string>>;
|
|
7
|
+
declare const uninstallCodexHooks: () => Promise<Result<void, string>>;
|
|
8
|
+
export { installCodexHooks, isCodexHooksInstalled, uninstallCodexHooks };
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { listCodexHooks } from "./codex-app-server.js";
|
|
4
|
+
import { GLEN_OWNER_PREFIX, normalizeHooksFile, stripGlenHooks, withGlenHooks, } from "./codex-hooks-merge.js";
|
|
5
|
+
import { codexConfigTomlPath, codexHooksJsonPath } from "./codex-paths.js";
|
|
6
|
+
import { removeTrustBlocks, upsertTrustBlocks } from "./codex-trust-toml.js";
|
|
7
|
+
import { err, fromPromise, ok } from "./result.js";
|
|
8
|
+
import { statePath } from "./state.js";
|
|
9
|
+
// Marker recording that THIS machine opted into glen's codex hooks (gates
|
|
10
|
+
// doctor --auto self-repair so Claude-only users never get codex config
|
|
11
|
+
// written). Lives next to state.json so GLEN_STATE_PATH overrides cover it.
|
|
12
|
+
const markerPath = () => join(dirname(statePath()), "codex-hooks-installed.json");
|
|
13
|
+
const parseJson = (raw) => {
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(raw);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
// Reads the marker, tolerating the legacy `{installedAt}` payload (no
|
|
22
|
+
// trustedKeys) — null means "not installed on this machine".
|
|
23
|
+
const readMarker = async () => {
|
|
24
|
+
const raw = await fromPromise(readFile(markerPath(), "utf-8"));
|
|
25
|
+
if (!raw.ok)
|
|
26
|
+
return null;
|
|
27
|
+
const parsed = parseJson(raw.value);
|
|
28
|
+
const trustedKeys = Array.isArray(parsed?.trustedKeys)
|
|
29
|
+
? parsed.trustedKeys.filter((k) => typeof k === "string")
|
|
30
|
+
: [];
|
|
31
|
+
return { trustedKeys };
|
|
32
|
+
};
|
|
33
|
+
const isCodexHooksInstalled = async () => (await readMarker()) !== null;
|
|
34
|
+
const atomicWrite = async (filePath, content) => {
|
|
35
|
+
const mk = await fromPromise(mkdir(dirname(filePath), { recursive: true }));
|
|
36
|
+
if (!mk.ok)
|
|
37
|
+
return mk;
|
|
38
|
+
// pid suffix: interactive install and the detached doctor repair may race.
|
|
39
|
+
const tmp = `${filePath}.${process.pid}.tmp`;
|
|
40
|
+
const w = await fromPromise(writeFile(tmp, content));
|
|
41
|
+
if (!w.ok)
|
|
42
|
+
return w;
|
|
43
|
+
return fromPromise(rename(tmp, filePath));
|
|
44
|
+
};
|
|
45
|
+
// Reads + normalizes the existing hooks.json. `absent` distinguishes a
|
|
46
|
+
// missing file from an empty one. Unparseable → backed up during install
|
|
47
|
+
// (never clobber another tool's data silently) and treated as empty;
|
|
48
|
+
// uninstall passes backupOnUnparseable=false and skips the rewrite instead.
|
|
49
|
+
const readExistingHooks = async (backupOnUnparseable) => {
|
|
50
|
+
const hooksPath = codexHooksJsonPath();
|
|
51
|
+
const raw = await fromPromise(readFile(hooksPath, "utf-8"));
|
|
52
|
+
if (!raw.ok)
|
|
53
|
+
return ok({ file: { hooks: {} }, backedUp: false, absent: true });
|
|
54
|
+
const normalized = normalizeHooksFile(parseJson(raw.value));
|
|
55
|
+
if (normalized)
|
|
56
|
+
return ok({ file: normalized, backedUp: false, absent: false });
|
|
57
|
+
if (!backupOnUnparseable)
|
|
58
|
+
return ok({ file: { hooks: {} }, backedUp: true, absent: false });
|
|
59
|
+
const bak = `${hooksPath}.bak.${Date.now()}`;
|
|
60
|
+
const b = await fromPromise(writeFile(bak, raw.value));
|
|
61
|
+
if (!b.ok)
|
|
62
|
+
return err(`could not back up unparseable ${hooksPath}`);
|
|
63
|
+
return ok({ file: { hooks: {} }, backedUp: true, absent: false });
|
|
64
|
+
};
|
|
65
|
+
const glenEntriesFrom = (entries) => entries
|
|
66
|
+
.filter((e) => e.source === "user" &&
|
|
67
|
+
e.command.trimStart().startsWith(GLEN_OWNER_PREFIX))
|
|
68
|
+
.map((e) => ({ key: e.key, hash: e.currentHash }));
|
|
69
|
+
// Write trust blocks for glen's user-layer hooks. Returns the keys written
|
|
70
|
+
// (empty array = trust step failed; install still counts, manual fallback).
|
|
71
|
+
const trustGlenHooks = async () => {
|
|
72
|
+
const listed = await listCodexHooks(process.cwd());
|
|
73
|
+
if (!listed.ok)
|
|
74
|
+
return [];
|
|
75
|
+
const entries = glenEntriesFrom(listed.value);
|
|
76
|
+
if (entries.length === 0)
|
|
77
|
+
return [];
|
|
78
|
+
const tomlPath = codexConfigTomlPath();
|
|
79
|
+
const existing = await fromPromise(readFile(tomlPath, "utf-8"));
|
|
80
|
+
const updated = upsertTrustBlocks(existing.ok ? existing.value : "", entries);
|
|
81
|
+
const w = await atomicWrite(tomlPath, updated);
|
|
82
|
+
return w.ok ? entries.map((e) => e.key) : [];
|
|
83
|
+
};
|
|
84
|
+
const installCodexHooks = async () => {
|
|
85
|
+
const existing = await readExistingHooks(true);
|
|
86
|
+
if (!existing.ok)
|
|
87
|
+
return existing;
|
|
88
|
+
const merged = withGlenHooks(existing.value.file);
|
|
89
|
+
const w = await atomicWrite(codexHooksJsonPath(), `${JSON.stringify(merged, null, 2)}\n`);
|
|
90
|
+
if (!w.ok)
|
|
91
|
+
return err(`could not write ${codexHooksJsonPath()}`);
|
|
92
|
+
const trustedKeys = await trustGlenHooks();
|
|
93
|
+
// The marker gates doctor self-heal AND records the trusted keys for
|
|
94
|
+
// uninstall — a silent failure here would strand the trust blocks.
|
|
95
|
+
const m = await atomicWrite(markerPath(), `${JSON.stringify({ installedAt: new Date().toISOString(), trustedKeys }, null, 2)}\n`);
|
|
96
|
+
if (!m.ok)
|
|
97
|
+
return err(`could not write install marker ${markerPath()}`);
|
|
98
|
+
return ok({
|
|
99
|
+
trusted: trustedKeys.length > 0,
|
|
100
|
+
backedUp: existing.value.backedUp,
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
// Removes glen's trust blocks from config.toml (no-op when the file is
|
|
104
|
+
// unreadable or there is nothing to remove).
|
|
105
|
+
const removeGlenTrustBlocks = async (keys) => {
|
|
106
|
+
if (keys.length === 0)
|
|
107
|
+
return ok(undefined);
|
|
108
|
+
const tomlPath = codexConfigTomlPath();
|
|
109
|
+
const raw = await fromPromise(readFile(tomlPath, "utf-8"));
|
|
110
|
+
if (!raw.ok)
|
|
111
|
+
return ok(undefined);
|
|
112
|
+
const updated = removeTrustBlocks(raw.value, keys);
|
|
113
|
+
const w = await atomicWrite(tomlPath, updated);
|
|
114
|
+
return w.ok ? ok(undefined) : err(`could not write ${tomlPath}`);
|
|
115
|
+
};
|
|
116
|
+
const uninstallCodexHooks = async () => {
|
|
117
|
+
const marker = await readMarker();
|
|
118
|
+
const existing = await readExistingHooks(false);
|
|
119
|
+
if (!existing.ok)
|
|
120
|
+
return existing;
|
|
121
|
+
// Clean machine (no hooks.json): never touch ~/.codex or spawn the
|
|
122
|
+
// app-server — only remove marker-recorded trust blocks if any.
|
|
123
|
+
if (existing.value.absent) {
|
|
124
|
+
const t = await removeGlenTrustBlocks(marker?.trustedKeys ?? []);
|
|
125
|
+
if (!t.ok)
|
|
126
|
+
return t;
|
|
127
|
+
await fromPromise(unlink(markerPath()));
|
|
128
|
+
return ok(undefined);
|
|
129
|
+
}
|
|
130
|
+
// Query keys BEFORE stripping — after the strip the entries are gone.
|
|
131
|
+
// Union with the marker's keys so cleanup works without codex on PATH.
|
|
132
|
+
const listed = await listCodexHooks(process.cwd());
|
|
133
|
+
const liveKeys = listed.ok
|
|
134
|
+
? glenEntriesFrom(listed.value).map((e) => e.key)
|
|
135
|
+
: [];
|
|
136
|
+
const keys = [...new Set([...(marker?.trustedKeys ?? []), ...liveKeys])];
|
|
137
|
+
// Unparseable hooks.json (backedUp under backupOnUnparseable=false means
|
|
138
|
+
// "skip") → leave it alone; still clean up trust blocks + marker.
|
|
139
|
+
if (!existing.value.backedUp) {
|
|
140
|
+
const stripped = stripGlenHooks(existing.value.file);
|
|
141
|
+
const w = await atomicWrite(codexHooksJsonPath(), `${JSON.stringify(stripped, null, 2)}\n`);
|
|
142
|
+
if (!w.ok)
|
|
143
|
+
return err(`could not write ${codexHooksJsonPath()}`);
|
|
144
|
+
}
|
|
145
|
+
const t = await removeGlenTrustBlocks(keys);
|
|
146
|
+
if (!t.ok)
|
|
147
|
+
return t;
|
|
148
|
+
await fromPromise(unlink(markerPath()));
|
|
149
|
+
return ok(undefined);
|
|
150
|
+
};
|
|
151
|
+
export { installCodexHooks, isCodexHooksInstalled, uninstallCodexHooks };
|
|
152
|
+
//# sourceMappingURL=codex-hooks-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-hooks-setup.js","sourceRoot":"","sources":["../../src/_utils/codex-hooks-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
// CODEX_HOME is Codex's own override for its config dir — honoring it means
|
|
4
|
+
// tests AND the CI smoke sandbox the same way Codex does. An empty string is
|
|
5
|
+
// treated as unset (|| not ??) so it can't yield relative paths.
|
|
6
|
+
const codexHome = () => process.env.CODEX_HOME || join(homedir(), ".codex");
|
|
7
|
+
const codexHooksJsonPath = () => join(codexHome(), "hooks.json");
|
|
8
|
+
const codexConfigTomlPath = () => join(codexHome(), "config.toml");
|
|
9
|
+
export { codexHome, codexHooksJsonPath, codexConfigTomlPath };
|
|
10
|
+
//# sourceMappingURL=codex-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-paths.js","sourceRoot":"","sources":["../../src/_utils/codex-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,4EAA4E;AAC5E,6EAA6E;AAC7E,iEAAiE;AACjE,MAAM,SAAS,GAAG,GAAW,EAAE,CAC7B,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAEtD,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,CAAC,CAAC;AAEzE,MAAM,mBAAmB,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAE3E,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type RepairTrace = {
|
|
2
|
+
readonly at: string;
|
|
3
|
+
readonly ok: boolean;
|
|
4
|
+
readonly error?: string;
|
|
5
|
+
};
|
|
6
|
+
declare const writeRepairTrace: (outcome: {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
error?: string;
|
|
9
|
+
}) => Promise<void>;
|
|
10
|
+
declare const readRepairTrace: () => Promise<RepairTrace | null>;
|
|
11
|
+
export { readRepairTrace, writeRepairTrace };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Best-effort trace of the last detached codex-hooks repair, surfaced by
|
|
2
|
+
// `glen doctor` (the repair child runs with stdio ignored — this file is
|
|
3
|
+
// its only observable output). Lives next to state.json.
|
|
4
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
|
+
import { fromPromise } from "./result.js";
|
|
7
|
+
import { statePath } from "./state.js";
|
|
8
|
+
const tracePath = () => join(dirname(statePath()), "codex-repair.json");
|
|
9
|
+
const writeRepairTrace = async (outcome) => {
|
|
10
|
+
const trace = {
|
|
11
|
+
at: new Date().toISOString(),
|
|
12
|
+
ok: outcome.ok,
|
|
13
|
+
...(outcome.error ? { error: outcome.error } : {}),
|
|
14
|
+
};
|
|
15
|
+
const mk = await fromPromise(mkdir(dirname(tracePath()), { recursive: true }));
|
|
16
|
+
if (!mk.ok)
|
|
17
|
+
return;
|
|
18
|
+
await fromPromise(writeFile(tracePath(), `${JSON.stringify(trace, null, 2)}\n`));
|
|
19
|
+
};
|
|
20
|
+
const readRepairTrace = async () => {
|
|
21
|
+
const raw = await fromPromise(readFile(tracePath(), "utf-8"));
|
|
22
|
+
if (!raw.ok)
|
|
23
|
+
return null;
|
|
24
|
+
const parsed = (() => {
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(raw.value);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
})();
|
|
32
|
+
const t = parsed;
|
|
33
|
+
if (!t || typeof t.at !== "string" || typeof t.ok !== "boolean")
|
|
34
|
+
return null;
|
|
35
|
+
return {
|
|
36
|
+
at: t.at,
|
|
37
|
+
ok: t.ok,
|
|
38
|
+
...(typeof t.error === "string" ? { error: t.error } : {}),
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
export { readRepairTrace, writeRepairTrace };
|
|
42
|
+
//# sourceMappingURL=codex-repair-trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-repair-trace.js","sourceRoot":"","sources":["../../src/_utils/codex-repair-trace.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,yEAAyE;AACzE,yDAAyD;AACzD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQvC,MAAM,SAAS,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAEhF,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAG/B,EAAiB,EAAE;IAClB,MAAM,KAAK,GAAgB;QACzB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,WAAW,CAC1B,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CACjD,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO;IACnB,MAAM,WAAW,CACf,SAAS,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAC9D,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,IAAiC,EAAE;IAC9D,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,MAAM,GAAG,CAAC,GAAY,EAAE;QAC5B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAY,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,MAAM,CAAC,GAAG,MAAwC,CAAC;IACnD,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type TrustEntry = {
|
|
2
|
+
readonly key: string;
|
|
3
|
+
readonly hash: string;
|
|
4
|
+
};
|
|
5
|
+
declare const removeTrustBlocks: (toml: string, keys: readonly string[]) => string;
|
|
6
|
+
declare const upsertTrustBlocks: (toml: string, entries: readonly TrustEntry[]) => string;
|
|
7
|
+
export { removeTrustBlocks, upsertTrustBlocks };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Surgical, line-based editing of Codex's user config.toml [hooks.state]
|
|
2
|
+
// trust blocks. We deliberately do NOT parse/re-stringify the whole file —
|
|
3
|
+
// that would destroy the user's comments and formatting. A block is the
|
|
4
|
+
// exact header line `[hooks.state."<key>"]` plus every line until the next
|
|
5
|
+
// `[` table header. Keys come verbatim from `codex app-server` hooks/list.
|
|
6
|
+
const escapeKey = (key) => key.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
7
|
+
const headerFor = (key) => `[hooks.state."${escapeKey(key)}"]`;
|
|
8
|
+
// Matches [hooks.state."<key>"] with optional whitespace, single- or
|
|
9
|
+
// double-quoted key, and an optional trailing comment. Codex itself writes
|
|
10
|
+
// the canonical tight form; the tolerance is cheap insurance against
|
|
11
|
+
// alternate-but-valid spellings.
|
|
12
|
+
const HEADER_RE = /^\s*\[\s*hooks\.state\s*\.\s*(?:"((?:[^"\\]|\\.)*)"|'([^']*)')\s*\]\s*(?:#.*)?$/;
|
|
13
|
+
const unescapeKey = (raw) => raw.replace(/\\"/g, '"').replace(/\\\\/g, "\\");
|
|
14
|
+
const headerKeyOf = (line) => {
|
|
15
|
+
const m = HEADER_RE.exec(line);
|
|
16
|
+
if (!m)
|
|
17
|
+
return null;
|
|
18
|
+
return m[1] !== undefined ? unescapeKey(m[1]) : (m[2] ?? null);
|
|
19
|
+
};
|
|
20
|
+
const isTableHeader = (line) => line.trimStart().startsWith("[");
|
|
21
|
+
const removeTrustBlocks = (toml, keys) => {
|
|
22
|
+
const keySet = new Set(keys);
|
|
23
|
+
const result = toml.split("\n").reduce((acc, line) => {
|
|
24
|
+
const headerKey = headerKeyOf(line);
|
|
25
|
+
const startsBlock = headerKey !== null && keySet.has(headerKey);
|
|
26
|
+
const skipping = startsBlock || (acc.skipping && !isTableHeader(line));
|
|
27
|
+
if (!skipping)
|
|
28
|
+
acc.out.push(line);
|
|
29
|
+
return { out: acc.out, skipping };
|
|
30
|
+
}, { out: [], skipping: false });
|
|
31
|
+
return result.out.join("\n");
|
|
32
|
+
};
|
|
33
|
+
const upsertTrustBlocks = (toml, entries) => {
|
|
34
|
+
const cleaned = removeTrustBlocks(toml, entries.map((e) => e.key));
|
|
35
|
+
const blocks = entries
|
|
36
|
+
.map((e) => `${headerFor(e.key)}\ntrusted_hash = "${e.hash}"\n`)
|
|
37
|
+
.join("\n");
|
|
38
|
+
const base = cleaned.trimEnd();
|
|
39
|
+
return base.length === 0 ? blocks : `${base}\n\n${blocks}`;
|
|
40
|
+
};
|
|
41
|
+
export { removeTrustBlocks, upsertTrustBlocks };
|
|
42
|
+
//# sourceMappingURL=codex-trust-toml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-trust-toml.js","sourceRoot":"","sources":["../../src/_utils/codex-trust-toml.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.js
CHANGED
|
@@ -81,9 +81,26 @@ cli
|
|
|
81
81
|
});
|
|
82
82
|
cli
|
|
83
83
|
.command("install", "Detect coding agents and install glen plugins")
|
|
84
|
-
.
|
|
84
|
+
.option("--agent <agent>", "Install for one agent non-interactively: claude (alias: claude-code) | codex")
|
|
85
|
+
.action(async (options) => {
|
|
86
|
+
// cac yields `true` for a bare `--agent` with no value — reject it before
|
|
87
|
+
// it reaches install (which expects a string agent name or undefined).
|
|
88
|
+
if (options.agent === true) {
|
|
89
|
+
process.stderr.write("glen install: --agent requires a value (claude | codex)\n");
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
const agent = typeof options.agent === "string" ? options.agent : undefined;
|
|
85
93
|
const { install } = await import("./commands/install.js");
|
|
86
|
-
const result = await install();
|
|
94
|
+
const result = await install(agent);
|
|
95
|
+
if (!result.ok)
|
|
96
|
+
process.exit(1);
|
|
97
|
+
});
|
|
98
|
+
cli
|
|
99
|
+
.command("uninstall", "Remove glen hooks from Codex's user config and print plugin removal steps")
|
|
100
|
+
.action(async () => {
|
|
101
|
+
const { uninstall } = await import("./commands/uninstall.js");
|
|
102
|
+
const result = await uninstall();
|
|
103
|
+
// uninstall() already printed the error inline — just exit nonzero.
|
|
87
104
|
if (!result.ok)
|
|
88
105
|
process.exit(1);
|
|
89
106
|
});
|
|
@@ -149,6 +166,15 @@ cli.command("__self-update", "(internal)").action(async () => {
|
|
|
149
166
|
const { runSelfUpdate } = await import("./_utils/update.js");
|
|
150
167
|
runSelfUpdate();
|
|
151
168
|
});
|
|
169
|
+
// Internal: spawned detached by `glen doctor --auto` to re-merge + re-trust
|
|
170
|
+
// the codex user-layer hooks without blocking the calling turn.
|
|
171
|
+
cli.command("__codex-hooks-repair", "(internal)").action(async () => {
|
|
172
|
+
const { installCodexHooks } = await import("./_utils/codex-hooks-setup.js");
|
|
173
|
+
const { writeRepairTrace } = await import("./_utils/codex-repair-trace.js");
|
|
174
|
+
const r = await installCodexHooks();
|
|
175
|
+
await writeRepairTrace(r.ok ? { ok: true } : { ok: false, error: r.error });
|
|
176
|
+
process.exit(0);
|
|
177
|
+
});
|
|
152
178
|
// Unknown commands must fail loudly — cac's default is a silent exit 0, which
|
|
153
179
|
// reads as success (e.g. the removed `glen private` would silently no-op).
|
|
154
180
|
cli.on("command:*", () => {
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,10 @@ import { type Result } from "../_utils/result.js";
|
|
|
5
5
|
* Default mode: prints version info, latest, install channel, session state
|
|
6
6
|
* summary, and plugin staleness hints.
|
|
7
7
|
*
|
|
8
|
-
* `--auto` (quiet) mode: runs maybeSpawnBackgroundUpdate
|
|
9
|
-
* detached spawns for plugin update commands
|
|
10
|
-
*
|
|
8
|
+
* `--auto` (quiet) mode: runs maybeSpawnBackgroundUpdate, best-effort
|
|
9
|
+
* detached spawns for plugin update commands, and (marker-gated, 24h-TTL'd
|
|
10
|
+
* via the repair trace) the detached codex user-layer hooks self-heal.
|
|
11
|
+
* No stdout output. Used by the session-start hook so it never blocks a turn.
|
|
11
12
|
*/
|
|
12
13
|
declare const doctor: (auto?: boolean) => Promise<Result<void, string>>;
|
|
13
14
|
export { doctor };
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { isCodexHooksInstalled } from "../_utils/codex-hooks-setup.js";
|
|
3
|
+
import { readRepairTrace } from "../_utils/codex-repair-trace.js";
|
|
2
4
|
import { ok } from "../_utils/result.js";
|
|
3
5
|
import { readState } from "../_utils/state.js";
|
|
4
6
|
import { fetchLatest, isNpmGlobalInstall, maybeSpawnBackgroundUpdate, } from "../_utils/update.js";
|
|
@@ -10,9 +12,10 @@ import { isInstalled } from "../_utils/which.js";
|
|
|
10
12
|
* Default mode: prints version info, latest, install channel, session state
|
|
11
13
|
* summary, and plugin staleness hints.
|
|
12
14
|
*
|
|
13
|
-
* `--auto` (quiet) mode: runs maybeSpawnBackgroundUpdate
|
|
14
|
-
* detached spawns for plugin update commands
|
|
15
|
-
*
|
|
15
|
+
* `--auto` (quiet) mode: runs maybeSpawnBackgroundUpdate, best-effort
|
|
16
|
+
* detached spawns for plugin update commands, and (marker-gated, 24h-TTL'd
|
|
17
|
+
* via the repair trace) the detached codex user-layer hooks self-heal.
|
|
18
|
+
* No stdout output. Used by the session-start hook so it never blocks a turn.
|
|
16
19
|
*/
|
|
17
20
|
const doctor = async (auto = false) => {
|
|
18
21
|
if (auto) {
|
|
@@ -25,6 +28,9 @@ const doctor = async (auto = false) => {
|
|
|
25
28
|
detached: true,
|
|
26
29
|
stdio: "ignore",
|
|
27
30
|
});
|
|
31
|
+
c.on("error", () => {
|
|
32
|
+
/* best-effort — ENOENT etc. arrives async; never crash the hook */
|
|
33
|
+
});
|
|
28
34
|
c.unref();
|
|
29
35
|
}
|
|
30
36
|
catch {
|
|
@@ -38,12 +44,38 @@ const doctor = async (auto = false) => {
|
|
|
38
44
|
detached: true,
|
|
39
45
|
stdio: "ignore",
|
|
40
46
|
});
|
|
47
|
+
c.on("error", () => {
|
|
48
|
+
/* best-effort — ENOENT etc. arrives async; never crash the hook */
|
|
49
|
+
});
|
|
41
50
|
c.unref();
|
|
42
51
|
}
|
|
43
52
|
catch {
|
|
44
53
|
/* best-effort */
|
|
45
54
|
}
|
|
46
55
|
}
|
|
56
|
+
// Self-heal codex user-layer hooks (re-merge + re-trust) — only when the
|
|
57
|
+
// install marker says glen registered them before, so Claude-only users
|
|
58
|
+
// never get codex config written. TTL'd: skipped while the last
|
|
59
|
+
// SUCCESSFUL repair trace is younger than 24h.
|
|
60
|
+
if (isInstalled("codex") && (await isCodexHooksInstalled())) {
|
|
61
|
+
const trace = await readRepairTrace();
|
|
62
|
+
const fresh = trace?.ok === true &&
|
|
63
|
+
Date.now() - Date.parse(trace.at) < 24 * 60 * 60 * 1000;
|
|
64
|
+
if (!fresh) {
|
|
65
|
+
try {
|
|
66
|
+
// Spawn the CLI itself via process.execPath (same pattern as
|
|
67
|
+
// _utils/update.ts) — a bare "glen" fails off-PATH and on Windows.
|
|
68
|
+
const c = spawn(process.execPath, [process.argv[1] ?? "glen", "__codex-hooks-repair"], { detached: true, stdio: "ignore" });
|
|
69
|
+
c.on("error", () => {
|
|
70
|
+
/* best-effort */
|
|
71
|
+
});
|
|
72
|
+
c.unref();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
/* best-effort */
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
47
79
|
return ok(undefined);
|
|
48
80
|
}
|
|
49
81
|
// Normal diagnostic mode
|
|
@@ -80,7 +112,18 @@ const doctor = async (auto = false) => {
|
|
|
80
112
|
process.stdout.write(" claude: detected — run `claude plugin update glen@glen` to update\n");
|
|
81
113
|
}
|
|
82
114
|
if (codexInstalled) {
|
|
83
|
-
|
|
115
|
+
const hooksInstalled = await isCodexHooksInstalled();
|
|
116
|
+
process.stdout.write(hooksInstalled
|
|
117
|
+
? " codex: detected — user-layer hooks registered (re-run `glen install` to repair)\n"
|
|
118
|
+
: " codex: detected — hooks NOT registered; run `glen install`\n" +
|
|
119
|
+
" (Codex ignores plugin-manifest hooks — openai/codex#16430)\n");
|
|
120
|
+
if (hooksInstalled) {
|
|
121
|
+
const trace = await readRepairTrace();
|
|
122
|
+
if (trace && !trace.ok) {
|
|
123
|
+
process.stdout.write(` last self-heal FAILED (${trace.error ?? "unknown"}) — run \`glen install\` to repair\n`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
process.stdout.write(" update plugin: `codex plugin marketplace upgrade glen`\n");
|
|
84
127
|
}
|
|
85
128
|
if (!claudeInstalled && !codexInstalled) {
|
|
86
129
|
process.stdout.write(" No coding agents detected. Run `glen install` after installing Claude Code or Codex.\n");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAe,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/ingest.js
CHANGED
|
@@ -38,9 +38,31 @@ const ingest = async (agent) => {
|
|
|
38
38
|
})();
|
|
39
39
|
if (!event?.prompt || !event?.session_id)
|
|
40
40
|
return ok(undefined);
|
|
41
|
+
// Normalise the agent name — only known values are forwarded.
|
|
42
|
+
const agentName = agent === "claude-code" || agent === "codex" ? agent : undefined;
|
|
43
|
+
// Claude Code injects raw hook stdout as context; Codex parses stdout as
|
|
44
|
+
// JSON and requires the hookSpecificOutput envelope (plain text → the hook
|
|
45
|
+
// is marked Failed and the context is dropped — verified live on 0.137.0).
|
|
46
|
+
const emit = (text) => {
|
|
47
|
+
process.stdout.write(agentName === "codex"
|
|
48
|
+
? JSON.stringify({
|
|
49
|
+
hookSpecificOutput: {
|
|
50
|
+
hookEventName: "UserPromptSubmit",
|
|
51
|
+
additionalContext: text,
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
: text);
|
|
55
|
+
};
|
|
41
56
|
const creds = await readCredentials();
|
|
42
|
-
if (!creds)
|
|
57
|
+
if (!creds) {
|
|
58
|
+
if (agentName === "codex") {
|
|
59
|
+
// Codex drops hook output entirely on a non-zero exit — emit the hint
|
|
60
|
+
// as the JSON envelope and exit 0 so the user actually sees it.
|
|
61
|
+
emit("[glen] not connected — run `glen login`");
|
|
62
|
+
return ok(undefined);
|
|
63
|
+
}
|
|
43
64
|
return err({ code: 1, message: "not connected" });
|
|
65
|
+
}
|
|
44
66
|
const state = await readState();
|
|
45
67
|
const transcriptPath = typeof event.transcript_path === "string"
|
|
46
68
|
? event.transcript_path
|
|
@@ -48,8 +70,6 @@ const ingest = async (agent) => {
|
|
|
48
70
|
const transcriptLines = transcriptPath
|
|
49
71
|
? await readTranscriptLines(transcriptPath)
|
|
50
72
|
: [];
|
|
51
|
-
// Normalise the agent name — only known values are forwarded.
|
|
52
|
-
const agentName = agent === "claude-code" || agent === "codex" ? agent : undefined;
|
|
53
73
|
// Resolve the cwd from the event (hook provides it) or fall back.
|
|
54
74
|
const eventCwd = typeof event.cwd === "string" ? event.cwd : process.cwd();
|
|
55
75
|
// Adapt the event based on agent type.
|
|
@@ -116,7 +136,7 @@ const ingest = async (agent) => {
|
|
|
116
136
|
const memory = formatMemory(res.value.json);
|
|
117
137
|
const out = [stateLine, memory].filter(Boolean).join("\n\n");
|
|
118
138
|
if (out)
|
|
119
|
-
|
|
139
|
+
emit(out);
|
|
120
140
|
return ok(undefined);
|
|
121
141
|
};
|
|
122
142
|
export { ingest };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAe,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,SAAS,GAAG,KAAK,IAAqB,EAAE;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,KAAK,EAC/B,IAAY,EACgB,EAAE;IAC9B,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,KAAK,EAAE,KAAc,EAAsC,EAAE;IAC1E,KAAK,0BAA0B,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,SAAS,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA4B,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,UAAU;QAAE,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IAE/D,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/install.js
CHANGED
|
@@ -3,6 +3,7 @@ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
5
5
|
import prompts from "prompts";
|
|
6
|
+
import { installCodexHooks } from "../_utils/codex-hooks-setup.js";
|
|
6
7
|
import { readCredentials } from "../_utils/credentials.js";
|
|
7
8
|
import { ensureGlobalCli } from "../_utils/ensure-global-cli.js";
|
|
8
9
|
import { err, fromPromise, ok } from "../_utils/result.js";
|
|
@@ -97,17 +98,43 @@ const handleClaudeStatusline = async () => {
|
|
|
97
98
|
process.stdout.write(" ✓ statusline configured\n");
|
|
98
99
|
};
|
|
99
100
|
// ---------------------------------------------------------------------------
|
|
100
|
-
// Post-install actions per agent
|
|
101
|
+
// Post-install actions per agent. Returns true when the post-install fully
|
|
102
|
+
// succeeded (codex: hooks registered AND trusted; claude: always true).
|
|
101
103
|
// ---------------------------------------------------------------------------
|
|
102
|
-
const handlePostInstall = async (agent) => {
|
|
104
|
+
const handlePostInstall = async (agent, agentBin) => {
|
|
103
105
|
if (agent.postInstall === "codex") {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
// Codex never fires plugin-manifest hooks (openai/codex#16430), so
|
|
107
|
+
// register glen's hook lines in the user layer (~/.codex/hooks.json)
|
|
108
|
+
// and auto-trust them ([hooks.state] in ~/.codex/config.toml) —
|
|
109
|
+
// running `glen install` is the consent moment.
|
|
110
|
+
process.stdout.write("\n Registering glen hooks in Codex's user config layer\n" +
|
|
111
|
+
" (workaround for openai/codex#16430 — plugin hooks don't fire):\n");
|
|
112
|
+
const r = await installCodexHooks();
|
|
113
|
+
if (!r.ok) {
|
|
114
|
+
process.stdout.write(` ✗ ${r.error}\n Manual fallback: see https://tryglen.com/docs/plugins\n`);
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
process.stdout.write(` ✓ hooks registered in ~/.codex/hooks.json${r.value.backedUp ? " (previous unparseable file backed up)" : ""}\n`);
|
|
118
|
+
if (r.value.trusted) {
|
|
119
|
+
process.stdout.write(" ✓ hooks auto-trusted\n");
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
process.stdout.write(" ⚠ Could not auto-trust: open Codex, run /hooks, and trust the glen hooks\n" +
|
|
123
|
+
" (Codex skips untrusted hooks silently — glen won't work until you do).\n");
|
|
124
|
+
return false;
|
|
106
125
|
}
|
|
107
|
-
|
|
108
|
-
|
|
126
|
+
if (agent.postInstall === "claude") {
|
|
127
|
+
if (agentBin === undefined) {
|
|
128
|
+
await handleClaudeStatusline();
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Scripted mode (--agent) must be truly non-interactive — never open
|
|
132
|
+
// the statusline confirm prompt; print the opt-in instructions instead.
|
|
133
|
+
process.stdout.write(` ℹ statusline: opt in by adding "statusLine": { "type": "command", "command": "glen statusline" } to ~/.claude/settings.json\n`);
|
|
134
|
+
}
|
|
109
135
|
process.stdout.write("\n Tip: enable auto-update for the glen marketplace in /plugin → Marketplaces.\n");
|
|
110
136
|
}
|
|
137
|
+
return true;
|
|
111
138
|
};
|
|
112
139
|
// ---------------------------------------------------------------------------
|
|
113
140
|
// Connect prompt — both install paths end here so a fresh user always gets
|
|
@@ -137,6 +164,18 @@ const promptConnect = async () => {
|
|
|
137
164
|
process.stdout.write(" Run `glen login` to try again.\n\n");
|
|
138
165
|
}
|
|
139
166
|
};
|
|
167
|
+
// In scripted mode (--agent) never open an interactive prompt — print the
|
|
168
|
+
// login hint instead. promptConnect itself already handles the non-TTY case.
|
|
169
|
+
const connectOrHint = async (agentBin) => {
|
|
170
|
+
if (agentBin === undefined) {
|
|
171
|
+
await promptConnect();
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const creds = await readCredentials();
|
|
175
|
+
if (!creds) {
|
|
176
|
+
process.stdout.write(" Run `glen login` to connect your account.\n\n");
|
|
177
|
+
}
|
|
178
|
+
};
|
|
140
179
|
// ---------------------------------------------------------------------------
|
|
141
180
|
// Global binary — npx runs this CLI from a cache without linking `glen` onto
|
|
142
181
|
// PATH, but the plugins' hooks shell out to `glen`. Ensure one exists before
|
|
@@ -180,14 +219,14 @@ const ensureCliBinary = () => {
|
|
|
180
219
|
// ---------------------------------------------------------------------------
|
|
181
220
|
// Main install command
|
|
182
221
|
// ---------------------------------------------------------------------------
|
|
183
|
-
const install = async () => {
|
|
222
|
+
const install = async (agentBin) => {
|
|
184
223
|
process.stdout.write("\n 🏔️ glen — install agent plugins\n\n");
|
|
185
224
|
ensureCliBinary();
|
|
186
225
|
const detected = AGENTS.filter((a) => isInstalled(a.bin));
|
|
187
226
|
if (detected.length === 0) {
|
|
188
227
|
process.stdout.write(" ⚠ Could not find Claude Code or Codex installed.\n");
|
|
189
228
|
process.stdout.write(" See https://tryglen.com/docs/plugins for manual install instructions.\n\n");
|
|
190
|
-
await
|
|
229
|
+
await connectOrHint(agentBin);
|
|
191
230
|
return err("no agents detected");
|
|
192
231
|
}
|
|
193
232
|
process.stdout.write(" Detected coding agents:\n");
|
|
@@ -195,24 +234,38 @@ const install = async () => {
|
|
|
195
234
|
process.stdout.write(` ✓ ${a.name} (${a.bin})\n`);
|
|
196
235
|
}
|
|
197
236
|
process.stdout.write("\n");
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
237
|
+
// "claude-code" is the hook-line vocabulary (--agent claude-code) — accept
|
|
238
|
+
// it as an alias for the claude bin.
|
|
239
|
+
const normalized = agentBin === "claude-code" ? "claude" : agentBin;
|
|
240
|
+
const selected = await (async () => {
|
|
241
|
+
if (normalized !== undefined) {
|
|
242
|
+
return detected.filter((a) => a.bin === normalized);
|
|
243
|
+
}
|
|
244
|
+
const choices = detected.map((a) => ({
|
|
245
|
+
title: `${a.name} plugin`,
|
|
246
|
+
value: a,
|
|
247
|
+
selected: true,
|
|
248
|
+
}));
|
|
249
|
+
const response = await prompts({
|
|
250
|
+
type: "multiselect",
|
|
251
|
+
name: "plugins",
|
|
252
|
+
message: "Select plugins to install",
|
|
253
|
+
choices,
|
|
254
|
+
instructions: false,
|
|
255
|
+
});
|
|
256
|
+
return (response.plugins ?? []);
|
|
257
|
+
})();
|
|
258
|
+
if (agentBin !== undefined && selected.length === 0) {
|
|
259
|
+
process.stdout.write(` ⚠ "${agentBin}" is not an installed agent (expected: claude | codex).\n`);
|
|
260
|
+
await connectOrHint(agentBin);
|
|
261
|
+
return err(`agent not detected: ${agentBin}`);
|
|
262
|
+
}
|
|
211
263
|
if (selected.length === 0) {
|
|
212
264
|
process.stdout.write(" No plugins selected.\n");
|
|
213
|
-
await
|
|
265
|
+
await connectOrHint(agentBin);
|
|
214
266
|
return ok(undefined);
|
|
215
267
|
}
|
|
268
|
+
const results = [];
|
|
216
269
|
for (const agent of selected) {
|
|
217
270
|
process.stdout.write(`\n Installing ${agent.name} plugin:\n`);
|
|
218
271
|
for (const step of agent.steps) {
|
|
@@ -229,10 +282,12 @@ const install = async () => {
|
|
|
229
282
|
})();
|
|
230
283
|
process.stdout.write(stepOk ? "✓\n" : "✗ (failed — continuing)\n");
|
|
231
284
|
}
|
|
232
|
-
await handlePostInstall(agent);
|
|
285
|
+
results.push(await handlePostInstall(agent, agentBin));
|
|
233
286
|
}
|
|
234
|
-
process.stdout.write(
|
|
235
|
-
|
|
287
|
+
process.stdout.write(results.every(Boolean)
|
|
288
|
+
? "\n Done! Start a conversation in either agent — glen memory is active.\n"
|
|
289
|
+
: "\n Done, with warnings above — fix them before relying on glen memory.\n");
|
|
290
|
+
await connectOrHint(agentBin);
|
|
236
291
|
return ok(undefined);
|
|
237
292
|
};
|
|
238
293
|
export { install };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* and we can make use of it later without updating hook configs.
|
|
7
7
|
*
|
|
8
8
|
* Behavior:
|
|
9
|
-
* 1.
|
|
9
|
+
* 1. Spawn a detached `glen doctor --auto` (background maintenance; never blocks).
|
|
10
10
|
* 2. Read stdin (SessionStart event JSON, parsed defensively — tolerate garbage).
|
|
11
11
|
* 3. Read local session state.
|
|
12
12
|
* 4. Write ONE JSON object to stdout:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
1
2
|
import { formatStateLine } from "../_utils/state-line.js";
|
|
2
3
|
import { readState } from "../_utils/state.js";
|
|
3
|
-
import { maybeSpawnBackgroundUpdate } from "../_utils/update.js";
|
|
4
4
|
// Reads stdin defensively (SessionStart hook event — parse lenient; may be empty
|
|
5
5
|
// or invalid and we must still work).
|
|
6
6
|
const readStdin = async () => {
|
|
@@ -9,6 +9,21 @@ const readStdin = async () => {
|
|
|
9
9
|
chunks.push(chunk);
|
|
10
10
|
return Buffer.concat(chunks).toString("utf8");
|
|
11
11
|
};
|
|
12
|
+
// Detached `glen doctor --auto` — one child for the whole maintenance pass
|
|
13
|
+
// (self-update TTL check, plugin upgrades, codex hooks self-heal). Spawned via
|
|
14
|
+
// process.execPath so it works off-PATH (same pattern as _utils/update.ts).
|
|
15
|
+
const spawnDoctorAuto = () => {
|
|
16
|
+
try {
|
|
17
|
+
const c = spawn(process.execPath, [process.argv[1] ?? "glen", "doctor", "--auto"], { detached: true, stdio: "ignore" });
|
|
18
|
+
c.on("error", () => {
|
|
19
|
+
/* best-effort */
|
|
20
|
+
});
|
|
21
|
+
c.unref();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
/* best-effort — maintenance must never block a session */
|
|
25
|
+
}
|
|
26
|
+
};
|
|
12
27
|
/**
|
|
13
28
|
* `glen session-start [--agent <agent>]` — called by the agent's SessionStart hook.
|
|
14
29
|
*
|
|
@@ -17,7 +32,7 @@ const readStdin = async () => {
|
|
|
17
32
|
* and we can make use of it later without updating hook configs.
|
|
18
33
|
*
|
|
19
34
|
* Behavior:
|
|
20
|
-
* 1.
|
|
35
|
+
* 1. Spawn a detached `glen doctor --auto` (background maintenance; never blocks).
|
|
21
36
|
* 2. Read stdin (SessionStart event JSON, parsed defensively — tolerate garbage).
|
|
22
37
|
* 3. Read local session state.
|
|
23
38
|
* 4. Write ONE JSON object to stdout:
|
|
@@ -27,8 +42,10 @@ const readStdin = async () => {
|
|
|
27
42
|
* 5. Always exit 0 — this hook must never block a session.
|
|
28
43
|
*/
|
|
29
44
|
const sessionStart = async () => {
|
|
30
|
-
//
|
|
31
|
-
|
|
45
|
+
// Background maintenance (self-update TTL check, plugin upgrades, codex
|
|
46
|
+
// hooks self-heal) runs in a detached `glen doctor --auto` — one child,
|
|
47
|
+
// never blocks the hook turn.
|
|
48
|
+
spawnDoctorAuto();
|
|
32
49
|
// Drain stdin before state read (best-effort; ignore errors).
|
|
33
50
|
try {
|
|
34
51
|
await readStdin();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/commands/session-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/commands/session-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,iFAAiF;AACjF,sCAAsC;AACtC,MAAM,SAAS,GAAG,KAAK,IAAqB,EAAE;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,2EAA2E;AAC3E,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,eAAe,GAAG,GAAS,EAAE;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,KAAK,CACb,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAC/C,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpC,CAAC;QACF,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACjB,iBAAiB;QACnB,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;IAC5D,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,YAAY,GAAG,KAAK,IAAmB,EAAE;IAC7C,wEAAwE;IACxE,wEAAwE;IACxE,8BAA8B;IAC9B,eAAe,EAAE,CAAC;IAElB,8DAA8D;IAC9D,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAEhC,MAAM,iBAAiB,GAAG,KAAK;QAC7B,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,yCAAyC,CAAC;QACvE,CAAC,CAAC,yCAAyC,CAAC;IAU9C,MAAM,MAAM,GAAuB;QACjC,kBAAkB,EAAE;YAClB,aAAa,EAAE,cAAc;YAC7B,iBAAiB;SAClB;QACD,GAAG,CAAC,KAAK,EAAE,SAAS;YAClB,CAAC,CAAC;gBACE,aAAa,EACX,uFAAuF;aAC1F;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Result } from "../_utils/result.js";
|
|
2
|
+
/**
|
|
3
|
+
* `glen uninstall`
|
|
4
|
+
*
|
|
5
|
+
* Inverse of `glen install`'s codex-hooks registration: strips glen-owned
|
|
6
|
+
* entries from ~/.codex/hooks.json, removes glen's [hooks.state] trust
|
|
7
|
+
* blocks, clears the install marker. Other tools' hooks are untouched.
|
|
8
|
+
* Plugin removal itself stays with the agents' own CLIs (printed below).
|
|
9
|
+
*/
|
|
10
|
+
declare const uninstall: () => Promise<Result<void, string>>;
|
|
11
|
+
export { uninstall };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { isCodexHooksInstalled, uninstallCodexHooks, } from "../_utils/codex-hooks-setup.js";
|
|
2
|
+
import { ok } from "../_utils/result.js";
|
|
3
|
+
import { isInstalled } from "../_utils/which.js";
|
|
4
|
+
/**
|
|
5
|
+
* `glen uninstall`
|
|
6
|
+
*
|
|
7
|
+
* Inverse of `glen install`'s codex-hooks registration: strips glen-owned
|
|
8
|
+
* entries from ~/.codex/hooks.json, removes glen's [hooks.state] trust
|
|
9
|
+
* blocks, clears the install marker. Other tools' hooks are untouched.
|
|
10
|
+
* Plugin removal itself stays with the agents' own CLIs (printed below).
|
|
11
|
+
*/
|
|
12
|
+
const uninstall = async () => {
|
|
13
|
+
process.stdout.write("\n 🏔️ glen — uninstall\n\n");
|
|
14
|
+
const codexHooksPresent = await isCodexHooksInstalled();
|
|
15
|
+
if (codexHooksPresent) {
|
|
16
|
+
process.stdout.write(" Removing glen hooks from Codex's user config layer... ");
|
|
17
|
+
const r = await uninstallCodexHooks();
|
|
18
|
+
if (!r.ok) {
|
|
19
|
+
process.stdout.write(`✗\n ${r.error}\n`);
|
|
20
|
+
return r;
|
|
21
|
+
}
|
|
22
|
+
process.stdout.write("✓\n");
|
|
23
|
+
process.stdout.write(" Note: Codex trust keys are positional — if other tools registered\n" +
|
|
24
|
+
" hooks after glen, re-trust them via /hooks in Codex.\n");
|
|
25
|
+
}
|
|
26
|
+
const codexInstalled = isInstalled("codex");
|
|
27
|
+
const claudeInstalled = isInstalled("claude");
|
|
28
|
+
if (codexInstalled || claudeInstalled) {
|
|
29
|
+
process.stdout.write("\n To remove the plugins themselves:\n");
|
|
30
|
+
if (codexInstalled) {
|
|
31
|
+
process.stdout.write(" codex plugin remove glen\n");
|
|
32
|
+
}
|
|
33
|
+
if (claudeInstalled) {
|
|
34
|
+
process.stdout.write(" claude plugin uninstall glen@glen\n");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
process.stdout.write("\n Credentials and session state in ~/.glen are kept (remove with `glen logout`).\n\n");
|
|
38
|
+
return ok(undefined);
|
|
39
|
+
};
|
|
40
|
+
export { uninstall };
|
|
41
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAe,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,SAAS,GAAG,KAAK,IAAmC,EAAE;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAErD,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,EAAE,CAAC;IACxD,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0DAA0D,CAC3D,CAAC;QACF,MAAM,CAAC,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uEAAuE;YACrE,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,cAAc,IAAI,eAAe,EAAE,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAChE,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wFAAwF,CACzF,CAAC;IACF,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
|