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
@@ -1,10 +1,23 @@
1
1
  import assert from "node:assert/strict";
2
- import { mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises";
2
+ import { mkdir, mkdtemp, readFile, utimes, writeFile } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import test from "node:test";
6
6
 
7
- import { resolveAutoUpdatePlan, runAutoUpdateCheck } from "../scripts/auto-update.mjs";
7
+ import { resolveAutoUpdatePlan, resolveLazyCodexUpdatePlan, runAutoUpdateCheck } from "../scripts/auto-update.mjs";
8
+ import { resolveSpawnInvocation } from "../scripts/spawn-command.mjs";
9
+
10
+ function autoUpdateEnv(root, extra = {}) {
11
+ return {
12
+ CODEX_HOME: join(root, "codex-home"),
13
+ LAZYCODEX_CURRENT_VERSION: "1.0.0",
14
+ LAZYCODEX_LATEST_VERSION: "1.0.1",
15
+ LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
16
+ LAZYCODEX_AUTO_UPDATE_STATE_PATH: join(root, "state.json"),
17
+ LAZYCODEX_AUTO_UPDATE_LOG_PATH: join(root, "auto-update.log"),
18
+ ...extra,
19
+ };
20
+ }
8
21
 
9
22
  test("#given auto update is disabled #when resolving plan #then no command is scheduled", () => {
10
23
  const plan = resolveAutoUpdatePlan({
@@ -19,14 +32,85 @@ test("#given auto update is disabled #when resolving plan #then no command is sc
19
32
 
20
33
  test("#given stale state #when resolving plan #then installer update command is scheduled", () => {
21
34
  const plan = resolveAutoUpdatePlan({
22
- env: {},
35
+ env: { LAZYCODEX_CURRENT_VERSION: "1.0.0", LAZYCODEX_LATEST_VERSION: "1.0.1" },
23
36
  now: 90_000_000,
24
37
  lastCheckedAt: 0,
25
38
  });
26
39
 
27
40
  assert.equal(plan.shouldRun, true);
28
41
  assert.deepEqual(plan.command, "npx");
29
- assert.deepEqual(plan.args, ["--yes", "lazycodex-ai@latest", "install", "--no-tui", "--skip-auth"]);
42
+ assert.deepEqual(plan.args, ["--yes", "lazycodex-ai@latest", "install", "--no-tui", "--codex-autonomous"]);
43
+ });
44
+
45
+ test("#given Windows npm shims #when resolving spawn commands #then cmd shims are used", () => {
46
+ assert.deepEqual(resolveSpawnInvocation("npm", ["install"], "win32"), {
47
+ command: "cmd.exe",
48
+ args: ["/d", "/s", "/c", "npm.cmd", "install"],
49
+ });
50
+ assert.deepEqual(resolveSpawnInvocation("npx", ["--yes", "lazycodex-ai@latest"], "win32"), {
51
+ command: "cmd.exe",
52
+ args: ["/d", "/s", "/c", "npx.cmd", "--yes", "lazycodex-ai@latest"],
53
+ });
54
+ assert.deepEqual(resolveSpawnInvocation("node", ["script.mjs"], "win32"), {
55
+ command: "node",
56
+ args: ["script.mjs"],
57
+ });
58
+ assert.deepEqual(resolveSpawnInvocation("npx", ["--yes"], "darwin"), {
59
+ command: "npx",
60
+ args: ["--yes"],
61
+ });
62
+ });
63
+
64
+ test("#given current version #when resolving update plan #then skips installer", () => {
65
+ const plan = resolveLazyCodexUpdatePlan({
66
+ currentVersion: "1.0.1",
67
+ latestVersion: "1.0.1",
68
+ });
69
+
70
+ assert.equal(plan.shouldUpdate, false);
71
+ assert.equal(plan.reason, "up-to-date");
72
+ });
73
+
74
+ test("#given latest version is newer #when resolving update plan #then schedules installer", () => {
75
+ const plan = resolveLazyCodexUpdatePlan({
76
+ currentVersion: "1.0.0",
77
+ latestVersion: "1.0.1",
78
+ });
79
+
80
+ assert.equal(plan.shouldUpdate, true);
81
+ assert.deepEqual(plan.command, "npx");
82
+ assert.deepEqual(plan.args, ["--yes", "lazycodex-ai@latest", "install", "--no-tui", "--codex-autonomous"]);
83
+ });
84
+
85
+ test("#given current version is a prerelease of latest #when resolving update plan #then schedules stable installer", () => {
86
+ const plan = resolveLazyCodexUpdatePlan({
87
+ currentVersion: "1.0.1-beta.1",
88
+ latestVersion: "1.0.1",
89
+ });
90
+
91
+ assert.equal(plan.shouldUpdate, true);
92
+ assert.deepEqual(plan.args, ["--yes", "lazycodex-ai@latest", "install", "--no-tui", "--codex-autonomous"]);
93
+ });
94
+
95
+ test("#given malformed latest version #when resolving update plan #then fails closed without scheduling", () => {
96
+ const plan = resolveLazyCodexUpdatePlan({
97
+ currentVersion: "1.0.0",
98
+ latestVersion: "latest",
99
+ });
100
+
101
+ assert.equal(plan.shouldUpdate, false);
102
+ assert.equal(plan.reason, "unknown-latest");
103
+ });
104
+
105
+ test("#given current version #when resolving auto update plan #then no command is scheduled", () => {
106
+ const plan = resolveAutoUpdatePlan({
107
+ env: { LAZYCODEX_CURRENT_VERSION: "1.0.1", LAZYCODEX_LATEST_VERSION: "1.0.1" },
108
+ now: 90_000_000,
109
+ lastCheckedAt: 0,
110
+ });
111
+
112
+ assert.equal(plan.shouldRun, false);
113
+ assert.equal(plan.reason, "up-to-date");
30
114
  });
31
115
 
32
116
  test("#given recent state #when resolving plan #then update is throttled", () => {
@@ -40,31 +124,47 @@ test("#given recent state #when resolving plan #then update is throttled", () =>
40
124
  assert.equal(plan.reason, "throttled");
41
125
  });
42
126
 
127
+ test("#given installed lazycodex version snapshot #when resolving auto update plan #then uses distribution version", async () => {
128
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-version-"));
129
+ const versionPath = join(root, "lazycodex-install.json");
130
+ await writeFile(versionPath, JSON.stringify({ packageName: "lazycodex-ai", version: "1.0.1" }));
131
+
132
+ const plan = resolveAutoUpdatePlan({
133
+ env: {
134
+ LAZYCODEX_INSTALLED_VERSION_PATH: versionPath,
135
+ LAZYCODEX_LATEST_VERSION: "1.0.1",
136
+ },
137
+ now: 90_000_000,
138
+ lastCheckedAt: 0,
139
+ });
140
+
141
+ assert.equal(plan.shouldRun, false);
142
+ assert.equal(plan.reason, "up-to-date");
143
+ });
144
+
43
145
  test("#given test command override #when running check #then records state and launches command", async () => {
44
146
  const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-"));
45
147
  const logPath = join(root, "spawn.log");
46
- const updateLogPath = join(root, "auto-update.log");
47
- const statePath = join(root, "state.json");
48
- const codexHome = join(root, "codex-home");
148
+ const env = autoUpdateEnv(root, {
149
+ LAZYCODEX_AUTO_UPDATE_INTERVAL_MS: "0",
150
+ LAZYCODEX_AUTO_UPDATE_COMMAND: process.execPath,
151
+ LAZYCODEX_AUTO_UPDATE_ARGS_JSON: JSON.stringify(["-e", `require("node:fs").writeFileSync(${JSON.stringify(logPath)}, "ok")`]),
152
+ LAZYCODEX_AUTO_UPDATE_WAIT: "1",
153
+ });
49
154
 
50
155
  const result = await runAutoUpdateCheck({
51
- env: {
52
- CODEX_HOME: codexHome,
53
- LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
54
- LAZYCODEX_AUTO_UPDATE_STATE_PATH: statePath,
55
- LAZYCODEX_AUTO_UPDATE_LOG_PATH: updateLogPath,
56
- LAZYCODEX_AUTO_UPDATE_INTERVAL_MS: "0",
57
- LAZYCODEX_AUTO_UPDATE_COMMAND: process.execPath,
58
- LAZYCODEX_AUTO_UPDATE_ARGS_JSON: JSON.stringify(["-e", `require("node:fs").writeFileSync(${JSON.stringify(logPath)}, "ok")`]),
59
- LAZYCODEX_AUTO_UPDATE_WAIT: "1",
60
- },
156
+ env,
61
157
  now: 123_456,
62
158
  });
63
159
 
64
160
  assert.equal(result.started, true);
65
- assert.equal(JSON.parse(await readFile(statePath, "utf8")).lastCheckedAt, 123_456);
161
+ assert.deepEqual(JSON.parse(await readFile(env.LAZYCODEX_AUTO_UPDATE_STATE_PATH, "utf8")), {
162
+ lastCheckedAt: 123_456,
163
+ lastAttemptedAt: 123_456,
164
+ lastStatus: "success",
165
+ });
66
166
  assert.equal(await readFile(logPath, "utf8"), "ok");
67
- const updateLog = (await readFile(updateLogPath, "utf8")).trim().split("\n").map((line) => JSON.parse(line));
167
+ const updateLog = (await readFile(env.LAZYCODEX_AUTO_UPDATE_LOG_PATH, "utf8")).trim().split("\n").map((line) => JSON.parse(line));
68
168
  assert.deepEqual(updateLog, [
69
169
  {
70
170
  timestamp: "1970-01-01T00:02:03.456Z",
@@ -78,43 +178,104 @@ test("#given test command override #when running check #then records state and l
78
178
  status: 0,
79
179
  },
80
180
  ]);
81
- assert.match(await readFile(join(codexHome, "config.toml"), "utf8"), /model = "gpt-5\.5"/);
181
+ assert.match(await readFile(join(env.CODEX_HOME, "config.toml"), "utf8"), /model = "gpt-5\.5"/);
182
+ });
183
+
184
+ test("#given failed waited update #when retry window passes #then next update is not blocked by success throttle", async () => {
185
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-retry-"));
186
+ const successPath = join(root, "success.log");
187
+ const baseEnv = autoUpdateEnv(root, {
188
+ LAZYCODEX_AUTO_UPDATE_WAIT: "1",
189
+ LAZYCODEX_AUTO_UPDATE_COMMAND: process.execPath,
190
+ });
191
+
192
+ const failed = await runAutoUpdateCheck({
193
+ env: {
194
+ ...baseEnv,
195
+ LAZYCODEX_AUTO_UPDATE_ARGS_JSON: JSON.stringify(["-e", "process.exit(1)"]),
196
+ },
197
+ now: 123_456,
198
+ });
199
+ assert.equal(failed.started, true);
200
+ assert.equal(failed.status, 1);
201
+ assert.deepEqual(JSON.parse(await readFile(baseEnv.LAZYCODEX_AUTO_UPDATE_STATE_PATH, "utf8")), {
202
+ lastAttemptedAt: 123_456,
203
+ lastStatus: "failed",
204
+ });
205
+
206
+ const retried = await runAutoUpdateCheck({
207
+ env: {
208
+ ...baseEnv,
209
+ LAZYCODEX_AUTO_UPDATE_ARGS_JSON: JSON.stringify(["-e", `require("node:fs").writeFileSync(${JSON.stringify(successPath)}, "ok")`]),
210
+ },
211
+ now: 123_456 + 30 * 60 * 1_000 + 1,
212
+ });
213
+
214
+ assert.equal(retried.started, true);
215
+ assert.equal(retried.status, 0);
216
+ assert.equal(await readFile(successPath, "utf8"), "ok");
82
217
  });
83
218
 
84
219
  test("#given active lock #when running check #then skips concurrent update", async () => {
85
220
  const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-lock-"));
86
- const statePath = join(root, "state.json");
87
221
  const lockPath = join(root, "state.json.lock");
88
- const codexHome = join(root, "codex-home");
89
222
  await writeFile(lockPath, "locked\n");
90
223
 
91
224
  const result = await runAutoUpdateCheck({
92
- env: {
93
- CODEX_HOME: codexHome,
94
- LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
95
- LAZYCODEX_AUTO_UPDATE_STATE_PATH: statePath,
225
+ env: autoUpdateEnv(root, {
96
226
  LAZYCODEX_AUTO_UPDATE_LOCK_PATH: lockPath,
97
227
  LAZYCODEX_AUTO_UPDATE_INTERVAL_MS: "0",
98
228
  LAZYCODEX_AUTO_UPDATE_LOCK_STALE_MS: "600000",
99
- },
229
+ }),
100
230
  now: 123_456,
101
231
  });
102
232
 
103
233
  assert.equal(result.started, false);
104
234
  assert.equal(result.reason, "locked");
105
- assert.match(await readFile(join(codexHome, "config.toml"), "utf8"), /model_context_window = 400000/);
235
+ assert.match(await readFile(join(root, "codex-home", "config.toml"), "utf8"), /model_context_window = 400000/);
236
+ });
237
+
238
+ test("#given stale lock #when running check #then removes lock and runs update", async () => {
239
+ const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-stale-lock-"));
240
+ const lockPath = join(root, "state.json.lock");
241
+ const successPath = join(root, "success.log");
242
+ await writeFile(lockPath, "locked\n");
243
+ await utimes(lockPath, new Date(0), new Date(0));
244
+ const env = autoUpdateEnv(root, {
245
+ LAZYCODEX_AUTO_UPDATE_LOCK_PATH: lockPath,
246
+ LAZYCODEX_AUTO_UPDATE_INTERVAL_MS: "0",
247
+ LAZYCODEX_AUTO_UPDATE_LOCK_STALE_MS: "600000",
248
+ LAZYCODEX_AUTO_UPDATE_WAIT: "1",
249
+ LAZYCODEX_AUTO_UPDATE_COMMAND: process.execPath,
250
+ LAZYCODEX_AUTO_UPDATE_ARGS_JSON: JSON.stringify(["-e", `require("node:fs").writeFileSync(${JSON.stringify(successPath)}, "ok")`]),
251
+ });
252
+
253
+ const result = await runAutoUpdateCheck({
254
+ env,
255
+ now: 1_000_000,
256
+ });
257
+
258
+ assert.equal(result.started, true);
259
+ assert.equal(result.status, 0);
260
+ assert.equal(await readFile(successPath, "utf8"), "ok");
261
+ assert.deepEqual(JSON.parse(await readFile(env.LAZYCODEX_AUTO_UPDATE_STATE_PATH, "utf8")), {
262
+ lastCheckedAt: 1_000_000,
263
+ lastAttemptedAt: 1_000_000,
264
+ lastStatus: "success",
265
+ });
106
266
  });
107
267
 
108
268
  test("#given throttled updater and stale Codex config #when running check #then config migration still runs", async () => {
109
269
  const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-migration-"));
110
270
  const statePath = join(root, "state.json");
271
+ const updateLogPath = join(root, "auto-update.log");
111
272
  const codexHome = join(root, "codex-home");
112
273
  await writeFile(statePath, JSON.stringify({ lastCheckedAt: 99_999 }, null, 2));
113
274
  await mkdir(codexHome, { recursive: true });
114
275
  await writeFile(
115
276
  join(codexHome, "config.toml"),
116
277
  [
117
- 'model = "gpt-5.2"',
278
+ 'model = "gpt-5.5"',
118
279
  "model_context_window = 272000",
119
280
  'model_reasoning_effort = "low"',
120
281
  'plan_mode_reasoning_effort = "medium"',
@@ -130,6 +291,7 @@ test("#given throttled updater and stale Codex config #when running check #then
130
291
  CODEX_HOME: codexHome,
131
292
  LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
132
293
  LAZYCODEX_AUTO_UPDATE_STATE_PATH: statePath,
294
+ LAZYCODEX_AUTO_UPDATE_LOG_PATH: updateLogPath,
133
295
  },
134
296
  now: 100_000,
135
297
  });
@@ -13,7 +13,7 @@ const EXPECTED_COMPONENT_BINS = new Map([
13
13
  ["start-work-continuation", "omo-start-work-continuation"],
14
14
  ["telemetry", "omo-telemetry"],
15
15
  ["ultrawork", "omo-ultrawork"],
16
- ["ulw-loop", "omo"],
16
+ ["ulw-loop", "omo-ulw-loop"],
17
17
  ]);
18
18
 
19
19
  const EXPECTED_USAGE_PREFIXES = new Map([
@@ -0,0 +1,29 @@
1
+ import assert from "node:assert/strict";
2
+ import { readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import test from "node:test";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const pluginRoot = dirname(dirname(fileURLToPath(import.meta.url)));
8
+
9
+ test("#given start-work continuation directive #when inspected #then final handoff requires review and debugging gate", async () => {
10
+ const text = await readFile(join(pluginRoot, "components", "start-work-continuation", "directive.md"), "utf8");
11
+
12
+ assert.match(text, /Global Review and Debugging Gate/);
13
+ assert.match(text, /review-work/);
14
+ assert.match(text, /debugging/);
15
+ assert.match(text, /Do not print `ORCHESTRATION COMPLETE`/);
16
+ assert.match(text, /Do not create a PR, PR handoff, or branch handoff/);
17
+ assert.match(text, /redact.*secrets.*PII/s);
18
+ });
19
+
20
+ test("#given Hephaestus baseline rule #when inspected #then significant implementation and PR handoff require the same gate", async () => {
21
+ const text = await readFile(join(pluginRoot, "components", "rules", "bundled-rules", "hephaestus.md"), "utf8");
22
+
23
+ assert.match(text, /Global Review and Debugging Gate/);
24
+ assert.match(text, /significant implementation work/);
25
+ assert.match(text, /review-work/);
26
+ assert.match(text, /debugging/);
27
+ assert.match(text, /PR handoff/);
28
+ assert.match(text, /redact.*secrets.*PII/s);
29
+ });
@@ -11,6 +11,7 @@ import {
11
11
  } from "../scripts/hook-status-message.mjs";
12
12
 
13
13
  const root = dirname(dirname(fileURLToPath(import.meta.url)));
14
+ const repoRoot = join(root, "..", "..", "..");
14
15
 
15
16
  const AGGREGATE_EXPECTED_LABELS = new Map([
16
17
  ["hooks/hooks.json:SessionStart:0:0", "Loading Project Rules"],
@@ -49,6 +50,18 @@ async function readJson(relativePath) {
49
50
  return JSON.parse(await readFile(join(root, relativePath), "utf8"));
50
51
  }
51
52
 
53
+ async function readRepoJson(relativePath) {
54
+ return JSON.parse(await readFile(join(repoRoot, relativePath), "utf8"));
55
+ }
56
+
57
+ async function readPluginVersion() {
58
+ return (await readJson(".codex-plugin/plugin.json")).version;
59
+ }
60
+
61
+ async function readComponentVersion(componentName) {
62
+ return (await readJson(join("components", componentName, "package.json"))).version;
63
+ }
64
+
52
65
  async function exists(relativePath) {
53
66
  try {
54
67
  await access(join(root, relativePath));
@@ -66,8 +79,8 @@ async function readComponentHookManifests() {
66
79
  if (!entry.isDirectory()) continue;
67
80
  const source = join("components", entry.name, "hooks", "hooks.json");
68
81
  if (!(await exists(source))) continue;
69
- const packageJson = await readJson(join("components", entry.name, "package.json"));
70
- manifests.push({ source, version: packageJson.version, hooks: await readJson(source) });
82
+ const version = await readComponentVersion(entry.name);
83
+ manifests.push({ source, version, hooks: await readJson(source) });
71
84
  }
72
85
  return manifests.sort((left, right) => left.source.localeCompare(right.source));
73
86
  }
@@ -91,16 +104,16 @@ function collectCommandHooks(hooks, source, version) {
91
104
  return commandHooks;
92
105
  }
93
106
 
94
- test("#given hook status label #when formatting #then prefixes LazyCodex with version", () => {
107
+ test("#given hook status label #when formatting #then prefixes LazyCodex with current version", async () => {
95
108
  // given
96
- const version = "0.1.0";
109
+ const version = (await readRepoJson("package.json")).version;
97
110
  const label = "Checking Comments";
98
111
 
99
112
  // when
100
113
  const message = formatLazyCodexHookStatusMessage(version, label);
101
114
 
102
115
  // then
103
- assert.equal(message, "LazyCodex(0.1.0): Checking Comments");
116
+ assert.equal(message, `LazyCodex(${version}): Checking Comments`);
104
117
  });
105
118
 
106
119
  test("#given hook status label with blank version #when formatting #then prefixes LazyCodex with local version", () => {
@@ -115,9 +128,9 @@ test("#given hook status label with blank version #when formatting #then prefixe
115
128
  assert.equal(message, "LazyCodex(local): Checking Comments");
116
129
  });
117
130
 
118
- test("#given loose legacy status label #when normalizing #then removes OMO wording and title-cases label", () => {
131
+ test("#given loose legacy status label #when normalizing #then removes OMO wording and title-cases label", async () => {
119
132
  // given
120
- const version = "0.1.0";
133
+ const version = (await readRepoJson("package.json")).version;
121
134
  const label = " checking OMO comments ";
122
135
 
123
136
  // when
@@ -126,12 +139,12 @@ test("#given loose legacy status label #when normalizing #then removes OMO wordi
126
139
 
127
140
  // then
128
141
  assert.equal(normalized, "Checking Comments");
129
- assert.equal(message, "LazyCodex(0.1.0): Checking Comments");
142
+ assert.equal(message, `LazyCodex(${version}): Checking Comments`);
130
143
  });
131
144
 
132
145
  test("#given aggregate comment-checker hook #when status is inspected #then it uses LazyCodex comments label", async () => {
133
146
  // given
134
- const aggregateVersion = (await readJson(".codex-plugin/plugin.json")).version;
147
+ const aggregateVersion = await readPluginVersion();
135
148
  const aggregateHooks = await readJson("hooks/hooks.json");
136
149
 
137
150
  // when
@@ -145,7 +158,7 @@ test("#given aggregate comment-checker hook #when status is inspected #then it u
145
158
 
146
159
  test("#given aggregate and component hooks #when status messages are inspected #then all use the LazyCodex formatter", async () => {
147
160
  // given
148
- const aggregateVersion = (await readJson(".codex-plugin/plugin.json")).version;
161
+ const aggregateVersion = await readPluginVersion();
149
162
  const aggregateHooks = await readJson("hooks/hooks.json");
150
163
  const componentManifests = await readComponentHookManifests();
151
164
 
@@ -0,0 +1,81 @@
1
+ import assert from "node:assert/strict";
2
+ import { readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import test from "node:test";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const root = dirname(dirname(fileURLToPath(import.meta.url)));
8
+
9
+ test("#given synced lcx-report-bug skill #when inspected #then it files LazyCodex bug issues with generated labels", async () => {
10
+ // given
11
+ const skillRoot = join(root, "skills", "lcx-report-bug");
12
+
13
+ // when
14
+ const skill = await readFile(join(skillRoot, "SKILL.md"), "utf8");
15
+ const interfaceMetadata = await readFile(join(skillRoot, "agents", "openai.yaml"), "utf8");
16
+
17
+ // then
18
+ assert.match(skill, /^---\r?\nname: lcx-report-bug\r?\n/m);
19
+ assert.match(skill, /code-yeongyu\/lazycodex/);
20
+ assert.match(skill, /openai\/codex/);
21
+ assert.match(skill, /\/tmp\/openai-codex-source/);
22
+ assert.match(skill, /\$omo:debugging/);
23
+ assert.match(skill, /Repository Decision/);
24
+ assert.match(skill, /TARGET_REPO="code-yeongyu\/lazycodex" # or openai\/codex/);
25
+ assert.match(skill, /LABEL_ARGS=\(\)/);
26
+ assert.match(skill, /gh label create lazycodex-generated.*--force/);
27
+ assert.match(skill, /gh issue create --repo "\$TARGET_REPO".*"\$\{LABEL_ARGS\[@\]\}"/);
28
+ assert.match(skill, /gh pr create --repo "\$TARGET_REPO".*"\$\{LABEL_ARGS\[@\]\}"/);
29
+ assert.match(skill, /lazycodex-generated/);
30
+ assert.match(skill, /This issue or PR was generated by LazyCodex/);
31
+ assert.match(skill, /Tag: lazycodex-generated/);
32
+ assert.match(skill, /Browser use fallback/);
33
+ assert.match(skill, /Computer use fallback/);
34
+ assert.match(skill, /## Issue Body Template/);
35
+ assert.match(interfaceMetadata, /display_name: "lcx-report-bug \(omo\)"/);
36
+ assert.match(interfaceMetadata, /- "lazycodex bug"/);
37
+ assert.match(interfaceMetadata, /- "openai codex bug"/);
38
+ });
39
+
40
+ test("#given synced lcx-contribute-bug-fix skill #when inspected #then it contributes LazyCodex bug-fix PRs from fresh temp workspaces", async () => {
41
+ // given
42
+ const skillRoot = join(root, "skills", "lcx-contribute-bug-fix");
43
+
44
+ // when
45
+ const skill = await readFile(join(skillRoot, "SKILL.md"), "utf8");
46
+ const interfaceMetadata = await readFile(join(skillRoot, "agents", "openai.yaml"), "utf8");
47
+ const script = await readFile(join(skillRoot, "scripts", "create-pr-body.mjs"), "utf8");
48
+
49
+ // then
50
+ assert.match(skill, /^---\r?\nname: lcx-contribute-bug-fix\r?\n/m);
51
+ assert.match(skill, /Contribute a verified bug-fix PR/);
52
+ assert.match(skill, /fresh `\/tmp` clone\/worktree/);
53
+ assert.match(skill, /\/tmp\/lazycodex-fix-/);
54
+ assert.match(skill, /git worktree add/);
55
+ assert.match(skill, /apply `lazycodex-generated` when label management is available/);
56
+ assert.match(skill, /git add -A/);
57
+ assert.match(skill, /git commit -m/);
58
+ assert.match(skill, /git log --oneline "origin\/\$BASE_BRANCH\.\.HEAD"/);
59
+ assert.match(skill, /gh repo fork "\$TARGET_REPO" --remote --remote-name fork/);
60
+ assert.match(skill, /PUSH_REMOTE/);
61
+ assert.match(skill, /lazycodex-generated/);
62
+ assert.match(skill, /LABEL_ARGS=\(\)/);
63
+ assert.match(skill, /gh label create lazycodex-generated.*--force/);
64
+ assert.match(skill, /gh pr create --repo "\$TARGET_REPO".*"\$\{LABEL_ARGS\[@\]\}"/);
65
+ assert.match(skill, /--head "\$PR_HEAD"/);
66
+ assert.doesNotMatch(skill, /a PR without the `lazycodex-generated` label/);
67
+ assert.match(skill, /scripts\/create-pr-body\.mjs/);
68
+ assert.match(skill, /## Problem Situation/);
69
+ assert.match(skill, /## Reproduction Logs/);
70
+ assert.match(skill, /## Approach/);
71
+ assert.match(skill, /## Why I Am Confident/);
72
+ assert.match(skill, /## Risks/);
73
+ assert.match(skill, /## User-Visible Behavior Changes/);
74
+ assert.match(skill, /Clean up/);
75
+ assert.match(interfaceMetadata, /display_name: "lcx-contribute-bug-fix \(omo\)"/);
76
+ assert.match(interfaceMetadata, /- "contribute a bug fix"/);
77
+ assert.match(interfaceMetadata, /- "fix bug pr"/);
78
+ assert.match(script, /createLazyCodexBugFixPrBody/);
79
+ assert.match(script, /Problem Situation/);
80
+ assert.match(script, /Why I Am Confident/);
81
+ });
@@ -0,0 +1,91 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtemp, readFile, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { test } from "node:test";
6
+ import { fileURLToPath } from "node:url";
7
+
8
+ const root = dirname(dirname(fileURLToPath(import.meta.url)));
9
+ const scriptPath = join(root, "skills", "lcx-contribute-bug-fix", "scripts", "create-pr-body.mjs");
10
+
11
+ test("#given complete bug-fix evidence #when creating a PR body #then required LazyCodex sections and label are emitted", async () => {
12
+ // given
13
+ const { createLazyCodexBugFixPrBody } = await import(`file://${scriptPath}`);
14
+ const input = {
15
+ title: "Fix Codex skill sync drift",
16
+ targetRepository: "code-yeongyu/lazycodex",
17
+ problem: "Skill sync omitted a shared skill from the aggregate plugin.",
18
+ reproductionLogs: "npm test -- --test-name-pattern sync-skills failed before the fix.",
19
+ approach: "Add the missing shared skill source and sync the aggregate plugin.",
20
+ confidence: "The failing sync test now passes and the aggregate skill matches the source.",
21
+ risks: "Low risk; this changes only packaged skill instructions.",
22
+ userVisibleBehaviorChanges: "Users can ask LazyCodex to contribute a bug-fix PR directly.",
23
+ verification: ["npm test -- --test-name-pattern lcx-contribute-bug-fix", "npm run sync:skills"],
24
+ };
25
+
26
+ // when
27
+ const body = createLazyCodexBugFixPrBody(input);
28
+
29
+ // then
30
+ assert.match(body, /^## Problem Situation/m);
31
+ assert.match(body, /## Reproduction Logs/);
32
+ assert.match(body, /## Approach/);
33
+ assert.match(body, /## Why I Am Confident/);
34
+ assert.match(body, /## Risks/);
35
+ assert.match(body, /## User-Visible Behavior Changes/);
36
+ assert.match(body, /## Verification/);
37
+ assert.match(body, /lazycodex-generated/);
38
+ assert.match(body, /This PR was debugged, implemented, and created with \[LazyCodex\]/);
39
+ });
40
+
41
+ test("#given missing bug-fix evidence #when creating a PR body #then the script rejects the incomplete payload", async () => {
42
+ // given
43
+ const { createLazyCodexBugFixPrBody } = await import(`file://${scriptPath}`);
44
+
45
+ // when
46
+ const action = () =>
47
+ createLazyCodexBugFixPrBody({
48
+ title: "Fix Codex skill sync drift",
49
+ targetRepository: "code-yeongyu/lazycodex",
50
+ problem: "Skill sync omitted a shared skill from the aggregate plugin.",
51
+ reproductionLogs: "",
52
+ approach: "Add the missing shared skill source and sync the aggregate plugin.",
53
+ confidence: "The failing sync test now passes.",
54
+ risks: "Low risk.",
55
+ userVisibleBehaviorChanges: "Users get a new skill.",
56
+ verification: ["npm test"],
57
+ });
58
+
59
+ // then
60
+ assert.throws(action, /reproductionLogs must be a non-empty string/);
61
+ });
62
+
63
+ test("#given a JSON payload path #when running the PR body script #then markdown is written to the requested file", async () => {
64
+ // given
65
+ const workspace = await mkdtemp(join(tmpdir(), "lcx-pr-body-test-"));
66
+ const inputPath = join(workspace, "input.json");
67
+ const outputPath = join(workspace, "body.md");
68
+ await writeFile(
69
+ inputPath,
70
+ JSON.stringify({
71
+ title: "Fix Codex skill sync drift",
72
+ targetRepository: "code-yeongyu/lazycodex",
73
+ problem: "Skill sync omitted a shared skill from the aggregate plugin.",
74
+ reproductionLogs: "node --test failed before the fix.",
75
+ approach: "Add the missing shared skill source and sync the aggregate plugin.",
76
+ confidence: "The failing sync test now passes.",
77
+ risks: "Low risk.",
78
+ userVisibleBehaviorChanges: "Users get a direct bug-fix PR skill.",
79
+ verification: ["node --test test/lcx-contribute-bug-fix-template.test.mjs"],
80
+ }),
81
+ "utf8",
82
+ );
83
+
84
+ // when
85
+ const { spawnSync } = await import("node:child_process");
86
+ const result = spawnSync(process.execPath, [scriptPath, inputPath, outputPath], { encoding: "utf8" });
87
+
88
+ // then
89
+ assert.equal(result.status, 0, result.stderr);
90
+ assert.match(await readFile(outputPath, "utf8"), /## User-Visible Behavior Changes/);
91
+ });