oh-my-opencode 4.7.5 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (617) hide show
  1. package/.agents/command/get-unpublished-changes.md +35 -6
  2. package/.agents/command/omomomo.md +1 -1
  3. package/.agents/command/publish.md +13 -0
  4. package/.agents/command/security-research.md +0 -1
  5. package/.agents/skills/get-unpublished-changes/SKILL.md +21 -5
  6. package/.agents/skills/omomomo/SKILL.md +1 -2
  7. package/.agents/skills/opencode-qa/scripts/export-roundtrip.sh +57 -19
  8. package/.agents/skills/opencode-qa/scripts/lib/common.sh +19 -7
  9. package/.agents/skills/opencode-qa/scripts/sse-hook-probe.sh +3 -0
  10. package/.agents/skills/opencode-qa/scripts/tui-smoke.sh +1 -1
  11. package/.agents/skills/pre-publish-review/SKILL.md +24 -4
  12. package/.agents/skills/publish/SKILL.md +13 -0
  13. package/.agents/skills/remove-deadcode/SKILL.md +0 -1
  14. package/.agents/skills/security-research/SKILL.md +0 -1
  15. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +1 -1
  16. package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +2 -2
  17. package/.agents/skills/work-with-pr-workspace/iteration-1/review.html +1 -1
  18. package/.opencode/command/get-unpublished-changes.md +35 -6
  19. package/.opencode/command/omomomo.md +1 -1
  20. package/.opencode/command/publish.md +13 -0
  21. package/.opencode/command/security-research.md +0 -1
  22. package/.opencode/skills/pre-publish-review/SKILL.md +24 -4
  23. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +1 -1
  24. package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +2 -2
  25. package/.opencode/skills/work-with-pr-workspace/iteration-1/review.html +1 -1
  26. package/README.ja.md +7 -7
  27. package/README.ko.md +9 -7
  28. package/README.md +14 -8
  29. package/README.ru.md +5 -5
  30. package/README.zh-cn.md +7 -7
  31. package/bin/oh-my-opencode.js +24 -1
  32. package/bin/oh-my-opencode.test.ts +79 -20
  33. package/dist/agents/hephaestus/agent.d.ts +1 -1
  34. package/dist/agents/kimi-tool-loop-guard.d.ts +1 -0
  35. package/dist/agents/momus.d.ts +1 -1
  36. package/dist/agents/sisyphus-agent-config.d.ts +4 -0
  37. package/dist/agents/sisyphus-agent-factory.d.ts +6 -0
  38. package/dist/agents/sisyphus-dynamic-prompt-builder.d.ts +2 -0
  39. package/dist/agents/sisyphus-dynamic-prompt-execution.d.ts +2 -0
  40. package/dist/agents/sisyphus-dynamic-prompt-exploration.d.ts +2 -0
  41. package/dist/agents/sisyphus-dynamic-prompt-role.d.ts +2 -0
  42. package/dist/agents/sisyphus-dynamic-prompt-sections.d.ts +18 -0
  43. package/dist/agents/sisyphus-dynamic-prompt-style.d.ts +2 -0
  44. package/dist/agents/sisyphus-dynamic-prompt.d.ts +3 -0
  45. package/dist/agents/sisyphus-gemini-fallback-overrides.d.ts +1 -0
  46. package/dist/agents/sisyphus-junior/agent.d.ts +1 -1
  47. package/dist/agents/sisyphus-junior/index.d.ts +0 -1
  48. package/dist/agents/sisyphus.d.ts +1 -6
  49. package/dist/agents/types.d.ts +14 -3
  50. package/dist/cli/cli-program.d.ts +3 -0
  51. package/dist/cli/doctor/checks/codex.d.ts +11 -0
  52. package/dist/cli/doctor/checks/dependencies.d.ts +1 -0
  53. package/dist/cli/doctor/checks/index.d.ts +3 -0
  54. package/dist/cli/doctor/checks/system.d.ts +4 -0
  55. package/dist/cli/doctor/constants.d.ts +1 -0
  56. package/dist/cli/doctor/doctor-target.d.ts +2 -0
  57. package/dist/cli/doctor/index.d.ts +1 -0
  58. package/dist/cli/doctor/types.d.ts +26 -0
  59. package/dist/cli/index.js +4466 -2212
  60. package/dist/cli/install-codex/codex-cache-bins.d.ts +21 -0
  61. package/dist/cli/install-codex/codex-cache-fs.d.ts +3 -0
  62. package/dist/cli/install-codex/codex-cache-install.d.ts +13 -0
  63. package/dist/cli/install-codex/codex-cache-mcp-manifest.d.ts +2 -0
  64. package/dist/cli/install-codex/codex-cache-prune.d.ts +10 -0
  65. package/dist/cli/install-codex/codex-cache.d.ts +4 -32
  66. package/dist/cli/install-codex/codex-cached-marketplace-manifest.d.ts +6 -0
  67. package/dist/cli/install-codex/codex-config-agents.d.ts +3 -0
  68. package/dist/cli/install-codex/codex-config-features.d.ts +1 -0
  69. package/dist/cli/install-codex/codex-config-marketplaces.d.ts +6 -0
  70. package/dist/cli/install-codex/codex-config-plugins.d.ts +8 -0
  71. package/dist/cli/install-codex/codex-config-toml-sections.d.ts +9 -0
  72. package/dist/cli/install-codex/codex-multi-agent-v2-config.d.ts +11 -0
  73. package/dist/cli/install-codex/codex-process.d.ts +5 -0
  74. package/dist/cli/install-codex/index.d.ts +1 -1
  75. package/dist/cli/install-codex/lazycodex-version-stamp.d.ts +19 -0
  76. package/dist/cli/install-codex/link-cached-plugin-agents.d.ts +4 -0
  77. package/dist/cli/install-validators.d.ts +3 -0
  78. package/dist/cli/model-fallback-types.d.ts +3 -0
  79. package/dist/cli/run/event-handlers.d.ts +4 -11
  80. package/dist/cli/run/event-message-handlers.d.ts +5 -0
  81. package/dist/cli/run/event-session-handlers.d.ts +5 -0
  82. package/dist/cli/run/event-session-ids.d.ts +24 -0
  83. package/dist/cli/run/event-think-block.d.ts +3 -0
  84. package/dist/cli/run/event-toast-handlers.d.ts +3 -0
  85. package/dist/cli/run/event-tool-handlers.d.ts +4 -0
  86. package/dist/cli/run/event-tool-output.d.ts +2 -0
  87. package/dist/cli/run/on-complete-hook.d.ts +8 -1
  88. package/dist/cli/run/opencode-binary-resolver.d.ts +2 -1
  89. package/dist/cli/run/runnable-agent-resolver.d.ts +11 -0
  90. package/dist/cli/runtime-commands.d.ts +2 -0
  91. package/dist/cli/sparkshell-appserver-websocket.d.ts +4 -0
  92. package/dist/cli/sparkshell-appserver.d.ts +16 -0
  93. package/dist/cli/sparkshell-parse.d.ts +21 -0
  94. package/dist/cli/sparkshell.d.ts +26 -0
  95. package/dist/cli/types.d.ts +9 -0
  96. package/dist/config/schema/claude-code.d.ts +1 -0
  97. package/dist/config/schema/hooks.d.ts +1 -0
  98. package/dist/config/schema/oh-my-opencode-config.d.ts +1 -0
  99. package/dist/create-hooks.d.ts +1 -0
  100. package/dist/features/background-agent/concurrency.d.ts +6 -1
  101. package/dist/features/background-agent/constants.d.ts +1 -0
  102. package/dist/features/background-agent/empty-assistant-turn.d.ts +7 -0
  103. package/dist/features/background-agent/manager.d.ts +12 -0
  104. package/dist/features/background-agent/message-updated-parent-wake-output.d.ts +1 -0
  105. package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
  106. package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +21 -0
  107. package/dist/features/background-agent/parent-wake-flush-runner.d.ts +24 -0
  108. package/dist/features/background-agent/parent-wake-history-state.d.ts +5 -0
  109. package/dist/features/background-agent/parent-wake-notifier-types.d.ts +50 -0
  110. package/dist/features/background-agent/parent-wake-notifier.d.ts +8 -50
  111. package/dist/features/background-agent/parent-wake-pending-queue.d.ts +22 -0
  112. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +19 -0
  113. package/dist/features/background-agent/parent-wake-session-history.d.ts +73 -0
  114. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +35 -0
  115. package/dist/features/background-agent/parent-wake-timer-handle.d.ts +5 -0
  116. package/dist/features/background-agent/parent-wake-window-recovery.d.ts +13 -0
  117. package/dist/features/background-agent/process-cleanup.d.ts +2 -0
  118. package/dist/features/background-agent/process-cleanup.test-helpers.d.ts +3 -0
  119. package/dist/features/background-agent/session-stream-activity.d.ts +6 -0
  120. package/dist/features/background-agent/spawner/fallback-agent.d.ts +5 -0
  121. package/dist/features/background-agent/spawner/task-prompt-body.d.ts +34 -0
  122. package/dist/features/background-agent/spawner/task-record.d.ts +2 -0
  123. package/dist/features/background-agent/spawner.d.ts +2 -5
  124. package/dist/features/builtin-commands/templates/refactor-sections/codemap-and-tests.d.ts +1 -0
  125. package/dist/features/builtin-commands/templates/refactor-sections/intro-and-analysis.d.ts +1 -0
  126. package/dist/features/builtin-commands/templates/refactor-sections/plan-and-execution.d.ts +1 -0
  127. package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -0
  128. package/dist/features/builtin-commands/templates/refactor-sections/verification-and-tooling.d.ts +1 -0
  129. package/dist/features/builtin-commands/templates/refactor.d.ts +2 -2
  130. package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +2 -0
  131. package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +2 -0
  132. package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +1 -0
  133. package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +1 -0
  134. package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +1 -0
  135. package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +1 -1
  136. package/dist/features/builtin-skills/skills/index.d.ts +1 -0
  137. package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +2 -0
  138. package/dist/features/builtin-skills/skills/playwright.d.ts +2 -3
  139. package/dist/features/builtin-skills/skills/visual-qa.d.ts +2 -0
  140. package/dist/features/claude-code-agent-loader/agent-definitions-loader.d.ts +2 -2
  141. package/dist/features/claude-code-agent-loader/claude-model-mapper.d.ts +1 -1
  142. package/dist/features/claude-code-agent-loader/loader.d.ts +2 -2
  143. package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +1 -1
  144. package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +2 -0
  145. package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +3 -0
  146. package/dist/features/claude-code-plugin-loader/discovery.d.ts +3 -4
  147. package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +1 -0
  148. package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +3 -0
  149. package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +2 -0
  150. package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +1 -0
  151. package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +4 -0
  152. package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +3 -0
  153. package/dist/features/claude-code-plugin-loader/types.d.ts +1 -0
  154. package/dist/features/hook-message-injector/context-resolver.d.ts +6 -0
  155. package/dist/features/hook-message-injector/id-generation.d.ts +2 -0
  156. package/dist/features/hook-message-injector/index.d.ts +1 -1
  157. package/dist/features/hook-message-injector/injector.d.ts +7 -69
  158. package/dist/features/hook-message-injector/json-message-lookup.d.ts +3 -0
  159. package/dist/features/hook-message-injector/message-directory.d.ts +1 -0
  160. package/dist/features/hook-message-injector/message-injection.d.ts +2 -0
  161. package/dist/features/hook-message-injector/sdk-message-context.d.ts +6 -0
  162. package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +28 -0
  163. package/dist/features/hook-message-injector/types.d.ts +9 -0
  164. package/dist/features/mcp-oauth/callback-server.d.ts +10 -2
  165. package/dist/features/opencode-runtime-skills/source-server.d.ts +1 -0
  166. package/dist/features/skill-mcp-manager/http-client.d.ts +2 -0
  167. package/dist/features/team-mode/deps.d.ts +8 -1
  168. package/dist/features/team-mode/team-layout-tmux/layout.d.ts +2 -0
  169. package/dist/features/team-mode/team-mailbox/send.d.ts +3 -0
  170. package/dist/features/team-mode/team-registry/paths.d.ts +17 -2
  171. package/dist/features/team-mode/team-runtime/shutdown.d.ts +1 -1
  172. package/dist/features/team-mode/team-runtime/unresolved-team-members.d.ts +3 -0
  173. package/dist/features/team-mode/team-state-store/active-resume.d.ts +5 -0
  174. package/dist/features/team-mode/team-state-store/creating-resume.d.ts +4 -0
  175. package/dist/features/team-mode/team-state-store/deleting-resume.d.ts +4 -0
  176. package/dist/features/team-mode/team-state-store/error-normalization.d.ts +2 -0
  177. package/dist/features/team-mode/team-state-store/reservation-reconciliation.d.ts +4 -0
  178. package/dist/features/team-mode/team-state-store/resume-report.d.ts +7 -0
  179. package/dist/features/team-mode/team-state-store/resume.d.ts +2 -7
  180. package/dist/features/team-mode/team-state-store/runtime-cleanup.d.ts +4 -0
  181. package/dist/features/team-mode/team-state-store/session-liveness.d.ts +9 -0
  182. package/dist/features/team-mode/team-state-store/worker-resume-status.d.ts +9 -0
  183. package/dist/features/team-mode/tools/lifecycle-create-tool.d.ts +17 -0
  184. package/dist/features/team-mode/tools/lifecycle-inline-spec.d.ts +19 -0
  185. package/dist/features/team-mode/tools/lifecycle-participant.d.ts +25 -0
  186. package/dist/features/team-mode/tools/lifecycle-shutdown-tools.d.ts +18 -0
  187. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +3 -3
  188. package/dist/features/team-mode/tools/lifecycle.d.ts +3 -37
  189. package/dist/features/team-mode/tools/messaging-live-delivery-client.d.ts +25 -0
  190. package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +19 -0
  191. package/dist/features/team-mode/tools/messaging-live-delivery-reservation.d.ts +10 -0
  192. package/dist/features/team-mode/tools/messaging-live-delivery-state.d.ts +5 -0
  193. package/dist/features/team-mode/tools/messaging-live-delivery.d.ts +6 -0
  194. package/dist/features/team-mode/tools/messaging-runtime.d.ts +17 -0
  195. package/dist/features/team-mode/tools/messaging.d.ts +4 -29
  196. package/dist/features/tmux-subagent/manager.d.ts +20 -1
  197. package/dist/features/tmux-subagent/session-created-handler.d.ts +4 -0
  198. package/dist/features/tmux-subagent/types.d.ts +1 -0
  199. package/dist/hooks/anthropic-context-window-limit-recovery/message-builder.d.ts +1 -1
  200. package/dist/hooks/atlas/idle-completion-nudge.d.ts +10 -0
  201. package/dist/hooks/atlas/idle-constants.d.ts +4 -0
  202. package/dist/hooks/atlas/idle-continuation.d.ts +23 -0
  203. package/dist/hooks/atlas/idle-session-eligibility.d.ts +8 -0
  204. package/dist/hooks/atlas/tool-execute-after-direct-work.d.ts +9 -0
  205. package/dist/hooks/atlas/tool-execute-after-plan-tasks.d.ts +3 -0
  206. package/dist/hooks/atlas/tool-execute-after-subagent-completion.d.ts +14 -0
  207. package/dist/hooks/auto-update-checker/hook/background-update-check.d.ts +6 -0
  208. package/dist/hooks/auto-update-checker/hook/ignore-toast-error.d.ts +1 -0
  209. package/dist/hooks/hephaestus-agents-md-injector/hook.d.ts +37 -0
  210. package/dist/hooks/hephaestus-agents-md-injector/index.d.ts +1 -0
  211. package/dist/hooks/index.d.ts +1 -0
  212. package/dist/hooks/json-error-recovery/hook.d.ts +1 -1
  213. package/dist/hooks/ralph-loop/command-arguments.d.ts +1 -0
  214. package/dist/hooks/ralph-loop/event-handler-activity.d.ts +10 -0
  215. package/dist/hooks/ralph-loop/event-handler-completion.d.ts +9 -0
  216. package/dist/hooks/ralph-loop/event-handler-continuation.d.ts +16 -0
  217. package/dist/hooks/ralph-loop/event-handler-feedback.d.ts +16 -0
  218. package/dist/hooks/ralph-loop/event-handler-idle.d.ts +15 -0
  219. package/dist/hooks/ralph-loop/event-handler-impl.d.ts +10 -0
  220. package/dist/hooks/ralph-loop/event-handler-runtime-error.d.ts +4 -0
  221. package/dist/hooks/ralph-loop/event-handler-types.d.ts +20 -0
  222. package/dist/hooks/ralph-loop/loop-state-controller.d.ts +1 -0
  223. package/dist/hooks/ralph-loop/ralph-loop-event-handler.d.ts +4 -24
  224. package/dist/hooks/ralph-loop/ralph-loop-hook.d.ts +1 -0
  225. package/dist/hooks/read-image-resizer/png-chunks.d.ts +6 -0
  226. package/dist/hooks/read-image-resizer/png-constants.d.ts +1 -0
  227. package/dist/hooks/read-image-resizer/png-crc.d.ts +1 -0
  228. package/dist/hooks/read-image-resizer/png-decoder.d.ts +1 -0
  229. package/dist/hooks/read-image-resizer/png-encoder.d.ts +1 -0
  230. package/dist/hooks/read-image-resizer/png-filters.d.ts +1 -0
  231. package/dist/hooks/read-image-resizer/png-ihdr.d.ts +11 -0
  232. package/dist/hooks/read-image-resizer/png-nearest-neighbor.d.ts +1 -0
  233. package/dist/hooks/rules-injector/injection-output.d.ts +2 -0
  234. package/dist/hooks/rules-injector/injection-processor.d.ts +22 -0
  235. package/dist/hooks/rules-injector/injection-types.d.ts +43 -0
  236. package/dist/hooks/rules-injector/injector.d.ts +3 -47
  237. package/dist/hooks/rules-injector/match-decision-cache.d.ts +4 -0
  238. package/dist/hooks/rules-injector/parsed-rule-cache.d.ts +11 -0
  239. package/dist/hooks/rules-injector/path-resolution.d.ts +1 -0
  240. package/dist/hooks/rules-injector/rule-match-reason.d.ts +12 -0
  241. package/dist/hooks/rules-injector/transcript-hydration.d.ts +13 -2
  242. package/dist/hooks/runtime-fallback/auto-retry-abort.d.ts +2 -0
  243. package/dist/hooks/runtime-fallback/auto-retry-agent-context.d.ts +2 -0
  244. package/dist/hooks/runtime-fallback/auto-retry-cleanup.d.ts +2 -0
  245. package/dist/hooks/runtime-fallback/auto-retry-dispatch.d.ts +2 -0
  246. package/dist/hooks/runtime-fallback/auto-retry-metadata.d.ts +9 -0
  247. package/dist/hooks/runtime-fallback/auto-retry-timeout.d.ts +5 -0
  248. package/dist/hooks/runtime-fallback/fallback-bootstrap-model.d.ts +1 -1
  249. package/dist/hooks/runtime-fallback/fallback-state.d.ts +4 -1
  250. package/dist/hooks/runtime-fallback/normalize-model.d.ts +12 -0
  251. package/dist/hooks/session-notification-linux.d.ts +3 -0
  252. package/dist/hooks/session-notification-log.d.ts +2 -0
  253. package/dist/hooks/session-notification-macos.d.ts +3 -0
  254. package/dist/hooks/session-notification-platform.d.ts +3 -0
  255. package/dist/hooks/session-notification-runner.d.ts +9 -0
  256. package/dist/hooks/session-notification-send.d.ts +3 -0
  257. package/dist/hooks/session-notification-sender.d.ts +5 -6
  258. package/dist/hooks/session-notification-sound.d.ts +3 -0
  259. package/dist/hooks/session-notification-windows.d.ts +3 -0
  260. package/dist/hooks/session-recovery/error-recovery.d.ts +4 -0
  261. package/dist/hooks/session-recovery/hook-types.d.ts +22 -0
  262. package/dist/hooks/session-recovery/hook.d.ts +2 -19
  263. package/dist/hooks/session-recovery/interrupted-tool-results.d.ts +3 -0
  264. package/dist/hooks/session-recovery/message-state.d.ts +4 -0
  265. package/dist/hooks/session-recovery/storage/thinking-strip.d.ts +7 -1
  266. package/dist/hooks/start-work/context-info-builder.d.ts +9 -9
  267. package/dist/hooks/start-work/context-info-formatters.d.ts +21 -0
  268. package/dist/hooks/start-work/explicit-plan-context.d.ts +9 -0
  269. package/dist/hooks/start-work/plan-discovery-context.d.ts +25 -0
  270. package/dist/hooks/start-work/plan-selection.d.ts +4 -0
  271. package/dist/hooks/start-work/work-initializer.d.ts +17 -0
  272. package/dist/hooks/tool-pair-validator/hook.d.ts +1 -37
  273. package/dist/hooks/tool-pair-validator/message-transform.d.ts +2 -0
  274. package/dist/hooks/tool-pair-validator/tool-part-ids.d.ts +6 -0
  275. package/dist/hooks/tool-pair-validator/tool-result-repair.d.ts +4 -0
  276. package/dist/hooks/tool-pair-validator/types.d.ts +36 -0
  277. package/dist/index.js +12708 -9988
  278. package/dist/oh-my-opencode.schema.json +4 -0
  279. package/dist/openclaw/reply-listener-poll-loop.d.ts +3 -0
  280. package/dist/openclaw/reply-listener-signature.d.ts +2 -0
  281. package/dist/openclaw/reply-listener-sleep.d.ts +1 -0
  282. package/dist/openclaw/reply-listener-start.d.ts +9 -0
  283. package/dist/openclaw/reply-listener-status.d.ts +4 -0
  284. package/dist/openclaw/reply-listener-stop.d.ts +7 -0
  285. package/dist/openclaw/reply-listener.d.ts +5 -18
  286. package/dist/openclaw/session-registry-lock.d.ts +2 -0
  287. package/dist/openclaw/session-registry-paths.d.ts +9 -0
  288. package/dist/openclaw/session-registry-storage.d.ts +4 -0
  289. package/dist/openclaw/session-registry-types.d.ts +11 -0
  290. package/dist/openclaw/session-registry.d.ts +2 -11
  291. package/dist/plugin/chat-message/loop-commands.d.ts +9 -0
  292. package/dist/plugin/chat-message/model-cache-warning.d.ts +12 -0
  293. package/dist/plugin/chat-message/prompt-text.d.ts +2 -0
  294. package/dist/plugin/chat-message/session-model.d.ts +4 -0
  295. package/dist/plugin/chat-message/start-work-message.d.ts +5 -0
  296. package/dist/plugin/chat-message/types.d.ts +67 -0
  297. package/dist/plugin/chat-message.d.ts +3 -24
  298. package/dist/plugin/event-error-utils.d.ts +14 -0
  299. package/dist/plugin/event-hook-dispatcher.d.ts +5 -0
  300. package/dist/plugin/event-model-fallback-state.d.ts +30 -0
  301. package/dist/plugin/event-model-fallback.d.ts +39 -0
  302. package/dist/plugin/event-session-lifecycle.d.ts +49 -0
  303. package/dist/plugin/event-session-recovery.d.ts +9 -0
  304. package/dist/plugin/event-team-handlers.d.ts +13 -0
  305. package/dist/plugin/event-types.d.ts +78 -0
  306. package/dist/plugin/event.d.ts +3 -12
  307. package/dist/plugin/hooks/create-core-hooks.d.ts +1 -0
  308. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
  309. package/dist/plugin/hooks/model-fallback-title-updater.d.ts +8 -0
  310. package/dist/plugin/session-compacting.d.ts +4 -1
  311. package/dist/plugin/system-transform.d.ts +1 -1
  312. package/dist/plugin/tool-execute-after.d.ts +2 -0
  313. package/dist/plugin/tool-registry-core-tools.d.ts +15 -0
  314. package/dist/plugin/tool-registry-factories.d.ts +36 -0
  315. package/dist/plugin/tool-registry-gated-tools.d.ts +16 -0
  316. package/dist/plugin/tool-registry-team-tools.d.ts +14 -0
  317. package/dist/plugin/tool-registry-trimming.d.ts +2 -0
  318. package/dist/plugin/tool-registry.d.ts +3 -38
  319. package/dist/plugin/ultrawork-db-model-override.d.ts +1 -1
  320. package/dist/plugin-config/agent-order-warnings.d.ts +1 -0
  321. package/dist/plugin-config/config-merger.d.ts +2 -0
  322. package/dist/plugin-config/layered-config-loader.d.ts +2 -0
  323. package/dist/plugin-config/single-config-loader.d.ts +4 -0
  324. package/dist/plugin-config.d.ts +3 -5
  325. package/dist/plugin-handlers/agent-config-assembly.d.ts +19 -0
  326. package/dist/plugin-handlers/agent-config-finalizer.d.ts +4 -0
  327. package/dist/plugin-handlers/agent-config-handler.d.ts +2 -11
  328. package/dist/plugin-handlers/agent-config-types.d.ts +30 -0
  329. package/dist/plugin-handlers/agent-skill-discovery.d.ts +3 -0
  330. package/dist/plugin-handlers/agent-source-loader.d.ts +2 -0
  331. package/dist/plugin-handlers/hook-config-handler.d.ts +0 -3
  332. package/dist/shared/context-window-usage.d.ts +7 -0
  333. package/dist/shared/dynamic-truncator-types.d.ts +17 -0
  334. package/dist/shared/dynamic-truncator.d.ts +8 -23
  335. package/dist/shared/migration/migrations-sidecar.d.ts +2 -2
  336. package/dist/shared/migration/model-versions.d.ts +7 -4
  337. package/dist/shared/model-availability.d.ts +1 -1
  338. package/dist/shared/opencode-version.d.ts +2 -2
  339. package/dist/shared/sparkshell-awareness.d.ts +5 -0
  340. package/dist/shared/spawn-with-windows-hide.d.ts +2 -0
  341. package/dist/shared/token-limit-truncator.d.ts +2 -0
  342. package/dist/testing/module-mock-lifecycle.d.ts +8 -0
  343. package/dist/tools/delegate-task/openai-categories.d.ts +0 -1
  344. package/dist/tools/delegate-task/subagent-agent-match.d.ts +3 -0
  345. package/dist/tools/delegate-task/subagent-model-resolution.d.ts +4 -0
  346. package/dist/tools/delegate-task/subagent-request-preflight.d.ts +3 -0
  347. package/dist/tools/delegate-task/subagent-resolution-types.d.ts +32 -0
  348. package/dist/tools/delegate-task/subagent-resolver.d.ts +3 -12
  349. package/dist/tools/delegate-task/sync-completion-message.d.ts +20 -0
  350. package/dist/tools/delegate-task/sync-poll-error-recovery.d.ts +1 -0
  351. package/dist/tools/delegate-task/sync-session-lifecycle.d.ts +12 -0
  352. package/dist/tools/delegate-task/sync-session-poller.d.ts +2 -0
  353. package/dist/tools/delegate-task/sync-spawn-reservation.d.ts +10 -0
  354. package/dist/tools/delegate-task/sync-task-metadata.d.ts +11 -0
  355. package/dist/tools/delegate-task/sync-task-runner.d.ts +30 -0
  356. package/dist/tools/delegate-task/sync-task.d.ts +2 -1
  357. package/dist/tools/hashline-edit/formatter-trigger.d.ts +2 -2
  358. package/package.json +15 -14
  359. package/packages/git-bash-mcp/dist/cli.js +29 -12
  360. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.d.ts +1 -1
  361. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +1 -1
  362. package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +95 -30
  363. package/packages/lsp-tools-mcp/dist/lsp/server-installation.d.ts +1 -2
  364. package/packages/lsp-tools-mcp/dist/lsp/server-installation.js +1 -11
  365. package/packages/lsp-tools-mcp/dist/lsp/transport.d.ts +1 -0
  366. package/packages/lsp-tools-mcp/dist/lsp/transport.js +5 -10
  367. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.d.ts +4 -1
  368. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +84 -23
  369. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +2 -0
  370. package/packages/lsp-tools-mcp/dist/missing-dependency-result.js +14 -0
  371. package/packages/lsp-tools-mcp/dist/tools.js +64 -80
  372. package/packages/lsp-tools-mcp/package.json +4 -4
  373. package/packages/omo-codex/lazycodex-repository/.github/workflows/pr-source-guidance.yml +36 -0
  374. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  375. package/packages/omo-codex/plugin/README.md +3 -1
  376. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +188 -0
  377. package/packages/omo-codex/plugin/components/comment-checker/src/core-values.ts +1 -0
  378. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +15 -361
  379. package/packages/omo-codex/plugin/components/comment-checker/src/hook-input.ts +19 -0
  380. package/packages/omo-codex/plugin/components/comment-checker/src/record.ts +11 -0
  381. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +102 -0
  382. package/packages/omo-codex/plugin/components/comment-checker/src/types.ts +51 -0
  383. package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook.test.ts +145 -0
  384. package/packages/omo-codex/plugin/components/comment-checker/test/core.test.ts +200 -0
  385. package/packages/omo-codex/plugin/components/lsp/CHANGELOG.md +2 -2
  386. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +11 -5
  387. package/packages/omo-codex/plugin/components/rules/src/hook-output.ts +11 -1
  388. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +0 -1
  389. package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +1 -4
  390. package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-cache.ts +87 -0
  391. package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-loader.ts +94 -0
  392. package/packages/omo-codex/plugin/components/rules/src/rules/engine-loader.ts +84 -0
  393. package/packages/omo-codex/plugin/components/rules/src/rules/engine-paths.ts +103 -0
  394. package/packages/omo-codex/plugin/components/rules/src/rules/engine-static-loader.ts +43 -0
  395. package/packages/omo-codex/plugin/components/rules/src/rules/engine-types.ts +45 -0
  396. package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -419
  397. package/packages/omo-codex/plugin/components/rules/src/rules/formatter.ts +39 -13
  398. package/packages/omo-codex/plugin/components/rules/src/rules/parser-frontmatter.ts +39 -0
  399. package/packages/omo-codex/plugin/components/rules/src/rules/parser-yaml.ts +271 -0
  400. package/packages/omo-codex/plugin/components/rules/src/rules/parser.ts +3 -294
  401. package/packages/omo-codex/plugin/components/rules/src/rules/truncator.ts +17 -0
  402. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +57 -0
  403. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +13 -2
  404. package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +17 -0
  405. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +2 -1
  406. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +26 -11
  407. package/packages/omo-codex/plugin/components/rules/test/codex-hook-context-pressure.test.ts +104 -138
  408. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +5 -2
  409. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +12 -5
  410. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +10 -4
  411. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +65 -3
  412. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +67 -2
  413. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +16 -0
  414. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +153 -0
  415. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +12 -0
  416. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +236 -0
  417. package/packages/omo-codex/plugin/components/rules/test/tool-paths.test.ts +28 -50
  418. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +6 -3
  419. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +13 -6
  420. package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +21 -0
  421. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +64 -2
  422. package/packages/omo-codex/plugin/components/telemetry/README.md +11 -1
  423. package/packages/omo-codex/plugin/components/telemetry/biome.json +12 -0
  424. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +30 -3
  425. package/packages/omo-codex/plugin/components/telemetry/src/diagnostics.ts +154 -0
  426. package/packages/omo-codex/plugin/components/telemetry/src/posthog-activity-state.ts +18 -2
  427. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +36 -4
  428. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook-diagnostics.test.ts +115 -0
  429. package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +16 -25
  430. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +119 -0
  431. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +1 -1
  432. package/packages/omo-codex/plugin/components/ultrawork/README.md +5 -5
  433. package/packages/omo-codex/plugin/components/ultrawork/agents/codex-ultrawork-reviewer.toml +2 -1
  434. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -0
  435. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +0 -1
  436. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +0 -1
  437. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -2
  438. package/packages/omo-codex/plugin/components/ultrawork/directive.md +97 -32
  439. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +65 -0
  440. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/agents/openai.yaml +7 -0
  441. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +131 -0
  442. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +38 -10
  443. package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +18 -0
  444. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +47 -0
  445. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  446. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +12 -8
  447. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +28 -21
  448. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +2 -3
  449. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +7 -7
  450. package/packages/omo-codex/plugin/components/ulw-loop/src/command-types.ts +36 -0
  451. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +64 -0
  452. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +98 -0
  453. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +17 -2
  454. package/packages/omo-codex/plugin/components/ulw-loop/src/runtime.ts +22 -0
  455. package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +69 -0
  456. package/packages/omo-codex/plugin/components/ulw-loop/src/types.ts +5 -277
  457. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +35 -13
  458. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +52 -0
  459. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering.test.ts +67 -111
  460. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
  461. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +31 -2
  462. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +46 -9
  463. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +20 -29
  464. package/packages/omo-codex/plugin/model-catalog.json +5 -11
  465. package/packages/omo-codex/plugin/package-lock.json +1 -1
  466. package/packages/omo-codex/plugin/scripts/auto-update-state.mjs +78 -0
  467. package/packages/omo-codex/plugin/scripts/auto-update.mjs +166 -76
  468. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +71 -0
  469. package/packages/omo-codex/plugin/scripts/migrate-codex-config/config-paths.mjs +44 -0
  470. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +40 -0
  471. package/packages/omo-codex/plugin/scripts/migrate-codex-config/root-settings.mjs +74 -0
  472. package/packages/omo-codex/plugin/scripts/migrate-codex-config/state.mjs +29 -0
  473. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +33 -204
  474. package/packages/omo-codex/plugin/scripts/spawn-command.mjs +11 -0
  475. package/packages/omo-codex/plugin/scripts/sync-hook-status-messages.mjs +23 -9
  476. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +131 -28
  477. package/packages/omo-codex/plugin/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
  478. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +100 -0
  479. package/packages/omo-codex/plugin/skills/git-master/agents/openai.yaml +13 -0
  480. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -7
  481. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
  482. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
  483. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
  484. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +119 -14
  485. package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +4 -2
  486. package/packages/omo-codex/plugin/skills/programming/references/go/concurrency.md +2 -2
  487. package/packages/omo-codex/plugin/skills/programming/references/python/async-anyio.md +6 -6
  488. package/packages/omo-codex/plugin/skills/programming/references/python/pydantic-ai.md +12 -12
  489. package/packages/omo-codex/plugin/skills/programming/references/typescript/backend-hono.md +7 -7
  490. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +13 -11
  491. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -8
  492. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +68 -33
  493. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +86 -22
  494. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +770 -0
  495. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +12 -8
  496. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +28 -21
  497. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +45 -379
  498. package/packages/omo-codex/plugin/skills/ulw-plan/agents/openai.yaml +7 -0
  499. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +131 -0
  500. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +237 -0
  501. package/packages/omo-codex/plugin/skills/visual-qa/scripts/ansi.ts +17 -0
  502. package/packages/omo-codex/plugin/skills/visual-qa/scripts/cli.ts +82 -0
  503. package/packages/omo-codex/plugin/skills/visual-qa/scripts/east-asian-width.ts +72 -0
  504. package/packages/omo-codex/plugin/skills/visual-qa/scripts/image-diff.ts +109 -0
  505. package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-crc.ts +27 -0
  506. package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-decode.ts +206 -0
  507. package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-synth.ts +57 -0
  508. package/packages/omo-codex/plugin/skills/visual-qa/scripts/tui-grid.ts +88 -0
  509. package/packages/omo-codex/plugin/skills/visual-qa/scripts/types.ts +54 -0
  510. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +55 -0
  511. package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +38 -0
  512. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +164 -0
  513. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +73 -0
  514. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +69 -0
  515. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +53 -0
  516. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +83 -0
  517. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +67 -0
  518. package/packages/omo-codex/plugin/test/aggregate.test.mjs +2 -514
  519. package/packages/omo-codex/plugin/test/auto-update-state-persistence.test.mjs +36 -0
  520. package/packages/omo-codex/plugin/test/auto-update.test.mjs +191 -29
  521. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +1 -1
  522. package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +29 -0
  523. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +23 -10
  524. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +81 -0
  525. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +91 -0
  526. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +244 -9
  527. package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +0 -19
  528. package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +107 -0
  529. package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +82 -7
  530. package/packages/omo-codex/plugin/test/sync-hook-status-messages.test.mjs +58 -6
  531. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +152 -0
  532. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +158 -50
  533. package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +43 -0
  534. package/packages/omo-codex/scripts/install/agent-source-roots.mjs +13 -0
  535. package/packages/omo-codex/scripts/install/agents.mjs +84 -14
  536. package/packages/omo-codex/scripts/install/bin-links.mjs +239 -0
  537. package/packages/omo-codex/scripts/install/cache.mjs +152 -108
  538. package/packages/omo-codex/scripts/install/cached-marketplace-manifest.mjs +21 -0
  539. package/packages/omo-codex/scripts/install/cli-args.mjs +39 -2
  540. package/packages/omo-codex/scripts/install/config.mjs +9 -5
  541. package/packages/omo-codex/scripts/install/lazycodex-version-stamp.mjs +102 -0
  542. package/packages/omo-codex/scripts/install/legacy-bins.mjs +9 -1
  543. package/packages/omo-codex/scripts/install/model-catalog.mjs +9 -1
  544. package/packages/omo-codex/scripts/install/multi-agent-v2-config.mjs +12 -10
  545. package/packages/omo-codex/scripts/install/process.mjs +3 -1
  546. package/packages/omo-codex/scripts/install/project-local-cleanup.mjs +0 -1
  547. package/packages/omo-codex/scripts/install/snapshot.mjs +0 -1
  548. package/packages/omo-codex/scripts/install-agent-links.test.mjs +205 -11
  549. package/packages/omo-codex/scripts/install-bin-links.test.mjs +123 -1
  550. package/packages/omo-codex/scripts/install-cache-copy.test.mjs +129 -5
  551. package/packages/omo-codex/scripts/install-cli-args.test.mjs +82 -1
  552. package/packages/omo-codex/scripts/install-config-preservation.test.mjs +43 -0
  553. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +14 -1
  554. package/packages/omo-codex/scripts/install-config.test.mjs +49 -1
  555. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +84 -0
  556. package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +51 -0
  557. package/packages/omo-codex/scripts/install-local.mjs +42 -40
  558. package/packages/omo-codex/scripts/install-local.test.mjs +17 -241
  559. package/packages/omo-codex/scripts/install-marketplace-cache.test.mjs +162 -0
  560. package/packages/omo-codex/scripts/install-packaged-local.test.mjs +10 -6
  561. package/packages/omo-codex/scripts/install-project-local-cleanup.test.mjs +73 -2
  562. package/packages/omo-codex/scripts/sync-telemetry-component.mjs +1 -0
  563. package/packages/shared-skills/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
  564. package/packages/shared-skills/skills/git-master/SKILL.md +100 -0
  565. package/packages/shared-skills/skills/git-master/agents/openai.yaml +13 -0
  566. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
  567. package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
  568. package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
  569. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +119 -14
  570. package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +4 -2
  571. package/packages/shared-skills/skills/programming/references/go/concurrency.md +2 -2
  572. package/packages/shared-skills/skills/programming/references/python/async-anyio.md +6 -6
  573. package/packages/shared-skills/skills/programming/references/python/pydantic-ai.md +12 -12
  574. package/packages/shared-skills/skills/programming/references/typescript/backend-hono.md +7 -7
  575. package/packages/shared-skills/skills/refactor/SKILL.md +4 -4
  576. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  577. package/packages/shared-skills/skills/review-work/SKILL.md +55 -33
  578. package/packages/shared-skills/skills/start-work/SKILL.md +76 -19
  579. package/packages/shared-skills/skills/ultraresearch/SKILL.md +770 -0
  580. package/packages/shared-skills/skills/visual-qa/SKILL.md +219 -0
  581. package/packages/shared-skills/skills/visual-qa/scripts/ansi.test.ts +45 -0
  582. package/packages/shared-skills/skills/visual-qa/scripts/ansi.ts +17 -0
  583. package/packages/shared-skills/skills/visual-qa/scripts/cli.test.ts +73 -0
  584. package/packages/shared-skills/skills/visual-qa/scripts/cli.ts +82 -0
  585. package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.test.ts +60 -0
  586. package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.ts +72 -0
  587. package/packages/shared-skills/skills/visual-qa/scripts/image-diff.test.ts +70 -0
  588. package/packages/shared-skills/skills/visual-qa/scripts/image-diff.ts +109 -0
  589. package/packages/shared-skills/skills/visual-qa/scripts/png-crc.ts +27 -0
  590. package/packages/shared-skills/skills/visual-qa/scripts/png-decode.test.ts +44 -0
  591. package/packages/shared-skills/skills/visual-qa/scripts/png-decode.ts +206 -0
  592. package/packages/shared-skills/skills/visual-qa/scripts/png-synth.ts +57 -0
  593. package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +83 -0
  594. package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.test.ts +57 -0
  595. package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.ts +88 -0
  596. package/packages/shared-skills/skills/visual-qa/scripts/types.ts +54 -0
  597. package/postinstall.mjs +24 -1
  598. package/dist/agents/custom-agent-summaries.d.ts +0 -8
  599. package/dist/agents/hephaestus/gpt-5-3-codex.d.ts +0 -20
  600. package/dist/agents/prometheus/gemini.d.ts +0 -1
  601. package/dist/agents/prometheus/gpt.d.ts +0 -1
  602. package/dist/agents/sisyphus-junior/gpt-5-3-codex.d.ts +0 -8
  603. package/dist/features/background-agent/session-route.d.ts +0 -12
  604. package/dist/features/background-agent/spawner/parent-directory-resolver.d.ts +0 -6
  605. package/dist/features/background-agent/state.d.ts +0 -35
  606. package/dist/features/claude-tasks/session-storage.d.ts +0 -9
  607. package/dist/features/mcp-oauth/resource-indicator.d.ts +0 -2
  608. package/dist/features/mcp-oauth/schema.d.ts +0 -6
  609. package/dist/features/opencode-skill-loader/async-loader.d.ts +0 -6
  610. package/dist/features/opencode-skill-loader/blocking.d.ts +0 -2
  611. package/dist/features/opencode-skill-loader/discover-worker.d.ts +0 -1
  612. package/dist/hooks/session-recovery/recover-empty-content-message-sdk.d.ts +0 -13
  613. package/dist/shared/bun-hash-shim.d.ts +0 -1
  614. package/dist/tools/delegate-task/resolve-call-id.d.ts +0 -2
  615. package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -383
  616. /package/packages/lsp-tools-mcp/dist/lsp/{utils.d.ts → startup-failure.d.ts} +0 -0
  617. /package/packages/lsp-tools-mcp/dist/lsp/{utils.js → startup-failure.js} +0 -0
@@ -42,7 +42,7 @@ describe("rules formatter hook context", () => {
42
42
  );
43
43
  });
44
44
 
45
- it("#given static rules #when formatting SessionStart context #then it avoids leading blank lines", () => {
45
+ it("#given static rules #when formatting SessionStart context #then it injects rule bodies inline", () => {
46
46
  // given
47
47
  const rule = loadedRule({
48
48
  path: "/repo/CONTEXT.md",
@@ -79,7 +79,7 @@ describe("rules formatter hook context", () => {
79
79
  expect(block).not.toContain("\r");
80
80
  });
81
81
 
82
- it("#given duplicate static rules with different line endings #when formatting context #then it renders one copy", () => {
82
+ it("#given duplicate static rules with different line endings #when formatting context #then it injects one copy", () => {
83
83
  // given
84
84
  const lfRule = loadedRule({
85
85
  path: "/repo/CONTEXT.md",
@@ -96,10 +96,75 @@ describe("rules formatter hook context", () => {
96
96
  const block = formatStaticBlock([lfRule, crlfRule], FORMAT_OPTIONS);
97
97
 
98
98
  // then
99
+ expect(occurrenceCount(block, "Instructions from: /repo/CONTEXT.md")).toBe(1);
99
100
  expect(occurrenceCount(block, "Shared rule\nKeep one copy.")).toBe(1);
100
101
  expect(block).not.toContain("/repo/packages/CONTEXT.md");
101
102
  });
102
103
 
104
+ it("#given a Hephaestus static rule #when formatting SessionStart context #then it injects its body before other rule bodies", () => {
105
+ // given
106
+ const rules = [
107
+ loadedRule({ path: "/repo/alpha.md", relativePath: "alpha.md", body: "Alpha guidance." }),
108
+ loadedRule({
109
+ path: "/repo/bundled-rules/hephaestus.md",
110
+ relativePath: "bundled-rules/hephaestus.md",
111
+ body: "Hephaestus guidance.",
112
+ }),
113
+ loadedRule({ path: "/repo/beta.md", relativePath: "beta.md", body: "Beta guidance." }),
114
+ ];
115
+
116
+ // when
117
+ const block = formatStaticBlock(rules, FORMAT_OPTIONS);
118
+
119
+ // then
120
+ expect(block).toContain("Instructions from: /repo/bundled-rules/hephaestus.md");
121
+ expect(block).toContain("Hephaestus guidance.");
122
+ expect(block).toContain("Alpha guidance.");
123
+ expect(block).toContain("Beta guidance.");
124
+ expect(block.indexOf("Hephaestus guidance.")).toBeLessThan(block.indexOf("Alpha guidance."));
125
+ expect(block.indexOf("Alpha guidance.")).toBeLessThan(block.indexOf("Beta guidance."));
126
+ expect(block).not.toContain("must read project rules:");
127
+ expect(block).not.toContain("- [hephaestus.md]");
128
+ });
129
+
130
+ it("#given only a Hephaestus static rule #when formatting SessionStart context #then it emits no project rule link section", () => {
131
+ // given
132
+ const rule = loadedRule({
133
+ path: "/repo/bundled-rules/hephaestus.md",
134
+ relativePath: "bundled-rules/hephaestus.md",
135
+ body: "Hephaestus guidance.",
136
+ });
137
+
138
+ // when
139
+ const block = formatStaticBlock([rule], FORMAT_OPTIONS);
140
+
141
+ // then
142
+ expect(block).toContain("Instructions from: /repo/bundled-rules/hephaestus.md");
143
+ expect(block).toContain("Hephaestus guidance.");
144
+ expect(block).not.toContain("- [hephaestus.md]");
145
+ expect(block).not.toContain("must read project rules:");
146
+ });
147
+
148
+ it("#given an oversized Hephaestus static rule #when formatting under a tight result budget #then its body is never truncated", () => {
149
+ // given
150
+ const tailMarker = "HEPHAESTUS_TAIL_SENTINEL";
151
+ const rule = loadedRule({
152
+ path: "/repo/bundled-rules/hephaestus.md",
153
+ relativePath: "bundled-rules/hephaestus.md",
154
+ body: `${"H".repeat(500)}\n\n${tailMarker}`,
155
+ });
156
+
157
+ // when
158
+ const block = formatStaticBlock([rule], {
159
+ maxRuleChars: 120,
160
+ maxResultChars: 200,
161
+ });
162
+
163
+ // then
164
+ expect(block).toContain(tailMarker);
165
+ expect(block).not.toContain("[Truncated. Full:");
166
+ });
167
+
103
168
  it("#given multiple oversized rules #when formatting under a tight result budget #then every rule receives a fair truncated share with a read-full guide", () => {
104
169
  // given
105
170
  const rules = [
@@ -26,6 +26,22 @@ describe("formatAdditionalContextOutput", () => {
26
26
  // then
27
27
  expect(output).toBe("");
28
28
  });
29
+
30
+ it("#given oversized context #when serializing hook JSON #then it keeps additional context under the safety cap", () => {
31
+ // given
32
+ const context = `first\n${"x".repeat(50_000)}\nlast`;
33
+
34
+ // when
35
+ const output = formatAdditionalContextOutput("SessionStart", context);
36
+ const parsed: unknown = JSON.parse(output);
37
+ const additionalContext = readAdditionalContext(parsed);
38
+
39
+ // then
40
+ expect(additionalContext.length).toBeLessThanOrEqual(32_000);
41
+ expect(additionalContext).toContain("first");
42
+ expect(additionalContext).not.toContain("last");
43
+ expect(additionalContext).toContain("[Truncated hook additional context to 32000 chars");
44
+ });
29
45
  });
30
46
 
31
47
  function readAdditionalContext(value: unknown): string {
@@ -0,0 +1,153 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { parseRule } from "../src/rules/parser.js";
4
+
5
+ describe("parseRule", () => {
6
+ it("#given content without frontmatter #when parsing #then body is preserved", () => {
7
+ // given
8
+ const content = "Prefer strict TypeScript.\n---\nThis is body content.";
9
+
10
+ // when
11
+ const parsed = parseRule(content);
12
+
13
+ // then
14
+ expect(parsed).toEqual({
15
+ frontmatter: {},
16
+ body: content,
17
+ });
18
+ });
19
+
20
+ it("#given bom and crlf frontmatter #when parsing #then delimiters are removed", () => {
21
+ // given
22
+ const content = "\uFEFF---\r\ndescription: Windows rule\r\nalwaysApply: true\r\n---\r\nUse Git Bash.\r\n";
23
+
24
+ // when
25
+ const parsed = parseRule(content);
26
+
27
+ // then
28
+ expect(parsed).toEqual({
29
+ frontmatter: {
30
+ description: "Windows rule",
31
+ alwaysApply: true,
32
+ },
33
+ body: "Use Git Bash.\r\n",
34
+ });
35
+ });
36
+
37
+ it("#given missing closing delimiter #when parsing #then original markdown is salvaged with diagnostic", () => {
38
+ // given
39
+ const content = ["---", "description: Missing close", "", "Keep this content."].join("\n");
40
+
41
+ // when
42
+ const parsed = parseRule(content);
43
+
44
+ // then
45
+ expect(parsed).toEqual({
46
+ frontmatter: {},
47
+ body: content,
48
+ diagnostic: "Missing closing frontmatter delimiter",
49
+ });
50
+ });
51
+
52
+ it("#given malformed yaml subset #when parsing #then original markdown is salvaged with diagnostic", () => {
53
+ // given
54
+ const content = ["---", "alwaysApply: maybe", "---", "", "Keep this content."].join("\n");
55
+
56
+ // when
57
+ const parsed = parseRule(content);
58
+
59
+ // then
60
+ expect(parsed.frontmatter).toEqual({});
61
+ expect(parsed.body).toBe(content);
62
+ expect(parsed.diagnostic).toBe("Malformed frontmatter: Expected boolean on line 1");
63
+ });
64
+
65
+ it("#given quoted hashes and inline quoted commas #when parsing #then comments and commas are handled by quote context", () => {
66
+ // given
67
+ const content = [
68
+ "---",
69
+ 'description: "Rule #1" # trailing comment',
70
+ 'globs: ["src/a,b.ts", "docs/#guide.md"] # trailing comment',
71
+ "---",
72
+ "",
73
+ "Use quote-aware parsing.",
74
+ ].join("\n");
75
+
76
+ // when
77
+ const parsed = parseRule(content);
78
+
79
+ // then
80
+ expect(parsed.frontmatter).toEqual({
81
+ description: "Rule #1",
82
+ globs: ["src/a,b.ts", "docs/#guide.md"],
83
+ });
84
+ });
85
+
86
+ it("#given quoted scalar glob with comma #when parsing #then the comma remains part of one glob", () => {
87
+ // given
88
+ const content = ["---", 'globs: "src/foo,bar.ts"', "---", "", "Prefer precise glob parsing."].join("\n");
89
+
90
+ // when
91
+ const parsed = parseRule(content);
92
+
93
+ // then
94
+ expect(parsed.frontmatter.globs).toBe("src/foo,bar.ts");
95
+ });
96
+
97
+ it("#given unquoted scalar glob list with comma #when parsing #then it remains split into multiple globs", () => {
98
+ // given
99
+ const content = ["---", "globs: src/foo.ts, src/bar.ts", "---", "", "Prefer precise glob parsing."].join("\n");
100
+
101
+ // when
102
+ const parsed = parseRule(content);
103
+
104
+ // then
105
+ expect(parsed.frontmatter.globs).toEqual(["src/foo.ts", "src/bar.ts"]);
106
+ });
107
+
108
+ it("#given multiline array with comments and blanks #when parsing #then items are collected until next key", () => {
109
+ // given
110
+ const content = [
111
+ "---",
112
+ "globs:",
113
+ " # ignored comment",
114
+ "",
115
+ ' - "src/#hash.ts" # trailing comment',
116
+ " - docs/**/*.md",
117
+ "description: Multiline",
118
+ "---",
119
+ "",
120
+ "Prefer precise rules.",
121
+ ].join("\n");
122
+
123
+ // when
124
+ const parsed = parseRule(content);
125
+
126
+ // then
127
+ expect(parsed.frontmatter).toEqual({
128
+ description: "Multiline",
129
+ globs: ["src/#hash.ts", "docs/**/*.md"],
130
+ });
131
+ });
132
+
133
+ it("#given duplicate glob aliases #when parsing frontmatter #then first-seen order is preserved", () => {
134
+ // given
135
+ const content = [
136
+ "---",
137
+ 'globs: ["src/**/*.ts", "test/**/*.ts", "src/**/*.ts"]',
138
+ "paths:",
139
+ " - test/**/*.ts",
140
+ " - packages/**/*.ts",
141
+ "applyTo: packages/**/*.ts, docs/**/*.md, src/**/*.ts",
142
+ "---",
143
+ "",
144
+ "Prefer strict TypeScript.",
145
+ ].join("\n");
146
+
147
+ // when
148
+ const parsed = parseRule(content);
149
+
150
+ // then
151
+ expect(parsed.frontmatter.globs).toEqual(["src/**/*.ts", "test/**/*.ts", "packages/**/*.ts", "docs/**/*.md"]);
152
+ });
153
+ });
@@ -60,6 +60,18 @@ describe("post-compact context budget", () => {
60
60
  expect(budget.maxResultChars).toBe(CONFIG.postCompactMaxResultChars);
61
61
  });
62
62
 
63
+ it("#given pure GPT-5.4 model near the fallback context window #when resolving post-compact budget #then treats it as non-preset metadata", () => {
64
+ // given
65
+ const transcriptPath = writeCompactedTranscript("A".repeat(600_000));
66
+
67
+ // when
68
+ const budget = withPostCompactBudget(CONFIG, { model: "gpt-5.4", transcriptPath });
69
+
70
+ // then
71
+ expect(budget.maxResultChars).toBeLessThan(1_000);
72
+ expect(budget.maxRuleChars).toBeLessThanOrEqual(budget.maxResultChars);
73
+ });
74
+
63
75
  it("#given context pressure marker after compaction #when resolving post-compact budget #then shrinks projected rule injection", () => {
64
76
  // given
65
77
  const transcriptPath = writeCompactedPressureTranscript("small compacted summary");
@@ -0,0 +1,236 @@
1
+ import { mkdtempSync, rmSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+
5
+ import { describe, expect, it } from "vitest";
6
+
7
+ import { runSessionStartHook, runUserPromptSubmitHook } from "../src/codex-hook.js";
8
+ import { formatAdditionalContextOutput } from "../src/hook-output.js";
9
+
10
+ type HookOutput = {
11
+ readonly hookSpecificOutput?: {
12
+ readonly additionalContext?: string;
13
+ };
14
+ };
15
+
16
+ function parseAdditionalContext(output: string): string {
17
+ expect(output.trim().length).toBeGreaterThan(0);
18
+ const parsed = parseHookOutput(JSON.parse(output));
19
+ return parsed.hookSpecificOutput?.additionalContext ?? "";
20
+ }
21
+
22
+ function parseHookOutput(value: unknown): HookOutput {
23
+ if (typeof value !== "object" || value === null) {
24
+ return {};
25
+ }
26
+ const record = value;
27
+ if (!("hookSpecificOutput" in record)) {
28
+ return {};
29
+ }
30
+ const hookSpecificOutput = record.hookSpecificOutput;
31
+ if (typeof hookSpecificOutput !== "object" || hookSpecificOutput === null) {
32
+ return {};
33
+ }
34
+ if (!("additionalContext" in hookSpecificOutput)) {
35
+ return { hookSpecificOutput: {} };
36
+ }
37
+ const additionalContext = hookSpecificOutput.additionalContext;
38
+ if (typeof additionalContext !== "string") {
39
+ return { hookSpecificOutput: {} };
40
+ }
41
+ return {
42
+ hookSpecificOutput: {
43
+ additionalContext,
44
+ },
45
+ };
46
+ }
47
+
48
+ describe("Codex Sparkshell awareness", () => {
49
+ it("#given active Codex app server env #when SessionStart runs #then emits Sparkshell guidance", async () => {
50
+ // given
51
+ const env = {
52
+ CODEX_INTERNAL_ORIGINATOR_OVERRIDE: "Codex Desktop",
53
+ CODEX_SHELL: "1",
54
+ CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
55
+ };
56
+
57
+ // when
58
+ const output = await runSessionStartHook(
59
+ {
60
+ session_id: "session-sparkshell-active",
61
+ transcript_path: null,
62
+ cwd: process.cwd(),
63
+ hook_event_name: "SessionStart",
64
+ model: "gpt-5.5",
65
+ permission_mode: "default",
66
+ source: "startup",
67
+ },
68
+ { env },
69
+ );
70
+
71
+ // then
72
+ expect(parseAdditionalContext(output)).toContain("omo sparkshell <command>");
73
+ });
74
+
75
+ it("#given inactive env #when SessionStart runs #then emits no Sparkshell guidance", async () => {
76
+ // given
77
+ const env = {
78
+ CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
79
+ };
80
+
81
+ // when
82
+ const output = await runSessionStartHook(
83
+ {
84
+ session_id: "session-sparkshell-inactive",
85
+ transcript_path: null,
86
+ cwd: process.cwd(),
87
+ hook_event_name: "SessionStart",
88
+ model: "gpt-5.5",
89
+ permission_mode: "default",
90
+ source: "startup",
91
+ },
92
+ { env },
93
+ );
94
+
95
+ // then
96
+ expect(output).toBe("");
97
+ });
98
+
99
+ it("#given Codex CLI appserver socket env #when SessionStart runs #then emits Sparkshell guidance", async () => {
100
+ // given
101
+ const env = {
102
+ OMO_SPARKSHELL_APP_SERVER_SOCKET: "/tmp/app-server-control.sock",
103
+ CODEX_THREAD_ID: "thread-sparkshell-cli",
104
+ CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
105
+ };
106
+
107
+ // when
108
+ const output = await runSessionStartHook(
109
+ {
110
+ session_id: "session-sparkshell-cli-wrapper",
111
+ transcript_path: null,
112
+ cwd: process.cwd(),
113
+ hook_event_name: "SessionStart",
114
+ model: "gpt-5.5",
115
+ permission_mode: "default",
116
+ source: "startup",
117
+ },
118
+ { env },
119
+ );
120
+
121
+ // then
122
+ expect(parseAdditionalContext(output)).toContain("omo sparkshell <command>");
123
+ });
124
+
125
+ it("#given explicit force-on env #when SessionStart runs #then emits Sparkshell guidance", async () => {
126
+ // given
127
+ const env = {
128
+ OMO_SPARKSHELL_AWARENESS: "1",
129
+ CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
130
+ };
131
+
132
+ // when
133
+ const output = await runSessionStartHook(
134
+ {
135
+ session_id: "session-sparkshell-force-on",
136
+ transcript_path: null,
137
+ cwd: process.cwd(),
138
+ hook_event_name: "SessionStart",
139
+ model: "gpt-5.5",
140
+ permission_mode: "default",
141
+ source: "startup",
142
+ },
143
+ { env },
144
+ );
145
+
146
+ // then
147
+ expect(parseAdditionalContext(output)).toContain("omo sparkshell <command>");
148
+ });
149
+
150
+ it("#given explicit force-off env with active Codex app context #when SessionStart runs #then emits no Sparkshell guidance", async () => {
151
+ // given
152
+ const env = {
153
+ OMO_SPARKSHELL_AWARENESS: "0",
154
+ CODEX_INTERNAL_ORIGINATOR_OVERRIDE: "Codex Desktop",
155
+ CODEX_SHELL: "1",
156
+ CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
157
+ };
158
+
159
+ // when
160
+ const output = await runSessionStartHook(
161
+ {
162
+ session_id: "session-sparkshell-force-off",
163
+ transcript_path: null,
164
+ cwd: process.cwd(),
165
+ hook_event_name: "SessionStart",
166
+ model: "gpt-5.5",
167
+ permission_mode: "default",
168
+ source: "startup",
169
+ },
170
+ { env },
171
+ );
172
+
173
+ // then
174
+ expect(output).toBe("");
175
+ });
176
+
177
+ it("#given Sparkshell awareness already emitted for a session #when UserPromptSubmit runs #then emits no duplicate guidance", async () => {
178
+ // given
179
+ const pluginDataRoot = mkdtempSync(join(tmpdir(), "codex-sparkshell-awareness-"));
180
+ const env = {
181
+ CODEX_INTERNAL_ORIGINATOR_OVERRIDE: "Codex Desktop",
182
+ CODEX_SHELL: "1",
183
+ CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
184
+ };
185
+ try {
186
+ const firstOutput = await runSessionStartHook(
187
+ {
188
+ session_id: "session-sparkshell-dedupe",
189
+ transcript_path: null,
190
+ cwd: process.cwd(),
191
+ hook_event_name: "SessionStart",
192
+ model: "gpt-5.5",
193
+ permission_mode: "default",
194
+ source: "startup",
195
+ },
196
+ { env, pluginDataRoot },
197
+ );
198
+ expect(parseAdditionalContext(firstOutput)).toContain("omo sparkshell <command>");
199
+
200
+ // when
201
+ const secondOutput = await runUserPromptSubmitHook(
202
+ {
203
+ session_id: "session-sparkshell-dedupe",
204
+ turn_id: "turn-1",
205
+ transcript_path: null,
206
+ cwd: process.cwd(),
207
+ hook_event_name: "UserPromptSubmit",
208
+ model: "gpt-5.5",
209
+ permission_mode: "default",
210
+ prompt: "continue",
211
+ },
212
+ { env, pluginDataRoot },
213
+ );
214
+
215
+ // then
216
+ expect(secondOutput).toBe("");
217
+ } finally {
218
+ rmSync(pluginDataRoot, { recursive: true, force: true });
219
+ }
220
+ });
221
+
222
+ it("#given explicit force-on env #when hook output is formatted #then awareness remains valid hook JSON", () => {
223
+ // given
224
+ const context = [
225
+ "## Sparkshell Runtime",
226
+ "",
227
+ "- Prefer `omo sparkshell <command>` for shell-native inspection.",
228
+ ].join("\n");
229
+
230
+ // when
231
+ const output = formatAdditionalContextOutput("SessionStart", context);
232
+
233
+ // then
234
+ expect(parseAdditionalContext(output)).toContain("## Sparkshell Runtime");
235
+ });
236
+ });
@@ -30,22 +30,34 @@ function postToolUse(input: { toolName: string; toolInput?: unknown; toolRespons
30
30
  }
31
31
 
32
32
  describe("extractCodexToolPaths", () => {
33
- it("#given filesystem read payload #when extracting #then returns resolved path", () => {
34
- // given
35
- const root = makeProject();
36
-
37
- // when
38
- const paths = extractCodexToolPaths(
39
- postToolUse({
40
- toolName: "mcp__filesystem__read_file",
41
- toolInput: { path: "src/app.ts" },
42
- }),
43
- root,
44
- );
45
-
46
- // then
47
- expect(paths).toEqual([path.join(root, "src", "app.ts")]);
48
- });
33
+ for (const [name, toolName, toolInput] of [
34
+ [
35
+ "#given filesystem read payload #when extracting #then returns resolved path",
36
+ "mcp__filesystem__read_file",
37
+ { path: "src/app.ts" },
38
+ ],
39
+ [
40
+ "#given mcp write-file payload #when extracting #then returns resolved path",
41
+ "mcp__filesystem__write_file",
42
+ { path: "src/app.ts", content: "export const app = true;\n" },
43
+ ],
44
+ [
45
+ "#given mcp edit-file payload #when extracting #then returns resolved path",
46
+ "mcp__filesystem__edit_file",
47
+ { path: "src/app.ts", edits: [] },
48
+ ],
49
+ ] as const) {
50
+ it(name, () => {
51
+ // given
52
+ const root = makeProject();
53
+
54
+ // when
55
+ const paths = extractCodexToolPaths(postToolUse({ toolName, toolInput }), root);
56
+
57
+ // then
58
+ expect(paths).toEqual([path.join(root, "src", "app.ts")]);
59
+ });
60
+ }
49
61
 
50
62
  it("#given apply_patch payload #when extracting #then returns patched file paths", () => {
51
63
  // given
@@ -109,40 +121,6 @@ describe("extractCodexToolPaths", () => {
109
121
  ]);
110
122
  });
111
123
 
112
- it("#given mcp write-file payload #when extracting #then returns resolved path", () => {
113
- // given
114
- const root = makeProject();
115
-
116
- // when
117
- const paths = extractCodexToolPaths(
118
- postToolUse({
119
- toolName: "mcp__filesystem__write_file",
120
- toolInput: { path: "src/app.ts", content: "export const app = true;\n" },
121
- }),
122
- root,
123
- );
124
-
125
- // then
126
- expect(paths).toEqual([path.join(root, "src", "app.ts")]);
127
- });
128
-
129
- it("#given mcp edit-file payload #when extracting #then returns resolved path", () => {
130
- // given
131
- const root = makeProject();
132
-
133
- // when
134
- const paths = extractCodexToolPaths(
135
- postToolUse({
136
- toolName: "mcp__filesystem__edit_file",
137
- toolInput: { path: "src/app.ts", edits: [] },
138
- }),
139
- root,
140
- );
141
-
142
- // then
143
- expect(paths).toEqual([path.join(root, "src", "app.ts")]);
144
- });
145
-
146
124
  it("#given mcp read-multiple-files payload #when extracting #then returns all resolved paths", () => {
147
125
  // given
148
126
  const root = makeProject();
@@ -81,7 +81,8 @@ describe("Windows Git Bash bundled rule", () => {
81
81
  platform: "win32",
82
82
  });
83
83
 
84
- expect(occurrenceCount(output, WINDOWS_GUIDANCE)).toBe(1);
84
+ expect(occurrenceCount(output, `Instructions from: ${join(process.cwd(), WINDOWS_RULE_PATH)}`)).toBe(1);
85
+ expect(output).toContain(WINDOWS_GUIDANCE);
85
86
  });
86
87
 
87
88
  it("#given bundled rules enabled off Windows #when SessionStart runs #then Windows Git Bash guidance is not injected", async () => {
@@ -97,12 +98,13 @@ describe("Windows Git Bash bundled rule", () => {
97
98
  expect(output).not.toContain(WINDOWS_RULE_PATH);
98
99
  });
99
100
 
100
- it("#given project rule with same description on Windows #when static rules load #then project guidance overrides bundled guidance", async () => {
101
+ it("#given project rule with same description on Windows #when static rules load #then project guidance file overrides bundled guidance", async () => {
101
102
  const { root, pluginData } = makeProject();
102
103
  const projectGuidance = "Project-specific Windows shell policy.";
104
+ const projectRulePath = join(root, ".omo", "rules", "windows-git-bash.md");
103
105
  mkdirSync(join(root, ".omo", "rules"), { recursive: true });
104
106
  writeFileSync(
105
- join(root, ".omo", "rules", "windows-git-bash.md"),
107
+ projectRulePath,
106
108
  ["---", `description: ${WINDOWS_RULE_DESCRIPTION}`, "alwaysApply: true", "---", "", projectGuidance].join(
107
109
  "\n",
108
110
  ),
@@ -114,6 +116,7 @@ describe("Windows Git Bash bundled rule", () => {
114
116
  platform: "win32",
115
117
  });
116
118
 
119
+ expect(output).toContain(`Instructions from: ${projectRulePath}`);
117
120
  expect(output).toContain(projectGuidance);
118
121
  expect(output).not.toContain(WINDOWS_GUIDANCE);
119
122
  });