lazycodex-ai 5.0.0-beta.4 → 5.0.0-beta.40

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 (538) hide show
  1. package/README.ja.md +25 -21
  2. package/README.ko.md +25 -21
  3. package/README.md +38 -23
  4. package/README.ru.md +24 -20
  5. package/README.zh-cn.md +25 -21
  6. package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
  7. package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
  8. package/dist/cli/fallback-lane-policy.d.ts +1 -0
  9. package/dist/cli/index.js +66932 -64746
  10. package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
  11. package/dist/cli/run/on-complete-hook.d.ts +2 -0
  12. package/dist/cli/runtime-commands.d.ts +1 -1
  13. package/dist/cli/worktree-sweep/classify.d.ts +16 -0
  14. package/dist/cli/worktree-sweep/format.d.ts +8 -0
  15. package/dist/cli/worktree-sweep/git.d.ts +19 -0
  16. package/dist/cli/worktree-sweep/index.d.ts +7 -0
  17. package/dist/cli/worktree-sweep/options.d.ts +2 -0
  18. package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
  19. package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
  20. package/dist/cli/worktree-sweep/types.d.ts +65 -0
  21. package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
  22. package/dist/cli-node/index.js +66795 -64586
  23. package/package.json +9 -9
  24. package/packages/git-bash-mcp/dist/cli.js +6 -1
  25. package/packages/lsp-daemon/dist/cli.js +793 -323
  26. package/packages/lsp-daemon/dist/client.d.ts +10 -0
  27. package/packages/lsp-daemon/dist/client.js +753 -280
  28. package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
  29. package/packages/lsp-daemon/dist/daemon-client.js +3 -0
  30. package/packages/lsp-daemon/dist/ensure-daemon.js +1 -0
  31. package/packages/lsp-daemon/dist/index.js +757 -289
  32. package/packages/lsp-daemon/dist/proxy.js +3 -0
  33. package/packages/lsp-daemon/dist/version-reap.js +1 -1
  34. package/packages/lsp-daemon/package.json +1 -1
  35. package/packages/lsp-tools-mcp/dist/cli.js +712 -244
  36. package/packages/lsp-tools-mcp/dist/lsp/manager.js +248 -119
  37. package/packages/lsp-tools-mcp/dist/mcp.js +714 -246
  38. package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
  39. package/packages/lsp-tools-mcp/dist/tools.js +718 -254
  40. package/packages/lsp-tools-mcp/package.json +1 -1
  41. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
  42. package/packages/omo-codex/plugin/.mcp.json +0 -6
  43. package/packages/omo-codex/plugin/AGENTS.md +47 -0
  44. package/packages/omo-codex/plugin/README.md +2 -2
  45. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +45 -49
  46. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  47. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  48. package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
  49. package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
  50. package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
  51. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
  52. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  53. package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
  54. package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
  55. package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
  56. package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
  57. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
  58. package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
  59. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  60. package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
  61. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
  62. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +1 -5
  63. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +1 -5
  64. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  65. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
  66. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +1 -5
  67. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +4 -21
  68. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +1 -1
  69. package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
  70. package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
  71. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
  72. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +741 -294
  73. package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
  74. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  75. package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
  76. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  77. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
  78. package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
  79. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
  80. package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
  81. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
  82. package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
  83. package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
  84. package/packages/omo-codex/plugin/components/rules/dist/cli.js +60 -45
  85. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  86. package/packages/omo-codex/plugin/components/rules/package.json +7 -7
  87. package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
  88. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
  89. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +9 -5
  90. package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
  91. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
  92. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  93. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
  94. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  95. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  96. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  97. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  98. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  99. package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
  100. package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
  101. package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
  102. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
  103. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +1 -2
  104. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  105. package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
  106. package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
  107. package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
  108. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +5 -6
  109. package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
  110. package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
  111. package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
  112. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
  113. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  114. package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
  115. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +4 -10
  116. package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
  117. package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
  118. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2463 -437
  119. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2467 -441
  120. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  121. package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
  122. package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
  123. package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
  124. package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
  125. package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
  126. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
  127. package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
  128. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +489 -4
  129. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  130. package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -6
  131. package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
  132. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -7
  133. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +31 -7
  134. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
  135. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +5 -5
  136. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
  137. package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
  138. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
  139. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  140. package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
  141. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
  142. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  143. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +2 -2
  144. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
  145. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +5 -5
  146. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
  147. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +6 -6
  148. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +12 -12
  149. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +28 -0
  150. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
  151. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
  152. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
  153. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +3 -3
  154. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
  155. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
  156. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
  157. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +1 -4
  158. package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +8 -22
  159. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
  160. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -1
  161. package/packages/omo-codex/plugin/components/ulw-loop/README.md +12 -1
  162. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
  163. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +15 -3
  164. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +12 -0
  165. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +45 -0
  166. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +9 -0
  167. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +15 -0
  168. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +15 -1
  169. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +8 -0
  170. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +120 -0
  171. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +40 -39
  172. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +7 -2
  173. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
  174. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
  175. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +2 -0
  176. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +958 -342
  177. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
  178. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +27 -6
  179. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +13 -0
  180. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +15 -1
  181. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +17 -9
  182. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +1 -1
  183. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +17 -2
  184. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +13 -0
  185. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +19 -0
  186. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
  187. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
  188. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
  189. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
  190. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
  191. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
  192. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
  193. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
  194. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +69 -111
  195. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +4 -2
  196. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +185 -14
  197. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +6 -0
  198. package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +33 -0
  199. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +3 -3
  200. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +18 -0
  201. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +65 -0
  202. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  203. package/packages/omo-codex/plugin/components/ulw-loop/package.json +5 -5
  204. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -2
  205. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
  206. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +22 -1
  207. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +81 -0
  208. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +7 -0
  209. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +31 -1
  210. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
  211. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +38 -71
  212. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +7 -2
  213. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
  214. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +2 -0
  215. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +3 -5
  216. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +34 -5
  217. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +26 -1
  218. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
  219. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +19 -9
  220. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +1 -1
  221. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +18 -3
  222. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +27 -0
  223. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
  224. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
  225. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +68 -15
  226. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
  227. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +82 -131
  228. package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +4 -2
  229. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +187 -12
  230. package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +36 -0
  231. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +3 -3
  232. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +95 -0
  233. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  234. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +133 -1
  235. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +137 -0
  236. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +25 -0
  237. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +26 -2
  238. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +183 -0
  239. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +37 -2
  240. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +18 -0
  241. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  242. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +7 -3
  243. package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +105 -0
  244. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
  245. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
  246. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
  247. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
  248. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
  249. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +46 -2
  250. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
  251. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
  252. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +48 -3
  253. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +318 -1
  254. package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
  255. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
  256. package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
  257. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +13 -8
  258. package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
  259. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  260. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  261. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  262. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  263. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  264. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  265. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  266. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  267. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  268. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  269. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  270. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  271. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  272. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  273. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
  274. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  275. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +17 -0
  276. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  277. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  278. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  279. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  280. package/packages/omo-codex/plugin/model-catalog.json +3 -3
  281. package/packages/omo-codex/plugin/package-lock.json +676 -524
  282. package/packages/omo-codex/plugin/package.json +2 -3
  283. package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
  284. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
  285. package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
  286. package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
  287. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
  288. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +3 -3
  289. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +36 -13
  290. package/packages/omo-codex/plugin/shared/package.json +3 -4
  291. package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
  292. package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
  293. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
  294. package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
  295. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
  296. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
  297. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  298. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
  299. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  300. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
  301. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
  302. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
  303. package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
  304. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
  305. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
  306. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  307. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  308. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -0
  309. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
  310. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
  311. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
  312. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
  313. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
  314. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
  315. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
  316. package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
  317. package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  318. package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
  319. package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
  320. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +11 -7
  321. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
  322. package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
  323. package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
  324. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
  325. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  326. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  327. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  328. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
  329. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
  330. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +13 -13
  331. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
  332. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +4 -4
  333. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  334. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -0
  335. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  336. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
  337. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
  338. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  339. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +15 -3
  340. package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +19 -26
  341. package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
  342. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -2
  343. package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
  344. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +22 -1
  345. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -7
  346. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +31 -7
  347. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
  348. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +5 -5
  349. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +4 -2
  350. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
  351. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +3 -2
  352. package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
  353. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  354. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +9 -48
  355. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
  356. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  357. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +1 -1
  358. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  359. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  360. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  361. package/packages/omo-codex/plugin/test/auto-update.test.mjs +2 -27
  362. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  363. package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
  364. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
  365. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
  366. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
  367. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +4 -5
  368. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  369. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  370. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +8 -8
  371. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  372. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
  373. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +23 -13
  374. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +14 -119
  375. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  376. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  377. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  378. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  379. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  380. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
  381. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  382. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2817 -913
  383. package/packages/{omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md → prompts-core/prompts/ultrawork/codex.md} +15 -10
  384. package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
  385. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
  386. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
  387. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  388. package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
  389. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  390. package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
  391. package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
  392. package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
  393. package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
  394. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
  395. package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
  396. package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  397. package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  398. package/packages/shared-skills/skills/debugging/SKILL.md +2 -0
  399. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
  400. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
  401. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
  402. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
  403. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
  404. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
  405. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
  406. package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
  407. package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
  408. package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  409. package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
  410. package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
  411. package/packages/shared-skills/skills/frontend/SKILL.md +11 -7
  412. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
  413. package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
  414. package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
  415. package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
  416. package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  417. package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  418. package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  419. package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
  420. package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
  421. package/packages/shared-skills/skills/init-deep/SKILL.md +13 -13
  422. package/packages/shared-skills/skills/review-work/SKILL.md +3 -3
  423. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
  424. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -0
  425. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  426. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
  427. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
  428. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  429. package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +17 -16
  430. package/packages/shared-skills/skills/ulw-plan/SKILL.md +6 -7
  431. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +31 -7
  432. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
  433. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +5 -5
  434. package/packages/shared-skills/skills/ulw-research/SKILL.md +4 -2
  435. package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
  436. package/packages/shared-skills/skills/visual-qa/SKILL.md +3 -2
  437. package/script/qa/web-terminal-visual-qa.mjs +2 -0
  438. package/script/qa/xterm-live-terminal.mjs +18 -2
  439. package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
  440. package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
  441. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
  442. package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
  443. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
  444. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  445. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  446. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  447. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12136
  448. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9734
  449. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  450. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  451. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  452. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  453. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  454. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  455. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  456. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
  457. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
  458. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  459. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  460. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  461. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  462. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  463. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
  464. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  465. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  466. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  467. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  468. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  469. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  470. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  471. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  472. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  473. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  474. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  475. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  476. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  477. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  478. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  479. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  480. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  481. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  482. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  483. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  484. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  485. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  486. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  487. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  488. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  489. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  490. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  491. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  492. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  493. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  494. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  495. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  496. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  497. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  498. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  499. package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
  500. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
  501. package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -471
  502. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  503. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  504. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
  505. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
  506. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  507. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  508. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  509. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  510. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
  511. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
  512. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
  513. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
  514. package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
  515. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  516. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  517. package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
  518. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  519. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
  520. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
  521. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
  522. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
  523. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
  524. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
  525. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
  526. /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
  527. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
  528. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +0 -0
  529. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
  530. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
  531. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
  532. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
  533. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
  534. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
  535. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
  536. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
  537. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
  538. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
@@ -0,0 +1,137 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join, resolve } from "node:path";
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
+
7
+ import { ulwLoopCommand } from "../src/cli-commands.js";
8
+ import { writePlan } from "../src/plan-io.js";
9
+ import { validateQualityGate } from "../src/quality-gate.js";
10
+ import { goal, plan } from "./fixtures/checkpoint-builders.js";
11
+
12
+ let repo: string;
13
+ let output: string[];
14
+
15
+ beforeEach(async () => {
16
+ repo = await mkdtemp(join(tmpdir(), "ulw-template-"));
17
+ output = [];
18
+ vi.spyOn(process, "cwd").mockReturnValue(repo);
19
+ vi.spyOn(process.stdout, "write").mockImplementation((chunk: string | Uint8Array): boolean => {
20
+ output.push(chunk.toString());
21
+ return true;
22
+ });
23
+ delete process.env["OMO_AGENT_TOOLKIT_SURFACE"];
24
+ });
25
+
26
+ afterEach(async () => {
27
+ vi.restoreAllMocks();
28
+ await rm(repo, { recursive: true, force: true });
29
+ });
30
+
31
+ async function run(args: string[]): Promise<Record<string, unknown>> {
32
+ const code = await ulwLoopCommand(["checkpoint", ...args]);
33
+ expect(code).toBe(0);
34
+ return JSON.parse(output.join(""));
35
+ }
36
+
37
+ function fillTemplate(value: unknown): unknown {
38
+ if (typeof value === "string") {
39
+ return value.replace(/<replace:[^>]+>/g, "plausible evidence");
40
+ }
41
+ if (Array.isArray(value)) return value.map(fillTemplate);
42
+ if (value !== null && typeof value === "object") {
43
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, fillTemplate(item)]));
44
+ }
45
+ return value;
46
+ }
47
+
48
+ describe("checkpoint --print-template", () => {
49
+ it("#given a printed template #when every placeholder is filled #then the quality gate validates", async () => {
50
+ await writePlan(
51
+ repo,
52
+ plan([goal({ id: "G001", attempt: 2 })], {
53
+ evidenceLayoutVersion: 2,
54
+ activeGoalId: "G001",
55
+ codexObjective: "Exact objective from goals.json",
56
+ }),
57
+ );
58
+ process.env["OMO_AGENT_TOOLKIT_SURFACE"] = "omo-senpi";
59
+ const result = await run(["--print-template", "--goal-id", "G001", "--json"]);
60
+ const template = fillTemplate(result["qualityGateTemplate"]) as Record<string, unknown>;
61
+ const paths = [
62
+ ...((template["manualQa"] as Record<string, unknown>)["artifactRefs"] as Array<Record<string, unknown>>),
63
+ ];
64
+ await Promise.all(
65
+ [
66
+ ...paths.map((artifact) => String(artifact["path"])),
67
+ String((template["gateReview"] as Record<string, unknown>)["reportPath"]),
68
+ ].map(async (path) => {
69
+ const absolute = resolve(repo, path);
70
+ await mkdir(resolve(absolute, ".."), { recursive: true });
71
+ await writeFile(absolute, "evidence");
72
+ }),
73
+ );
74
+ const validated = validateQualityGate(template, {
75
+ repoRoot: repo,
76
+ fs: { existsSync, statSync },
77
+ reviewerSurface: "omo-senpi",
78
+ });
79
+ expect(validated.gateReview.recommendation).toBe("APPROVE");
80
+ });
81
+ it("#given an active senpi v2 plan #when printed with only goal-id #then emits the senpi gate skeleton", async () => {
82
+ await writePlan(
83
+ repo,
84
+ plan([goal({ id: "G001", attempt: 2 })], {
85
+ evidenceLayoutVersion: 2,
86
+ activeGoalId: "G001",
87
+ codexObjective: "Exact objective from goals.json",
88
+ }),
89
+ );
90
+ process.env["OMO_AGENT_TOOLKIT_SURFACE"] = "omo-senpi";
91
+ const result = await run(["--print-template", "--goal-id", "G001", "--json"]);
92
+ const gate = result["qualityGateTemplate"] as Record<string, unknown>;
93
+ expect(Object.keys(gate)).toEqual(["manualQa", "gateReview", "iteration", "criteriaCoverage"]);
94
+ expect((gate["manualQa"] as Record<string, unknown>)["by"]).toBe("main-session");
95
+ expect((gate["gateReview"] as Record<string, unknown>)["by"]).toBe("category:deep");
96
+ expect(result["codexGoalTemplate"]).toEqual({
97
+ goal: { objective: "Exact objective from goals.json", status: "complete" },
98
+ });
99
+ expect(result["attemptDir"]).toBe(".omo/evidence/ulw/session/G001/a2");
100
+ });
101
+
102
+ it("#given an active v2 plan #when printed without any goal id #then targets the active goal", async () => {
103
+ await writePlan(
104
+ repo,
105
+ plan([goal({ id: "G001", attempt: 1 })], {
106
+ evidenceLayoutVersion: 2,
107
+ activeGoalId: "G001",
108
+ codexObjective: "Exact objective from goals.json",
109
+ }),
110
+ );
111
+ process.env["OMO_AGENT_TOOLKIT_SURFACE"] = "omo-senpi";
112
+ const result = await run(["--print-template", "--json"]);
113
+ const gate = result["qualityGateTemplate"] as Record<string, unknown>;
114
+ expect(Object.keys(gate)).toEqual(["manualQa", "gateReview", "iteration", "criteriaCoverage"]);
115
+ expect(result["attemptDir"]).toBe(".omo/evidence/ulw/session/G001/a1");
116
+ });
117
+
118
+ it("#given two goals #when printed with an explicit non-active goal id #then targets that goal's attempt dir", async () => {
119
+ await writePlan(
120
+ repo,
121
+ plan([goal({ id: "G001", attempt: 1 }), goal({ id: "G002", attempt: 3 })], {
122
+ evidenceLayoutVersion: 2,
123
+ activeGoalId: "G001",
124
+ codexObjective: "Exact objective from goals.json",
125
+ }),
126
+ );
127
+ const result = await run(["--print-template", "--goal-id", "G002", "--json"]);
128
+ expect(result["attemptDir"]).toBe(".omo/evidence/ulw/session/G002/a3");
129
+ });
130
+
131
+ it("#given a v1 plan #when printed without status #then exits successfully and gives v1 guidance", async () => {
132
+ await writePlan(repo, plan([goal({ id: "G001" })]));
133
+ const result = await run(["--print-template", "--goal-id", "G001", "--json"]);
134
+ expect(result["guidance"]).toContain("evidence-layout v1");
135
+ expect(result).not.toHaveProperty("attemptDir");
136
+ });
137
+ });
@@ -13,6 +13,7 @@ let err: string[];
13
13
  let originalCodexSessionId: string | undefined;
14
14
  let originalCodexThreadId: string | undefined;
15
15
  let originalOmoSessionId: string | undefined;
16
+ let originalPiSessionId: string | undefined;
16
17
 
17
18
  beforeEach(async () => {
18
19
  testDir = await mkdtemp(join(tmpdir(), "ug-cli-create-goals-"));
@@ -21,9 +22,11 @@ beforeEach(async () => {
21
22
  originalCodexSessionId = process.env["CODEX_SESSION_ID"];
22
23
  originalCodexThreadId = process.env["CODEX_THREAD_ID"];
23
24
  originalOmoSessionId = process.env["OMO_ULW_LOOP_SESSION_ID"];
25
+ originalPiSessionId = process.env["PI_SESSION_ID"];
24
26
  delete process.env["CODEX_SESSION_ID"];
25
27
  delete process.env["CODEX_THREAD_ID"];
26
28
  delete process.env["OMO_ULW_LOOP_SESSION_ID"];
29
+ delete process.env["PI_SESSION_ID"];
27
30
  vi.spyOn(process, "cwd").mockReturnValue(testDir);
28
31
  vi.spyOn(process.stdout, "write").mockImplementation((chunk: string | Uint8Array): boolean => {
29
32
  out.push(chunk.toString());
@@ -43,6 +46,8 @@ afterEach(async () => {
43
46
  else process.env["CODEX_THREAD_ID"] = originalCodexThreadId;
44
47
  if (originalOmoSessionId === undefined) delete process.env["OMO_ULW_LOOP_SESSION_ID"];
45
48
  else process.env["OMO_ULW_LOOP_SESSION_ID"] = originalOmoSessionId;
49
+ if (originalPiSessionId === undefined) delete process.env["PI_SESSION_ID"];
50
+ else process.env["PI_SESSION_ID"] = originalPiSessionId;
46
51
  await rm(testDir, { recursive: true, force: true });
47
52
  });
48
53
 
@@ -182,6 +187,26 @@ describe("ulwLoopCommand create-goals", () => {
182
187
  expect(await readFile(join(testDir, ".omo/ulw-loop/manual-456/goals.json"), "utf8")).toContain("Manual scoped");
183
188
  });
184
189
 
190
+ it("#given two Senpi sessions in one cwd #when each reads ulw-loop state #then only the owner sees its run", async () => {
191
+ process.env["PI_SESSION_ID"] = "session-A";
192
+ expect(await ulwLoopCommand(["create-goals", "--brief", "- Session A run", "--json"])).toBe(0);
193
+ resetOutput();
194
+
195
+ process.env["PI_SESSION_ID"] = "session-B";
196
+ expect(await ulwLoopCommand(["status", "--json"])).toBe(1);
197
+ expect(stdoutJson()).toMatchObject({ ok: false, error: { code: "ULW_LOOP_PLAN_MISSING" } });
198
+ resetOutput();
199
+
200
+ process.env["PI_SESSION_ID"] = "session-A";
201
+ expect(await ulwLoopCommand(["status", "--json"])).toBe(0);
202
+ expect(stdoutJson()).toMatchObject({
203
+ plan: {
204
+ goalsPath: ".omo/ulw-loop/session-A/goals.json",
205
+ goals: [{ title: "Session A run" }],
206
+ },
207
+ });
208
+ });
209
+
185
210
  it("#given a valueless --session-id #when creating goals #then it fails and writes no plan", async () => {
186
211
  const code = await ulwLoopCommand(["create-goals", "--session-id", "--brief", "- Alpha"]);
187
212
 
@@ -91,12 +91,36 @@ describe("dist/cli.js entrypoint dispatch", () => {
91
91
  expect(result.code).toBe(1);
92
92
  });
93
93
 
94
- it("#given the top-level entrypoint #when invoked with 'help' #then prints usage and exits 0", async () => {
94
+ it("#given the top-level entrypoint #when invoked with 'help' #then prints the merged hook and subcommand usage and exits 0", async () => {
95
95
  const result = await runCli(["help"]);
96
96
 
97
97
  expect(result.code).toBe(0);
98
98
  expect(result.stdout).toContain("Usage:");
99
- expect(result.stdout).toContain("omo-agent-toolkit ulw-loop <subcommand>");
99
+ expect(result.stdout).toContain("hook user-prompt-submit");
100
+ expect(result.stdout).toContain("create-goals");
101
+ expect(result.stdout).toContain("complete-goals");
102
+ expect(result.stdout).toContain("record-review-blockers");
103
+ expect(result.stdout).not.toContain("for ulw-loop subcommands");
104
+ });
105
+
106
+ it("#given the staged router strips nothing #when invoked with 'ulw-loop help' #then prints the same merged help text", async () => {
107
+ const bare = await runCli(["help"]);
108
+ const nested = await runCli(["ulw-loop", "help"]);
109
+
110
+ expect(nested.code).toBe(0);
111
+ expect(nested.stdout.trim()).toBe(bare.stdout.trim());
112
+ expect(nested.stdout).toContain("hook user-prompt-submit");
113
+ expect(nested.stdout).toContain("record-review-blockers");
114
+ expect(nested.stdout).not.toContain("for ulw-loop subcommands");
115
+ });
116
+
117
+ it("#given a subcommand with required args #when invoked with 'create-goals --help' #then prints its usage and exits 0", async () => {
118
+ const result = await runCli(["create-goals", "--help"]);
119
+
120
+ expect(result.code).toBe(0);
121
+ expect(result.stdout).toContain("Usage:");
122
+ expect(result.stdout).toContain("create-goals");
123
+ expect(`${result.stdout}${result.stderr}`).not.toContain("Missing brief text");
100
124
  });
101
125
 
102
126
  it("#given a command outside the ulw-loop vocabulary #when invoked with 'frobnicate' #then fails as unknown command", async () => {
@@ -0,0 +1,183 @@
1
+ import { mkdir, mkdtemp, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+
6
+ import { ulwLoopCommand } from "../src/cli-commands.js";
7
+ import { ulwLoopDir } from "../src/paths.js";
8
+ import { writePlan } from "../src/plan-io.js";
9
+ import type { UlwLoopItem, UlwLoopPlan, UlwLoopSuccessCriterion } from "../src/types.js";
10
+
11
+ const NOW = "2026-05-23T00:00:00.000Z";
12
+ const SESSION_ENV_KEYS = ["OMO_ULW_LOOP_SESSION_ID", "CODEX_SESSION_ID", "CODEX_THREAD_ID", "PI_SESSION_ID"] as const;
13
+
14
+ let testDir: string;
15
+ let out: string[];
16
+ let err: string[];
17
+ let savedEnv: Record<string, string | undefined>;
18
+
19
+ beforeEach(async () => {
20
+ testDir = await mkdtemp(join(tmpdir(), "ug-status-next-"));
21
+ out = [];
22
+ err = [];
23
+ savedEnv = {};
24
+ for (const key of SESSION_ENV_KEYS) {
25
+ savedEnv[key] = process.env[key];
26
+ delete process.env[key];
27
+ }
28
+ vi.spyOn(process, "cwd").mockReturnValue(testDir);
29
+ vi.spyOn(process.stdout, "write").mockImplementation((chunk: string | Uint8Array): boolean => {
30
+ out.push(chunk.toString());
31
+ return true;
32
+ });
33
+ vi.spyOn(process.stderr, "write").mockImplementation((chunk: string | Uint8Array): boolean => {
34
+ err.push(chunk.toString());
35
+ return true;
36
+ });
37
+ });
38
+
39
+ afterEach(async () => {
40
+ vi.restoreAllMocks();
41
+ for (const key of SESSION_ENV_KEYS) {
42
+ const saved = savedEnv[key];
43
+ if (saved === undefined) delete process.env[key];
44
+ else process.env[key] = saved;
45
+ }
46
+ await rm(testDir, { recursive: true, force: true });
47
+ });
48
+
49
+ function stdoutJson(): Record<string, unknown> {
50
+ return JSON.parse(out.join(""));
51
+ }
52
+
53
+ function nextActions(): readonly string[] {
54
+ const value = stdoutJson()["nextActions"];
55
+ if (!Array.isArray(value)) throw new Error(`expected nextActions array, got ${JSON.stringify(value)}`);
56
+ return value.map((entry) => String(entry));
57
+ }
58
+
59
+ function criterion(id: string, status: UlwLoopSuccessCriterion["status"]): UlwLoopSuccessCriterion {
60
+ return {
61
+ id,
62
+ scenario: `${id} scenario`,
63
+ userModel: "happy",
64
+ expectedEvidence: `${id} proof`,
65
+ capturedEvidence: status === "pass" ? `${id} passed` : null,
66
+ status,
67
+ };
68
+ }
69
+
70
+ function goal(overrides: Partial<UlwLoopItem> = {}): UlwLoopItem {
71
+ return {
72
+ id: "G001",
73
+ title: "Build auth",
74
+ objective: "Implement JWT auth endpoint",
75
+ status: "in_progress",
76
+ successCriteria: [criterion("C001", "pass")],
77
+ attempt: 1,
78
+ createdAt: NOW,
79
+ updatedAt: NOW,
80
+ ...overrides,
81
+ };
82
+ }
83
+
84
+ function plan(goals: UlwLoopItem[], overrides: Partial<UlwLoopPlan> = {}): UlwLoopPlan {
85
+ const result: UlwLoopPlan = {
86
+ version: 1,
87
+ evidenceLayoutVersion: 2,
88
+ createdAt: NOW,
89
+ updatedAt: NOW,
90
+ briefPath: ".omo/ulw-loop/brief.md",
91
+ goalsPath: ".omo/ulw-loop/goals.json",
92
+ ledgerPath: ".omo/ulw-loop/ledger.jsonl",
93
+ goals,
94
+ };
95
+ Object.assign(result, overrides);
96
+ return result;
97
+ }
98
+
99
+ function legacyLayoutPlan(goals: UlwLoopItem[], overrides: Partial<UlwLoopPlan> = {}): UlwLoopPlan {
100
+ const result = plan(goals, overrides);
101
+ delete result.evidenceLayoutVersion;
102
+ return result;
103
+ }
104
+
105
+ async function seed(seedPlan: UlwLoopPlan): Promise<void> {
106
+ await mkdir(ulwLoopDir(testDir), { recursive: true });
107
+ await writePlan(testDir, seedPlan);
108
+ }
109
+
110
+ describe("#given a plan with no goals", () => {
111
+ it("#when status --json #then nextActions points at create-goals", async () => {
112
+ await seed(plan([]));
113
+
114
+ expect(await ulwLoopCommand(["status", "--json"])).toBe(0);
115
+ expect(nextActions().join("\n")).toContain('omo-agent-toolkit ulw-loop create-goals --brief "<brief>" --json');
116
+ });
117
+ });
118
+
119
+ describe("#given an active goal with unresolved criteria", () => {
120
+ it("#when status --json #then nextActions names record-evidence with the remaining criterion ids", async () => {
121
+ await seed(
122
+ plan(
123
+ [
124
+ goal({
125
+ successCriteria: [criterion("C001", "pass"), criterion("C002", "pending"), criterion("C003", "fail")],
126
+ }),
127
+ ],
128
+ {
129
+ activeGoalId: "G001",
130
+ },
131
+ ),
132
+ );
133
+
134
+ expect(await ulwLoopCommand(["status", "--json"])).toBe(0);
135
+ const actions = nextActions().join("\n");
136
+ expect(actions).toContain("record-evidence");
137
+ expect(actions).toContain("C002");
138
+ expect(actions).toContain("C003");
139
+ expect(actions).not.toContain("C001");
140
+ expect(stdoutJson()).toHaveProperty("currentAttemptDir");
141
+ });
142
+ });
143
+
144
+ describe("#given the final story with every criterion passing", () => {
145
+ it("#when status --json #then nextActions tells the agent to complete the goal then print the template", async () => {
146
+ await seed(plan([goal({ successCriteria: [criterion("C001", "pass")] })], { activeGoalId: "G001" }));
147
+
148
+ expect(await ulwLoopCommand(["status", "--json"])).toBe(0);
149
+ const actions = nextActions().join("\n");
150
+ expect(actions).toContain("update_goal complete, then checkpoint --print-template");
151
+ });
152
+ });
153
+
154
+ describe("#given a review_blocked goal", () => {
155
+ it("#when status --json #then nextActions points at record-review-blockers", async () => {
156
+ await seed(plan([goal({ status: "review_blocked", successCriteria: [criterion("C001", "pass")] })]));
157
+
158
+ expect(await ulwLoopCommand(["status", "--json"])).toBe(0);
159
+ expect(nextActions().join("\n")).toContain("record-review-blockers");
160
+ });
161
+ });
162
+
163
+ describe("#given an evidence-layout v1 plan", () => {
164
+ it("#when status --json #then currentAttemptDir stays absent and nextActions explains the v1 layout", async () => {
165
+ await seed(legacyLayoutPlan([goal()], { activeGoalId: "G001" }));
166
+
167
+ expect(await ulwLoopCommand(["status", "--json"])).toBe(0);
168
+ expect(stdoutJson()).not.toHaveProperty("currentAttemptDir");
169
+ expect(nextActions().join("\n")).toContain("plan is evidence-layout v1; artifacts go under .omo/evidence/");
170
+ });
171
+ });
172
+
173
+ describe("#given a valueless --session-id in a subprocess context", () => {
174
+ it("#when any subcommand runs #then the error explains the missing session env and the flag usage", async () => {
175
+ expect(await ulwLoopCommand(["status", "--session-id", "--json"])).toBe(1);
176
+
177
+ const payload = stdoutJson();
178
+ expect(payload).toMatchObject({ ok: false, error: { code: "ULW_LOOP_SESSION_ID_REQUIRED" } });
179
+ const message = String((payload["error"] as Record<string, unknown>)["message"]);
180
+ expect(message).toContain("--session-id <id>");
181
+ expect(message).toContain("subprocess");
182
+ });
183
+ });
@@ -6,6 +6,7 @@ import type { UlwLoopItem, UlwLoopPlan, UlwLoopSuccessCriterion } from "../src/t
6
6
 
7
7
  const NOW = "2026-05-23T00:00:00.000Z";
8
8
  const FINAL_REVIEW_ROLES = ["lazycodex-code-reviewer", "lazycodex-qa-executor", "lazycodex-gate-reviewer"] as const;
9
+ const SENPI_REVIEW_ROLES = ["omo-senpi-code-reviewer", "omo-senpi-qa-executor", "omo-senpi-gate-reviewer"] as const;
9
10
  const QUALITY_GATE_SECTIONS = ["codeReview", "manualQa", "gateReview", "iteration", "criteriaCoverage"] as const;
10
11
 
11
12
  function makeCriterion(overrides: Partial<UlwLoopSuccessCriterion> = {}): UlwLoopSuccessCriterion {
@@ -94,6 +95,40 @@ describe("buildCodexGoalInstruction aggregate mode", () => {
94
95
  expect(text).toContain("checkpoint");
95
96
  });
96
97
 
98
+ it("#given a final story on the omo-senpi surface #when rendering instructions #then teaches the single-gate category chain", () => {
99
+ const { text } = buildCodexGoalInstruction({
100
+ plan: makePlan({ codexGoalMode: "aggregate" }),
101
+ goal: makeGoal(),
102
+ isFinal: true,
103
+ surface: "omo-senpi",
104
+ });
105
+
106
+ expectTextToContainAll(text, [
107
+ "main-session",
108
+ 'category: "deep"',
109
+ "unspecified-high",
110
+ "unspecified-low",
111
+ "gateReview.by",
112
+ "category:<name>",
113
+ "--print-template",
114
+ ]);
115
+ for (const role of [...FINAL_REVIEW_ROLES, ...SENPI_REVIEW_ROLES]) expect(text).not.toContain(role);
116
+ expect(text).toMatch(/model_unavailable/);
117
+ expect(text).not.toContain("attempted_chain");
118
+ });
119
+
120
+ it("#given a final story with the explicit lazycodex surface #when rendering instructions #then keeps the lazycodex reviewers", () => {
121
+ const { text } = buildCodexGoalInstruction({
122
+ plan: makePlan({ codexGoalMode: "aggregate" }),
123
+ goal: makeGoal(),
124
+ isFinal: true,
125
+ surface: "lazycodex",
126
+ });
127
+
128
+ expectTextToContainAll(text, FINAL_REVIEW_ROLES);
129
+ for (const role of SENPI_REVIEW_ROLES) expect(text).not.toContain(role);
130
+ });
131
+
97
132
  it("#given a scoped plan #when rendering final commands #then includes the session id option", () => {
98
133
  const { text } = buildCodexGoalInstruction({
99
134
  plan: makePlan({
@@ -113,9 +148,9 @@ describe("buildCodexGoalInstruction aggregate mode", () => {
113
148
 
114
149
  describe("buildCodexGoalInstruction per_story mode", () => {
115
150
  it("uses the goal's own objective for create_goal", () => {
116
- const goal = makeGoal({ objective: "Build the auth service" });
151
+ const goal = makeGoal({ objective: "per-story-objective-sentinel" });
117
152
  const { text } = buildCodexGoalInstruction({ plan: makePlan({ codexGoalMode: "per_story" }), goal });
118
- expect(text).toContain("Build the auth service");
153
+ expect(text).toContain("per-story-objective-sentinel");
119
154
  });
120
155
  });
121
156
 
@@ -24,6 +24,24 @@ describe("parseCodexGoalSnapshot", () => {
24
24
  expect(snapshot.status).toBe("active");
25
25
  });
26
26
 
27
+ it("reads the objective from a title-bearing ulw-loop status goal", () => {
28
+ // given
29
+ const payload = {
30
+ id: "G002-goal-2-senpi-repo-audit-determine-wh",
31
+ title: "Audit the Senpi repository",
32
+ status: "in_progress",
33
+ successCriteria: [],
34
+ };
35
+
36
+ // when
37
+ const snapshot = parseCodexGoalSnapshot(payload);
38
+
39
+ // then
40
+ expect(snapshot.available).toBe(true);
41
+ expect(snapshot.objective).toBe("Audit the Senpi repository");
42
+ expect(snapshot.status).toBe("active");
43
+ });
44
+
27
45
  it("ignores remaining token budget fields from goal snapshots", () => {
28
46
  // given
29
47
  const payload = { goal: { objective: "X", status: "active" }, remainingTokens: 123 };
@@ -242,7 +242,6 @@ describe("applyPreToolUseGoalBudgetGuard", () => {
242
242
  permissionDecision: "deny",
243
243
  },
244
244
  });
245
- expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("objective only");
246
245
  expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("token_budget");
247
246
  expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("unlimited");
248
247
  expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("update_goal");
@@ -258,7 +257,6 @@ describe("applyPreToolUseGoalBudgetGuard", () => {
258
257
  // then
259
258
  const parsed = JSON.parse(output);
260
259
  expect(parsed.hookSpecificOutput.permissionDecision).toBe("deny");
261
- expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("objective only");
262
260
  expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("update_goal");
263
261
  });
264
262
 
@@ -272,7 +270,6 @@ describe("applyPreToolUseGoalBudgetGuard", () => {
272
270
  // then
273
271
  const parsed = JSON.parse(output);
274
272
  expect(parsed.hookSpecificOutput.permissionDecision).toBe("deny");
275
- expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("objective only");
276
273
  });
277
274
 
278
275
  it("#given create_goal omits token_budget #when PreToolUse runs #then it stays silent", () => {
@@ -1,6 +1,8 @@
1
1
  import { mkdir, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
 
4
+ import { reviewerRolesFor, type UlwLoopToolkitSurface } from "../../src/surface.js";
5
+
4
6
  // v2 evidence layout: artifacts must live inside the goal's current attempt dir
5
7
  export function qaDirFor(goalId: string, attempt = 1, sessionId = "session"): string {
6
8
  return `.omo/evidence/ulw/${sessionId}/${goalId}/a${attempt}`;
@@ -25,13 +27,15 @@ export async function qualityGateJson(
25
27
  repoRoot: string,
26
28
  cliArtifactPath?: string,
27
29
  goalId = "G001-finished",
30
+ surface: UlwLoopToolkitSurface = "lazycodex",
28
31
  ): Promise<string> {
32
+ const roles = reviewerRolesFor(surface);
29
33
  const qaDir = qaDirFor(goalId);
30
34
  await writeQualityGateArtifacts(repoRoot, qaDir);
31
35
  const cliPath = cliArtifactPath ?? `${qaDir}/cli-pass.txt`;
32
36
  return JSON.stringify({
33
37
  codeReview: {
34
- by: "lazycodex-code-reviewer",
38
+ by: roles.codeReview,
35
39
  recommendation: "APPROVE",
36
40
  codeQualityStatus: "CLEAR",
37
41
  reportPath: `${qaDir}/code-review.md`,
@@ -39,7 +43,7 @@ export async function qualityGateJson(
39
43
  blockers: [],
40
44
  },
41
45
  manualQa: {
42
- by: "lazycodex-qa-executor",
46
+ by: roles.manualQa,
43
47
  status: "passed",
44
48
  evidence: "Ran CLI checkpoint validation with artifact-backed evidence.",
45
49
  surfaceEvidence: [
@@ -78,7 +82,7 @@ export async function qualityGateJson(
78
82
  ],
79
83
  },
80
84
  gateReview: {
81
- by: "lazycodex-gate-reviewer",
85
+ by: roles.gateReview,
82
86
  recommendation: "APPROVE",
83
87
  reportPath: `${qaDir}/gate-review.md`,
84
88
  evidence: "Verified all criteria and artifact evidence.",
@@ -0,0 +1,105 @@
1
+ import { mkdir, mkdtemp } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { describe, expect, it } from "vitest";
5
+
6
+ import { checkpointUlwLoop } from "../src/checkpoint.js";
7
+ import { ULW_LOOP_AGGREGATE_CODEX_OBJECTIVE } from "../src/goal-status.js";
8
+ import { ulwLoopDir } from "../src/paths.js";
9
+ import { readUlwLoopPlan } from "../src/plan-io.js";
10
+ import { recordFinalReviewBlockers } from "../src/review-blockers.js";
11
+ import { UlwLoopError } from "../src/types.js";
12
+ import { goal, passGoal, plan, repoWith, snapshot } from "./fixtures/checkpoint-builders.js";
13
+
14
+ async function captureError(action: () => Promise<unknown>): Promise<UlwLoopError> {
15
+ try {
16
+ await action();
17
+ } catch (error) {
18
+ expect(error).toBeInstanceOf(UlwLoopError);
19
+ if (error instanceof UlwLoopError) return error;
20
+ throw error;
21
+ }
22
+ throw new Error("Expected UlwLoopError");
23
+ }
24
+
25
+ describe("#given a codex goal snapshot whose objective differs from the plan", () => {
26
+ it("#when checkpoint reconciles it #then the mismatch carries the verbatim expected and received objectives", async () => {
27
+ const repo = await repoWith(plan([passGoal("G001"), goal({ id: "G002", status: "pending" })]));
28
+
29
+ const error = await captureError(() =>
30
+ checkpointUlwLoop(repo, {
31
+ goalId: "G001",
32
+ status: "complete",
33
+ evidence: "work complete and validation passed",
34
+ codexGoalJson: snapshot("active", "wrong objective"),
35
+ }),
36
+ );
37
+
38
+ expect(error.code).toBe("ulw_loop_codex_snapshot_mismatch");
39
+ expect(error.details).toMatchObject({
40
+ expectedObjective: ULW_LOOP_AGGREGATE_CODEX_OBJECTIVE,
41
+ receivedObjective: "wrong objective",
42
+ });
43
+ expect(error.message).toContain(
44
+ "objective must equal the plan's codexObjective exactly — copy the expected value below",
45
+ );
46
+ expect(error.message).toContain(ULW_LOOP_AGGREGATE_CODEX_OBJECTIVE);
47
+ });
48
+
49
+ it("#when record-review-blockers reconciles it #then the same guided payload is emitted", async () => {
50
+ const repo = await repoWith(
51
+ plan([passGoal("G001", { status: "complete" }), goal({ id: "G002", status: "in_progress" })]),
52
+ );
53
+
54
+ const error = await captureError(() =>
55
+ recordFinalReviewBlockers(repo, {
56
+ goalId: "G002",
57
+ title: "Resolve final review blockers",
58
+ objective: "Address the BLOCK findings",
59
+ evidence: "review verdict: REQUEST_CHANGES",
60
+ codexGoalJson: JSON.stringify({ goal: { objective: "stale objective", status: "active" } }),
61
+ }),
62
+ );
63
+
64
+ expect(error.code).toBe("ulw_loop_codex_snapshot_mismatch");
65
+ expect(error.details).toMatchObject({
66
+ expectedObjective: ULW_LOOP_AGGREGATE_CODEX_OBJECTIVE,
67
+ receivedObjective: "stale objective",
68
+ });
69
+ expect(error.message).toContain(
70
+ "objective must equal the plan's codexObjective exactly — copy the expected value below",
71
+ );
72
+ });
73
+ });
74
+
75
+ describe("#given no ulw-loop plan on disk", () => {
76
+ it("#when the plan is read #then the error names the exact create-goals bootstrap command", async () => {
77
+ const repo = await mkdtemp(join(tmpdir(), "ug-guided-plan-"));
78
+
79
+ const error = await captureError(() => readUlwLoopPlan(repo));
80
+
81
+ expect(error.code).toBe("ULW_LOOP_PLAN_MISSING");
82
+ expect(error.message).toContain('omo-agent-toolkit ulw-loop create-goals --brief "<brief>" --json');
83
+ });
84
+
85
+ it("#when sibling session dirs exist #then the error lists the existing session ids", async () => {
86
+ const repo = await mkdtemp(join(tmpdir(), "ug-guided-plan-"));
87
+ await mkdir(join(ulwLoopDir(repo), "session-alpha"), { recursive: true });
88
+ await mkdir(join(ulwLoopDir(repo), "session-beta"), { recursive: true });
89
+
90
+ const error = await captureError(() => readUlwLoopPlan(repo, { sessionId: "session-gamma" }));
91
+
92
+ expect(error.code).toBe("ULW_LOOP_PLAN_MISSING");
93
+ expect(error.message).toContain("session-alpha");
94
+ expect(error.message).toContain("session-beta");
95
+ expect(error.details).toMatchObject({ existingSessionIds: ["session-alpha", "session-beta"] });
96
+ });
97
+
98
+ it("#when no session dirs exist #then the error lists no session ids", async () => {
99
+ const repo = await mkdtemp(join(tmpdir(), "ug-guided-plan-"));
100
+
101
+ const error = await captureError(() => readUlwLoopPlan(repo, { sessionId: "session-gamma" }));
102
+
103
+ expect(error.details?.["existingSessionIds"]).toBeUndefined();
104
+ });
105
+ });