oh-my-opencode 4.7.5 → 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 +4426 -2200
  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 +15 -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 +4 -4
  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 +3 -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 +166 -76
  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 +191 -29
  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
@@ -26,14 +26,17 @@ interface Fixture {
26
26
 
27
27
  const BUNDLED_ONLY_ENV = {
28
28
  CODEX_RULES_ENABLED_SOURCES: "plugin-bundled",
29
+ CODEX_RULES_MAX_RESULT_CHARS: "40000",
29
30
  };
30
31
 
31
32
  const PROJECT_AND_BUNDLED_ENV = {
32
33
  CODEX_RULES_ENABLED_SOURCES: ".omo/rules,plugin-bundled",
34
+ CODEX_RULES_MAX_RESULT_CHARS: "40000",
33
35
  };
34
36
 
35
37
  const DISABLED_BUNDLED_ENV = {
36
38
  CODEX_RULES_ENABLED_SOURCES: "plugin-bundled",
39
+ CODEX_RULES_MAX_RESULT_CHARS: "40000",
37
40
  CODEX_RULES_DISABLE_BUNDLED: "1",
38
41
  };
39
42
 
@@ -147,9 +150,9 @@ describe("plugin bundled rules", () => {
147
150
  expect(cache.scannedRuleFiles.has(join(pluginRoot, "bundled-rules"))).toBe(true);
148
151
  });
149
152
 
150
- it("#given alwaysApply bundled rule #when SessionStart runs #then static context includes it", async () => {
153
+ it("#given alwaysApply bundled Hephaestus rule #when SessionStart runs #then static context expands it inline", async () => {
151
154
  // given
152
- const { root, pluginData } = makeFixture();
155
+ const { root, pluginData, bundledRulePath } = makeFixture();
153
156
 
154
157
  // when
155
158
  const output = await runSessionStartHook(sessionStartInput(root), {
@@ -159,10 +162,14 @@ describe("plugin bundled rules", () => {
159
162
 
160
163
  // then
161
164
  expect(output).toContain('"hookEventName":"SessionStart"');
165
+ expect(output).toContain(`Instructions from: ${bundledRulePath}`);
162
166
  expect(output).toContain(BUNDLED_BODY);
167
+ expect(output).toContain("## Project Instructions");
168
+ expect(output).not.toContain("must read project rules:");
169
+ expect(output).not.toContain(`- [hephaestus.md]{${bundledRulePath}}`);
163
170
  });
164
171
 
165
- it("#given same project and bundled body #when SessionStart runs #then project rule wins", async () => {
172
+ it("#given same project and bundled body #when SessionStart runs #then project rule file wins", async () => {
166
173
  // given
167
174
  const { root, pluginData, bundledRulePath, projectRulePath } = makeFixture({ writeProjectDuplicate: true });
168
175
 
@@ -173,8 +180,9 @@ describe("plugin bundled rules", () => {
173
180
  });
174
181
 
175
182
  // then
176
- expect(occurrenceCount(output, SHARED_BODY)).toBe(1);
177
- expect(output).toContain(projectRulePath);
183
+ expect(occurrenceCount(output, "- [hephaestus.md]{")).toBe(0);
184
+ expect(output).toContain(`Instructions from: ${projectRulePath}`);
185
+ expect(output).toContain(SHARED_BODY);
178
186
  expect(output).not.toContain(bundledRulePath);
179
187
  });
180
188
 
@@ -194,11 +202,12 @@ describe("plugin bundled rules", () => {
194
202
 
195
203
  it("#given bundled static context already injected #when UserPromptSubmit runs after PostCompact #then it emits no duplicate bundled context", async () => {
196
204
  // given
197
- const { root, pluginData } = makeFixture();
205
+ const { root, pluginData, bundledRulePath } = makeFixture();
198
206
  const firstOutput = await runSessionStartHook(sessionStartInput(root), {
199
207
  pluginDataRoot: pluginData,
200
208
  env: BUNDLED_ONLY_ENV,
201
209
  });
210
+ expect(firstOutput).toContain(`Instructions from: ${bundledRulePath}`);
202
211
  expect(firstOutput).toContain(BUNDLED_BODY);
203
212
 
204
213
  // when
@@ -213,7 +222,7 @@ describe("plugin bundled rules", () => {
213
222
  expect(output).toBe("");
214
223
  });
215
224
 
216
- it("#given bundled rule body exceeds per-rule cap #when SessionStart runs #then bundled body lands in full without truncation", async () => {
225
+ it("#given bundled Hephaestus rule body exceeds per-rule cap #when SessionStart runs #then static context expands the body within result budget", async () => {
217
226
  // given
218
227
  const root = mkdtempSync(join(tmpdir(), "codex-rules-bundled-large-project-"));
219
228
  const pluginRoot = mkdtempSync(join(tmpdir(), "codex-rules-bundled-large-plugin-"));
@@ -224,8 +233,9 @@ describe("plugin bundled rules", () => {
224
233
  const oversizedBody = "The bundled craftsman discipline is non-negotiable. ".repeat(400);
225
234
  expect(oversizedBody.length).toBeGreaterThan(12000);
226
235
  const tailMarker = "BUNDLED_TAIL_SENTINEL_LANDS_IN_FULL";
236
+ const bundledRulePath = join(pluginRoot, "bundled-rules", "hephaestus.md");
227
237
  const bundledBody = `${oversizedBody}\n\n${tailMarker}\n`;
228
- writeFileSync(join(pluginRoot, "bundled-rules", "hephaestus.md"), ruleMarkdown(bundledBody));
238
+ writeFileSync(bundledRulePath, ruleMarkdown(bundledBody));
229
239
  process.env["PLUGIN_ROOT"] = pluginRoot;
230
240
 
231
241
  // when
@@ -235,11 +245,13 @@ describe("plugin bundled rules", () => {
235
245
  });
236
246
 
237
247
  // then
248
+ expect(output).toContain(`Instructions from: ${bundledRulePath}`);
249
+ expect(output).toContain("The bundled craftsman discipline is non-negotiable.");
238
250
  expect(output).toContain(tailMarker);
239
251
  expect(output).not.toContain("[Truncated. Full:");
240
252
  });
241
253
 
242
- it("#given project rule body exceeds per-rule cap #when SessionStart runs #then project body is truncated", async () => {
254
+ it("#given project rule body exceeds per-rule cap #when SessionStart runs #then static context injects a truncated body", async () => {
243
255
  // given
244
256
  const root = mkdtempSync(join(tmpdir(), "codex-rules-project-large-project-"));
245
257
  const pluginRoot = mkdtempSync(join(tmpdir(), "codex-rules-project-large-plugin-"));
@@ -251,8 +263,9 @@ describe("plugin bundled rules", () => {
251
263
  const oversizedBody = "The project rule body is intentionally oversized for the cap test. ".repeat(300);
252
264
  expect(oversizedBody.length).toBeGreaterThan(12000);
253
265
  const tailMarker = "PROJECT_TAIL_SENTINEL_SHOULD_NOT_LAND";
266
+ const projectRulePath = join(root, ".omo", "rules", "oversized.md");
254
267
  const projectBody = `${oversizedBody}\n\n${tailMarker}\n`;
255
- writeFileSync(join(root, ".omo", "rules", "oversized.md"), ruleMarkdown(projectBody));
268
+ writeFileSync(projectRulePath, ruleMarkdown(projectBody));
256
269
  process.env["PLUGIN_ROOT"] = pluginRoot;
257
270
 
258
271
  // when
@@ -262,7 +275,9 @@ describe("plugin bundled rules", () => {
262
275
  });
263
276
 
264
277
  // then
265
- expect(output).toContain("[Truncated. Full: .omo/rules/oversized.md]");
278
+ expect(output).toContain(`Instructions from: ${projectRulePath}`);
279
+ expect(output).toContain("The project rule body is intentionally oversized for the cap test.");
280
+ expect(output).toContain("[Truncated. Full:");
266
281
  expect(output).not.toContain(tailMarker);
267
282
  });
268
283
  });
@@ -9,6 +9,35 @@ const tempDirectories: string[] = [];
9
9
  const PROJECT_ONLY_ENV = {
10
10
  CODEX_RULES_ENABLED_SOURCES: "AGENTS.md,.omo/rules",
11
11
  };
12
+ const PROMPT_CONTEXT_PRESSURE_CASES = [
13
+ [
14
+ "#given context-pressure recovery prompt and empty static cache #when UserPromptSubmit runs #then it emits no static context",
15
+ [
16
+ "Context compacted",
17
+ "error context_too_large: Your input exceeds the context window of this model.",
18
+ "Please adjust your input and try again.",
19
+ ].join("\n"),
20
+ ],
21
+ [
22
+ "#given Codex canonical context-window prompt and empty static cache #when UserPromptSubmit runs #then it emits no static context",
23
+ [
24
+ "error context_length_exceeded",
25
+ "Codex ran out of room in the model's context window. Start a new thread before retrying.",
26
+ ].join("\n"),
27
+ ],
28
+ ] as const;
29
+ const TRANSCRIPT_CONTEXT_PRESSURE_CASES = [
30
+ [
31
+ "#given context-pressure transcript and empty static cache #when UserPromptSubmit runs #then it emits no static context",
32
+ "#given context-pressure transcript and empty dynamic cache #when PostToolUse runs #then it emits no dynamic context",
33
+ writeContextPressureTranscript,
34
+ ],
35
+ [
36
+ "#given Codex canonical context-window transcript and empty static cache #when UserPromptSubmit runs #then it emits no static context",
37
+ "#given Codex canonical context-window transcript and empty dynamic cache #when PostToolUse runs #then it emits no dynamic context",
38
+ writeCodexContextWindowTranscript,
39
+ ],
40
+ ] as const;
12
41
 
13
42
  afterEach(() => {
14
43
  for (const directory of tempDirectories.splice(0)) {
@@ -17,144 +46,54 @@ afterEach(() => {
17
46
  });
18
47
 
19
48
  describe("codex rules context-pressure recovery", () => {
20
- it("#given context-pressure recovery prompt and empty static cache #when UserPromptSubmit runs #then it emits no static context", async () => {
21
- // given
22
- const { root, pluginData } = makeTempProject();
23
-
24
- // when
25
- const output = await runUserPromptSubmitHook(
26
- {
27
- ...userPromptSubmitInput(root),
28
- prompt: [
29
- "Context compacted",
30
- "error context_too_large: Your input exceeds the context window of this model.",
31
- "Please adjust your input and try again.",
32
- ].join("\n"),
33
- },
34
- { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
35
- );
36
-
37
- // then
38
- expect(output).toBe("");
39
- });
40
-
41
- it("#given Codex canonical context-window prompt and empty static cache #when UserPromptSubmit runs #then it emits no static context", async () => {
42
- // given
43
- const { root, pluginData } = makeTempProject();
44
-
45
- // when
46
- const output = await runUserPromptSubmitHook(
47
- {
48
- ...userPromptSubmitInput(root),
49
- prompt: [
50
- "error context_length_exceeded",
51
- "Codex ran out of room in the model's context window. Start a new thread before retrying.",
52
- ].join("\n"),
53
- },
54
- { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
55
- );
56
-
57
- // then
58
- expect(output).toBe("");
59
- });
60
-
61
- it("#given context-pressure transcript and empty static cache #when UserPromptSubmit runs #then it emits no static context", async () => {
62
- // given
63
- const { root, pluginData } = makeTempProject();
64
- const transcriptPath = writeContextPressureTranscript(root);
65
-
66
- // when
67
- const output = await runUserPromptSubmitHook(
68
- {
69
- ...userPromptSubmitInput(root),
70
- transcript_path: transcriptPath,
71
- prompt: "continue",
72
- },
73
- { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
74
- );
75
-
76
- // then
77
- expect(output).toBe("");
78
- });
79
-
80
- it("#given Codex canonical context-window transcript and empty static cache #when UserPromptSubmit runs #then it emits no static context", async () => {
81
- // given
82
- const { root, pluginData } = makeTempProject();
83
- const transcriptPath = writeCodexContextWindowTranscript(root);
84
-
85
- // when
86
- const output = await runUserPromptSubmitHook(
87
- {
88
- ...userPromptSubmitInput(root),
89
- transcript_path: transcriptPath,
90
- prompt: "continue",
91
- },
92
- { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
93
- );
94
-
95
- // then
96
- expect(output).toBe("");
97
- });
98
-
99
- it("#given context-pressure transcript and empty dynamic cache #when PostToolUse runs #then it emits no dynamic context", async () => {
100
- // given
101
- const { root, pluginData } = makeTempProject();
102
- const transcriptPath = writeContextPressureTranscript(root);
103
- const filePath = path.join(root, "src", "app.ts");
104
- mkdirSync(path.dirname(filePath), { recursive: true });
105
- writeFileSync(filePath, "export const answer = 42;\n");
106
-
107
- // when
108
- const output = await runPostToolUseHook(
109
- {
110
- session_id: "session-context-pressure",
111
- turn_id: "turn-1",
112
- transcript_path: transcriptPath,
113
- cwd: root,
114
- hook_event_name: "PostToolUse",
115
- model: "gpt-5.5",
116
- permission_mode: "default",
117
- tool_name: "mcp__filesystem__read_file",
118
- tool_input: { path: filePath },
119
- tool_response: { text: "export const answer = 42;" },
120
- tool_use_id: "call-1",
121
- },
122
- { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
123
- );
124
-
125
- // then
126
- expect(output).toBe("");
127
- });
128
-
129
- it("#given Codex canonical context-window transcript and empty dynamic cache #when PostToolUse runs #then it emits no dynamic context", async () => {
130
- // given
131
- const { root, pluginData } = makeTempProject();
132
- const transcriptPath = writeCodexContextWindowTranscript(root);
133
- const filePath = path.join(root, "src", "app.ts");
134
- mkdirSync(path.dirname(filePath), { recursive: true });
135
- writeFileSync(filePath, "export const answer = 42;\n");
136
-
137
- // when
138
- const output = await runPostToolUseHook(
139
- {
140
- session_id: "session-context-pressure",
141
- turn_id: "turn-1",
142
- transcript_path: transcriptPath,
143
- cwd: root,
144
- hook_event_name: "PostToolUse",
145
- model: "gpt-5.5",
146
- permission_mode: "default",
147
- tool_name: "mcp__filesystem__read_file",
148
- tool_input: { path: filePath },
149
- tool_response: { text: "export const answer = 42;" },
150
- tool_use_id: "call-1",
151
- },
152
- { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
153
- );
154
-
155
- // then
156
- expect(output).toBe("");
157
- });
49
+ for (const [name, prompt] of PROMPT_CONTEXT_PRESSURE_CASES) {
50
+ it(name, async () => {
51
+ // given
52
+ const { root, pluginData } = makeTempProject();
53
+
54
+ // when
55
+ const output = await runUserPromptSubmitHook(
56
+ { ...userPromptSubmitInput(root), prompt },
57
+ { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
58
+ );
59
+
60
+ // then
61
+ expect(output).toBe("");
62
+ });
63
+ }
64
+
65
+ for (const [userPromptName, postToolName, writeTranscript] of TRANSCRIPT_CONTEXT_PRESSURE_CASES) {
66
+ it(userPromptName, async () => {
67
+ // given
68
+ const { root, pluginData } = makeTempProject();
69
+ const transcriptPath = writeTranscript(root);
70
+
71
+ // when
72
+ const output = await runUserPromptSubmitHook(
73
+ { ...userPromptSubmitInput(root), transcript_path: transcriptPath, prompt: "continue" },
74
+ { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
75
+ );
76
+
77
+ // then
78
+ expect(output).toBe("");
79
+ });
80
+
81
+ it(postToolName, async () => {
82
+ // given
83
+ const { root, pluginData } = makeTempProject();
84
+ const transcriptPath = writeTranscript(root);
85
+ const filePath = writeAppFile(root);
86
+
87
+ // when
88
+ const output = await runPostToolUseHook(postToolUseInput(root, transcriptPath, filePath), {
89
+ pluginDataRoot: pluginData,
90
+ env: PROJECT_ONLY_ENV,
91
+ });
92
+
93
+ // then
94
+ expect(output).toBe("");
95
+ });
96
+ }
158
97
  });
159
98
 
160
99
  function makeTempProject(): { readonly root: string; readonly pluginData: string } {
@@ -191,6 +130,33 @@ function userPromptSubmitInput(root: string): Parameters<typeof runUserPromptSub
191
130
  };
192
131
  }
193
132
 
133
+ function postToolUseInput(
134
+ root: string,
135
+ transcriptPath: string,
136
+ filePath: string,
137
+ ): Parameters<typeof runPostToolUseHook>[0] {
138
+ return {
139
+ session_id: "session-context-pressure",
140
+ turn_id: "turn-1",
141
+ transcript_path: transcriptPath,
142
+ cwd: root,
143
+ hook_event_name: "PostToolUse",
144
+ model: "gpt-5.5",
145
+ permission_mode: "default",
146
+ tool_name: "mcp__filesystem__read_file",
147
+ tool_input: { path: filePath },
148
+ tool_response: { text: "export const answer = 42;" },
149
+ tool_use_id: "call-1",
150
+ };
151
+ }
152
+
153
+ function writeAppFile(root: string): string {
154
+ const filePath = path.join(root, "src", "app.ts");
155
+ mkdirSync(path.dirname(filePath), { recursive: true });
156
+ writeFileSync(filePath, "export const answer = 42;\n");
157
+ return filePath;
158
+ }
159
+
194
160
  function writeContextPressureTranscript(root: string): string {
195
161
  const transcriptPath = path.join(root, "transcript-context-pressure.jsonl");
196
162
  writeFileSync(
@@ -25,7 +25,7 @@ afterEach(() => {
25
25
  });
26
26
 
27
27
  describe("codex rules post-compaction context budget", () => {
28
- it("#given oversized project rules already injected #when static recovery runs after compaction #then it emits no duplicate budget block", async () => {
28
+ it("#given oversized project rules already injected #when static recovery runs after compaction #then it emits no duplicate static injection", async () => {
29
29
  // given
30
30
  const { root, pluginData } = makeOversizedProject();
31
31
  const firstOutput = await runSessionStartHook(sessionStartInput(root), {
@@ -46,7 +46,10 @@ describe("codex rules post-compaction context budget", () => {
46
46
  });
47
47
 
48
48
  // then
49
- expect(firstContext.length).toBeGreaterThan(20_000);
49
+ expect(firstContext).toContain(`Instructions from: ${path.join(root, "CONTEXT.md")}`);
50
+ expect(firstContext).toContain("Project rule");
51
+ expect(firstContext).toContain("[Truncated. Full:");
52
+ expect(firstContext.length).toBeLessThan(31_000);
50
53
  expect(output).toBe("");
51
54
  });
52
55
  });
@@ -39,6 +39,8 @@ describe("codex rules compacted context recovery", () => {
39
39
  const postCompactContext = readAdditionalContext(output);
40
40
  expect(postCompactContext.length).toBeLessThan(5_000);
41
41
  expect(postCompactContext).toContain("Instructions from:");
42
+ expect(postCompactContext).toContain("CONTEXT.md");
43
+ expect(postCompactContext).toContain("Project rule");
42
44
  });
43
45
 
44
46
  it("#given compacted context warning and near-full transcript #when compact source starts twice #then handles compacted context warning once", async () => {
@@ -63,7 +65,8 @@ describe("codex rules compacted context recovery", () => {
63
65
  // then
64
66
  const firstContext = readOptionalAdditionalContext(firstOutput);
65
67
  expect(firstContext.length).toBeLessThan(1_000);
66
- expect(firstContext).toContain("[Truncated. Full:");
68
+ expect(firstContext).toContain("Instructions from:");
69
+ expect(firstContext).toContain("CONTEXT.md");
67
70
  expect(secondOutput).toBe("");
68
71
  });
69
72
 
@@ -85,7 +88,8 @@ describe("codex rules compacted context recovery", () => {
85
88
  // then
86
89
  const context = readOptionalAdditionalContext(output);
87
90
  expect(context.length).toBeLessThan(1_000);
88
- expect(context).toContain("[Truncated. Full:");
91
+ expect(context).toContain("Instructions from:");
92
+ expect(context).toContain("CONTEXT.md");
89
93
  });
90
94
 
91
95
  it("#given compact SessionStart without prior PostCompact state #when context-pressure transcript is present #then emits emergency-sized context", async () => {
@@ -102,7 +106,8 @@ describe("codex rules compacted context recovery", () => {
102
106
  // then
103
107
  const context = readOptionalAdditionalContext(output);
104
108
  expect(context.length).toBeLessThan(1_000);
105
- expect(context).toContain("[Truncated. Full:");
109
+ expect(context).toContain("Instructions from:");
110
+ expect(context).toContain("CONTEXT.md");
106
111
  });
107
112
 
108
113
  it("#given malformed context-too-large transcript and empty session data #when compact source starts #then ignores malformed oversize markers safely", async () => {
@@ -123,7 +128,8 @@ describe("codex rules compacted context recovery", () => {
123
128
  // then
124
129
  const context = readOptionalAdditionalContext(output);
125
130
  expect(context.length).toBeLessThan(1_000);
126
- expect(context).toContain("[Truncated. Full:");
131
+ expect(context).toContain("Instructions from:");
132
+ expect(context).toContain("CONTEXT.md");
127
133
  });
128
134
 
129
135
  it("#given concurrent compact SessionStart triggers #when both recover context-too-large state #then deduplicates concurrent context-too-large recovery", async () => {
@@ -151,6 +157,7 @@ describe("codex rules compacted context recovery", () => {
151
157
  const contexts = outputs.map(readOptionalAdditionalContext);
152
158
  expect(contexts.filter((context) => context.length > 0)).toHaveLength(1);
153
159
  expect(contexts.join("").length).toBeLessThan(1_000);
154
- expect(contexts.join("")).toContain("[Truncated. Full:");
160
+ expect(contexts.join("")).toContain("Instructions from:");
161
+ expect(contexts.join("")).toContain("CONTEXT.md");
155
162
  });
156
163
  });
@@ -218,6 +218,9 @@ describe("codex rules hooks", () => {
218
218
  const parsed = parseHookOutput(output);
219
219
  expect(parsed.hookSpecificOutput?.hookEventName).toBe("SessionStart");
220
220
  expect(parsed.hookSpecificOutput?.additionalContext).toContain("## Project Instructions");
221
+ expect(parsed.hookSpecificOutput?.additionalContext).toContain(
222
+ `Instructions from: ${path.join(root, "CONTEXT.md")}`,
223
+ );
221
224
  expect(parsed.hookSpecificOutput?.additionalContext).toContain("Always wear safety goggles");
222
225
  });
223
226
 
@@ -234,7 +237,9 @@ describe("codex rules hooks", () => {
234
237
  const parsed = parseHookOutput(output);
235
238
  expect(parsed.hookSpecificOutput?.additionalContext).toContain("## Project Instructions");
236
239
  expect(parsed.hookSpecificOutput?.additionalContext).not.toContain("Project AGENTS.md should stay Codex-native.");
237
- expect(parsed.hookSpecificOutput?.additionalContext).not.toContain("Project CLAUDE.md should stay outside rules hook context.");
240
+ expect(parsed.hookSpecificOutput?.additionalContext).not.toContain(
241
+ "Project CLAUDE.md should stay outside rules hook context.",
242
+ );
238
243
  });
239
244
 
240
245
  it("#given project AGENTS.md #when SessionStart runs #then rules hook leaves AGENTS.md to Codex native handling", async () => {
@@ -307,9 +312,10 @@ describe("codex rules hooks", () => {
307
312
 
308
313
  // then
309
314
  expect(resumeOutput).toBe("");
310
- expect(parseHookOutput(clearOutput).hookSpecificOutput?.additionalContext).toContain(
311
- "Always wear safety goggles",
312
- );
315
+ const clearContext = parseHookOutput(clearOutput).hookSpecificOutput?.additionalContext ?? "";
316
+ expect(clearContext).toContain("## Project Instructions");
317
+ expect(clearContext).toContain(`Instructions from: ${path.join(root, "CONTEXT.md")}`);
318
+ expect(clearContext).toContain("Always wear safety goggles");
313
319
  });
314
320
 
315
321
  it("#given static context remains in transcript but cache is missing #when SessionStart runs #then it emits no duplicate context", async () => {
@@ -8,8 +8,8 @@ import type { RuleCandidate } from "../src/rules/types.js";
8
8
 
9
9
  const projectRoot = "/tmp/codex-rules-engine";
10
10
 
11
- function makeCandidate(): RuleCandidate {
12
- return {
11
+ function makeCandidate(overrides: Partial<RuleCandidate> = {}): RuleCandidate {
12
+ const candidate = {
13
13
  path: join(projectRoot, ".omo", "rules", "typescript.md"),
14
14
  realPath: join(projectRoot, ".omo", "rules", "typescript.md"),
15
15
  source: ".omo/rules",
@@ -17,7 +17,8 @@ function makeCandidate(): RuleCandidate {
17
17
  isGlobal: false,
18
18
  isSingleFile: false,
19
19
  relativePath: ".omo/rules/typescript.md",
20
- };
20
+ } satisfies RuleCandidate;
21
+ return { ...candidate, ...overrides };
21
22
  }
22
23
 
23
24
  describe("rule engine dynamic matching", () => {
@@ -242,3 +243,64 @@ describe("rule engine default source selection", () => {
242
243
  expect(capturedDisabledSources?.has(".omo/rules")).toBe(true);
243
244
  });
244
245
  });
246
+
247
+ describe("rule engine static loading", () => {
248
+ it("#given multiple root single-file candidates #when loading static rules #then only one root single-file rule is selected", () => {
249
+ // given
250
+ const firstCandidate = makeCandidate({
251
+ path: join(projectRoot, "CONTEXT.md"),
252
+ realPath: join(projectRoot, "CONTEXT.md"),
253
+ source: "CONTEXT.md",
254
+ isSingleFile: true,
255
+ relativePath: "CONTEXT.md",
256
+ });
257
+ const secondCandidate = makeCandidate({
258
+ path: join(projectRoot, "nested", "CONTEXT.md"),
259
+ realPath: join(projectRoot, "nested", "CONTEXT.md"),
260
+ source: "CONTEXT.md",
261
+ isSingleFile: true,
262
+ relativePath: "nested/CONTEXT.md",
263
+ });
264
+ const deps = {
265
+ findProjectRoot: () => projectRoot,
266
+ findCandidates: () => [firstCandidate, secondCandidate],
267
+ readFile: () => "Shared project context.",
268
+ } satisfies EngineDeps;
269
+ const engine = createEngine(defaultConfig(), deps);
270
+
271
+ // when
272
+ const result = engine.loadStaticRules(projectRoot);
273
+
274
+ // then
275
+ expect(result.rules).toHaveLength(1);
276
+ expect(result.rules[0]?.matchReason).toBe("single-file");
277
+ });
278
+
279
+ it("#given project candidate resolves outside project #when loading static rules #then the rule is skipped with a diagnostic", () => {
280
+ // given
281
+ const outsidePath = "/tmp/codex-rules-outside/.omo/rules/typescript.md";
282
+ const outsideCandidate = makeCandidate({
283
+ path: outsidePath,
284
+ realPath: outsidePath,
285
+ });
286
+ const deps = {
287
+ findProjectRoot: () => projectRoot,
288
+ findCandidates: () => [outsideCandidate],
289
+ readFile: () => "Should not be read.",
290
+ } satisfies EngineDeps;
291
+ const engine = createEngine(defaultConfig(), deps);
292
+
293
+ // when
294
+ const result = engine.loadStaticRules(projectRoot);
295
+
296
+ // then
297
+ expect(result.rules).toEqual([]);
298
+ expect(result.diagnostics).toEqual([
299
+ {
300
+ severity: "warning",
301
+ source: outsidePath,
302
+ message: "Rule file resolves outside project root",
303
+ },
304
+ ]);
305
+ });
306
+ });
@@ -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,55 @@ 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
+
103
148
  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
149
  // given
105
150
  const rules = [