oh-my-codex 0.16.4 → 0.17.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/Cargo.lock +5 -5
- package/Cargo.toml +1 -1
- package/dist/catalog/__tests__/generator.test.js +2 -0
- package/dist/catalog/__tests__/generator.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +80 -7
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +17 -11
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/mcp-serve.test.js +4 -0
- package/dist/cli/__tests__/mcp-serve.test.js.map +1 -1
- package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js +8 -3
- package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +27 -1
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +22 -0
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +66 -10
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +8 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +17 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-serve.d.ts.map +1 -1
- package/dist/cli/mcp-serve.js +4 -0
- package/dist/cli/mcp-serve.js.map +1 -1
- package/dist/cli/plugin-marketplace.d.ts +20 -0
- package/dist/cli/plugin-marketplace.d.ts.map +1 -1
- package/dist/cli/plugin-marketplace.js +115 -1
- package/dist/cli/plugin-marketplace.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +29 -10
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +7 -1
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/config/__tests__/codex-hooks.test.js +136 -9
- package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +15 -0
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/codex-hooks.d.ts +13 -14
- package/dist/config/codex-hooks.d.ts.map +1 -1
- package/dist/config/codex-hooks.js +85 -7
- package/dist/config/codex-hooks.js.map +1 -1
- package/dist/config/generator.d.ts +4 -1
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +15 -9
- package/dist/config/generator.js.map +1 -1
- package/dist/config/omx-first-party-mcp.d.ts.map +1 -1
- package/dist/config/omx-first-party-mcp.js +7 -0
- package/dist/config/omx-first-party-mcp.js.map +1 -1
- package/dist/hooks/__tests__/design-skill.test.d.ts +2 -0
- package/dist/hooks/__tests__/design-skill.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/design-skill.test.js +55 -0
- package/dist/hooks/__tests__/design-skill.test.js.map +1 -0
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +265 -0
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
- package/dist/hooks/__tests__/skill-catalog-hygiene.test.js +1 -1
- package/dist/hooks/__tests__/skill-catalog-hygiene.test.js.map +1 -1
- package/dist/hooks/__tests__/skill-guidance-contract.test.js +41 -0
- package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +5 -1
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/keyword-registry.d.ts.map +1 -1
- package/dist/hooks/keyword-registry.js +2 -0
- package/dist/hooks/keyword-registry.js.map +1 -1
- package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
- package/dist/hooks/prompt-guidance-contract.js +47 -2
- package/dist/hooks/prompt-guidance-contract.js.map +1 -1
- package/dist/mcp/__tests__/bootstrap.test.js +3 -0
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
- package/dist/mcp/__tests__/hermes-bridge.test.d.ts +2 -0
- package/dist/mcp/__tests__/hermes-bridge.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/hermes-bridge.test.js +374 -0
- package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -0
- package/dist/mcp/__tests__/state-paths.test.js +96 -13
- package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
- package/dist/mcp/bootstrap.d.ts +1 -1
- package/dist/mcp/bootstrap.d.ts.map +1 -1
- package/dist/mcp/bootstrap.js +2 -0
- package/dist/mcp/bootstrap.js.map +1 -1
- package/dist/mcp/hermes-bridge.d.ts +81 -0
- package/dist/mcp/hermes-bridge.d.ts.map +1 -0
- package/dist/mcp/hermes-bridge.js +400 -0
- package/dist/mcp/hermes-bridge.js.map +1 -0
- package/dist/mcp/hermes-server.d.ts +269 -0
- package/dist/mcp/hermes-server.d.ts.map +1 -0
- package/dist/mcp/hermes-server.js +121 -0
- package/dist/mcp/hermes-server.js.map +1 -0
- package/dist/mcp/state-paths.d.ts.map +1 -1
- package/dist/mcp/state-paths.js +41 -9
- package/dist/mcp/state-paths.js.map +1 -1
- package/dist/modes/__tests__/base-tmux-pane.test.js +31 -1
- package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +187 -2
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts +1 -0
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +44 -17
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.js +91 -2
- package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
- package/dist/state/mode-state-context.d.ts +2 -0
- package/dist/state/mode-state-context.d.ts.map +1 -1
- package/dist/state/mode-state-context.js +21 -0
- package/dist/state/mode-state-context.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js +121 -0
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/artifacts.d.ts +9 -1
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +105 -3
- package/dist/ultragoal/artifacts.js.map +1 -1
- package/dist/utils/__tests__/paths.test.js +31 -1
- package/dist/utils/__tests__/paths.test.js.map +1 -1
- package/dist/utils/paths.d.ts +6 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +18 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/wiki/lifecycle.js +3 -3
- package/dist/wiki/lifecycle.js.map +1 -1
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/.mcp.json +8 -0
- package/plugins/oh-my-codex/skills/design/SKILL.md +180 -0
- package/plugins/oh-my-codex/skills/skill/SKILL.md +2 -1
- package/plugins/oh-my-codex/skills/ultraqa/SKILL.md +161 -47
- package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +2 -2
- package/skills/design/SKILL.md +180 -0
- package/skills/frontend-ui-ux/SKILL.md +6 -2
- package/skills/skill/SKILL.md +2 -1
- package/skills/ultraqa/SKILL.md +161 -47
- package/skills/visual-ralph/SKILL.md +2 -2
- package/src/scripts/__tests__/codex-native-hook.test.ts +206 -1
- package/src/scripts/codex-native-hook.ts +45 -18
- package/src/scripts/notify-hook/tmux-injection.ts +110 -3
- package/templates/catalog-manifest.json +9 -2
|
@@ -9,13 +9,13 @@ import { afterEach, beforeEach, describe, it } from "node:test";
|
|
|
9
9
|
import { buildManagedCodexHooksConfig } from "../../config/codex-hooks.js";
|
|
10
10
|
import { DOCUMENT_REFRESH_EXEMPTION_PREFIX } from "../../document-refresh/enforcer.js";
|
|
11
11
|
import { initTeamState, readTeamLeaderAttention, readTeamPhase, writeTeamLeaderAttention, } from "../../team/state.js";
|
|
12
|
-
import { dispatchCodexNativeHook, isCodexNativeHookMainModule, mapCodexHookEventToOmxEvent, resolveSessionOwnerPidFromAncestry, } from "../codex-native-hook.js";
|
|
12
|
+
import { dispatchCodexNativeHook, isCodexNativeHookMainModule, looksLikeGoalCompletionPrompt, mapCodexHookEventToOmxEvent, resolveSessionOwnerPidFromAncestry, } from "../codex-native-hook.js";
|
|
13
13
|
import { writeSessionStart } from "../../hooks/session.js";
|
|
14
14
|
import { resetTriageConfigCache } from "../../hooks/triage-config.js";
|
|
15
15
|
import { executeStateOperation } from "../../state/operations.js";
|
|
16
16
|
import { OMX_TMUX_HUD_OWNER_ENV } from "../../hud/reconcile.js";
|
|
17
17
|
import { readAllState } from "../../hud/state.js";
|
|
18
|
-
import { writePage } from "../../wiki/storage.js";
|
|
18
|
+
import { getLegacyWikiDir, serializePage, writePage } from "../../wiki/storage.js";
|
|
19
19
|
import { WIKI_SCHEMA_VERSION } from "../../wiki/types.js";
|
|
20
20
|
function nativeHookScriptPath() {
|
|
21
21
|
return join(process.cwd(), "dist", "scripts", "codex-native-hook.js");
|
|
@@ -859,6 +859,61 @@ describe("codex native hook dispatch", () => {
|
|
|
859
859
|
await rm(cwd, { recursive: true, force: true });
|
|
860
860
|
}
|
|
861
861
|
});
|
|
862
|
+
it("prefers repository project-memory.json during SessionStart while preserving legacy wiki guidance", async () => {
|
|
863
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-session-root-memory-legacy-wiki-"));
|
|
864
|
+
try {
|
|
865
|
+
const now = new Date().toISOString();
|
|
866
|
+
const legacyWikiDir = getLegacyWikiDir(cwd);
|
|
867
|
+
await mkdir(legacyWikiDir, { recursive: true });
|
|
868
|
+
await writeFile(join(legacyWikiDir, "legacy.md"), serializePage({
|
|
869
|
+
filename: "legacy.md",
|
|
870
|
+
frontmatter: {
|
|
871
|
+
title: "Legacy",
|
|
872
|
+
tags: ["legacy"],
|
|
873
|
+
created: now,
|
|
874
|
+
updated: now,
|
|
875
|
+
sources: [],
|
|
876
|
+
links: [],
|
|
877
|
+
category: "reference",
|
|
878
|
+
confidence: "medium",
|
|
879
|
+
schemaVersion: WIKI_SCHEMA_VERSION,
|
|
880
|
+
},
|
|
881
|
+
content: "\n# Legacy\n\nLegacy wiki context must remain visible.\n",
|
|
882
|
+
}));
|
|
883
|
+
await writeJson(join(cwd, ".omx", "project-memory.json"), {
|
|
884
|
+
techStack: "Legacy runtime memory should not win",
|
|
885
|
+
notes: [{ category: "legacy", content: "stale legacy note", timestamp: now }],
|
|
886
|
+
});
|
|
887
|
+
await writeJson(join(cwd, "project-memory.json"), {
|
|
888
|
+
techStack: "Canonical root memory",
|
|
889
|
+
build: "npm run build && node --test dist/scripts/__tests__/codex-native-hook.test.js",
|
|
890
|
+
conventions: "prefer repository-visible project memory at startup",
|
|
891
|
+
directives: [
|
|
892
|
+
{ directive: "Load root project-memory.json before legacy .omx memory.", priority: "high", timestamp: now },
|
|
893
|
+
],
|
|
894
|
+
notes: [
|
|
895
|
+
{ category: "issue", content: "Regression fixture for issue #2273.", timestamp: now },
|
|
896
|
+
],
|
|
897
|
+
});
|
|
898
|
+
const result = await dispatchCodexNativeHook({
|
|
899
|
+
hook_event_name: "SessionStart",
|
|
900
|
+
cwd,
|
|
901
|
+
session_id: "sess-root-memory-legacy-wiki",
|
|
902
|
+
}, { cwd, sessionOwnerPid: 43210 });
|
|
903
|
+
const additionalContext = String(result.outputJson?.hookSpecificOutput?.additionalContext ?? "");
|
|
904
|
+
assert.match(additionalContext, /\[Project memory\]/);
|
|
905
|
+
assert.match(additionalContext, /source: project-memory\.json/);
|
|
906
|
+
assert.match(additionalContext, /Canonical root memory/);
|
|
907
|
+
assert.match(additionalContext, /Load root project-memory\.json before legacy \.omx memory\./);
|
|
908
|
+
assert.match(additionalContext, /Regression fixture for issue #2273\./);
|
|
909
|
+
assert.doesNotMatch(additionalContext, /Legacy runtime memory should not win/);
|
|
910
|
+
assert.match(additionalContext, /legacy pages at \.omx\/wiki\//);
|
|
911
|
+
assert.match(additionalContext, /Legacy wiki fallback is read-only/);
|
|
912
|
+
}
|
|
913
|
+
finally {
|
|
914
|
+
await rm(cwd, { recursive: true, force: true });
|
|
915
|
+
}
|
|
916
|
+
});
|
|
862
917
|
it("starts a fresh native session without inheriting stale task-scoped context", async () => {
|
|
863
918
|
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-session-isolation-"));
|
|
864
919
|
try {
|
|
@@ -1085,6 +1140,33 @@ describe("codex native hook dispatch", () => {
|
|
|
1085
1140
|
await rm(root, { recursive: true, force: true });
|
|
1086
1141
|
}
|
|
1087
1142
|
});
|
|
1143
|
+
it("classifies only actionable goal completion wording", () => {
|
|
1144
|
+
const actionable = [
|
|
1145
|
+
"complete this goal now",
|
|
1146
|
+
"Performance goal complete; next call update_goal({status: \"complete\"}).",
|
|
1147
|
+
"get_goal returned a completed legacy goal, so ultragoal complete failed; marking complete now.",
|
|
1148
|
+
"omx ultragoal checkpoint --goal-id G001-demo --status complete --codex-goal-json goal.json",
|
|
1149
|
+
"Call update_goal({status: \"complete\"}) after verification.",
|
|
1150
|
+
"Goal complete.",
|
|
1151
|
+
"The goal is complete.",
|
|
1152
|
+
"Goal complete: verified with tests.",
|
|
1153
|
+
"Goal complete — verified with tests.",
|
|
1154
|
+
"The goal is complete: verified.",
|
|
1155
|
+
"The goal is complete — verified.",
|
|
1156
|
+
];
|
|
1157
|
+
const ordinary = [
|
|
1158
|
+
"my goal is to complete the migration without regressions",
|
|
1159
|
+
"Our goal is to finish this carefully after tests pass.",
|
|
1160
|
+
"The goal of this patch is to close a review gap.",
|
|
1161
|
+
"A goal can be complete only after a human review.",
|
|
1162
|
+
];
|
|
1163
|
+
for (const text of actionable) {
|
|
1164
|
+
assert.equal(looksLikeGoalCompletionPrompt(text), true, text);
|
|
1165
|
+
}
|
|
1166
|
+
for (const text of ordinary) {
|
|
1167
|
+
assert.equal(looksLikeGoalCompletionPrompt(text), false, text);
|
|
1168
|
+
}
|
|
1169
|
+
});
|
|
1088
1170
|
it("warns completion-like prompts when active goal workflows need Codex snapshot reconciliation", async () => {
|
|
1089
1171
|
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-goal-warning-"));
|
|
1090
1172
|
try {
|
|
@@ -1134,6 +1216,109 @@ describe("codex native hook dispatch", () => {
|
|
|
1134
1216
|
await rm(cwd, { recursive: true, force: true });
|
|
1135
1217
|
}
|
|
1136
1218
|
});
|
|
1219
|
+
it("blocks ultragoal Stop for concise generic goal completion claims", async () => {
|
|
1220
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-ultragoal-generic-complete-stop-"));
|
|
1221
|
+
try {
|
|
1222
|
+
await writeJson(join(cwd, ".omx", "ultragoal", "goals.json"), {
|
|
1223
|
+
version: 1,
|
|
1224
|
+
activeGoalId: "G001-demo",
|
|
1225
|
+
goals: [{ id: "G001-demo", status: "in_progress", objective: "Demo goal" }],
|
|
1226
|
+
});
|
|
1227
|
+
const result = await dispatchCodexNativeHook({
|
|
1228
|
+
hook_event_name: "Stop",
|
|
1229
|
+
cwd,
|
|
1230
|
+
session_id: "sess-ultragoal-generic-complete-stop",
|
|
1231
|
+
thread_id: "thread-ultragoal-generic-complete-stop",
|
|
1232
|
+
last_assistant_message: "Goal complete.",
|
|
1233
|
+
}, { cwd });
|
|
1234
|
+
assert.equal(result.outputJson?.decision, "block");
|
|
1235
|
+
assert.match(JSON.stringify(result.outputJson), /omx ultragoal checkpoint --goal-id G001-demo --status complete/);
|
|
1236
|
+
}
|
|
1237
|
+
finally {
|
|
1238
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1239
|
+
}
|
|
1240
|
+
});
|
|
1241
|
+
it("does not block ultragoal Stop for ordinary prose about a goal to complete work", async () => {
|
|
1242
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-ultragoal-ordinary-stop-"));
|
|
1243
|
+
try {
|
|
1244
|
+
await writeJson(join(cwd, ".omx", "ultragoal", "goals.json"), {
|
|
1245
|
+
version: 1,
|
|
1246
|
+
activeGoalId: "G001-demo",
|
|
1247
|
+
goals: [{ id: "G001-demo", status: "in_progress", objective: "Demo goal" }],
|
|
1248
|
+
});
|
|
1249
|
+
const result = await dispatchCodexNativeHook({
|
|
1250
|
+
hook_event_name: "Stop",
|
|
1251
|
+
cwd,
|
|
1252
|
+
session_id: "sess-ultragoal-ordinary-stop",
|
|
1253
|
+
thread_id: "thread-ultragoal-ordinary-stop",
|
|
1254
|
+
last_assistant_message: "My goal is to complete the migration without regressions, so I will keep testing.",
|
|
1255
|
+
}, { cwd });
|
|
1256
|
+
assert.notEqual(result.outputJson?.stopReason, "ultragoal_codex_goal_snapshot_required");
|
|
1257
|
+
assert.doesNotMatch(JSON.stringify(result.outputJson), /omx ultragoal checkpoint --goal-id G001-demo --status complete/);
|
|
1258
|
+
}
|
|
1259
|
+
finally {
|
|
1260
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1261
|
+
}
|
|
1262
|
+
});
|
|
1263
|
+
it("blocks ultragoal Stop with blocked checkpoint and fresh-thread remediation for completed legacy snapshots", async () => {
|
|
1264
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-ultragoal-legacy-stop-"));
|
|
1265
|
+
try {
|
|
1266
|
+
await writeJson(join(cwd, ".omx", "ultragoal", "goals.json"), {
|
|
1267
|
+
version: 1,
|
|
1268
|
+
activeGoalId: "G001-demo",
|
|
1269
|
+
goals: [{ id: "G001-demo", status: "in_progress", objective: "Demo goal" }],
|
|
1270
|
+
});
|
|
1271
|
+
const result = await dispatchCodexNativeHook({
|
|
1272
|
+
hook_event_name: "Stop",
|
|
1273
|
+
cwd,
|
|
1274
|
+
session_id: "sess-ultragoal-legacy-stop",
|
|
1275
|
+
thread_id: "thread-ultragoal-legacy-stop",
|
|
1276
|
+
last_assistant_message: "get_goal returned a completed legacy goal, so ultragoal complete failed; marking complete now.",
|
|
1277
|
+
}, { cwd });
|
|
1278
|
+
const output = JSON.stringify(result.outputJson);
|
|
1279
|
+
assert.equal(result.outputJson?.decision, "block");
|
|
1280
|
+
assert.match(output, /omx ultragoal checkpoint --goal-id G001-demo --status complete/);
|
|
1281
|
+
assert.match(output, /--status blocked/);
|
|
1282
|
+
assert.match(output, /fresh Codex thread/);
|
|
1283
|
+
assert.match(output, /Hooks must not mutate Codex goal state/);
|
|
1284
|
+
}
|
|
1285
|
+
finally {
|
|
1286
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1287
|
+
}
|
|
1288
|
+
});
|
|
1289
|
+
it("does not block ultragoal Stop after task-scoped reconciliation finishes exploded bookkeeping", async () => {
|
|
1290
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-ultragoal-reconciled-stop-"));
|
|
1291
|
+
try {
|
|
1292
|
+
await writeJson(join(cwd, ".omx", "ultragoal", "goals.json"), {
|
|
1293
|
+
version: 1,
|
|
1294
|
+
codexGoalMode: "aggregate",
|
|
1295
|
+
codexObjective: "Complete all ultragoal stories in .omx/ultragoal/goals.json: many micro goals",
|
|
1296
|
+
activeGoalId: "G001-micro",
|
|
1297
|
+
aggregateCompletion: {
|
|
1298
|
+
status: "complete",
|
|
1299
|
+
completedAt: "2026-05-04T10:04:00.000Z",
|
|
1300
|
+
evidence: "planned work done; validation complete; reviews clean",
|
|
1301
|
+
},
|
|
1302
|
+
goals: Array.from({ length: 136 }, (_, index) => ({
|
|
1303
|
+
id: `G${String(index + 1).padStart(3, "0")}-micro`,
|
|
1304
|
+
status: index === 0 ? "in_progress" : "pending",
|
|
1305
|
+
objective: `Synthetic slice ${index + 1}.`,
|
|
1306
|
+
})),
|
|
1307
|
+
});
|
|
1308
|
+
const result = await dispatchCodexNativeHook({
|
|
1309
|
+
hook_event_name: "Stop",
|
|
1310
|
+
cwd,
|
|
1311
|
+
session_id: "sess-ultragoal-reconciled-stop",
|
|
1312
|
+
thread_id: "thread-ultragoal-reconciled-stop",
|
|
1313
|
+
last_assistant_message: "Yes — planned implementation work is done; ultragoal bookkeeping reconciled complete.",
|
|
1314
|
+
}, { cwd });
|
|
1315
|
+
assert.notEqual(result.outputJson?.stopReason, "ultragoal_codex_goal_snapshot_required");
|
|
1316
|
+
assert.doesNotMatch(JSON.stringify(result.outputJson), /omx ultragoal checkpoint --goal-id/);
|
|
1317
|
+
}
|
|
1318
|
+
finally {
|
|
1319
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1320
|
+
}
|
|
1321
|
+
});
|
|
1137
1322
|
it("does not block Stop for non-passing autoresearch-goal professor-critic verdicts", async () => {
|
|
1138
1323
|
for (const verdict of ["blocked", "fail", "failed"]) {
|
|
1139
1324
|
const cwd = await mkdtemp(join(tmpdir(), `omx-native-hook-autoresearch-${verdict}-stop-`));
|