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

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 (551) 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 +67006 -64814
  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 +67283 -65068
  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 +804 -329
  26. package/packages/lsp-daemon/dist/client.d.ts +10 -0
  27. package/packages/lsp-daemon/dist/client.js +764 -286
  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 +768 -295
  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 +723 -250
  36. package/packages/lsp-tools-mcp/dist/lsp/manager.js +259 -125
  37. package/packages/lsp-tools-mcp/dist/mcp.js +725 -252
  38. package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
  39. package/packages/lsp-tools-mcp/dist/tools.js +729 -260
  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 +752 -300
  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 +4 -3
  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 +42 -31
  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/ast-grep/SKILL.md +1 -1
  296. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
  297. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
  298. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  299. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
  300. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  301. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
  302. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
  303. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
  304. package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
  305. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
  306. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
  307. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  308. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  309. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +3 -1
  310. package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
  311. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
  312. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
  313. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
  314. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
  315. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
  316. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
  317. package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
  318. package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  319. package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
  320. package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
  321. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +12 -8
  322. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
  323. package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
  324. package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
  325. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
  326. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  327. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  328. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  329. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
  330. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
  331. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  332. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +14 -14
  333. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
  334. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
  335. package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -1
  336. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +1 -1
  337. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +1 -1
  338. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +101 -419
  339. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
  340. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +26 -9
  341. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  342. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
  343. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
  344. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  345. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +15 -3
  346. package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +19 -26
  347. package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
  348. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +4 -3
  349. package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
  350. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +22 -1
  351. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -7
  352. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +31 -7
  353. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
  354. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +5 -5
  355. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +8 -3
  356. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
  357. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +4 -3
  358. package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
  359. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  360. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +9 -48
  361. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
  362. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  363. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +1 -1
  364. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  365. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  366. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  367. package/packages/omo-codex/plugin/test/auto-update.test.mjs +2 -27
  368. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  369. package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
  370. package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
  371. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
  372. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
  373. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +4 -5
  374. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  375. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  376. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +8 -8
  377. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  378. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
  379. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +24 -14
  380. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +14 -119
  381. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  382. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  383. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  384. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  385. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  386. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
  387. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  388. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2818 -913
  389. package/packages/{omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md → prompts-core/prompts/ultrawork/codex.md} +15 -10
  390. package/packages/shared-skills/package.json +7 -1
  391. package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
  392. package/packages/shared-skills/skills/ast-grep/SKILL.md +1 -1
  393. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
  394. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
  395. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
  396. package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
  397. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
  398. package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
  399. package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
  400. package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
  401. package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
  402. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
  403. package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
  404. package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  405. package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  406. package/packages/shared-skills/skills/debugging/SKILL.md +3 -1
  407. package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
  408. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
  409. package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
  410. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
  411. package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
  412. package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
  413. package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
  414. package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
  415. package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
  416. package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
  417. package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
  418. package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
  419. package/packages/shared-skills/skills/frontend/SKILL.md +12 -8
  420. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
  421. package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
  422. package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
  423. package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
  424. package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
  425. package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
  426. package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
  427. package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
  428. package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
  429. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  430. package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
  431. package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
  432. package/packages/shared-skills/skills/programming/SKILL.md +1 -1
  433. package/packages/shared-skills/skills/refactor/SKILL.md +1 -1
  434. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  435. package/packages/shared-skills/skills/review-work/SKILL.md +100 -418
  436. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
  437. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +26 -9
  438. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  439. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
  440. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
  441. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +9 -2
  442. package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +17 -16
  443. package/packages/shared-skills/skills/ulw-plan/SKILL.md +7 -8
  444. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +31 -7
  445. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
  446. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +5 -5
  447. package/packages/shared-skills/skills/ulw-research/SKILL.md +8 -3
  448. package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
  449. package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
  450. package/script/qa/web-terminal-visual-qa.mjs +2 -0
  451. package/script/qa/xterm-live-terminal.mjs +18 -2
  452. package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
  453. package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
  454. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
  455. package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
  456. package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
  457. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  458. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  459. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  460. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12136
  461. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9734
  462. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  463. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  464. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  465. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  466. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  467. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  468. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  469. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
  470. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
  471. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  472. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  473. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  474. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  475. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  476. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
  477. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  478. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  479. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  480. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  481. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  482. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  483. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  484. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  485. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  486. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  487. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  488. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  489. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  490. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  491. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  492. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  493. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  494. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  495. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  496. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  497. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  498. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  499. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  500. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  501. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  502. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  503. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  504. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  505. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  506. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  507. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  508. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  509. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  510. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  511. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  512. package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
  513. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
  514. package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -471
  515. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  516. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  517. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
  518. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
  519. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  520. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  521. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  522. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  523. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
  524. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
  525. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
  526. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
  527. package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
  528. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  529. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  530. package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
  531. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  532. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
  533. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
  534. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
  535. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
  536. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
  537. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
  538. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
  539. /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
  540. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
  541. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +0 -0
  542. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
  543. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
  544. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
  545. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
  546. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
  547. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
  548. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
  549. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
  550. /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
  551. /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
+ });