mthds 0.4.1 → 0.6.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/README.md +5 -6
- package/dist/agent/binaries.d.ts +5 -0
- package/dist/agent/binaries.js +26 -27
- package/dist/agent/binaries.js.map +1 -1
- package/dist/agent/commands/codex-config.d.ts +51 -0
- package/dist/agent/commands/codex-config.js +301 -0
- package/dist/agent/commands/codex-config.js.map +1 -0
- package/dist/agent/commands/codex-hook.d.ts +70 -0
- package/dist/agent/commands/codex-hook.js +205 -0
- package/dist/agent/commands/codex-hook.js.map +1 -0
- package/dist/agent/commands/codex.d.ts +17 -10
- package/dist/agent/commands/codex.js +89 -27
- package/dist/agent/commands/codex.js.map +1 -1
- package/dist/agent/commands/doctor.js +42 -2
- package/dist/agent/commands/doctor.js.map +1 -1
- package/dist/agent/commands/install.d.ts +0 -2
- package/dist/agent/commands/install.js +10 -81
- package/dist/agent/commands/install.js.map +1 -1
- package/dist/agent/plugin-version.d.ts +2 -2
- package/dist/agent/plugin-version.js +2 -2
- package/dist/agent/plugin-version.js.map +1 -1
- package/dist/agent-cli.js +20 -4
- package/dist/agent-cli.js.map +1 -1
- package/dist/cli/commands/install.js +34 -119
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/client/client.js +72 -9
- package/dist/client/client.js.map +1 -1
- package/dist/client/exceptions.d.ts +41 -1
- package/dist/client/exceptions.js +50 -2
- package/dist/client/exceptions.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/installer/methods/install-flow.d.ts +25 -0
- package/dist/installer/methods/install-flow.js +51 -0
- package/dist/installer/methods/install-flow.js.map +1 -0
- package/dist/installer/methods/types.d.ts +4 -0
- package/dist/installer/methods/types.js.map +1 -0
- package/dist/installer/methods/writer.d.ts +19 -0
- package/dist/installer/{agents/registry.js → methods/writer.js} +11 -26
- package/dist/installer/methods/writer.js.map +1 -0
- package/package.json +1 -1
- package/dist/installer/agents/registry.d.ts +0 -12
- package/dist/installer/agents/registry.js.map +0 -1
- package/dist/installer/agents/types.d.ts +0 -16
- package/dist/installer/agents/types.js.map +0 -1
- /package/dist/installer/{agents → methods}/types.js +0 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mthds-agent codex hook — Codex PostToolUse(apply_patch) hook runtime.
|
|
3
|
+
*
|
|
4
|
+
* Wired into ~/.codex/hooks.json by `mthds-agent codex install-hook`. Runs
|
|
5
|
+
* after every apply_patch tool call in a Codex session: parses the patch
|
|
6
|
+
* envelope from tool_input.command, finds touched .mthds files, and validates
|
|
7
|
+
* each one with plxt (lint + fmt). On lint or fmt failure it emits the Codex
|
|
8
|
+
* hook block protocol so the session sees the error.
|
|
9
|
+
*
|
|
10
|
+
* Replaces the bash script previously at ~/.codex/hooks/codex-validate-mthds.sh.
|
|
11
|
+
*
|
|
12
|
+
* Stdout protocol — Codex's hook contract, not the mthds agent JSON:
|
|
13
|
+
* - empty / no output → silent pass (no .mthds touched, or all clean)
|
|
14
|
+
* - {"decision":"block",...} → block the turn with the given reason
|
|
15
|
+
*
|
|
16
|
+
* Stage 3 (`mthds-agent validate bundle`) stays disabled until offline-mode
|
|
17
|
+
* validation lands in mthds-agent (Codex sandbox blocks the eager S3 fetch).
|
|
18
|
+
* Tracked as Phase 2D in mthds-plugins/TODOS.md.
|
|
19
|
+
*/
|
|
20
|
+
import { accessSync, constants as fsConstants, existsSync, readFileSync, statSync } from "node:fs";
|
|
21
|
+
import { spawnSync } from "node:child_process";
|
|
22
|
+
const PLXT_INSTALL_HINT = "uv tool install pipelex-tools";
|
|
23
|
+
// ── Pure helpers (exported for testability) ───────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Extract every distinct .mthds path mentioned in an apply_patch envelope.
|
|
26
|
+
*
|
|
27
|
+
* The envelope's relevant headers are:
|
|
28
|
+
* *** Update File: <path>
|
|
29
|
+
* *** Add File: <path>
|
|
30
|
+
* *** Move to: <path> (destination of a rename — we validate the dest)
|
|
31
|
+
*
|
|
32
|
+
* `Delete File:` and `Move from:` (the source of a rename) are deliberately
|
|
33
|
+
* skipped because the file no longer exists post-patch.
|
|
34
|
+
*/
|
|
35
|
+
export function parseMthdsFiles(command) {
|
|
36
|
+
const re = /^\*\*\* (?:Update File|Add File|Move to):\s*(.+\.mthds)\s*$/gm;
|
|
37
|
+
const seen = new Set();
|
|
38
|
+
let match;
|
|
39
|
+
while ((match = re.exec(command)) !== null) {
|
|
40
|
+
seen.add(match[1].trim());
|
|
41
|
+
}
|
|
42
|
+
return Array.from(seen);
|
|
43
|
+
}
|
|
44
|
+
export function formatLintError(file, result) {
|
|
45
|
+
const out = result.stderr.trim() ||
|
|
46
|
+
result.stdout.trim() ||
|
|
47
|
+
`lint exited with code ${result.exitCode} (no output)`;
|
|
48
|
+
return `TOML/schema lint errors in ${file}:\n${out}\n\nFix it.`;
|
|
49
|
+
}
|
|
50
|
+
export function formatFmtError(file, result) {
|
|
51
|
+
const out = result.stderr.trim() ||
|
|
52
|
+
result.stdout.trim() ||
|
|
53
|
+
`fmt exited with code ${result.exitCode} (no output)`;
|
|
54
|
+
return `plxt fmt failed on ${file} (exit ${result.exitCode}):\n${out}\n\nFix it.`;
|
|
55
|
+
}
|
|
56
|
+
export function buildBlockPayload(reason) {
|
|
57
|
+
return JSON.stringify({ decision: "block", reason }) + "\n";
|
|
58
|
+
}
|
|
59
|
+
// ── Runtime helpers ───────────────────────────────────────────────────
|
|
60
|
+
function readAllStdin() {
|
|
61
|
+
try {
|
|
62
|
+
return readFileSync(0, "utf8");
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return "";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Build the ordered list of candidate paths for `name` on PATH.
|
|
70
|
+
*
|
|
71
|
+
* Pure — no fs access. Exported for testability.
|
|
72
|
+
*
|
|
73
|
+
* On Windows we also try each PATHEXT extension (`plxt.EXE`, `plxt.CMD`, ...)
|
|
74
|
+
* and skip the bare name, because Windows requires an extension to consider
|
|
75
|
+
* a file executable. PATHEXT defaults to `.COM;.EXE;.BAT;.CMD` when unset.
|
|
76
|
+
*/
|
|
77
|
+
export function buildPathCandidates(name, pathEnv, platform, pathExt) {
|
|
78
|
+
if (!pathEnv)
|
|
79
|
+
return [];
|
|
80
|
+
const isWin = platform === "win32";
|
|
81
|
+
// Don't use node:path's `delimiter`/`sep` — they're baked at module load
|
|
82
|
+
// from the host platform, so the function would silently behave wrong if
|
|
83
|
+
// we wanted to reason about Windows lookup on a POSIX host (and vice versa).
|
|
84
|
+
const pathDelimiter = isWin ? ";" : ":";
|
|
85
|
+
const pathSep = isWin ? "\\" : "/";
|
|
86
|
+
const exts = isWin
|
|
87
|
+
? (pathExt ?? ".COM;.EXE;.BAT;.CMD")
|
|
88
|
+
.split(";")
|
|
89
|
+
.map((e) => e.trim())
|
|
90
|
+
.filter(Boolean)
|
|
91
|
+
: [""];
|
|
92
|
+
const candidates = [];
|
|
93
|
+
for (const dir of pathEnv.split(pathDelimiter)) {
|
|
94
|
+
if (!dir)
|
|
95
|
+
continue;
|
|
96
|
+
for (const ext of exts) {
|
|
97
|
+
const fullName = `${name}${ext}`;
|
|
98
|
+
candidates.push(dir.endsWith(pathSep)
|
|
99
|
+
? `${dir}${fullName}`
|
|
100
|
+
: `${dir}${pathSep}${fullName}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return candidates;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Cross-platform `command -v <name>`. We can't rely on PATH lookup
|
|
107
|
+
* inside spawnSync because we need to detect absence vs. spawn failure
|
|
108
|
+
* before we report "missing tool" to the user.
|
|
109
|
+
*
|
|
110
|
+
* `accessSync(X_OK)` enforces the executable bit on POSIX. On Windows
|
|
111
|
+
* X_OK is satisfied by any readable file, but the PATHEXT loop in
|
|
112
|
+
* buildPathCandidates already restricts us to extensions Windows treats
|
|
113
|
+
* as runnable.
|
|
114
|
+
*/
|
|
115
|
+
export function commandOnPath(name) {
|
|
116
|
+
const candidates = buildPathCandidates(name, process.env.PATH ?? "", process.platform, process.env.PATHEXT);
|
|
117
|
+
for (const candidate of candidates) {
|
|
118
|
+
try {
|
|
119
|
+
if (!statSync(candidate).isFile())
|
|
120
|
+
continue;
|
|
121
|
+
accessSync(candidate, fsConstants.X_OK);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// ENOENT, EACCES, or non-executable entry — keep scanning.
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
function runPlxt(args) {
|
|
131
|
+
const result = spawnSync("plxt", args, { encoding: "utf8" });
|
|
132
|
+
if (result.error) {
|
|
133
|
+
return {
|
|
134
|
+
exitCode: 127,
|
|
135
|
+
stdout: "",
|
|
136
|
+
stderr: result.error.message,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
exitCode: result.status ?? 1,
|
|
141
|
+
stdout: result.stdout ?? "",
|
|
142
|
+
stderr: result.stderr ?? "",
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export async function runCodexHook(deps) {
|
|
146
|
+
const raw = deps.readStdin();
|
|
147
|
+
if (raw.trim().length === 0)
|
|
148
|
+
return; // silent pass
|
|
149
|
+
let parsed;
|
|
150
|
+
try {
|
|
151
|
+
parsed = JSON.parse(raw);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return; // malformed payload — silent pass, not our job to police Codex
|
|
155
|
+
}
|
|
156
|
+
const command = parsed?.tool_input?.command;
|
|
157
|
+
if (typeof command !== "string" || command.length === 0)
|
|
158
|
+
return;
|
|
159
|
+
const files = parseMthdsFiles(command);
|
|
160
|
+
if (files.length === 0)
|
|
161
|
+
return;
|
|
162
|
+
if (!deps.hasPlxt()) {
|
|
163
|
+
deps.emit(buildBlockPayload(`Missing required CLI tool: plxt (install via: ${PLXT_INSTALL_HINT})`));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const errors = [];
|
|
167
|
+
for (const file of files) {
|
|
168
|
+
// Renamed-source paths and delete targets won't exist on disk post-patch.
|
|
169
|
+
// Skipping them is the right thing — this is identical to the bash
|
|
170
|
+
// hook's behaviour.
|
|
171
|
+
if (!deps.fileExists(file))
|
|
172
|
+
continue;
|
|
173
|
+
// Stage 1: plxt lint (block on failure)
|
|
174
|
+
const lint = deps.runPlxt(["lint", "--quiet", file]);
|
|
175
|
+
if (lint.exitCode !== 0) {
|
|
176
|
+
errors.push(formatLintError(file, lint));
|
|
177
|
+
continue; // skip fmt for files that failed lint
|
|
178
|
+
}
|
|
179
|
+
// Stage 2: plxt fmt — also blocks on failure (the bash hook this
|
|
180
|
+
// replaces aggregated lint and fmt errors into a single block reason).
|
|
181
|
+
// Re-formatting can fail e.g. when the file becomes invalid mid-edit;
|
|
182
|
+
// surfacing it loudly is better than letting a half-formatted file land.
|
|
183
|
+
const fmt = deps.runPlxt(["fmt", file]);
|
|
184
|
+
if (fmt.exitCode !== 0) {
|
|
185
|
+
errors.push(formatFmtError(file, fmt));
|
|
186
|
+
}
|
|
187
|
+
// Stage 3: mthds-agent validate bundle — DISABLED.
|
|
188
|
+
// Re-enable once mthds-agent supports offline validation
|
|
189
|
+
// (mthds-plugins/TODOS.md Phase 2D).
|
|
190
|
+
}
|
|
191
|
+
if (errors.length > 0) {
|
|
192
|
+
deps.emit(buildBlockPayload(errors.join("\n\n")));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// ── CLI entry point ───────────────────────────────────────────────────
|
|
196
|
+
export async function agentCodexHook() {
|
|
197
|
+
return runCodexHook({
|
|
198
|
+
readStdin: readAllStdin,
|
|
199
|
+
fileExists: existsSync,
|
|
200
|
+
hasPlxt: () => commandOnPath("plxt"),
|
|
201
|
+
runPlxt,
|
|
202
|
+
emit: (out) => process.stdout.write(out),
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=codex-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-hook.js","sourceRoot":"","sources":["../../../src/agent/commands/codex-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,IAAI,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AAY1D,yEAAyE;AAEzE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,EAAE,GAAG,+DAA+D,CAAC;IAC3E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,MAAqB;IACjE,MAAM,GAAG,GACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QACpB,yBAAyB,MAAM,CAAC,QAAQ,cAAc,CAAC;IACzD,OAAO,8BAA8B,IAAI,MAAM,GAAG,aAAa,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAqB;IAChE,MAAM,GAAG,GACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QACpB,wBAAwB,MAAM,CAAC,QAAQ,cAAc,CAAC;IACxD,OAAO,sBAAsB,IAAI,UAAU,MAAM,CAAC,QAAQ,OAAO,GAAG,aAAa,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;AAC9D,CAAC;AAED,yEAAyE;AAEzE,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,OAAe,EACf,QAAyB,EACzB,OAA2B;IAE3B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,CAAC;IACnC,yEAAyE;IACzE,yEAAyE;IACzE,6EAA6E;IAC7E,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK;QAChB,CAAC,CAAC,CAAC,OAAO,IAAI,qBAAqB,CAAC;aAC/B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;QACpB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACT,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;YACjC,UAAU,CAAC,IAAI,CACb,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACnB,CAAC,CAAC,GAAG,GAAG,GAAG,QAAQ,EAAE;gBACrB,CAAC,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE,CAClC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,UAAU,GAAG,mBAAmB,CACpC,IAAI,EACJ,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EACtB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CACpB,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;gBAAE,SAAS;YAC5C,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,2DAA2D;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO;YACL,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;SAC7B,CAAC;IACJ,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;QAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;KAC5B,CAAC;AACJ,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAmB;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAC7B,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,cAAc;IAEnD,IAAI,MAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,+DAA+D;IACzE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC;IAC5C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEhE,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE/B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CACP,iBAAiB,CACf,iDAAiD,iBAAiB,GAAG,CACtE,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,0EAA0E;QAC1E,mEAAmE;QACnE,oBAAoB;QACpB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAErC,wCAAwC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACzC,SAAS,CAAC,sCAAsC;QAClD,CAAC;QAED,iEAAiE;QACjE,uEAAuE;QACvE,sEAAsE;QACtE,yEAAyE;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACxC,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,mDAAmD;QACnD,yDAAyD;QACzD,qCAAqC;IACvC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,yEAAyE;AAEzE,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,YAAY,CAAC;QAClB,SAAS,EAAE,YAAY;QACvB,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;QACpC,OAAO;QACP,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;KACzC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* mthds-agent codex install-hook — idempotently
|
|
3
|
-
* into ~/.codex/hooks.json.
|
|
2
|
+
* mthds-agent codex install-hook — idempotently wire the mthds
|
|
3
|
+
* PostToolUse(apply_patch) hook into ~/.codex/hooks.json.
|
|
4
4
|
*
|
|
5
|
-
* Codex reads ~/.codex/hooks.json at startup and runs each
|
|
6
|
-
* the
|
|
7
|
-
*
|
|
5
|
+
* Codex reads ~/.codex/hooks.json at startup and runs each registered hook
|
|
6
|
+
* after the matching tool call. We register a PostToolUse hook with
|
|
7
|
+
* matcher=apply_patch whose command is `mthds-agent codex hook` — the actual
|
|
8
|
+
* validation runtime, registered under the same `codex` subcommand group as
|
|
9
|
+
* this install command.
|
|
8
10
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
+
* Migration: pre-0.5.0 versions of this command wrote `hooks.Stop[]` entries
|
|
12
|
+
* pointing at a bash script (~/.codex/hooks/codex-validate-mthds.sh). The
|
|
13
|
+
* mthds-plugins WIP 0.9.0 install-codex.sh wrote `hooks.PostToolUse[]`
|
|
14
|
+
* entries pointing at the same bash script. Both are obsolete: the bash
|
|
15
|
+
* script is gone, and the new entry routes through `mthds-agent codex hook`
|
|
16
|
+
* directly. We sweep both legacy shapes here so users coming from any
|
|
17
|
+
* earlier install end up with a clean hooks.json.
|
|
11
18
|
*
|
|
12
19
|
* Output statuses (via agentSuccess):
|
|
13
|
-
* - { status: "
|
|
14
|
-
* - { status: "
|
|
15
|
-
* - { status: "MERGED", hooks_file }
|
|
20
|
+
* - { status: "INSTALLED_NEW_FILE", hooks_file } — hooks.json didn't exist
|
|
21
|
+
* - { status: "ALREADY_INSTALLED", hooks_file } — new-shape entry already present
|
|
22
|
+
* - { status: "MERGED", hooks_file } — entry appended (fresh or post-migration)
|
|
16
23
|
*/
|
|
17
24
|
export declare function agentCodexInstallHook(): Promise<void>;
|
|
@@ -1,46 +1,74 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* mthds-agent codex install-hook — idempotently
|
|
3
|
-
* into ~/.codex/hooks.json.
|
|
2
|
+
* mthds-agent codex install-hook — idempotently wire the mthds
|
|
3
|
+
* PostToolUse(apply_patch) hook into ~/.codex/hooks.json.
|
|
4
4
|
*
|
|
5
|
-
* Codex reads ~/.codex/hooks.json at startup and runs each
|
|
6
|
-
* the
|
|
7
|
-
*
|
|
5
|
+
* Codex reads ~/.codex/hooks.json at startup and runs each registered hook
|
|
6
|
+
* after the matching tool call. We register a PostToolUse hook with
|
|
7
|
+
* matcher=apply_patch whose command is `mthds-agent codex hook` — the actual
|
|
8
|
+
* validation runtime, registered under the same `codex` subcommand group as
|
|
9
|
+
* this install command.
|
|
8
10
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
+
* Migration: pre-0.5.0 versions of this command wrote `hooks.Stop[]` entries
|
|
12
|
+
* pointing at a bash script (~/.codex/hooks/codex-validate-mthds.sh). The
|
|
13
|
+
* mthds-plugins WIP 0.9.0 install-codex.sh wrote `hooks.PostToolUse[]`
|
|
14
|
+
* entries pointing at the same bash script. Both are obsolete: the bash
|
|
15
|
+
* script is gone, and the new entry routes through `mthds-agent codex hook`
|
|
16
|
+
* directly. We sweep both legacy shapes here so users coming from any
|
|
17
|
+
* earlier install end up with a clean hooks.json.
|
|
11
18
|
*
|
|
12
19
|
* Output statuses (via agentSuccess):
|
|
13
|
-
* - { status: "
|
|
14
|
-
* - { status: "
|
|
15
|
-
* - { status: "MERGED", hooks_file }
|
|
20
|
+
* - { status: "INSTALLED_NEW_FILE", hooks_file } — hooks.json didn't exist
|
|
21
|
+
* - { status: "ALREADY_INSTALLED", hooks_file } — new-shape entry already present
|
|
22
|
+
* - { status: "MERGED", hooks_file } — entry appended (fresh or post-migration)
|
|
16
23
|
*/
|
|
17
24
|
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
18
25
|
import { dirname, join } from "node:path";
|
|
19
26
|
import { homedir } from "node:os";
|
|
20
27
|
import { agentError, agentSuccess, AGENT_ERROR_DOMAINS } from "../output.js";
|
|
21
28
|
// ── Constants ──────────────────────────────────────────────────────
|
|
22
|
-
const
|
|
23
|
-
const
|
|
29
|
+
const HOOK_COMMAND = "mthds-agent codex hook";
|
|
30
|
+
const HOOK_MATCHER = "apply_patch";
|
|
24
31
|
const HOOK_TIMEOUT = 30;
|
|
32
|
+
// Substrings that identify entries previously written by this command or
|
|
33
|
+
// the retired install-codex.sh script. Any entry whose command contains
|
|
34
|
+
// either is "ours" and gets cleaned up before the new entry is appended.
|
|
35
|
+
const LEGACY_MARKERS = ["codex-validate-mthds", "mthds-agent codex hook"];
|
|
25
36
|
// ── Helpers ────────────────────────────────────────────────────────
|
|
26
37
|
function hooksFilePath() {
|
|
27
38
|
return join(homedir(), ".codex", "hooks.json");
|
|
28
39
|
}
|
|
29
|
-
function
|
|
40
|
+
function buildPostToolUseEntry() {
|
|
30
41
|
return {
|
|
42
|
+
matcher: HOOK_MATCHER,
|
|
31
43
|
hooks: [
|
|
32
44
|
{
|
|
33
45
|
type: "command",
|
|
34
|
-
command:
|
|
46
|
+
command: HOOK_COMMAND,
|
|
35
47
|
timeout: HOOK_TIMEOUT,
|
|
36
48
|
},
|
|
37
49
|
],
|
|
38
50
|
};
|
|
39
51
|
}
|
|
40
|
-
|
|
41
|
-
|
|
52
|
+
// "Ours" is a fuzzy substring match across all known shapes (current +
|
|
53
|
+
// legacy bash-script entries) — used to identify entries to clean up.
|
|
54
|
+
// "Current" is an exact-prefix match on the new shape only — used to
|
|
55
|
+
// detect idempotent re-installs. The asymmetry is deliberate: a legacy
|
|
56
|
+
// entry should be removed and replaced, not treated as already-installed.
|
|
57
|
+
function entryIsOurs(entry) {
|
|
58
|
+
if (!entry || typeof entry !== "object")
|
|
42
59
|
return false;
|
|
43
|
-
|
|
60
|
+
const cmds = entry.hooks;
|
|
61
|
+
if (!Array.isArray(cmds))
|
|
62
|
+
return false;
|
|
63
|
+
return cmds.some((h) => typeof h?.command === "string" &&
|
|
64
|
+
LEGACY_MARKERS.some((m) => h.command.includes(m)));
|
|
65
|
+
}
|
|
66
|
+
function entryIsCurrent(entry) {
|
|
67
|
+
if (entry?.matcher !== HOOK_MATCHER)
|
|
68
|
+
return false;
|
|
69
|
+
if (!Array.isArray(entry.hooks))
|
|
70
|
+
return false;
|
|
71
|
+
return entry.hooks.some((h) => typeof h?.command === "string" && h.command.startsWith(HOOK_COMMAND));
|
|
44
72
|
}
|
|
45
73
|
function writeAtomic(path, contents) {
|
|
46
74
|
mkdirSync(dirname(path), { recursive: true });
|
|
@@ -51,11 +79,11 @@ function writeAtomic(path, contents) {
|
|
|
51
79
|
// ── Main ───────────────────────────────────────────────────────────
|
|
52
80
|
export async function agentCodexInstallHook() {
|
|
53
81
|
const file = hooksFilePath();
|
|
54
|
-
// Case 1: hooks.json does not exist — create it fresh.
|
|
82
|
+
// Case 1: hooks.json does not exist — create it fresh with the new shape.
|
|
55
83
|
if (!existsSync(file)) {
|
|
56
84
|
const fresh = {
|
|
57
85
|
hooks: {
|
|
58
|
-
|
|
86
|
+
PostToolUse: [buildPostToolUseEntry()],
|
|
59
87
|
},
|
|
60
88
|
};
|
|
61
89
|
try {
|
|
@@ -68,7 +96,7 @@ export async function agentCodexInstallHook() {
|
|
|
68
96
|
agentSuccess({ status: "INSTALLED_NEW_FILE", hooks_file: file });
|
|
69
97
|
return;
|
|
70
98
|
}
|
|
71
|
-
// Case 2: hooks.json exists — read,
|
|
99
|
+
// Case 2: hooks.json exists — read, validate, migrate legacy entries, merge.
|
|
72
100
|
let raw;
|
|
73
101
|
try {
|
|
74
102
|
raw = readFileSync(file, "utf8");
|
|
@@ -92,24 +120,58 @@ export async function agentCodexInstallHook() {
|
|
|
92
120
|
if (parsed.hooks === undefined) {
|
|
93
121
|
parsed.hooks = {};
|
|
94
122
|
}
|
|
95
|
-
else if (typeof parsed.hooks !== "object" ||
|
|
123
|
+
else if (typeof parsed.hooks !== "object" ||
|
|
124
|
+
parsed.hooks === null ||
|
|
125
|
+
Array.isArray(parsed.hooks)) {
|
|
96
126
|
agentError(`${file} has an invalid \`hooks\` field (expected object, got ${Array.isArray(parsed.hooks) ? "array" : typeof parsed.hooks}). Fix the file by hand.`, "ConfigError", { error_domain: AGENT_ERROR_DOMAINS.CONFIG });
|
|
97
127
|
return;
|
|
98
128
|
}
|
|
99
129
|
const hooks = parsed.hooks;
|
|
100
|
-
|
|
101
|
-
|
|
130
|
+
// Validate hooks.PostToolUse if present.
|
|
131
|
+
if (hooks.PostToolUse !== undefined && !Array.isArray(hooks.PostToolUse)) {
|
|
132
|
+
agentError(`${file} has an invalid \`hooks.PostToolUse\` field (expected array, got ${typeof hooks.PostToolUse}). Fix the file by hand.`, "ConfigError", { error_domain: AGENT_ERROR_DOMAINS.CONFIG });
|
|
133
|
+
return;
|
|
102
134
|
}
|
|
103
|
-
|
|
135
|
+
// Validate hooks.Stop if present (we may need to mutate it).
|
|
136
|
+
if (hooks.Stop !== undefined && !Array.isArray(hooks.Stop)) {
|
|
104
137
|
agentError(`${file} has an invalid \`hooks.Stop\` field (expected array, got ${typeof hooks.Stop}). Fix the file by hand.`, "ConfigError", { error_domain: AGENT_ERROR_DOMAINS.CONFIG });
|
|
105
138
|
return;
|
|
106
139
|
}
|
|
107
|
-
//
|
|
108
|
-
|
|
140
|
+
// Track whether we mutated anything in memory. If yes, we must write —
|
|
141
|
+
// even when a current-shape entry already exists, because a stale legacy
|
|
142
|
+
// entry alongside it is still pollution that should be cleaned up.
|
|
143
|
+
let dirty = false;
|
|
144
|
+
// Migration: drop any legacy Stop entry pointing at our old script.
|
|
145
|
+
if (Array.isArray(hooks.Stop)) {
|
|
146
|
+
const before = hooks.Stop.length;
|
|
147
|
+
hooks.Stop = hooks.Stop.filter((e) => !entryIsOurs(e));
|
|
148
|
+
if (hooks.Stop.length !== before)
|
|
149
|
+
dirty = true;
|
|
150
|
+
if (hooks.Stop.length === 0) {
|
|
151
|
+
delete hooks.Stop;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Initialise PostToolUse if absent.
|
|
155
|
+
if (hooks.PostToolUse === undefined) {
|
|
156
|
+
hooks.PostToolUse = [];
|
|
157
|
+
}
|
|
158
|
+
// Detect whether a current-shape entry already exists, then strip any
|
|
159
|
+
// legacy PostToolUse(apply_patch) entries that pointed at the old bash
|
|
160
|
+
// script. Doing both in this order means a hooks.json with both a current
|
|
161
|
+
// and a legacy entry gets cleaned up on re-run.
|
|
162
|
+
const hasCurrent = hooks.PostToolUse.some(entryIsCurrent);
|
|
163
|
+
const beforePtu = hooks.PostToolUse.length;
|
|
164
|
+
hooks.PostToolUse = hooks.PostToolUse.filter((e) => entryIsCurrent(e) || !entryIsOurs(e));
|
|
165
|
+
if (hooks.PostToolUse.length !== beforePtu)
|
|
166
|
+
dirty = true;
|
|
167
|
+
if (!hasCurrent) {
|
|
168
|
+
hooks.PostToolUse.push(buildPostToolUseEntry());
|
|
169
|
+
dirty = true;
|
|
170
|
+
}
|
|
171
|
+
if (!dirty) {
|
|
109
172
|
agentSuccess({ status: "ALREADY_INSTALLED", hooks_file: file });
|
|
110
173
|
return;
|
|
111
174
|
}
|
|
112
|
-
hooks.Stop.push(buildMthdsStopEntry());
|
|
113
175
|
try {
|
|
114
176
|
writeAtomic(file, JSON.stringify(parsed, null, 2) + "\n");
|
|
115
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/agent/commands/codex.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/agent/commands/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { agentSuccess } from "../output.js";
|
|
|
6
6
|
import { BINARY_RECOVERY, buildInstallCommand } from "../binaries.js";
|
|
7
7
|
import { checkBinaryVersion } from "../../installer/runtime/version-check.js";
|
|
8
8
|
import { listConfig } from "../../config/config.js";
|
|
9
|
+
import { inspectCodexConfig } from "./codex-config.js";
|
|
9
10
|
// ── Output format ───────────────────────────────────────────────────
|
|
10
11
|
export const OutputFormat = {
|
|
11
12
|
MARKDOWN: "markdown",
|
|
@@ -26,7 +27,7 @@ function getBinaryPath(bin) {
|
|
|
26
27
|
function escapeCell(value) {
|
|
27
28
|
return value.replace(/\|/g, "\\|");
|
|
28
29
|
}
|
|
29
|
-
function formatDoctorMarkdown(healthy, dependencies, config, issues) {
|
|
30
|
+
function formatDoctorMarkdown(healthy, dependencies, config, issues, codex) {
|
|
30
31
|
const lines = [];
|
|
31
32
|
lines.push(`# Doctor Report`);
|
|
32
33
|
lines.push("");
|
|
@@ -59,6 +60,27 @@ function formatDoctorMarkdown(healthy, dependencies, config, issues) {
|
|
|
59
60
|
lines.push(`| ${escapeCell(entry.key)} | ${escapeCell(entry.value)} | ${escapeCell(entry.source)} |`);
|
|
60
61
|
}
|
|
61
62
|
lines.push("");
|
|
63
|
+
// Codex
|
|
64
|
+
lines.push("## Codex");
|
|
65
|
+
lines.push("");
|
|
66
|
+
if (!codex.exists) {
|
|
67
|
+
lines.push(`- No ~/.codex/config.toml found. Run \`mthds-agent codex apply-config\` to create one with sandbox network access.`);
|
|
68
|
+
}
|
|
69
|
+
else if (codex.parse_error) {
|
|
70
|
+
lines.push(`- [ERROR] Could not parse ${codex.config_file}: ${codex.parse_error}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
if (codex.needs_change) {
|
|
74
|
+
lines.push(`- [WARN] Sandbox network access not enabled. Run \`mthds-agent codex apply-config\` to add \`[${codex.needs_change.table}] ${codex.needs_change.key} = ${codex.needs_change.value}\`.`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
lines.push(`- Sandbox network access: ok`);
|
|
78
|
+
}
|
|
79
|
+
for (const w of codex.warnings) {
|
|
80
|
+
lines.push(`- [WARN] ${w.message}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
lines.push("");
|
|
62
84
|
// Issues
|
|
63
85
|
if (issues.length > 0) {
|
|
64
86
|
lines.push("## Issues");
|
|
@@ -155,6 +177,23 @@ export async function agentDoctor(format = OutputFormat.MARKDOWN) {
|
|
|
155
177
|
});
|
|
156
178
|
}
|
|
157
179
|
}
|
|
180
|
+
// Codex sandbox config (read-only inspection — doctor never writes).
|
|
181
|
+
const codex = inspectCodexConfig();
|
|
182
|
+
if (codex.needs_change) {
|
|
183
|
+
issues.push({
|
|
184
|
+
severity: "warning",
|
|
185
|
+
message: `Codex sandbox network not enabled in ${codex.config_file}. Run \`mthds-agent codex apply-config\`.`,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
for (const w of codex.warnings) {
|
|
189
|
+
issues.push({ severity: "warning", message: `Codex: ${w.message}` });
|
|
190
|
+
}
|
|
191
|
+
if (codex.parse_error) {
|
|
192
|
+
issues.push({
|
|
193
|
+
severity: "error",
|
|
194
|
+
message: `Codex config parse error in ${codex.config_file}: ${codex.parse_error}`,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
158
197
|
const hasErrors = issues.some((issue) => issue.severity === "error");
|
|
159
198
|
const healthy = !hasErrors;
|
|
160
199
|
if (format === OutputFormat.JSON) {
|
|
@@ -163,10 +202,11 @@ export async function agentDoctor(format = OutputFormat.MARKDOWN) {
|
|
|
163
202
|
dependencies,
|
|
164
203
|
config: configEntries,
|
|
165
204
|
issues,
|
|
205
|
+
codex,
|
|
166
206
|
});
|
|
167
207
|
}
|
|
168
208
|
else {
|
|
169
|
-
process.stdout.write(formatDoctorMarkdown(healthy, dependencies, configEntries, issues));
|
|
209
|
+
process.stdout.write(formatDoctorMarkdown(healthy, dependencies, configEntries, issues, codex));
|
|
170
210
|
}
|
|
171
211
|
}
|
|
172
212
|
//# sourceMappingURL=doctor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/agent/commands/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/agent/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
interface AgentInstallOptions {
|
|
6
6
|
local?: string;
|
|
7
|
-
agent?: string;
|
|
8
7
|
location?: string;
|
|
9
8
|
method?: string;
|
|
10
|
-
skills?: boolean;
|
|
11
9
|
noRunner?: boolean;
|
|
12
10
|
}
|
|
13
11
|
export declare function agentInstall(address: string | undefined, options: AgentInstallOptions): Promise<void>;
|