oh-my-opencode 4.8.1 → 4.9.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 (509) hide show
  1. package/dist/agents/prometheus/system-prompt.d.ts +1 -1
  2. package/dist/agents/sisyphus/claude-fable-5.d.ts +19 -0
  3. package/dist/agents/sisyphus/claude-opus-4-7.d.ts +3 -1
  4. package/dist/agents/sisyphus/claude-opus-4-8.d.ts +19 -0
  5. package/dist/agents/sisyphus/index.d.ts +4 -0
  6. package/dist/agents/types.d.ts +2 -2
  7. package/dist/cli/doctor/checks/codex.d.ts +1 -0
  8. package/dist/cli/doctor/checks/dependencies.d.ts +2 -2
  9. package/dist/cli/doctor/checks/tools-gh.d.ts +8 -1
  10. package/dist/cli/doctor/index.d.ts +1 -0
  11. package/dist/cli/doctor/types.d.ts +2 -0
  12. package/dist/cli/index.js +1908 -787
  13. package/dist/cli/install-codex/codex-config-permissions.d.ts +1 -1
  14. package/dist/cli/install-codex/codex-config-plugins.d.ts +1 -0
  15. package/dist/cli/install-codex/codex-config-toml.d.ts +1 -0
  16. package/dist/cli/install-codex/codex-installer-bin-dir.d.ts +8 -0
  17. package/dist/cli/install-codex/install-codex.d.ts +1 -8
  18. package/dist/cli/install-codex/lsp-daemon-reaper.d.ts +5 -0
  19. package/dist/cli/sparkshell-condense.d.ts +10 -0
  20. package/dist/cli/sparkshell-parse.d.ts +3 -0
  21. package/dist/cli/sparkshell-session-context.d.ts +20 -0
  22. package/dist/cli/sparkshell-spark.d.ts +23 -0
  23. package/dist/cli/sparkshell.d.ts +8 -1
  24. package/dist/cli-node/index.js +92564 -0
  25. package/dist/config/schema/agent-names.d.ts +2 -0
  26. package/dist/config/schema/hooks.d.ts +0 -2
  27. package/dist/config/schema/keyword-detector.d.ts +0 -6
  28. package/dist/config/schema/oh-my-opencode-config.d.ts +2 -4
  29. package/dist/create-hooks.d.ts +0 -2
  30. package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
  31. package/dist/features/background-agent/parent-wake-flush-runner.d.ts +2 -0
  32. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -0
  33. package/dist/features/background-agent/parent-wake-session-history.d.ts +4 -0
  34. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -0
  35. package/dist/features/builtin-commands/templates/handoff.d.ts +1 -1
  36. package/dist/features/builtin-skills/index.d.ts +1 -1
  37. package/dist/features/builtin-skills/skills.d.ts +4 -0
  38. package/dist/features/opencode-runtime-skills/source-server.d.ts +16 -1
  39. package/dist/features/opencode-skill-loader/skill-definition-record.d.ts +2 -0
  40. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +2 -0
  41. package/dist/features/team-mode/types.d.ts +1 -0
  42. package/dist/features/tmux-subagent/failed-readiness-cache.d.ts +28 -0
  43. package/dist/features/tmux-subagent/manager.d.ts +1 -9
  44. package/dist/features/tmux-subagent/resolve-server-url.d.ts +3 -0
  45. package/dist/hooks/anthropic-context-window-limit-recovery/executor.d.ts +1 -1
  46. package/dist/hooks/index.d.ts +0 -1
  47. package/dist/hooks/keyword-detector/constants.d.ts +0 -4
  48. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +1 -1
  49. package/dist/index.js +9001 -1795
  50. package/dist/oh-my-opencode.schema.json +2 -4
  51. package/dist/plugin/chat-params.d.ts +1 -8
  52. package/dist/plugin/hooks/create-core-hooks.d.ts +0 -2
  53. package/dist/plugin/hooks/create-session-hooks.d.ts +0 -2
  54. package/dist/plugin/hooks/create-transform-hooks.d.ts +1 -2
  55. package/dist/plugin/messages-transform.d.ts +0 -1
  56. package/dist/shared/model-availability.d.ts +10 -2
  57. package/dist/shared/module-resolution-failure.d.ts +7 -0
  58. package/package.json +25 -18
  59. package/packages/ast-grep-mcp/dist/cli.js +2 -10
  60. package/packages/git-bash-mcp/dist/cli.js +11 -4
  61. package/packages/lsp-daemon/dist/cli.d.ts +2 -0
  62. package/packages/lsp-daemon/dist/cli.js +3711 -0
  63. package/packages/lsp-daemon/dist/daemon-client.d.ts +19 -0
  64. package/packages/lsp-daemon/dist/daemon-client.js +114 -0
  65. package/packages/lsp-daemon/dist/daemon-server.d.ts +12 -0
  66. package/packages/lsp-daemon/dist/daemon-server.js +106 -0
  67. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +21 -0
  68. package/packages/lsp-daemon/dist/ensure-daemon.js +97 -0
  69. package/packages/lsp-daemon/dist/index.d.ts +5 -0
  70. package/packages/lsp-daemon/dist/index.js +3573 -0
  71. package/packages/lsp-daemon/dist/lock.d.ts +7 -0
  72. package/packages/lsp-daemon/dist/lock.js +61 -0
  73. package/packages/lsp-daemon/dist/package.json +6 -0
  74. package/packages/lsp-daemon/dist/paths.d.ts +11 -0
  75. package/packages/lsp-daemon/dist/paths.js +49 -0
  76. package/packages/lsp-daemon/dist/proxy.d.ts +10 -0
  77. package/packages/lsp-daemon/dist/proxy.js +61 -0
  78. package/packages/lsp-daemon/dist/request-routing.d.ts +9 -0
  79. package/packages/lsp-daemon/dist/request-routing.js +44 -0
  80. package/packages/lsp-daemon/dist/run-daemon.d.ts +1 -0
  81. package/packages/lsp-daemon/dist/run-daemon.js +11 -0
  82. package/packages/lsp-daemon/dist/socket-jsonrpc.d.ts +5 -0
  83. package/packages/lsp-daemon/dist/socket-jsonrpc.js +25 -0
  84. package/packages/lsp-daemon/package.json +38 -0
  85. package/packages/lsp-tools-mcp/dist/cli.js +0 -0
  86. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +40 -17
  87. package/packages/lsp-tools-mcp/dist/lsp/client.js +11 -9
  88. package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +5 -5
  89. package/packages/lsp-tools-mcp/dist/lsp/directory-diagnostics.js +5 -3
  90. package/packages/lsp-tools-mcp/dist/lsp/effective-extension.d.ts +1 -0
  91. package/packages/lsp-tools-mcp/dist/lsp/effective-extension.js +8 -0
  92. package/packages/lsp-tools-mcp/dist/lsp/infer-extension.js +3 -2
  93. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.js +1 -0
  94. package/packages/lsp-tools-mcp/dist/lsp/server-definitions.js +12 -0
  95. package/packages/lsp-tools-mcp/dist/lsp/server-install-state.d.ts +12 -0
  96. package/packages/lsp-tools-mcp/dist/lsp/server-install-state.js +51 -0
  97. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +2 -1
  98. package/packages/lsp-tools-mcp/dist/request-context.d.ts +7 -0
  99. package/packages/lsp-tools-mcp/dist/request-context.js +14 -0
  100. package/packages/lsp-tools-mcp/dist/tools.js +44 -1
  101. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +46 -33
  102. package/packages/omo-codex/plugin/.mcp.json +1 -1
  103. package/packages/omo-codex/plugin/components/comment-checker/dist/apply-patch.d.ts +7 -0
  104. package/packages/omo-codex/plugin/components/comment-checker/dist/apply-patch.js +173 -0
  105. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.d.ts +2 -0
  106. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +10 -0
  107. package/packages/omo-codex/plugin/components/comment-checker/dist/codex-hook.d.ts +22 -0
  108. package/packages/omo-codex/plugin/components/comment-checker/dist/codex-hook.js +165 -0
  109. package/packages/omo-codex/plugin/components/comment-checker/dist/core-values.d.ts +1 -0
  110. package/packages/omo-codex/plugin/components/comment-checker/dist/core-values.js +1 -0
  111. package/packages/omo-codex/plugin/components/comment-checker/dist/core.d.ts +5 -0
  112. package/packages/omo-codex/plugin/components/comment-checker/dist/core.js +4 -0
  113. package/packages/omo-codex/plugin/components/comment-checker/dist/hook-input.d.ts +6 -0
  114. package/packages/omo-codex/plugin/components/comment-checker/dist/hook-input.js +10 -0
  115. package/packages/omo-codex/plugin/components/comment-checker/dist/record.d.ts +2 -0
  116. package/packages/omo-codex/plugin/components/comment-checker/dist/record.js +11 -0
  117. package/packages/omo-codex/plugin/components/comment-checker/dist/request-extractor.d.ts +3 -0
  118. package/packages/omo-codex/plugin/components/comment-checker/dist/request-extractor.js +104 -0
  119. package/packages/omo-codex/plugin/components/comment-checker/dist/runner.d.ts +26 -0
  120. package/packages/omo-codex/plugin/components/comment-checker/dist/runner.js +144 -0
  121. package/packages/omo-codex/plugin/components/comment-checker/dist/types.d.ts +43 -0
  122. package/packages/omo-codex/plugin/components/comment-checker/dist/types.js +1 -0
  123. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  124. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  125. package/packages/omo-codex/plugin/components/git-bash/dist/cli.d.ts +2 -0
  126. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +29 -0
  127. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.d.ts +28 -0
  128. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +137 -0
  129. package/packages/omo-codex/plugin/components/git-bash/dist/index.d.ts +1 -0
  130. package/packages/omo-codex/plugin/components/git-bash/dist/index.js +1 -0
  131. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  132. package/packages/omo-codex/plugin/components/git-bash/package.json +5 -2
  133. package/packages/omo-codex/plugin/components/lsp/.mcp.json +1 -1
  134. package/packages/omo-codex/plugin/components/lsp/dist/cli.d.ts +2 -0
  135. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +42 -0
  136. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook-cli.d.ts +2 -0
  137. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook-cli.js +40 -0
  138. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.d.ts +16 -0
  139. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.js +180 -0
  140. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.d.ts +12 -0
  141. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.js +95 -0
  142. package/packages/omo-codex/plugin/components/lsp/dist/mutated-file-paths.d.ts +6 -0
  143. package/packages/omo-codex/plugin/components/lsp/dist/mutated-file-paths.js +79 -0
  144. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  145. package/packages/omo-codex/plugin/components/lsp/package.json +7 -7
  146. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-daemon.mjs +68 -0
  147. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.mjs +45 -22
  148. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  149. package/packages/omo-codex/plugin/components/lsp/src/codex-hook-cli.ts +1 -1
  150. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +6 -2
  151. package/packages/omo-codex/plugin/components/lsp/src/lsp-session-state.ts +4 -0
  152. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +68 -0
  153. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +8 -20
  154. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +69 -96
  155. package/packages/omo-codex/plugin/components/rules/dist/cli.d.ts +2 -0
  156. package/packages/omo-codex/plugin/components/rules/dist/cli.js +118 -0
  157. package/packages/omo-codex/plugin/components/rules/dist/codex-hook-options.d.ts +5 -0
  158. package/packages/omo-codex/plugin/components/rules/dist/codex-hook-options.js +1 -0
  159. package/packages/omo-codex/plugin/components/rules/dist/codex-hook.d.ts +47 -0
  160. package/packages/omo-codex/plugin/components/rules/dist/codex-hook.js +127 -0
  161. package/packages/omo-codex/plugin/components/rules/dist/config.d.ts +2 -0
  162. package/packages/omo-codex/plugin/components/rules/dist/config.js +100 -0
  163. package/packages/omo-codex/plugin/components/rules/dist/context-pressure.d.ts +2 -0
  164. package/packages/omo-codex/plugin/components/rules/dist/context-pressure.js +26 -0
  165. package/packages/omo-codex/plugin/components/rules/dist/debug-log.d.ts +8 -0
  166. package/packages/omo-codex/plugin/components/rules/dist/debug-log.js +36 -0
  167. package/packages/omo-codex/plugin/components/rules/dist/dynamic-target-fingerprints.d.ts +7 -0
  168. package/packages/omo-codex/plugin/components/rules/dist/dynamic-target-fingerprints.js +65 -0
  169. package/packages/omo-codex/plugin/components/rules/dist/event-budget.d.ts +3 -0
  170. package/packages/omo-codex/plugin/components/rules/dist/event-budget.js +14 -0
  171. package/packages/omo-codex/plugin/components/rules/dist/hook-output.d.ts +2 -0
  172. package/packages/omo-codex/plugin/components/rules/dist/hook-output.js +24 -0
  173. package/packages/omo-codex/plugin/components/rules/dist/path-utils.d.ts +4 -0
  174. package/packages/omo-codex/plugin/components/rules/dist/path-utils.js +24 -0
  175. package/packages/omo-codex/plugin/components/rules/dist/persistent-cache.d.ts +13 -0
  176. package/packages/omo-codex/plugin/components/rules/dist/persistent-cache.js +172 -0
  177. package/packages/omo-codex/plugin/components/rules/dist/post-compact-budget.d.ts +6 -0
  178. package/packages/omo-codex/plugin/components/rules/dist/post-compact-budget.js +74 -0
  179. package/packages/omo-codex/plugin/components/rules/dist/post-compact-claim.d.ts +4 -0
  180. package/packages/omo-codex/plugin/components/rules/dist/post-compact-claim.js +6 -0
  181. package/packages/omo-codex/plugin/components/rules/dist/post-compact-directive.d.ts +1 -0
  182. package/packages/omo-codex/plugin/components/rules/dist/post-compact-directive.js +32 -0
  183. package/packages/omo-codex/plugin/components/rules/dist/post-compact-state.d.ts +13 -0
  184. package/packages/omo-codex/plugin/components/rules/dist/post-compact-state.js +29 -0
  185. package/packages/omo-codex/plugin/components/rules/dist/rules/cache.d.ts +9 -0
  186. package/packages/omo-codex/plugin/components/rules/dist/rules/cache.js +51 -0
  187. package/packages/omo-codex/plugin/components/rules/dist/rules/constants.d.ts +70 -0
  188. package/packages/omo-codex/plugin/components/rules/dist/rules/constants.js +101 -0
  189. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-cache.d.ts +5 -0
  190. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-cache.js +60 -0
  191. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-loader.d.ts +6 -0
  192. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-loader.js +61 -0
  193. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-loader.d.ts +7 -0
  194. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-loader.js +60 -0
  195. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-paths.d.ts +11 -0
  196. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-paths.js +75 -0
  197. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-static-loader.d.ts +6 -0
  198. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-static-loader.js +29 -0
  199. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-types.d.ts +44 -0
  200. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-types.js +1 -0
  201. package/packages/omo-codex/plugin/components/rules/dist/rules/engine.d.ts +5 -0
  202. package/packages/omo-codex/plugin/components/rules/dist/rules/engine.js +85 -0
  203. package/packages/omo-codex/plugin/components/rules/dist/rules/errors.d.ts +6 -0
  204. package/packages/omo-codex/plugin/components/rules/dist/rules/errors.js +12 -0
  205. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-cache.d.ts +14 -0
  206. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-cache.js +51 -0
  207. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-paths.d.ts +6 -0
  208. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-paths.js +33 -0
  209. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-sources.d.ts +5 -0
  210. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-sources.js +40 -0
  211. package/packages/omo-codex/plugin/components/rules/dist/rules/finder.d.ts +28 -0
  212. package/packages/omo-codex/plugin/components/rules/dist/rules/finder.js +146 -0
  213. package/packages/omo-codex/plugin/components/rules/dist/rules/formatter.d.ts +7 -0
  214. package/packages/omo-codex/plugin/components/rules/dist/rules/formatter.js +112 -0
  215. package/packages/omo-codex/plugin/components/rules/dist/rules/matcher.d.ts +18 -0
  216. package/packages/omo-codex/plugin/components/rules/dist/rules/matcher.js +93 -0
  217. package/packages/omo-codex/plugin/components/rules/dist/rules/ordering.d.ts +3 -0
  218. package/packages/omo-codex/plugin/components/rules/dist/rules/ordering.js +27 -0
  219. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-frontmatter.d.ts +7 -0
  220. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-frontmatter.js +30 -0
  221. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-yaml.d.ts +2 -0
  222. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-yaml.js +237 -0
  223. package/packages/omo-codex/plugin/components/rules/dist/rules/parser.d.ts +3 -0
  224. package/packages/omo-codex/plugin/components/rules/dist/rules/parser.js +31 -0
  225. package/packages/omo-codex/plugin/components/rules/dist/rules/plugin-root.d.ts +1 -0
  226. package/packages/omo-codex/plugin/components/rules/dist/rules/plugin-root.js +48 -0
  227. package/packages/omo-codex/plugin/components/rules/dist/rules/project-root.d.ts +1 -0
  228. package/packages/omo-codex/plugin/components/rules/dist/rules/project-root.js +23 -0
  229. package/packages/omo-codex/plugin/components/rules/dist/rules/scanner.d.ts +14 -0
  230. package/packages/omo-codex/plugin/components/rules/dist/rules/scanner.js +111 -0
  231. package/packages/omo-codex/plugin/components/rules/dist/rules/sources.d.ts +3 -0
  232. package/packages/omo-codex/plugin/components/rules/dist/rules/sources.js +9 -0
  233. package/packages/omo-codex/plugin/components/rules/dist/rules/truncator.d.ts +18 -0
  234. package/packages/omo-codex/plugin/components/rules/dist/rules/truncator.js +59 -0
  235. package/packages/omo-codex/plugin/components/rules/dist/rules/types.d.ts +126 -0
  236. package/packages/omo-codex/plugin/components/rules/dist/rules/types.js +8 -0
  237. package/packages/omo-codex/plugin/components/rules/dist/rules-engine-factory.d.ts +6 -0
  238. package/packages/omo-codex/plugin/components/rules/dist/rules-engine-factory.js +20 -0
  239. package/packages/omo-codex/plugin/components/rules/dist/session-state-lock.d.ts +3 -0
  240. package/packages/omo-codex/plugin/components/rules/dist/session-state-lock.js +41 -0
  241. package/packages/omo-codex/plugin/components/rules/dist/sparkshell-awareness.d.ts +10 -0
  242. package/packages/omo-codex/plugin/components/rules/dist/sparkshell-awareness.js +90 -0
  243. package/packages/omo-codex/plugin/components/rules/dist/static-injection.d.ts +3 -0
  244. package/packages/omo-codex/plugin/components/rules/dist/static-injection.js +128 -0
  245. package/packages/omo-codex/plugin/components/rules/dist/tool-paths.d.ts +6 -0
  246. package/packages/omo-codex/plugin/components/rules/dist/tool-paths.js +168 -0
  247. package/packages/omo-codex/plugin/components/rules/dist/transcript-rule-filter.d.ts +4 -0
  248. package/packages/omo-codex/plugin/components/rules/dist/transcript-rule-filter.js +49 -0
  249. package/packages/omo-codex/plugin/components/rules/dist/transcript-search.d.ts +4 -0
  250. package/packages/omo-codex/plugin/components/rules/dist/transcript-search.js +91 -0
  251. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  252. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  253. package/packages/omo-codex/plugin/components/rules/src/codex-hook.ts +4 -2
  254. package/packages/omo-codex/plugin/components/rules/src/config.ts +13 -0
  255. package/packages/omo-codex/plugin/components/rules/src/event-budget.ts +17 -0
  256. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +4 -1
  257. package/packages/omo-codex/plugin/components/rules/src/post-compact-directive.ts +39 -0
  258. package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +16 -0
  259. package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -0
  260. package/packages/omo-codex/plugin/components/rules/src/rules/types.ts +4 -0
  261. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +53 -4
  262. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +127 -7
  263. package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +9 -1
  264. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +4 -2
  265. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +7 -2
  266. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +9 -9
  267. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +10 -4
  268. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +241 -0
  269. package/packages/omo-codex/plugin/components/rules/test/event-budget.test.ts +168 -0
  270. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +4 -0
  271. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +86 -3
  272. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +15 -15
  273. package/packages/omo-codex/plugin/components/start-work-continuation/dist/boulder-reader.d.ts +16 -0
  274. package/packages/omo-codex/plugin/components/start-work-continuation/dist/boulder-reader.js +146 -0
  275. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.d.ts +2 -0
  276. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +49 -0
  277. package/packages/omo-codex/plugin/components/start-work-continuation/dist/codex-hook.d.ts +2 -0
  278. package/packages/omo-codex/plugin/components/start-work-continuation/dist/codex-hook.js +80 -0
  279. package/packages/omo-codex/plugin/components/start-work-continuation/dist/directive.d.ts +1 -0
  280. package/packages/omo-codex/plugin/components/start-work-continuation/dist/directive.js +2 -0
  281. package/packages/omo-codex/plugin/components/start-work-continuation/dist/index.d.ts +5 -0
  282. package/packages/omo-codex/plugin/components/start-work-continuation/dist/index.js +3 -0
  283. package/packages/omo-codex/plugin/components/start-work-continuation/dist/types.d.ts +20 -0
  284. package/packages/omo-codex/plugin/components/start-work-continuation/dist/types.js +1 -0
  285. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  286. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  287. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +24 -2
  288. package/packages/omo-codex/plugin/components/telemetry/dist/atomic-write.d.ts +1 -0
  289. package/packages/omo-codex/plugin/components/telemetry/dist/atomic-write.js +18 -0
  290. package/packages/omo-codex/plugin/components/telemetry/dist/cli.d.ts +2 -0
  291. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +62 -0
  292. package/packages/omo-codex/plugin/components/telemetry/dist/codex-hook.d.ts +15 -0
  293. package/packages/omo-codex/plugin/components/telemetry/dist/codex-hook.js +42 -0
  294. package/packages/omo-codex/plugin/components/telemetry/dist/data-path.d.ts +10 -0
  295. package/packages/omo-codex/plugin/components/telemetry/dist/data-path.js +35 -0
  296. package/packages/omo-codex/plugin/components/telemetry/dist/diagnostics.d.ts +12 -0
  297. package/packages/omo-codex/plugin/components/telemetry/dist/diagnostics.js +108 -0
  298. package/packages/omo-codex/plugin/components/telemetry/dist/env-flags.d.ts +4 -0
  299. package/packages/omo-codex/plugin/components/telemetry/dist/env-flags.js +31 -0
  300. package/packages/omo-codex/plugin/components/telemetry/dist/posthog-activity-state.d.ts +8 -0
  301. package/packages/omo-codex/plugin/components/telemetry/dist/posthog-activity-state.js +68 -0
  302. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.d.ts +21 -0
  303. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +133 -0
  304. package/packages/omo-codex/plugin/components/telemetry/dist/product-identity.d.ts +8 -0
  305. package/packages/omo-codex/plugin/components/telemetry/dist/product-identity.js +29 -0
  306. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  307. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  308. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +5 -13
  309. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +61 -185
  310. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  311. package/packages/omo-codex/plugin/components/ultrawork/directive.md +122 -117
  312. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.d.ts +2 -0
  313. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +48 -0
  314. package/packages/omo-codex/plugin/components/ultrawork/dist/codex-hook.d.ts +7 -0
  315. package/packages/omo-codex/plugin/components/ultrawork/dist/codex-hook.js +122 -0
  316. package/packages/omo-codex/plugin/components/ultrawork/dist/directive.d.ts +1 -0
  317. package/packages/omo-codex/plugin/components/ultrawork/dist/directive.js +2 -0
  318. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  319. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  320. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +20 -11
  321. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +17 -11
  322. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +2 -5
  323. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -71
  324. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +16 -0
  325. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +200 -0
  326. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.d.ts +17 -0
  327. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +97 -0
  328. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.d.ts +4 -0
  329. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +183 -0
  330. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +6 -0
  331. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +55 -0
  332. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.d.ts +12 -0
  333. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +145 -0
  334. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.d.ts +2 -0
  335. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +39 -0
  336. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +13 -0
  337. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +100 -0
  338. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +26 -0
  339. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +97 -0
  340. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +28 -0
  341. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +145 -0
  342. package/packages/omo-codex/plugin/components/ulw-loop/dist/command-types.d.ts +34 -0
  343. package/packages/omo-codex/plugin/components/ulw-loop/dist/command-types.js +1 -0
  344. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +16 -0
  345. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +41 -0
  346. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +95 -0
  347. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.js +1 -0
  348. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +31 -0
  349. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +119 -0
  350. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.d.ts +12 -0
  351. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.js +69 -0
  352. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +16 -0
  353. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +59 -0
  354. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +48 -0
  355. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +119 -0
  356. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +8 -0
  357. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +89 -0
  358. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +6 -0
  359. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +123 -0
  360. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +16 -0
  361. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +70 -0
  362. package/packages/omo-codex/plugin/components/ulw-loop/dist/runtime.d.ts +10 -0
  363. package/packages/omo-codex/plugin/components/ulw-loop/dist/runtime.js +13 -0
  364. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +63 -0
  365. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.js +1 -0
  366. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +6 -0
  367. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +292 -0
  368. package/packages/omo-codex/plugin/components/ulw-loop/dist/types.d.ts +5 -0
  369. package/packages/omo-codex/plugin/components/ulw-loop/dist/types.js +5 -0
  370. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +2 -2
  371. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  372. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -14
  373. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +24 -25
  374. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +17 -3
  375. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +2 -1
  376. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +1 -1
  377. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +95 -0
  378. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +0 -96
  379. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +23 -0
  380. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +46 -0
  381. package/packages/omo-codex/plugin/hooks/hooks.json +16 -16
  382. package/packages/omo-codex/plugin/package-lock.json +10 -9
  383. package/packages/omo-codex/plugin/package.json +27 -26
  384. package/packages/omo-codex/plugin/scripts/auto-update.mjs +64 -15
  385. package/packages/omo-codex/plugin/scripts/build-bundled-mcp-runtimes.mjs +16 -0
  386. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +82 -18
  387. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +2 -2
  388. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +23 -11
  389. package/packages/omo-codex/plugin/scripts/sync-version.mjs +94 -0
  390. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -9
  391. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +16 -1
  392. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +93 -0
  393. package/packages/omo-codex/plugin/skills/lcx-doctor/agents/openai.yaml +11 -0
  394. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +17 -13
  395. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +139 -0
  396. package/packages/omo-codex/plugin/skills/lsp-setup/references/bash/README.md +60 -0
  397. package/packages/omo-codex/plugin/skills/lsp-setup/references/c-cpp/README.md +61 -0
  398. package/packages/omo-codex/plugin/skills/lsp-setup/references/csharp/README.md +71 -0
  399. package/packages/omo-codex/plugin/skills/lsp-setup/references/dart/README.md +48 -0
  400. package/packages/omo-codex/plugin/skills/lsp-setup/references/elixir/README.md +51 -0
  401. package/packages/omo-codex/plugin/skills/lsp-setup/references/go/README.md +57 -0
  402. package/packages/omo-codex/plugin/skills/lsp-setup/references/haskell/README.md +57 -0
  403. package/packages/omo-codex/plugin/skills/lsp-setup/references/java/README.md +57 -0
  404. package/packages/omo-codex/plugin/skills/lsp-setup/references/julia/README.md +60 -0
  405. package/packages/omo-codex/plugin/skills/lsp-setup/references/kotlin/README.md +59 -0
  406. package/packages/omo-codex/plugin/skills/lsp-setup/references/lua/README.md +66 -0
  407. package/packages/omo-codex/plugin/skills/lsp-setup/references/php/README.md +62 -0
  408. package/packages/omo-codex/plugin/skills/lsp-setup/references/python/README.md +71 -0
  409. package/packages/omo-codex/plugin/skills/lsp-setup/references/ruby/README.md +53 -0
  410. package/packages/omo-codex/plugin/skills/lsp-setup/references/rust/README.md +59 -0
  411. package/packages/omo-codex/plugin/skills/lsp-setup/references/swift/README.md +51 -0
  412. package/packages/omo-codex/plugin/skills/lsp-setup/references/terraform/README.md +62 -0
  413. package/packages/omo-codex/plugin/skills/lsp-setup/references/typescript/README.md +77 -0
  414. package/packages/omo-codex/plugin/skills/lsp-setup/references/yaml/README.md +70 -0
  415. package/packages/omo-codex/plugin/skills/lsp-setup/references/zig/README.md +49 -0
  416. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/detect-lsp.ts +210 -0
  417. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/lsp-server-table.ts +177 -0
  418. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/tsconfig.json +17 -0
  419. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/verify-lsp.ts +147 -0
  420. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +9 -9
  421. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -10
  422. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +20 -22
  423. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +38 -61
  424. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +135 -677
  425. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -14
  426. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +24 -25
  427. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +20 -11
  428. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +17 -11
  429. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +9 -9
  430. package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +2 -1
  431. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +1 -1
  432. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +5 -5
  433. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +6 -6
  434. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +194 -0
  435. package/packages/omo-codex/plugin/test/auto-update.test.mjs +17 -0
  436. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +15 -44
  437. package/packages/omo-codex/plugin/test/lsp-prebuild-layouts.test.mjs +140 -0
  438. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +189 -7
  439. package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +9 -31
  440. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +68 -4
  441. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +119 -0
  442. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +11 -112
  443. package/packages/omo-codex/plugin/test/sync-version.test.mjs +68 -0
  444. package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +126 -0
  445. package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +2 -2
  446. package/packages/omo-codex/scripts/install/bin-dir.mjs +20 -0
  447. package/packages/omo-codex/scripts/install/bin-links.mjs +43 -6
  448. package/packages/omo-codex/scripts/install/cache.mjs +4 -0
  449. package/packages/omo-codex/scripts/install/config.mjs +4 -4
  450. package/packages/omo-codex/scripts/install/delegated-command.mjs +5 -1
  451. package/packages/omo-codex/scripts/install/git-bash-mcp-env.mjs +28 -0
  452. package/packages/omo-codex/scripts/install/git-bash.mjs +12 -4
  453. package/packages/omo-codex/scripts/install/git-bash.test.mjs +39 -4
  454. package/packages/omo-codex/scripts/install/hook-targets.mjs +46 -0
  455. package/packages/omo-codex/scripts/install/multi-agent-v2-config.mjs +12 -2
  456. package/packages/omo-codex/scripts/install/process.mjs +1 -0
  457. package/packages/omo-codex/scripts/install-bin-links.test.mjs +131 -3
  458. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +91 -0
  459. package/packages/omo-codex/scripts/install-config.test.mjs +50 -44
  460. package/packages/omo-codex/scripts/install-delegated-command.test.mjs +78 -0
  461. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +93 -0
  462. package/packages/omo-codex/scripts/install-hook-targets.test.mjs +100 -0
  463. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +3 -1
  464. package/packages/omo-codex/scripts/install-local.mjs +7 -18
  465. package/packages/omo-codex/scripts/install-local.test.mjs +34 -1
  466. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +16 -1
  467. package/packages/shared-skills/skills/lcx-doctor/SKILL.md +93 -0
  468. package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +11 -0
  469. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +17 -13
  470. package/packages/shared-skills/skills/lsp-setup/SKILL.md +139 -0
  471. package/packages/shared-skills/skills/lsp-setup/references/bash/README.md +60 -0
  472. package/packages/shared-skills/skills/lsp-setup/references/c-cpp/README.md +61 -0
  473. package/packages/shared-skills/skills/lsp-setup/references/csharp/README.md +71 -0
  474. package/packages/shared-skills/skills/lsp-setup/references/dart/README.md +48 -0
  475. package/packages/shared-skills/skills/lsp-setup/references/elixir/README.md +51 -0
  476. package/packages/shared-skills/skills/lsp-setup/references/go/README.md +57 -0
  477. package/packages/shared-skills/skills/lsp-setup/references/haskell/README.md +57 -0
  478. package/packages/shared-skills/skills/lsp-setup/references/java/README.md +57 -0
  479. package/packages/shared-skills/skills/lsp-setup/references/julia/README.md +60 -0
  480. package/packages/shared-skills/skills/lsp-setup/references/kotlin/README.md +59 -0
  481. package/packages/shared-skills/skills/lsp-setup/references/lua/README.md +66 -0
  482. package/packages/shared-skills/skills/lsp-setup/references/php/README.md +62 -0
  483. package/packages/shared-skills/skills/lsp-setup/references/python/README.md +71 -0
  484. package/packages/shared-skills/skills/lsp-setup/references/ruby/README.md +53 -0
  485. package/packages/shared-skills/skills/lsp-setup/references/rust/README.md +59 -0
  486. package/packages/shared-skills/skills/lsp-setup/references/swift/README.md +51 -0
  487. package/packages/shared-skills/skills/lsp-setup/references/terraform/README.md +62 -0
  488. package/packages/shared-skills/skills/lsp-setup/references/typescript/README.md +77 -0
  489. package/packages/shared-skills/skills/lsp-setup/references/yaml/README.md +70 -0
  490. package/packages/shared-skills/skills/lsp-setup/references/zig/README.md +49 -0
  491. package/packages/shared-skills/skills/lsp-setup/scripts/detect-lsp.ts +210 -0
  492. package/packages/shared-skills/skills/lsp-setup/scripts/lsp-server-table.ts +177 -0
  493. package/packages/shared-skills/skills/lsp-setup/scripts/tsconfig.json +17 -0
  494. package/packages/shared-skills/skills/lsp-setup/scripts/verify-lsp.ts +147 -0
  495. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  496. package/packages/shared-skills/skills/review-work/SKILL.md +10 -14
  497. package/packages/shared-skills/skills/start-work/SKILL.md +30 -59
  498. package/packages/shared-skills/skills/ultraresearch/SKILL.md +126 -667
  499. package/dist/hooks/anthropic-effort/hook.d.ts +0 -26
  500. package/dist/hooks/anthropic-effort/index.d.ts +0 -1
  501. package/dist/hooks/keyword-detector/analyze/default.d.ts +0 -12
  502. package/dist/hooks/keyword-detector/analyze/index.d.ts +0 -1
  503. package/dist/hooks/keyword-detector/search/default.d.ts +0 -12
  504. package/dist/hooks/keyword-detector/search/index.d.ts +0 -1
  505. package/dist/hooks/thinking-block-validator/hook.d.ts +0 -12
  506. package/dist/hooks/thinking-block-validator/index.d.ts +0 -1
  507. package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +0 -18
  508. package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +0 -29
  509. package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +0 -151
@@ -11,19 +11,40 @@ narration.
11
11
 
12
12
  # Goal
13
13
  Deliver EXACTLY what the user asked, end-to-end working, proven by
14
- (a) a test written test-first that went RED→GREEN and (b) a manual-QA
15
- scenario you actually run against the real surface (HTTP call / tmux /
16
- browser use / computer use see the channel table below) with the
17
- artifact captured. Both gates, every change, no exceptions.
18
- TESTS ALONE NEVER PROVE DONE. A green suite means the unit-level
19
- contract holds; it does NOT mean the user-facing feature works. Every
20
- criterion needs its own real-usage scenario, built fresh and exercised
21
- through one of the four channels, every time.
22
-
23
- # Manual-QA channels (PICK ONE PER CRITERION — ACTUALLY RUN IT)
24
- For every criterion, build a real-usage scenario through ONE of these
25
- four channels and run it yourself before declaring the criterion done.
26
- The full test suite being green is NEVER verification on its own.
14
+ captured evidence: a failing-first proof that went RED→GREEN through
15
+ the cheapest faithful channel, plus real-surface proof sized by the
16
+ tier below. TESTS ALONE NEVER PROVE DONE a green suite means the
17
+ unit-level contract holds, not that the user-facing behavior works.
18
+
19
+ # Tier triage (classify ONCE at bootstrap; record tier + one-line
20
+ justification in the notepad; ratchet up only)
21
+ Default is LIGHT. Take HEAVY only when the change set hits a fact you
22
+ can point to: a new module / layer / domain model / abstraction;
23
+ auth, security, session, or permissions; an external integration
24
+ (API, queue, payment, webhook); a DB schema or migration; concurrency,
25
+ transaction boundaries, or cache invalidation; a refactor crossing
26
+ domain boundaries; or the user signaled care ("carefully",
27
+ "thoroughly", "design first") or demanded review.
28
+ When unsure, take HEAVY. If a HEAVY fact surfaces mid-task, upgrade
29
+ immediately and redo whatever the LIGHT path skipped; never downgrade
30
+ mid-task. The tier sizes process, never honesty: both tiers capture
31
+ evidence, record cleanup receipts, and obey the never-suppress rules.
32
+
33
+ LIGHT — a narrow change inside existing layers (one-spot bugfix, a
34
+ method or endpoint following an existing pattern, a validation rule,
35
+ a query tweak, copy/constants): plan directly in the notepad; 1-2
36
+ success criteria (happy path + the riskiest edge); one real-surface
37
+ proof of the user-visible deliverable, where auxiliary surfaces are
38
+ first-class for CLI- or data-shaped work; self-review recorded in the
39
+ notepad instead of the reviewer loop.
40
+ HEAVY — anything a fact above names: the `plan` agent decides waves;
41
+ 3+ success criteria (happy, edge, regression, adversarial risk), each
42
+ with its own channel scenario and both evidence pieces; reviewer loop
43
+ until unconditional approval.
44
+
45
+ # Manual-QA channels
46
+ Run real-surface proof yourself through the channel that faithfully
47
+ exercises the surface; capture the artifact.
27
48
 
28
49
  1. HTTP call — hit the live endpoint with `curl -i` (or a
29
50
  Playwright APIRequestContext); capture status line + headers +
@@ -49,53 +70,41 @@ observable that decides PASS vs FAIL. "run the endpoint", "open the
49
70
  page", "check it works" are NOT scenarios — write the `curl ...`, the
50
71
  `send-keys ...`, the `page.click(...)`, the expected status/text.
51
72
 
52
- Auxiliary surfaces (pure CLI stdout / DB state diff / parsed config
53
- dump) are valid evidence when the criterion is genuinely CLI- or
54
- data-shaped, but they do NOT replace a channel scenario for any
55
- user-facing behavior. `--dry-run`, printing the command, "should
56
- respond", and "looks correct" never count.
73
+ Auxiliary surfaces (CLI stdout / DB state diff / parsed config dump)
74
+ are first-class evidence for CLI- or data-shaped criteria; use a
75
+ channel scenario when the behavior is user-facing. `--dry-run`,
76
+ printing the command, "should respond", and "looks correct" never
77
+ count.
57
78
 
58
79
  # Bootstrap (DO ALL FOUR BEFORE ANY OTHER WORK — NO SKIPPING)
59
80
 
60
81
  ## 0. Survey the skills, then size the work
61
- First, enumerate every skill available in this system (the loaded skill
62
- list / skills directory) and read the description of each one that is
63
- even loosely relevant. Decide deliberately and explicitly which skills
64
- this task will use, and prefer to USE as many genuinely-applicable
65
- skills as apply rather than working raw — name them in the notepad with
66
- a one-line reason each. Skipping a skill that fits the task is a defect.
67
- Then size the scope: count the distinct surfaces, files, and steps. If
68
- the task is non-trivial (2+ steps, multi-file, unclear scope, or any
69
- architecture decision), spawn the `plan` agent with the gathered
70
- context and let IT decide ordering and parallelism; follow the plan
71
- agent's wave order and parallel grouping exactly, and run the
72
- verification it specifies. Only a genuinely trivial single-step change
73
- may skip the plan agent — justify that skip in the notepad.
82
+ First, survey the loaded skill list and read the description of each
83
+ loosely relevant skill. Decide explicitly which skills this task will
84
+ use and prefer using every genuinely applicable one — name them in the
85
+ notepad with a one-line reason each. Skipping a skill that fits the
86
+ task is a defect.
87
+ Then run Tier triage (above) on the change set and record the tier.
88
+ HEAVY: spawn the `plan` agent with the gathered context, follow its
89
+ wave order and parallel grouping exactly, and run the verification it
90
+ specifies. LIGHT: plan directly in the notepad.
74
91
 
75
92
  ## 1. Create the goal with binding success criteria
76
93
  Call `create_goal` (or open your reply with a `# Goal` block treated as
77
94
  binding) using exactly `objective`. Do not include `status`. Goals are
78
95
  unlimited; never invent a numeric budget or limit.
79
96
  The criteria MUST list, upfront:
80
- - The user-visible deliverable in one line.
81
- - 3+ realistic QA scenarios: happy path, edge cases (boundary / empty /
82
- malformed / concurrent), adjacent-surface regression checks named by
83
- file + function.
84
- - Each scenario MUST be paired with an automated test (unit /
85
- integration / e2e whichever exercises the real surface) named by
86
- file + test id, written BEFORE the implementation.
87
- - For each scenario, TWO pieces of evidence are required and BOTH
88
- must be captured:
89
- 1. RED→GREEN proof: the failing-test output BEFORE the change and
90
- the passing-test output AFTER (test id + assertion message in
91
- both). Tests added AFTER the green code do NOT satisfy this.
92
- 2. Channel scenario artifact — name which Manual-QA channel
93
- (HTTP call / tmux / browser use / computer use) the scenario
94
- uses, run it yourself, capture the artifact named in the channel
95
- table above.
96
- Tests are the FLOOR (required, never sufficient); the channel
97
- scenario is the CEILING (also required, every criterion, every
98
- time). "tests pass" alone is NEVER done.
97
+ - The user-visible deliverable in one line, and the tier with its
98
+ justification.
99
+ - Success criteria sized by tier (LIGHT 1-2, HEAVY 3+ covering happy
100
+ path, edge cases — boundary / empty / malformed / concurrent — and
101
+ adjacent-surface regression named by file + function), each naming
102
+ its exact scenario: the literal command / page action / payload and
103
+ the binary PASS/FAIL observable, plus the evidence artifact it will
104
+ capture.
105
+ - For each criterion, the failing-first proof (test id or scenario)
106
+ that will be captured RED BEFORE the implementation and GREEN after.
107
+ Evidence added after the green code does NOT satisfy this.
99
108
 
100
109
  These scenarios are the contract. You are not done until every one of
101
110
  them PASSES with its evidence captured.
@@ -128,9 +137,8 @@ Started: <ISO timestamp>
128
137
  <patterns / pitfalls / principles to remember next turn>
129
138
  ```
130
139
 
131
- Append to the notepad after EVERY atomic action, not only on status
132
- changes: each finding, decision, command run, RED/GREEN capture, and QA
133
- artifact path goes in the moment it happens. Update `## Now` and
140
+ Append each finding, decision, command, RED/GREEN capture, and QA
141
+ artifact path the moment it happens. Update `## Now` and
134
142
  `## Todo` on every transition. Append-only — never rewrite. This notepad
135
143
  is your durable memory and it OUTLIVES the context window. After any
136
144
  compaction or context loss (a `Context compacted` notice, a summarized
@@ -143,10 +151,9 @@ steps.
143
151
  ## 3. Register obsessive todos via `update_plan`
144
152
  The todo tool is Codex `update_plan` — your live, user-visible
145
153
  checklist. Translate every action from the plan into one `update_plan`
146
- step. EVERY action, no matter how small one-line edits, `ls`, reading
147
- a single file, a single test run. If you will do it, it is a step. Keep
148
- steps atomic and ultra-granular: prefer many tiny steps over a few
149
- coarse ones; if a step needs more than one tool call, split it.
154
+ step one step per atomic work unit: an edit plus its verification, a
155
+ QA scenario run, a teardown. Keep each step small enough to finish
156
+ within a few tool calls.
150
157
  Call `update_plan` on EVERY state transition — the instant a step starts
151
158
  (mark it `in_progress`) and the instant it finishes (mark it `completed`
152
159
  and the next `in_progress`). Exactly ONE `in_progress` at a time. Mark
@@ -183,34 +190,36 @@ When discovery needs multiple angles or the module layout is
183
190
  unfamiliar, delegate to the `explorer` subagent (read-only codebase
184
191
  search, absolute-path results). For research that leaves the repo —
185
192
  library/API/docs/web — delegate to the `librarian` subagent. Spawn them
186
- `fork_turns: "none"` and keep doing root work while they run.
193
+ `fork_context: false` and keep doing root work while they run.
187
194
 
188
- # Execution loop (strict TDD RED → GREEN → SURFACE → CLEAN)
189
- Until every success-criteria scenario PASSES with BOTH evidence pieces:
195
+ # Execution loop (PIN RED → GREEN → SURFACE → CLEAN)
196
+ Until every success criterion PASSES with its evidence captured:
190
197
  1. Pick next criterion → mark in_progress → update notepad `## Now`.
191
- 2. RED: write the failing test FIRST. Run it. Capture the exact
192
- assertion message proving it fails for the RIGHT reason (not a
193
- syntax error, not a missing import). Paste RED output into the
194
- notepad. No production code yet.
198
+ 2. PIN + RED: when touching existing behavior, first pin it with a
199
+ characterization test that passes on the unchanged code. Then
200
+ capture the failing-first proof through the cheapest faithful
201
+ channel a unit test where a seam exists, an integration/e2e test
202
+ where the behavior lives in wiring, or the criterion's real-surface
203
+ scenario captured failing when no test seam exists. It must fail
204
+ for the RIGHT reason (not a syntax error, not a missing import).
205
+ Paste RED output into the notepad. No production code yet.
195
206
  3. GREEN: write the SMALLEST production change that flips RED→GREEN.
196
207
  Before GREEN work that depends on external review, PR, issue, or
197
208
  branch state, refresh current branch/PR/issue state and preserve existing ordering/policy;
198
209
  separate compatibility detection from policy changes unless the goal
199
210
  explicitly asks to change policy.
200
- Re-run the test. Capture GREEN output. If GREEN required more than
201
- ~20 lines, your test was too coarse — split it.
202
- 4. SURFACE-AS-SCENARIO (MANUAL QA YOU EXECUTE IT, NO STUBS):
203
- Run the Manual-QA channel scenario the criterion named (HTTP
204
- call / tmux / browser use / computer use; see the channel table at
205
- the top). Actually invoke it end-to-end the unit suite being
206
- green is NEVER substitute. Paste the artifact path into the
207
- notepad.
211
+ Re-run the proof. Capture GREEN output. A GREEN far larger than the
212
+ criterion implies means the proof was too coarse — split it.
213
+ 4. SURFACE: run the real-surface proof the criterion named (channel
214
+ table above; auxiliary surface for CLI- or data-shaped criteria),
215
+ end-to-end, yourself. If the RED proof was the scenario itself,
216
+ re-run it now and capture it passing. Paste the artifact path into
217
+ the notepad.
208
218
  5. CLEANUP (PAIRED — NEVER SKIP): the moment a QA scenario spawns any
209
219
  resource, register its teardown as its own todo (e.g.
210
- `cleanup: kill server pid for criterion 2 — verify kill -0 fails`)
211
- so no QA asset scripts, tmux assets, browsers / agent-browser
212
- sessions, PIDs is ever forgotten. Every runtime artifact the QA
213
- spawned in step 4 MUST be torn down before this step completes:
220
+ `cleanup: kill server pid for criterion 2 — verify kill -0 fails`).
221
+ Every runtime artifact the QA spawned in step 4 MUST be torn down
222
+ before this step completes:
214
223
  server PIDs (`kill <pid>`; verify `kill -0` fails), `tmux` sessions
215
224
  (`tmux kill-session -t ulw-qa-<criterion>`; verify with `tmux ls`),
216
225
  browser / Playwright contexts (`.close()`), containers
@@ -222,26 +231,26 @@ Until every success-criteria scenario PASSES with BOTH evidence pieces:
222
231
  6. Verify: LSP diagnostics clean on changed files + full test suite
223
232
  green (no skipped, no xfail added this turn).
224
233
  7. Mark completed. Append non-obvious findings / learnings.
225
- 8. After each increment, re-run the FULL scenario list. Record
226
- PASS/FAIL inline with BOTH evidence paths AND the cleanup receipt.
234
+ 8. After each increment, re-run every criterion's scenario. Record
235
+ PASS/FAIL inline with the evidence paths AND the cleanup receipt.
227
236
  Loop until all PASS.
228
237
 
229
238
  Parallel-batch independent reads / searches / subagents within a step,
230
239
  but NEVER parallelise RED and GREEN of the same criterion.
231
240
 
232
241
  # Codex subagent reliability
233
- Every `spawn_agent` message is self-contained and starts with
242
+ Every `multi_agent_v1.spawn_agent` message is self-contained and starts with
234
243
  `TASK: <imperative assignment>`, then names `DELIVERABLE`, `SCOPE`, and
235
244
  `VERIFY`. State that it is an executable assignment, not a context
236
- handoff. Prefer `fork_turns: "none"` unless full history is truly
245
+ handoff. Use `fork_context: false` unless full history is truly
237
246
  required; paste only the context the child needs. Full-history forks can
238
247
  make the child continue old parent context instead of the delegated task.
239
248
 
240
249
  # TOML-backed subagent routing compatibility
241
- Treat TOML-backed role routing as **routing-unverified**. The available
242
- `spawn_agent` schema accepts only `task_name`, `message`, and
243
- `fork_turns`; it cannot select a TOML-backed role, model, reasoning
244
- effort, or `service_tier`. Say so briefly in the notepad, paste the
250
+ Treat TOML-backed role routing as **routing-unverified**. The
251
+ `multi_agent_v1.spawn_agent` schema accepts `message`, `fork_context`,
252
+ `agent_type`, and `model`; it cannot select a TOML-backed role, model, reasoning
253
+ effort, or `service_tier` by name alone. Say so briefly in the notepad, paste the
245
254
  role requirements into the message, and judge the result from delivered
246
255
  evidence. Never claim the reviewer, planner, or explorer role was
247
256
  selected from TOML unless runtime evidence confirms it.
@@ -250,18 +259,14 @@ Treat child status as a progress signal, not a timeout counter. For
250
259
  work likely to exceed one wait cycle, tell the child to send
251
260
  `WORKING: <task> - <current phase>` before long reading, testing, or
252
261
  review passes, and `BLOCKED: <reason>` only when it cannot progress.
253
- Track spawned agent names locally. Use `wait_agent` for mailbox
254
- signals, but a timeout only means no new mailbox update arrived. After
255
- a timeout, run a single `list_agents` check for the named child when
256
- you need reassurance; if it is running or its latest message is
257
- `WORKING:`, treat it as alive and keep doing independent root work.
258
- Do not use `list_agents` as a polling loop or status feed; it can
259
- replay large payloads. Send `TASK STILL ACTIVE: return <deliverable> or
260
- BLOCKED: <reason>` only when the child is completed without the
262
+ Track spawned agent names locally. Use `multi_agent_v1.wait_agent` for mailbox
263
+ signals, but a timeout only means no new mailbox update arrived.
264
+ Treat a running child as alive and keep doing independent root work.
265
+ Fallback only when the child is completed without the
261
266
  deliverable, ack-only, or no longer running. If that followup is still
262
267
  silent or ack-only, record the result as inconclusive, do not count it
263
268
  as approval/pass, close it if safe, and respawn a smaller
264
- `fork_turns: "none"` task with the missing deliverable.
269
+ `fork_context: false` task with the missing deliverable.
265
270
 
266
271
  # Subagent-dependent transition barrier
267
272
  Do not mark an `update_plan` step `completed` while an active child owns
@@ -270,7 +275,7 @@ audit, research, or review result is integrated or explicitly recorded
270
275
  as inconclusive. Do not generate a plan before spawned research lanes
271
276
  that feed the plan have returned or been closed as inconclusive.
272
277
  Do not write the final answer, PR handoff, or completion summary while
273
- active child agents remain open. Use short `wait_agent` cycles.
278
+ active child agents remain open. Use short `multi_agent_v1.wait_agent` cycles.
274
279
  After two silent waits send `TASK STILL ACTIVE: return <deliverable> or
275
280
  BLOCKED: <reason>`. After four silent or ack-only checks, close the lane as
276
281
  inconclusive, record that it is not approval, and respawn smaller only
@@ -279,14 +284,15 @@ if the deliverable is still required.
279
284
  # Verification gate (TRIGGERED, NOT OPTIONAL)
280
285
 
281
286
  Trigger when ANY apply:
287
+ - Tier is HEAVY.
282
288
  - User demanded strict, rigorous, or proper review.
283
- - Task touches 3+ files OR ran 20+ turns OR 30+ minutes wall-clock.
284
- - Refactor, migration, performance change, security-sensitive work, or
285
- anything the user called deep.
289
+ LIGHT tier records a self-review in the notepad instead: re-read the
290
+ diff, run diagnostics, confirm each criterion's evidence, and state in
291
+ one line why the tier held.
286
292
 
287
293
  Procedure (NON-NEGOTIABLE):
288
- 1. Spawn a child with `fork_turns: "none"` and a self-contained reviewer
289
- assignment in `message`. The `spawn_agent` schema cannot select a
294
+ 1. Spawn a child with `fork_context: false` and a self-contained reviewer
295
+ assignment in `message`. The `multi_agent_v1.spawn_agent` schema cannot select a
290
296
  TOML-backed reviewer role, so paste the reviewer requirements into
291
297
  the message.
292
298
  Pass: goal, success-criteria, scenario evidence, full diff, notepad
@@ -311,23 +317,23 @@ requested or preauthorised this session — default is stage + draft
311
317
  message + present for approval.
312
318
 
313
319
  # Constraints
314
- - TDD is MANDATORY on every production change features, fixes,
315
- refactors, glue, perf, config-with-logic. No "too small", "too
316
- obvious", or "just a one-liner" exemptions. If you typed production
317
- code without a failing test preceding it in the same notepad, you
318
- STOP, revert, write the test, watch it fail, then redo the change.
319
- - Refactors: write characterization tests pinning current observable
320
- behavior FIRST, watch them go GREEN against the old code, THEN
321
- refactor. They must remain green throughout.
322
- - The ONLY changes exempt from a new test are: pure formatting,
323
- comment-only edits, dependency version bumps with no behavior
324
- delta, and rename-only moves. Each exemption MUST be justified in
325
- `## Findings` with the exact reason; unjustified exemption is a
326
- rejection.
320
+ - Every behavior change needs a failing-first proof captured BEFORE
321
+ the production change, through the cheapest faithful channel (unit
322
+ test at a seam; integration/e2e in wiring; the real-surface scenario
323
+ when no test seam exists). If you typed production code first, STOP,
324
+ revert, capture the proof failing, then redo the change. Exempt
325
+ only: pure formatting, comment-only edits, dependency bumps with no
326
+ behavior delta, rename-only moves justify each in `## Findings`.
327
+ - A test that mirrors its implementation — asserting mocks were
328
+ called, pinning a constant, or unable to fail under any plausible
329
+ regression is NOT evidence. Prefer a real-surface proof with no
330
+ new test over a tautological test.
331
+ - Refactors: characterization tests pinning current observable
332
+ behavior FIRST, green against the old code, green throughout.
327
333
  - Smallest correct change. No drive-by refactors.
328
334
  - Never suppress lints / errors / test failures. Never delete, skip,
329
335
  `.only`, `.skip`, `xfail`, or comment out tests to green the suite.
330
- - Never claim done from inference — only from RED→GREEN + surface.
336
+ - Never claim done from inference — only from captured evidence.
331
337
  - Parallel tool calls for any independent work.
332
338
 
333
339
  # Output discipline
@@ -343,10 +349,9 @@ message + present for approval.
343
349
  - Stop ONLY when every scenario PASSES with captured evidence, every
344
350
  cleanup receipt is recorded, notepad is current, and (if gate
345
351
  triggered) reviewer approved unconditionally.
346
- - Leftover state from QA a QA-spawned process still alive, a `tmux`
347
- session still listed by `tmux ls`, a browser context still open, a
348
- bound port, a temp file / dir on disk — means NOT done. Tear it
349
- down, record the receipt, then continue.
352
+ - Leftover QA state (live process, `tmux` session, browser context,
353
+ bound port, temp file / dir) means NOT done. Tear it down, record
354
+ the receipt, then continue.
350
355
  - After 2 identical failed attempts at one step, surface what was tried
351
356
  and ask the user before another retry.
352
357
  - After 2 parallel exploration waves yield no new useful facts, stop
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ import { stdin as processStdin, stdout as processStdout } from "node:process";
3
+ import { runUserPromptSubmitHook } from "./codex-hook.js";
4
+ const command = process.argv[2];
5
+ const subcommand = process.argv[3];
6
+ if (command === "hook" && subcommand === "user-prompt-submit") {
7
+ await runHookCli();
8
+ }
9
+ else {
10
+ process.stderr.write("Usage: omo-ultrawork hook user-prompt-submit\n");
11
+ process.exitCode = 1;
12
+ }
13
+ async function runHookCli() {
14
+ const raw = await readStdin();
15
+ if (raw.trim().length === 0)
16
+ return;
17
+ const parsed = parseHookInput(raw);
18
+ const output = runUserPromptSubmitHook(parsed);
19
+ if (output.length > 0) {
20
+ processStdout.write(output);
21
+ }
22
+ }
23
+ function parseHookInput(raw) {
24
+ try {
25
+ const parsed = JSON.parse(raw);
26
+ return parsed;
27
+ }
28
+ catch (error) {
29
+ if (error instanceof SyntaxError)
30
+ return undefined;
31
+ throw error;
32
+ }
33
+ }
34
+ function readStdin() {
35
+ return new Promise((resolve) => {
36
+ let data = "";
37
+ processStdin.setEncoding("utf8");
38
+ processStdin.on("data", (chunk) => {
39
+ data += chunk;
40
+ });
41
+ processStdin.once("error", () => {
42
+ resolve(data);
43
+ });
44
+ processStdin.once("end", () => {
45
+ resolve(data);
46
+ });
47
+ });
48
+ }
@@ -0,0 +1,7 @@
1
+ export type CodexUserPromptSubmitInput = {
2
+ readonly hook_event_name: "UserPromptSubmit";
3
+ readonly prompt: string;
4
+ readonly transcript_path?: string | null;
5
+ };
6
+ export declare function runUserPromptSubmitHook(input: unknown): string;
7
+ export declare function isUltraworkPrompt(prompt: string): boolean;
@@ -0,0 +1,122 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { ULTRAWORK_DIRECTIVE } from "./directive.js";
3
+ const ULTRAWORK_PATTERN = /\b(?:ultrawork|ulw)\b/i;
4
+ const ULTRAWORK_DIRECTIVE_MARKER = "<ultrawork-mode>";
5
+ const TRANSCRIPT_SEARCH_BYTES = 512_000;
6
+ const CONTEXT_PRESSURE_MARKERS = [
7
+ "context compacted",
8
+ "context_length_exceeded",
9
+ "skill descriptions were shortened",
10
+ "context_too_large",
11
+ "codex ran out of room in the model's context window",
12
+ "your input exceeds the context window",
13
+ "long threads and multiple compactions",
14
+ ];
15
+ export function runUserPromptSubmitHook(input) {
16
+ if (!isCodexUserPromptSubmitInput(input))
17
+ return "";
18
+ if (isContextPressureRecoveryPrompt(input.prompt))
19
+ return "";
20
+ if (hasUltraworkDirectiveAlreadyInTranscript(input.transcript_path))
21
+ return "";
22
+ if (isContextPressureTranscript(input.transcript_path))
23
+ return "";
24
+ return isUltraworkPrompt(input.prompt) ? formatAdditionalContextOutput(ULTRAWORK_DIRECTIVE) : "";
25
+ }
26
+ function hasUltraworkDirectiveAlreadyInTranscript(transcriptPath) {
27
+ if (transcriptPath === undefined || transcriptPath === null)
28
+ return false;
29
+ try {
30
+ const rawTranscript = readTranscriptTail(transcriptPath);
31
+ for (const line of rawTranscript.split(/\r?\n/)) {
32
+ const parsed = parseJsonLine(line);
33
+ if (parsed === null) {
34
+ continue;
35
+ }
36
+ if (!isRecord(parsed)) {
37
+ continue;
38
+ }
39
+ const hookSpecificOutput = parsed["hookSpecificOutput"];
40
+ if (!isRecord(hookSpecificOutput)) {
41
+ continue;
42
+ }
43
+ if (hookSpecificOutput["hookEventName"] !== "UserPromptSubmit") {
44
+ continue;
45
+ }
46
+ if (typeof hookSpecificOutput["additionalContext"] === "string" &&
47
+ hookSpecificOutput["additionalContext"].includes(ULTRAWORK_DIRECTIVE_MARKER)) {
48
+ return true;
49
+ }
50
+ }
51
+ }
52
+ catch (error) {
53
+ if (error instanceof Error)
54
+ return false;
55
+ throw error;
56
+ }
57
+ return false;
58
+ }
59
+ function readTranscriptTail(transcriptPath) {
60
+ const rawTranscript = readFileSync(transcriptPath);
61
+ return rawTranscript.subarray(Math.max(0, rawTranscript.byteLength - TRANSCRIPT_SEARCH_BYTES)).toString("utf8");
62
+ }
63
+ export function isUltraworkPrompt(prompt) {
64
+ return ULTRAWORK_PATTERN.test(prompt);
65
+ }
66
+ function isContextPressureRecoveryPrompt(prompt) {
67
+ const normalizedPrompt = prompt.toLowerCase();
68
+ return CONTEXT_PRESSURE_MARKERS.some((marker) => normalizedPrompt.includes(marker));
69
+ }
70
+ function isContextPressureTranscript(transcriptPath) {
71
+ if (transcriptPath === undefined || transcriptPath === null)
72
+ return false;
73
+ try {
74
+ return isContextPressureRecoveryPrompt(readFileSync(transcriptPath, "utf8"));
75
+ }
76
+ catch (error) {
77
+ if (error instanceof Error)
78
+ return false;
79
+ throw error;
80
+ }
81
+ }
82
+ function formatAdditionalContextOutput(additionalContext) {
83
+ const normalizedContext = normalizeAdditionalContext(additionalContext);
84
+ if (normalizedContext.length === 0)
85
+ return "";
86
+ const output = {
87
+ hookSpecificOutput: {
88
+ hookEventName: "UserPromptSubmit",
89
+ additionalContext: normalizedContext,
90
+ },
91
+ };
92
+ return `${JSON.stringify(output)}\n`;
93
+ }
94
+ function normalizeAdditionalContext(additionalContext) {
95
+ return additionalContext.replace(/\r\n/g, "\n").replace(/\r/g, "\n").trim();
96
+ }
97
+ function parseJsonLine(line) {
98
+ if (line.trim().length === 0) {
99
+ return null;
100
+ }
101
+ try {
102
+ const parsed = JSON.parse(line);
103
+ return parsed;
104
+ }
105
+ catch (error) {
106
+ if (error instanceof Error) {
107
+ return null;
108
+ }
109
+ throw error;
110
+ }
111
+ }
112
+ function isCodexUserPromptSubmitInput(value) {
113
+ return (isRecord(value) &&
114
+ value["hook_event_name"] === "UserPromptSubmit" &&
115
+ typeof value["prompt"] === "string" &&
116
+ (value["transcript_path"] === undefined ||
117
+ value["transcript_path"] === null ||
118
+ typeof value["transcript_path"] === "string"));
119
+ }
120
+ function isRecord(value) {
121
+ return typeof value === "object" && value !== null && !Array.isArray(value);
122
+ }
@@ -0,0 +1 @@
1
+ export declare const ULTRAWORK_DIRECTIVE: string;
@@ -0,0 +1,2 @@
1
+ import { readFileSync } from "node:fs";
2
+ export const ULTRAWORK_DIRECTIVE = readFileSync(new URL("../directive.md", import.meta.url), "utf8");
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "LazyCodex(0.1.0): Checking Ultrawork Trigger"
10
+ "statusMessage": "LazyCodex(4.9.1): Checking Ultrawork Trigger"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "0.1.0",
3
+ "version": "4.9.1",
4
4
  "description": "Codex plugin that injects the ultrawork orchestration directive and syncs the ultrawork reviewer agent role.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",