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,27 @@
1
+ import { Buffer } from "node:buffer"
2
+
3
+ export const PNG_SIGNATURE: Buffer = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])
4
+
5
+ function buildCrcTable(): Uint32Array {
6
+ const table = new Uint32Array(256)
7
+ for (let n = 0; n < 256; n++) {
8
+ let c = n
9
+ for (let k = 0; k < 8; k++) {
10
+ c = (c & 1) === 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1
11
+ }
12
+ table[n] = c >>> 0
13
+ }
14
+ return table
15
+ }
16
+
17
+ const CRC_TABLE = buildCrcTable()
18
+
19
+ export function crc32(data: Buffer): number {
20
+ let crc = 0xffffffff
21
+ for (let i = 0; i < data.length; i++) {
22
+ const byte = data[i] ?? 0
23
+ const entry = CRC_TABLE[(crc ^ byte) & 0xff] ?? 0
24
+ crc = entry ^ (crc >>> 8)
25
+ }
26
+ return (crc ^ 0xffffffff) >>> 0
27
+ }
@@ -0,0 +1,206 @@
1
+ import { Buffer } from "node:buffer"
2
+ import { inflateSync } from "node:zlib"
3
+
4
+ import { PNG_SIGNATURE } from "./png-crc"
5
+ import type { DecodedImage } from "./types"
6
+
7
+ export class PngDecodeError extends Error {
8
+ readonly name = "PngDecodeError"
9
+ }
10
+
11
+ interface PngHeader {
12
+ readonly width: number
13
+ readonly height: number
14
+ readonly bitDepth: number
15
+ readonly colorType: number
16
+ readonly channels: number
17
+ }
18
+
19
+ interface PngChunk {
20
+ readonly type: string
21
+ readonly data: Buffer
22
+ }
23
+
24
+ function readChunks(buffer: Buffer): readonly PngChunk[] {
25
+ const chunks: PngChunk[] = []
26
+ let offset = 8
27
+ while (offset + 8 <= buffer.length) {
28
+ const length = buffer.readUInt32BE(offset)
29
+ const type = buffer.toString("ascii", offset + 4, offset + 8)
30
+ const dataStart = offset + 8
31
+ const dataEnd = dataStart + length
32
+ if (dataEnd + 4 > buffer.length) break
33
+ chunks.push({ type, data: buffer.subarray(dataStart, dataEnd) })
34
+ offset = dataEnd + 4
35
+ }
36
+ return chunks
37
+ }
38
+
39
+ function channelsForColorType(colorType: number): number {
40
+ switch (colorType) {
41
+ case 0:
42
+ return 1
43
+ case 2:
44
+ return 3
45
+ case 4:
46
+ return 2
47
+ case 6:
48
+ return 4
49
+ default:
50
+ throw new PngDecodeError(`unsupported color type ${colorType}`)
51
+ }
52
+ }
53
+
54
+ function parseHeader(data: Buffer): PngHeader {
55
+ if (data.length < 13) {
56
+ throw new PngDecodeError("invalid IHDR chunk length")
57
+ }
58
+ const colorType = data[9] ?? 0
59
+ return {
60
+ width: data.readUInt32BE(0),
61
+ height: data.readUInt32BE(4),
62
+ bitDepth: data[8] ?? 0,
63
+ colorType,
64
+ channels: channelsForColorType(colorType),
65
+ }
66
+ }
67
+
68
+ function paeth(a: number, b: number, c: number): number {
69
+ const p = a + b - c
70
+ const pa = Math.abs(p - a)
71
+ const pb = Math.abs(p - b)
72
+ const pc = Math.abs(p - c)
73
+ if (pa <= pb && pa <= pc) return a
74
+ if (pb <= pc) return b
75
+ return c
76
+ }
77
+
78
+ function unfilterRow(filterType: number, row: Buffer, prev: Buffer | null, bpp: number): Buffer {
79
+ const out = Buffer.alloc(row.length)
80
+ for (let i = 0; i < row.length; i++) {
81
+ const raw = row[i] ?? 0
82
+ const a = i >= bpp ? (out[i - bpp] ?? 0) : 0
83
+ const b = prev ? (prev[i] ?? 0) : 0
84
+ const c = i >= bpp && prev ? (prev[i - bpp] ?? 0) : 0
85
+ switch (filterType) {
86
+ case 0:
87
+ out[i] = raw
88
+ break
89
+ case 1:
90
+ out[i] = (raw + a) & 0xff
91
+ break
92
+ case 2:
93
+ out[i] = (raw + b) & 0xff
94
+ break
95
+ case 3:
96
+ out[i] = (raw + ((a + b) >> 1)) & 0xff
97
+ break
98
+ case 4:
99
+ out[i] = (raw + paeth(a, b, c)) & 0xff
100
+ break
101
+ default:
102
+ throw new PngDecodeError(`unsupported filter type ${filterType}`)
103
+ }
104
+ }
105
+ return out
106
+ }
107
+
108
+ function decodePixels(idat: Buffer, width: number, height: number, bpp: number): Buffer {
109
+ const inflated = inflateSync(idat)
110
+ const rowBytes = width * bpp
111
+ if (inflated.length < height * (rowBytes + 1)) {
112
+ throw new PngDecodeError("truncated image data")
113
+ }
114
+ const pixels = Buffer.alloc(width * height * bpp)
115
+ let prev: Buffer | null = null
116
+ for (let y = 0; y < height; y++) {
117
+ const rowStart = y * (rowBytes + 1)
118
+ const filterType = inflated[rowStart] ?? 0
119
+ const filtered = inflated.subarray(rowStart + 1, rowStart + 1 + rowBytes)
120
+ const row = unfilterRow(filterType, filtered, prev, bpp)
121
+ row.copy(pixels, y * rowBytes)
122
+ prev = row
123
+ }
124
+ return pixels
125
+ }
126
+
127
+ function normalizeToRgba(
128
+ pixels: Buffer,
129
+ pixelCount: number,
130
+ channels: number,
131
+ ): { readonly rgba: Uint8Array; readonly hasTransparent: boolean } {
132
+ const rgba = new Uint8Array(pixelCount * 4)
133
+ let hasTransparent = false
134
+ for (let i = 0; i < pixelCount; i++) {
135
+ const src = i * channels
136
+ let r = 0
137
+ let g = 0
138
+ let b = 0
139
+ let a = 255
140
+ switch (channels) {
141
+ case 1: {
142
+ const v = pixels[src] ?? 0
143
+ r = v
144
+ g = v
145
+ b = v
146
+ break
147
+ }
148
+ case 2: {
149
+ const v = pixels[src] ?? 0
150
+ r = v
151
+ g = v
152
+ b = v
153
+ a = pixels[src + 1] ?? 255
154
+ break
155
+ }
156
+ case 3: {
157
+ r = pixels[src] ?? 0
158
+ g = pixels[src + 1] ?? 0
159
+ b = pixels[src + 2] ?? 0
160
+ break
161
+ }
162
+ default: {
163
+ r = pixels[src] ?? 0
164
+ g = pixels[src + 1] ?? 0
165
+ b = pixels[src + 2] ?? 0
166
+ a = pixels[src + 3] ?? 255
167
+ }
168
+ }
169
+ const dst = i * 4
170
+ rgba[dst] = r
171
+ rgba[dst + 1] = g
172
+ rgba[dst + 2] = b
173
+ rgba[dst + 3] = a
174
+ if (a < 255) hasTransparent = true
175
+ }
176
+ return { rgba, hasTransparent }
177
+ }
178
+
179
+ export function decodePng(buffer: Buffer): DecodedImage {
180
+ if (buffer.length < 8 || !buffer.subarray(0, 8).equals(PNG_SIGNATURE)) {
181
+ throw new PngDecodeError("not a PNG file (bad signature)")
182
+ }
183
+ const chunks = readChunks(buffer)
184
+ const ihdr = chunks.find((chunk) => chunk.type === "IHDR")
185
+ if (ihdr === undefined) {
186
+ throw new PngDecodeError("missing IHDR chunk")
187
+ }
188
+ const header = parseHeader(ihdr.data)
189
+ if (header.bitDepth !== 8) {
190
+ throw new PngDecodeError(`unsupported bit depth ${header.bitDepth}`)
191
+ }
192
+ const idatChunks = chunks.filter((chunk) => chunk.type === "IDAT")
193
+ if (idatChunks.length === 0) {
194
+ throw new PngDecodeError("missing IDAT chunk")
195
+ }
196
+ const idat = Buffer.concat(idatChunks.map((chunk) => chunk.data))
197
+ const pixels = decodePixels(idat, header.width, header.height, header.channels)
198
+ const normalized = normalizeToRgba(pixels, header.width * header.height, header.channels)
199
+ return {
200
+ width: header.width,
201
+ height: header.height,
202
+ rgba: normalized.rgba,
203
+ hasAlphaChannel: header.colorType === 4 || header.colorType === 6,
204
+ hasTransparentPixels: normalized.hasTransparent,
205
+ }
206
+ }
@@ -0,0 +1,57 @@
1
+ import { Buffer } from "node:buffer"
2
+ import { deflateSync } from "node:zlib"
3
+
4
+ import { crc32, PNG_SIGNATURE } from "./png-crc"
5
+
6
+ const BIT_DEPTH_8 = 8
7
+ const COLOR_TYPE_RGBA = 6
8
+ const FILTER_NONE = 0
9
+ const RGBA_CHANNELS = 4
10
+
11
+ function pngChunk(type: string, data: Buffer): Buffer {
12
+ const typeBuffer = Buffer.from(type, "ascii")
13
+ const length = Buffer.alloc(4)
14
+ length.writeUInt32BE(data.length, 0)
15
+ const crcBuffer = Buffer.alloc(4)
16
+ crcBuffer.writeUInt32BE(crc32(Buffer.concat([typeBuffer, data])), 0)
17
+ return Buffer.concat([length, typeBuffer, data, crcBuffer])
18
+ }
19
+
20
+ export function encodeRgbaPng(width: number, height: number, rgba: Uint8Array): Buffer {
21
+ const rowBytes = width * RGBA_CHANNELS
22
+ const raw = Buffer.alloc(height * (rowBytes + 1))
23
+ for (let y = 0; y < height; y++) {
24
+ const rowStart = y * (rowBytes + 1)
25
+ raw[rowStart] = FILTER_NONE
26
+ for (let x = 0; x < rowBytes; x++) {
27
+ raw[rowStart + 1 + x] = rgba[y * rowBytes + x] ?? 0
28
+ }
29
+ }
30
+ const header = Buffer.alloc(13)
31
+ header.writeUInt32BE(width, 0)
32
+ header.writeUInt32BE(height, 4)
33
+ header[8] = BIT_DEPTH_8
34
+ header[9] = COLOR_TYPE_RGBA
35
+ return Buffer.concat([
36
+ PNG_SIGNATURE,
37
+ pngChunk("IHDR", header),
38
+ pngChunk("IDAT", deflateSync(raw)),
39
+ pngChunk("IEND", Buffer.alloc(0)),
40
+ ])
41
+ }
42
+
43
+ export function solidRgba(
44
+ width: number,
45
+ height: number,
46
+ color: readonly [number, number, number, number],
47
+ ): Uint8Array {
48
+ const rgba = new Uint8Array(width * height * RGBA_CHANNELS)
49
+ for (let pixel = 0; pixel < width * height; pixel++) {
50
+ const offset = pixel * RGBA_CHANNELS
51
+ rgba[offset] = color[0]
52
+ rgba[offset + 1] = color[1]
53
+ rgba[offset + 2] = color[2]
54
+ rgba[offset + 3] = color[3]
55
+ }
56
+ return rgba
57
+ }
@@ -0,0 +1,88 @@
1
+ import { hasAnsi, stripAnsi } from "./ansi"
2
+ import { charWidth, stringWidth } from "./east-asian-width"
3
+ import type { OverflowLine, TuiCheckResult } from "./types"
4
+
5
+ const BOX_DRAWING_START = 0x2500
6
+ const BOX_DRAWING_END = 0x257f
7
+ const MAX_WIDE_COLUMNS = 64
8
+
9
+ function splitLines(text: string): string[] {
10
+ const lines = text.split(/\r?\n/)
11
+ if (lines.length > 1 && lines[lines.length - 1] === "") lines.pop()
12
+ return lines
13
+ }
14
+
15
+ function isFrameLine(plain: string): boolean {
16
+ for (const char of plain) {
17
+ const codePoint = char.codePointAt(0)
18
+ if (codePoint !== undefined && codePoint >= BOX_DRAWING_START && codePoint <= BOX_DRAWING_END) {
19
+ return true
20
+ }
21
+ }
22
+ return false
23
+ }
24
+
25
+ function wideStartColumns(plain: string): number[] {
26
+ const columns: number[] = []
27
+ let column = 0
28
+ for (const char of plain) {
29
+ const codePoint = char.codePointAt(0)
30
+ if (codePoint === undefined) continue
31
+ const width = charWidth(codePoint)
32
+ if (width === 2) columns.push(column)
33
+ column += width
34
+ }
35
+ return columns
36
+ }
37
+
38
+ function summarize(
39
+ lineCount: number,
40
+ maxWidth: number,
41
+ expectedColumns: number,
42
+ overflowCount: number,
43
+ borderMisaligned: boolean,
44
+ containsAnsi: boolean,
45
+ ): string {
46
+ const parts = [`${lineCount} line(s)`, `max width ${maxWidth}/${expectedColumns}`]
47
+ if (overflowCount > 0) parts.push(`${overflowCount} overflow line(s)`)
48
+ if (borderMisaligned) parts.push("borders misaligned")
49
+ if (containsAnsi) parts.push("contains ANSI")
50
+ return `${parts.join("; ")}.`
51
+ }
52
+
53
+ export function checkTui(text: string, expectedColumns: number): TuiCheckResult {
54
+ const lines = splitLines(text)
55
+ const lineWidths: number[] = []
56
+ const overflowLines: OverflowLine[] = []
57
+ const wideColumns = new Set<number>()
58
+ const frameWidths = new Set<number>()
59
+
60
+ for (let index = 0; index < lines.length; index++) {
61
+ const plain = stripAnsi(lines[index] ?? "")
62
+ const width = stringWidth(plain)
63
+ lineWidths.push(width)
64
+ if (expectedColumns > 0 && width > expectedColumns) {
65
+ overflowLines.push({ line: index + 1, width })
66
+ }
67
+ if (isFrameLine(plain)) frameWidths.add(width)
68
+ for (const column of wideStartColumns(plain)) {
69
+ if (wideColumns.size < MAX_WIDE_COLUMNS) wideColumns.add(column)
70
+ }
71
+ }
72
+
73
+ const maxWidth = lineWidths.reduce((max, width) => (width > max ? width : max), 0)
74
+ const borderMisaligned = frameWidths.size > 1
75
+ const containsAnsi = hasAnsi(text)
76
+ return {
77
+ command: "tui-check",
78
+ expectedColumns,
79
+ lineCount: lines.length,
80
+ lineWidths,
81
+ maxWidth,
82
+ overflowLines,
83
+ borderMisaligned,
84
+ wideCharColumns: [...wideColumns].sort((a, b) => a - b),
85
+ hasAnsi: containsAnsi,
86
+ summary: summarize(lines.length, maxWidth, expectedColumns, overflowLines.length, borderMisaligned, containsAnsi),
87
+ }
88
+ }
@@ -0,0 +1,54 @@
1
+ export interface DecodedImage {
2
+ readonly width: number
3
+ readonly height: number
4
+ readonly rgba: Uint8Array
5
+ readonly hasAlphaChannel: boolean
6
+ readonly hasTransparentPixels: boolean
7
+ }
8
+
9
+ export interface Hotspot {
10
+ readonly gridX: number
11
+ readonly gridY: number
12
+ readonly x: number
13
+ readonly y: number
14
+ readonly width: number
15
+ readonly height: number
16
+ readonly diffRatio: number
17
+ }
18
+
19
+ export interface ImageDimensions {
20
+ readonly width: number
21
+ readonly height: number
22
+ }
23
+
24
+ export interface ImageDiffResult {
25
+ readonly command: "image-diff"
26
+ readonly dimensionsMatch: boolean
27
+ readonly reference: ImageDimensions
28
+ readonly actual: ImageDimensions
29
+ readonly totalPixels: number
30
+ readonly diffPixels: number
31
+ readonly diffRatio: number
32
+ readonly similarityScore: number
33
+ readonly alphaChannelIntact: boolean
34
+ readonly hotspots: readonly Hotspot[]
35
+ readonly summary: string
36
+ }
37
+
38
+ export interface OverflowLine {
39
+ readonly line: number
40
+ readonly width: number
41
+ }
42
+
43
+ export interface TuiCheckResult {
44
+ readonly command: "tui-check"
45
+ readonly expectedColumns: number
46
+ readonly lineCount: number
47
+ readonly lineWidths: readonly number[]
48
+ readonly maxWidth: number
49
+ readonly overflowLines: readonly OverflowLine[]
50
+ readonly borderMisaligned: boolean
51
+ readonly wideCharColumns: readonly number[]
52
+ readonly hasAnsi: boolean
53
+ readonly summary: string
54
+ }
@@ -0,0 +1,55 @@
1
+ import assert from "node:assert/strict";
2
+ import { readdir, readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import test from "node:test";
5
+
6
+ import { root } from "./aggregate-plugin-fixture.mjs";
7
+
8
+ test("#given bundled Codex agents #when components/ultrawork/agents directory is scanned #then planner support TOMLs are present and match expected schema keys", async () => {
9
+ const agentsDir = join(root, "components", "ultrawork", "agents");
10
+ const entries = (await readdir(agentsDir, { withFileTypes: true }))
11
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".toml"))
12
+ .map((entry) => entry.name)
13
+ .sort();
14
+
15
+ assert.deepEqual(entries, [
16
+ "codex-ultrawork-reviewer.toml",
17
+ "explorer.toml",
18
+ "librarian.toml",
19
+ "metis.toml",
20
+ "momus.toml",
21
+ "plan.toml",
22
+ ]);
23
+
24
+ for (const fileName of entries) {
25
+ const content = await readFile(join(agentsDir, fileName), "utf8");
26
+ assert.match(content, /^name\s*=\s*".+"$/m);
27
+ assert.match(content, /^description\s*=\s*".+"$/m);
28
+ assert.match(content, /^nickname_candidates\s*=\s*\[.+\]$/m);
29
+ assert.match(content, /^model\s*=\s*".+"$/m);
30
+ assert.match(content, /^model_reasoning_effort\s*=\s*".+"$/m);
31
+ assert.match(content, /^developer_instructions\s*=\s*"""/m);
32
+ }
33
+ });
34
+
35
+ test("#given planner agent prompt #when inspected #then generated artifacts stay under .omo", async () => {
36
+ const prompt = await readFile(join(root, "components", "ultrawork", "agents", "plan.toml"), "utf8");
37
+
38
+ assert.match(prompt, /\.omo\/plans\/<slug>\.md/);
39
+ assert.match(prompt, /\.omo\/evidence\/task-<N>-<slug>\.<ext>/);
40
+ assert.doesNotMatch(prompt, /(?<!\.omo\/)plans\/<slug>\.md/);
41
+ assert.doesNotMatch(prompt, /(?<!\.omo\/)evidence\/task-/);
42
+ });
43
+
44
+ test("#given reviewer agent prompt #when inspected #then default model uses bounded reasoning", async () => {
45
+ const prompt = await readFile(
46
+ join(root, "components", "ultrawork", "agents", "codex-ultrawork-reviewer.toml"),
47
+ "utf8",
48
+ );
49
+
50
+ assert.match(prompt, /^model\s*=\s*"gpt-5\.5"$/m);
51
+ assert.match(prompt, /^model_reasoning_effort\s*=\s*"high"$/m);
52
+ assert.doesNotMatch(prompt, /^model_reasoning_effort\s*=\s*"xhigh"$/m);
53
+ assert.doesNotMatch(prompt, /^model\s*=\s*"gpt-5\.2"$/m);
54
+ assert.match(prompt, /ChatGPT account/);
55
+ });
@@ -0,0 +1,38 @@
1
+ import assert from "node:assert/strict";
2
+ import { readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import test from "node:test";
5
+
6
+ import { readJson, root } from "./aggregate-plugin-fixture.mjs";
7
+
8
+ test("#given aggregate plugin build script #when inspected #then hook status and telemetry sync run before workspace builds", async () => {
9
+ // given
10
+ const packageText = await readFile(join(root, "package.json"), "utf8");
11
+ const packageJson = await readJson("package.json");
12
+ const telemetrySyncScript = await readFile(join(root, "..", "scripts", "sync-telemetry-component.mjs"), "utf8");
13
+
14
+ // when
15
+ const buildScript = packageJson.scripts.build;
16
+ const testScript = packageJson.scripts.test;
17
+
18
+ // then
19
+ assert.equal(
20
+ buildScript,
21
+ "node scripts/sync-hook-status-messages.mjs && node scripts/build-bundled-mcp-runtimes.mjs && node scripts/sync-skills.mjs && node ../scripts/sync-telemetry-component.mjs && node scripts/build-components.mjs",
22
+ );
23
+ assert.equal(testScript, "node --test test/*.test.mjs");
24
+ assert(packageJson.workspaces.includes("components/ultrawork"));
25
+ assert.match(telemetrySyncScript, /syncTelemetryComponent/);
26
+ assert.doesNotMatch(packageText, /\bpython3?\b|ultrawork-detector\.py/);
27
+ });
28
+
29
+ test("#given omo-codex package build script #when inspected #then delegates to the aggregate plugin package", async () => {
30
+ // given
31
+ const packageJson = JSON.parse(await readFile(join(root, "..", "package.json"), "utf8"));
32
+
33
+ // when
34
+ const buildPluginScript = packageJson.scripts["build:plugin"];
35
+
36
+ // then
37
+ assert.equal(buildPluginScript, "bun run --cwd plugin build");
38
+ });
@@ -0,0 +1,164 @@
1
+ import assert from "node:assert/strict";
2
+ import { readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import test from "node:test";
5
+
6
+ import {
7
+ collectCommandHooks,
8
+ exists,
9
+ hookLocation,
10
+ readComponentHookManifests,
11
+ readJson,
12
+ readPluginVersion,
13
+ root,
14
+ } from "./aggregate-plugin-fixture.mjs";
15
+
16
+ test("#given isolated components #when hooks are inspected #then commands stay inside component roots", async () => {
17
+ // given
18
+ const hooks = await readJson("hooks/hooks.json");
19
+ const text = JSON.stringify(hooks);
20
+
21
+ // when
22
+ const componentMarkers = [
23
+ "components/comment-checker/dist/cli.js",
24
+ "components/lsp/dist/cli.js",
25
+ "components/rules/dist/cli.js",
26
+ "components/start-work-continuation/dist/cli.js",
27
+ "components/telemetry/dist/cli.js",
28
+ "components/ulw-loop/dist/cli.js",
29
+ "components/ultrawork/dist/cli.js",
30
+ "scripts/auto-update.mjs",
31
+ ];
32
+
33
+ // then
34
+ for (const marker of componentMarkers) {
35
+ assert.match(text, new RegExp(marker.replaceAll("/", "\\/")));
36
+ }
37
+ assert.doesNotMatch(text, /codex-(comment-checker|lsp|rules|telemetry|ulw-loop|ultrawork)@/);
38
+ assert.equal(await exists("scripts/migrate-codex-config.mjs"), true);
39
+ });
40
+
41
+ test("#given aggregate PostCompact hooks #when hooks are inspected #then LSP diagnostics cache reset is registered", async () => {
42
+ // given
43
+ const hooks = await readJson("hooks/hooks.json");
44
+ const aggregateVersion = await readPluginVersion();
45
+
46
+ // when
47
+ const lspPostCompactHooks = collectCommandHooks(hooks, "hooks/hooks.json").filter(
48
+ (hook) =>
49
+ hook.eventName === "PostCompact" &&
50
+ hook.handler.command === 'node "${PLUGIN_ROOT}/components/lsp/dist/cli.js" hook post-compact',
51
+ );
52
+
53
+ // then
54
+ assert.equal(lspPostCompactHooks.length, 1);
55
+ assert.equal(lspPostCompactHooks[0]?.handler.statusMessage, `LazyCodex(${aggregateVersion}): Resetting LSP Diagnostics Cache`);
56
+ });
57
+
58
+ test("#given aggregate hook commands #when inspected #then every command exposes a Codex status message", async () => {
59
+ // given
60
+ const hooks = await readJson("hooks/hooks.json");
61
+
62
+ // when
63
+ const commandHooks = collectCommandHooks(hooks, "hooks/hooks.json");
64
+ const missingStatusMessages = commandHooks
65
+ .filter(({ handler }) => typeof handler.statusMessage !== "string" || handler.statusMessage.trim() === "")
66
+ .map(hookLocation);
67
+
68
+ // then
69
+ assert.deepEqual(missingStatusMessages, []);
70
+ });
71
+
72
+ test("#given aggregate hook commands #when inspected #then commands stay Node-based and platform-neutral", async () => {
73
+ // given
74
+ const hooks = await readJson("hooks/hooks.json");
75
+
76
+ // when
77
+ const commands = collectCommandHooks(hooks, "hooks/hooks.json").map(({ handler }) => handler.command);
78
+
79
+ // then
80
+ assert(!commands.some((command) => /\bpython3?\b/i.test(command)));
81
+ assert(commands.includes('node "${PLUGIN_ROOT}/components/ultrawork/dist/cli.js" hook user-prompt-submit'));
82
+ assert(commands.every((command) => command.startsWith("node ")));
83
+ assert(commands.every((command) => !command.includes("\\")));
84
+ });
85
+
86
+ test("#given component hook commands #when inspected #then standalone packages expose Codex status messages", async () => {
87
+ // given
88
+ const componentHooks = await readComponentHookManifests();
89
+
90
+ // when
91
+ const missingStatusMessages = componentHooks
92
+ .flatMap(({ source, hooks }) => collectCommandHooks(hooks, source))
93
+ .filter(({ handler }) => typeof handler.statusMessage !== "string" || handler.statusMessage.trim() === "")
94
+ .map(hookLocation);
95
+
96
+ // then
97
+ assert.deepEqual(missingStatusMessages, []);
98
+ });
99
+
100
+ test("#given hook status messages #when inspected #then labels describe OMO responsibilities instead of the hook runner", async () => {
101
+ // given
102
+ const aggregateHooks = await readJson("hooks/hooks.json");
103
+ const componentHooks = await readComponentHookManifests();
104
+
105
+ // when
106
+ const commandHooks = [
107
+ ...collectCommandHooks(aggregateHooks, "hooks/hooks.json"),
108
+ ...componentHooks.flatMap(({ source, hooks }) => collectCommandHooks(hooks, source)),
109
+ ];
110
+ const genericStatusMessages = commandHooks
111
+ .filter(({ handler }) => typeof handler.statusMessage !== "string" || /\bhook\b/i.test(handler.statusMessage))
112
+ .map(hookLocation);
113
+
114
+ // then
115
+ assert.deepEqual(genericStatusMessages, []);
116
+ });
117
+
118
+ test("#given aggregate OMO plugin is enabled #when hooks are inspected #then shell guidance and ulw-loop guard are registered", async () => {
119
+ // given
120
+ const hooks = await readJson("hooks/hooks.json");
121
+ const text = JSON.stringify(hooks);
122
+
123
+ // when
124
+ const preToolUseGroups = hooks.hooks.PreToolUse;
125
+
126
+ // then
127
+ assert.match(text, /components\/git-bash\/dist\/cli\.js/);
128
+ assert.match(text, /Recommending Git Bash Mcp/);
129
+ assert.match(text, /hook post-compact/);
130
+ assert.match(text, /Resetting Git Bash Mcp Reminder/);
131
+ assert.match(text, /components\/ulw-loop\/dist\/cli\.js/);
132
+ assert.match(text, /hook pre-tool-use/);
133
+ assert.deepEqual(preToolUseGroups.map((group) => group.matcher), ["^Bash$", "^create_goal$"]);
134
+ });
135
+
136
+ test("#given aggregate SessionStart hooks #when inspected #then LazyCodex auto-update is registered", async () => {
137
+ // given
138
+ const hooks = await readJson("hooks/hooks.json");
139
+ const text = JSON.stringify(hooks);
140
+
141
+ // when
142
+ const sessionStartCommands = collectCommandHooks(hooks, "hooks/hooks.json")
143
+ .filter(({ eventName }) => eventName === "SessionStart")
144
+ .map(({ handler }) => handler.command);
145
+ const autoUpdateGroup = hooks.hooks.SessionStart.find((group) => JSON.stringify(group).includes("scripts/auto-update.mjs"));
146
+
147
+ // then
148
+ assert.equal(autoUpdateGroup?.matcher, "^startup$");
149
+ assert.match(text, /scripts\/auto-update\.mjs/);
150
+ assert.match(text, /Checking Auto Update/);
151
+ assert(sessionStartCommands.some((command) => command.includes("scripts/auto-update.mjs")));
152
+ });
153
+
154
+ test("#given aggregate plugin packaging #when inspected #then hooks and compatibility sentinels stay Python-free", async () => {
155
+ // given
156
+ const hooksText = await readFile(join(root, "hooks/hooks.json"), "utf8");
157
+ const aggregateTestText = await readFile(join(root, "test/aggregate.test.mjs"), "utf8");
158
+
159
+ // when
160
+ const aggregateText = `${hooksText}\n${aggregateTestText}`;
161
+
162
+ // then
163
+ assert.doesNotMatch(aggregateText, /\bpython3?\b|ultrawork-detector\.py/);
164
+ });