oh-my-opencode 4.7.5 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) 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 +4426 -2200
  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-process.d.ts +5 -0
  73. package/dist/cli/install-codex/index.d.ts +1 -1
  74. package/dist/cli/install-codex/lazycodex-version-stamp.d.ts +19 -0
  75. package/dist/cli/install-codex/link-cached-plugin-agents.d.ts +4 -0
  76. package/dist/cli/install-validators.d.ts +3 -0
  77. package/dist/cli/model-fallback-types.d.ts +3 -0
  78. package/dist/cli/run/event-handlers.d.ts +4 -11
  79. package/dist/cli/run/event-message-handlers.d.ts +5 -0
  80. package/dist/cli/run/event-session-handlers.d.ts +5 -0
  81. package/dist/cli/run/event-session-ids.d.ts +24 -0
  82. package/dist/cli/run/event-think-block.d.ts +3 -0
  83. package/dist/cli/run/event-toast-handlers.d.ts +3 -0
  84. package/dist/cli/run/event-tool-handlers.d.ts +4 -0
  85. package/dist/cli/run/event-tool-output.d.ts +2 -0
  86. package/dist/cli/run/on-complete-hook.d.ts +8 -1
  87. package/dist/cli/run/opencode-binary-resolver.d.ts +2 -1
  88. package/dist/cli/runtime-commands.d.ts +2 -0
  89. package/dist/cli/sparkshell-appserver-websocket.d.ts +4 -0
  90. package/dist/cli/sparkshell-appserver.d.ts +16 -0
  91. package/dist/cli/sparkshell-parse.d.ts +21 -0
  92. package/dist/cli/sparkshell.d.ts +26 -0
  93. package/dist/cli/types.d.ts +9 -0
  94. package/dist/config/schema/claude-code.d.ts +1 -0
  95. package/dist/config/schema/hooks.d.ts +1 -0
  96. package/dist/config/schema/oh-my-opencode-config.d.ts +1 -0
  97. package/dist/create-hooks.d.ts +1 -0
  98. package/dist/features/background-agent/concurrency.d.ts +6 -1
  99. package/dist/features/background-agent/constants.d.ts +1 -0
  100. package/dist/features/background-agent/empty-assistant-turn.d.ts +7 -0
  101. package/dist/features/background-agent/manager.d.ts +12 -0
  102. package/dist/features/background-agent/message-updated-parent-wake-output.d.ts +1 -0
  103. package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
  104. package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +21 -0
  105. package/dist/features/background-agent/parent-wake-flush-runner.d.ts +24 -0
  106. package/dist/features/background-agent/parent-wake-history-state.d.ts +5 -0
  107. package/dist/features/background-agent/parent-wake-notifier-types.d.ts +50 -0
  108. package/dist/features/background-agent/parent-wake-notifier.d.ts +8 -50
  109. package/dist/features/background-agent/parent-wake-pending-queue.d.ts +22 -0
  110. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +19 -0
  111. package/dist/features/background-agent/parent-wake-session-history.d.ts +73 -0
  112. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +35 -0
  113. package/dist/features/background-agent/parent-wake-timer-handle.d.ts +5 -0
  114. package/dist/features/background-agent/parent-wake-window-recovery.d.ts +13 -0
  115. package/dist/features/background-agent/process-cleanup.d.ts +2 -0
  116. package/dist/features/background-agent/process-cleanup.test-helpers.d.ts +3 -0
  117. package/dist/features/background-agent/session-stream-activity.d.ts +6 -0
  118. package/dist/features/background-agent/spawner/fallback-agent.d.ts +5 -0
  119. package/dist/features/background-agent/spawner/task-prompt-body.d.ts +34 -0
  120. package/dist/features/background-agent/spawner/task-record.d.ts +2 -0
  121. package/dist/features/background-agent/spawner.d.ts +2 -5
  122. package/dist/features/builtin-commands/templates/refactor-sections/codemap-and-tests.d.ts +1 -0
  123. package/dist/features/builtin-commands/templates/refactor-sections/intro-and-analysis.d.ts +1 -0
  124. package/dist/features/builtin-commands/templates/refactor-sections/plan-and-execution.d.ts +1 -0
  125. package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -0
  126. package/dist/features/builtin-commands/templates/refactor-sections/verification-and-tooling.d.ts +1 -0
  127. package/dist/features/builtin-commands/templates/refactor.d.ts +2 -2
  128. package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +2 -0
  129. package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +2 -0
  130. package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +1 -0
  131. package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +1 -0
  132. package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +1 -0
  133. package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +1 -1
  134. package/dist/features/builtin-skills/skills/index.d.ts +1 -0
  135. package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +2 -0
  136. package/dist/features/builtin-skills/skills/playwright.d.ts +2 -3
  137. package/dist/features/builtin-skills/skills/visual-qa.d.ts +2 -0
  138. package/dist/features/claude-code-agent-loader/agent-definitions-loader.d.ts +2 -2
  139. package/dist/features/claude-code-agent-loader/claude-model-mapper.d.ts +1 -1
  140. package/dist/features/claude-code-agent-loader/loader.d.ts +2 -2
  141. package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +1 -1
  142. package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +2 -0
  143. package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +3 -0
  144. package/dist/features/claude-code-plugin-loader/discovery.d.ts +3 -4
  145. package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +1 -0
  146. package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +3 -0
  147. package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +2 -0
  148. package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +1 -0
  149. package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +4 -0
  150. package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +3 -0
  151. package/dist/features/claude-code-plugin-loader/types.d.ts +1 -0
  152. package/dist/features/hook-message-injector/context-resolver.d.ts +6 -0
  153. package/dist/features/hook-message-injector/id-generation.d.ts +2 -0
  154. package/dist/features/hook-message-injector/index.d.ts +1 -1
  155. package/dist/features/hook-message-injector/injector.d.ts +7 -69
  156. package/dist/features/hook-message-injector/json-message-lookup.d.ts +3 -0
  157. package/dist/features/hook-message-injector/message-directory.d.ts +1 -0
  158. package/dist/features/hook-message-injector/message-injection.d.ts +2 -0
  159. package/dist/features/hook-message-injector/sdk-message-context.d.ts +6 -0
  160. package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +28 -0
  161. package/dist/features/hook-message-injector/types.d.ts +9 -0
  162. package/dist/features/mcp-oauth/callback-server.d.ts +10 -2
  163. package/dist/features/opencode-runtime-skills/source-server.d.ts +1 -0
  164. package/dist/features/skill-mcp-manager/http-client.d.ts +2 -0
  165. package/dist/features/team-mode/deps.d.ts +8 -1
  166. package/dist/features/team-mode/team-layout-tmux/layout.d.ts +2 -0
  167. package/dist/features/team-mode/team-mailbox/send.d.ts +3 -0
  168. package/dist/features/team-mode/team-registry/paths.d.ts +17 -2
  169. package/dist/features/team-mode/team-runtime/shutdown.d.ts +1 -1
  170. package/dist/features/team-mode/team-runtime/unresolved-team-members.d.ts +3 -0
  171. package/dist/features/team-mode/team-state-store/active-resume.d.ts +5 -0
  172. package/dist/features/team-mode/team-state-store/creating-resume.d.ts +4 -0
  173. package/dist/features/team-mode/team-state-store/deleting-resume.d.ts +4 -0
  174. package/dist/features/team-mode/team-state-store/error-normalization.d.ts +2 -0
  175. package/dist/features/team-mode/team-state-store/reservation-reconciliation.d.ts +4 -0
  176. package/dist/features/team-mode/team-state-store/resume-report.d.ts +7 -0
  177. package/dist/features/team-mode/team-state-store/resume.d.ts +2 -7
  178. package/dist/features/team-mode/team-state-store/runtime-cleanup.d.ts +4 -0
  179. package/dist/features/team-mode/team-state-store/session-liveness.d.ts +9 -0
  180. package/dist/features/team-mode/team-state-store/worker-resume-status.d.ts +9 -0
  181. package/dist/features/team-mode/tools/lifecycle-create-tool.d.ts +17 -0
  182. package/dist/features/team-mode/tools/lifecycle-inline-spec.d.ts +19 -0
  183. package/dist/features/team-mode/tools/lifecycle-participant.d.ts +25 -0
  184. package/dist/features/team-mode/tools/lifecycle-shutdown-tools.d.ts +18 -0
  185. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +3 -3
  186. package/dist/features/team-mode/tools/lifecycle.d.ts +3 -37
  187. package/dist/features/team-mode/tools/messaging-live-delivery-client.d.ts +25 -0
  188. package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +19 -0
  189. package/dist/features/team-mode/tools/messaging-live-delivery-reservation.d.ts +10 -0
  190. package/dist/features/team-mode/tools/messaging-live-delivery-state.d.ts +5 -0
  191. package/dist/features/team-mode/tools/messaging-live-delivery.d.ts +6 -0
  192. package/dist/features/team-mode/tools/messaging-runtime.d.ts +17 -0
  193. package/dist/features/team-mode/tools/messaging.d.ts +4 -29
  194. package/dist/features/tmux-subagent/manager.d.ts +20 -1
  195. package/dist/features/tmux-subagent/session-created-handler.d.ts +4 -0
  196. package/dist/features/tmux-subagent/types.d.ts +1 -0
  197. package/dist/hooks/anthropic-context-window-limit-recovery/message-builder.d.ts +1 -1
  198. package/dist/hooks/atlas/idle-completion-nudge.d.ts +10 -0
  199. package/dist/hooks/atlas/idle-constants.d.ts +4 -0
  200. package/dist/hooks/atlas/idle-continuation.d.ts +23 -0
  201. package/dist/hooks/atlas/idle-session-eligibility.d.ts +8 -0
  202. package/dist/hooks/atlas/tool-execute-after-direct-work.d.ts +9 -0
  203. package/dist/hooks/atlas/tool-execute-after-plan-tasks.d.ts +3 -0
  204. package/dist/hooks/atlas/tool-execute-after-subagent-completion.d.ts +14 -0
  205. package/dist/hooks/auto-update-checker/hook/background-update-check.d.ts +6 -0
  206. package/dist/hooks/auto-update-checker/hook/ignore-toast-error.d.ts +1 -0
  207. package/dist/hooks/hephaestus-agents-md-injector/hook.d.ts +37 -0
  208. package/dist/hooks/hephaestus-agents-md-injector/index.d.ts +1 -0
  209. package/dist/hooks/index.d.ts +1 -0
  210. package/dist/hooks/json-error-recovery/hook.d.ts +1 -1
  211. package/dist/hooks/ralph-loop/command-arguments.d.ts +1 -0
  212. package/dist/hooks/ralph-loop/event-handler-activity.d.ts +10 -0
  213. package/dist/hooks/ralph-loop/event-handler-completion.d.ts +9 -0
  214. package/dist/hooks/ralph-loop/event-handler-continuation.d.ts +16 -0
  215. package/dist/hooks/ralph-loop/event-handler-feedback.d.ts +16 -0
  216. package/dist/hooks/ralph-loop/event-handler-idle.d.ts +15 -0
  217. package/dist/hooks/ralph-loop/event-handler-impl.d.ts +10 -0
  218. package/dist/hooks/ralph-loop/event-handler-runtime-error.d.ts +4 -0
  219. package/dist/hooks/ralph-loop/event-handler-types.d.ts +20 -0
  220. package/dist/hooks/ralph-loop/loop-state-controller.d.ts +1 -0
  221. package/dist/hooks/ralph-loop/ralph-loop-event-handler.d.ts +4 -24
  222. package/dist/hooks/ralph-loop/ralph-loop-hook.d.ts +1 -0
  223. package/dist/hooks/read-image-resizer/png-chunks.d.ts +6 -0
  224. package/dist/hooks/read-image-resizer/png-constants.d.ts +1 -0
  225. package/dist/hooks/read-image-resizer/png-crc.d.ts +1 -0
  226. package/dist/hooks/read-image-resizer/png-decoder.d.ts +1 -0
  227. package/dist/hooks/read-image-resizer/png-encoder.d.ts +1 -0
  228. package/dist/hooks/read-image-resizer/png-filters.d.ts +1 -0
  229. package/dist/hooks/read-image-resizer/png-ihdr.d.ts +11 -0
  230. package/dist/hooks/read-image-resizer/png-nearest-neighbor.d.ts +1 -0
  231. package/dist/hooks/rules-injector/injection-output.d.ts +2 -0
  232. package/dist/hooks/rules-injector/injection-processor.d.ts +22 -0
  233. package/dist/hooks/rules-injector/injection-types.d.ts +43 -0
  234. package/dist/hooks/rules-injector/injector.d.ts +3 -47
  235. package/dist/hooks/rules-injector/match-decision-cache.d.ts +4 -0
  236. package/dist/hooks/rules-injector/parsed-rule-cache.d.ts +11 -0
  237. package/dist/hooks/rules-injector/path-resolution.d.ts +1 -0
  238. package/dist/hooks/rules-injector/rule-match-reason.d.ts +12 -0
  239. package/dist/hooks/rules-injector/transcript-hydration.d.ts +13 -2
  240. package/dist/hooks/runtime-fallback/auto-retry-abort.d.ts +2 -0
  241. package/dist/hooks/runtime-fallback/auto-retry-agent-context.d.ts +2 -0
  242. package/dist/hooks/runtime-fallback/auto-retry-cleanup.d.ts +2 -0
  243. package/dist/hooks/runtime-fallback/auto-retry-dispatch.d.ts +2 -0
  244. package/dist/hooks/runtime-fallback/auto-retry-metadata.d.ts +9 -0
  245. package/dist/hooks/runtime-fallback/auto-retry-timeout.d.ts +5 -0
  246. package/dist/hooks/runtime-fallback/fallback-bootstrap-model.d.ts +1 -1
  247. package/dist/hooks/runtime-fallback/fallback-state.d.ts +4 -1
  248. package/dist/hooks/runtime-fallback/normalize-model.d.ts +12 -0
  249. package/dist/hooks/session-notification-linux.d.ts +3 -0
  250. package/dist/hooks/session-notification-log.d.ts +2 -0
  251. package/dist/hooks/session-notification-macos.d.ts +3 -0
  252. package/dist/hooks/session-notification-platform.d.ts +3 -0
  253. package/dist/hooks/session-notification-runner.d.ts +9 -0
  254. package/dist/hooks/session-notification-send.d.ts +3 -0
  255. package/dist/hooks/session-notification-sender.d.ts +5 -6
  256. package/dist/hooks/session-notification-sound.d.ts +3 -0
  257. package/dist/hooks/session-notification-windows.d.ts +3 -0
  258. package/dist/hooks/session-recovery/error-recovery.d.ts +4 -0
  259. package/dist/hooks/session-recovery/hook-types.d.ts +22 -0
  260. package/dist/hooks/session-recovery/hook.d.ts +2 -19
  261. package/dist/hooks/session-recovery/interrupted-tool-results.d.ts +3 -0
  262. package/dist/hooks/session-recovery/message-state.d.ts +4 -0
  263. package/dist/hooks/session-recovery/storage/thinking-strip.d.ts +7 -1
  264. package/dist/hooks/start-work/context-info-builder.d.ts +9 -9
  265. package/dist/hooks/start-work/context-info-formatters.d.ts +21 -0
  266. package/dist/hooks/start-work/explicit-plan-context.d.ts +9 -0
  267. package/dist/hooks/start-work/plan-discovery-context.d.ts +25 -0
  268. package/dist/hooks/start-work/plan-selection.d.ts +4 -0
  269. package/dist/hooks/start-work/work-initializer.d.ts +17 -0
  270. package/dist/hooks/tool-pair-validator/hook.d.ts +1 -37
  271. package/dist/hooks/tool-pair-validator/message-transform.d.ts +2 -0
  272. package/dist/hooks/tool-pair-validator/tool-part-ids.d.ts +6 -0
  273. package/dist/hooks/tool-pair-validator/tool-result-repair.d.ts +4 -0
  274. package/dist/hooks/tool-pair-validator/types.d.ts +36 -0
  275. package/dist/index.js +12708 -9988
  276. package/dist/oh-my-opencode.schema.json +4 -0
  277. package/dist/openclaw/reply-listener-poll-loop.d.ts +3 -0
  278. package/dist/openclaw/reply-listener-signature.d.ts +2 -0
  279. package/dist/openclaw/reply-listener-sleep.d.ts +1 -0
  280. package/dist/openclaw/reply-listener-start.d.ts +9 -0
  281. package/dist/openclaw/reply-listener-status.d.ts +4 -0
  282. package/dist/openclaw/reply-listener-stop.d.ts +7 -0
  283. package/dist/openclaw/reply-listener.d.ts +5 -18
  284. package/dist/openclaw/session-registry-lock.d.ts +2 -0
  285. package/dist/openclaw/session-registry-paths.d.ts +9 -0
  286. package/dist/openclaw/session-registry-storage.d.ts +4 -0
  287. package/dist/openclaw/session-registry-types.d.ts +11 -0
  288. package/dist/openclaw/session-registry.d.ts +2 -11
  289. package/dist/plugin/chat-message/loop-commands.d.ts +9 -0
  290. package/dist/plugin/chat-message/model-cache-warning.d.ts +12 -0
  291. package/dist/plugin/chat-message/prompt-text.d.ts +2 -0
  292. package/dist/plugin/chat-message/session-model.d.ts +4 -0
  293. package/dist/plugin/chat-message/start-work-message.d.ts +5 -0
  294. package/dist/plugin/chat-message/types.d.ts +67 -0
  295. package/dist/plugin/chat-message.d.ts +3 -24
  296. package/dist/plugin/event-error-utils.d.ts +14 -0
  297. package/dist/plugin/event-hook-dispatcher.d.ts +5 -0
  298. package/dist/plugin/event-model-fallback-state.d.ts +30 -0
  299. package/dist/plugin/event-model-fallback.d.ts +39 -0
  300. package/dist/plugin/event-session-lifecycle.d.ts +49 -0
  301. package/dist/plugin/event-session-recovery.d.ts +9 -0
  302. package/dist/plugin/event-team-handlers.d.ts +13 -0
  303. package/dist/plugin/event-types.d.ts +78 -0
  304. package/dist/plugin/event.d.ts +3 -12
  305. package/dist/plugin/hooks/create-core-hooks.d.ts +1 -0
  306. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
  307. package/dist/plugin/hooks/model-fallback-title-updater.d.ts +8 -0
  308. package/dist/plugin/session-compacting.d.ts +4 -1
  309. package/dist/plugin/system-transform.d.ts +1 -1
  310. package/dist/plugin/tool-execute-after.d.ts +2 -0
  311. package/dist/plugin/tool-registry-core-tools.d.ts +15 -0
  312. package/dist/plugin/tool-registry-factories.d.ts +36 -0
  313. package/dist/plugin/tool-registry-gated-tools.d.ts +16 -0
  314. package/dist/plugin/tool-registry-team-tools.d.ts +14 -0
  315. package/dist/plugin/tool-registry-trimming.d.ts +2 -0
  316. package/dist/plugin/tool-registry.d.ts +3 -38
  317. package/dist/plugin/ultrawork-db-model-override.d.ts +1 -1
  318. package/dist/plugin-config/agent-order-warnings.d.ts +1 -0
  319. package/dist/plugin-config/config-merger.d.ts +2 -0
  320. package/dist/plugin-config/layered-config-loader.d.ts +2 -0
  321. package/dist/plugin-config/single-config-loader.d.ts +4 -0
  322. package/dist/plugin-config.d.ts +3 -5
  323. package/dist/plugin-handlers/agent-config-assembly.d.ts +19 -0
  324. package/dist/plugin-handlers/agent-config-finalizer.d.ts +4 -0
  325. package/dist/plugin-handlers/agent-config-handler.d.ts +2 -11
  326. package/dist/plugin-handlers/agent-config-types.d.ts +30 -0
  327. package/dist/plugin-handlers/agent-skill-discovery.d.ts +3 -0
  328. package/dist/plugin-handlers/agent-source-loader.d.ts +2 -0
  329. package/dist/plugin-handlers/hook-config-handler.d.ts +0 -3
  330. package/dist/shared/context-window-usage.d.ts +7 -0
  331. package/dist/shared/dynamic-truncator-types.d.ts +17 -0
  332. package/dist/shared/dynamic-truncator.d.ts +8 -23
  333. package/dist/shared/migration/migrations-sidecar.d.ts +2 -2
  334. package/dist/shared/migration/model-versions.d.ts +7 -4
  335. package/dist/shared/model-availability.d.ts +1 -1
  336. package/dist/shared/opencode-version.d.ts +2 -2
  337. package/dist/shared/sparkshell-awareness.d.ts +5 -0
  338. package/dist/shared/spawn-with-windows-hide.d.ts +2 -0
  339. package/dist/shared/token-limit-truncator.d.ts +2 -0
  340. package/dist/testing/module-mock-lifecycle.d.ts +8 -0
  341. package/dist/tools/delegate-task/openai-categories.d.ts +0 -1
  342. package/dist/tools/delegate-task/subagent-agent-match.d.ts +3 -0
  343. package/dist/tools/delegate-task/subagent-model-resolution.d.ts +4 -0
  344. package/dist/tools/delegate-task/subagent-request-preflight.d.ts +3 -0
  345. package/dist/tools/delegate-task/subagent-resolution-types.d.ts +32 -0
  346. package/dist/tools/delegate-task/subagent-resolver.d.ts +3 -12
  347. package/dist/tools/delegate-task/sync-completion-message.d.ts +20 -0
  348. package/dist/tools/delegate-task/sync-poll-error-recovery.d.ts +1 -0
  349. package/dist/tools/delegate-task/sync-session-lifecycle.d.ts +12 -0
  350. package/dist/tools/delegate-task/sync-session-poller.d.ts +2 -0
  351. package/dist/tools/delegate-task/sync-spawn-reservation.d.ts +10 -0
  352. package/dist/tools/delegate-task/sync-task-metadata.d.ts +11 -0
  353. package/dist/tools/delegate-task/sync-task-runner.d.ts +30 -0
  354. package/dist/tools/delegate-task/sync-task.d.ts +2 -1
  355. package/dist/tools/hashline-edit/formatter-trigger.d.ts +2 -2
  356. package/package.json +15 -14
  357. package/packages/git-bash-mcp/dist/cli.js +29 -12
  358. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.d.ts +1 -1
  359. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +1 -1
  360. package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +95 -30
  361. package/packages/lsp-tools-mcp/dist/lsp/server-installation.d.ts +1 -2
  362. package/packages/lsp-tools-mcp/dist/lsp/server-installation.js +1 -11
  363. package/packages/lsp-tools-mcp/dist/lsp/transport.d.ts +1 -0
  364. package/packages/lsp-tools-mcp/dist/lsp/transport.js +5 -10
  365. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.d.ts +4 -1
  366. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +84 -23
  367. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +2 -0
  368. package/packages/lsp-tools-mcp/dist/missing-dependency-result.js +14 -0
  369. package/packages/lsp-tools-mcp/dist/tools.js +64 -80
  370. package/packages/lsp-tools-mcp/package.json +4 -4
  371. package/packages/omo-codex/lazycodex-repository/.github/workflows/pr-source-guidance.yml +36 -0
  372. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  373. package/packages/omo-codex/plugin/README.md +3 -1
  374. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +188 -0
  375. package/packages/omo-codex/plugin/components/comment-checker/src/core-values.ts +1 -0
  376. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +15 -361
  377. package/packages/omo-codex/plugin/components/comment-checker/src/hook-input.ts +19 -0
  378. package/packages/omo-codex/plugin/components/comment-checker/src/record.ts +11 -0
  379. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +102 -0
  380. package/packages/omo-codex/plugin/components/comment-checker/src/types.ts +51 -0
  381. package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook.test.ts +145 -0
  382. package/packages/omo-codex/plugin/components/comment-checker/test/core.test.ts +200 -0
  383. package/packages/omo-codex/plugin/components/lsp/CHANGELOG.md +2 -2
  384. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +11 -5
  385. package/packages/omo-codex/plugin/components/rules/src/hook-output.ts +11 -1
  386. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +0 -1
  387. package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +1 -4
  388. package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-cache.ts +87 -0
  389. package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-loader.ts +94 -0
  390. package/packages/omo-codex/plugin/components/rules/src/rules/engine-loader.ts +84 -0
  391. package/packages/omo-codex/plugin/components/rules/src/rules/engine-paths.ts +103 -0
  392. package/packages/omo-codex/plugin/components/rules/src/rules/engine-static-loader.ts +43 -0
  393. package/packages/omo-codex/plugin/components/rules/src/rules/engine-types.ts +45 -0
  394. package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -419
  395. package/packages/omo-codex/plugin/components/rules/src/rules/formatter.ts +32 -5
  396. package/packages/omo-codex/plugin/components/rules/src/rules/parser-frontmatter.ts +39 -0
  397. package/packages/omo-codex/plugin/components/rules/src/rules/parser-yaml.ts +271 -0
  398. package/packages/omo-codex/plugin/components/rules/src/rules/parser.ts +3 -294
  399. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +57 -0
  400. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +13 -2
  401. package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +17 -0
  402. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +2 -1
  403. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +26 -11
  404. package/packages/omo-codex/plugin/components/rules/test/codex-hook-context-pressure.test.ts +104 -138
  405. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +5 -2
  406. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +12 -5
  407. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +10 -4
  408. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +65 -3
  409. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +47 -2
  410. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +16 -0
  411. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +153 -0
  412. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +12 -0
  413. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +236 -0
  414. package/packages/omo-codex/plugin/components/rules/test/tool-paths.test.ts +28 -50
  415. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +6 -3
  416. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +13 -6
  417. package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +21 -0
  418. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +64 -2
  419. package/packages/omo-codex/plugin/components/telemetry/README.md +11 -1
  420. package/packages/omo-codex/plugin/components/telemetry/biome.json +12 -0
  421. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +30 -3
  422. package/packages/omo-codex/plugin/components/telemetry/src/diagnostics.ts +154 -0
  423. package/packages/omo-codex/plugin/components/telemetry/src/posthog-activity-state.ts +18 -2
  424. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +36 -4
  425. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook-diagnostics.test.ts +115 -0
  426. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +16 -25
  427. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +119 -0
  428. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +1 -1
  429. package/packages/omo-codex/plugin/components/ultrawork/README.md +5 -5
  430. package/packages/omo-codex/plugin/components/ultrawork/agents/codex-ultrawork-reviewer.toml +2 -1
  431. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -0
  432. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +0 -1
  433. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +0 -1
  434. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -2
  435. package/packages/omo-codex/plugin/components/ultrawork/directive.md +97 -32
  436. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +65 -0
  437. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/agents/openai.yaml +7 -0
  438. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +131 -0
  439. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +38 -10
  440. package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +18 -0
  441. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +47 -0
  442. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  443. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +12 -8
  444. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +28 -21
  445. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +2 -3
  446. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +7 -7
  447. package/packages/omo-codex/plugin/components/ulw-loop/src/command-types.ts +36 -0
  448. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +64 -0
  449. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +98 -0
  450. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +17 -2
  451. package/packages/omo-codex/plugin/components/ulw-loop/src/runtime.ts +22 -0
  452. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +69 -0
  453. package/packages/omo-codex/plugin/components/ulw-loop/src/types.ts +5 -277
  454. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +35 -13
  455. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +52 -0
  456. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering.test.ts +67 -111
  457. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
  458. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +31 -2
  459. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +46 -9
  460. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +20 -29
  461. package/packages/omo-codex/plugin/model-catalog.json +5 -11
  462. package/packages/omo-codex/plugin/package-lock.json +1 -1
  463. package/packages/omo-codex/plugin/scripts/auto-update-state.mjs +78 -0
  464. package/packages/omo-codex/plugin/scripts/auto-update.mjs +166 -76
  465. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +71 -0
  466. package/packages/omo-codex/plugin/scripts/migrate-codex-config/config-paths.mjs +44 -0
  467. package/packages/omo-codex/plugin/scripts/migrate-codex-config/root-settings.mjs +74 -0
  468. package/packages/omo-codex/plugin/scripts/migrate-codex-config/state.mjs +29 -0
  469. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +14 -202
  470. package/packages/omo-codex/plugin/scripts/spawn-command.mjs +11 -0
  471. package/packages/omo-codex/plugin/scripts/sync-hook-status-messages.mjs +23 -9
  472. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +131 -28
  473. package/packages/omo-codex/plugin/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
  474. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +100 -0
  475. package/packages/omo-codex/plugin/skills/git-master/agents/openai.yaml +13 -0
  476. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -7
  477. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
  478. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
  479. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
  480. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +119 -14
  481. package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +4 -2
  482. package/packages/omo-codex/plugin/skills/programming/references/go/concurrency.md +2 -2
  483. package/packages/omo-codex/plugin/skills/programming/references/python/async-anyio.md +6 -6
  484. package/packages/omo-codex/plugin/skills/programming/references/python/pydantic-ai.md +12 -12
  485. package/packages/omo-codex/plugin/skills/programming/references/typescript/backend-hono.md +7 -7
  486. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +13 -11
  487. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -8
  488. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +68 -33
  489. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +86 -22
  490. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +770 -0
  491. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +12 -8
  492. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +28 -21
  493. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +45 -379
  494. package/packages/omo-codex/plugin/skills/ulw-plan/agents/openai.yaml +7 -0
  495. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +131 -0
  496. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +237 -0
  497. package/packages/omo-codex/plugin/skills/visual-qa/scripts/ansi.ts +17 -0
  498. package/packages/omo-codex/plugin/skills/visual-qa/scripts/cli.ts +82 -0
  499. package/packages/omo-codex/plugin/skills/visual-qa/scripts/east-asian-width.ts +72 -0
  500. package/packages/omo-codex/plugin/skills/visual-qa/scripts/image-diff.ts +109 -0
  501. package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-crc.ts +27 -0
  502. package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-decode.ts +206 -0
  503. package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-synth.ts +57 -0
  504. package/packages/omo-codex/plugin/skills/visual-qa/scripts/tui-grid.ts +88 -0
  505. package/packages/omo-codex/plugin/skills/visual-qa/scripts/types.ts +54 -0
  506. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +55 -0
  507. package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +38 -0
  508. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +164 -0
  509. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +73 -0
  510. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +69 -0
  511. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +53 -0
  512. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +83 -0
  513. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +67 -0
  514. package/packages/omo-codex/plugin/test/aggregate.test.mjs +2 -514
  515. package/packages/omo-codex/plugin/test/auto-update-state-persistence.test.mjs +36 -0
  516. package/packages/omo-codex/plugin/test/auto-update.test.mjs +191 -29
  517. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +1 -1
  518. package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +29 -0
  519. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +23 -10
  520. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +81 -0
  521. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +91 -0
  522. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +165 -9
  523. package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +0 -19
  524. package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +107 -0
  525. package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +82 -7
  526. package/packages/omo-codex/plugin/test/sync-hook-status-messages.test.mjs +58 -6
  527. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +152 -0
  528. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +158 -50
  529. package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +43 -0
  530. package/packages/omo-codex/scripts/install/agent-source-roots.mjs +13 -0
  531. package/packages/omo-codex/scripts/install/agents.mjs +84 -14
  532. package/packages/omo-codex/scripts/install/bin-links.mjs +239 -0
  533. package/packages/omo-codex/scripts/install/cache.mjs +152 -108
  534. package/packages/omo-codex/scripts/install/cached-marketplace-manifest.mjs +21 -0
  535. package/packages/omo-codex/scripts/install/cli-args.mjs +39 -2
  536. package/packages/omo-codex/scripts/install/config.mjs +7 -5
  537. package/packages/omo-codex/scripts/install/lazycodex-version-stamp.mjs +102 -0
  538. package/packages/omo-codex/scripts/install/legacy-bins.mjs +9 -1
  539. package/packages/omo-codex/scripts/install/model-catalog.mjs +9 -1
  540. package/packages/omo-codex/scripts/install/process.mjs +3 -1
  541. package/packages/omo-codex/scripts/install/project-local-cleanup.mjs +0 -1
  542. package/packages/omo-codex/scripts/install/snapshot.mjs +0 -1
  543. package/packages/omo-codex/scripts/install-agent-links.test.mjs +205 -11
  544. package/packages/omo-codex/scripts/install-bin-links.test.mjs +123 -1
  545. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +129 -5
  546. package/packages/omo-codex/scripts/install-cli-args.test.mjs +82 -1
  547. package/packages/omo-codex/scripts/install-config-preservation.test.mjs +43 -0
  548. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +14 -1
  549. package/packages/omo-codex/scripts/install-config.test.mjs +49 -1
  550. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +84 -0
  551. package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +51 -0
  552. package/packages/omo-codex/scripts/install-local.mjs +42 -40
  553. package/packages/omo-codex/scripts/install-local.test.mjs +17 -241
  554. package/packages/omo-codex/scripts/install-marketplace-cache.test.mjs +162 -0
  555. package/packages/omo-codex/scripts/install-packaged-local.test.mjs +10 -6
  556. package/packages/omo-codex/scripts/install-project-local-cleanup.test.mjs +73 -2
  557. package/packages/omo-codex/scripts/sync-telemetry-component.mjs +1 -0
  558. package/packages/shared-skills/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
  559. package/packages/shared-skills/skills/git-master/SKILL.md +100 -0
  560. package/packages/shared-skills/skills/git-master/agents/openai.yaml +13 -0
  561. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
  562. package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
  563. package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
  564. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +119 -14
  565. package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +4 -2
  566. package/packages/shared-skills/skills/programming/references/go/concurrency.md +2 -2
  567. package/packages/shared-skills/skills/programming/references/python/async-anyio.md +6 -6
  568. package/packages/shared-skills/skills/programming/references/python/pydantic-ai.md +12 -12
  569. package/packages/shared-skills/skills/programming/references/typescript/backend-hono.md +7 -7
  570. package/packages/shared-skills/skills/refactor/SKILL.md +4 -4
  571. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  572. package/packages/shared-skills/skills/review-work/SKILL.md +55 -33
  573. package/packages/shared-skills/skills/start-work/SKILL.md +76 -19
  574. package/packages/shared-skills/skills/ultraresearch/SKILL.md +770 -0
  575. package/packages/shared-skills/skills/visual-qa/SKILL.md +219 -0
  576. package/packages/shared-skills/skills/visual-qa/scripts/ansi.test.ts +45 -0
  577. package/packages/shared-skills/skills/visual-qa/scripts/ansi.ts +17 -0
  578. package/packages/shared-skills/skills/visual-qa/scripts/cli.test.ts +73 -0
  579. package/packages/shared-skills/skills/visual-qa/scripts/cli.ts +82 -0
  580. package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.test.ts +60 -0
  581. package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.ts +72 -0
  582. package/packages/shared-skills/skills/visual-qa/scripts/image-diff.test.ts +70 -0
  583. package/packages/shared-skills/skills/visual-qa/scripts/image-diff.ts +109 -0
  584. package/packages/shared-skills/skills/visual-qa/scripts/png-crc.ts +27 -0
  585. package/packages/shared-skills/skills/visual-qa/scripts/png-decode.test.ts +44 -0
  586. package/packages/shared-skills/skills/visual-qa/scripts/png-decode.ts +206 -0
  587. package/packages/shared-skills/skills/visual-qa/scripts/png-synth.ts +57 -0
  588. package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +83 -0
  589. package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.test.ts +57 -0
  590. package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.ts +88 -0
  591. package/packages/shared-skills/skills/visual-qa/scripts/types.ts +54 -0
  592. package/postinstall.mjs +24 -1
  593. package/dist/agents/custom-agent-summaries.d.ts +0 -8
  594. package/dist/agents/hephaestus/gpt-5-3-codex.d.ts +0 -20
  595. package/dist/agents/prometheus/gemini.d.ts +0 -1
  596. package/dist/agents/prometheus/gpt.d.ts +0 -1
  597. package/dist/agents/sisyphus-junior/gpt-5-3-codex.d.ts +0 -8
  598. package/dist/features/background-agent/session-route.d.ts +0 -12
  599. package/dist/features/background-agent/spawner/parent-directory-resolver.d.ts +0 -6
  600. package/dist/features/background-agent/state.d.ts +0 -35
  601. package/dist/features/claude-tasks/session-storage.d.ts +0 -9
  602. package/dist/features/mcp-oauth/resource-indicator.d.ts +0 -2
  603. package/dist/features/mcp-oauth/schema.d.ts +0 -6
  604. package/dist/features/opencode-skill-loader/async-loader.d.ts +0 -6
  605. package/dist/features/opencode-skill-loader/blocking.d.ts +0 -2
  606. package/dist/features/opencode-skill-loader/discover-worker.d.ts +0 -1
  607. package/dist/hooks/session-recovery/recover-empty-content-message-sdk.d.ts +0 -13
  608. package/dist/shared/bun-hash-shim.d.ts +0 -1
  609. package/dist/tools/delegate-task/resolve-call-id.d.ts +0 -2
  610. package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -383
  611. /package/packages/lsp-tools-mcp/dist/lsp/{utils.d.ts → startup-failure.d.ts} +0 -0
  612. /package/packages/lsp-tools-mcp/dist/lsp/{utils.js → startup-failure.js} +0 -0
@@ -9,7 +9,7 @@ import { ensureCodexReasoningConfig, migrateCodexConfig } from "../scripts/migra
9
9
  test("#given stale root reasoning config #when ensuring config #then replaces stale values without duplicate keys", () => {
10
10
  const result = ensureCodexReasoningConfig(
11
11
  [
12
- 'model = "gpt-5.2"',
12
+ 'model = "gpt-5.5"',
13
13
  "model_context_window = 272000",
14
14
  'model_reasoning_effort = "low"',
15
15
  'plan_mode_reasoning_effort = "medium"',
@@ -32,6 +32,29 @@ test("#given stale root reasoning config #when ensuring config #then replaces st
32
32
  assert.match(result, /\[features\]/);
33
33
  });
34
34
 
35
+ test("#given section settings reuse managed root keys #when ensuring config #then section settings are preserved", () => {
36
+ const result = ensureCodexReasoningConfig(
37
+ [
38
+ 'model = "gpt-5.5"',
39
+ "model_context_window = 272000",
40
+ "",
41
+ "[model_providers.openai]",
42
+ 'model = "provider-scoped-value"',
43
+ "model_context_window = 123456",
44
+ "",
45
+ "[profiles.review]",
46
+ 'model_reasoning_effort = "medium"',
47
+ 'plan_mode_reasoning_effort = "medium"',
48
+ "",
49
+ ].join("\n"),
50
+ );
51
+
52
+ assert.match(result, /^model = "gpt-5\.5"$/m);
53
+ assert.match(result, /^model_context_window = 400000$/m);
54
+ assert.match(result, /\[model_providers\.openai\]\nmodel = "provider-scoped-value"\nmodel_context_window = 123456/);
55
+ assert.match(result, /\[profiles\.review\]\nmodel_reasoning_effort = "medium"\nplan_mode_reasoning_effort = "medium"/);
56
+ });
57
+
35
58
  test("#given project .codex is a symlink #when migrating #then project config is skipped", async (t) => {
36
59
  if (!(await canCreateSymlink("dir"))) t.skip("symbolic links are unavailable in this environment");
37
60
 
@@ -47,8 +70,8 @@ test("#given project .codex is a symlink #when migrating #then project config is
47
70
  await mkdir(projectCodexDirectory, { recursive: true });
48
71
  await mkdir(dirname(projectConfigTarget), { recursive: true });
49
72
  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');
73
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
74
+ await writeFile(projectConfigTarget, 'model = "gpt-5.4"\nmodel_context_window = 272000\n');
52
75
  await rm(join(project, ".codex"), { recursive: true, force: true });
53
76
  await symlink(projectCodexDirectory, join(project, ".codex"), "dir");
54
77
 
@@ -61,7 +84,7 @@ test("#given project .codex is a symlink #when migrating #then project config is
61
84
  });
62
85
 
63
86
  assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
64
- assert.match(await readFile(projectConfig, "utf8"), /model = "gpt-5\.2"/);
87
+ assert.match(await readFile(projectConfig, "utf8"), /model = "gpt-5\.4"/);
65
88
  });
66
89
 
67
90
  test("#given project config.toml is a symlink #when migrating #then project config is skipped", async (t) => {
@@ -76,8 +99,8 @@ test("#given project config.toml is a symlink #when migrating #then project conf
76
99
 
77
100
  await mkdir(codexHome, { recursive: true });
78
101
  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');
102
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
103
+ await writeFile(realConfigSource, 'model = "gpt-5.4"\nmodel_context_window = 272000\n');
81
104
  await symlink(realConfigSource, projectConfig, "file");
82
105
 
83
106
  const result = await migrateCodexConfig({
@@ -89,7 +112,7 @@ test("#given project config.toml is a symlink #when migrating #then project conf
89
112
  });
90
113
 
91
114
  assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
92
- assert.match(await readFile(realConfigSource, "utf8"), /model = "gpt-5\.2"/);
115
+ assert.match(await readFile(realConfigSource, "utf8"), /model = "gpt-5\.4"/);
93
116
  });
94
117
 
95
118
  test("#given global and project-local stale Codex configs #when migrating #then both configs are forced to current defaults", async () => {
@@ -99,8 +122,8 @@ test("#given global and project-local stale Codex configs #when migrating #then
99
122
  const projectConfig = join(root, "project", ".codex", "config.toml");
100
123
  await mkdir(codexHome, { recursive: true });
101
124
  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');
125
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
126
+ await writeFile(projectConfig, 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
104
127
 
105
128
  const result = await migrateCodexConfig({
106
129
  env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json") },
@@ -112,6 +135,51 @@ test("#given global and project-local stale Codex configs #when migrating #then
112
135
  assert.match(await readFile(projectConfig, "utf8"), /model_context_window = 400000/);
113
136
  });
114
137
 
138
+ test("#given model catalog is unavailable and stale 272k config #when migrating #then fallback catalog still upgrades it", async () => {
139
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-config-fallback-catalog-"));
140
+ const codexHome = join(root, "codex-home");
141
+ const missingCatalog = join(root, "missing-model-catalog.json");
142
+ await mkdir(codexHome, { recursive: true });
143
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
144
+
145
+ const result = await migrateCodexConfig({
146
+ env: {
147
+ CODEX_HOME: codexHome,
148
+ LAZYCODEX_MODEL_CATALOG_PATH: missingCatalog,
149
+ LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
150
+ },
151
+ cwd: root,
152
+ });
153
+
154
+ const content = await readFile(join(codexHome, "config.toml"), "utf8");
155
+ assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
156
+ assert.match(content, /model = "gpt-5\.5"/);
157
+ assert.match(content, /model_context_window = 400000/);
158
+ });
159
+
160
+ test("#given model catalog is malformed and stale config #when migrating #then fallback catalog still upgrades it", async () => {
161
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-config-malformed-catalog-"));
162
+ const codexHome = join(root, "codex-home");
163
+ const catalogPath = join(root, "model-catalog.json");
164
+ await mkdir(codexHome, { recursive: true });
165
+ await writeFile(catalogPath, "{not-json");
166
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
167
+
168
+ const result = await migrateCodexConfig({
169
+ env: {
170
+ CODEX_HOME: codexHome,
171
+ LAZYCODEX_MODEL_CATALOG_PATH: catalogPath,
172
+ LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
173
+ },
174
+ cwd: root,
175
+ });
176
+
177
+ const content = await readFile(join(codexHome, "config.toml"), "utf8");
178
+ assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
179
+ assert.match(content, /model = "gpt-5\.5"/);
180
+ assert.match(content, /model_context_window = 400000/);
181
+ });
182
+
115
183
  test("#given user-customized Codex model config #when migrating #then user values are preserved", async () => {
116
184
  const root = await mkdtemp(join(tmpdir(), "lazycodex-config-custom-"));
117
185
  const codexHome = join(root, "codex-home");
@@ -140,6 +208,43 @@ test("#given user-customized Codex model config #when migrating #then user value
140
208
  assert.match(content, /plan_mode_reasoning_effort = "medium"/);
141
209
  });
142
210
 
211
+ test("#given managed config state is malformed #when migrating #then migration ignores stale state safely", async () => {
212
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-config-malformed-state-"));
213
+ const codexHome = join(root, "codex-home");
214
+ const statePath = join(root, "model-state.json");
215
+ await mkdir(codexHome, { recursive: true });
216
+ await writeFile(statePath, "[broken-json");
217
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
218
+
219
+ const result = await migrateCodexConfig({
220
+ env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: statePath },
221
+ cwd: root,
222
+ });
223
+
224
+ const content = await readFile(join(codexHome, "config.toml"), "utf8");
225
+ const state = JSON.parse(await readFile(statePath, "utf8"));
226
+ assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
227
+ assert.match(content, /model_context_window = 400000/);
228
+ assert.equal(state.files[join(codexHome, "config.toml")].managed, true);
229
+ });
230
+
231
+ test("#given managed config state path has surrounding whitespace #when migrating #then trimmed state path is used", async () => {
232
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-config-trimmed-state-"));
233
+ const codexHome = join(root, "codex-home");
234
+ const statePath = join(root, "model-state.json");
235
+ await mkdir(codexHome, { recursive: true });
236
+ await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
237
+
238
+ const result = await migrateCodexConfig({
239
+ env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: ` ${statePath} ` },
240
+ cwd: root,
241
+ });
242
+
243
+ const state = JSON.parse(await readFile(statePath, "utf8"));
244
+ assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
245
+ assert.equal(state.files[join(codexHome, "config.toml")].managed, true);
246
+ });
247
+
143
248
  test("#given managed catalog state #when catalog version advances #then only previously managed config is updated", async () => {
144
249
  const root = await mkdtemp(join(tmpdir(), "lazycodex-config-catalog-state-"));
145
250
  const codexHome = join(root, "codex-home");
@@ -205,6 +310,57 @@ test("#given managed catalog state #when catalog version advances #then only pre
205
310
  assert.match(content, /model_context_window = 400000/);
206
311
  });
207
312
 
313
+ test("#given config already matches current catalog #when catalog version advances for role-only changes #then managed state is preserved", async () => {
314
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-config-current-managed-"));
315
+ const codexHome = join(root, "codex-home");
316
+ const catalogPath = join(root, "catalog.json");
317
+ const statePath = join(root, "model-state.json");
318
+ const configPath = join(codexHome, "config.toml");
319
+ await mkdir(codexHome, { recursive: true });
320
+ await writeFile(
321
+ configPath,
322
+ [
323
+ 'model = "gpt-5.5"',
324
+ "model_context_window = 400000",
325
+ 'model_reasoning_effort = "high"',
326
+ 'plan_mode_reasoning_effort = "xhigh"',
327
+ "",
328
+ ].join("\n"),
329
+ );
330
+ await writeFile(
331
+ catalogPath,
332
+ JSON.stringify(
333
+ {
334
+ version: "test.role-only",
335
+ current: {
336
+ model: "gpt-5.5",
337
+ model_context_window: 400000,
338
+ model_reasoning_effort: "high",
339
+ plan_mode_reasoning_effort: "xhigh",
340
+ },
341
+ roles: { verifier: { model: "gpt-5.5", model_reasoning_effort: "high" } },
342
+ managedProfiles: [],
343
+ },
344
+ null,
345
+ 2,
346
+ ),
347
+ );
348
+
349
+ const result = await migrateCodexConfig({
350
+ env: {
351
+ CODEX_HOME: codexHome,
352
+ LAZYCODEX_MODEL_CATALOG_PATH: catalogPath,
353
+ LAZYCODEX_MODEL_CATALOG_STATE_PATH: statePath,
354
+ },
355
+ cwd: root,
356
+ });
357
+
358
+ const state = JSON.parse(await readFile(statePath, "utf8"));
359
+ assert.deepEqual(result.changed, []);
360
+ assert.equal(state.files[configPath].managed, true);
361
+ assert.equal(state.files[configPath].catalogVersion, "test.role-only");
362
+ });
363
+
208
364
  async function canCreateSymlink(type) {
209
365
  const root = await mkdtemp(join(tmpdir(), "lazycodex-symlink-capability-"));
210
366
  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
+ });