oh-my-codex 0.16.4 → 0.17.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.
Files changed (278) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/dist/catalog/__tests__/generator.test.js +2 -0
  4. package/dist/catalog/__tests__/generator.test.js.map +1 -1
  5. package/dist/cli/__tests__/doctor-warning-copy.test.js +80 -7
  6. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  7. package/dist/cli/__tests__/index.test.js +17 -11
  8. package/dist/cli/__tests__/index.test.js.map +1 -1
  9. package/dist/cli/__tests__/mcp-serve.test.js +4 -0
  10. package/dist/cli/__tests__/mcp-serve.test.js.map +1 -1
  11. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +3 -0
  12. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  13. package/dist/cli/__tests__/ralph.test.js +0 -124
  14. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  15. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js +8 -3
  16. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js.map +1 -1
  17. package/dist/cli/__tests__/setup-install-mode.test.js +183 -4
  18. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  19. package/dist/cli/__tests__/setup-refresh.test.js +3 -3
  20. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  21. package/dist/cli/__tests__/team.test.js +166 -42
  22. package/dist/cli/__tests__/team.test.js.map +1 -1
  23. package/dist/cli/__tests__/ultragoal.test.js +22 -0
  24. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  25. package/dist/cli/doctor.d.ts.map +1 -1
  26. package/dist/cli/doctor.js +75 -14
  27. package/dist/cli/doctor.js.map +1 -1
  28. package/dist/cli/index.d.ts +8 -2
  29. package/dist/cli/index.d.ts.map +1 -1
  30. package/dist/cli/index.js +17 -7
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/cli/mcp-serve.d.ts.map +1 -1
  33. package/dist/cli/mcp-serve.js +4 -0
  34. package/dist/cli/mcp-serve.js.map +1 -1
  35. package/dist/cli/plugin-marketplace.d.ts +25 -1
  36. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  37. package/dist/cli/plugin-marketplace.js +146 -3
  38. package/dist/cli/plugin-marketplace.js.map +1 -1
  39. package/dist/cli/question.d.ts +1 -1
  40. package/dist/cli/question.d.ts.map +1 -1
  41. package/dist/cli/question.js +98 -4
  42. package/dist/cli/question.js.map +1 -1
  43. package/dist/cli/ralph.d.ts.map +1 -1
  44. package/dist/cli/ralph.js +1 -49
  45. package/dist/cli/ralph.js.map +1 -1
  46. package/dist/cli/setup.d.ts +1 -0
  47. package/dist/cli/setup.d.ts.map +1 -1
  48. package/dist/cli/setup.js +103 -18
  49. package/dist/cli/setup.js.map +1 -1
  50. package/dist/cli/team.d.ts.map +1 -1
  51. package/dist/cli/team.js +21 -29
  52. package/dist/cli/team.js.map +1 -1
  53. package/dist/cli/ultragoal.d.ts.map +1 -1
  54. package/dist/cli/ultragoal.js +7 -1
  55. package/dist/cli/ultragoal.js.map +1 -1
  56. package/dist/config/__tests__/codex-hooks.test.js +136 -9
  57. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  58. package/dist/config/__tests__/generator-idempotent.test.js +15 -0
  59. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  60. package/dist/config/codex-hooks.d.ts +13 -14
  61. package/dist/config/codex-hooks.d.ts.map +1 -1
  62. package/dist/config/codex-hooks.js +85 -7
  63. package/dist/config/codex-hooks.js.map +1 -1
  64. package/dist/config/generator.d.ts +8 -1
  65. package/dist/config/generator.d.ts.map +1 -1
  66. package/dist/config/generator.js +73 -9
  67. package/dist/config/generator.js.map +1 -1
  68. package/dist/config/omx-first-party-mcp.d.ts.map +1 -1
  69. package/dist/config/omx-first-party-mcp.js +7 -0
  70. package/dist/config/omx-first-party-mcp.js.map +1 -1
  71. package/dist/hooks/__tests__/agents-overlay.test.js +29 -0
  72. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  73. package/dist/hooks/__tests__/design-skill.test.d.ts +2 -0
  74. package/dist/hooks/__tests__/design-skill.test.d.ts.map +1 -0
  75. package/dist/hooks/__tests__/design-skill.test.js +55 -0
  76. package/dist/hooks/__tests__/design-skill.test.js.map +1 -0
  77. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +265 -0
  78. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  79. package/dist/hooks/__tests__/session.test.js +126 -1
  80. package/dist/hooks/__tests__/session.test.js.map +1 -1
  81. package/dist/hooks/__tests__/skill-catalog-hygiene.test.js +1 -1
  82. package/dist/hooks/__tests__/skill-catalog-hygiene.test.js.map +1 -1
  83. package/dist/hooks/__tests__/skill-guidance-contract.test.js +41 -0
  84. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
  85. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  86. package/dist/hooks/agents-overlay.js +6 -3
  87. package/dist/hooks/agents-overlay.js.map +1 -1
  88. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  89. package/dist/hooks/keyword-detector.js +5 -1
  90. package/dist/hooks/keyword-detector.js.map +1 -1
  91. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  92. package/dist/hooks/keyword-registry.js +2 -0
  93. package/dist/hooks/keyword-registry.js.map +1 -1
  94. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  95. package/dist/hooks/prompt-guidance-contract.js +47 -2
  96. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  97. package/dist/hooks/session.d.ts +11 -3
  98. package/dist/hooks/session.d.ts.map +1 -1
  99. package/dist/hooks/session.js +68 -6
  100. package/dist/hooks/session.js.map +1 -1
  101. package/dist/hud/__tests__/reconcile.test.js +63 -0
  102. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  103. package/dist/hud/__tests__/tmux.test.d.ts +2 -0
  104. package/dist/hud/__tests__/tmux.test.d.ts.map +1 -0
  105. package/dist/hud/__tests__/tmux.test.js +92 -0
  106. package/dist/hud/__tests__/tmux.test.js.map +1 -0
  107. package/dist/hud/reconcile.d.ts +2 -0
  108. package/dist/hud/reconcile.d.ts.map +1 -1
  109. package/dist/hud/reconcile.js +14 -1
  110. package/dist/hud/reconcile.js.map +1 -1
  111. package/dist/hud/tmux.d.ts +12 -0
  112. package/dist/hud/tmux.d.ts.map +1 -1
  113. package/dist/hud/tmux.js +88 -0
  114. package/dist/hud/tmux.js.map +1 -1
  115. package/dist/mcp/__tests__/bootstrap.test.js +3 -0
  116. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  117. package/dist/mcp/__tests__/hermes-bridge.test.d.ts +2 -0
  118. package/dist/mcp/__tests__/hermes-bridge.test.d.ts.map +1 -0
  119. package/dist/mcp/__tests__/hermes-bridge.test.js +441 -0
  120. package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -0
  121. package/dist/mcp/__tests__/state-paths.test.js +96 -13
  122. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  123. package/dist/mcp/bootstrap.d.ts +1 -1
  124. package/dist/mcp/bootstrap.d.ts.map +1 -1
  125. package/dist/mcp/bootstrap.js +2 -0
  126. package/dist/mcp/bootstrap.js.map +1 -1
  127. package/dist/mcp/hermes-bridge.d.ts +111 -0
  128. package/dist/mcp/hermes-bridge.d.ts.map +1 -0
  129. package/dist/mcp/hermes-bridge.js +474 -0
  130. package/dist/mcp/hermes-bridge.js.map +1 -0
  131. package/dist/mcp/hermes-server.d.ts +374 -0
  132. package/dist/mcp/hermes-server.d.ts.map +1 -0
  133. package/dist/mcp/hermes-server.js +158 -0
  134. package/dist/mcp/hermes-server.js.map +1 -0
  135. package/dist/mcp/state-paths.d.ts.map +1 -1
  136. package/dist/mcp/state-paths.js +41 -9
  137. package/dist/mcp/state-paths.js.map +1 -1
  138. package/dist/modes/__tests__/base-tmux-pane.test.js +31 -1
  139. package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
  140. package/dist/pipeline/__tests__/stages.test.js +18 -9
  141. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  142. package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
  143. package/dist/pipeline/stages/team-exec.js +2 -7
  144. package/dist/pipeline/stages/team-exec.js.map +1 -1
  145. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js +111 -269
  146. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js.map +1 -1
  147. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.js +31 -72
  148. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.js.map +1 -1
  149. package/dist/planning/__tests__/artifacts.test.js +27 -372
  150. package/dist/planning/__tests__/artifacts.test.js.map +1 -1
  151. package/dist/planning/artifacts.d.ts +1 -14
  152. package/dist/planning/artifacts.d.ts.map +1 -1
  153. package/dist/planning/artifacts.js +11 -31
  154. package/dist/planning/artifacts.js.map +1 -1
  155. package/dist/question/__tests__/state.test.js +287 -1
  156. package/dist/question/__tests__/state.test.js.map +1 -1
  157. package/dist/question/__tests__/ui.test.js +8 -8
  158. package/dist/question/__tests__/ui.test.js.map +1 -1
  159. package/dist/question/events.d.ts +53 -0
  160. package/dist/question/events.d.ts.map +1 -0
  161. package/dist/question/events.js +201 -0
  162. package/dist/question/events.js.map +1 -0
  163. package/dist/question/state.d.ts +25 -1
  164. package/dist/question/state.d.ts.map +1 -1
  165. package/dist/question/state.js +259 -3
  166. package/dist/question/state.js.map +1 -1
  167. package/dist/question/types.d.ts +1 -0
  168. package/dist/question/types.d.ts.map +1 -1
  169. package/dist/question/types.js.map +1 -1
  170. package/dist/question/ui.d.ts.map +1 -1
  171. package/dist/question/ui.js +1 -18
  172. package/dist/question/ui.js.map +1 -1
  173. package/dist/ralph/__tests__/completion-audit.test.js +39 -0
  174. package/dist/ralph/__tests__/completion-audit.test.js.map +1 -1
  175. package/dist/scripts/__tests__/codex-native-hook.test.js +298 -3
  176. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  177. package/dist/scripts/__tests__/run-test-files.test.js +22 -0
  178. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  179. package/dist/scripts/codex-native-hook.d.ts +1 -0
  180. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  181. package/dist/scripts/codex-native-hook.js +137 -18
  182. package/dist/scripts/codex-native-hook.js.map +1 -1
  183. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  184. package/dist/scripts/codex-native-pre-post.js +12 -6
  185. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  186. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  187. package/dist/scripts/notify-hook/tmux-injection.js +91 -2
  188. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  189. package/dist/scripts/run-test-files.js +12 -1
  190. package/dist/scripts/run-test-files.js.map +1 -1
  191. package/dist/state/mode-state-context.d.ts +2 -0
  192. package/dist/state/mode-state-context.d.ts.map +1 -1
  193. package/dist/state/mode-state-context.js +21 -0
  194. package/dist/state/mode-state-context.js.map +1 -1
  195. package/dist/team/__tests__/approved-execution.test.js +25 -24
  196. package/dist/team/__tests__/approved-execution.test.js.map +1 -1
  197. package/dist/team/__tests__/runtime.test.js +173 -26
  198. package/dist/team/__tests__/runtime.test.js.map +1 -1
  199. package/dist/team/__tests__/scaling.test.js +66 -17
  200. package/dist/team/__tests__/scaling.test.js.map +1 -1
  201. package/dist/team/__tests__/tmux-session.test.js +42 -0
  202. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  203. package/dist/team/__tests__/worker-bootstrap.test.js +205 -0
  204. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  205. package/dist/team/approved-execution.d.ts +13 -0
  206. package/dist/team/approved-execution.d.ts.map +1 -1
  207. package/dist/team/approved-execution.js +65 -30
  208. package/dist/team/approved-execution.js.map +1 -1
  209. package/dist/team/runtime.d.ts.map +1 -1
  210. package/dist/team/runtime.js +28 -24
  211. package/dist/team/runtime.js.map +1 -1
  212. package/dist/team/scaling.d.ts.map +1 -1
  213. package/dist/team/scaling.js +7 -8
  214. package/dist/team/scaling.js.map +1 -1
  215. package/dist/team/tmux-session.d.ts.map +1 -1
  216. package/dist/team/tmux-session.js +48 -2
  217. package/dist/team/tmux-session.js.map +1 -1
  218. package/dist/team/ultragoal-context.d.ts +35 -0
  219. package/dist/team/ultragoal-context.d.ts.map +1 -0
  220. package/dist/team/ultragoal-context.js +191 -0
  221. package/dist/team/ultragoal-context.js.map +1 -0
  222. package/dist/ultragoal/__tests__/artifacts.test.js +121 -0
  223. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  224. package/dist/ultragoal/__tests__/docs-contract.test.js +19 -0
  225. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  226. package/dist/ultragoal/artifacts.d.ts +9 -1
  227. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  228. package/dist/ultragoal/artifacts.js +105 -3
  229. package/dist/ultragoal/artifacts.js.map +1 -1
  230. package/dist/utils/__tests__/paths.test.js +31 -1
  231. package/dist/utils/__tests__/paths.test.js.map +1 -1
  232. package/dist/utils/paths.d.ts +6 -0
  233. package/dist/utils/paths.d.ts.map +1 -1
  234. package/dist/utils/paths.js +18 -0
  235. package/dist/utils/paths.js.map +1 -1
  236. package/dist/wiki/lifecycle.js +3 -3
  237. package/dist/wiki/lifecycle.js.map +1 -1
  238. package/package.json +1 -1
  239. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  240. package/plugins/oh-my-codex/.mcp.json +8 -0
  241. package/plugins/oh-my-codex/skills/design/SKILL.md +180 -0
  242. package/plugins/oh-my-codex/skills/plan/SKILL.md +3 -3
  243. package/plugins/oh-my-codex/skills/ralph/SKILL.md +2 -2
  244. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +1 -1
  245. package/plugins/oh-my-codex/skills/skill/SKILL.md +2 -1
  246. package/plugins/oh-my-codex/skills/team/SKILL.md +6 -0
  247. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +11 -0
  248. package/plugins/oh-my-codex/skills/ultraqa/SKILL.md +161 -47
  249. package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +2 -2
  250. package/skills/design/SKILL.md +180 -0
  251. package/skills/frontend-ui-ux/SKILL.md +6 -2
  252. package/skills/plan/SKILL.md +3 -3
  253. package/skills/ralph/SKILL.md +2 -2
  254. package/skills/ralplan/SKILL.md +1 -1
  255. package/skills/skill/SKILL.md +2 -1
  256. package/skills/team/SKILL.md +6 -0
  257. package/skills/ultragoal/SKILL.md +11 -0
  258. package/skills/ultraqa/SKILL.md +161 -47
  259. package/skills/visual-ralph/SKILL.md +2 -2
  260. package/src/scripts/__tests__/codex-native-hook.test.ts +339 -2
  261. package/src/scripts/__tests__/run-test-files.test.ts +32 -0
  262. package/src/scripts/codex-native-hook.ts +166 -20
  263. package/src/scripts/codex-native-pre-post.ts +12 -6
  264. package/src/scripts/notify-hook/tmux-injection.ts +110 -3
  265. package/src/scripts/run-test-files.ts +13 -2
  266. package/templates/catalog-manifest.json +9 -2
  267. package/dist/planning/__tests__/context-pack-status.test.d.ts +0 -2
  268. package/dist/planning/__tests__/context-pack-status.test.d.ts.map +0 -1
  269. package/dist/planning/__tests__/context-pack-status.test.js +0 -795
  270. package/dist/planning/__tests__/context-pack-status.test.js.map +0 -1
  271. package/dist/planning/__tests__/ready-context-pack-role-refs.test.d.ts +0 -2
  272. package/dist/planning/__tests__/ready-context-pack-role-refs.test.d.ts.map +0 -1
  273. package/dist/planning/__tests__/ready-context-pack-role-refs.test.js +0 -612
  274. package/dist/planning/__tests__/ready-context-pack-role-refs.test.js.map +0 -1
  275. package/dist/planning/context-pack-status.d.ts +0 -73
  276. package/dist/planning/context-pack-status.d.ts.map +0 -1
  277. package/dist/planning/context-pack-status.js +0 -745
  278. package/dist/planning/context-pack-status.js.map +0 -1
@@ -40,6 +40,28 @@ describe('run-test-files diagnostics', () => {
40
40
  rmSync(wd, { recursive: true, force: true });
41
41
  }
42
42
  });
43
+ it('can force-exit Node test runner after successful CI tests to avoid leaked-handle hangs', () => {
44
+ const wd = mkdtempSync(join(tmpdir(), 'omx-run-test-files-'));
45
+ try {
46
+ const testsDir = join(wd, '__tests__');
47
+ mkdirSync(testsDir, { recursive: true });
48
+ writeFileSync(join(testsDir, 'leaky-pass.test.js'), [
49
+ "import { test } from 'node:test';",
50
+ "test('passes but leaves an interval', () => { setInterval(() => {}, 1_000); });",
51
+ '',
52
+ ].join('\n'));
53
+ const withoutForceExit = runCompiledRunner(wd, { OMX_NODE_TEST_RUNNER_TIMEOUT_MS: '750' }, 2_000);
54
+ assert.notEqual(withoutForceExit.status, 0);
55
+ assert.match(withoutForceExit.stderr, /force exit disabled/);
56
+ assert.match(withoutForceExit.stderr, /did not exit normally|runner timeout 750ms/);
57
+ const withForceExit = runCompiledRunner(wd, { OMX_NODE_TEST_RUNNER_TIMEOUT_MS: '750', OMX_NODE_TEST_FORCE_EXIT: '1' }, 2_000);
58
+ assert.equal(withForceExit.status, 0, withForceExit.stderr || withForceExit.stdout);
59
+ assert.match(withForceExit.stderr, /force exit enabled/);
60
+ }
61
+ finally {
62
+ rmSync(wd, { recursive: true, force: true });
63
+ }
64
+ });
43
65
  it('logs that per-test timeout is disabled by default', () => {
44
66
  const wd = mkdtempSync(join(tmpdir(), 'omx-run-test-files-'));
45
67
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"run-test-files.test.js","sourceRoot":"","sources":["../../../src/scripts/__tests__/run-test-files.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-test-files.test.js","sourceRoot":"","sources":["../../../src/scripts/__tests__/run-test-files.test.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ export declare function resolveSessionOwnerPidFromAncestry(startPid: number, opt
18
18
  readParentPid?: (pid: number) => number | null;
19
19
  readProcessCommand?: (pid: number) => string;
20
20
  }): number | null;
21
+ export declare function looksLikeGoalCompletionPrompt(text: string): boolean;
21
22
  export declare function dispatchCodexNativeHook(payload: CodexHookPayload, options?: NativeHookDispatchOptions): Promise<NativeHookDispatchResult>;
22
23
  export declare function isCodexNativeHookMainModule(moduleUrl: string, argv1: string | undefined): boolean;
23
24
  export declare function runCodexNativeHookCli(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"codex-native-hook.d.ts","sourceRoot":"","sources":["../../src/scripts/codex-native-hook.ts"],"names":[],"mappings":"AAsCA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;AA4BtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AA6BlE,KAAK,kBAAkB,GACnB,cAAc,GACd,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,MAAM,CAAC;AAEX,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,UAAU,yBAAyB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6BAA6B,CAAC,EAAE,OAAO,2BAA2B,CAAC;CACpE;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C;AA6PD,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,kBAAkB,GAAG,IAAI,GACvC,MAAM,GAAG,IAAI,CAmBf;AA6XD,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC,GACL,MAAM,GAAG,IAAI,CAuBf;AAwkED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CAkQnC;AAOD,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAGT;AA2ED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuC3D"}
1
+ {"version":3,"file":"codex-native-hook.d.ts","sourceRoot":"","sources":["../../src/scripts/codex-native-hook.ts"],"names":[],"mappings":"AAsCA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;AA4BtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AA6BlE,KAAK,kBAAkB,GACnB,cAAc,GACd,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,MAAM,CAAC;AAEX,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,UAAU,yBAAyB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6BAA6B,CAAC,EAAE,OAAO,2BAA2B,CAAC;CACpE;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C;AAsQD,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,kBAAkB,GAAG,IAAI,GACvC,MAAM,GAAG,IAAI,CAmBf;AA6XD,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC,GACL,MAAM,GAAG,IAAI,CAuBf;AA83BD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMnE;AA60CD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CAkQnC;AAOD,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAGT;AA2ED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuC3D"}
@@ -9,7 +9,7 @@ import { readSubagentSessionSummary, recordSubagentTurnForSession, } from "../su
9
9
  import { resolveCanonicalTeamStateRoot, resolveWorkerNotifyTeamStateRootPath } from "../team/state-root.js";
10
10
  import { appendToLog, isSessionStateUsable, readSessionState, readUsableSessionState, reconcileNativeSessionStart, } from "../hooks/session.js";
11
11
  import { appendTeamEvent, readTeamLeaderAttention, readTeamManifestV2, readTeamPhase, writeTeamLeaderAttention, writeTeamPhase, } from "../team/state.js";
12
- import { omxNotepadPath, omxProjectMemoryPath } from "../utils/paths.js";
12
+ import { omxNotepadPath, resolveProjectMemoryPath } from "../utils/paths.js";
13
13
  import { findGitLayout } from "../utils/git-layout.js";
14
14
  import { getBaseStateDir, getStateFilePath, getStatePath } from "../mcp/state-paths.js";
15
15
  import { detectKeywords, detectPrimaryKeyword, recordSkillActivation, } from "../hooks/keyword-detector.js";
@@ -37,6 +37,9 @@ const SKILL_STOP_BLOCKERS = new Set(["ralplan"]);
37
37
  const TEAM_STOP_BLOCKING_TASK_STATUSES = new Set(["pending", "in_progress", "blocked"]);
38
38
  const TEAM_WORKER_TERMINAL_RUN_STATES = new Set(["done", "complete", "completed", "failed", "stopped", "cancelled"]);
39
39
  const NATIVE_STOP_STATE_FILE = "native-stop-state.json";
40
+ const ORDINARY_STOP_NO_PROGRESS_DEFAULT_MAX_REPEATS = 8;
41
+ const ORDINARY_STOP_NO_PROGRESS_DEFAULT_IDLE_MS = 10 * 60_000;
42
+ const ORDINARY_STOP_NO_PROGRESS_MAX_MESSAGE_LENGTH = 240;
40
43
  const STABLE_FINAL_RECOMMENDATION_PATTERNS = [
41
44
  /^\s*(?:launch|release|ship)-?ready\s*:\s*(?:yes|no)\b[^\n\r]*/im,
42
45
  /^\s*ready to release\s*:\s*(?:yes|no)\b[^\n\r]*/im,
@@ -63,6 +66,12 @@ function safeString(value) {
63
66
  function safeObject(value) {
64
67
  return value && typeof value === "object" ? value : {};
65
68
  }
69
+ function safeContextSnippet(value, maxLength = 300) {
70
+ const text = safeString(value).replace(/\s+/g, " ").trim();
71
+ if (text.length <= maxLength)
72
+ return text;
73
+ return `${text.slice(0, maxLength - 1).trimEnd()}…`;
74
+ }
66
75
  function readBoundedFirstLineSync(path) {
67
76
  const fd = openSync(path, "r");
68
77
  try {
@@ -874,14 +883,17 @@ async function buildSessionStartContext(cwd, sessionId, options = {}) {
874
883
  if (modeSummaries.length > 0) {
875
884
  sections.push(["[Active OMX modes]", ...modeSummaries].join("\n"));
876
885
  }
877
- const projectMemory = await readJsonIfExists(omxProjectMemoryPath(cwd));
878
- if (projectMemory) {
886
+ const projectMemoryPath = resolveProjectMemoryPath(cwd);
887
+ const projectMemory = projectMemoryPath ? await readJsonIfExists(projectMemoryPath) : null;
888
+ if (projectMemory && projectMemoryPath) {
879
889
  const directives = Array.isArray(projectMemory.directives) ? projectMemory.directives : [];
880
890
  const notes = Array.isArray(projectMemory.notes) ? projectMemory.notes : [];
881
- const techStack = safeString(projectMemory.techStack).trim();
882
- const conventions = safeString(projectMemory.conventions).trim();
883
- const build = safeString(projectMemory.build).trim();
891
+ const techStack = safeContextSnippet(projectMemory.techStack);
892
+ const conventions = safeContextSnippet(projectMemory.conventions);
893
+ const build = safeContextSnippet(projectMemory.build);
884
894
  const summary = [];
895
+ const relativeMemoryPath = relative(cwd, projectMemoryPath).replace(/\\/g, "/");
896
+ summary.push(`- source: ${relativeMemoryPath === "project-memory.json" ? "project-memory.json" : ".omx/project-memory.json"}`);
885
897
  if (techStack)
886
898
  summary.push(`- stack: ${techStack}`);
887
899
  if (conventions)
@@ -890,17 +902,17 @@ async function buildSessionStartContext(cwd, sessionId, options = {}) {
890
902
  summary.push(`- build: ${build}`);
891
903
  if (directives.length > 0) {
892
904
  const firstDirective = directives[0];
893
- const directive = safeString(firstDirective.directive).trim();
905
+ const directive = safeContextSnippet(firstDirective.directive);
894
906
  if (directive)
895
907
  summary.push(`- directive: ${directive}`);
896
908
  }
897
909
  if (notes.length > 0) {
898
910
  const firstNote = notes[0];
899
- const note = safeString(firstNote.content).trim();
911
+ const note = safeContextSnippet(firstNote.content);
900
912
  if (note)
901
913
  summary.push(`- note: ${note}`);
902
914
  }
903
- if (summary.length > 0) {
915
+ if (summary.length > 1) {
904
916
  sections.push(["[Project memory]", ...summary].join("\n"));
905
917
  }
906
918
  }
@@ -1340,19 +1352,32 @@ async function buildModeBasedStopOutput(mode, cwd, sessionId) {
1340
1352
  systemMessage: `OMX ${mode} is still active (phase: ${phase}).`,
1341
1353
  };
1342
1354
  }
1343
- function looksLikeGoalCompletionPrompt(text) {
1344
- return /\b(?:complete|checkpoint|finish|close|mark)\b.{0,80}\b(?:goal|ultragoal|performance-goal|autoresearch-goal)\b/i.test(text)
1345
- || /\bupdate_goal\s*\(/i.test(text)
1346
- || /\bomx\s+(?:ultragoal|performance-goal|autoresearch-goal)\s+(?:checkpoint|complete)\b/i.test(text);
1355
+ export function looksLikeGoalCompletionPrompt(text) {
1356
+ return /\bupdate_goal\s*\(/i.test(text)
1357
+ || /\bomx\s+(?:ultragoal|performance-goal|autoresearch-goal)\s+(?:checkpoint|complete)\b/i.test(text)
1358
+ || /\b(?:complete|checkpoint|finish|close|mark)\b.{0,80}\b(?:goal|ultragoal|performance[-\s]goal|autoresearch[-\s]goal)\b/i.test(text)
1359
+ || /\b(?:ultragoal|performance[-\s]goal|autoresearch[-\s]goal)\b.{0,80}\b(?:complete|checkpoint|finish|close|mark)\b/i.test(text)
1360
+ || /(?:^|[.!?]\s+)(?:the\s+)?goal\s+(?:is\s+|now\s+|has\s+been\s+)?(?:complete|completed|finished|closed)(?:\s*(?:[.!?]|$)|\s*[:;]\s*\S|\s*[—–-]\s*\S)/i.test(text);
1347
1361
  }
1348
1362
  async function findActiveGoalWorkflowReconciliationRequirement(cwd) {
1349
1363
  const ultragoal = await readJsonIfExists(join(cwd, ".omx", "ultragoal", "goals.json"));
1364
+ const aggregateCompletion = safeObject(ultragoal?.aggregateCompletion);
1365
+ const aggregateProductComplete = safeString(aggregateCompletion.status) === "complete";
1350
1366
  const ultragoals = Array.isArray(ultragoal?.goals) ? ultragoal.goals.map(safeObject) : [];
1351
- const activeUltragoal = ultragoals.find((goal) => safeString(goal.status) === "in_progress" || safeString(goal.id) === safeString(ultragoal?.activeGoalId));
1367
+ const activeUltragoal = aggregateProductComplete
1368
+ ? undefined
1369
+ : ultragoals.find((goal) => safeString(goal.status) === "in_progress" || safeString(goal.id) === safeString(ultragoal?.activeGoalId));
1352
1370
  if (activeUltragoal) {
1371
+ const goalId = safeString(activeUltragoal.id) || "<goal-id>";
1353
1372
  return {
1354
1373
  workflow: "ultragoal",
1355
- command: `omx ultragoal checkpoint --goal-id ${safeString(activeUltragoal.id) || "<goal-id>"} --status complete --codex-goal-json '<get_goal JSON or path>' --evidence '<evidence>'`,
1374
+ command: `omx ultragoal checkpoint --goal-id ${goalId} --status complete --codex-goal-json '<get_goal JSON or path>' --evidence '<evidence>'`,
1375
+ remediation: [
1376
+ `If get_goal returns a completed task-scoped objective for the same aggregate ultragoal plan, checkpoint ${goalId} with evidence naming ${goalId} plus .omx/ultragoal/goals.json or ledger.jsonl and pass final quality-gate JSON; OMX will reconcile the completed planned scope without mutating Codex goal state.`,
1377
+ `If get_goal instead returns a different completed legacy objective and complete checkpointing fails, do not repeat --status complete in this thread.`,
1378
+ `Record the non-terminal blocker with: omx ultragoal checkpoint --goal-id ${goalId} --status blocked --codex-goal-json '<different completed get_goal JSON or path>' --evidence '<completed legacy Codex goal blocks create_goal in this thread>'.`,
1379
+ "Then continue this ultragoal from a fresh Codex thread in the same repo/worktree and create the intended goal there.",
1380
+ ].join(" "),
1356
1381
  };
1357
1382
  }
1358
1383
  const performanceRoot = join(cwd, ".omx", "goals", "performance");
@@ -1396,7 +1421,8 @@ async function buildGoalWorkflowReconciliationPromptWarning(cwd, prompt) {
1396
1421
  `OMX ${requirement.workflow} goal workflow requires Codex goal snapshot reconciliation before completion.`,
1397
1422
  "Call get_goal, pass the resulting JSON or a path with --codex-goal-json, and do not rely on hooks or shell commands to mutate Codex-owned goal state.",
1398
1423
  `Required command shape: ${requirement.command}.`,
1399
- ].join(" ");
1424
+ requirement.remediation,
1425
+ ].filter(Boolean).join(" ");
1400
1426
  }
1401
1427
  async function buildGoalWorkflowReconciliationStopOutput(payload, cwd) {
1402
1428
  const lastAssistantMessage = safeString(payload.last_assistant_message ?? payload.lastAssistantMessage);
@@ -1405,7 +1431,11 @@ async function buildGoalWorkflowReconciliationStopOutput(payload, cwd) {
1405
1431
  const requirement = await findActiveGoalWorkflowReconciliationRequirement(cwd);
1406
1432
  if (!requirement)
1407
1433
  return null;
1408
- const systemMessage = `OMX ${requirement.workflow} requires get_goal snapshot reconciliation before completion; call get_goal and pass --codex-goal-json to ${requirement.command}. Hooks must not mutate Codex goal state.`;
1434
+ const systemMessage = [
1435
+ `OMX ${requirement.workflow} requires get_goal snapshot reconciliation before completion; call get_goal and pass --codex-goal-json to ${requirement.command}.`,
1436
+ requirement.remediation,
1437
+ "Hooks must not mutate Codex goal state.",
1438
+ ].filter(Boolean).join(" ");
1409
1439
  return {
1410
1440
  decision: "block",
1411
1441
  reason: systemMessage,
@@ -1831,6 +1861,85 @@ function readPreviousNativeStopSignature(state, sessionKey) {
1831
1861
  const sessionState = safeObject(sessions[sessionKey]);
1832
1862
  return safeString(sessionState.last_signature).trim();
1833
1863
  }
1864
+ function parseBoundedPositiveInteger(value, fallback) {
1865
+ const parsed = Math.trunc(Number(value));
1866
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
1867
+ }
1868
+ function parseBoundedNonNegativeInteger(value, fallback) {
1869
+ const parsed = Math.trunc(Number(value));
1870
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;
1871
+ }
1872
+ function normalizeOrdinaryStopProgressText(value) {
1873
+ return safeString(value)
1874
+ .replace(/\s+/g, " ")
1875
+ .trim()
1876
+ .toLowerCase();
1877
+ }
1878
+ function shortenOrdinaryStopProgressText(value) {
1879
+ const trimmed = value.replace(/\s+/g, " ").trim();
1880
+ if (trimmed.length <= ORDINARY_STOP_NO_PROGRESS_MAX_MESSAGE_LENGTH)
1881
+ return trimmed;
1882
+ return `${trimmed.slice(0, ORDINARY_STOP_NO_PROGRESS_MAX_MESSAGE_LENGTH - 1).trimEnd()}…`;
1883
+ }
1884
+ function ordinaryStopProgressFingerprint(payload) {
1885
+ const message = normalizeOrdinaryStopProgressText(payload.last_assistant_message ?? payload.lastAssistantMessage) || "<no assistant message>";
1886
+ const mode = normalizeOrdinaryStopProgressText(payload.mode) || "ordinary";
1887
+ return `${mode}|${message}`;
1888
+ }
1889
+ function readIsoTimeMs(value) {
1890
+ const parsed = Date.parse(safeString(value));
1891
+ return Number.isFinite(parsed) ? parsed : null;
1892
+ }
1893
+ async function maybeBuildOrdinaryStopNoProgressOutput(payload, stateDir, canonicalSessionId) {
1894
+ const statePath = join(stateDir, NATIVE_STOP_STATE_FILE);
1895
+ const state = await readJsonIfExists(statePath) ?? {};
1896
+ const sessions = safeObject(state.sessions);
1897
+ const sessionKey = readNativeStopSessionKey(payload, canonicalSessionId);
1898
+ const sessionState = safeObject(sessions[sessionKey]);
1899
+ const previousGuard = safeObject(sessionState.ordinary_no_progress_guard);
1900
+ const fingerprint = ordinaryStopProgressFingerprint(payload);
1901
+ const nowIso = new Date().toISOString();
1902
+ const previousFingerprint = safeString(previousGuard.fingerprint).trim();
1903
+ const sameFingerprint = previousFingerprint === fingerprint;
1904
+ const firstSeenAt = sameFingerprint
1905
+ ? safeString(previousGuard.first_seen_at).trim() || nowIso
1906
+ : nowIso;
1907
+ const repeatCount = sameFingerprint
1908
+ ? parseBoundedPositiveInteger(previousGuard.repeat_count, 1) + 1
1909
+ : 1;
1910
+ sessions[sessionKey] = {
1911
+ ...sessionState,
1912
+ ordinary_no_progress_guard: {
1913
+ fingerprint,
1914
+ first_seen_at: firstSeenAt,
1915
+ last_seen_at: nowIso,
1916
+ repeat_count: repeatCount,
1917
+ last_turn_id: readPayloadTurnId(payload) || null,
1918
+ last_thread_id: readPayloadThreadId(payload) || null,
1919
+ },
1920
+ };
1921
+ await mkdir(stateDir, { recursive: true });
1922
+ await writeFile(statePath, JSON.stringify({ ...state, sessions }, null, 2));
1923
+ const stopHookActive = payload.stop_hook_active === true || payload.stopHookActive === true;
1924
+ if (!stopHookActive)
1925
+ return null;
1926
+ const maxRepeats = parseBoundedPositiveInteger(process.env.OMX_NATIVE_STOP_NO_PROGRESS_MAX_REPEATS, ORDINARY_STOP_NO_PROGRESS_DEFAULT_MAX_REPEATS);
1927
+ const idleMs = parseBoundedNonNegativeInteger(process.env.OMX_NATIVE_STOP_NO_PROGRESS_IDLE_MS, ORDINARY_STOP_NO_PROGRESS_DEFAULT_IDLE_MS);
1928
+ const firstSeenMs = readIsoTimeMs(firstSeenAt) ?? Date.now();
1929
+ const elapsedMs = Math.max(0, Date.now() - firstSeenMs);
1930
+ if (repeatCount < maxRepeats || elapsedMs < idleMs)
1931
+ return null;
1932
+ const message = shortenOrdinaryStopProgressText(safeString(payload.last_assistant_message ?? payload.lastAssistantMessage) || "no assistant message recorded");
1933
+ const elapsedSeconds = Math.round(elapsedMs / 1000);
1934
+ const diagnostic = `OMX ordinary task no-progress guard triggered after ${repeatCount} repeated Stop-hook pass(es) over ~${elapsedSeconds}s with unchanged status: "${message}". ` +
1935
+ "Emit a concise diagnostic summary now: state the last concrete progress/evidence, whether the task is complete, blocked, failed, or needs missing information, and stop instead of continuing a vague working loop.";
1936
+ return {
1937
+ decision: "block",
1938
+ reason: diagnostic,
1939
+ stopReason: "ordinary_task_no_progress_guard",
1940
+ systemMessage: diagnostic,
1941
+ };
1942
+ }
1834
1943
  async function persistNativeStopSignature(stateDir, payload, signature, canonicalSessionId) {
1835
1944
  if (!signature)
1836
1945
  return;
@@ -2060,7 +2169,14 @@ async function buildStopHookOutput(payload, cwd, stateDir, options = {}) {
2060
2169
  if (ralphCompletionAuditBlock) {
2061
2170
  await reopenRalphCompletionAuditBlock(ralphCompletionAuditBlock);
2062
2171
  const blockingPath = formatStopStatePath(cwd, ralphCompletionAuditBlock.path);
2063
- const systemMessage = `OMX Ralph completion audit is missing required evidence (${ralphCompletionAuditBlock.reason}; state: ${blockingPath}); continue verification, record a prompt-to-artifact checklist plus verification evidence, and do not report complete yet.`;
2172
+ const systemMessage = [
2173
+ `OMX Ralph completion audit is missing required evidence (${ralphCompletionAuditBlock.reason}; state: ${blockingPath}).`,
2174
+ "Continue verification and do not report complete yet.",
2175
+ "Record machine-readable completion evidence before stopping:",
2176
+ "- either set state.completion_audit = { passed: true, prompt_to_artifact_checklist: [...], verification_evidence: [...] }",
2177
+ "- or set completion_audit_path / completion_audit_evidence_path to a repo-relative JSON file with those same fields.",
2178
+ "Markdown artifacts and flat top-level checklist/evidence fields are not accepted by the Ralph Stop gate.",
2179
+ ].join(" ");
2064
2180
  return await returnPersistentStopBlock(payload, stateDir, "ralph-completion-audit-stop", `${blockingPath}|${ralphCompletionAuditBlock.reason}`, {
2065
2181
  decision: "block",
2066
2182
  reason: systemMessage,
@@ -2146,6 +2262,9 @@ async function buildStopHookOutput(payload, cwd, stateDir, options = {}) {
2146
2262
  if (goalWorkflowStopOutput) {
2147
2263
  return await returnPersistentStopBlock(payload, stateDir, "goal-workflow-reconciliation-stop", safeString(goalWorkflowStopOutput.stopReason), goalWorkflowStopOutput, canonicalSessionId, { allowRepeatDuringStopHook: true });
2148
2264
  }
2265
+ const ordinaryNoProgressOutput = await maybeBuildOrdinaryStopNoProgressOutput(payload, stateDir, canonicalSessionId);
2266
+ if (ordinaryNoProgressOutput)
2267
+ return ordinaryNoProgressOutput;
2149
2268
  const autoNudgeConfig = await loadAutoNudgeConfig();
2150
2269
  const autoNudgePhase = await readStopAutoNudgePhase(cwd, stateDir, canonicalSessionId, threadId);
2151
2270
  if (autoNudgeConfig.enabled