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
@@ -23,7 +23,7 @@ export async function updateCodexConfig({
23
23
  configPath,
24
24
  repoRoot,
25
25
  marketplaceName,
26
- marketplaceSource = defaultMarketplaceSource(marketplaceName, repoRoot),
26
+ marketplaceSource = defaultMarketplaceSource(repoRoot),
27
27
  pluginNames,
28
28
  platform = process.platform,
29
29
  trustedHookStates = [],
@@ -53,7 +53,7 @@ export async function updateCodexConfig({
53
53
  for (const pluginName of pluginNames) {
54
54
  config = ensurePluginEnabled(config, `${pluginName}@${marketplaceName}`);
55
55
  }
56
- config = ensureOmoGitBashMcpPolicy(config, { marketplaceName, pluginNames, platform });
56
+ config = ensureOmoBuiltinMcpPolicies(config, { marketplaceName, pluginNames, platform });
57
57
  for (const state of trustedHookStates) {
58
58
  config = ensureHookTrusted(config, state.key, state.trustedHash);
59
59
  }
@@ -72,7 +72,7 @@ function removeMarketplaceBlock(config, marketplaceName) {
72
72
  return removeTomlSections(config, (header) => header === `marketplaces.${marketplaceName}`);
73
73
  }
74
74
 
75
- function defaultMarketplaceSource(marketplaceName, repoRoot) {
75
+ function defaultMarketplaceSource(repoRoot) {
76
76
  return {
77
77
  sourceType: "local",
78
78
  source: repoRoot,
@@ -154,9 +154,11 @@ function ensurePluginMcpEnabled(config, pluginKey, serverName, enabled) {
154
154
  return replaceOrInsertSetting(config, section, "enabled", enabledValue);
155
155
  }
156
156
 
157
- function ensureOmoGitBashMcpPolicy(config, { marketplaceName, pluginNames, platform }) {
157
+ function ensureOmoBuiltinMcpPolicies(config, { marketplaceName, pluginNames, platform }) {
158
158
  if (marketplaceName !== "sisyphuslabs" || !pluginNames.includes("omo")) return config;
159
- return ensurePluginMcpEnabled(config, "omo@sisyphuslabs", "git_bash", platform === "win32");
159
+ let nextConfig = ensurePluginMcpEnabled(config, "omo@sisyphuslabs", "context7", true);
160
+ nextConfig = ensurePluginMcpEnabled(nextConfig, "omo@sisyphuslabs", "git_bash", platform === "win32");
161
+ return nextConfig;
160
162
  }
161
163
 
162
164
  function ensureHookTrusted(config, key, trustedHash) {
@@ -251,3 +253,5 @@ function parseJsonString(value) {
251
253
  return null;
252
254
  }
253
255
  }
256
+
257
+
@@ -0,0 +1,102 @@
1
+ import { readdir, readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+
4
+ export async function readDistributionManifest(repoRoot) {
5
+ try {
6
+ const parsed = JSON.parse(await readFile(join(repoRoot, "package.json"), "utf8"));
7
+ if (typeof parsed.version !== "string" || parsed.version.trim().length === 0) return undefined;
8
+ return {
9
+ name: typeof parsed.name === "string" && parsed.name.trim().length > 0 ? parsed.name.trim() : "lazycodex-ai",
10
+ version: parsed.version.trim(),
11
+ };
12
+ } catch (error) {
13
+ if (error instanceof Error) return undefined;
14
+ throw error;
15
+ }
16
+ }
17
+
18
+ export function resolveLazyCodexPluginVersion({ manifestVersion, marketplaceName, pluginName, distributionManifest }) {
19
+ if (marketplaceName === "sisyphuslabs" && pluginName === "omo" && distributionManifest !== undefined) {
20
+ return distributionManifest.version;
21
+ }
22
+ return manifestVersion ?? "local";
23
+ }
24
+
25
+ export async function stampLazyCodexPluginVersion({ pluginRoot, version }) {
26
+ await stampJsonVersion(join(pluginRoot, ".codex-plugin", "plugin.json"), version);
27
+ await stampJsonVersion(join(pluginRoot, "package.json"), version);
28
+ await stampHookStatusMessages(join(pluginRoot, "hooks", "hooks.json"), version);
29
+ await stampComponentVersions({ pluginRoot, version });
30
+ }
31
+
32
+ export async function writeLazyCodexInstallSnapshot({ pluginRoot, distributionManifest }) {
33
+ if (distributionManifest === undefined) return;
34
+ await writeFile(
35
+ join(pluginRoot, "lazycodex-install.json"),
36
+ `${JSON.stringify(
37
+ {
38
+ packageName: distributionManifest.name,
39
+ version: distributionManifest.version,
40
+ },
41
+ null,
42
+ "\t",
43
+ )}\n`,
44
+ );
45
+ }
46
+
47
+ async function stampJsonVersion(path, version) {
48
+ try {
49
+ const parsed = JSON.parse(await readFile(path, "utf8"));
50
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return;
51
+ parsed.version = version;
52
+ await writeFile(path, `${JSON.stringify(parsed, null, "\t")}\n`);
53
+ } catch (error) {
54
+ if (error instanceof Error) return;
55
+ throw error;
56
+ }
57
+ }
58
+
59
+ async function stampHookStatusMessages(path, version) {
60
+ try {
61
+ const parsed = JSON.parse(await readFile(path, "utf8"));
62
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return;
63
+ stampHookGroups(parsed.hooks, version);
64
+ await writeFile(path, `${JSON.stringify(parsed, null, "\t")}\n`);
65
+ } catch (error) {
66
+ if (error instanceof Error) return;
67
+ throw error;
68
+ }
69
+ }
70
+
71
+ async function stampComponentVersions({ pluginRoot, version }) {
72
+ let entries;
73
+ try {
74
+ entries = await readdir(join(pluginRoot, "components"));
75
+ } catch (error) {
76
+ if (error instanceof Error) return;
77
+ throw error;
78
+ }
79
+ for (const entry of entries) {
80
+ const componentRoot = join(pluginRoot, "components", entry);
81
+ await stampJsonVersion(join(componentRoot, "package.json"), version);
82
+ await stampHookStatusMessages(join(componentRoot, "hooks", "hooks.json"), version);
83
+ }
84
+ }
85
+
86
+ function stampHookGroups(hooks, version) {
87
+ if (typeof hooks !== "object" || hooks === null || Array.isArray(hooks)) return;
88
+ for (const groups of Object.values(hooks)) {
89
+ if (!Array.isArray(groups)) continue;
90
+ for (const group of groups) {
91
+ if (typeof group !== "object" || group === null || !Array.isArray(group.hooks)) continue;
92
+ for (const hook of group.hooks) {
93
+ stampHookStatusMessage(hook, version);
94
+ }
95
+ }
96
+ }
97
+ }
98
+
99
+ function stampHookStatusMessage(hook, version) {
100
+ if (typeof hook !== "object" || hook === null || typeof hook.statusMessage !== "string") return;
101
+ hook.statusMessage = hook.statusMessage.replace(/^LazyCodex\([^)]+\):/, `LazyCodex(${version}):`);
102
+ }
@@ -4,6 +4,7 @@ import { join } from "node:path";
4
4
  import { COMMAND_SHIM_MARKER } from "./command-shim.mjs";
5
5
 
6
6
  const LEGACY_CODEX_COMPONENT_BINS = [
7
+ { name: "omo", component: "ulw-loop" },
7
8
  { name: "codex-comment-checker", component: "comment-checker" },
8
9
  { name: "codex-lsp", component: "lsp" },
9
10
  { name: "codex-rules", component: "rules" },
@@ -46,7 +47,7 @@ function isManagedLegacyComponentTarget(target, component) {
46
47
  suffix[1] === component &&
47
48
  suffix[2] === "dist" &&
48
49
  suffix[3] === "cli.js" &&
49
- hasPluginCachePrefix(parts, suffixStart)
50
+ (hasPluginCachePrefix(parts, suffixStart) || hasOmoCodexPluginPrefix(parts, suffixStart))
50
51
  );
51
52
  }
52
53
 
@@ -56,3 +57,10 @@ function hasPluginCachePrefix(parts, endExclusive) {
56
57
  }
57
58
  return false;
58
59
  }
60
+
61
+ function hasOmoCodexPluginPrefix(parts, endExclusive) {
62
+ for (let index = 0; index <= endExclusive - 3; index += 1) {
63
+ if (parts[index] === "packages" && parts[index + 1] === "omo-codex" && parts[index + 2] === "plugin") return true;
64
+ }
65
+ return false;
66
+ }
@@ -8,7 +8,15 @@ const FALLBACK_CODEX_MODEL_CATALOG = {
8
8
  modelReasoningEffort: "high",
9
9
  planModeReasoningEffort: "xhigh",
10
10
  },
11
- managedProfiles: [{ model: "gpt-5.2" }],
11
+ managedProfiles: [
12
+ {
13
+ model: "gpt-5.5",
14
+ modelContextWindow: 1_000_000,
15
+ modelReasoningEffort: "high",
16
+ planModeReasoningEffort: "xhigh",
17
+ },
18
+ { model: "gpt-5.5", modelContextWindow: 272_000 },
19
+ ],
12
20
  };
13
21
 
14
22
  export async function readCodexModelCatalog(codexPackageRoot) {
@@ -3,6 +3,16 @@ import { appendBlock, findTomlSection, removeSetting, replaceOrInsertSetting } f
3
3
  const CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2";
4
4
  const CODEX_MULTI_AGENT_V2_MAX_CONCURRENT_THREADS_PER_SESSION = 10000;
5
5
 
6
+ /**
7
+ * Configure multi_agent_v2 thread limits without forcing the feature on.
8
+ *
9
+ * Whether V2 is active is determined at runtime by the model's server-side
10
+ * catalog entry (ModelInfo.multi_agent_version). Forcing enabled = true
11
+ * in config breaks models whose API does not support encrypted tool
12
+ * parameters. The installer therefore only sets the tuning knob
13
+ * (max_concurrent_threads_per_session) so that sessions that DO activate
14
+ * V2 benefit from the higher limit.
15
+ */
6
16
  export function ensureCodexMultiAgentV2Config(config) {
7
17
  const normalizedConfig = removeLegacyAgentsMaxThreadsSetting(removeFeatureFlagSetting(config, "multi_agent_v2"));
8
18
  const section = findTomlSection(normalizedConfig, CODEX_MULTI_AGENT_V2_HEADER);
@@ -10,19 +20,11 @@ export function ensureCodexMultiAgentV2Config(config) {
10
20
  if (!section) {
11
21
  return appendBlock(
12
22
  normalizedConfig,
13
- `[${CODEX_MULTI_AGENT_V2_HEADER}]\nenabled = true\nmax_concurrent_threads_per_session = ${maxThreadsValue}\n`,
23
+ `[${CODEX_MULTI_AGENT_V2_HEADER}]\nmax_concurrent_threads_per_session = ${maxThreadsValue}\n`,
14
24
  );
15
25
  }
16
26
 
17
- const enabledConfig = replaceOrInsertSetting(normalizedConfig, section, "enabled", "true");
18
- const updatedSection = findTomlSection(enabledConfig, CODEX_MULTI_AGENT_V2_HEADER);
19
- if (!updatedSection) {
20
- return appendBlock(
21
- enabledConfig,
22
- `[${CODEX_MULTI_AGENT_V2_HEADER}]\nenabled = true\nmax_concurrent_threads_per_session = ${maxThreadsValue}\n`,
23
- );
24
- }
25
- return replaceOrInsertSetting(enabledConfig, updatedSection, "max_concurrent_threads_per_session", maxThreadsValue);
27
+ return replaceOrInsertSetting(normalizedConfig, section, "max_concurrent_threads_per_session", maxThreadsValue);
26
28
  }
27
29
 
28
30
  function removeFeatureFlagSetting(config, featureName) {
@@ -1,8 +1,10 @@
1
1
  import { spawn } from "node:child_process";
2
+ import { resolveSpawnInvocation } from "../../plugin/scripts/spawn-command.mjs";
2
3
 
3
4
  export async function defaultRunCommand(command, args, options) {
4
5
  await new Promise((resolvePromise, reject) => {
5
- const child = spawn(command, args, {
6
+ const invocation = resolveSpawnInvocation(command, args);
7
+ const child = spawn(invocation.command, invocation.args, {
6
8
  cwd: options.cwd,
7
9
  stdio: "inherit",
8
10
  });
@@ -5,7 +5,6 @@ import { escapeRegExp, findTomlSection, removeSetting } from "./toml-editor.mjs"
5
5
 
6
6
  const LEGACY_AGENT_CONFLICT_KEYS = ["max_threads"];
7
7
  const PROJECT_LOCAL_ARTIFACT_PATHS = [
8
- ".omx",
9
8
  ".codex/hooks.json",
10
9
  ".codex/agents",
11
10
  ".codex/prompts",
@@ -49,6 +49,5 @@ function shouldCopyMarketplaceSourcePath(path, root) {
49
49
  const relative = path === root ? "" : path.slice(root.length + sep.length);
50
50
  if (relative === "") return true;
51
51
  const parts = relative.split(sep);
52
- if (parts[parts.length - 1] === "package-lock.json") return false;
53
52
  return !parts.some((part) => part === ".git" || part === "node_modules");
54
53
  }
@@ -1,5 +1,5 @@
1
1
  import assert from "node:assert/strict";
2
- import { lstat, mkdir, readFile, readlink, rm, symlink, writeFile } from "node:fs/promises";
2
+ import { lstat, mkdir, readFile, rm, symlink, writeFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import test from "node:test";
5
5
 
@@ -9,8 +9,8 @@ import { makeTempDir, writeJson, writePluginAt } from "./install-test-fixtures.m
9
9
  const legacyCodexPluginMarketplace = ["code", "yeongyu", "codex", "plugins"].join("-");
10
10
 
11
11
  test(
12
- "#given bundled agent roles and stale legacy links #when installing locally #then relinks Codex agents to marketplace snapshot",
13
- { skip: process.platform === "win32" ? "Windows copies agent files instead of symlinking them" : false },
12
+ "#given bundled agent roles and stale legacy links #when installing locally #then installs durable Codex agent files",
13
+ { skip: process.platform === "win32" ? "test sets up a Unix legacy symlink fixture" : false },
14
14
  async () => {
15
15
  const repoRoot = await makeTempDir();
16
16
  const codexHome = await makeTempDir();
@@ -45,8 +45,9 @@ test(
45
45
  const snapshotPluginPath = join(codexHome, ".tmp", "marketplaces", "sisyphuslabs", "plugins", "omo");
46
46
  for (const agentName of ["explorer", "librarian", "plan"]) {
47
47
  const agentPath = join(codexHome, "agents", `${agentName}.toml`);
48
- assert.equal((await lstat(agentPath)).isSymbolicLink(), true);
49
- assert.equal(await readlink(agentPath), join(snapshotPluginPath, "components", "ultrawork", "agents", `${agentName}.toml`));
48
+ const agentStat = await lstat(agentPath);
49
+ assert.equal(agentStat.isSymbolicLink(), false);
50
+ assert.equal(agentStat.isFile(), true);
50
51
  assert.equal(await readFile(agentPath, "utf8"), `name = "${agentName}"\n`);
51
52
  }
52
53
 
@@ -60,8 +61,7 @@ test(
60
61
  );
61
62
 
62
63
  test(
63
- "#given local sisyphuslabs install #when plugin cache is pruned #then agent links still resolve through marketplace snapshot",
64
- { skip: process.platform === "win32" ? "Windows copies agent files instead of symlinking them" : false },
64
+ "#given local sisyphuslabs install #when plugin cache is pruned #then agent files still resolve from Codex home",
65
65
  async () => {
66
66
  const repoRoot = await makeTempDir();
67
67
  const codexHome = await makeTempDir();
@@ -93,12 +93,206 @@ test(
93
93
  await rm(pluginPath, { recursive: true, force: true });
94
94
 
95
95
  const agentPath = join(codexHome, "agents", "explorer.toml");
96
- assert.equal(
97
- await readlink(agentPath),
98
- join(codexHome, ".tmp", "marketplaces", "sisyphuslabs", "plugins", "omo", "components", "ultrawork", "agents", "explorer.toml"),
99
- );
96
+ assert.equal((await lstat(agentPath)).isFile(), true);
100
97
  assert.equal(await readFile(agentPath, "utf8"), 'name = "explorer"\n');
101
98
  assert.equal(await readFile(join(snapshotRoot, ".git", "config"), "utf8"), "[remote \"origin\"]\n");
102
99
  assert.equal(await readFile(join(snapshotRoot, ".codex-marketplace-install.json"), "utf8"), '{"source_type":"git"}\n');
103
100
  },
104
101
  );
102
+
103
+ test("#given local sisyphuslabs install #when temporary marketplace snapshot is removed #then agent files still resolve from Codex home", async () => {
104
+ const repoRoot = await makeTempDir();
105
+ const codexHome = await makeTempDir();
106
+ const codexPackageRoot = join(repoRoot, "packages", "omo-codex");
107
+ const pluginRoot = join(codexPackageRoot, "plugin");
108
+ const agentsRoot = join(pluginRoot, "components", "ultrawork", "agents");
109
+
110
+ await writeJson(join(codexPackageRoot, "marketplace.json"), {
111
+ name: "sisyphuslabs",
112
+ plugins: [{ name: "omo", source: "./plugins/omo" }],
113
+ });
114
+ await writePluginAt(pluginRoot, "omo", "0.1.0");
115
+ await mkdir(agentsRoot, { recursive: true });
116
+ await writeFile(join(agentsRoot, "explorer.toml"), 'name = "explorer"\n');
117
+ await writeFile(join(agentsRoot, "plan.toml"), 'name = "plan"\n');
118
+
119
+ await installMarketplaceLocally({
120
+ repoRoot,
121
+ codexHome,
122
+ platform: "linux",
123
+ runCommand: async () => {},
124
+ log: () => {},
125
+ });
126
+ await rm(join(codexHome, ".tmp", "marketplaces", "sisyphuslabs"), { recursive: true, force: true });
127
+ await rm(join(codexHome, "plugins", "cache", "sisyphuslabs"), { recursive: true, force: true });
128
+
129
+ assert.equal(await readFile(join(codexHome, "agents", "explorer.toml"), "utf8"), 'name = "explorer"\n');
130
+ assert.equal(await readFile(join(codexHome, "agents", "plan.toml"), "utf8"), 'name = "plan"\n');
131
+ });
132
+
133
+ test(
134
+ "#given bundled ultrawork plan #when installing locally #then fresh installs write bundled default xhigh",
135
+ async () => {
136
+ const repoRoot = await makeTempDir();
137
+ const codexHome = await makeTempDir();
138
+ const codexPackageRoot = join(repoRoot, "packages", "omo-codex");
139
+ const pluginRoot = join(codexPackageRoot, "plugin");
140
+ const agentsRoot = join(pluginRoot, "components", "ultrawork", "agents");
141
+
142
+ await writeJson(join(codexPackageRoot, "marketplace.json"), {
143
+ name: "sisyphuslabs",
144
+ plugins: [{ name: "omo", source: "./plugins/omo" }],
145
+ });
146
+ await writePluginAt(pluginRoot, "omo", "0.1.0");
147
+ await mkdir(agentsRoot, { recursive: true });
148
+ await writeFile(
149
+ join(agentsRoot, "plan.toml"),
150
+ 'name = "plan"\nmodel = "gpt-5.5"\nmodel_reasoning_effort = "xhigh"\n',
151
+ );
152
+
153
+ await installMarketplaceLocally({
154
+ repoRoot,
155
+ codexHome,
156
+ platform: "linux",
157
+ runCommand: async () => {},
158
+ log: () => {},
159
+ });
160
+
161
+ assert.equal(
162
+ await readFile(join(codexHome, "agents", "plan.toml"), "utf8"),
163
+ 'name = "plan"\nmodel = "gpt-5.5"\nmodel_reasoning_effort = "xhigh"\n',
164
+ );
165
+ },
166
+ );
167
+
168
+ test(
169
+ "#given bundled ultrawork plan #when reinstalling without edits #then bundled xhigh stays intact",
170
+ async () => {
171
+ const repoRoot = await makeTempDir();
172
+ const codexHome = await makeTempDir();
173
+ const codexPackageRoot = join(repoRoot, "packages", "omo-codex");
174
+ const pluginRoot = join(codexPackageRoot, "plugin");
175
+ const agentsRoot = join(pluginRoot, "components", "ultrawork", "agents");
176
+
177
+ await writeJson(join(codexPackageRoot, "marketplace.json"), {
178
+ name: "sisyphuslabs",
179
+ plugins: [{ name: "omo", source: "./plugins/omo" }],
180
+ });
181
+ await writePluginAt(pluginRoot, "omo", "0.1.0");
182
+ await mkdir(agentsRoot, { recursive: true });
183
+ await writeFile(
184
+ join(agentsRoot, "plan.toml"),
185
+ 'name = "plan"\nmodel = "gpt-5.5"\nmodel_reasoning_effort = "xhigh"\n',
186
+ );
187
+
188
+ await installMarketplaceLocally({
189
+ repoRoot,
190
+ codexHome,
191
+ platform: "linux",
192
+ runCommand: async () => {},
193
+ log: () => {},
194
+ });
195
+ await installMarketplaceLocally({
196
+ repoRoot,
197
+ codexHome,
198
+ platform: "linux",
199
+ runCommand: async () => {},
200
+ log: () => {},
201
+ });
202
+
203
+ assert.equal(
204
+ await readFile(join(codexHome, "agents", "plan.toml"), "utf8"),
205
+ 'name = "plan"\nmodel = "gpt-5.5"\nmodel_reasoning_effort = "xhigh"\n',
206
+ );
207
+ },
208
+ );
209
+
210
+ test(
211
+ "#given user edited installed ultrawork plan #when reinstalling after snapshot refresh #then high survives",
212
+ async () => {
213
+ const repoRoot = await makeTempDir();
214
+ const codexHome = await makeTempDir();
215
+ const codexPackageRoot = join(repoRoot, "packages", "omo-codex");
216
+ const pluginRoot = join(codexPackageRoot, "plugin");
217
+ const agentsRoot = join(pluginRoot, "components", "ultrawork", "agents");
218
+
219
+ await writeJson(join(codexPackageRoot, "marketplace.json"), {
220
+ name: "sisyphuslabs",
221
+ plugins: [{ name: "omo", source: "./plugins/omo" }],
222
+ });
223
+ await writePluginAt(pluginRoot, "omo", "0.1.0");
224
+ await mkdir(agentsRoot, { recursive: true });
225
+ await writeFile(
226
+ join(agentsRoot, "plan.toml"),
227
+ 'name = "plan"\nmodel = "gpt-5.5"\nmodel_reasoning_effort = "xhigh"\n',
228
+ );
229
+
230
+ await installMarketplaceLocally({
231
+ repoRoot,
232
+ codexHome,
233
+ platform: "linux",
234
+ runCommand: async () => {},
235
+ log: () => {},
236
+ });
237
+ await writeFile(join(codexHome, "agents", "plan.toml"), 'name = "plan"\nmodel = "gpt-5.5"\nmodel_reasoning_effort = "high"\n');
238
+ await installMarketplaceLocally({
239
+ repoRoot,
240
+ codexHome,
241
+ platform: "linux",
242
+ runCommand: async () => {},
243
+ log: () => {},
244
+ });
245
+
246
+ const installedPlan = await readFile(join(codexHome, "agents", "plan.toml"), "utf8");
247
+ assert.ok(installedPlan.includes('model_reasoning_effort = "high"'));
248
+ assert.equal(installedPlan.includes('model_reasoning_effort = "xhigh"'), false);
249
+ const installedStat = await lstat(join(codexHome, "agents", "plan.toml"));
250
+ assert.equal(installedStat.isFile(), true);
251
+ assert.equal(installedStat.isSymbolicLink(), false);
252
+ },
253
+ );
254
+
255
+ test(
256
+ "#given user edited installed ultrawork plan #when reinstalling after snapshot refresh #then bundled snapshot target retains xhigh",
257
+ async () => {
258
+ const repoRoot = await makeTempDir();
259
+ const codexHome = await makeTempDir();
260
+ const codexPackageRoot = join(repoRoot, "packages", "omo-codex");
261
+ const pluginRoot = join(codexPackageRoot, "plugin");
262
+ const agentsRoot = join(pluginRoot, "components", "ultrawork", "agents");
263
+
264
+ await writeJson(join(codexPackageRoot, "marketplace.json"), {
265
+ name: "sisyphuslabs",
266
+ plugins: [{ name: "omo", source: "./plugins/omo" }],
267
+ });
268
+ await writePluginAt(pluginRoot, "omo", "0.1.0");
269
+ await mkdir(agentsRoot, { recursive: true });
270
+ await writeFile(
271
+ join(agentsRoot, "plan.toml"),
272
+ 'name = "plan"\nmodel = "gpt-5.5"\nmodel_reasoning_effort = "xhigh"\n',
273
+ );
274
+
275
+ await installMarketplaceLocally({
276
+ repoRoot,
277
+ codexHome,
278
+ platform: "linux",
279
+ runCommand: async () => {},
280
+ log: () => {},
281
+ });
282
+ await writeFile(join(codexHome, "agents", "plan.toml"), 'name = "plan"\nmodel = "gpt-5.5"\nmodel_reasoning_effort = "high"\n');
283
+ await installMarketplaceLocally({
284
+ repoRoot,
285
+ codexHome,
286
+ platform: "linux",
287
+ runCommand: async () => {},
288
+ log: () => {},
289
+ });
290
+
291
+ const snapshotPlan = await readFile(
292
+ join(codexHome, ".tmp", "marketplaces", "sisyphuslabs", "plugins", "omo", "components", "ultrawork", "agents", "plan.toml"),
293
+ "utf8",
294
+ );
295
+ assert.ok(snapshotPlan.includes('model_reasoning_effort = "xhigh"'));
296
+ assert.equal(snapshotPlan.includes('model_reasoning_effort = "high"'), false);
297
+ },
298
+ );
@@ -1,5 +1,5 @@
1
1
  import assert from "node:assert/strict";
2
- import { mkdir, readFile, readlink, symlink, writeFile } from "node:fs/promises";
2
+ import { lstat, mkdir, readFile, readlink, symlink, writeFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import test from "node:test";
5
5
 
@@ -99,6 +99,88 @@ test("#given managed legacy Codex LSP symlink #when linking bins #then removes s
99
99
  assert.equal(await readlink(join(binDir, "omo")), join(pluginRoot, "dist", "cli.js"));
100
100
  });
101
101
 
102
+ test("#given nested component declares reserved omo bin #when linking bins #then skips the nested top-level command", async () => {
103
+ const root = await makeTempDir();
104
+ const pluginRoot = join(root, "plugin");
105
+ const componentRoot = join(pluginRoot, "components", "ulw-loop");
106
+ const binDir = join(root, "bin");
107
+
108
+ await mkdir(join(componentRoot, "dist"), { recursive: true });
109
+ await writeJson(join(pluginRoot, "package.json"), {
110
+ name: "@example/omo",
111
+ });
112
+ await writeJson(join(componentRoot, "package.json"), {
113
+ name: "@example/ulw-loop",
114
+ bin: {
115
+ omo: "./dist/cli.js",
116
+ "omo-ulw-loop": "./dist/cli.js",
117
+ },
118
+ });
119
+ await writeFile(join(componentRoot, "dist", "cli.js"), "#!/usr/bin/env node\n");
120
+
121
+ const linked = await linkCachedPluginBins({ binDir, pluginRoot, platform: "linux" });
122
+
123
+ assert.deepEqual(linked, [
124
+ { name: "omo-ulw-loop", path: join(binDir, "omo-ulw-loop"), target: join(componentRoot, "dist", "cli.js") },
125
+ ]);
126
+ await assert.rejects(readlink(join(binDir, "omo")));
127
+ assert.equal(await readlink(join(binDir, "omo-ulw-loop")), join(componentRoot, "dist", "cli.js"));
128
+ });
129
+
130
+ test("#given stale managed ulw-loop omo symlink #when linking bins #then removes it without touching user-owned omo", async () => {
131
+ const root = await makeTempDir();
132
+ const pluginRoot = join(root, "plugin");
133
+ const componentRoot = join(pluginRoot, "components", "rules");
134
+ const binDir = join(root, "bin");
135
+ const oldTarget = join(root, "codex-home", "plugins", "cache", "sisyphuslabs", "omo", "0.1.0", "components", "ulw-loop", "dist", "cli.js");
136
+
137
+ await mkdir(join(componentRoot, "dist"), { recursive: true });
138
+ await mkdir(join(root, "codex-home", "plugins", "cache", "sisyphuslabs", "omo", "0.1.0", "components", "ulw-loop", "dist"), { recursive: true });
139
+ await mkdir(binDir, { recursive: true });
140
+ await writeJson(join(pluginRoot, "package.json"), {
141
+ name: "@example/omo",
142
+ });
143
+ await writeJson(join(componentRoot, "package.json"), {
144
+ name: "@example/rules",
145
+ bin: { "omo-rules": "./dist/cli.js" },
146
+ });
147
+ await writeFile(join(componentRoot, "dist", "cli.js"), "#!/usr/bin/env node\n");
148
+ await writeFile(oldTarget, "#!/usr/bin/env node\n");
149
+ await symlink(oldTarget, join(binDir, "omo"));
150
+
151
+ await linkCachedPluginBins({ binDir, pluginRoot, platform: "linux" });
152
+
153
+ await assert.rejects(readlink(join(binDir, "omo")));
154
+ assert.equal(await readlink(join(binDir, "omo-rules")), join(componentRoot, "dist", "cli.js"));
155
+ });
156
+
157
+ test("#given stale local-source ulw-loop omo symlink #when linking bins #then removes it", async () => {
158
+ const root = await makeTempDir();
159
+ const pluginRoot = join(root, "plugin");
160
+ const componentRoot = join(pluginRoot, "components", "rules");
161
+ const binDir = join(root, "bin");
162
+ const oldTarget = join(root, "repo", "packages", "omo-codex", "plugin", "components", "ulw-loop", "dist", "cli.js");
163
+
164
+ await mkdir(join(componentRoot, "dist"), { recursive: true });
165
+ await mkdir(join(root, "repo", "packages", "omo-codex", "plugin", "components", "ulw-loop", "dist"), { recursive: true });
166
+ await mkdir(binDir, { recursive: true });
167
+ await writeJson(join(pluginRoot, "package.json"), {
168
+ name: "@example/omo",
169
+ });
170
+ await writeJson(join(componentRoot, "package.json"), {
171
+ name: "@example/rules",
172
+ bin: { "omo-rules": "./dist/cli.js" },
173
+ });
174
+ await writeFile(join(componentRoot, "dist", "cli.js"), "#!/usr/bin/env node\n");
175
+ await writeFile(oldTarget, "#!/usr/bin/env node\n");
176
+ await symlink(oldTarget, join(binDir, "omo"));
177
+
178
+ await linkCachedPluginBins({ binDir, pluginRoot, platform: "linux" });
179
+
180
+ await assert.rejects(readlink(join(binDir, "omo")));
181
+ assert.equal(await readlink(join(binDir, "omo-rules")), join(componentRoot, "dist", "cli.js"));
182
+ });
183
+
102
184
  test("#given user-owned legacy Codex symlink #when linking bins #then preserves the user symlink", async () => {
103
185
  const root = await makeTempDir();
104
186
  const pluginRoot = join(root, "plugin");
@@ -144,3 +226,43 @@ test("#given user-owned legacy Codex symlink with component-like target #when li
144
226
  assert.equal(await readlink(join(binDir, "codex-rules")), userTarget);
145
227
  assert.equal(await readlink(join(binDir, "omo-rules")), join(pluginRoot, "dist", "cli.js"));
146
228
  });
229
+
230
+ test("#given package bin name escapes bin directory #when linking bins #then rejects without writing outside link", async () => {
231
+ const root = await makeTempDir();
232
+ const pluginRoot = join(root, "plugin");
233
+ const binDir = join(root, "bin");
234
+ const escapedLink = join(root, "escaped");
235
+
236
+ await mkdir(join(pluginRoot, "dist"), { recursive: true });
237
+ await writeJson(join(pluginRoot, "package.json"), {
238
+ name: "@example/omo",
239
+ bin: { "../escaped": "./dist/cli.js" },
240
+ });
241
+ await writeFile(join(pluginRoot, "dist", "cli.js"), "#!/usr/bin/env node\n");
242
+
243
+ await assert.rejects(
244
+ linkCachedPluginBins({ binDir, pluginRoot, platform: "linux" }),
245
+ /invalid package bin name/,
246
+ );
247
+ await assert.rejects(lstat(escapedLink));
248
+ });
249
+
250
+ test("#given package bin target escapes plugin root #when linking bins #then rejects without linking outside target", async () => {
251
+ const root = await makeTempDir();
252
+ const pluginRoot = join(root, "plugin");
253
+ const binDir = join(root, "bin");
254
+ const outsideTarget = join(root, "outside.js");
255
+
256
+ await mkdir(pluginRoot, { recursive: true });
257
+ await writeJson(join(pluginRoot, "package.json"), {
258
+ name: "@example/omo",
259
+ bin: { omo: "../outside.js" },
260
+ });
261
+ await writeFile(outsideTarget, "#!/usr/bin/env node\n");
262
+
263
+ await assert.rejects(
264
+ linkCachedPluginBins({ binDir, pluginRoot, platform: "linux" }),
265
+ /escapes package root/,
266
+ );
267
+ await assert.rejects(readlink(join(binDir, "omo")));
268
+ });