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.
Files changed (47) hide show
  1. package/README.md +5 -6
  2. package/dist/agent/binaries.d.ts +5 -0
  3. package/dist/agent/binaries.js +26 -27
  4. package/dist/agent/binaries.js.map +1 -1
  5. package/dist/agent/commands/codex-config.d.ts +51 -0
  6. package/dist/agent/commands/codex-config.js +301 -0
  7. package/dist/agent/commands/codex-config.js.map +1 -0
  8. package/dist/agent/commands/codex-hook.d.ts +70 -0
  9. package/dist/agent/commands/codex-hook.js +205 -0
  10. package/dist/agent/commands/codex-hook.js.map +1 -0
  11. package/dist/agent/commands/codex.d.ts +17 -10
  12. package/dist/agent/commands/codex.js +89 -27
  13. package/dist/agent/commands/codex.js.map +1 -1
  14. package/dist/agent/commands/doctor.js +42 -2
  15. package/dist/agent/commands/doctor.js.map +1 -1
  16. package/dist/agent/commands/install.d.ts +0 -2
  17. package/dist/agent/commands/install.js +10 -81
  18. package/dist/agent/commands/install.js.map +1 -1
  19. package/dist/agent/plugin-version.d.ts +2 -2
  20. package/dist/agent/plugin-version.js +2 -2
  21. package/dist/agent/plugin-version.js.map +1 -1
  22. package/dist/agent-cli.js +20 -4
  23. package/dist/agent-cli.js.map +1 -1
  24. package/dist/cli/commands/install.js +34 -119
  25. package/dist/cli/commands/install.js.map +1 -1
  26. package/dist/client/client.js +72 -9
  27. package/dist/client/client.js.map +1 -1
  28. package/dist/client/exceptions.d.ts +41 -1
  29. package/dist/client/exceptions.js +50 -2
  30. package/dist/client/exceptions.js.map +1 -1
  31. package/dist/client/index.d.ts +1 -1
  32. package/dist/client/index.js +1 -1
  33. package/dist/client/index.js.map +1 -1
  34. package/dist/installer/methods/install-flow.d.ts +25 -0
  35. package/dist/installer/methods/install-flow.js +51 -0
  36. package/dist/installer/methods/install-flow.js.map +1 -0
  37. package/dist/installer/methods/types.d.ts +4 -0
  38. package/dist/installer/methods/types.js.map +1 -0
  39. package/dist/installer/methods/writer.d.ts +19 -0
  40. package/dist/installer/{agents/registry.js → methods/writer.js} +11 -26
  41. package/dist/installer/methods/writer.js.map +1 -0
  42. package/package.json +1 -1
  43. package/dist/installer/agents/registry.d.ts +0 -12
  44. package/dist/installer/agents/registry.js.map +0 -1
  45. package/dist/installer/agents/types.d.ts +0 -16
  46. package/dist/installer/agents/types.js.map +0 -1
  47. /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":"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"}
@@ -1,17 +1,24 @@
1
1
  /**
2
- * mthds-agent codex install-hook — idempotently merge the mthds Stop hook
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 Stop hook after
6
- * the session ends. We need to add our codex-validate-mthds.sh entry without
7
- * clobbering any other hooks the user may already have configured.
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
- * The companion hook script itself (codex-validate-mthds.sh) is copied into
10
- * place by install-codex.sh — this command only owns the JSON merge.
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: "ALREADY_INSTALLED", hooks_file } — entry was already present
14
- * - { status: "INSTALLED_NEW_FILE", hooks_file } — hooks.json did not exist, we created it
15
- * - { status: "MERGED", hooks_file } — entry appended to existing hooks.json
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 merge the mthds Stop hook
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 Stop hook after
6
- * the session ends. We need to add our codex-validate-mthds.sh entry without
7
- * clobbering any other hooks the user may already have configured.
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
- * The companion hook script itself (codex-validate-mthds.sh) is copied into
10
- * place by install-codex.sh — this command only owns the JSON merge.
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: "ALREADY_INSTALLED", hooks_file } — entry was already present
14
- * - { status: "INSTALLED_NEW_FILE", hooks_file } — hooks.json did not exist, we created it
15
- * - { status: "MERGED", hooks_file } — entry appended to existing hooks.json
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 HOOK_SCRIPT_PATH = "~/.codex/hooks/codex-validate-mthds.sh";
23
- const HOOK_MARKER = "codex-validate-mthds";
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 buildMthdsStopEntry() {
40
+ function buildPostToolUseEntry() {
30
41
  return {
42
+ matcher: HOOK_MATCHER,
31
43
  hooks: [
32
44
  {
33
45
  type: "command",
34
- command: HOOK_SCRIPT_PATH,
46
+ command: HOOK_COMMAND,
35
47
  timeout: HOOK_TIMEOUT,
36
48
  },
37
49
  ],
38
50
  };
39
51
  }
40
- function stopEntryMentionsMthds(entry) {
41
- if (!entry || !Array.isArray(entry.hooks))
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
- return entry.hooks.some((h) => typeof h?.command === "string" && h.command.includes(HOOK_MARKER));
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
- Stop: [buildMthdsStopEntry()],
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, parse, merge.
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" || parsed.hooks === null || Array.isArray(parsed.hooks)) {
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
- if (hooks.Stop === undefined) {
101
- hooks.Stop = [];
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
- else if (!Array.isArray(hooks.Stop)) {
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
- // Idempotency: if any existing Stop entry already references our script, no-op.
108
- if (hooks.Stop.some(stopEntryMentionsMthds)) {
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":"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"}
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":"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"}
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>;