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
@@ -0,0 +1,239 @@
1
+ import { chmod, lstat, mkdir, readFile, readdir, readlink, rm, stat, symlink, writeFile } from "node:fs/promises";
2
+ import { basename, join, relative, resolve } from "node:path";
3
+
4
+ import { COMMAND_SHIM_MARKER } from "./command-shim.mjs";
5
+ import { removeLegacyCodexComponentBins } from "./legacy-bins.mjs";
6
+
7
+ const RESERVED_NESTED_BIN_NAMES = new Set(["omo", "lazycodex", "lazycodex-ai", "oh-my-opencode", "oh-my-openagent"]);
8
+ const RUNTIME_WRAPPER_MARKER = "OMO_GENERATED_RUNTIME_WRAPPER";
9
+
10
+ export async function linkCachedPluginBins({ binDir, pluginRoot, platform = process.platform }) {
11
+ const binLinks = await discoverPackageBins(pluginRoot);
12
+ await mkdir(binDir, { recursive: true });
13
+ await removeLegacyCodexComponentBins(binDir, platform);
14
+ const linked = [];
15
+ for (const link of binLinks) {
16
+ const linkPath = await linkCachedPluginBin(binDir, link, platform);
17
+ linked.push({ name: link.name, path: linkPath, target: link.target });
18
+ }
19
+ return linked;
20
+ }
21
+
22
+ export async function linkRootRuntimeBin({ binDir, codexHome, repoRoot, platform = process.platform }) {
23
+ const cliPath = join(repoRoot, "dist", "cli", "index.js");
24
+ if (!(await isFile(cliPath))) return null;
25
+
26
+ await mkdir(binDir, { recursive: true });
27
+ if (platform === "win32") {
28
+ const linkPath = join(binDir, "omo.cmd");
29
+ await replaceRuntimeWrapper(linkPath, windowsRuntimeWrapper(cliPath, codexHome, binDir));
30
+ return { name: "omo", path: linkPath, target: cliPath };
31
+ }
32
+
33
+ const linkPath = join(binDir, "omo");
34
+ await replaceRuntimeWrapper(linkPath, posixRuntimeWrapper(cliPath, codexHome, binDir));
35
+ await chmod(linkPath, 0o755);
36
+ return { name: "omo", path: linkPath, target: cliPath };
37
+ }
38
+
39
+ async function linkCachedPluginBin(binDir, link, platform) {
40
+ if (platform === "win32") {
41
+ const linkPath = join(binDir, `${link.name}.cmd`);
42
+ await replaceCommandShim(linkPath, link.target);
43
+ return linkPath;
44
+ }
45
+
46
+ const linkPath = join(binDir, link.name);
47
+ await replaceSymlink(linkPath, link.target);
48
+ return linkPath;
49
+ }
50
+
51
+ async function isFile(path) {
52
+ try {
53
+ return (await stat(path)).isFile();
54
+ } catch (error) {
55
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
56
+ throw error;
57
+ }
58
+ }
59
+
60
+ async function discoverPackageBins(root) {
61
+ const links = [];
62
+ await collectPackageBins(root, root, links);
63
+ return links;
64
+ }
65
+
66
+ async function collectPackageBins(directory, root, links) {
67
+ const entries = await readdir(directory, { withFileTypes: true });
68
+ const packageJsonPath = join(directory, "package.json");
69
+ if (entries.some((entry) => entry.isFile() && entry.name === "package.json")) {
70
+ await appendPackageBinLinks(packageJsonPath, directory, root, links);
71
+ }
72
+ for (const entry of entries) {
73
+ if (!entry.isDirectory()) continue;
74
+ if (entry.name === "node_modules" || entry.name === ".git" || entry.name === "dist") continue;
75
+ const childPath = join(directory, entry.name);
76
+ if (!isPathInside(childPath, root)) continue;
77
+ await collectPackageBins(childPath, root, links);
78
+ }
79
+ }
80
+
81
+ async function appendPackageBinLinks(packageJsonPath, packageRoot, root, links) {
82
+ const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
83
+ if (!isRecord(packageJson)) return;
84
+ const bin = packageJson.bin;
85
+ if (typeof bin === "string" && typeof packageJson.name === "string") {
86
+ const name = basename(packageJson.name);
87
+ if (!isReservedNestedBinName(name, packageRoot, root)) {
88
+ links.push(createPackageBinLink(name, bin, packageRoot));
89
+ }
90
+ return;
91
+ }
92
+ if (!isRecord(bin)) return;
93
+ for (const [name, target] of Object.entries(bin)) {
94
+ if (typeof target !== "string") continue;
95
+ if (isReservedNestedBinName(name, packageRoot, root)) continue;
96
+ links.push(createPackageBinLink(name, target, packageRoot));
97
+ }
98
+ }
99
+
100
+ function createPackageBinLink(name, target, packageRoot) {
101
+ assertSafeBinName(name);
102
+ if (target.includes("\0")) {
103
+ throw new Error(`package bin target for ${name} contains a NUL byte`);
104
+ }
105
+ const resolvedTarget = resolve(packageRoot, target);
106
+ if (!isPathInside(resolvedTarget, packageRoot)) {
107
+ throw new Error(`package bin target for ${name} escapes package root`);
108
+ }
109
+ return { name, target: resolvedTarget };
110
+ }
111
+
112
+ function assertSafeBinName(name) {
113
+ if (
114
+ name.length === 0 ||
115
+ name === "." ||
116
+ name === ".." ||
117
+ name.includes("\0") ||
118
+ name.includes("/") ||
119
+ name.includes("\\")
120
+ ) {
121
+ throw new Error(`invalid package bin name: ${name}`);
122
+ }
123
+ }
124
+
125
+ function isReservedNestedBinName(name, packageRoot, root) {
126
+ return packageRoot !== root && RESERVED_NESTED_BIN_NAMES.has(name);
127
+ }
128
+
129
+ async function replaceSymlink(linkPath, targetPath) {
130
+ if (await existingNonSymlink(linkPath)) {
131
+ throw new Error(`${linkPath} already exists and is not a symlink`);
132
+ }
133
+ await rm(linkPath, { force: true });
134
+ await symlink(targetPath, linkPath);
135
+ }
136
+
137
+ async function replaceCommandShim(linkPath, targetPath) {
138
+ if (await existingNonShim(linkPath)) {
139
+ throw new Error(`${linkPath} already exists and is not a command shim`);
140
+ }
141
+ await writeFile(linkPath, `@echo off\r\n${COMMAND_SHIM_MARKER}\r\nnode "${targetPath}" %*\r\n`);
142
+ }
143
+
144
+ async function replaceRuntimeWrapper(linkPath, content) {
145
+ if (await existingNonRuntimeWrapper(linkPath)) {
146
+ throw new Error(`${linkPath} already exists and is not a generated OMO runtime wrapper`);
147
+ }
148
+ await rm(linkPath, { force: true });
149
+ await writeFile(linkPath, content);
150
+ }
151
+
152
+ async function existingNonRuntimeWrapper(path) {
153
+ try {
154
+ const stat = await lstat(path);
155
+ if (stat.isSymbolicLink()) return false;
156
+ if (!stat.isFile()) return true;
157
+ const content = await readFile(path, "utf8");
158
+ return !content.includes(RUNTIME_WRAPPER_MARKER);
159
+ } catch (error) {
160
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
161
+ throw error;
162
+ }
163
+ }
164
+
165
+ function posixRuntimeWrapper(cliPath, codexHome, binDir) {
166
+ const ulwLoopBin = join(binDir, "omo-ulw-loop");
167
+ return [
168
+ "#!/bin/sh",
169
+ `# ${RUNTIME_WRAPPER_MARKER}`,
170
+ `export CODEX_HOME="\${CODEX_HOME:-${escapePosixDoubleQuoted(codexHome)}}"`,
171
+ 'export OMO_SPARKSHELL_APP_SERVER_SOCKET="${OMO_SPARKSHELL_APP_SERVER_SOCKET:-$CODEX_HOME/app-server-control/app-server-control.sock}"',
172
+ 'BUN_BINARY="${BUN_BINARY:-bun}"',
173
+ 'if [ "$1" = "ulw-loop" ] && [ -x "' + escapePosixDoubleQuoted(ulwLoopBin) + '" ]; then',
174
+ " shift",
175
+ ' exec "' + escapePosixDoubleQuoted(ulwLoopBin) + '" "$@"',
176
+ "fi",
177
+ `exec "$BUN_BINARY" "${escapePosixDoubleQuoted(cliPath)}" "$@"`,
178
+ "",
179
+ ].join("\n");
180
+ }
181
+
182
+ function windowsRuntimeWrapper(cliPath, codexHome, binDir) {
183
+ const ulwLoopBin = join(binDir, "omo-ulw-loop.cmd");
184
+ return [
185
+ "@echo off",
186
+ `rem ${RUNTIME_WRAPPER_MARKER}`,
187
+ `if not defined CODEX_HOME set "CODEX_HOME=${codexHome}"`,
188
+ 'if not defined OMO_SPARKSHELL_APP_SERVER_SOCKET set "OMO_SPARKSHELL_APP_SERVER_SOCKET=%CODEX_HOME%\\app-server-control\\app-server-control.sock"',
189
+ `if "%~1"=="ulw-loop" if exist "${ulwLoopBin}" (`,
190
+ " shift /1",
191
+ ` "${ulwLoopBin}" %*`,
192
+ " exit /b %ERRORLEVEL%",
193
+ ")",
194
+ `if defined BUN_BINARY ("%BUN_BINARY%" "${cliPath}" %*) else bun "${cliPath}" %*`,
195
+ "",
196
+ ].join("\r\n");
197
+ }
198
+
199
+ function escapePosixDoubleQuoted(value) {
200
+ return value.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("$", "\\$").replaceAll("`", "\\`");
201
+ }
202
+
203
+ async function existingNonShim(path) {
204
+ try {
205
+ const stat = await lstat(path);
206
+ if (!stat.isFile()) return true;
207
+ const content = await readFile(path, "utf8");
208
+ if (content.includes(COMMAND_SHIM_MARKER)) return false;
209
+ throw new Error(`${path} already exists and is not a generated command shim`);
210
+ } catch (error) {
211
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
212
+ throw error;
213
+ }
214
+ }
215
+
216
+ async function existingNonSymlink(path) {
217
+ try {
218
+ const stat = await lstat(path);
219
+ if (!stat.isSymbolicLink()) return true;
220
+ await readlink(path);
221
+ return false;
222
+ } catch (error) {
223
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
224
+ throw error;
225
+ }
226
+ }
227
+
228
+ function isRecord(value) {
229
+ return typeof value === "object" && value !== null && !Array.isArray(value);
230
+ }
231
+
232
+ function isPathInside(candidatePath, rootPath) {
233
+ const pathFromRoot = relative(rootPath, candidatePath);
234
+ return pathFromRoot === "" || (!pathFromRoot.startsWith("..") && !pathFromRoot.startsWith(`..\\`) && !isDriveRelative(pathFromRoot));
235
+ }
236
+
237
+ function isDriveRelative(path) {
238
+ return /^[a-zA-Z]:/.test(path);
239
+ }
@@ -1,22 +1,31 @@
1
1
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
2
- import { cp, lstat, mkdir, readFile, readdir, readlink, rename, rm, symlink, writeFile } from "node:fs/promises";
2
+ import { realpathSync } from "node:fs";
3
+ import { cp, mkdir, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
3
4
 
4
5
  import { createCachedMcpRuntimeArgRewriter } from "./mcp-runtime-cache.mjs";
5
6
  import { exists, isRecord } from "./utils.mjs";
6
- import { COMMAND_SHIM_MARKER } from "./command-shim.mjs";
7
- import { removeLegacyCodexComponentBins } from "./legacy-bins.mjs";
7
+ export { linkCachedPluginBins, linkRootRuntimeBin } from "./bin-links.mjs";
8
8
 
9
- export async function installCachedPlugin({ buildSource = true, codexHome, marketplaceName, name, runCommand, sourcePath, version }) {
9
+ export async function installCachedPlugin({ buildSource = true, codexHome, marketplaceName, name, renameDirectory = rename, runCommand, sourcePath, version }) {
10
10
  if (buildSource) {
11
11
  await maybeRunNpmInstall(sourcePath, runCommand);
12
12
  await maybeRunNpmBuild(sourcePath, runCommand);
13
13
  }
14
14
 
15
15
  const targetPath = join(codexHome, "plugins", "cache", marketplaceName, name, version);
16
- await replaceDirectory(sourcePath, targetPath, shouldCopyPluginPath);
17
- await rewriteCachedPackageLocalFileDependencies(targetPath, sourcePath);
18
- await maybeRunNpmInstall(targetPath, runCommand, ["install", "--omit=dev"]);
19
- await rewriteCachedMcpManifest(targetPath, sourcePath);
16
+ const tempPath = createTempSiblingPath(targetPath);
17
+ await rm(tempPath, { recursive: true, force: true });
18
+ try {
19
+ await copyDirectory(sourcePath, tempPath, shouldCopyPluginPath);
20
+ await rewriteCachedPackageLocalFileDependencies(tempPath, sourcePath);
21
+ await maybeRunNpmInstall(tempPath, runCommand, ["ci", "--omit=dev"]);
22
+ await rewriteCachedMcpManifest(tempPath, sourcePath);
23
+ await rewriteCachedManifestRoot(tempPath, tempPath, targetPath);
24
+ await promoteDirectory(tempPath, targetPath, renameDirectory);
25
+ } catch (error) {
26
+ await rm(tempPath, { recursive: true, force: true });
27
+ throw error;
28
+ }
20
29
  return { name, version, path: targetPath };
21
30
  }
22
31
 
@@ -42,30 +51,6 @@ export async function pruneMarketplacePluginCaches({ codexHome, marketplaceName,
42
51
  }
43
52
  }
44
53
 
45
- export async function linkCachedPluginBins({ binDir, pluginRoot, platform = process.platform }) {
46
- const binLinks = await discoverPackageBins(pluginRoot);
47
- await mkdir(binDir, { recursive: true });
48
- await removeLegacyCodexComponentBins(binDir, platform);
49
- const linked = [];
50
- for (const link of binLinks) {
51
- const linkPath = await linkCachedPluginBin(binDir, link, platform);
52
- linked.push({ name: link.name, path: linkPath, target: link.target });
53
- }
54
- return linked;
55
- }
56
-
57
- async function linkCachedPluginBin(binDir, link, platform) {
58
- if (platform === "win32") {
59
- const linkPath = join(binDir, `${link.name}.cmd`);
60
- await replaceCommandShim(linkPath, link.target);
61
- return linkPath;
62
- }
63
-
64
- const linkPath = join(binDir, link.name);
65
- await replaceSymlink(linkPath, link.target);
66
- return linkPath;
67
- }
68
-
69
54
  async function maybeRunNpmInstall(cwd, runCommand, args = ["install"]) {
70
55
  if (!(await exists(join(cwd, "package.json")))) return;
71
56
  await runCommand("npm", args, { cwd });
@@ -78,99 +63,49 @@ async function maybeRunNpmBuild(cwd, runCommand) {
78
63
  await runCommand("npm", ["run", "build"], { cwd });
79
64
  }
80
65
 
81
- async function replaceDirectory(sourcePath, targetPath, filter) {
82
- await mkdir(dirname(targetPath), { recursive: true });
83
- const tempPath = join(dirname(targetPath), `.tmp-${basename(targetPath)}-${process.pid}-${Date.now()}`);
84
- await rm(tempPath, { recursive: true, force: true });
85
- await cp(sourcePath, tempPath, {
86
- recursive: true,
87
- filter: (source) => filter(source, sourcePath),
88
- });
89
- await rm(targetPath, { recursive: true, force: true });
90
- await rename(tempPath, targetPath);
91
- }
92
-
93
- async function discoverPackageBins(root) {
94
- const links = [];
95
- await collectPackageBins(root, root, links);
96
- return links;
97
- }
98
-
99
- async function collectPackageBins(directory, root, links) {
100
- const entries = await readdir(directory, { withFileTypes: true });
101
- const packageJsonPath = join(directory, "package.json");
102
- if (entries.some((entry) => entry.isFile() && entry.name === "package.json")) {
103
- await appendPackageBinLinks(packageJsonPath, directory, links);
104
- }
105
- for (const entry of entries) {
106
- if (!entry.isDirectory()) continue;
107
- if (entry.name === "node_modules" || entry.name === ".git" || entry.name === "dist") continue;
108
- const childPath = join(directory, entry.name);
109
- if (!childPath.startsWith(root)) continue;
110
- await collectPackageBins(childPath, root, links);
111
- }
112
- }
113
-
114
- async function appendPackageBinLinks(packageJsonPath, packageRoot, links) {
115
- const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
116
- if (!isRecord(packageJson)) return;
117
- const bin = packageJson.bin;
118
- if (typeof bin === "string" && typeof packageJson.name === "string") {
119
- links.push({ name: basename(packageJson.name), target: join(packageRoot, bin) });
120
- return;
121
- }
122
- if (!isRecord(bin)) return;
123
- for (const [name, target] of Object.entries(bin)) {
124
- if (typeof target !== "string") continue;
125
- links.push({ name, target: join(packageRoot, target) });
126
- }
66
+ function createTempSiblingPath(targetPath) {
67
+ return join(dirname(targetPath), `.tmp-${basename(targetPath)}-${process.pid}-${Date.now()}`);
127
68
  }
128
69
 
129
- async function replaceSymlink(linkPath, targetPath) {
130
- if (await existingNonSymlink(linkPath)) {
131
- throw new Error(`${linkPath} already exists and is not a symlink`);
132
- }
133
- await rm(linkPath, { force: true });
134
- await symlink(targetPath, linkPath);
70
+ function createBackupSiblingPath(targetPath) {
71
+ return join(dirname(targetPath), `.backup-${basename(targetPath)}-${process.pid}-${Date.now()}`);
135
72
  }
136
73
 
137
- async function replaceCommandShim(linkPath, targetPath) {
138
- if (await existingNonShim(linkPath)) {
139
- throw new Error(`${linkPath} already exists and is not a command shim`);
140
- }
141
- await writeFile(linkPath, `@echo off\r\n${COMMAND_SHIM_MARKER}\r\nnode "${targetPath}" %*\r\n`);
74
+ async function copyDirectory(sourcePath, targetPath, filter) {
75
+ await mkdir(dirname(targetPath), { recursive: true });
76
+ await cp(sourcePath, targetPath, {
77
+ recursive: true,
78
+ filter: (source) => filter(source, sourcePath),
79
+ });
142
80
  }
143
81
 
144
- async function existingNonShim(path) {
82
+ async function promoteDirectory(tempPath, targetPath, renameDirectory) {
83
+ const backupPath = createBackupSiblingPath(targetPath);
84
+ await rm(backupPath, { recursive: true, force: true });
85
+ let backupMoved = false;
145
86
  try {
146
- const stat = await lstat(path);
147
- if (!stat.isFile()) return true;
148
- const content = await readFile(path, "utf8");
149
- if (content.includes(COMMAND_SHIM_MARKER)) return false;
150
- throw new Error(`${path} already exists and is not a generated command shim`);
87
+ if (await exists(targetPath)) {
88
+ await renameDirectory(targetPath, backupPath);
89
+ backupMoved = true;
90
+ }
91
+ await renameDirectory(tempPath, targetPath);
151
92
  } catch (error) {
152
- if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
93
+ if (backupMoved) await restoreBackupDirectory(backupPath, targetPath, renameDirectory);
153
94
  throw error;
154
95
  }
96
+ if (backupMoved) await rm(backupPath, { recursive: true, force: true });
155
97
  }
156
98
 
157
- async function existingNonSymlink(path) {
158
- try {
159
- const stat = await lstat(path);
160
- if (!stat.isSymbolicLink()) return true;
161
- await readlink(path);
162
- return false;
163
- } catch (error) {
164
- if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
165
- throw error;
166
- }
99
+ async function restoreBackupDirectory(backupPath, targetPath, renameDirectory) {
100
+ if (!(await exists(backupPath))) return;
101
+ await rm(targetPath, { recursive: true, force: true });
102
+ await renameDirectory(backupPath, targetPath);
167
103
  }
168
104
 
169
105
  function shouldCopyPluginPath(path, root) {
170
106
  const relative = path === root ? "" : path.slice(root.length + sep.length);
171
107
  if (relative === "") return true;
172
108
  const parts = relative.split(sep);
173
- if (parts[parts.length - 1] === "package-lock.json") return false;
174
109
  return !parts.some((part) => part === ".git" || part === "node_modules");
175
110
  }
176
111
 
@@ -200,9 +135,34 @@ export async function rewriteCachedMcpManifest(pluginRoot, sourceRoot = pluginRo
200
135
  if (changed) await writeFile(manifestPath, `${JSON.stringify(parsed, null, "\t")}\n`);
201
136
  }
202
137
 
138
+ async function rewriteCachedManifestRoot(pluginRoot, fromRoot, toRoot) {
139
+ const manifestPath = join(pluginRoot, ".mcp.json");
140
+ if (!(await exists(manifestPath))) return;
141
+ const raw = await readFile(manifestPath, "utf8");
142
+ const parsed = JSON.parse(raw);
143
+ if (!isRecord(parsed) || !isRecord(parsed.mcpServers)) return;
144
+ let changed = false;
145
+ for (const server of Object.values(parsed.mcpServers)) {
146
+ if (!isRecord(server) || !Array.isArray(server.args)) continue;
147
+ const nextArgs = server.args.map((arg) => {
148
+ if (typeof arg !== "string") return arg;
149
+ if (arg === fromRoot) return toRoot;
150
+ const prefix = `${fromRoot}${sep}`;
151
+ if (!arg.startsWith(prefix)) return arg;
152
+ return `${toRoot}${arg.slice(fromRoot.length)}`;
153
+ });
154
+ if (nextArgs.some((value, index) => value !== server.args[index])) {
155
+ server.args = nextArgs;
156
+ changed = true;
157
+ }
158
+ }
159
+ if (changed) await writeFile(manifestPath, `${JSON.stringify(parsed, null, "\t")}\n`);
160
+ }
161
+
203
162
  async function rewriteCachedPackageLocalFileDependencies(pluginRoot, sourceRoot) {
204
163
  const packageJsonPaths = [];
205
164
  await collectPackageJsonPaths(pluginRoot, pluginRoot, packageJsonPaths);
165
+ const packageLock = await readPackageLock(pluginRoot);
206
166
  for (const packageJsonPath of packageJsonPaths) {
207
167
  const raw = await readFile(packageJsonPath, "utf8");
208
168
  const parsed = JSON.parse(raw);
@@ -219,12 +179,96 @@ async function rewriteCachedPackageLocalFileDependencies(pluginRoot, sourceRoot)
219
179
  if (filePath.length === 0 || isAbsolute(filePath)) continue;
220
180
  const targetPath = resolve(packageDir, filePath);
221
181
  if (isPathInside(targetPath, pluginRoot)) continue;
222
- dependencies[name] = `file:${resolve(sourcePackageDir, filePath)}`;
182
+ const sourceTargetPath = resolve(sourcePackageDir, filePath);
183
+ dependencies[name] = `file:${sourceTargetPath}`;
184
+ rewritePackageLockFileDependency({
185
+ dependencyName: name,
186
+ field,
187
+ packageDir,
188
+ packageLock,
189
+ pluginRoot,
190
+ sourceTargetPath,
191
+ targetPath,
192
+ });
223
193
  changed = true;
224
194
  }
225
195
  }
226
196
  if (changed) await writeFile(packageJsonPath, `${JSON.stringify(parsed, null, "\t")}\n`);
227
197
  }
198
+ if (packageLock.changed) await writeFile(packageLock.path, `${JSON.stringify(packageLock.value, null, "\t")}\n`);
199
+ }
200
+
201
+ async function readPackageLock(pluginRoot) {
202
+ const path = join(pluginRoot, "package-lock.json");
203
+ try {
204
+ const parsed = JSON.parse(await readFile(path, "utf8"));
205
+ return { path, value: isRecord(parsed) ? parsed : null, changed: false };
206
+ } catch (error) {
207
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
208
+ return { path, value: null, changed: false };
209
+ }
210
+ throw error;
211
+ }
212
+ }
213
+
214
+ function rewritePackageLockFileDependency({
215
+ dependencyName,
216
+ field,
217
+ packageDir,
218
+ packageLock,
219
+ pluginRoot,
220
+ sourceTargetPath,
221
+ targetPath,
222
+ }) {
223
+ const packages = getPackageLockPackages(packageLock.value);
224
+ if (!packages) return;
225
+
226
+ const lockRoot = canonicalizeExistingPath(pluginRoot);
227
+ const packageKey = toPackageLockPath(relative(pluginRoot, packageDir));
228
+ const oldTargetKey = toPackageLockPath(relative(pluginRoot, targetPath));
229
+ const newTargetKey = toPackageLockPath(relative(lockRoot, sourceTargetPath));
230
+ const newSpecifier = `file:${sourceTargetPath}`;
231
+
232
+ const packageEntry = packages[packageKey];
233
+ if (isRecord(packageEntry)) {
234
+ const dependencyRecord = packageEntry[field];
235
+ if (isRecord(dependencyRecord) && dependencyRecord[dependencyName] !== newSpecifier) {
236
+ dependencyRecord[dependencyName] = newSpecifier;
237
+ packageLock.changed = true;
238
+ }
239
+ }
240
+
241
+ if (oldTargetKey !== newTargetKey && isRecord(packages[oldTargetKey])) {
242
+ packages[newTargetKey] = packages[oldTargetKey];
243
+ delete packages[oldTargetKey];
244
+ packageLock.changed = true;
245
+ }
246
+
247
+ const nodeModulesKey = `node_modules/${dependencyName}`;
248
+ const nodeModulesEntry = packages[nodeModulesKey];
249
+ if (isRecord(nodeModulesEntry) && nodeModulesEntry.resolved !== newTargetKey) {
250
+ nodeModulesEntry.resolved = newTargetKey;
251
+ packageLock.changed = true;
252
+ }
253
+ }
254
+
255
+ function getPackageLockPackages(packageLock) {
256
+ if (!packageLock) return null;
257
+ const packages = packageLock.packages;
258
+ return isRecord(packages) ? packages : null;
259
+ }
260
+
261
+ function toPackageLockPath(path) {
262
+ return path.split(sep).join("/");
263
+ }
264
+
265
+ function canonicalizeExistingPath(path) {
266
+ try {
267
+ return realpathSync(path);
268
+ } catch (error) {
269
+ if (error instanceof Error) return path;
270
+ throw error;
271
+ }
228
272
  }
229
273
 
230
274
  async function collectPackageJsonPaths(directory, root, paths) {
@@ -0,0 +1,21 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+
4
+ export async function writeCachedMarketplaceManifest({ marketplaceName, marketplaceRoot, plugins }) {
5
+ const marketplaceDir = join(marketplaceRoot, ".agents", "plugins");
6
+ await mkdir(marketplaceDir, { recursive: true });
7
+ await writeFile(
8
+ join(marketplaceDir, "marketplace.json"),
9
+ `${JSON.stringify(
10
+ {
11
+ name: marketplaceName,
12
+ plugins: plugins.map((plugin) => ({
13
+ name: plugin.name,
14
+ source: { source: "local", path: `./${plugin.name}/${plugin.version}` },
15
+ })),
16
+ },
17
+ null,
18
+ "\t",
19
+ )}\n`,
20
+ );
21
+ }
@@ -1,5 +1,5 @@
1
1
  const CODEX_ONLY_ERROR = "lazycodex-ai installs the Codex Light edition only. Use the omo installer for OpenCode or both-platform installs.";
2
- const PASSTHROUGH_COMMANDS = new Set(["doctor", "cleanup", "get-local-version", "boulder", "refresh-model-capabilities", "run", "ulw-loop"]);
2
+ export const PASSTHROUGH_COMMANDS = new Set(["doctor", "cleanup", "get-local-version", "boulder", "refresh-model-capabilities", "run", "ulw-loop"]);
3
3
 
4
4
  export function parseLazyCodexInstallCliArgs(argv) {
5
5
  const args = [...argv];
@@ -72,6 +72,34 @@ export function parseLazyCodexInstallCliArgs(argv) {
72
72
  index += 1;
73
73
  continue;
74
74
  }
75
+ if (arg === "update") {
76
+ index += 1;
77
+ while (index < args.length) {
78
+ const updateArg = args[index];
79
+ if (updateArg === "--dry-run") {
80
+ dryRun = true;
81
+ index += 1;
82
+ continue;
83
+ }
84
+ if (updateArg === "--repo-root") {
85
+ repoRoot = readOptionValue(args, index, "--repo-root");
86
+ index += 2;
87
+ continue;
88
+ }
89
+ if (typeof updateArg === "string" && updateArg.startsWith("--repo-root=")) {
90
+ const value = updateArg.slice("--repo-root=".length);
91
+ if (value.trim().length === 0) throw new Error("--repo-root requires a path");
92
+ repoRoot = value;
93
+ index += 1;
94
+ continue;
95
+ }
96
+ throw new Error(`Unsupported lazycodex-ai update option: ${String(updateArg)}`);
97
+ }
98
+ return { kind: "update", dryRun, repoRoot };
99
+ }
100
+ if (arg === "uninstall") {
101
+ return { kind: "command", command: "cleanup", dryRun, args: args.slice(index + 1) };
102
+ }
75
103
  if (PASSTHROUGH_COMMANDS.has(arg)) {
76
104
  return { kind: "command", command: arg, dryRun, args: args.slice(index + 1) };
77
105
  }
@@ -104,9 +132,18 @@ function readOptionValue(args, index, option) {
104
132
  }
105
133
 
106
134
  export function formatLazyCodexInstallHelp() {
135
+ const passthrough = [...PASSTHROUGH_COMMANDS].sort().join(", ");
107
136
  return [
108
137
  "Usage: lazycodex-ai install [--no-tui] [--codex-autonomous|--no-codex-autonomous] [--repo-root <path>]",
138
+ " lazycodex-ai uninstall [--project <path>]",
139
+ " lazycodex-ai update [--dry-run] [--repo-root <path>]",
140
+ " lazycodex-ai version",
141
+ " lazycodex-ai <command> [args...]",
142
+ "",
143
+ "Installs or removes the Codex Light edition in ~/.codex using Node/npm.",
144
+ "`uninstall` removes managed Codex Light state; `cleanup` is a backward-compatible alias.",
145
+ "`update` refreshes the installed Codex Light edition in place.",
109
146
  "",
110
- "Installs the Codex Light edition into ~/.codex using Node/npm.",
147
+ `Pass-through commands delegated to the omo CLI: ${passthrough}.`,
111
148
  ].join("\n");
112
149
  }