lazycodex-ai 5.0.0-beta.6 → 5.0.0-beta.60

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 (635) hide show
  1. package/README.ja.md +65 -60
  2. package/README.ko.md +66 -61
  3. package/README.md +65 -72
  4. package/README.ru.md +62 -60
  5. package/README.zh-cn.md +61 -60
  6. package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
  7. package/dist/cli/doctor/checks/index.d.ts +2 -0
  8. package/dist/cli/doctor/checks/latest-version.d.ts +11 -0
  9. package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
  10. package/dist/cli/doctor/framework/constants.d.ts +5 -0
  11. package/dist/cli/doctor/framework/types.d.ts +2 -0
  12. package/dist/cli/fallback-lane-policy.d.ts +1 -0
  13. package/dist/cli/index.js +51738 -59690
  14. package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
  15. package/dist/cli/run/on-complete-hook.d.ts +2 -0
  16. package/dist/cli/runtime-commands.d.ts +1 -1
  17. package/dist/cli/worktree-sweep/classify.d.ts +16 -0
  18. package/dist/cli/worktree-sweep/format.d.ts +8 -0
  19. package/dist/cli/worktree-sweep/git.d.ts +19 -0
  20. package/dist/cli/worktree-sweep/index.d.ts +7 -0
  21. package/dist/cli/worktree-sweep/options.d.ts +2 -0
  22. package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
  23. package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
  24. package/dist/cli/worktree-sweep/types.d.ts +65 -0
  25. package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
  26. package/dist/cli-node/index.js +50900 -58829
  27. package/package.json +11 -9
  28. package/packages/git-bash-mcp/dist/cli.js +6 -1
  29. package/packages/lsp-daemon/dist/cli.js +902 -479
  30. package/packages/lsp-daemon/dist/client.d.ts +10 -0
  31. package/packages/lsp-daemon/dist/client.js +920 -493
  32. package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
  33. package/packages/lsp-daemon/dist/daemon-client.js +3 -0
  34. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +6 -1
  35. package/packages/lsp-daemon/dist/ensure-daemon.js +10 -2
  36. package/packages/lsp-daemon/dist/index.js +824 -402
  37. package/packages/lsp-daemon/dist/ownership.js +2 -2
  38. package/packages/lsp-daemon/dist/proxy.js +3 -0
  39. package/packages/lsp-daemon/dist/version-reap.js +1 -1
  40. package/packages/lsp-daemon/package.json +1 -1
  41. package/packages/lsp-tools-mcp/dist/cli.js +762 -341
  42. package/packages/lsp-tools-mcp/dist/lsp/manager.js +272 -138
  43. package/packages/lsp-tools-mcp/dist/mcp.js +787 -368
  44. package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
  45. package/packages/lsp-tools-mcp/dist/tools.js +717 -302
  46. package/packages/lsp-tools-mcp/package.json +1 -1
  47. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
  48. package/packages/omo-codex/plugin/.mcp.json +0 -6
  49. package/packages/omo-codex/plugin/AGENTS.md +47 -0
  50. package/packages/omo-codex/plugin/README.md +6 -2
  51. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +197 -148
  52. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  53. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  54. package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
  55. package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
  56. package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
  57. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
  58. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  59. package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
  60. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
  61. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
  62. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
  63. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
  64. package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
  65. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +1 -1
  66. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +2 -1
  67. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  68. package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
  69. package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +2 -1
  70. package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +6 -7
  71. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  72. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
  73. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
  74. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +36 -29
  75. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +32 -26
  76. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
  77. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  78. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
  79. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +32 -28
  80. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
  81. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  82. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +137 -28
  83. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +4 -2
  84. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
  85. package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
  86. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
  87. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +941 -540
  88. package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
  89. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  90. package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
  91. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  92. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
  93. package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
  94. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
  95. package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
  96. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
  97. package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
  98. package/packages/omo-codex/plugin/components/rules/README.md +2 -0
  99. package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
  100. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +123 -0
  101. package/packages/omo-codex/plugin/components/rules/dist/cli.js +91 -68
  102. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  103. package/packages/omo-codex/plugin/components/rules/package.json +7 -7
  104. package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
  105. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
  106. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +15 -5
  107. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
  108. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
  109. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  110. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
  111. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  112. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  113. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  114. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  115. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  116. package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
  117. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
  118. package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
  119. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
  120. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -3
  121. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  122. package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
  123. package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
  124. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
  125. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +29 -6
  126. package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
  127. package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
  128. package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
  129. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
  130. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  131. package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
  132. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +4 -10
  133. package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
  134. package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
  135. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2407 -684
  136. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2411 -689
  137. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  138. package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
  139. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
  140. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
  141. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
  142. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
  143. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
  144. package/packages/omo-codex/plugin/components/ultrawork/README.md +2 -0
  145. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  146. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
  147. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
  148. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
  149. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
  150. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
  151. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
  152. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
  153. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
  154. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
  155. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
  156. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  157. package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
  158. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +490 -4
  159. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  160. package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -6
  161. package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
  162. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -7
  163. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +31 -7
  164. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
  165. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +5 -5
  166. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
  167. package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
  168. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
  169. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  170. package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
  171. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
  172. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  173. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +4 -4
  174. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
  175. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +6 -6
  176. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
  177. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +10 -10
  178. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +16 -16
  179. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +16 -0
  180. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
  181. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
  182. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
  183. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +4 -4
  184. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
  185. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
  186. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +1 -1
  187. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
  188. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +4 -11
  189. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +24 -22
  190. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
  191. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -1
  192. package/packages/omo-codex/plugin/components/ulw-loop/README.md +12 -1
  193. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
  194. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +26 -13
  195. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +16 -0
  196. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +25 -0
  197. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +10 -4
  198. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +2 -5
  199. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -78
  200. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +12 -0
  201. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +114 -0
  202. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +7 -1
  203. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +50 -42
  204. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +2 -2
  205. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +21 -8
  206. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
  207. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
  208. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
  209. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +40 -37
  210. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +1396 -516
  211. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
  212. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +28 -8
  213. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +2 -5
  214. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +24 -20
  215. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -0
  216. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +1 -0
  217. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +17 -9
  218. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +1 -0
  219. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +13 -4
  220. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +1 -0
  221. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +34 -4
  222. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +14 -0
  223. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +29 -0
  224. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
  225. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
  226. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
  227. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
  228. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
  229. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
  230. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
  231. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
  232. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +72 -117
  233. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +2 -0
  234. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +16 -7
  235. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.d.ts +2 -0
  236. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.js +125 -0
  237. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.d.ts +46 -0
  238. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.js +28 -0
  239. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.d.ts +127 -0
  240. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.js +1 -0
  241. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.d.ts +3 -0
  242. package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.js +3 -0
  243. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +6 -1
  244. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +195 -29
  245. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +9 -0
  246. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +227 -0
  247. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +6 -0
  248. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +33 -0
  249. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +20 -6
  250. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +19 -0
  251. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +75 -0
  252. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +17 -4
  253. package/packages/omo-codex/plugin/components/ulw-loop/package.json +6 -6
  254. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +10 -4
  255. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
  256. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +32 -8
  257. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +40 -0
  258. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +8 -6
  259. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +5 -98
  260. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
  261. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +52 -73
  262. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +10 -4
  263. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +24 -8
  264. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
  265. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +52 -46
  266. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +8 -6
  267. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +35 -7
  268. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +34 -28
  269. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
  270. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +1 -0
  271. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +19 -9
  272. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +25 -4
  273. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +39 -4
  274. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +38 -0
  275. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
  276. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
  277. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +71 -15
  278. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
  279. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +92 -136
  280. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +29 -8
  281. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/factory.ts +159 -0
  282. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/manifest.ts +42 -0
  283. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/types.ts +140 -0
  284. package/packages/omo-codex/plugin/components/ulw-loop/src/sdk.ts +3 -0
  285. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +205 -28
  286. package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +239 -0
  287. package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +36 -0
  288. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +19 -6
  289. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +107 -0
  290. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  291. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +131 -82
  292. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +147 -0
  293. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +16 -22
  294. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +4 -2
  295. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +31 -2
  296. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -0
  297. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +3 -1
  298. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +35 -8
  299. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +38 -4
  300. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +27 -0
  301. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-scope-required.test.ts +144 -0
  302. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +185 -0
  303. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +8 -3
  304. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +6 -0
  305. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +37 -2
  306. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +52 -11
  307. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  308. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/cli-session.ts +4 -0
  309. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +9 -4
  310. package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +67 -0
  311. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
  312. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
  313. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io-cross-process.test.ts +106 -0
  314. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +36 -2
  315. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
  316. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
  317. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-fields-messages.test.ts +98 -0
  318. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-lazycodex-surface.test.ts +93 -0
  319. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
  320. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +51 -2
  321. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
  322. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
  323. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +58 -3
  324. package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +9 -7
  325. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +137 -0
  326. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-session-context.test.ts +148 -0
  327. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +444 -7
  328. package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +218 -0
  329. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
  330. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
  331. package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
  332. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +13 -8
  333. package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
  334. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  335. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  336. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  337. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  338. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  339. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  340. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  341. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +18 -0
  342. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  343. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  344. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  345. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  346. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  347. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  348. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  349. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
  350. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  351. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  352. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  353. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  354. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  355. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  356. package/packages/omo-codex/plugin/package-lock.json +676 -524
  357. package/packages/omo-codex/plugin/package.json +2 -3
  358. package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
  359. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
  360. package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
  361. package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
  362. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
  363. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  364. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
  365. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +19 -90
  366. package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
  367. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +94 -55
  368. package/packages/omo-codex/plugin/shared/package.json +3 -4
  369. package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
  370. package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
  371. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
  372. package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
  373. package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +1 -1
  374. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
  375. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
  376. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
  377. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
  378. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
  379. package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
  380. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
  381. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
  382. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  383. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  384. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +3 -1
  385. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
  386. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
  387. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
  388. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
  389. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
  390. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
  391. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
  392. package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
  393. package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  394. package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
  395. package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
  396. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -0
  397. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +15 -8
  398. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +10 -2
  399. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +2 -0
  400. package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +145 -0
  401. package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +2 -0
  402. package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
  403. package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
  404. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
  405. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  406. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  407. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  408. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
  409. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
  410. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  411. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +18 -16
  412. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +4 -2
  413. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
  414. package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -1
  415. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +8 -6
  416. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +5 -3
  417. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +114 -422
  418. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
  419. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +26 -9
  420. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  421. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
  422. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
  423. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  424. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +26 -13
  425. package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +29 -31
  426. package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
  427. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +34 -4
  428. package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
  429. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +32 -8
  430. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -7
  431. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +31 -7
  432. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
  433. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +5 -5
  434. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +12 -5
  435. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
  436. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +8 -5
  437. package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
  438. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  439. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +16 -51
  440. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
  441. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  442. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
  443. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  444. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  445. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  446. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -29
  447. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  448. package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
  449. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
  450. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
  451. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +88 -2
  452. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +5 -6
  453. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  454. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  455. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
  456. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
  457. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  458. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
  459. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +168 -0
  460. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +54 -24
  461. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +18 -119
  462. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  463. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  464. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  465. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  466. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  467. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
  468. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  469. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2987 -1370
  470. package/packages/{omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md → prompts-core/prompts/ultrawork/codex.md} +26 -20
  471. package/packages/shared-skills/package.json +7 -1
  472. package/packages/shared-skills/skill-source-filter.d.ts +16 -0
  473. package/packages/shared-skills/skill-source-filter.mjs +44 -0
  474. package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
  475. package/packages/shared-skills/skills/ast-grep/SKILL.md +1 -1
  476. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
  477. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  478. package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
  479. package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
  480. package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
  481. package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
  482. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
  483. package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
  484. package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  485. package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  486. package/packages/shared-skills/skills/debugging/SKILL.md +3 -1
  487. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
  488. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
  489. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
  490. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
  491. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
  492. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
  493. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
  494. package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
  495. package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
  496. package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  497. package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
  498. package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
  499. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -0
  500. package/packages/shared-skills/skills/frontend/SKILL.md +15 -8
  501. package/packages/shared-skills/skills/frontend/references/design/README.md +10 -2
  502. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +2 -0
  503. package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +145 -0
  504. package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +2 -0
  505. package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
  506. package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
  507. package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
  508. package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  509. package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  510. package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  511. package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
  512. package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
  513. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  514. package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
  515. package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
  516. package/packages/shared-skills/skills/programming/SKILL.md +1 -1
  517. package/packages/shared-skills/skills/refactor/SKILL.md +4 -4
  518. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  519. package/packages/shared-skills/skills/review-work/SKILL.md +101 -419
  520. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
  521. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +26 -9
  522. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  523. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
  524. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
  525. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  526. package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +20 -19
  527. package/packages/shared-skills/skills/ulw-plan/SKILL.md +7 -8
  528. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +31 -7
  529. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
  530. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +5 -5
  531. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
  532. package/packages/shared-skills/skills/ulw-research/SKILL.md +8 -3
  533. package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
  534. package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
  535. package/script/qa/web-terminal-visual-qa.mjs +2 -0
  536. package/script/qa/xterm-live-terminal.mjs +18 -2
  537. package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
  538. package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
  539. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
  540. package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
  541. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
  542. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  543. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  544. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  545. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12149
  546. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9747
  547. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  548. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  549. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  550. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  551. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  552. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  553. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  554. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
  555. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
  556. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  557. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  558. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  559. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  560. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  561. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
  562. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  563. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  564. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  565. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  566. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  567. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  568. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  569. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  570. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  571. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  572. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  573. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  574. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  575. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  576. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  577. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  578. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  579. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  580. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  581. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  582. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  583. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  584. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  585. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  586. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  587. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  588. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  589. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  590. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  591. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  592. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  593. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  594. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  595. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  596. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  597. package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
  598. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
  599. package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -471
  600. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  601. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  602. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
  603. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
  604. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  605. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  606. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  607. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  608. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
  609. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
  610. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
  611. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
  612. package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
  613. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  614. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  615. package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
  616. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  617. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
  618. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
  619. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
  620. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
  621. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
  622. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
  623. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
  624. /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
  625. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
  626. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
  627. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
  628. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
  629. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
  630. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
  631. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
  632. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
  633. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
  634. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
  635. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
@@ -0,0 +1,159 @@
1
+ import { checkpointUlwLoop } from "../checkpoint.js";
2
+ import { checkpointTemplate } from "../checkpoint-template.js";
3
+ import { recordEvidence } from "../evidence.js";
4
+ import { type UlwLoopScope, ulwLoopAttemptEvidenceDir } from "../paths.js";
5
+ import { addUlwLoopGoal, createUlwLoopPlan, startNextUlwLoop, summarizeUlwLoopPlan } from "../plan-crud.js";
6
+ import { readUlwLoopPlan } from "../plan-io.js";
7
+ import { recordFinalReviewBlockers } from "../review-blockers.js";
8
+ import { UlwLoopError } from "../runtime.js";
9
+ import { statusNextActions } from "../status-next-actions.js";
10
+ import { steerUlwLoop } from "../steering.js";
11
+ import type { UlwLoopOperation } from "./manifest.js";
12
+ import { ULW_LOOP_MANIFEST } from "./manifest.js";
13
+ import type {
14
+ AgentToolkit,
15
+ AgentToolkitDependencies,
16
+ CheckpointArgs,
17
+ ToolkitContext,
18
+ ToolkitDispatchRequest,
19
+ ToolkitDispatchResponse,
20
+ ToolkitError,
21
+ ToolkitFailure,
22
+ ToolkitResponseFor,
23
+ ToolkitResultFor,
24
+ ToolkitUnknownRequest,
25
+ } from "./types.js";
26
+
27
+ function validateContext(context: ToolkitContext): void {
28
+ if (!context.cwd.trim()) throw new UlwLoopError("cwd is required.", "ULW_LOOP_CWD_REQUIRED");
29
+ if (!context.sessionId.trim())
30
+ throw new UlwLoopError("ULW_LOOP_SESSION_ID_REQUIRED: sessionId is required.", "ULW_LOOP_SESSION_ID_REQUIRED");
31
+ if (context.surface !== "omo-senpi" && context.surface !== "lazycodex")
32
+ throw new UlwLoopError("surface must be omo-senpi or lazycodex.", "ULW_LOOP_SURFACE_INVALID");
33
+ }
34
+
35
+ function errorDetails(error: UlwLoopError): ToolkitError {
36
+ const details =
37
+ error.details === undefined
38
+ ? undefined
39
+ : Object.fromEntries(Object.entries(error.details).map(([key, value]) => [key, String(value)]));
40
+ return details === undefined
41
+ ? { code: error.code, message: error.message }
42
+ : { code: error.code, message: error.message, details };
43
+ }
44
+
45
+ function failure<Operation extends string>(operation: Operation, error: UlwLoopError): ToolkitFailure<Operation> {
46
+ return { ok: false, operation, error: errorDetails(error) };
47
+ }
48
+
49
+ function caught<Operation extends string>(operation: Operation, error: Error): ToolkitFailure<Operation> {
50
+ return failure(operation, error instanceof UlwLoopError ? error : new UlwLoopError(error.message, "ULW_LOOP_ERROR"));
51
+ }
52
+
53
+ function isKnownRequest(request: ToolkitDispatchRequest | ToolkitUnknownRequest): request is ToolkitDispatchRequest {
54
+ return ULW_LOOP_MANIFEST.operations.some((operation) => operation.name === request.operation);
55
+ }
56
+
57
+ function unreachable(value: never): never {
58
+ throw new UlwLoopError(`Unhandled operation: ${String(value)}`, "ULW_LOOP_OPERATION_UNHANDLED");
59
+ }
60
+
61
+ function nextActionsFrom(result: object): readonly string[] {
62
+ if (!("nextActions" in result) || !Array.isArray(result.nextActions)) return [];
63
+ return result.nextActions.filter((action): action is string => typeof action === "string").slice(0, 8);
64
+ }
65
+
66
+ export function createAgentToolkit(context: ToolkitContext, deps: AgentToolkitDependencies = {}): AgentToolkit {
67
+ validateContext(context);
68
+ const scope: UlwLoopScope = { sessionId: context.sessionId };
69
+ const notify = async <Operation extends UlwLoopOperation>(
70
+ operation: Operation,
71
+ response: ToolkitResponseFor<Operation>,
72
+ ): Promise<ToolkitResponseFor<Operation>> => {
73
+ if (deps.hooks?.onOperation !== undefined) await deps.hooks.onOperation({ operation, context, response });
74
+ return response;
75
+ };
76
+ const invoke = async <Operation extends UlwLoopOperation>(
77
+ operation: Operation,
78
+ fn: () => Promise<ToolkitResultFor<Operation>>,
79
+ ): Promise<ToolkitResponseFor<Operation>> => {
80
+ try {
81
+ const result = await fn();
82
+ const nextActions = typeof result === "object" && result !== null ? nextActionsFrom(result) : [];
83
+ return await notify(operation, { ok: true, operation, result, nextActions });
84
+ } catch (error) {
85
+ const response = caught(operation, error instanceof Error ? error : new Error("ULW_LOOP_ERROR"));
86
+ return notify(operation, response);
87
+ }
88
+ };
89
+ const toolkit: AgentToolkit = {
90
+ dispatch: async (request): Promise<ToolkitDispatchResponse> => {
91
+ if (!isKnownRequest(request))
92
+ return failure(
93
+ request.operation,
94
+ new UlwLoopError(`Unknown operation: ${request.operation}`, "ULW_LOOP_OPERATION_UNKNOWN"),
95
+ );
96
+ switch (request.operation) {
97
+ case "help":
98
+ return toolkit.help();
99
+ case "create-goals":
100
+ return toolkit.createGoals(request.args);
101
+ case "status":
102
+ return toolkit.status();
103
+ case "complete-goals":
104
+ return toolkit.completeGoals(request.args);
105
+ case "checkpoint":
106
+ return toolkit.checkpoint(request.args);
107
+ case "steer":
108
+ return toolkit.steer(request.args);
109
+ case "add-goal":
110
+ return toolkit.addGoal(request.args);
111
+ case "criteria":
112
+ return toolkit.criteria(request.args);
113
+ case "record-evidence":
114
+ return toolkit.recordEvidence(request.args);
115
+ case "record-review-blockers":
116
+ return toolkit.recordReviewBlockers(request.args);
117
+ default:
118
+ return unreachable(request);
119
+ }
120
+ },
121
+ help: () => invoke("help", async () => ULW_LOOP_MANIFEST),
122
+ createGoals: (args) => invoke("create-goals", () => createUlwLoopPlan(context.cwd, args, scope)),
123
+ status: () =>
124
+ invoke("status", async () => {
125
+ const plan = await readUlwLoopPlan(context.cwd, scope);
126
+ const active = plan.goals.find((goal) => goal.id === plan.activeGoalId);
127
+ return {
128
+ plan,
129
+ summary: summarizeUlwLoopPlan(plan),
130
+ nextActions: statusNextActions(plan),
131
+ // Attempt directories are an evidence-layout v2 concept; a v1 plan must not advertise one.
132
+ ...(active === undefined || plan.evidenceLayoutVersion !== 2
133
+ ? {}
134
+ : { currentAttemptDir: ulwLoopAttemptEvidenceDir(active.id, active.attempt, scope) }),
135
+ };
136
+ }),
137
+ completeGoals: (args = {}) => invoke("complete-goals", () => startNextUlwLoop(context.cwd, args, scope)),
138
+ checkpoint: (args: CheckpointArgs) =>
139
+ invoke("checkpoint", () =>
140
+ args.printTemplate === true
141
+ ? checkpointTemplate(context.cwd, scope, args.goalId, { surface: context.surface })
142
+ : checkpointUlwLoop(context.cwd, args, scope, { surface: context.surface }),
143
+ ),
144
+ steer: (args) => invoke("steer", () => steerUlwLoop(context.cwd, args, scope)),
145
+ addGoal: (args) => invoke("add-goal", () => addUlwLoopGoal(context.cwd, args, scope)),
146
+ criteria: (args) =>
147
+ invoke("criteria", async () => {
148
+ const plan = await readUlwLoopPlan(context.cwd, scope);
149
+ const goal = plan.goals.find((candidate) => candidate.id === args.goalId);
150
+ if (goal === undefined)
151
+ throw new UlwLoopError(`Unknown ulw-loop id: ${args.goalId}.`, "ULW_LOOP_GOAL_NOT_FOUND");
152
+ return { goalId: goal.id, criteria: goal.successCriteria };
153
+ }),
154
+ recordEvidence: (args) => invoke("record-evidence", () => recordEvidence(context.cwd, args, scope)),
155
+ recordReviewBlockers: (args) =>
156
+ invoke("record-review-blockers", () => recordFinalReviewBlockers(context.cwd, args, scope)),
157
+ };
158
+ return toolkit;
159
+ }
@@ -0,0 +1,42 @@
1
+ export const ULW_LOOP_OPERATIONS = [
2
+ "help",
3
+ "create-goals",
4
+ "status",
5
+ "complete-goals",
6
+ "checkpoint",
7
+ "steer",
8
+ "add-goal",
9
+ "criteria",
10
+ "record-evidence",
11
+ "record-review-blockers",
12
+ ] as const;
13
+
14
+ export type UlwLoopOperation = (typeof ULW_LOOP_OPERATIONS)[number];
15
+
16
+ export interface ToolkitOperationManifest {
17
+ readonly name: UlwLoopOperation;
18
+ readonly mutating: boolean;
19
+ }
20
+
21
+ export interface ToolkitManifest {
22
+ readonly version: 1;
23
+ readonly name: "ulw-loop";
24
+ readonly operations: readonly ToolkitOperationManifest[];
25
+ }
26
+
27
+ export const ULW_LOOP_MANIFEST = {
28
+ version: 1,
29
+ name: "ulw-loop",
30
+ operations: [
31
+ { name: "help", mutating: false },
32
+ { name: "create-goals", mutating: true },
33
+ { name: "status", mutating: false },
34
+ { name: "complete-goals", mutating: true },
35
+ { name: "checkpoint", mutating: true },
36
+ { name: "steer", mutating: true },
37
+ { name: "add-goal", mutating: true },
38
+ { name: "criteria", mutating: false },
39
+ { name: "record-evidence", mutating: true },
40
+ { name: "record-review-blockers", mutating: true },
41
+ ] satisfies readonly ToolkitOperationManifest[],
42
+ } satisfies ToolkitManifest;
@@ -0,0 +1,140 @@
1
+ import type { CheckpointUlwLoopArgs, CheckpointUlwLoopResult } from "../checkpoint.js";
2
+ import type { CheckpointTemplate } from "../checkpoint-template.js";
3
+ import type { recordEvidence } from "../evidence.js";
4
+ import type { addUlwLoopGoal, createUlwLoopPlan, startNextUlwLoop, summarizeUlwLoopPlan } from "../plan-crud.js";
5
+ import type { recordFinalReviewBlockers } from "../review-blockers.js";
6
+ import type { steerUlwLoop } from "../steering.js";
7
+ import type { UlwLoopSteeringProposal } from "../steering-types.js";
8
+ import type { UlwLoopToolkitSurface } from "../surface.js";
9
+ import type { UlwLoopPlan } from "../types.js";
10
+ import type { ULW_LOOP_MANIFEST, UlwLoopOperation } from "./manifest.js";
11
+
12
+ export type ToolkitSurface = UlwLoopToolkitSurface;
13
+
14
+ export interface ToolkitContext {
15
+ readonly cwd: string;
16
+ readonly sessionId: string;
17
+ readonly surface: ToolkitSurface;
18
+ }
19
+
20
+ export type CreateGoalsArgs = Parameters<typeof createUlwLoopPlan>[1];
21
+ export type CompleteGoalsArgs = NonNullable<Parameters<typeof startNextUlwLoop>[1]>;
22
+ export type SteerArgs = UlwLoopSteeringProposal;
23
+ export type AddGoalArgs = Parameters<typeof addUlwLoopGoal>[1];
24
+ export type RecordEvidenceArgs = Parameters<typeof recordEvidence>[1];
25
+ export type CriteriaArgs = { readonly goalId: string };
26
+ export type CheckpointMutationArgs = CheckpointUlwLoopArgs & { readonly printTemplate?: false };
27
+ export type CheckpointTemplateArgs = { readonly printTemplate: true; readonly goalId?: string };
28
+ export type CheckpointArgs = CheckpointMutationArgs | CheckpointTemplateArgs;
29
+ export type RecordReviewBlockersArgs = Parameters<typeof recordFinalReviewBlockers>[1];
30
+
31
+ export type ToolkitDispatchRequest =
32
+ | { readonly operation: "help"; readonly args?: Record<never, never> }
33
+ | { readonly operation: "create-goals"; readonly args: CreateGoalsArgs }
34
+ | { readonly operation: "status"; readonly args?: Record<never, never> }
35
+ | { readonly operation: "complete-goals"; readonly args?: CompleteGoalsArgs }
36
+ | { readonly operation: "checkpoint"; readonly args: CheckpointArgs }
37
+ | { readonly operation: "steer"; readonly args: SteerArgs }
38
+ | { readonly operation: "add-goal"; readonly args: AddGoalArgs }
39
+ | { readonly operation: "criteria"; readonly args: CriteriaArgs }
40
+ | { readonly operation: "record-evidence"; readonly args: RecordEvidenceArgs }
41
+ | { readonly operation: "record-review-blockers"; readonly args: RecordReviewBlockersArgs };
42
+
43
+ export interface ToolkitUnknownRequest {
44
+ readonly operation: string;
45
+ readonly args?: Record<never, never>;
46
+ }
47
+
48
+ export interface ToolkitError {
49
+ readonly code: string;
50
+ readonly message: string;
51
+ readonly details?: Readonly<Record<string, string>>;
52
+ }
53
+
54
+ export interface ToolkitSuccess<Operation extends UlwLoopOperation, Result> {
55
+ readonly ok: true;
56
+ readonly operation: Operation;
57
+ readonly result: Result;
58
+ readonly nextActions: readonly string[];
59
+ readonly warnings?: readonly string[];
60
+ }
61
+
62
+ export interface ToolkitFailure<Operation extends string = string> {
63
+ readonly ok: false;
64
+ readonly operation: Operation;
65
+ readonly error: ToolkitError;
66
+ }
67
+
68
+ type StatusResult = {
69
+ readonly plan: UlwLoopPlan;
70
+ readonly summary: ReturnType<typeof summarizeUlwLoopPlan>;
71
+ readonly nextActions: readonly string[];
72
+ readonly currentAttemptDir?: string;
73
+ };
74
+
75
+ type ResultFor<Operation extends UlwLoopOperation> = Operation extends "help"
76
+ ? typeof ULW_LOOP_MANIFEST
77
+ : Operation extends "create-goals"
78
+ ? Awaited<ReturnType<typeof createUlwLoopPlan>>
79
+ : Operation extends "status"
80
+ ? StatusResult
81
+ : Operation extends "complete-goals"
82
+ ? Awaited<ReturnType<typeof startNextUlwLoop>>
83
+ : Operation extends "checkpoint"
84
+ ? CheckpointUlwLoopResult | CheckpointTemplate
85
+ : Operation extends "steer"
86
+ ? Awaited<ReturnType<typeof steerUlwLoop>>
87
+ : Operation extends "add-goal"
88
+ ? Awaited<ReturnType<typeof addUlwLoopGoal>>
89
+ : Operation extends "criteria"
90
+ ? {
91
+ readonly goalId: string;
92
+ readonly criteria: UlwLoopPlan["goals"][number]["successCriteria"];
93
+ }
94
+ : Operation extends "record-evidence"
95
+ ? Awaited<ReturnType<typeof recordEvidence>>
96
+ : Operation extends "record-review-blockers"
97
+ ? Awaited<ReturnType<typeof recordFinalReviewBlockers>>
98
+ : never;
99
+
100
+ export type ToolkitResultFor<Operation extends UlwLoopOperation> = ResultFor<Operation>;
101
+ export type ToolkitResponseFor<Operation extends UlwLoopOperation> =
102
+ | ToolkitSuccess<Operation, ResultFor<Operation>>
103
+ | ToolkitFailure<Operation>;
104
+ export type ToolkitOperationResponse = {
105
+ [Operation in UlwLoopOperation]: ToolkitResponseFor<Operation>;
106
+ }[UlwLoopOperation];
107
+ export type ToolkitDispatchResponse = ToolkitOperationResponse | ToolkitFailure<string>;
108
+ export type ToolkitResponse<Result> = ToolkitSuccess<UlwLoopOperation, Result> | ToolkitFailure<string>;
109
+
110
+ export interface ToolkitOperationHookEvent<Operation extends UlwLoopOperation = UlwLoopOperation> {
111
+ readonly operation: Operation;
112
+ readonly context: ToolkitContext;
113
+ readonly response: ToolkitResponseFor<Operation>;
114
+ }
115
+
116
+ export interface ToolkitHostHooks {
117
+ readonly onOperation?: <Operation extends UlwLoopOperation>(
118
+ event: ToolkitOperationHookEvent<Operation>,
119
+ ) => void | Promise<void>;
120
+ }
121
+
122
+ export interface AgentToolkitDependencies {
123
+ readonly hooks?: ToolkitHostHooks;
124
+ }
125
+
126
+ export interface AgentToolkit {
127
+ readonly dispatch: (request: ToolkitDispatchRequest | ToolkitUnknownRequest) => Promise<ToolkitDispatchResponse>;
128
+ readonly help: () => Promise<ToolkitResponseFor<"help">>;
129
+ readonly createGoals: (args: CreateGoalsArgs) => Promise<ToolkitResponseFor<"create-goals">>;
130
+ readonly status: () => Promise<ToolkitResponseFor<"status">>;
131
+ readonly completeGoals: (args?: CompleteGoalsArgs) => Promise<ToolkitResponseFor<"complete-goals">>;
132
+ readonly checkpoint: (args: CheckpointArgs) => Promise<ToolkitResponseFor<"checkpoint">>;
133
+ readonly steer: (args: SteerArgs) => Promise<ToolkitResponseFor<"steer">>;
134
+ readonly addGoal: (args: AddGoalArgs) => Promise<ToolkitResponseFor<"add-goal">>;
135
+ readonly criteria: (args: CriteriaArgs) => Promise<ToolkitResponseFor<"criteria">>;
136
+ readonly recordEvidence: (args: RecordEvidenceArgs) => Promise<ToolkitResponseFor<"record-evidence">>;
137
+ readonly recordReviewBlockers: (
138
+ args: RecordReviewBlockersArgs,
139
+ ) => Promise<ToolkitResponseFor<"record-review-blockers">>;
140
+ }
@@ -0,0 +1,3 @@
1
+ export { createAgentToolkit } from "./sdk/factory.js";
2
+ export * from "./sdk/manifest.js";
3
+ export * from "./sdk/types.js";
@@ -1,32 +1,110 @@
1
- import { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
1
+ import { randomBytes } from "node:crypto";
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
3
4
 
4
5
  import type { PreToolUsePayload } from "./codex-hook.js";
5
6
  import { parsePreToolUsePayload } from "./codex-hook.js";
6
7
  import { isFinalRunCompletionCandidate } from "./goal-status.js";
7
- import { ulwLoopAttemptEvidenceDir, ulwLoopDir } from "./paths.js";
8
+ import { ulwLoopAttemptEvidenceDir, ulwLoopDir, ulwLoopStateLockPath } from "./paths.js";
9
+ import { isStateLockTimeout, type StateLockOptions, withStateLockSync } from "./state-lock.js";
10
+ import {
11
+ GATE_REVIEWER_AGENT_NAMES,
12
+ REVIEWER_ROLES_BY_SURFACE,
13
+ resolveToolkitSurface,
14
+ reviewerRolesFor,
15
+ } from "./surface.js";
8
16
  import type { UlwLoopPlan } from "./types.js";
9
17
 
10
18
  // spawn_agent = v1; collaborationspawn_agent = the delimiter-free flattened v2
11
19
  // hook token from codex-rs hook_names.rs; collaboration.spawn_agent = the
12
20
  // dotted token observed live in the task-1 probe (hook-tool-tokens.txt).
13
21
  const SPAWN_TOOL_TOKENS = new Set(["spawn_agent", "collaborationspawn_agent", "collaboration.spawn_agent"]);
14
- const DEFAULT_FANOUT_LIMIT = 60;
15
- const GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|final gate review/i;
22
+ export const DEFAULT_FANOUT_LIMIT = 24;
23
+ const DEFAULT_REVIEW_SPAWN_LIMIT = 3;
24
+ const GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
25
+ const REVIEW_AGENT_TYPES = [
26
+ ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview),
27
+ ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.codeReview),
28
+ ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.manualQa),
29
+ ] as const;
30
+ const REVIEW_AGENT_TYPE_SET = new Set<string>(REVIEW_AGENT_TYPES);
16
31
 
17
- export function applySpawnGuards(payload: PreToolUsePayload): string {
32
+ export interface SpawnGuardOptions {
33
+ readonly lockTimeoutMs?: number;
34
+ }
35
+
36
+ export function applySpawnGuards(payload: PreToolUsePayload, options: SpawnGuardOptions = {}): string {
18
37
  if (payload.hook_event_name !== "PreToolUse" || !SPAWN_TOOL_TOKENS.has(payload.tool_name)) return "";
19
- const stateDir = ulwLoopDir(payload.cwd, { sessionId: payload.session_id });
38
+ const breaker = readAdmissionBreaker(payload.session_id);
39
+ if (breaker !== null)
40
+ return deny(
41
+ `Subagent admission failed earlier in this session (${breaker}). Do not spawn more workers or reviewers; report the capacity block and wait for the user.`,
42
+ );
43
+ const scope = { sessionId: payload.session_id } as const;
44
+ const stateDir = ulwLoopDir(payload.cwd, scope);
20
45
  const plan = readPlan(join(stateDir, "goals.json"));
21
46
  if (plan === null) return "";
22
- const fanOutDenial = consumeFanOutBudget(stateDir);
23
- if (fanOutDenial !== null) return deny(fanOutDenial);
47
+ const lockOptions: StateLockOptions =
48
+ options.lockTimeoutMs === undefined ? {} : { timeoutMs: options.lockTimeoutMs };
49
+ try {
50
+ return withStateLockSync(
51
+ ulwLoopStateLockPath(payload.cwd, scope),
52
+ () => evaluateGuards(payload, plan, stateDir),
53
+ lockOptions,
54
+ );
55
+ } catch (error) {
56
+ if (isStateLockTimeout(error))
57
+ return deny(`ulw-loop spawn guard could not take the session state lock: ${error.message}`);
58
+ throw error;
59
+ }
60
+ }
61
+
62
+ function evaluateGuards(payload: PreToolUsePayload, plan: UlwLoopPlan, stateDir: string): string {
63
+ const fanOutPeek = peekFanOutBudget(stateDir);
64
+ if (fanOutPeek !== null) return deny(fanOutPeek);
24
65
  const missingArtifact = missingGateArtifact(payload, plan);
25
66
  if (missingArtifact !== null)
26
- return deny(`spawn code-review + QA first; gate audits their artifacts: missing ${missingArtifact}`);
67
+ return deny(`record manual QA first; gate audits its artifacts: missing ${missingArtifact}`);
68
+ const reviewDenial = consumeReviewSpawnBudget(payload, plan, stateDir);
69
+ if (reviewDenial !== null) return deny(reviewDenial);
70
+ const fanOutDenial = consumeFanOutBudget(stateDir);
71
+ if (fanOutDenial !== null) return deny(fanOutDenial);
27
72
  return "";
28
73
  }
29
74
 
75
+ export async function runSpawnAdmissionRecorderCli(
76
+ stdin: NodeJS.ReadableStream,
77
+ stdout: NodeJS.WritableStream,
78
+ ): Promise<void> {
79
+ const chunks: Buffer[] = [];
80
+ for await (const chunk of stdin) chunks.push(Buffer.from(chunk));
81
+ try {
82
+ const payload = JSON.parse(Buffer.concat(chunks).toString("utf8")) as Record<string, unknown>;
83
+ const response =
84
+ typeof payload["tool_response"] === "string"
85
+ ? payload["tool_response"]
86
+ : JSON.stringify(payload["tool_response"] ?? "");
87
+ if (!/too many active cells|AgentLimitReached|max_threads|max_concurrent_threads_per_session/i.test(response))
88
+ return;
89
+ const dataDir = process.env["PLUGIN_DATA"];
90
+ if (typeof dataDir !== "string" || typeof payload["session_id"] !== "string") return;
91
+ const markerDir = join(dataDir, "spawn-breaker");
92
+ try {
93
+ mkdirSync(markerDir, { recursive: true });
94
+ atomicWriteJson(join(markerDir, `${payload["session_id"]}.json`), {
95
+ reason: response,
96
+ at: new Date().toISOString(),
97
+ });
98
+ } catch (error) {
99
+ const message = error instanceof Error ? error.message : String(error);
100
+ process.stderr.write(`[ulw-loop] spawn-guard: could not persist admission failure: ${message}\n`);
101
+ }
102
+ } catch {
103
+ /* malformed hook input is ignored */
104
+ }
105
+ void stdout;
106
+ }
107
+
30
108
  export async function runSpawnGuardCli(stdin: NodeJS.ReadableStream, stdout: NodeJS.WritableStream): Promise<void> {
31
109
  try {
32
110
  const chunks: Buffer[] = [];
@@ -40,46 +118,119 @@ export async function runSpawnGuardCli(stdin: NodeJS.ReadableStream, stdout: Nod
40
118
  }
41
119
  }
42
120
 
121
+ // Read-only fan-out eligibility check. Returns a denial reason when the next
122
+ // spawn would exceed the limit, without incrementing the counter. Call this
123
+ // before charging any per-reviewer quota so a saturated global cap cannot
124
+ // silently consume reviewer allowances for spawns that will never run.
125
+ function peekFanOutBudget(stateDir: string): string | null {
126
+ const counterPath = join(stateDir, "spawn-count.json");
127
+ const count = readCount(counterPath) + 1;
128
+ const limit = fanOutLimit();
129
+ if (count <= limit) return null;
130
+ return `ulw-loop spawn fan-out cap reached (${count}/${limit}). Consolidate work into the agents already running, or raise OMO_SPAWN_FANOUT_LIMIT if this volume is intentional.`;
131
+ }
132
+
43
133
  // Per-session spawn counter; depth/lineage tracking is descoped — this is a
44
134
  // total-volume backstop against fan-out explosions, not a recursion tracker.
45
135
  function consumeFanOutBudget(stateDir: string): string | null {
46
136
  const counterPath = join(stateDir, "spawn-count.json");
47
137
  const count = readCount(counterPath) + 1;
48
- writeFileSync(counterPath, JSON.stringify({ count }));
138
+ atomicWriteJson(counterPath, { count });
49
139
  const limit = fanOutLimit();
50
140
  if (count <= limit) return null;
51
141
  return `ulw-loop spawn fan-out cap reached (${count}/${limit}). Consolidate work into the agents already running, or raise OMO_SPAWN_FANOUT_LIMIT if this volume is intentional.`;
52
142
  }
53
143
 
144
+ function consumeReviewSpawnBudget(payload: PreToolUsePayload, plan: UlwLoopPlan, stateDir: string): string | null {
145
+ const agentType = reviewAgentType(payload.tool_input);
146
+ if (agentType === null) return null;
147
+ const goal =
148
+ plan.goals.find((candidate) => candidate.id === plan.activeGoalId) ??
149
+ plan.goals.find((candidate) => isFinalRunCompletionCandidate(plan, candidate));
150
+ if (goal === undefined) return null;
151
+ const counterPath = join(stateDir, "review-spawn-counts.json");
152
+ const limit = reviewSpawnLimit();
153
+ const counts = readCounts(counterPath);
154
+ const key = `${agentType}:${goal.id}:a${goal.attempt}`;
155
+ const count = (counts[key] ?? 0) + 1;
156
+ if (count > limit)
157
+ return `ulw-loop reviewer no-progress cap reached (${agentType} ${count}/${limit}) for ${goal.id} attempt ${goal.attempt}. Consolidate existing review findings, or checkpoint and start a new attempt after concrete progress.`;
158
+ counts[key] = count;
159
+ atomicWriteJson(counterPath, counts);
160
+ return null;
161
+ }
162
+
54
163
  function missingGateArtifact(payload: PreToolUsePayload, plan: UlwLoopPlan): string | null {
55
164
  if (!isGateReviewerSpawn(payload.tool_input)) return null;
56
165
  const goal = plan.goals.find((candidate) => isFinalRunCompletionCandidate(plan, candidate));
57
166
  if (goal === undefined || goal.status === "complete") return null;
58
167
  if (!goal.successCriteria.every((criterion) => criterion.status === "pass")) return null;
59
168
  const scope = { sessionId: payload.session_id } as const;
169
+ const requiredArtifacts = [`${goal.id}-manual-qa.md`];
60
170
  if (plan.evidenceLayoutVersion === 2) {
61
171
  const attemptDir = ulwLoopAttemptEvidenceDir(goal.id, goal.attempt, scope);
62
- for (const name of [`${goal.id}-code-review.md`, `${goal.id}-manual-qa.md`]) {
172
+ for (const name of requiredArtifacts) {
63
173
  const relative = `${attemptDir}/${name}`;
64
174
  if (!isNonEmptyFile(join(payload.cwd, relative))) return relative;
65
175
  }
66
176
  return null;
67
177
  }
68
- const flatReport = `.omo/evidence/${goal.id}-code-review.md`;
69
- if (!isNonEmptyFile(join(payload.cwd, flatReport))) return flatReport;
70
- // v1 manual-QA approximation: any other non-empty evidence file counts.
71
- if (!hasOtherEvidenceFile(join(payload.cwd, ".omo", "evidence"), `${goal.id}-code-review.md`))
72
- return `.omo/evidence/<any manual-QA artifact besides ${goal.id}-code-review.md>`;
73
- return null;
178
+ const manualQa = `.omo/evidence/${goal.id}-manual-qa.md`;
179
+ return isNonEmptyFile(join(payload.cwd, manualQa)) ? null : manualQa;
74
180
  }
75
181
 
76
182
  function isGateReviewerSpawn(toolInput: unknown): boolean {
77
- if (typeof toolInput !== "object" || toolInput === null) return false;
183
+ const agentType = reviewAgentType(toolInput);
184
+ return agentType !== null && GATE_REVIEWER_AGENT_NAMES.has(agentType);
185
+ }
186
+
187
+ function reviewAgentType(toolInput: unknown): string | null {
188
+ if (typeof toolInput !== "object" || toolInput === null) return null;
78
189
  const record = toolInput as Record<string, unknown>;
79
190
  const agentType = record["agent_type"];
80
- if (typeof agentType === "string") return agentType === "lazycodex-gate-reviewer";
191
+ if (typeof agentType === "string") {
192
+ // V1: agent_type is present — only reviewer types proceed; any other type is not a review spawn.
193
+ if (!REVIEW_AGENT_TYPE_SET.has(agentType)) return null;
194
+ return activeSurfaceReviewerAlias(agentType);
195
+ }
81
196
  const message = record["message"];
82
- return typeof message === "string" && GATE_MESSAGE_PATTERN.test(message);
197
+ if (typeof message !== "string") return null;
198
+ const normalizedMessage = message.toLowerCase();
199
+ // Explicit "act as <role>" assignment takes priority. If the assigned role is not a reviewer,
200
+ // treat the spawn as non-review so a message that merely mentions a reviewer name does not
201
+ // accidentally charge that reviewer's quota.
202
+ const allRoleNames = [...REVIEW_AGENT_TYPES];
203
+ const explicitAssignment = allRoleNames
204
+ .map((name) => ({
205
+ name,
206
+ index: normalizedMessage.search(new RegExp(`\\bact as (?:an? )?${name}\\b`)),
207
+ }))
208
+ .filter(({ index }) => index >= 0)
209
+ .sort((left, right) => left.index - right.index)[0];
210
+ if (explicitAssignment !== undefined) return activeSurfaceReviewerAlias(explicitAssignment.name);
211
+ // Check for an explicit "act as <non-reviewer-role>" assignment. If found, the spawn is not a
212
+ // review spawn even if the message body mentions a reviewer name.
213
+ const nonReviewerActAs = /\bact as (?:an? )?\S+/.test(normalizedMessage);
214
+ if (nonReviewerActAs) return null;
215
+ const namedReviewer = REVIEW_AGENT_TYPES.find((name) => normalizedMessage.includes(name));
216
+ if (namedReviewer !== undefined) return activeSurfaceReviewerAlias(namedReviewer);
217
+ return GATE_MESSAGE_PATTERN.test(message) ? reviewerRolesFor(resolveToolkitSurface()).gateReview : null;
218
+ }
219
+
220
+ function activeSurfaceReviewerAlias(reviewer: string): string {
221
+ const activeRoles = reviewerRolesFor(resolveToolkitSurface());
222
+ for (const roles of Object.values(REVIEWER_ROLES_BY_SURFACE)) {
223
+ if (reviewer === roles.codeReview) return activeRoles.codeReview;
224
+ if (reviewer === roles.manualQa) return activeRoles.manualQa;
225
+ if (reviewer === roles.gateReview) return activeRoles.gateReview;
226
+ }
227
+ return reviewer;
228
+ }
229
+
230
+ function atomicWriteJson(targetPath: string, data: unknown): void {
231
+ const tmp = join(dirname(targetPath), `.tmp-${randomBytes(6).toString("hex")}`);
232
+ writeFileSync(tmp, JSON.stringify(data));
233
+ renameSync(tmp, targetPath);
83
234
  }
84
235
 
85
236
  function deny(reason: string): string {
@@ -93,6 +244,19 @@ function deny(reason: string): string {
93
244
  })}\n`;
94
245
  }
95
246
 
247
+ function readAdmissionBreaker(sessionId: string): string | null {
248
+ const dataDir = process.env["PLUGIN_DATA"];
249
+ if (typeof dataDir !== "string") return null;
250
+ try {
251
+ const value = JSON.parse(readFileSync(join(dataDir, "spawn-breaker", `${sessionId}.json`), "utf8")) as {
252
+ reason?: unknown;
253
+ };
254
+ return typeof value.reason === "string" ? value.reason : "capacity limit";
255
+ } catch {
256
+ return null;
257
+ }
258
+ }
259
+
96
260
  function fanOutLimit(): number {
97
261
  const raw = process.env["OMO_SPAWN_FANOUT_LIMIT"];
98
262
  if (raw === undefined) return DEFAULT_FANOUT_LIMIT;
@@ -100,6 +264,13 @@ function fanOutLimit(): number {
100
264
  return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_FANOUT_LIMIT;
101
265
  }
102
266
 
267
+ function reviewSpawnLimit(): number {
268
+ const raw = process.env["OMO_ULW_LOOP_REVIEW_SPAWN_LIMIT"];
269
+ if (raw === undefined) return DEFAULT_REVIEW_SPAWN_LIMIT;
270
+ const parsed = Number.parseInt(raw, 10);
271
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_REVIEW_SPAWN_LIMIT;
272
+ }
273
+
103
274
  function isNonEmptyFile(path: string): boolean {
104
275
  try {
105
276
  return existsSync(path) && statSync(path).size > 0;
@@ -109,21 +280,27 @@ function isNonEmptyFile(path: string): boolean {
109
280
  }
110
281
  }
111
282
 
112
- function hasOtherEvidenceFile(evidenceDir: string, excludedName: string): boolean {
283
+ function readCount(counterPath: string): number {
113
284
  try {
114
- return readdirSync(evidenceDir).some((name) => name !== excludedName && isNonEmptyFile(join(evidenceDir, name)));
285
+ const parsed = JSON.parse(readFileSync(counterPath, "utf8")) as Record<string, unknown>;
286
+ return typeof parsed["count"] === "number" && parsed["count"] >= 0 ? parsed["count"] : 0;
115
287
  } catch (error) {
116
- if (error instanceof Error) return false;
288
+ if (error instanceof Error) return 0;
117
289
  throw error;
118
290
  }
119
291
  }
120
292
 
121
- function readCount(counterPath: string): number {
293
+ function readCounts(counterPath: string): Record<string, number> {
122
294
  try {
123
- const parsed = JSON.parse(readFileSync(counterPath, "utf8")) as Record<string, unknown>;
124
- return typeof parsed["count"] === "number" && parsed["count"] >= 0 ? parsed["count"] : 0;
295
+ const parsed: unknown = JSON.parse(readFileSync(counterPath, "utf8"));
296
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return {};
297
+ const counts: Record<string, number> = {};
298
+ for (const [key, value] of Object.entries(parsed)) {
299
+ if (typeof value === "number" && value >= 0) counts[key] = value;
300
+ }
301
+ return counts;
125
302
  } catch (error) {
126
- if (error instanceof Error) return 0;
303
+ if (error instanceof Error) return {};
127
304
  throw error;
128
305
  }
129
306
  }