oh-my-opencode 4.7.4 → 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 +4492 -2265
  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 +16 -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 +52 -0
  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 +26 -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 +173 -61
  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 +204 -26
  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
@@ -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) {
@@ -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) {
@@ -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
+ });