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
@@ -25,13 +25,12 @@ const AGGREGATE_EXPECTED_LABELS = new Map([
25
25
  ["hooks/hooks.json:PreToolUse:1:0", "Enforcing Unlimited Goal Budget"],
26
26
  ["hooks/hooks.json:PostToolUse:0:0", "Checking Comments"],
27
27
  ["hooks/hooks.json:PostToolUse:0:1", "Checking LSP Diagnostics"],
28
- ["hooks/hooks.json:PostToolUse:0:2", "Checking CodeGraph Init Guidance"],
29
28
  ["hooks/hooks.json:PostToolUse:1:0", "Matching Project Rules"],
30
29
  ["hooks/hooks.json:PostCompact:0:0", "Resetting Git Bash MCP Reminder"],
31
30
  ["hooks/hooks.json:PostCompact:1:0", "Resetting Project Rule Cache"],
32
31
  ["hooks/hooks.json:PostCompact:2:0", "Resetting LSP Diagnostics Cache"],
33
- ["hooks/hooks.json:Stop:0:0", "Checking Start-Work Continuation"],
34
- ["hooks/hooks.json:SubagentStop:0:0", "Checking Start-Work Continuation"],
32
+ ["hooks/hooks.json:Stop:0:0", "Checking Ulw-Execute Continuation"],
33
+ ["hooks/hooks.json:SubagentStop:0:0", "Checking Ulw-Execute Continuation"],
35
34
  ["hooks/hooks.json:SubagentStop:1:0", "Verifying LazyCodex Executor Evidence"],
36
35
  ]);
37
36
 
@@ -47,8 +46,8 @@ const COMPONENT_EXPECTED_LABELS = new Map([
47
46
  ["components/ultrawork/hooks/hooks.json:UserPromptSubmit:0:0", "Checking Ultrawork Trigger"],
48
47
  ["components/ulw-loop/hooks/hooks.json:UserPromptSubmit:0:0", "Checking Ulw-Loop Steering"],
49
48
  ["components/ulw-loop/hooks/hooks.json:PreToolUse:0:0", "Enforcing Unlimited Ulw-Loop Budget"],
50
- ["components/start-work-continuation/hooks/hooks.json:Stop:0:0", "Checking Start-Work Continuation"],
51
- ["components/start-work-continuation/hooks/hooks.json:SubagentStop:0:0", "Checking Start-Work Continuation"],
49
+ ["components/ulw-execute-continuation/hooks/hooks.json:Stop:0:0", "Checking Ulw-Execute Continuation"],
50
+ ["components/ulw-execute-continuation/hooks/hooks.json:SubagentStop:0:0", "Checking Ulw-Execute Continuation"],
52
51
  [
53
52
  "components/lazycodex-executor-verify/hooks/hooks.json:SubagentStop:0:0",
54
53
  "Verifying LazyCodex Executor Evidence",
@@ -8,7 +8,7 @@ import { fileURLToPath } from "node:url";
8
8
  const root = dirname(dirname(fileURLToPath(import.meta.url)));
9
9
  const scriptPath = join(root, "skills", "lcx-contribute-bug-fix", "scripts", "create-pr-body.mjs");
10
10
 
11
- test("#given complete bug-fix evidence #when creating a PR body #then required LazyCodex sections and label are emitted", async () => {
11
+ test("#given complete bug-fix evidence #when creating a PR body #then evidence and machine label are emitted", async () => {
12
12
  // given
13
13
  const { createLazyCodexBugFixPrBody } = await import(`file://${scriptPath}`);
14
14
  const input = {
@@ -27,15 +27,11 @@ test("#given complete bug-fix evidence #when creating a PR body #then required L
27
27
  const body = createLazyCodexBugFixPrBody(input);
28
28
 
29
29
  // then
30
- assert.match(body, /^## Problem Situation/m);
31
- assert.match(body, /## Reproduction Logs/);
32
- assert.match(body, /## Approach/);
33
- assert.match(body, /## Why I Am Confident/);
34
- assert.match(body, /## Risks/);
35
- assert.match(body, /## User-Visible Behavior Changes/);
36
- assert.match(body, /## Verification/);
37
- assert.match(body, /lazycodex-generated/);
38
- assert.match(body, /This PR was debugged, implemented, and created with \[LazyCodex\]/);
30
+ for (const field of ["problem", "reproductionLogs", "approach", "confidence", "risks", "userVisibleBehaviorChanges"]) {
31
+ assert.ok(body.includes(input[field]));
32
+ }
33
+ for (const command of input.verification) assert.ok(body.includes(command));
34
+ assert.match(body, /^Tag: lazycodex-generated$/m);
39
35
  });
40
36
 
41
37
  test("#given missing bug-fix evidence #when creating a PR body #then the script rejects the incomplete payload", async () => {
@@ -57,7 +53,7 @@ test("#given missing bug-fix evidence #when creating a PR body #then the script
57
53
  });
58
54
 
59
55
  // then
60
- assert.throws(action, /reproductionLogs must be a non-empty string/);
56
+ assert.throws(action, /reproductionLogs/);
61
57
  });
62
58
 
63
59
  test("#given a JSON payload path #when running the PR body script #then markdown is written to the requested file", async () => {
@@ -65,27 +61,25 @@ test("#given a JSON payload path #when running the PR body script #then markdown
65
61
  const workspace = await mkdtemp(join(tmpdir(), "lcx-pr-body-test-"));
66
62
  const inputPath = join(workspace, "input.json");
67
63
  const outputPath = join(workspace, "body.md");
68
- await writeFile(
69
- inputPath,
70
- JSON.stringify({
71
- title: "Fix Codex skill sync drift",
72
- targetRepository: "code-yeongyu/lazycodex",
73
- problem: "Skill sync omitted a shared skill from the aggregate plugin.",
74
- reproductionLogs: "node --test failed before the fix.",
75
- approach: "Add the missing shared skill source and sync the aggregate plugin.",
76
- confidence: "The failing sync test now passes.",
77
- risks: "Low risk.",
78
- userVisibleBehaviorChanges: "Users get a direct bug-fix PR skill.",
79
- verification: ["node --test test/lcx-contribute-bug-fix-template.test.mjs"],
80
- }),
81
- "utf8",
82
- );
64
+ const input = {
65
+ title: "Fix Codex skill sync drift",
66
+ targetRepository: "code-yeongyu/lazycodex",
67
+ problem: "Skill sync omitted a shared skill from the aggregate plugin.",
68
+ reproductionLogs: "node --test failed before the fix.",
69
+ approach: "Add the missing shared skill source and sync the aggregate plugin.",
70
+ confidence: "The failing sync test now passes.",
71
+ risks: "Low risk.",
72
+ userVisibleBehaviorChanges: "Users get a direct bug-fix PR skill.",
73
+ verification: ["node --test test/lcx-contribute-bug-fix-template.test.mjs"],
74
+ };
75
+ await writeFile(inputPath, JSON.stringify(input), "utf8");
83
76
 
84
77
  // when
85
78
  const { spawnSync } = await import("node:child_process");
79
+ const { createLazyCodexBugFixPrBody } = await import(`file://${scriptPath}`);
86
80
  const result = spawnSync(process.execPath, [scriptPath, inputPath, outputPath], { encoding: "utf8" });
87
81
 
88
82
  // then
89
83
  assert.equal(result.status, 0, result.stderr);
90
- assert.match(await readFile(outputPath, "utf8"), /## User-Visible Behavior Changes/);
84
+ assert.equal(await readFile(outputPath, "utf8"), createLazyCodexBugFixPrBody(input));
91
85
  });
@@ -14,11 +14,9 @@ test("#given aggregate MCP config #when inspected #then registers research MCPs
14
14
  const serverNames = Object.keys(mcp.mcpServers).sort();
15
15
 
16
16
  // then
17
- assert.deepEqual(serverNames, ["codegraph", "context7", "git_bash", "grep_app", "lsp"]);
17
+ assert.deepEqual(serverNames, ["context7", "git_bash", "grep_app", "lsp"]);
18
18
  assert.equal(mcp.mcpServers.grep_app.url, "https://mcp.grep.app");
19
19
  assert.equal(mcp.mcpServers.context7.url, "https://mcp.context7.com/mcp");
20
20
  assert.equal(Object.hasOwn(mcp.mcpServers, "ast_grep"), false);
21
- assert.deepEqual(mcp.mcpServers.codegraph.args, ["components/codegraph/dist/serve.js"]);
22
- assert.equal(mcp.mcpServers.codegraph.required, false);
23
21
  assert.equal(mcp.mcpServers.lsp.startup_timeout_sec, 10);
24
22
  });
@@ -55,7 +55,7 @@ test("#given stale root reasoning config #when ensuring config #then replaces st
55
55
  assert.equal(result.match(/^model_reasoning_effort\s*=/gm)?.length, 1);
56
56
  assert.equal(result.match(/^plan_mode_reasoning_effort\s*=/gm)?.length, 1);
57
57
  assert.match(result, /model = "gpt-5\.6-sol"/);
58
- assert.match(result, /model_context_window = 372000/);
58
+ assert.match(result, /model_context_window = 650000/);
59
59
  assert.match(result, /model_reasoning_effort = "high"/);
60
60
  assert.match(result, /plan_mode_reasoning_effort = "xhigh"/);
61
61
  assert.doesNotMatch(result, /gpt-5\.2/);
@@ -80,7 +80,7 @@ test("#given section settings reuse managed root keys #when ensuring config #the
80
80
  );
81
81
 
82
82
  assert.match(result, /^model = "gpt-5\.6-sol"$/m);
83
- assert.match(result, /^model_context_window = 372000$/m);
83
+ assert.match(result, /^model_context_window = 650000$/m);
84
84
  assert.match(result, /\[model_providers\.openai\]\nmodel = "provider-scoped-value"\nmodel_context_window = 123456/);
85
85
  assert.match(result, /\[profiles\.review\]\nmodel_reasoning_effort = "medium"\nplan_mode_reasoning_effort = "medium"/);
86
86
  });
@@ -162,7 +162,7 @@ test("#given global and project-local stale Codex configs #when migrating #then
162
162
 
163
163
  assert.deepEqual(result.changed.sort(), [join(codexHome, "config.toml"), projectConfig].sort());
164
164
  assert.match(await readFile(join(codexHome, "config.toml"), "utf8"), /model = "gpt-5\.6-sol"/);
165
- assert.match(await readFile(projectConfig, "utf8"), /model_context_window = 372000/);
165
+ assert.match(await readFile(projectConfig, "utf8"), /model_context_window = 650000/);
166
166
  });
167
167
 
168
168
  test("#given model catalog is unavailable and stale 272k config #when migrating #then fallback catalog still upgrades it", async () => {
@@ -184,7 +184,7 @@ test("#given model catalog is unavailable and stale 272k config #when migrating
184
184
  const content = await readFile(join(codexHome, "config.toml"), "utf8");
185
185
  assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
186
186
  assert.match(content, /model = "gpt-5\.6-sol"/);
187
- assert.match(content, /model_context_window = 372000/);
187
+ assert.match(content, /model_context_window = 650000/);
188
188
  });
189
189
 
190
190
  test("#given model catalog is malformed and stale config #when migrating #then fallback catalog still upgrades it", async () => {
@@ -207,7 +207,7 @@ test("#given model catalog is malformed and stale config #when migrating #then f
207
207
  const content = await readFile(join(codexHome, "config.toml"), "utf8");
208
208
  assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
209
209
  assert.match(content, /model = "gpt-5\.6-sol"/);
210
- assert.match(content, /model_context_window = 372000/);
210
+ assert.match(content, /model_context_window = 650000/);
211
211
  });
212
212
 
213
213
  test("#given user-customized Codex model config #when migrating #then user values are preserved without root multi-agent mode", async () => {
@@ -262,7 +262,7 @@ test("#given managed config state is malformed #when migrating #then migration i
262
262
  const content = await readFile(join(codexHome, "config.toml"), "utf8");
263
263
  const state = JSON.parse(await readFile(statePath, "utf8"));
264
264
  assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
265
- assert.match(content, /model_context_window = 372000/);
265
+ assert.match(content, /model_context_window = 650000/);
266
266
  assert.equal(state.files[join(codexHome, "config.toml")].managed, true);
267
267
  });
268
268
 
@@ -671,14 +671,14 @@ test("#given global config starts with inline-comment features table #when full
671
671
  const parsed = parseTomlWithPython(content);
672
672
  assert.equal("multi_agent_mode" in parsed, false);
673
673
  assert.equal(parsed.model, "gpt-5.6-sol");
674
- assert.equal(parsed.model_context_window, 372000);
674
+ assert.equal(parsed.model_context_window, 650000);
675
675
  assert.equal(parsed.model_reasoning_effort, "high");
676
676
  assert.equal(parsed.plan_mode_reasoning_effort, "xhigh");
677
677
  assert.equal(parsed.features.plugins, true);
678
678
  assert.equal("multi_agent_mode" in parsed.features, false);
679
679
  assert.equal("model" in parsed.features, false);
680
680
  assert.equal("model_context_window" in parsed.features, false);
681
- assert.match(content, /^model = "gpt-5\.6-sol"\nmodel_context_window = 372000/m);
681
+ assert.match(content, /^model = "gpt-5\.6-sol"\nmodel_context_window = 650000/m);
682
682
  assert.doesNotMatch(content, /^\s*multi_agent_mode\s*=/m);
683
683
  assert.match(content, /\[features\] # keep comment\nplugins = true/);
684
684
  });
@@ -8,42 +8,6 @@ import { fileURLToPath, pathToFileURL } from "node:url";
8
8
  const root = dirname(dirname(fileURLToPath(import.meta.url)));
9
9
  const scriptPath = join(root, "skills", "ulw-plan", "scripts", "scaffold-plan.mjs");
10
10
  const scriptUrl = pathToFileURL(scriptPath).href;
11
- const workflowPath = join(root, "skills", "ulw-plan", "references", "full-workflow.md");
12
-
13
- test("#given the scaffold script and the workflow reference #when compared #then every plan header the script emits is documented in full-workflow.md (no drift)", async () => {
14
- // given
15
- const { PLAN_SECTION_HEADERS } = await import(scriptUrl);
16
- const workflow = await readFile(workflowPath, "utf8");
17
-
18
- // then --- the script is the single source of the plan shape; the reference must document the same headers
19
- assert.ok(PLAN_SECTION_HEADERS.length >= 6);
20
- for (const header of PLAN_SECTION_HEADERS) {
21
- assert.ok(workflow.includes(header), `full-workflow.md is missing plan header: ${header}`);
22
- }
23
- });
24
-
25
- test("#given buildPlanSkeleton #when intent is unclear #then the human TL;DR leads the plan and surfaces the decisions veto block", async () => {
26
- // given
27
- const { buildPlanSkeleton, PLAN_SECTION_HEADERS } = await import(scriptUrl);
28
- const plan = buildPlanSkeleton("demo", "unclear");
29
-
30
- // then --- the human-readable summary is on top, above the AI detail
31
- assert.ok(plan.indexOf("## TL;DR (For humans)") < plan.indexOf("## Scope"));
32
- assert.match(plan, /Decisions I made for you/);
33
- for (const header of PLAN_SECTION_HEADERS) {
34
- assert.ok(plan.includes(header), `plan skeleton missing header: ${header}`);
35
- }
36
- });
37
-
38
- test("#given buildPlanSkeleton #when intent is clear #then it surfaces a decisions-to-sanity-check block instead", async () => {
39
- // given
40
- const { buildPlanSkeleton } = await import(scriptUrl);
41
- const plan = buildPlanSkeleton("demo", "clear");
42
-
43
- // then
44
- assert.match(plan, /Decisions to sanity-check/);
45
- assert.doesNotMatch(plan, /Decisions I made for you/);
46
- });
47
11
 
48
12
  test("#given resolveSafeOmoPath #when the target escapes .omo or the workspace #then it is refused (the script never escapes .omo)", async () => {
49
13
  // given
@@ -0,0 +1,101 @@
1
+ import assert from "node:assert/strict";
2
+ import { readdir, readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import test from "node:test";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ import {
8
+ codexHarnessToolCompatibility,
9
+ insertCodexCompatibilityGuidance,
10
+ } from "../scripts/sync-skills.mjs";
11
+
12
+ const frontmatter = "---\nname: fixture-sentinel\n---\n\n";
13
+ const opencodeExample = "# SENTINEL_SECTION\ntask(SENTINEL_INPUT)\n";
14
+ const pluginRoot = dirname(dirname(fileURLToPath(import.meta.url)));
15
+ const repositoryRoot = join(pluginRoot, "..", "..");
16
+ const opencodeToolPattern = /\b(?:call_omo_agent|background_output|team_[a-z_]+|task)\s*\(/;
17
+
18
+ test("#given sentinel OpenCode tool content #when compatibility guidance is inserted #then the production artifact is placed after frontmatter and before the tool token", () => {
19
+ const input = `${frontmatter}${opencodeExample}`;
20
+
21
+ const actual = insertCodexCompatibilityGuidance(input);
22
+
23
+ assert.equal(actual, `${frontmatter}${codexHarnessToolCompatibility}${opencodeExample}`);
24
+ assert.ok(actual.indexOf(codexHarnessToolCompatibility) < actual.indexOf(opencodeExample));
25
+ });
26
+
27
+ test("#given already transformed sentinel content #when compatibility guidance is inserted again #then the transform is idempotent", () => {
28
+ const once = insertCodexCompatibilityGuidance(`${frontmatter}${opencodeExample}`);
29
+
30
+ const twice = insertCodexCompatibilityGuidance(once);
31
+
32
+ assert.equal(twice, once);
33
+ });
34
+
35
+ test("#given a stale generated compatibility block #when guidance is inserted #then the production artifact replaces it", () => {
36
+ const staleSentinel = "STALE_GENERATED_SENTINEL";
37
+ const staleGuidance = codexHarnessToolCompatibility.replace("multi_agent_v1.spawn_agent", staleSentinel);
38
+ assert.notEqual(staleGuidance, codexHarnessToolCompatibility);
39
+
40
+ const actual = insertCodexCompatibilityGuidance(`${frontmatter}${staleGuidance}${opencodeExample}`);
41
+
42
+ assert.equal(actual, `${frontmatter}${codexHarnessToolCompatibility}${opencodeExample}`);
43
+ assert.equal(actual.includes(staleSentinel), false);
44
+ });
45
+
46
+ test("#given a custom compatibility block before an OpenCode tool token #when guidance is inserted #then the custom block is preserved", () => {
47
+ const generatedHeading = codexHarnessToolCompatibility.slice(0, codexHarnessToolCompatibility.indexOf("\n") + 1);
48
+ const customBlock = `${generatedHeading}\nCUSTOM_BLOCK_SENTINEL\n\n`;
49
+ const input = `${frontmatter}${customBlock}${opencodeExample}`;
50
+
51
+ const actual = insertCodexCompatibilityGuidance(input);
52
+
53
+ assert.equal(actual, input);
54
+ });
55
+
56
+ test("#given an exported template wrapper containing an OpenCode tool token #when guidance is inserted #then wrapper bytes are preserved", () => {
57
+ const templateWrapper = "export const TEMPLATE_SENTINEL = `task(INPUT_SENTINEL)`;\n";
58
+
59
+ const actual = insertCodexCompatibilityGuidance(templateWrapper);
60
+
61
+ assert.equal(actual, `${codexHarnessToolCompatibility}${templateWrapper}`);
62
+ });
63
+
64
+ test("#given real shared skills that need Codex translation #when aggregate skills are synced #then each generated skill injects the production compatibility artifact once before any remaining OpenCode tool token", async () => {
65
+ const sharedSkillsRoot = join(repositoryRoot, "shared-skills", "skills");
66
+ const entries = await readdir(sharedSkillsRoot, { withFileTypes: true });
67
+ const syncScript = await readFile(join(pluginRoot, "scripts", "sync-skills.mjs"), "utf8");
68
+ const componentSkillNames = new Set(
69
+ [...syncScript.matchAll(/\[\s*"([^"]+)"\s*,\s*"components\//g)].map((match) => match[1]),
70
+ );
71
+ let checked = 0;
72
+
73
+ for (const entry of entries) {
74
+ if (!entry.isDirectory()) continue;
75
+ if (componentSkillNames.has(entry.name)) continue;
76
+ const source = await readFile(join(sharedSkillsRoot, entry.name, "SKILL.md"), "utf8");
77
+ const sourceToolToken = source.match(opencodeToolPattern)?.[0];
78
+ if (!sourceToolToken) continue;
79
+ const generated = await readFile(join(pluginRoot, "skills", entry.name, "SKILL.md"), "utf8");
80
+
81
+ assert.equal(generated.split(codexHarnessToolCompatibility).length - 1, 1, entry.name);
82
+ const compatibilityIndex = generated.indexOf(codexHarnessToolCompatibility);
83
+ assert.ok(compatibilityIndex >= 0, entry.name);
84
+ const firstGeneratedToolIndex = generated.search(opencodeToolPattern);
85
+ assert.ok(firstGeneratedToolIndex >= compatibilityIndex, entry.name);
86
+ assert.ok(firstGeneratedToolIndex < compatibilityIndex + codexHarnessToolCompatibility.length, entry.name);
87
+ checked += 1;
88
+ }
89
+
90
+ assert.ok(checked > 0, "at least one shared skill must exercise compatibility injection");
91
+ });
92
+
93
+ test("#given the aggregate sync implementation #when its skill adaptation pipeline is inspected #then it still applies compatibility guidance before overlays", async () => {
94
+ const script = await readFile(join(pluginRoot, "scripts", "sync-skills.mjs"), "utf8");
95
+
96
+ assert.match(
97
+ script,
98
+ /applyCodexSkillOverlays\(\s*skillName,\s*insertCodexCompatibilityGuidance\(content\),?\s*\)/,
99
+ );
100
+ assert.match(script, /await adaptSkillForCodex\(skillName\)/);
101
+ });
@@ -23,16 +23,19 @@ export const expectedSkills = [
23
23
  "remove-ai-slops",
24
24
  "review-work",
25
25
  "rules",
26
- "start-work",
27
26
  "teammode",
28
27
  "ultimate-browsing",
29
28
  "ultrawork",
29
+ "ulw-execute",
30
30
  "ulw-loop",
31
31
  "ulw-plan",
32
32
  "ulw-research",
33
33
  "visual-qa",
34
34
  ];
35
35
 
36
+ // `ultrawork` is intentionally absent: its skill body is composed by sync-skills.mjs directly from
37
+ // the canonical packages/prompts-core/prompts/ultrawork/codex.md, so it has no component skill
38
+ // source directory to diff against. Its composition is asserted separately in sync-skills.test.mjs.
36
39
  export const componentSkillSources = [
37
40
  ["comment-checker", "components/comment-checker/skills/comment-checker"],
38
41
  ["lcx-contribute-bug-fix", "components/lcx/skills/lcx-contribute-bug-fix"],
@@ -43,9 +46,16 @@ export const componentSkillSources = [
43
46
  ["teammode", "components/teammode/skills/teammode"],
44
47
  ["ulw-loop", "components/ulw-loop/skills/ulw-loop"],
45
48
  ["ulw-plan", "components/ultrawork/skills/ulw-plan"],
46
- ["ultrawork", "components/ultrawork/skills/ultrawork"],
47
49
  ];
48
50
 
51
+ export const canonicalUltraworkDirectiveRelativePath = join(
52
+ "packages",
53
+ "prompts-core",
54
+ "prompts",
55
+ "ultrawork",
56
+ "codex.md",
57
+ );
58
+
49
59
  const codexCompatibilityEndMarkers = [
50
60
  "For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. A `multi_agent_v1.wait_agent` timeout only means no new mailbox update arrived. Treat a running child as alive. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running.\n\n",
51
61
  "On `multi_agent_v2` sessions the same `agent_type` applies (the OMO installer exposes it) with `fork_turns` instead of `fork_context`. If a code block below conflicts with this section, this section wins.\n\n",
@@ -69,33 +79,33 @@ export function removeCodexCompatibilityGuidance(content) {
69
79
  return `${content.slice(0, start)}${content.slice(end + endMarker.length)}`;
70
80
  }
71
81
 
72
- const startWorkOriginalCompletion = `When all top-level checkboxes in \`## TODOs\` and \`## Final Verification Wave\` are complete:
82
+ const ulwExecuteOriginalCompletion = `When all top-level checkboxes in \`## TODOs\` and \`## Final Verification Wave\` are complete:
73
83
 
74
84
  1. Run the plan's final verification commands.
75
85
  2. For PR/branch work, finish the lifecycle from the task-owned worktree: sync \`.omo/\` state back to the main repo, create or update the PR, wait for review/verification gates, merge by default unless explicitly opted out, and remove the worktree only after successful merge or explicit handoff.
76
86
  3. Remove or mark the Boulder work as completed.
77
87
  4. Print an \`ORCHESTRATION COMPLETE\` block with the plan path, verification commands, artifacts, and cleanup receipts.`;
78
88
 
79
- const startWorkCodexCompletion = `When all top-level checkboxes in \`## TODOs\` and \`## Final Verification Wave\` are complete:
89
+ const ulwExecuteCodexCompletion = `When all top-level checkboxes in \`## TODOs\` and \`## Final Verification Wave\` are complete:
80
90
 
81
91
  1. Run the plan's final verification commands.
82
92
  2. Complete the **Global Review and Debugging Gate** before any completion claim, PR creation, PR handoff, branch handoff, or merge:
83
93
  - Invoke the \`review-work\` skill with the final diff, changed files, user goal, constraints, run command, and verification evidence. All five review lanes must return PASS. A timeout, missing deliverable, ack-only child, \`BLOCKED:\`, or inconclusive lane is a gate failure, not approval.
84
- - Each passing review lane binds to the exact full commit SHA it reviewed. Immediately append a durable record to \`.omo/start-work/ledger.jsonl\` with the lane name, full SHA, PASS verdict, and report artifact/source. Before same-SHA reuse after any continuation or compaction, re-read the ledger record and require the exact lane/SHA pair; memory, chat history, or an unstamped report is not coverage. New commits require fresh applicable lane coverage.
85
- - Run a debugging-oriented runtime audit even when the review passes: name at least three plausible failure hypotheses for the changed surface, run the distinguishing checks against the actual artifact, and append a separate durable record with the audit name, exact full SHA, verdict, and evidence artifact/source to \`.omo/start-work/ledger.jsonl\`. Reuse it only after re-reading an exact audit/SHA match.
94
+ - Each passing review lane binds to the exact full commit SHA it reviewed. Immediately append a durable record to \`.omo/ulw-execute/ledger.jsonl\` with the lane name, full SHA, PASS verdict, and report artifact/source. Before same-SHA reuse after any continuation or compaction, re-read the ledger record and require the exact lane/SHA pair; memory, chat history, or an unstamped report is not coverage. New commits require fresh applicable lane coverage.
95
+ - Run a debugging-oriented runtime audit even when the review passes: name at least three plausible failure hypotheses for the changed surface, run the distinguishing checks against the actual artifact, and append a separate durable record with the audit name, exact full SHA, verdict, and evidence artifact/source to \`.omo/ulw-execute/ledger.jsonl\`. Reuse it only after re-reading an exact audit/SHA match.
86
96
  - If any review lane or debugging hypothesis fails, invoke the \`debugging\` skill, confirm root cause with runtime evidence, add the minimal failing test or reproduction, fix it, rerun the affected verification, then rerun the Global Review and Debugging Gate.
87
- - Evidence hygiene is mandatory: redact or mask secrets and sensitive user data before writing \`.omo/start-work/ledger.jsonl\`, a PR body, or a handoff. Never include raw tokens, credentials, auth headers, cookies, API keys, env dumps, private logs, or PII; use concise summaries, lengths, hashes, or short non-sensitive prefixes instead.
97
+ - Evidence hygiene is mandatory: redact or mask secrets and sensitive user data before writing \`.omo/ulw-execute/ledger.jsonl\`, a PR body, or a handoff. Never include raw tokens, credentials, auth headers, cookies, API keys, env dumps, private logs, or PII; use concise summaries, lengths, hashes, or short non-sensitive prefixes instead.
88
98
  - If the work includes creating, updating, or handing off a PR, refresh \`git status\` and the PR/branch state from the task-owned worktree after the gate, and include only redacted review/debugging evidence in the PR body or handoff.
89
99
  3. Finish the PR/branch lifecycle from its task-owned worktree: sync \`.omo/\` state back to the main repo, create or update the PR when requested, wait for CI/review/Cubic gates, merge by default unless explicitly opted out, and remove the worktree only after successful merge or explicit handoff.
90
100
  4. Remove or mark the Boulder work as completed.
91
101
  5. Print an \`ORCHESTRATION COMPLETE\` block with the plan path, verification commands, Global Review and Debugging Gate verdict, artifacts, and cleanup receipts.`;
92
102
 
93
- const startWorkOriginalHardRule = "- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.\n- No PR/branch implementation, review, or merge in the main worktree; use the task-owned git worktree.\n- No unprefixed session ids in Boulder state. Sessions are always recorded as `codex:<session_id>`.";
103
+ const ulwExecuteOriginalHardRule = "- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.\n- No PR/branch implementation, review, or merge in the main worktree; use the task-owned git worktree.\n- No unprefixed session ids in Boulder state. Sessions are always recorded as `codex:<session_id>`.";
94
104
 
95
- const startWorkCodexHardRule = "- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.\n- No `ORCHESTRATION COMPLETE`, final response, PR creation, PR handoff, or merge before the Global Review and Debugging Gate passes with recorded evidence.\n- No PR/branch implementation or review in the main worktree; create or use a task-owned git worktree first.\n- No unprefixed session ids in Boulder state. Sessions are always recorded as `codex:<session_id>`.";
105
+ const ulwExecuteCodexHardRule = "- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.\n- No `ORCHESTRATION COMPLETE`, final response, PR creation, PR handoff, or merge before the Global Review and Debugging Gate passes with recorded evidence.\n- No PR/branch implementation or review in the main worktree; create or use a task-owned git worktree first.\n- No unprefixed session ids in Boulder state. Sessions are always recorded as `codex:<session_id>`.";
96
106
 
97
107
  const reviewWorkCodexGate = `
98
- When \`review-work\` is used as a final implementation, PR, or \`$start-work\`
108
+ When \`review-work\` is used as a final implementation, PR, or \`$ulw-execute\`
99
109
  gate, it is blocking. A timeout, missing deliverable, ack-only response,
100
110
  explicit \`BLOCKED:\`, or inconclusive lane is not a pass. Treat that lane as
101
111
  failed, investigate the underlying uncertainty with the \`debugging\` skill when
@@ -134,10 +144,10 @@ export function removeCodexSkillOverlays(skillName, content) {
134
144
  if (skillName === "ulw-research") {
135
145
  return content.replace(ulwResearchCodexDeliveryGate, ulwResearchOriginalDeliveryGates);
136
146
  }
137
- if (skillName === "start-work") {
147
+ if (skillName === "ulw-execute") {
138
148
  return content
139
- .replace(startWorkCodexCompletion, startWorkOriginalCompletion)
140
- .replace(startWorkCodexHardRule, startWorkOriginalHardRule);
149
+ .replace(ulwExecuteCodexCompletion, ulwExecuteOriginalCompletion)
150
+ .replace(ulwExecuteCodexHardRule, ulwExecuteOriginalHardRule);
141
151
  }
142
152
  if (skillName === "review-work") {
143
153
  return content.replace(reviewWorkCodexGatePattern, "");
@@ -5,8 +5,7 @@ import test from "node:test";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { sharedSkillsRootPath } from "@oh-my-opencode/shared-skills";
7
7
  import {
8
- CONTEXT_PRESSURE_SKILL_BUDGET_BYTES,
9
- assertPackagedContentMatches,
8
+ canonicalUltraworkDirectiveRelativePath,
10
9
  componentSkillSources,
11
10
  expectedSkills,
12
11
  listSkillFiles,
@@ -16,7 +15,6 @@ import {
16
15
 
17
16
  const root = dirname(dirname(fileURLToPath(import.meta.url)));
18
17
  const repoRoot = join(root, "..", "..", "..");
19
- const opencodeOnlyToolPattern = /\b(?:call_omo_agent|background_output|team_[a-z_]+|task)\s*\(/;
20
18
  const generatedSkillMetadataFiles = new Set(["agents/openai.yaml"]);
21
19
 
22
20
  async function readPackagedSkillFile(...segments) {
@@ -131,7 +129,6 @@ test("#given a shared skill name collides with a Codex component skill #when agg
131
129
  // when / then
132
130
  assert.notEqual(removeCodexCompatibilityGuidance(aggregateSkill), removeCodexCompatibilityGuidance(sharedSkill));
133
131
  assert.equal(removeCodexCompatibilityGuidance(aggregateSkill), removeCodexCompatibilityGuidance(componentSkill));
134
- assert.match(aggregateSkill, /multi_agent_v1/);
135
132
  });
136
133
 
137
134
  test("#given shared skill source tests #when aggregate Codex skills are synced #then source tests are not packaged", async () => {
@@ -180,6 +177,18 @@ test("#given component skill sources #when aggregate Codex component skills are
180
177
  }
181
178
  });
182
179
 
180
+ test("#given the canonical prompts-core directive #when the aggregate ultrawork skill is inspected #then it wraps the canonical bytes in skill frontmatter", async () => {
181
+ // given
182
+ const canonical = await readFile(join(repoRoot, canonicalUltraworkDirectiveRelativePath), "utf8");
183
+
184
+ // when
185
+ const skill = await readFile(join(root, "skills", "ultrawork", "SKILL.md"), "utf8");
186
+
187
+ // then
188
+ assert.match(skill, /^---\r?\nname: ultrawork\r?\n/);
189
+ assert.equal(removeCodexCompatibilityGuidance(skill).endsWith(canonical), true);
190
+ });
191
+
183
192
  test("#given synced ulw-loop skill #when Codex hint metadata is inspected #then ulw-loop surfaces the ulw-loop alias", async () => {
184
193
  // given
185
194
  const skillRoot = join(root, "skills", "ulw-loop");
@@ -191,9 +200,7 @@ test("#given synced ulw-loop skill #when Codex hint metadata is inspected #then
191
200
  // then
192
201
  assert.match(skill, /^---\r?\nname: ulw-loop\r?\n/m);
193
202
  assert.match(interfaceMetadata, /display_name: "\(OmO\) ulw-loop"/);
194
- assert.doesNotMatch(interfaceMetadata, /ulw-loop \/ ulw-loop/);
195
- assert.match(interfaceMetadata, /short_description: "Goal-like ultrawork loop for systematic decomposition"/);
196
- assert.match(interfaceMetadata, /default_prompt: "Use \$ulw-loop/);
203
+ assert.match(interfaceMetadata, /^\s*default_prompt:\s*".+"$/m);
197
204
  });
198
205
 
199
206
  test("#given synced ulw-loop skill #when Codex hint metadata is inspected #then ulw-loop remains discoverable as an alias", async () => {
@@ -229,92 +236,11 @@ test("#given synced git-master skill #when inspected #then commits and git histo
229
236
 
230
237
  // then
231
238
  assert.match(skill, /^---\r?\nname: git-master\r?\n/m);
232
- assert.match(skill, /MUST USE whenever a task needs a commit or git-history investigation/);
233
- assert.match(skill, /Commit only the user's requested changes/);
234
- assert.match(skill, /Choose the Git tool by the question/);
235
- assert.match(skill, /git log -S "text"/);
236
- assert.match(skill, /git blame -L start,end -- file/);
237
239
  assert.match(interfaceMetadata, /display_name: "\(OmO\) git-master"/);
238
240
  assert.match(interfaceMetadata, /- "git commit"/);
239
241
  assert.match(interfaceMetadata, /- "history search"/);
240
242
  });
241
243
 
242
- test("#given synced ulw-loop skill #when worker guidance is inspected #then context-hygiene guidance matches the source", async () => {
243
- // given
244
- const sourceSkill = await readFile(
245
- join(root, "components", "ulw-loop", "skills", "ulw-loop", "references", "full-workflow.md"),
246
- "utf8",
247
- );
248
- const syncedSkill = await readFile(join(root, "skills", "ulw-loop", "SKILL.md"), "utf8");
249
- const syncedWorkflow = await readFile(join(root, "skills", "ulw-loop", "references", "full-workflow.md"), "utf8");
250
- // ulw-loop is V2-primary (gpt-5.6 sol/terra use the flat `wait_agent`); the `multi_agent_v1.*`
251
- // namespace is documented only as the v1 fallback, so the wait_agent refs accept the bare token.
252
- const requiredPatterns = [
253
- ["wait_agent ref", /\bwait_agent\b/],
254
- ["local spawned-name tracking", /Track spawned agent names locally/],
255
- ["wait_agent mailbox path", /wait_agent.*mailbox signals/],
256
- ["progress status contract", /WORKING:/],
257
- ["long-running plan/reviewer background guidance", /Plan and reviewer agents may run for a long time/],
258
- ["bounded plan/reviewer polling", /wait_agent.*cycles/],
259
- ["exponential backoff wait guard", /double the timeout up to ~5 minutes/],
260
- ["git-master checkpointing", /git-master/],
261
- ["touched-path commit-style probe", /touched-path commit history/],
262
- ["verified work-unit commit", /verified work unit/],
263
- ["observed commit style", /commit in the observed style/],
264
- ];
265
-
266
- // when / then
267
- for (const [label, pattern] of requiredPatterns) {
268
- assert.match(sourceSkill, pattern, `source skill missing ${label}`);
269
- assert.match(syncedWorkflow, pattern, `synced workflow missing ${label}`);
270
- }
271
- assert.match(syncedSkill, /references\/full-workflow\.md/);
272
- assert.match(syncedSkill, /wait_agent/);
273
- assert.match(syncedSkill, /close_agent/);
274
- });
275
-
276
- test("#given packaged start-work skill #when inspected #then no-plan bootstrap and adversarial verification contracts are shipped", async () => {
277
- // given
278
- const skillFile = await readPackagedSkillFile("start-work", "SKILL.md");
279
-
280
- // when / then
281
- assertPackagedContentMatches(skillFile, [
282
- ["executes Prometheus plan with Boulder state", /Prometheus work plan[\s\S]*Boulder state/],
283
- ["bootstraps ulw-plan when no selectable plan exists", /no selectable plan[\s\S]*ulw-plan|ulw-plan[\s\S]*no selectable plan/i],
284
- ["does not execute work without an approved plan", /approved plan[\s\S]*(?:before|prior to)[\s\S]*execution|execution[\s\S]*(?:requires|needs)[\s\S]*approved plan/i],
285
- ["keeps hook continuation Boulder-only", /Boulder[\s\S]*(?:continuation|Stop hook)[\s\S]*(?:only|solely)|(?:continuation|Stop hook)[\s\S]*(?:only|solely)[\s\S]*Boulder/i],
286
- ["distinguishes execution from verification", /execution[\s\S]*verification|verification[\s\S]*execution/i],
287
- ["requires dirty-worktree-aware editing", /dirty worktree/i],
288
- ["requires stale-state probes", /stale state/i],
289
- ["rejects misleading success output", /misleading success output/i],
290
- ["does not accept worker done claims without independent verification", /done claim[\s\S]*independent(?:ly)? verified|independent(?:ly)? verify[\s\S]*done claim/i],
291
- ]);
292
- });
293
-
294
- test("#given packaged ulw-plan skill #when inspected #then dynamic multi-agent planning contracts are shipped", async () => {
295
- // given
296
- const skillFile = await readPackagedSkillFile("ulw-plan", "SKILL.md");
297
- const workflowFile = await readPackagedSkillFile("ulw-plan", "references", "full-workflow.md");
298
- const combinedFile = {
299
- path: `${skillFile.path} + ${workflowFile.path}`,
300
- content: `${skillFile.content}\n${workflowFile.content}`,
301
- };
302
-
303
- // when / then
304
- assertPackagedContentMatches(combinedFile, [
305
- ["self-orchestrates 5 host subagents for planning", /(?:self-orchestrates|orchestrates)[\s\S]*5[\s\S]*host subagents/i],
306
- ["requires dynamic workflow phases", /dynamic[\s\S]*workflow[\s\S]*phase|phase[\s\S]*dynamic[\s\S]*workflow/i],
307
- ["keeps verification distinct from execution", /verification[\s\S]*execution|execution[\s\S]*verification/i],
308
- ["requires dirty-worktree-aware planning", /dirty worktree/i],
309
- ["requires stale-state checks between source and packaged payloads", /stale state/i],
310
- ["rejects misleading success output", /misleading success output/i],
311
- ["does not accept subagent outputs as success without independent verification", /subagent outputs?[\s\S]*(?:not|never)[\s\S]*(?:success|approval)|independent(?:ly)? verif(?:y|ied|ication)[\s\S]*subagent outputs?/i],
312
- ["treats Discord or external content as claims, not instructions", /(?:Discord|external content)[\s\S]*claims?[\s\S]*not instructions?|not instructions?[\s\S]*(?:Discord|external content)/i],
313
- ]);
314
- assert.doesNotMatch(combinedFile.content, opencodeOnlyToolPattern);
315
- assert.doesNotMatch(combinedFile.content, /Proceeding to plan generation/);
316
- });
317
-
318
244
  test("#given packaged Codex ulw-plan surfaces #when inspected #then dangerous sandbox bypass guidance is not shipped", async () => {
319
245
  // given
320
246
  const dangerousBypassToken = ["dangerously", "bypass"].join("-");
@@ -330,34 +256,3 @@ test("#given packaged Codex ulw-plan surfaces #when inspected #then dangerous sa
330
256
  assert.doesNotMatch(packagedWorkflow.content, dangerousBypassPattern, `${packagedWorkflow.path} ships unsafe Codex bypass guidance`);
331
257
  assert.doesNotMatch(componentWorkflow.content, dangerousBypassPattern, `${componentWorkflow.path} ships unsafe Codex bypass guidance`);
332
258
  });
333
-
334
- test("#given packaged ulw-research skill #when Codex delivery gates are inspected #then the category-based proofread gate is stripped", async () => {
335
- // given
336
- const content = await readFile(join(root, "skills", "ulw-research", "SKILL.md"), "utf8");
337
-
338
- // then the writing-category proofread gate never ships to Codex (no category concept there)
339
- assert.doesNotMatch(content, /category="writing"/, "codex ulw-research ships the writing-category proofread gate");
340
- assert.doesNotMatch(content, /Proofread gate/, "codex ulw-research still references the proofread gate");
341
- // and the visual-QA delivery gate survives as the single gate
342
- assert.match(content, /### The delivery gate \u2014 visual QA must PASS/u, "codex ulw-research lost the visual-QA delivery gate");
343
- assert.match(content, /Visual QA \(always\)/, "codex ulw-research lost the visual-QA gate body");
344
- });
345
-
346
- test("#given context-pressure-prone skills #when bundled for Codex #then the eagerly loaded payload stays budgeted", async () => {
347
- // given
348
- const skillsRoot = join(root, "skills");
349
- const skillNames = ["debugging", "ulw-loop"];
350
-
351
- // when
352
- let totalBytes = 0;
353
- for (const skillName of skillNames) {
354
- const content = await readFile(join(skillsRoot, skillName, "SKILL.md"), "utf8");
355
- totalBytes += Buffer.byteLength(content, "utf8");
356
- }
357
-
358
- // then
359
- assert.ok(
360
- totalBytes <= CONTEXT_PRESSURE_SKILL_BUDGET_BYTES,
361
- `debugging + ulw-loop eager payload is ${totalBytes} bytes, above ${CONTEXT_PRESSURE_SKILL_BUDGET_BYTES}`,
362
- );
363
- });