oh-my-opencode 4.7.5 → 4.8.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 (617) hide show
  1. package/.agents/command/get-unpublished-changes.md +35 -6
  2. package/.agents/command/omomomo.md +1 -1
  3. package/.agents/command/publish.md +13 -0
  4. package/.agents/command/security-research.md +0 -1
  5. package/.agents/skills/get-unpublished-changes/SKILL.md +21 -5
  6. package/.agents/skills/omomomo/SKILL.md +1 -2
  7. package/.agents/skills/opencode-qa/scripts/export-roundtrip.sh +57 -19
  8. package/.agents/skills/opencode-qa/scripts/lib/common.sh +19 -7
  9. package/.agents/skills/opencode-qa/scripts/sse-hook-probe.sh +3 -0
  10. package/.agents/skills/opencode-qa/scripts/tui-smoke.sh +1 -1
  11. package/.agents/skills/pre-publish-review/SKILL.md +24 -4
  12. package/.agents/skills/publish/SKILL.md +13 -0
  13. package/.agents/skills/remove-deadcode/SKILL.md +0 -1
  14. package/.agents/skills/security-research/SKILL.md +0 -1
  15. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +1 -1
  16. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +2 -2
  17. package/.agents/skills/work-with-pr-workspace/iteration-1/review.html +1 -1
  18. package/.opencode/command/get-unpublished-changes.md +35 -6
  19. package/.opencode/command/omomomo.md +1 -1
  20. package/.opencode/command/publish.md +13 -0
  21. package/.opencode/command/security-research.md +0 -1
  22. package/.opencode/skills/pre-publish-review/SKILL.md +24 -4
  23. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +1 -1
  24. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +2 -2
  25. package/.opencode/skills/work-with-pr-workspace/iteration-1/review.html +1 -1
  26. package/README.ja.md +7 -7
  27. package/README.ko.md +9 -7
  28. package/README.md +14 -8
  29. package/README.ru.md +5 -5
  30. package/README.zh-cn.md +7 -7
  31. package/bin/oh-my-opencode.js +24 -1
  32. package/bin/oh-my-opencode.test.ts +79 -20
  33. package/dist/agents/hephaestus/agent.d.ts +1 -1
  34. package/dist/agents/kimi-tool-loop-guard.d.ts +1 -0
  35. package/dist/agents/momus.d.ts +1 -1
  36. package/dist/agents/sisyphus-agent-config.d.ts +4 -0
  37. package/dist/agents/sisyphus-agent-factory.d.ts +6 -0
  38. package/dist/agents/sisyphus-dynamic-prompt-builder.d.ts +2 -0
  39. package/dist/agents/sisyphus-dynamic-prompt-execution.d.ts +2 -0
  40. package/dist/agents/sisyphus-dynamic-prompt-exploration.d.ts +2 -0
  41. package/dist/agents/sisyphus-dynamic-prompt-role.d.ts +2 -0
  42. package/dist/agents/sisyphus-dynamic-prompt-sections.d.ts +18 -0
  43. package/dist/agents/sisyphus-dynamic-prompt-style.d.ts +2 -0
  44. package/dist/agents/sisyphus-dynamic-prompt.d.ts +3 -0
  45. package/dist/agents/sisyphus-gemini-fallback-overrides.d.ts +1 -0
  46. package/dist/agents/sisyphus-junior/agent.d.ts +1 -1
  47. package/dist/agents/sisyphus-junior/index.d.ts +0 -1
  48. package/dist/agents/sisyphus.d.ts +1 -6
  49. package/dist/agents/types.d.ts +14 -3
  50. package/dist/cli/cli-program.d.ts +3 -0
  51. package/dist/cli/doctor/checks/codex.d.ts +11 -0
  52. package/dist/cli/doctor/checks/dependencies.d.ts +1 -0
  53. package/dist/cli/doctor/checks/index.d.ts +3 -0
  54. package/dist/cli/doctor/checks/system.d.ts +4 -0
  55. package/dist/cli/doctor/constants.d.ts +1 -0
  56. package/dist/cli/doctor/doctor-target.d.ts +2 -0
  57. package/dist/cli/doctor/index.d.ts +1 -0
  58. package/dist/cli/doctor/types.d.ts +26 -0
  59. package/dist/cli/index.js +4466 -2212
  60. package/dist/cli/install-codex/codex-cache-bins.d.ts +21 -0
  61. package/dist/cli/install-codex/codex-cache-fs.d.ts +3 -0
  62. package/dist/cli/install-codex/codex-cache-install.d.ts +13 -0
  63. package/dist/cli/install-codex/codex-cache-mcp-manifest.d.ts +2 -0
  64. package/dist/cli/install-codex/codex-cache-prune.d.ts +10 -0
  65. package/dist/cli/install-codex/codex-cache.d.ts +4 -32
  66. package/dist/cli/install-codex/codex-cached-marketplace-manifest.d.ts +6 -0
  67. package/dist/cli/install-codex/codex-config-agents.d.ts +3 -0
  68. package/dist/cli/install-codex/codex-config-features.d.ts +1 -0
  69. package/dist/cli/install-codex/codex-config-marketplaces.d.ts +6 -0
  70. package/dist/cli/install-codex/codex-config-plugins.d.ts +8 -0
  71. package/dist/cli/install-codex/codex-config-toml-sections.d.ts +9 -0
  72. package/dist/cli/install-codex/codex-multi-agent-v2-config.d.ts +11 -0
  73. package/dist/cli/install-codex/codex-process.d.ts +5 -0
  74. package/dist/cli/install-codex/index.d.ts +1 -1
  75. package/dist/cli/install-codex/lazycodex-version-stamp.d.ts +19 -0
  76. package/dist/cli/install-codex/link-cached-plugin-agents.d.ts +4 -0
  77. package/dist/cli/install-validators.d.ts +3 -0
  78. package/dist/cli/model-fallback-types.d.ts +3 -0
  79. package/dist/cli/run/event-handlers.d.ts +4 -11
  80. package/dist/cli/run/event-message-handlers.d.ts +5 -0
  81. package/dist/cli/run/event-session-handlers.d.ts +5 -0
  82. package/dist/cli/run/event-session-ids.d.ts +24 -0
  83. package/dist/cli/run/event-think-block.d.ts +3 -0
  84. package/dist/cli/run/event-toast-handlers.d.ts +3 -0
  85. package/dist/cli/run/event-tool-handlers.d.ts +4 -0
  86. package/dist/cli/run/event-tool-output.d.ts +2 -0
  87. package/dist/cli/run/on-complete-hook.d.ts +8 -1
  88. package/dist/cli/run/opencode-binary-resolver.d.ts +2 -1
  89. package/dist/cli/run/runnable-agent-resolver.d.ts +11 -0
  90. package/dist/cli/runtime-commands.d.ts +2 -0
  91. package/dist/cli/sparkshell-appserver-websocket.d.ts +4 -0
  92. package/dist/cli/sparkshell-appserver.d.ts +16 -0
  93. package/dist/cli/sparkshell-parse.d.ts +21 -0
  94. package/dist/cli/sparkshell.d.ts +26 -0
  95. package/dist/cli/types.d.ts +9 -0
  96. package/dist/config/schema/claude-code.d.ts +1 -0
  97. package/dist/config/schema/hooks.d.ts +1 -0
  98. package/dist/config/schema/oh-my-opencode-config.d.ts +1 -0
  99. package/dist/create-hooks.d.ts +1 -0
  100. package/dist/features/background-agent/concurrency.d.ts +6 -1
  101. package/dist/features/background-agent/constants.d.ts +1 -0
  102. package/dist/features/background-agent/empty-assistant-turn.d.ts +7 -0
  103. package/dist/features/background-agent/manager.d.ts +12 -0
  104. package/dist/features/background-agent/message-updated-parent-wake-output.d.ts +1 -0
  105. package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
  106. package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +21 -0
  107. package/dist/features/background-agent/parent-wake-flush-runner.d.ts +24 -0
  108. package/dist/features/background-agent/parent-wake-history-state.d.ts +5 -0
  109. package/dist/features/background-agent/parent-wake-notifier-types.d.ts +50 -0
  110. package/dist/features/background-agent/parent-wake-notifier.d.ts +8 -50
  111. package/dist/features/background-agent/parent-wake-pending-queue.d.ts +22 -0
  112. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +19 -0
  113. package/dist/features/background-agent/parent-wake-session-history.d.ts +73 -0
  114. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +35 -0
  115. package/dist/features/background-agent/parent-wake-timer-handle.d.ts +5 -0
  116. package/dist/features/background-agent/parent-wake-window-recovery.d.ts +13 -0
  117. package/dist/features/background-agent/process-cleanup.d.ts +2 -0
  118. package/dist/features/background-agent/process-cleanup.test-helpers.d.ts +3 -0
  119. package/dist/features/background-agent/session-stream-activity.d.ts +6 -0
  120. package/dist/features/background-agent/spawner/fallback-agent.d.ts +5 -0
  121. package/dist/features/background-agent/spawner/task-prompt-body.d.ts +34 -0
  122. package/dist/features/background-agent/spawner/task-record.d.ts +2 -0
  123. package/dist/features/background-agent/spawner.d.ts +2 -5
  124. package/dist/features/builtin-commands/templates/refactor-sections/codemap-and-tests.d.ts +1 -0
  125. package/dist/features/builtin-commands/templates/refactor-sections/intro-and-analysis.d.ts +1 -0
  126. package/dist/features/builtin-commands/templates/refactor-sections/plan-and-execution.d.ts +1 -0
  127. package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -0
  128. package/dist/features/builtin-commands/templates/refactor-sections/verification-and-tooling.d.ts +1 -0
  129. package/dist/features/builtin-commands/templates/refactor.d.ts +2 -2
  130. package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +2 -0
  131. package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +2 -0
  132. package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +1 -0
  133. package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +1 -0
  134. package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +1 -0
  135. package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +1 -1
  136. package/dist/features/builtin-skills/skills/index.d.ts +1 -0
  137. package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +2 -0
  138. package/dist/features/builtin-skills/skills/playwright.d.ts +2 -3
  139. package/dist/features/builtin-skills/skills/visual-qa.d.ts +2 -0
  140. package/dist/features/claude-code-agent-loader/agent-definitions-loader.d.ts +2 -2
  141. package/dist/features/claude-code-agent-loader/claude-model-mapper.d.ts +1 -1
  142. package/dist/features/claude-code-agent-loader/loader.d.ts +2 -2
  143. package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +1 -1
  144. package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +2 -0
  145. package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +3 -0
  146. package/dist/features/claude-code-plugin-loader/discovery.d.ts +3 -4
  147. package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +1 -0
  148. package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +3 -0
  149. package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +2 -0
  150. package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +1 -0
  151. package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +4 -0
  152. package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +3 -0
  153. package/dist/features/claude-code-plugin-loader/types.d.ts +1 -0
  154. package/dist/features/hook-message-injector/context-resolver.d.ts +6 -0
  155. package/dist/features/hook-message-injector/id-generation.d.ts +2 -0
  156. package/dist/features/hook-message-injector/index.d.ts +1 -1
  157. package/dist/features/hook-message-injector/injector.d.ts +7 -69
  158. package/dist/features/hook-message-injector/json-message-lookup.d.ts +3 -0
  159. package/dist/features/hook-message-injector/message-directory.d.ts +1 -0
  160. package/dist/features/hook-message-injector/message-injection.d.ts +2 -0
  161. package/dist/features/hook-message-injector/sdk-message-context.d.ts +6 -0
  162. package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +28 -0
  163. package/dist/features/hook-message-injector/types.d.ts +9 -0
  164. package/dist/features/mcp-oauth/callback-server.d.ts +10 -2
  165. package/dist/features/opencode-runtime-skills/source-server.d.ts +1 -0
  166. package/dist/features/skill-mcp-manager/http-client.d.ts +2 -0
  167. package/dist/features/team-mode/deps.d.ts +8 -1
  168. package/dist/features/team-mode/team-layout-tmux/layout.d.ts +2 -0
  169. package/dist/features/team-mode/team-mailbox/send.d.ts +3 -0
  170. package/dist/features/team-mode/team-registry/paths.d.ts +17 -2
  171. package/dist/features/team-mode/team-runtime/shutdown.d.ts +1 -1
  172. package/dist/features/team-mode/team-runtime/unresolved-team-members.d.ts +3 -0
  173. package/dist/features/team-mode/team-state-store/active-resume.d.ts +5 -0
  174. package/dist/features/team-mode/team-state-store/creating-resume.d.ts +4 -0
  175. package/dist/features/team-mode/team-state-store/deleting-resume.d.ts +4 -0
  176. package/dist/features/team-mode/team-state-store/error-normalization.d.ts +2 -0
  177. package/dist/features/team-mode/team-state-store/reservation-reconciliation.d.ts +4 -0
  178. package/dist/features/team-mode/team-state-store/resume-report.d.ts +7 -0
  179. package/dist/features/team-mode/team-state-store/resume.d.ts +2 -7
  180. package/dist/features/team-mode/team-state-store/runtime-cleanup.d.ts +4 -0
  181. package/dist/features/team-mode/team-state-store/session-liveness.d.ts +9 -0
  182. package/dist/features/team-mode/team-state-store/worker-resume-status.d.ts +9 -0
  183. package/dist/features/team-mode/tools/lifecycle-create-tool.d.ts +17 -0
  184. package/dist/features/team-mode/tools/lifecycle-inline-spec.d.ts +19 -0
  185. package/dist/features/team-mode/tools/lifecycle-participant.d.ts +25 -0
  186. package/dist/features/team-mode/tools/lifecycle-shutdown-tools.d.ts +18 -0
  187. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +3 -3
  188. package/dist/features/team-mode/tools/lifecycle.d.ts +3 -37
  189. package/dist/features/team-mode/tools/messaging-live-delivery-client.d.ts +25 -0
  190. package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +19 -0
  191. package/dist/features/team-mode/tools/messaging-live-delivery-reservation.d.ts +10 -0
  192. package/dist/features/team-mode/tools/messaging-live-delivery-state.d.ts +5 -0
  193. package/dist/features/team-mode/tools/messaging-live-delivery.d.ts +6 -0
  194. package/dist/features/team-mode/tools/messaging-runtime.d.ts +17 -0
  195. package/dist/features/team-mode/tools/messaging.d.ts +4 -29
  196. package/dist/features/tmux-subagent/manager.d.ts +20 -1
  197. package/dist/features/tmux-subagent/session-created-handler.d.ts +4 -0
  198. package/dist/features/tmux-subagent/types.d.ts +1 -0
  199. package/dist/hooks/anthropic-context-window-limit-recovery/message-builder.d.ts +1 -1
  200. package/dist/hooks/atlas/idle-completion-nudge.d.ts +10 -0
  201. package/dist/hooks/atlas/idle-constants.d.ts +4 -0
  202. package/dist/hooks/atlas/idle-continuation.d.ts +23 -0
  203. package/dist/hooks/atlas/idle-session-eligibility.d.ts +8 -0
  204. package/dist/hooks/atlas/tool-execute-after-direct-work.d.ts +9 -0
  205. package/dist/hooks/atlas/tool-execute-after-plan-tasks.d.ts +3 -0
  206. package/dist/hooks/atlas/tool-execute-after-subagent-completion.d.ts +14 -0
  207. package/dist/hooks/auto-update-checker/hook/background-update-check.d.ts +6 -0
  208. package/dist/hooks/auto-update-checker/hook/ignore-toast-error.d.ts +1 -0
  209. package/dist/hooks/hephaestus-agents-md-injector/hook.d.ts +37 -0
  210. package/dist/hooks/hephaestus-agents-md-injector/index.d.ts +1 -0
  211. package/dist/hooks/index.d.ts +1 -0
  212. package/dist/hooks/json-error-recovery/hook.d.ts +1 -1
  213. package/dist/hooks/ralph-loop/command-arguments.d.ts +1 -0
  214. package/dist/hooks/ralph-loop/event-handler-activity.d.ts +10 -0
  215. package/dist/hooks/ralph-loop/event-handler-completion.d.ts +9 -0
  216. package/dist/hooks/ralph-loop/event-handler-continuation.d.ts +16 -0
  217. package/dist/hooks/ralph-loop/event-handler-feedback.d.ts +16 -0
  218. package/dist/hooks/ralph-loop/event-handler-idle.d.ts +15 -0
  219. package/dist/hooks/ralph-loop/event-handler-impl.d.ts +10 -0
  220. package/dist/hooks/ralph-loop/event-handler-runtime-error.d.ts +4 -0
  221. package/dist/hooks/ralph-loop/event-handler-types.d.ts +20 -0
  222. package/dist/hooks/ralph-loop/loop-state-controller.d.ts +1 -0
  223. package/dist/hooks/ralph-loop/ralph-loop-event-handler.d.ts +4 -24
  224. package/dist/hooks/ralph-loop/ralph-loop-hook.d.ts +1 -0
  225. package/dist/hooks/read-image-resizer/png-chunks.d.ts +6 -0
  226. package/dist/hooks/read-image-resizer/png-constants.d.ts +1 -0
  227. package/dist/hooks/read-image-resizer/png-crc.d.ts +1 -0
  228. package/dist/hooks/read-image-resizer/png-decoder.d.ts +1 -0
  229. package/dist/hooks/read-image-resizer/png-encoder.d.ts +1 -0
  230. package/dist/hooks/read-image-resizer/png-filters.d.ts +1 -0
  231. package/dist/hooks/read-image-resizer/png-ihdr.d.ts +11 -0
  232. package/dist/hooks/read-image-resizer/png-nearest-neighbor.d.ts +1 -0
  233. package/dist/hooks/rules-injector/injection-output.d.ts +2 -0
  234. package/dist/hooks/rules-injector/injection-processor.d.ts +22 -0
  235. package/dist/hooks/rules-injector/injection-types.d.ts +43 -0
  236. package/dist/hooks/rules-injector/injector.d.ts +3 -47
  237. package/dist/hooks/rules-injector/match-decision-cache.d.ts +4 -0
  238. package/dist/hooks/rules-injector/parsed-rule-cache.d.ts +11 -0
  239. package/dist/hooks/rules-injector/path-resolution.d.ts +1 -0
  240. package/dist/hooks/rules-injector/rule-match-reason.d.ts +12 -0
  241. package/dist/hooks/rules-injector/transcript-hydration.d.ts +13 -2
  242. package/dist/hooks/runtime-fallback/auto-retry-abort.d.ts +2 -0
  243. package/dist/hooks/runtime-fallback/auto-retry-agent-context.d.ts +2 -0
  244. package/dist/hooks/runtime-fallback/auto-retry-cleanup.d.ts +2 -0
  245. package/dist/hooks/runtime-fallback/auto-retry-dispatch.d.ts +2 -0
  246. package/dist/hooks/runtime-fallback/auto-retry-metadata.d.ts +9 -0
  247. package/dist/hooks/runtime-fallback/auto-retry-timeout.d.ts +5 -0
  248. package/dist/hooks/runtime-fallback/fallback-bootstrap-model.d.ts +1 -1
  249. package/dist/hooks/runtime-fallback/fallback-state.d.ts +4 -1
  250. package/dist/hooks/runtime-fallback/normalize-model.d.ts +12 -0
  251. package/dist/hooks/session-notification-linux.d.ts +3 -0
  252. package/dist/hooks/session-notification-log.d.ts +2 -0
  253. package/dist/hooks/session-notification-macos.d.ts +3 -0
  254. package/dist/hooks/session-notification-platform.d.ts +3 -0
  255. package/dist/hooks/session-notification-runner.d.ts +9 -0
  256. package/dist/hooks/session-notification-send.d.ts +3 -0
  257. package/dist/hooks/session-notification-sender.d.ts +5 -6
  258. package/dist/hooks/session-notification-sound.d.ts +3 -0
  259. package/dist/hooks/session-notification-windows.d.ts +3 -0
  260. package/dist/hooks/session-recovery/error-recovery.d.ts +4 -0
  261. package/dist/hooks/session-recovery/hook-types.d.ts +22 -0
  262. package/dist/hooks/session-recovery/hook.d.ts +2 -19
  263. package/dist/hooks/session-recovery/interrupted-tool-results.d.ts +3 -0
  264. package/dist/hooks/session-recovery/message-state.d.ts +4 -0
  265. package/dist/hooks/session-recovery/storage/thinking-strip.d.ts +7 -1
  266. package/dist/hooks/start-work/context-info-builder.d.ts +9 -9
  267. package/dist/hooks/start-work/context-info-formatters.d.ts +21 -0
  268. package/dist/hooks/start-work/explicit-plan-context.d.ts +9 -0
  269. package/dist/hooks/start-work/plan-discovery-context.d.ts +25 -0
  270. package/dist/hooks/start-work/plan-selection.d.ts +4 -0
  271. package/dist/hooks/start-work/work-initializer.d.ts +17 -0
  272. package/dist/hooks/tool-pair-validator/hook.d.ts +1 -37
  273. package/dist/hooks/tool-pair-validator/message-transform.d.ts +2 -0
  274. package/dist/hooks/tool-pair-validator/tool-part-ids.d.ts +6 -0
  275. package/dist/hooks/tool-pair-validator/tool-result-repair.d.ts +4 -0
  276. package/dist/hooks/tool-pair-validator/types.d.ts +36 -0
  277. package/dist/index.js +12708 -9988
  278. package/dist/oh-my-opencode.schema.json +4 -0
  279. package/dist/openclaw/reply-listener-poll-loop.d.ts +3 -0
  280. package/dist/openclaw/reply-listener-signature.d.ts +2 -0
  281. package/dist/openclaw/reply-listener-sleep.d.ts +1 -0
  282. package/dist/openclaw/reply-listener-start.d.ts +9 -0
  283. package/dist/openclaw/reply-listener-status.d.ts +4 -0
  284. package/dist/openclaw/reply-listener-stop.d.ts +7 -0
  285. package/dist/openclaw/reply-listener.d.ts +5 -18
  286. package/dist/openclaw/session-registry-lock.d.ts +2 -0
  287. package/dist/openclaw/session-registry-paths.d.ts +9 -0
  288. package/dist/openclaw/session-registry-storage.d.ts +4 -0
  289. package/dist/openclaw/session-registry-types.d.ts +11 -0
  290. package/dist/openclaw/session-registry.d.ts +2 -11
  291. package/dist/plugin/chat-message/loop-commands.d.ts +9 -0
  292. package/dist/plugin/chat-message/model-cache-warning.d.ts +12 -0
  293. package/dist/plugin/chat-message/prompt-text.d.ts +2 -0
  294. package/dist/plugin/chat-message/session-model.d.ts +4 -0
  295. package/dist/plugin/chat-message/start-work-message.d.ts +5 -0
  296. package/dist/plugin/chat-message/types.d.ts +67 -0
  297. package/dist/plugin/chat-message.d.ts +3 -24
  298. package/dist/plugin/event-error-utils.d.ts +14 -0
  299. package/dist/plugin/event-hook-dispatcher.d.ts +5 -0
  300. package/dist/plugin/event-model-fallback-state.d.ts +30 -0
  301. package/dist/plugin/event-model-fallback.d.ts +39 -0
  302. package/dist/plugin/event-session-lifecycle.d.ts +49 -0
  303. package/dist/plugin/event-session-recovery.d.ts +9 -0
  304. package/dist/plugin/event-team-handlers.d.ts +13 -0
  305. package/dist/plugin/event-types.d.ts +78 -0
  306. package/dist/plugin/event.d.ts +3 -12
  307. package/dist/plugin/hooks/create-core-hooks.d.ts +1 -0
  308. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
  309. package/dist/plugin/hooks/model-fallback-title-updater.d.ts +8 -0
  310. package/dist/plugin/session-compacting.d.ts +4 -1
  311. package/dist/plugin/system-transform.d.ts +1 -1
  312. package/dist/plugin/tool-execute-after.d.ts +2 -0
  313. package/dist/plugin/tool-registry-core-tools.d.ts +15 -0
  314. package/dist/plugin/tool-registry-factories.d.ts +36 -0
  315. package/dist/plugin/tool-registry-gated-tools.d.ts +16 -0
  316. package/dist/plugin/tool-registry-team-tools.d.ts +14 -0
  317. package/dist/plugin/tool-registry-trimming.d.ts +2 -0
  318. package/dist/plugin/tool-registry.d.ts +3 -38
  319. package/dist/plugin/ultrawork-db-model-override.d.ts +1 -1
  320. package/dist/plugin-config/agent-order-warnings.d.ts +1 -0
  321. package/dist/plugin-config/config-merger.d.ts +2 -0
  322. package/dist/plugin-config/layered-config-loader.d.ts +2 -0
  323. package/dist/plugin-config/single-config-loader.d.ts +4 -0
  324. package/dist/plugin-config.d.ts +3 -5
  325. package/dist/plugin-handlers/agent-config-assembly.d.ts +19 -0
  326. package/dist/plugin-handlers/agent-config-finalizer.d.ts +4 -0
  327. package/dist/plugin-handlers/agent-config-handler.d.ts +2 -11
  328. package/dist/plugin-handlers/agent-config-types.d.ts +30 -0
  329. package/dist/plugin-handlers/agent-skill-discovery.d.ts +3 -0
  330. package/dist/plugin-handlers/agent-source-loader.d.ts +2 -0
  331. package/dist/plugin-handlers/hook-config-handler.d.ts +0 -3
  332. package/dist/shared/context-window-usage.d.ts +7 -0
  333. package/dist/shared/dynamic-truncator-types.d.ts +17 -0
  334. package/dist/shared/dynamic-truncator.d.ts +8 -23
  335. package/dist/shared/migration/migrations-sidecar.d.ts +2 -2
  336. package/dist/shared/migration/model-versions.d.ts +7 -4
  337. package/dist/shared/model-availability.d.ts +1 -1
  338. package/dist/shared/opencode-version.d.ts +2 -2
  339. package/dist/shared/sparkshell-awareness.d.ts +5 -0
  340. package/dist/shared/spawn-with-windows-hide.d.ts +2 -0
  341. package/dist/shared/token-limit-truncator.d.ts +2 -0
  342. package/dist/testing/module-mock-lifecycle.d.ts +8 -0
  343. package/dist/tools/delegate-task/openai-categories.d.ts +0 -1
  344. package/dist/tools/delegate-task/subagent-agent-match.d.ts +3 -0
  345. package/dist/tools/delegate-task/subagent-model-resolution.d.ts +4 -0
  346. package/dist/tools/delegate-task/subagent-request-preflight.d.ts +3 -0
  347. package/dist/tools/delegate-task/subagent-resolution-types.d.ts +32 -0
  348. package/dist/tools/delegate-task/subagent-resolver.d.ts +3 -12
  349. package/dist/tools/delegate-task/sync-completion-message.d.ts +20 -0
  350. package/dist/tools/delegate-task/sync-poll-error-recovery.d.ts +1 -0
  351. package/dist/tools/delegate-task/sync-session-lifecycle.d.ts +12 -0
  352. package/dist/tools/delegate-task/sync-session-poller.d.ts +2 -0
  353. package/dist/tools/delegate-task/sync-spawn-reservation.d.ts +10 -0
  354. package/dist/tools/delegate-task/sync-task-metadata.d.ts +11 -0
  355. package/dist/tools/delegate-task/sync-task-runner.d.ts +30 -0
  356. package/dist/tools/delegate-task/sync-task.d.ts +2 -1
  357. package/dist/tools/hashline-edit/formatter-trigger.d.ts +2 -2
  358. package/package.json +15 -14
  359. package/packages/git-bash-mcp/dist/cli.js +29 -12
  360. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.d.ts +1 -1
  361. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +1 -1
  362. package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +95 -30
  363. package/packages/lsp-tools-mcp/dist/lsp/server-installation.d.ts +1 -2
  364. package/packages/lsp-tools-mcp/dist/lsp/server-installation.js +1 -11
  365. package/packages/lsp-tools-mcp/dist/lsp/transport.d.ts +1 -0
  366. package/packages/lsp-tools-mcp/dist/lsp/transport.js +5 -10
  367. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.d.ts +4 -1
  368. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +84 -23
  369. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +2 -0
  370. package/packages/lsp-tools-mcp/dist/missing-dependency-result.js +14 -0
  371. package/packages/lsp-tools-mcp/dist/tools.js +64 -80
  372. package/packages/lsp-tools-mcp/package.json +4 -4
  373. package/packages/omo-codex/lazycodex-repository/.github/workflows/pr-source-guidance.yml +36 -0
  374. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  375. package/packages/omo-codex/plugin/README.md +3 -1
  376. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +188 -0
  377. package/packages/omo-codex/plugin/components/comment-checker/src/core-values.ts +1 -0
  378. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +15 -361
  379. package/packages/omo-codex/plugin/components/comment-checker/src/hook-input.ts +19 -0
  380. package/packages/omo-codex/plugin/components/comment-checker/src/record.ts +11 -0
  381. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +102 -0
  382. package/packages/omo-codex/plugin/components/comment-checker/src/types.ts +51 -0
  383. package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook.test.ts +145 -0
  384. package/packages/omo-codex/plugin/components/comment-checker/test/core.test.ts +200 -0
  385. package/packages/omo-codex/plugin/components/lsp/CHANGELOG.md +2 -2
  386. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +11 -5
  387. package/packages/omo-codex/plugin/components/rules/src/hook-output.ts +11 -1
  388. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +0 -1
  389. package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +1 -4
  390. package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-cache.ts +87 -0
  391. package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-loader.ts +94 -0
  392. package/packages/omo-codex/plugin/components/rules/src/rules/engine-loader.ts +84 -0
  393. package/packages/omo-codex/plugin/components/rules/src/rules/engine-paths.ts +103 -0
  394. package/packages/omo-codex/plugin/components/rules/src/rules/engine-static-loader.ts +43 -0
  395. package/packages/omo-codex/plugin/components/rules/src/rules/engine-types.ts +45 -0
  396. package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -419
  397. package/packages/omo-codex/plugin/components/rules/src/rules/formatter.ts +39 -13
  398. package/packages/omo-codex/plugin/components/rules/src/rules/parser-frontmatter.ts +39 -0
  399. package/packages/omo-codex/plugin/components/rules/src/rules/parser-yaml.ts +271 -0
  400. package/packages/omo-codex/plugin/components/rules/src/rules/parser.ts +3 -294
  401. package/packages/omo-codex/plugin/components/rules/src/rules/truncator.ts +17 -0
  402. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +57 -0
  403. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +13 -2
  404. package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +17 -0
  405. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +2 -1
  406. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +26 -11
  407. package/packages/omo-codex/plugin/components/rules/test/codex-hook-context-pressure.test.ts +104 -138
  408. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +5 -2
  409. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +12 -5
  410. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +10 -4
  411. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +65 -3
  412. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +67 -2
  413. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +16 -0
  414. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +153 -0
  415. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +12 -0
  416. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +236 -0
  417. package/packages/omo-codex/plugin/components/rules/test/tool-paths.test.ts +28 -50
  418. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +6 -3
  419. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +13 -6
  420. package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +21 -0
  421. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +64 -2
  422. package/packages/omo-codex/plugin/components/telemetry/README.md +11 -1
  423. package/packages/omo-codex/plugin/components/telemetry/biome.json +12 -0
  424. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +30 -3
  425. package/packages/omo-codex/plugin/components/telemetry/src/diagnostics.ts +154 -0
  426. package/packages/omo-codex/plugin/components/telemetry/src/posthog-activity-state.ts +18 -2
  427. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +36 -4
  428. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook-diagnostics.test.ts +115 -0
  429. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +16 -25
  430. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +119 -0
  431. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +1 -1
  432. package/packages/omo-codex/plugin/components/ultrawork/README.md +5 -5
  433. package/packages/omo-codex/plugin/components/ultrawork/agents/codex-ultrawork-reviewer.toml +2 -1
  434. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -0
  435. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +0 -1
  436. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +0 -1
  437. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -2
  438. package/packages/omo-codex/plugin/components/ultrawork/directive.md +97 -32
  439. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +65 -0
  440. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/agents/openai.yaml +7 -0
  441. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +131 -0
  442. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +38 -10
  443. package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +18 -0
  444. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +47 -0
  445. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  446. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +12 -8
  447. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +28 -21
  448. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +2 -3
  449. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +7 -7
  450. package/packages/omo-codex/plugin/components/ulw-loop/src/command-types.ts +36 -0
  451. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +64 -0
  452. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +98 -0
  453. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +17 -2
  454. package/packages/omo-codex/plugin/components/ulw-loop/src/runtime.ts +22 -0
  455. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +69 -0
  456. package/packages/omo-codex/plugin/components/ulw-loop/src/types.ts +5 -277
  457. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +35 -13
  458. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +52 -0
  459. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering.test.ts +67 -111
  460. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
  461. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +31 -2
  462. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +46 -9
  463. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +20 -29
  464. package/packages/omo-codex/plugin/model-catalog.json +5 -11
  465. package/packages/omo-codex/plugin/package-lock.json +1 -1
  466. package/packages/omo-codex/plugin/scripts/auto-update-state.mjs +78 -0
  467. package/packages/omo-codex/plugin/scripts/auto-update.mjs +166 -76
  468. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +71 -0
  469. package/packages/omo-codex/plugin/scripts/migrate-codex-config/config-paths.mjs +44 -0
  470. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +40 -0
  471. package/packages/omo-codex/plugin/scripts/migrate-codex-config/root-settings.mjs +74 -0
  472. package/packages/omo-codex/plugin/scripts/migrate-codex-config/state.mjs +29 -0
  473. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +33 -204
  474. package/packages/omo-codex/plugin/scripts/spawn-command.mjs +11 -0
  475. package/packages/omo-codex/plugin/scripts/sync-hook-status-messages.mjs +23 -9
  476. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +131 -28
  477. package/packages/omo-codex/plugin/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
  478. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +100 -0
  479. package/packages/omo-codex/plugin/skills/git-master/agents/openai.yaml +13 -0
  480. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -7
  481. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
  482. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
  483. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
  484. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +119 -14
  485. package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +4 -2
  486. package/packages/omo-codex/plugin/skills/programming/references/go/concurrency.md +2 -2
  487. package/packages/omo-codex/plugin/skills/programming/references/python/async-anyio.md +6 -6
  488. package/packages/omo-codex/plugin/skills/programming/references/python/pydantic-ai.md +12 -12
  489. package/packages/omo-codex/plugin/skills/programming/references/typescript/backend-hono.md +7 -7
  490. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +13 -11
  491. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -8
  492. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +68 -33
  493. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +86 -22
  494. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +770 -0
  495. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +12 -8
  496. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +28 -21
  497. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +45 -379
  498. package/packages/omo-codex/plugin/skills/ulw-plan/agents/openai.yaml +7 -0
  499. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +131 -0
  500. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +237 -0
  501. package/packages/omo-codex/plugin/skills/visual-qa/scripts/ansi.ts +17 -0
  502. package/packages/omo-codex/plugin/skills/visual-qa/scripts/cli.ts +82 -0
  503. package/packages/omo-codex/plugin/skills/visual-qa/scripts/east-asian-width.ts +72 -0
  504. package/packages/omo-codex/plugin/skills/visual-qa/scripts/image-diff.ts +109 -0
  505. package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-crc.ts +27 -0
  506. package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-decode.ts +206 -0
  507. package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-synth.ts +57 -0
  508. package/packages/omo-codex/plugin/skills/visual-qa/scripts/tui-grid.ts +88 -0
  509. package/packages/omo-codex/plugin/skills/visual-qa/scripts/types.ts +54 -0
  510. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +55 -0
  511. package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +38 -0
  512. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +164 -0
  513. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +73 -0
  514. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +69 -0
  515. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +53 -0
  516. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +83 -0
  517. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +67 -0
  518. package/packages/omo-codex/plugin/test/aggregate.test.mjs +2 -514
  519. package/packages/omo-codex/plugin/test/auto-update-state-persistence.test.mjs +36 -0
  520. package/packages/omo-codex/plugin/test/auto-update.test.mjs +191 -29
  521. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +1 -1
  522. package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +29 -0
  523. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +23 -10
  524. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +81 -0
  525. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +91 -0
  526. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +244 -9
  527. package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +0 -19
  528. package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +107 -0
  529. package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +82 -7
  530. package/packages/omo-codex/plugin/test/sync-hook-status-messages.test.mjs +58 -6
  531. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +152 -0
  532. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +158 -50
  533. package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +43 -0
  534. package/packages/omo-codex/scripts/install/agent-source-roots.mjs +13 -0
  535. package/packages/omo-codex/scripts/install/agents.mjs +84 -14
  536. package/packages/omo-codex/scripts/install/bin-links.mjs +239 -0
  537. package/packages/omo-codex/scripts/install/cache.mjs +152 -108
  538. package/packages/omo-codex/scripts/install/cached-marketplace-manifest.mjs +21 -0
  539. package/packages/omo-codex/scripts/install/cli-args.mjs +39 -2
  540. package/packages/omo-codex/scripts/install/config.mjs +9 -5
  541. package/packages/omo-codex/scripts/install/lazycodex-version-stamp.mjs +102 -0
  542. package/packages/omo-codex/scripts/install/legacy-bins.mjs +9 -1
  543. package/packages/omo-codex/scripts/install/model-catalog.mjs +9 -1
  544. package/packages/omo-codex/scripts/install/multi-agent-v2-config.mjs +12 -10
  545. package/packages/omo-codex/scripts/install/process.mjs +3 -1
  546. package/packages/omo-codex/scripts/install/project-local-cleanup.mjs +0 -1
  547. package/packages/omo-codex/scripts/install/snapshot.mjs +0 -1
  548. package/packages/omo-codex/scripts/install-agent-links.test.mjs +205 -11
  549. package/packages/omo-codex/scripts/install-bin-links.test.mjs +123 -1
  550. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +129 -5
  551. package/packages/omo-codex/scripts/install-cli-args.test.mjs +82 -1
  552. package/packages/omo-codex/scripts/install-config-preservation.test.mjs +43 -0
  553. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +14 -1
  554. package/packages/omo-codex/scripts/install-config.test.mjs +49 -1
  555. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +84 -0
  556. package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +51 -0
  557. package/packages/omo-codex/scripts/install-local.mjs +42 -40
  558. package/packages/omo-codex/scripts/install-local.test.mjs +17 -241
  559. package/packages/omo-codex/scripts/install-marketplace-cache.test.mjs +162 -0
  560. package/packages/omo-codex/scripts/install-packaged-local.test.mjs +10 -6
  561. package/packages/omo-codex/scripts/install-project-local-cleanup.test.mjs +73 -2
  562. package/packages/omo-codex/scripts/sync-telemetry-component.mjs +1 -0
  563. package/packages/shared-skills/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
  564. package/packages/shared-skills/skills/git-master/SKILL.md +100 -0
  565. package/packages/shared-skills/skills/git-master/agents/openai.yaml +13 -0
  566. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
  567. package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
  568. package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
  569. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +119 -14
  570. package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +4 -2
  571. package/packages/shared-skills/skills/programming/references/go/concurrency.md +2 -2
  572. package/packages/shared-skills/skills/programming/references/python/async-anyio.md +6 -6
  573. package/packages/shared-skills/skills/programming/references/python/pydantic-ai.md +12 -12
  574. package/packages/shared-skills/skills/programming/references/typescript/backend-hono.md +7 -7
  575. package/packages/shared-skills/skills/refactor/SKILL.md +4 -4
  576. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  577. package/packages/shared-skills/skills/review-work/SKILL.md +55 -33
  578. package/packages/shared-skills/skills/start-work/SKILL.md +76 -19
  579. package/packages/shared-skills/skills/ultraresearch/SKILL.md +770 -0
  580. package/packages/shared-skills/skills/visual-qa/SKILL.md +219 -0
  581. package/packages/shared-skills/skills/visual-qa/scripts/ansi.test.ts +45 -0
  582. package/packages/shared-skills/skills/visual-qa/scripts/ansi.ts +17 -0
  583. package/packages/shared-skills/skills/visual-qa/scripts/cli.test.ts +73 -0
  584. package/packages/shared-skills/skills/visual-qa/scripts/cli.ts +82 -0
  585. package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.test.ts +60 -0
  586. package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.ts +72 -0
  587. package/packages/shared-skills/skills/visual-qa/scripts/image-diff.test.ts +70 -0
  588. package/packages/shared-skills/skills/visual-qa/scripts/image-diff.ts +109 -0
  589. package/packages/shared-skills/skills/visual-qa/scripts/png-crc.ts +27 -0
  590. package/packages/shared-skills/skills/visual-qa/scripts/png-decode.test.ts +44 -0
  591. package/packages/shared-skills/skills/visual-qa/scripts/png-decode.ts +206 -0
  592. package/packages/shared-skills/skills/visual-qa/scripts/png-synth.ts +57 -0
  593. package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +83 -0
  594. package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.test.ts +57 -0
  595. package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.ts +88 -0
  596. package/packages/shared-skills/skills/visual-qa/scripts/types.ts +54 -0
  597. package/postinstall.mjs +24 -1
  598. package/dist/agents/custom-agent-summaries.d.ts +0 -8
  599. package/dist/agents/hephaestus/gpt-5-3-codex.d.ts +0 -20
  600. package/dist/agents/prometheus/gemini.d.ts +0 -1
  601. package/dist/agents/prometheus/gpt.d.ts +0 -1
  602. package/dist/agents/sisyphus-junior/gpt-5-3-codex.d.ts +0 -8
  603. package/dist/features/background-agent/session-route.d.ts +0 -12
  604. package/dist/features/background-agent/spawner/parent-directory-resolver.d.ts +0 -6
  605. package/dist/features/background-agent/state.d.ts +0 -35
  606. package/dist/features/claude-tasks/session-storage.d.ts +0 -9
  607. package/dist/features/mcp-oauth/resource-indicator.d.ts +0 -2
  608. package/dist/features/mcp-oauth/schema.d.ts +0 -6
  609. package/dist/features/opencode-skill-loader/async-loader.d.ts +0 -6
  610. package/dist/features/opencode-skill-loader/blocking.d.ts +0 -2
  611. package/dist/features/opencode-skill-loader/discover-worker.d.ts +0 -1
  612. package/dist/hooks/session-recovery/recover-empty-content-message-sdk.d.ts +0 -13
  613. package/dist/shared/bun-hash-shim.d.ts +0 -1
  614. package/dist/tools/delegate-task/resolve-call-id.d.ts +0 -2
  615. package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -383
  616. /package/packages/lsp-tools-mcp/dist/lsp/{utils.d.ts → startup-failure.d.ts} +0 -0
  617. /package/packages/lsp-tools-mcp/dist/lsp/{utils.js → startup-failure.js} +0 -0
@@ -4,12 +4,13 @@ import { tmpdir } from "node:os";
4
4
  import { dirname, join } from "node:path";
5
5
  import test from "node:test";
6
6
 
7
+ import { disableMultiAgentV2IfForced } from "../scripts/migrate-codex-config/multi-agent-v2-guard.mjs";
7
8
  import { ensureCodexReasoningConfig, migrateCodexConfig } from "../scripts/migrate-codex-config.mjs";
8
9
 
9
10
  test("#given stale root reasoning config #when ensuring config #then replaces stale values without duplicate keys", () => {
10
11
  const result = ensureCodexReasoningConfig(
11
12
  [
12
- 'model = "gpt-5.2"',
13
+ 'model = "gpt-5.5"',
13
14
  "model_context_window = 272000",
14
15
  'model_reasoning_effort = "low"',
15
16
  'plan_mode_reasoning_effort = "medium"',
@@ -32,6 +33,29 @@ test("#given stale root reasoning config #when ensuring config #then replaces st
32
33
  assert.match(result, /\[features\]/);
33
34
  });
34
35
 
36
+ test("#given section settings reuse managed root keys #when ensuring config #then section settings are preserved", () => {
37
+ const result = ensureCodexReasoningConfig(
38
+ [
39
+ 'model = "gpt-5.5"',
40
+ "model_context_window = 272000",
41
+ "",
42
+ "[model_providers.openai]",
43
+ 'model = "provider-scoped-value"',
44
+ "model_context_window = 123456",
45
+ "",
46
+ "[profiles.review]",
47
+ 'model_reasoning_effort = "medium"',
48
+ 'plan_mode_reasoning_effort = "medium"',
49
+ "",
50
+ ].join("\n"),
51
+ );
52
+
53
+ assert.match(result, /^model = "gpt-5\.5"$/m);
54
+ assert.match(result, /^model_context_window = 400000$/m);
55
+ assert.match(result, /\[model_providers\.openai\]\nmodel = "provider-scoped-value"\nmodel_context_window = 123456/);
56
+ assert.match(result, /\[profiles\.review\]\nmodel_reasoning_effort = "medium"\nplan_mode_reasoning_effort = "medium"/);
57
+ });
58
+
35
59
  test("#given project .codex is a symlink #when migrating #then project config is skipped", async (t) => {
36
60
  if (!(await canCreateSymlink("dir"))) t.skip("symbolic links are unavailable in this environment");
37
61
 
@@ -47,8 +71,8 @@ test("#given project .codex is a symlink #when migrating #then project config is
47
71
  await mkdir(projectCodexDirectory, { recursive: true });
48
72
  await mkdir(dirname(projectConfigTarget), { recursive: true });
49
73
  await mkdir(projectNested, { recursive: true });
50
- await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.2"\n');
51
- await writeFile(projectConfigTarget, 'model = "gpt-5.2"\nmodel_context_window = 272000\n');
74
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
75
+ await writeFile(projectConfigTarget, 'model = "gpt-5.4"\nmodel_context_window = 272000\n');
52
76
  await rm(join(project, ".codex"), { recursive: true, force: true });
53
77
  await symlink(projectCodexDirectory, join(project, ".codex"), "dir");
54
78
 
@@ -61,7 +85,7 @@ test("#given project .codex is a symlink #when migrating #then project config is
61
85
  });
62
86
 
63
87
  assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
64
- assert.match(await readFile(projectConfig, "utf8"), /model = "gpt-5\.2"/);
88
+ assert.match(await readFile(projectConfig, "utf8"), /model = "gpt-5\.4"/);
65
89
  });
66
90
 
67
91
  test("#given project config.toml is a symlink #when migrating #then project config is skipped", async (t) => {
@@ -76,8 +100,8 @@ test("#given project config.toml is a symlink #when migrating #then project conf
76
100
 
77
101
  await mkdir(codexHome, { recursive: true });
78
102
  await mkdir(projectConfigDirectory, { recursive: true });
79
- await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.2"\n');
80
- await writeFile(realConfigSource, 'model = "gpt-5.2"\nmodel_context_window = 272000\n');
103
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
104
+ await writeFile(realConfigSource, 'model = "gpt-5.4"\nmodel_context_window = 272000\n');
81
105
  await symlink(realConfigSource, projectConfig, "file");
82
106
 
83
107
  const result = await migrateCodexConfig({
@@ -89,7 +113,7 @@ test("#given project config.toml is a symlink #when migrating #then project conf
89
113
  });
90
114
 
91
115
  assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
92
- assert.match(await readFile(realConfigSource, "utf8"), /model = "gpt-5\.2"/);
116
+ assert.match(await readFile(realConfigSource, "utf8"), /model = "gpt-5\.4"/);
93
117
  });
94
118
 
95
119
  test("#given global and project-local stale Codex configs #when migrating #then both configs are forced to current defaults", async () => {
@@ -99,8 +123,8 @@ test("#given global and project-local stale Codex configs #when migrating #then
99
123
  const projectConfig = join(root, "project", ".codex", "config.toml");
100
124
  await mkdir(codexHome, { recursive: true });
101
125
  await mkdir(dirname(projectConfig), { recursive: true });
102
- await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.2"\n');
103
- await writeFile(projectConfig, 'model = "gpt-5.2"\nmodel_context_window = 272000\n');
126
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
127
+ await writeFile(projectConfig, 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
104
128
 
105
129
  const result = await migrateCodexConfig({
106
130
  env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json") },
@@ -112,6 +136,51 @@ test("#given global and project-local stale Codex configs #when migrating #then
112
136
  assert.match(await readFile(projectConfig, "utf8"), /model_context_window = 400000/);
113
137
  });
114
138
 
139
+ test("#given model catalog is unavailable and stale 272k config #when migrating #then fallback catalog still upgrades it", async () => {
140
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-config-fallback-catalog-"));
141
+ const codexHome = join(root, "codex-home");
142
+ const missingCatalog = join(root, "missing-model-catalog.json");
143
+ await mkdir(codexHome, { recursive: true });
144
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
145
+
146
+ const result = await migrateCodexConfig({
147
+ env: {
148
+ CODEX_HOME: codexHome,
149
+ LAZYCODEX_MODEL_CATALOG_PATH: missingCatalog,
150
+ LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
151
+ },
152
+ cwd: root,
153
+ });
154
+
155
+ const content = await readFile(join(codexHome, "config.toml"), "utf8");
156
+ assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
157
+ assert.match(content, /model = "gpt-5\.5"/);
158
+ assert.match(content, /model_context_window = 400000/);
159
+ });
160
+
161
+ test("#given model catalog is malformed and stale config #when migrating #then fallback catalog still upgrades it", async () => {
162
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-config-malformed-catalog-"));
163
+ const codexHome = join(root, "codex-home");
164
+ const catalogPath = join(root, "model-catalog.json");
165
+ await mkdir(codexHome, { recursive: true });
166
+ await writeFile(catalogPath, "{not-json");
167
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
168
+
169
+ const result = await migrateCodexConfig({
170
+ env: {
171
+ CODEX_HOME: codexHome,
172
+ LAZYCODEX_MODEL_CATALOG_PATH: catalogPath,
173
+ LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
174
+ },
175
+ cwd: root,
176
+ });
177
+
178
+ const content = await readFile(join(codexHome, "config.toml"), "utf8");
179
+ assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
180
+ assert.match(content, /model = "gpt-5\.5"/);
181
+ assert.match(content, /model_context_window = 400000/);
182
+ });
183
+
115
184
  test("#given user-customized Codex model config #when migrating #then user values are preserved", async () => {
116
185
  const root = await mkdtemp(join(tmpdir(), "lazycodex-config-custom-"));
117
186
  const codexHome = join(root, "codex-home");
@@ -140,6 +209,43 @@ test("#given user-customized Codex model config #when migrating #then user value
140
209
  assert.match(content, /plan_mode_reasoning_effort = "medium"/);
141
210
  });
142
211
 
212
+ test("#given managed config state is malformed #when migrating #then migration ignores stale state safely", async () => {
213
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-config-malformed-state-"));
214
+ const codexHome = join(root, "codex-home");
215
+ const statePath = join(root, "model-state.json");
216
+ await mkdir(codexHome, { recursive: true });
217
+ await writeFile(statePath, "[broken-json");
218
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
219
+
220
+ const result = await migrateCodexConfig({
221
+ env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: statePath },
222
+ cwd: root,
223
+ });
224
+
225
+ const content = await readFile(join(codexHome, "config.toml"), "utf8");
226
+ const state = JSON.parse(await readFile(statePath, "utf8"));
227
+ assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
228
+ assert.match(content, /model_context_window = 400000/);
229
+ assert.equal(state.files[join(codexHome, "config.toml")].managed, true);
230
+ });
231
+
232
+ test("#given managed config state path has surrounding whitespace #when migrating #then trimmed state path is used", async () => {
233
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-config-trimmed-state-"));
234
+ const codexHome = join(root, "codex-home");
235
+ const statePath = join(root, "model-state.json");
236
+ await mkdir(codexHome, { recursive: true });
237
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
238
+
239
+ const result = await migrateCodexConfig({
240
+ env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: ` ${statePath} ` },
241
+ cwd: root,
242
+ });
243
+
244
+ const state = JSON.parse(await readFile(statePath, "utf8"));
245
+ assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
246
+ assert.equal(state.files[join(codexHome, "config.toml")].managed, true);
247
+ });
248
+
143
249
  test("#given managed catalog state #when catalog version advances #then only previously managed config is updated", async () => {
144
250
  const root = await mkdtemp(join(tmpdir(), "lazycodex-config-catalog-state-"));
145
251
  const codexHome = join(root, "codex-home");
@@ -205,6 +311,135 @@ test("#given managed catalog state #when catalog version advances #then only pre
205
311
  assert.match(content, /model_context_window = 400000/);
206
312
  });
207
313
 
314
+ test("#given config already matches current catalog #when catalog version advances for role-only changes #then managed state is preserved", async () => {
315
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-config-current-managed-"));
316
+ const codexHome = join(root, "codex-home");
317
+ const catalogPath = join(root, "catalog.json");
318
+ const statePath = join(root, "model-state.json");
319
+ const configPath = join(codexHome, "config.toml");
320
+ await mkdir(codexHome, { recursive: true });
321
+ await writeFile(
322
+ configPath,
323
+ [
324
+ 'model = "gpt-5.5"',
325
+ "model_context_window = 400000",
326
+ 'model_reasoning_effort = "high"',
327
+ 'plan_mode_reasoning_effort = "xhigh"',
328
+ "",
329
+ ].join("\n"),
330
+ );
331
+ await writeFile(
332
+ catalogPath,
333
+ JSON.stringify(
334
+ {
335
+ version: "test.role-only",
336
+ current: {
337
+ model: "gpt-5.5",
338
+ model_context_window: 400000,
339
+ model_reasoning_effort: "high",
340
+ plan_mode_reasoning_effort: "xhigh",
341
+ },
342
+ roles: { verifier: { model: "gpt-5.5", model_reasoning_effort: "high" } },
343
+ managedProfiles: [],
344
+ },
345
+ null,
346
+ 2,
347
+ ),
348
+ );
349
+
350
+ const result = await migrateCodexConfig({
351
+ env: {
352
+ CODEX_HOME: codexHome,
353
+ LAZYCODEX_MODEL_CATALOG_PATH: catalogPath,
354
+ LAZYCODEX_MODEL_CATALOG_STATE_PATH: statePath,
355
+ },
356
+ cwd: root,
357
+ });
358
+
359
+ const state = JSON.parse(await readFile(statePath, "utf8"));
360
+ assert.deepEqual(result.changed, []);
361
+ assert.equal(state.files[configPath].managed, true);
362
+ assert.equal(state.files[configPath].catalogVersion, "test.role-only");
363
+ });
364
+
365
+ test("#given installer-forced multi_agent_v2 enabled #when migrating config #then disables it so runtime decides per model", () => {
366
+ const config = [
367
+ 'model = "gpt-5.5"',
368
+ 'model_reasoning_effort = "high"',
369
+ "",
370
+ "[features.multi_agent_v2]",
371
+ "enabled = true",
372
+ "max_concurrent_threads_per_session = 10000",
373
+ "",
374
+ ].join("\n");
375
+
376
+ const result = disableMultiAgentV2IfForced(config);
377
+
378
+ assert.match(result, /enabled = false/);
379
+ assert.doesNotMatch(result, /enabled = true/);
380
+ assert.match(result, /max_concurrent_threads_per_session = 10000/);
381
+ });
382
+
383
+ test("#given no multi_agent_v2 section #when migrating config #then returns config unchanged", () => {
384
+ const config = [
385
+ 'model = "gpt-5.5"',
386
+ 'model_reasoning_effort = "high"',
387
+ "",
388
+ "[features]",
389
+ "plugins = true",
390
+ "",
391
+ ].join("\n");
392
+
393
+ const result = disableMultiAgentV2IfForced(config);
394
+
395
+ assert.equal(result, config);
396
+ });
397
+
398
+ test("#given multi_agent_v2 already disabled #when migrating config #then returns config unchanged", () => {
399
+ const config = [
400
+ 'model = "gpt-5.5"',
401
+ 'model_reasoning_effort = "high"',
402
+ "",
403
+ "[features.multi_agent_v2]",
404
+ "enabled = false",
405
+ "max_concurrent_threads_per_session = 10000",
406
+ "",
407
+ ].join("\n");
408
+
409
+ const result = disableMultiAgentV2IfForced(config);
410
+
411
+ assert.equal(result, config);
412
+ });
413
+
414
+ test("#given global config with forced multi_agent_v2 #when full migration runs #then disables it on disk", async () => {
415
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-multi-agent-v2-guard-"));
416
+ const codexHome = join(root, "codex-home");
417
+ await mkdir(codexHome, { recursive: true });
418
+ const configPath = join(codexHome, "config.toml");
419
+ await writeFile(
420
+ configPath,
421
+ [
422
+ 'model = "gpt-5.5"',
423
+ 'model_reasoning_effort = "high"',
424
+ "",
425
+ "[features.multi_agent_v2]",
426
+ "enabled = true",
427
+ "max_concurrent_threads_per_session = 10000",
428
+ "",
429
+ ].join("\n"),
430
+ );
431
+
432
+ const result = await migrateCodexConfig({
433
+ env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json") },
434
+ cwd: root,
435
+ });
436
+
437
+ assert.deepEqual(result.changed, [configPath]);
438
+ const content = await readFile(configPath, "utf8");
439
+ assert.match(content, /enabled = false/);
440
+ assert.doesNotMatch(content, /enabled = true/);
441
+ });
442
+
208
443
  async function canCreateSymlink(type) {
209
444
  const root = await mkdtemp(join(tmpdir(), "lazycodex-symlink-capability-"));
210
445
  const target = join(root, "target");
@@ -27,22 +27,3 @@ test("#given Codex Light install docs #when inspected #then lazycodex is npm-fir
27
27
  assert.doesNotMatch(text, /\bbunx lazycodex-ai\b/, `${path} should not require Bun for lazycodex`);
28
28
  }
29
29
  });
30
-
31
- test("#given cleanup troubleshooting docs #when inspected #then project-local cleanup and command delegation are documented", async () => {
32
- // given
33
- const files = [
34
- join(repoRoot, "README.md"),
35
- join(repoRoot, "docs", "guide", "installation.md"),
36
- join(repoRoot, "packages", "omo-codex", "README.md"),
37
- ];
38
-
39
- // when
40
- const docs = await Promise.all(files.map(async (path) => [path, await readFile(path, "utf8")]));
41
-
42
- // then
43
- for (const [path, text] of docs) {
44
- assert.match(text, /\bnpx lazycodex-ai cleanup\b/, `${path} should document the LazyCodex cleanup command`);
45
- assert.match(text, /project-local .*\.codex\/config\.toml/i, `${path} should mention project-local config repair`);
46
- assert.match(text, /\.codex.*\.omx|\.omx.*\.codex/s, `${path} should distinguish project-local .codex and .omx artifacts`);
47
- }
48
- });
@@ -0,0 +1,107 @@
1
+ import assert from "node:assert/strict";
2
+ import { readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import test from "node:test";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const pluginRoot = dirname(dirname(fileURLToPath(import.meta.url)));
8
+ const repoRoot = dirname(dirname(dirname(pluginRoot)));
9
+ const startWorkSkillPaths = [
10
+ join(repoRoot, "packages", "shared-skills", "skills", "start-work", "SKILL.md"),
11
+ ];
12
+ const packagedStartWorkSkillPath = join(pluginRoot, "skills", "start-work", "SKILL.md");
13
+ const packagedReviewWorkSkillPath = join(pluginRoot, "skills", "review-work", "SKILL.md");
14
+ const hephaestusRulePath = join(pluginRoot, "components", "rules", "bundled-rules", "hephaestus.md");
15
+ const stopHookPath = join(
16
+ pluginRoot,
17
+ "components",
18
+ "start-work-continuation",
19
+ "src",
20
+ "codex-hook.ts",
21
+ );
22
+
23
+ test("#given start-work skill without selectable plan #when inspected #then bootstraps ulw-plan before execution", async () => {
24
+ // given
25
+ const missing = [];
26
+
27
+ // when
28
+ for (const skillPath of startWorkSkillPaths) {
29
+ const skill = await readFile(skillPath, "utf8");
30
+ if (
31
+ !/(?:no|zero)[^.]{0,120}(?:selectable|matching|existing|prometheus)?[^.]{0,120}plans?[^.]{0,160}(?:\$?ulw-plan|ulw-plan skill|spawn_agent\([^)]*ulw-plan)/is.test(
32
+ skill,
33
+ ) ||
34
+ !/(?:bootstrap|create|generate|draft)[^.]{0,120}(?:plan|prometheus plan)[^.]{0,120}(?:before|prior to)[^.]{0,80}(?:execution|implementation|boulder)/is.test(
35
+ skill,
36
+ )
37
+ ) {
38
+ missing.push(skillPath);
39
+ }
40
+ }
41
+
42
+ // then
43
+ assert.deepEqual(missing, []);
44
+ });
45
+
46
+ test("#given worker done claim #when start-work contract is inspected #then adversarial verification gates fully done", async () => {
47
+ // given
48
+ const missing = [];
49
+
50
+ // when
51
+ for (const skillPath of startWorkSkillPaths) {
52
+ const skill = await readFile(skillPath, "utf8");
53
+ if (
54
+ !/DoneClaim/i.test(skill) ||
55
+ !/worker done claim/i.test(skill) ||
56
+ !/stale_state/.test(skill) ||
57
+ !/misleading_success_output/.test(skill) ||
58
+ !/dirty_worktree/.test(skill) ||
59
+ !/Plan reread/i.test(skill) ||
60
+ !/Manual-QA/i.test(skill) ||
61
+ !/Adversarial QA/i.test(skill) ||
62
+ !/Cleanup/i.test(skill) ||
63
+ !/Only after verification passes/i.test(skill)
64
+ ) {
65
+ missing.push(skillPath);
66
+ }
67
+ }
68
+
69
+ // then
70
+ assert.deepEqual(missing, []);
71
+ });
72
+
73
+ test("#given packaged start-work completion surfaces #when inspected #then global review and debugging gate blocks completion", async () => {
74
+ // given
75
+ const [startWorkSkill, reviewWorkSkill, hephaestusRule] = await Promise.all([
76
+ readFile(packagedStartWorkSkillPath, "utf8"),
77
+ readFile(packagedReviewWorkSkillPath, "utf8"),
78
+ readFile(hephaestusRulePath, "utf8"),
79
+ ]);
80
+
81
+ // then
82
+ assert.match(startWorkSkill, /Global Review and Debugging Gate/);
83
+ assert.match(startWorkSkill, /\breview-work\b/);
84
+ assert.match(startWorkSkill, /\bdebugging\b/);
85
+ assert.match(startWorkSkill, /inconclusive/i);
86
+ assert.match(startWorkSkill, /redact|mask/i);
87
+ assert.match(startWorkSkill, /raw (?:tokens|credentials|auth headers|cookies)/i);
88
+ assert.match(startWorkSkill, /ORCHESTRATION COMPLETE/);
89
+ assert.match(reviewWorkSkill, /debugging/i);
90
+ assert.match(reviewWorkSkill, /inconclusive/i);
91
+ assert.match(hephaestusRule, /Global Review and Debugging Gate/);
92
+ assert.match(hephaestusRule, /redact.*secrets.*PII/s);
93
+ });
94
+
95
+ test("#given start-work continuation hook #when inspected #then it remains Boulder-only without planning bootstrap logic", async () => {
96
+ // given
97
+ const hook = await readFile(stopHookPath, "utf8");
98
+
99
+ // then
100
+ assert.match(hook, /readContinuationState/);
101
+ assert.match(hook, /START_WORK_CONTINUATION_DIRECTIVE/);
102
+ assert.match(hook, /decision:\s*"block"/);
103
+ assert.doesNotMatch(
104
+ hook,
105
+ /\bulw-plan\b|\bspawn_agent\b|\brequest_user_input\b|bootstrap|selectable plan|Phase 1|Create or update Boulder state/i,
106
+ );
107
+ });
@@ -10,6 +10,7 @@ const SKILLS = [
10
10
  "review-work",
11
11
  "start-work",
12
12
  "ulw-loop",
13
+ "ulw-plan",
13
14
  ];
14
15
 
15
16
  const AGENT_FILES = [
@@ -28,13 +29,16 @@ test("#given orchestration skills #when inspected #then Codex subagent delegatio
28
29
  if (
29
30
  !/TASK:/.test(text) ||
30
31
  !/fork_turns:\s*"none"/.test(text) ||
31
- !/wait_agent.*signal, not proof/s.test(text) ||
32
- !/one targeted followup/.test(text) ||
32
+ !/wait_agent.*mailbox signals/s.test(text) ||
33
+ !/Fallback only when/.test(text) ||
33
34
  !/respawn.*smaller/s.test(text) ||
34
- !/model.*reasoning_effort.*default agent/s.test(text) ||
35
+ !/schema only accepts `task_name`, `message`, and `fork_turns`/s.test(text) ||
35
36
  !/Plan and reviewer agents may run for a long time/.test(text) ||
36
37
  !/short wait_agent cycles/.test(text) ||
37
- !/single long blocking wait/.test(text)
38
+ !/single long blocking wait/.test(text) ||
39
+ !/A timeout only means no new mailbox update arrived/i.test(text) ||
40
+ !/WORKING:/.test(text) ||
41
+ !/single `list_agents`/.test(text)
38
42
  ) {
39
43
  missing.push(skillPath);
40
44
  }
@@ -53,9 +57,67 @@ test("#given ultrawork directive #when inspected #then reviewer fallback keeps a
53
57
 
54
58
  // then
55
59
  assert.doesNotMatch(text, /any `gpt-5\.2`\s+xhigh reviewer/);
56
- assert.match(text, /codex-ultrawork-reviewer/);
57
- assert.match(text, /agent_type.*worker/s);
58
- assert.match(text, /model.*reasoning_effort.*default agent/s);
60
+ assert.match(text, /self-contained reviewer/);
61
+ assert.match(text, /schema cannot select.*TOML-backed reviewer role/s);
62
+ assert.match(text, /paste the reviewer requirements into\s+the message/s);
63
+ assert.match(text, /timeout only means no new mailbox update arrived/i);
64
+ assert.match(text, /WORKING:/);
65
+ assert.match(text, /single `list_agents`/);
66
+ });
67
+
68
+ test("#given ultrawork directive #when inspected #then dependent subagent transitions are blocked", async () => {
69
+ // given
70
+ const directivePath = "components/ultrawork/directive.md";
71
+
72
+ // when
73
+ const text = await readFile(join(root, directivePath), "utf8");
74
+
75
+ // then
76
+ assert.match(text, /Subagent-dependent transition barrier/);
77
+ assert.match(text, /Do not mark.*update_plan.*completed.*active child/s);
78
+ assert.match(text, /Do not start dependent implementation.*audit.*research.*review.*integrated/s);
79
+ assert.match(text, /Do not write the final answer.*active child agents/s);
80
+ assert.match(text, /two silent waits.*TASK STILL ACTIVE/s);
81
+ assert.match(text, /four silent or ack-only checks.*inconclusive/s);
82
+ });
83
+
84
+ test("#given ultrawork directive #when inspected #then TOML-backed routing is treated as unverified when native spawn cannot select it", async () => {
85
+ // given
86
+ const directivePath = "components/ultrawork/directive.md";
87
+
88
+ // when
89
+ const text = await readFile(join(root, directivePath), "utf8");
90
+
91
+ // then
92
+ assert.match(text, /TOML-backed subagent routing compatibility/);
93
+ assert.match(text, /routing-unverified/);
94
+ assert.match(text, /schema accepts only `task_name`, `message`, and\s+`fork_turns`/s);
95
+ assert.match(text, /cannot select a TOML-backed role, model, reasoning\s+effort, or `service_tier`/s);
96
+ assert.match(text, /paste the\s+role requirements into the message/s);
97
+ });
98
+
99
+ test("#given ulw-loop workflow #when inspected #then stale review refresh keeps policy changes narrow", async () => {
100
+ // given
101
+ const workflowPaths = [
102
+ "components/ulw-loop/skills/ulw-loop/references/full-workflow.md",
103
+ "skills/ulw-loop/references/full-workflow.md",
104
+ ];
105
+
106
+ // when
107
+ const missing = [];
108
+ for (const workflowPath of workflowPaths) {
109
+ const text = await readFile(join(root, workflowPath), "utf8");
110
+ if (
111
+ !/refresh current branch\/PR\/issue state/.test(text) ||
112
+ !/preserve existing ordering\/policy/.test(text) ||
113
+ !/separate compatibility detection from policy changes/.test(text)
114
+ ) {
115
+ missing.push(workflowPath);
116
+ }
117
+ }
118
+
119
+ // then
120
+ assert.deepEqual(missing, []);
59
121
  });
60
122
 
61
123
  test("#given ultrawork agents #when inspected #then inter-agent commentary is treated as assignments", async () => {
@@ -74,3 +136,16 @@ test("#given ultrawork agents #when inspected #then inter-agent commentary is tr
74
136
  // then
75
137
  assert.deepEqual(missing, []);
76
138
  });
139
+
140
+ test("#given reviewer receives a targeted still-active followup #when prompt is inspected #then it must fail loud", async () => {
141
+ // given
142
+ const reviewerPath = "components/ultrawork/agents/codex-ultrawork-reviewer.toml";
143
+
144
+ // when
145
+ const text = await readFile(join(root, reviewerPath), "utf8");
146
+
147
+ // then
148
+ assert.match(text, /TASK STILL ACTIVE:/);
149
+ assert.match(text, /BLOCKED: <reason>/);
150
+ assert.match(text, /instead of continuing silently/);
151
+ });
@@ -14,15 +14,18 @@ async function readJson(path) {
14
14
  return JSON.parse(await readFile(path, "utf8"));
15
15
  }
16
16
 
17
- test("#given a component without hooks #when hook status messages sync #then build-time version sync skips it", async () => {
17
+ test("#given source package versions and component without hooks #when hook status messages sync #then source versions are preserved", async () => {
18
18
  // given
19
- const root = await mkdtemp(join(tmpdir(), "omo-codex-hook-status-"));
19
+ const repoRoot = await mkdtemp(join(tmpdir(), "omo-codex-hook-status-"));
20
+ const root = join(repoRoot, "packages", "omo-codex", "plugin");
21
+ await mkdir(root, { recursive: true });
20
22
  await mkdir(join(root, ".codex-plugin"), { recursive: true });
21
23
  await mkdir(join(root, "hooks"), { recursive: true });
22
24
  await mkdir(join(root, "components", "comment-checker", "hooks"), { recursive: true });
23
25
  await mkdir(join(root, "components", "lsp", "hooks"), { recursive: true });
24
26
  await mkdir(join(root, "components", "git-bash"), { recursive: true });
25
27
  await mkdir(join(root, "components", "stale-build-output", "dist"), { recursive: true });
28
+ await writeJson(join(repoRoot, "package.json"), { version: "4.7.5" });
26
29
  await writeJson(join(root, ".codex-plugin", "plugin.json"), { version: "0.1.0" });
27
30
  await writeJson(join(root, "components", "comment-checker", "package.json"), { version: "0.1.1" });
28
31
  await writeJson(join(root, "components", "lsp", "package.json"), { version: "0.2.0" });
@@ -35,12 +38,12 @@ test("#given a component without hooks #when hook status messages sync #then bui
35
38
  {
36
39
  type: "command",
37
40
  command: 'node "${PLUGIN_ROOT}/components/comment-checker/dist/cli.js" hook post-tool-use',
38
- statusMessage: "LazyCodex(0.1.0): Checking Comments",
41
+ statusMessage: "LazyCodex(stale): Checking Comments",
39
42
  },
40
43
  {
41
44
  type: "command",
42
45
  command: 'node "${PLUGIN_ROOT}/components/lsp/dist/cli.js" hook post-tool-use',
43
- statusMessage: "LazyCodex(0.1.0): Checking LSP Diagnostics",
46
+ statusMessage: "LazyCodex(stale): Checking LSP Diagnostics",
44
47
  },
45
48
  ],
46
49
  },
@@ -55,7 +58,7 @@ test("#given a component without hooks #when hook status messages sync #then bui
55
58
  {
56
59
  type: "command",
57
60
  command: 'node "${PLUGIN_ROOT}/dist/cli.js" hook post-tool-use',
58
- statusMessage: "LazyCodex(0.1.0): Checking Comments",
61
+ statusMessage: "LazyCodex(stale): Checking Comments",
59
62
  },
60
63
  ],
61
64
  },
@@ -70,7 +73,7 @@ test("#given a component without hooks #when hook status messages sync #then bui
70
73
  {
71
74
  type: "command",
72
75
  command: 'node "${PLUGIN_ROOT}/dist/cli.js" hook post-tool-use',
73
- statusMessage: "LazyCodex(0.1.0): Checking LSP Diagnostics",
76
+ statusMessage: "LazyCodex(stale): Checking LSP Diagnostics",
74
77
  },
75
78
  ],
76
79
  },
@@ -90,3 +93,52 @@ test("#given a component without hooks #when hook status messages sync #then bui
90
93
  assert.equal(componentHooks.hooks.PostToolUse[0].hooks[0].statusMessage, "LazyCodex(0.1.1): Checking Comments");
91
94
  assert.equal(lspHooks.hooks.PostToolUse[0].hooks[0].statusMessage, "LazyCodex(0.2.0): Checking LSP Diagnostics");
92
95
  });
96
+
97
+ test("#given release version override #when hook status messages sync #then aggregate hooks use release version", async () => {
98
+ // given
99
+ const root = await mkdtemp(join(tmpdir(), "omo-codex-hook-status-release-"));
100
+ await mkdir(join(root, ".codex-plugin"), { recursive: true });
101
+ await mkdir(join(root, "hooks"), { recursive: true });
102
+ await mkdir(join(root, "components", "comment-checker", "hooks"), { recursive: true });
103
+ await writeJson(join(root, ".codex-plugin", "plugin.json"), { version: "0.1.0" });
104
+ await writeJson(join(root, "components", "comment-checker", "package.json"), { version: "0.1.1" });
105
+ await writeJson(join(root, "hooks", "hooks.json"), {
106
+ hooks: {
107
+ PostToolUse: [
108
+ {
109
+ hooks: [
110
+ {
111
+ type: "command",
112
+ command: 'node "${PLUGIN_ROOT}/components/comment-checker/dist/cli.js" hook post-tool-use',
113
+ statusMessage: "LazyCodex(stale): Checking Comments",
114
+ },
115
+ ],
116
+ },
117
+ ],
118
+ },
119
+ });
120
+ await writeJson(join(root, "components", "comment-checker", "hooks", "hooks.json"), {
121
+ hooks: {
122
+ PostToolUse: [
123
+ {
124
+ hooks: [
125
+ {
126
+ type: "command",
127
+ command: 'node "${PLUGIN_ROOT}/dist/cli.js" hook post-tool-use',
128
+ statusMessage: "LazyCodex(stale): Checking Comments",
129
+ },
130
+ ],
131
+ },
132
+ ],
133
+ },
134
+ });
135
+
136
+ // when
137
+ await syncHookStatusMessages(root, { releaseVersion: "4.8.0" });
138
+
139
+ // then
140
+ const aggregateHooks = await readJson(join(root, "hooks", "hooks.json"));
141
+ const componentHooks = await readJson(join(root, "components", "comment-checker", "hooks", "hooks.json"));
142
+ assert.equal(aggregateHooks.hooks.PostToolUse[0].hooks[0].statusMessage, "LazyCodex(4.8.0): Checking Comments");
143
+ assert.equal(componentHooks.hooks.PostToolUse[0].hooks[0].statusMessage, "LazyCodex(4.8.0): Checking Comments");
144
+ });