oh-my-opencode 4.15.0 → 4.16.0

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 (239) hide show
  1. package/dist/cli/doctor/checks/tui-plugin-config.d.ts +4 -4
  2. package/dist/cli/index.js +1149 -1040
  3. package/dist/cli/install-senpi/index.d.ts +1 -0
  4. package/dist/cli/run/poll-for-completion.d.ts +4 -0
  5. package/dist/cli/run/session-resolver.d.ts +1 -0
  6. package/dist/cli/senpi-platform-flag.d.ts +4 -0
  7. package/dist/cli/types.d.ts +2 -1
  8. package/dist/cli-node/index.js +1149 -1040
  9. package/dist/features/background-agent/manager.d.ts +16 -0
  10. package/dist/hooks/anthropic-context-window-limit-recovery/aggressive-truncation-strategy.d.ts +1 -0
  11. package/dist/index.js +1334 -1146
  12. package/dist/skills/debugging/references/methodology/06-fix.md +6 -0
  13. package/dist/skills/frontend/ATTRIBUTION.md +13 -3
  14. package/dist/skills/frontend/SKILL.md +8 -3
  15. package/dist/skills/frontend/references/design/README.md +1 -1
  16. package/dist/skills/frontend/references/design/_INDEX.md +1 -1
  17. package/dist/skills/frontend/references/design/lazyweb.md +77 -0
  18. package/dist/skills/frontend/references/design/stitch-design-example.md +121 -0
  19. package/dist/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
  20. package/dist/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
  21. package/dist/skills/programming/SKILL.md +10 -1
  22. package/dist/skills/programming/references/logging.md +91 -0
  23. package/dist/skills/ulw-plan/SKILL.md +5 -5
  24. package/dist/skills/ulw-plan/references/full-workflow.md +7 -7
  25. package/dist/skills/ulw-plan/references/intent-unclear.md +3 -3
  26. package/dist/skills/ulw-research/ATTRIBUTION.md +2 -2
  27. package/dist/skills/ulw-research/SKILL.md +28 -7
  28. package/dist/tools/skill/description-formatter.d.ts +1 -0
  29. package/dist/tools/skill/description-formatter.test-support.d.ts +9 -0
  30. package/dist/tools/skill/zauc-mocks-skill-tools/test-support.d.ts +25 -0
  31. package/dist/tui.js +121 -419
  32. package/package.json +32 -15
  33. package/packages/git-bash-mcp/dist/cli.js +2 -2
  34. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  35. package/packages/omo-codex/plugin/components/bootstrap/AGENTS.md +55 -0
  36. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +212 -117
  37. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +51 -0
  39. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +936 -248
  40. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +233 -135
  41. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +29 -0
  43. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +13 -0
  44. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +25 -0
  45. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +3 -1
  46. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +30 -1
  47. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +16 -2
  48. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +80 -0
  49. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +34 -0
  50. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +107 -0
  51. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +26 -0
  52. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +29 -0
  53. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +8 -21
  54. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +108 -0
  55. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +76 -0
  56. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +17 -111
  57. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +1 -1
  58. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +45 -67
  59. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +56 -0
  60. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  61. package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +31 -0
  62. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  63. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +45 -0
  64. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  65. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  66. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +37 -102
  67. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  68. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  69. package/packages/omo-codex/plugin/components/teammode/AGENTS.md +46 -0
  70. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  71. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +6 -0
  72. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +6 -0
  73. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  74. package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +5 -2
  75. package/packages/omo-codex/plugin/components/ultrawork/CHANGELOG.md +2 -0
  76. package/packages/omo-codex/plugin/components/ultrawork/README.md +3 -3
  77. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +51 -2
  78. package/packages/omo-codex/plugin/components/ultrawork/package.json +2 -1
  79. package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +14 -1
  80. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +380 -0
  81. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +5 -2
  82. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +4 -4
  83. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
  84. package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +5 -3
  85. package/packages/omo-codex/plugin/components/ultrawork/src/skill-pointer.ts +56 -0
  86. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +4 -4
  87. package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +12 -0
  88. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +1 -0
  89. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +82 -0
  90. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -0
  91. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +56 -5
  92. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +1 -0
  93. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +5 -1
  94. package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.d.ts +2 -1
  95. package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.js +5 -3
  96. package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-skill-pointer.d.ts +7 -0
  97. package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-skill-pointer.js +46 -0
  98. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  99. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -1
  100. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +5 -1
  101. package/packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-directive.ts +9 -3
  102. package/packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-skill-pointer.ts +55 -0
  103. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +49 -0
  104. package/packages/omo-codex/plugin/package-lock.json +13 -13
  105. package/packages/omo-codex/plugin/package.json +1 -1
  106. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +147 -2
  107. package/packages/omo-codex/plugin/scripts/auto-update-release-notes.mjs +33 -0
  108. package/packages/omo-codex/plugin/scripts/auto-update.mjs +48 -10
  109. package/packages/omo-codex/plugin/scripts/build-components.mjs +63 -17
  110. package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +10 -3
  111. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +19 -0
  112. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +18 -0
  113. package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +6 -0
  114. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +13 -3
  115. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +8 -3
  116. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +1 -1
  117. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -1
  118. package/packages/omo-codex/plugin/skills/frontend/references/design/lazyweb.md +77 -0
  119. package/packages/omo-codex/plugin/skills/frontend/references/design/stitch-design-example.md +121 -0
  120. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
  121. package/packages/omo-codex/plugin/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
  122. package/packages/omo-codex/plugin/skills/programming/SKILL.md +10 -1
  123. package/packages/omo-codex/plugin/skills/programming/references/logging.md +91 -0
  124. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +380 -0
  125. package/packages/omo-codex/plugin/skills/ultrawork/agents/openai.yaml +2 -0
  126. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -1
  127. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +5 -2
  128. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +4 -4
  129. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
  130. package/packages/omo-codex/plugin/skills/ulw-research/ATTRIBUTION.md +2 -2
  131. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +31 -10
  132. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +32 -0
  133. package/packages/omo-codex/plugin/test/auto-update.test.mjs +153 -3
  134. package/packages/omo-codex/plugin/test/install-time-build-runtime.test.mjs +1 -1
  135. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +20 -1
  136. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +39 -10
  137. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +56 -0
  138. package/packages/omo-codex/plugin/test/ulw-research-epistemic-contract.test.mjs +98 -0
  139. package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +25 -7
  140. package/packages/omo-codex/scripts/install-dist/install-local.mjs +612 -4193
  141. package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +6 -0
  142. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +13 -3
  143. package/packages/shared-skills/skills/frontend/SKILL.md +8 -3
  144. package/packages/shared-skills/skills/frontend/references/design/README.md +1 -1
  145. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -1
  146. package/packages/shared-skills/skills/frontend/references/design/lazyweb.md +77 -0
  147. package/packages/shared-skills/skills/frontend/references/design/stitch-design-example.md +121 -0
  148. package/packages/shared-skills/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
  149. package/packages/shared-skills/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
  150. package/packages/shared-skills/skills/programming/SKILL.md +10 -1
  151. package/packages/shared-skills/skills/programming/references/logging.md +91 -0
  152. package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -5
  153. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +7 -7
  154. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +3 -3
  155. package/packages/shared-skills/skills/ulw-research/ATTRIBUTION.md +2 -2
  156. package/packages/shared-skills/skills/ulw-research/SKILL.md +28 -7
  157. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +0 -10
  158. package/packages/omo-codex/plugin/skills/ultraresearch/agents/openai.yaml +0 -2
  159. /package/dist/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
  160. /package/dist/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
  161. /package/dist/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
  162. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
  163. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
  164. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
  165. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
  166. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
  167. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
  168. /package/dist/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
  169. /package/dist/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
  170. /package/dist/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
  171. /package/dist/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
  172. /package/dist/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
  173. /package/dist/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
  174. /package/dist/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
  175. /package/dist/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
  176. /package/dist/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
  177. /package/dist/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
  178. /package/dist/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
  179. /package/dist/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
  180. /package/dist/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
  181. /package/dist/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
  182. /package/dist/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
  183. /package/dist/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
  184. /package/dist/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
  185. /package/dist/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
  186. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
  187. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
  188. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
  189. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
  190. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
  191. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
  192. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
  193. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
  194. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
  195. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
  196. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
  197. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
  198. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
  199. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
  200. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
  201. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
  202. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
  203. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
  204. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
  205. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
  206. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
  207. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
  208. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
  209. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
  210. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
  211. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
  212. /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
  213. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
  214. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
  215. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
  216. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
  217. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
  218. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
  219. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
  220. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
  221. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
  222. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
  223. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
  224. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
  225. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
  226. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
  227. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
  228. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
  229. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
  230. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
  231. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
  232. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
  233. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
  234. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
  235. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
  236. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
  237. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
  238. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
  239. /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
@@ -0,0 +1,82 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+
5
+ import { afterEach, describe, expect, it } from "vitest";
6
+
7
+ import { runUserPromptSubmitHook } from "../src/codex-hook.js";
8
+ import { ULTRAWORK_DIRECTIVE } from "../src/directive.js";
9
+ import { buildUltraworkAdditionalContext, buildUltraworkSkillPointer } from "../src/skill-pointer.js";
10
+ import { parseHookOutput } from "./codex-hook-test-helpers.js";
11
+
12
+ const POINTER_MAX_BYTES = 4096;
13
+ const tempDirectories: string[] = [];
14
+
15
+ function makeTempDirectory(): string {
16
+ const directory = mkdtempSync(join(tmpdir(), "ultrawork-skill-"));
17
+ tempDirectories.push(directory);
18
+ return directory;
19
+ }
20
+
21
+ function writeSkillFile(): string {
22
+ const skillFilePath = join(makeTempDirectory(), "SKILL.md");
23
+ writeFileSync(skillFilePath, "---\nname: ultrawork\n---\n\n<ultrawork-mode>\ndirective body\n</ultrawork-mode>\n");
24
+ return skillFilePath;
25
+ }
26
+
27
+ afterEach(() => {
28
+ for (const directory of tempDirectories.splice(0)) {
29
+ rmSync(directory, { recursive: true, force: true });
30
+ }
31
+ });
32
+
33
+ describe("ultrawork skill pointer", () => {
34
+ it("#given an existing skill file #when context is built #then emits the compact pointer with the absolute path", () => {
35
+ // given
36
+ const skillFilePath = writeSkillFile();
37
+
38
+ // when
39
+ const context = buildUltraworkAdditionalContext({ skillFilePath });
40
+
41
+ // then
42
+ expect(context).toBe(buildUltraworkSkillPointer(skillFilePath));
43
+ expect(context.startsWith("<ultrawork-mode>")).toBe(true);
44
+ expect(context).toContain(skillFilePath);
45
+ expect(context).toContain("First user-visible line this turn MUST be exactly:");
46
+ expect(context).toContain("create_goal");
47
+ expect(context).not.toContain("Tier triage");
48
+ expect(Buffer.byteLength(context, "utf8")).toBeLessThan(POINTER_MAX_BYTES);
49
+ });
50
+
51
+ it("#given a missing skill file #when context is built #then falls back to the full directive", () => {
52
+ // given
53
+ const missingSkillFilePath = join(makeTempDirectory(), "SKILL.md");
54
+
55
+ // when
56
+ const context = buildUltraworkAdditionalContext({ skillFilePath: missingSkillFilePath });
57
+
58
+ // then
59
+ expect(context).toBe(ULTRAWORK_DIRECTIVE);
60
+ });
61
+
62
+ it("#given a null skill path #when context is built #then falls back to the full directive", () => {
63
+ expect(buildUltraworkAdditionalContext({ skillFilePath: null })).toBe(ULTRAWORK_DIRECTIVE);
64
+ });
65
+
66
+ it("#given the hook runs with a skill file #when prompt is ulw #then hook JSON carries the pointer", () => {
67
+ // given
68
+ const skillFilePath = writeSkillFile();
69
+
70
+ // when
71
+ const output = runUserPromptSubmitHook(
72
+ { hook_event_name: "UserPromptSubmit", prompt: "ulw this change" },
73
+ { skillFilePath },
74
+ );
75
+ const parsed = parseHookOutput(output);
76
+
77
+ // then
78
+ expect(parsed.hookSpecificOutput.hookEventName).toBe("UserPromptSubmit");
79
+ expect(parsed.hookSpecificOutput.additionalContext).toMatch(/^<ultrawork-mode>/);
80
+ expect(parsed.hookSpecificOutput.additionalContext).toContain(skillFilePath);
81
+ });
82
+ });
@@ -2,6 +2,7 @@
2
2
 
3
3
  ## [0.1.0] - unreleased
4
4
 
5
+ - Standalone ultrawork injection (`--with-ultrawork`) now emits the same compact bootstrap pointer as the ultrawork component (opener mandate, `create_goal` with `objective` only, read the bundled `ultrawork` skill at a runtime-resolved absolute path), falling back to the full bundled directive when the plugin skills tree is absent. Keeps the injected payload below Codex App's hook-output truncation budget (code-yeongyu/oh-my-openagent#5828).
5
6
  - Initial scaffold of codex-ulw-loop plugin.
6
7
  - Per-Criterion Cycle: `EXECUTE` is now **EXECUTE-AS-SCENARIO** — the agent must run the Manual-QA channel scenario the criterion named (HTTP call / tmux / browser use / computer use; see new `## Manual-QA channels` section). Inserted a new **CLEAN (PAIRED, NEVER SKIP)** step that tears down every QA-spawned process / `tmux` session / browser context / container / port / temp dir before recording evidence; the cleanup receipt is embedded in the `--evidence` string. Missing receipt → record BLOCKED, not PASS. Added Constraint #13 and a Stop Rule for leftover state.
7
8
  - New top-level **`## Manual-QA channels`** section explicitly enumerates the four channels (HTTP call, tmux, Browser use, Computer use) with concrete commands and required artifacts. Goal section now declares **TESTS ALONE NEVER PROVE DONE**: a green test suite is supporting evidence, never completion proof. Criterion-refinement step 2 requires each criterion to name its channel up front.
@@ -2270,8 +2270,57 @@ function commandScope(argv) {
2270
2270
  }
2271
2271
 
2272
2272
  // components/ulw-loop/src/ultrawork-directive.ts
2273
- import { readFileSync } from "node:fs";
2273
+ import { readFileSync as readFileSync2 } from "node:fs";
2274
+
2275
+ // components/ulw-loop/src/ultrawork-skill-pointer.ts
2276
+ import { existsSync as existsSync5, readFileSync } from "node:fs";
2277
+ import { fileURLToPath } from "node:url";
2278
+ var ULTRAWORK_SKILL_POINTER_TEMPLATE = `<ultrawork-mode>
2279
+ ULTRAWORK MODE IS ACTIVE FOR THIS TASK.
2280
+
2281
+ MANDATORY BOOTSTRAP: do all three steps, in order, before anything else.
2282
+
2283
+ 1. First user-visible line this turn MUST be exactly:
2284
+ \`ULTRAWORK MODE ENABLED!\`
2285
+
2286
+ 2. Call \`create_goal\` NOW with \`objective\` set to the user's request.
2287
+ Send \`objective\` only: no \`status\`, no budget fields. If the
2288
+ \`create_goal\` tool is unavailable, open your reply with a binding
2289
+ \`# Goal\` block instead. Never skip this step.
2290
+
2291
+ 3. Read the FULL ultrawork directive NOW, before any other tool call,
2292
+ plan, or edit. It is the \`ultrawork\` skill, stored at:
2293
+
2294
+ {{ULTRAWORK_SKILL_PATH}}
2295
+
2296
+ Read the whole file. If a read result comes back truncated, keep
2297
+ reading the remaining line ranges until you have seen every line.
2298
+ Every rule in that file is binding for this entire task: no
2299
+ compromise, no summarizing from memory, no skipping. If the file does
2300
+ not exist, tell the user the omo ultrawork skill is missing and
2301
+ continue with steps 1 and 2 plus evidence-bound execution.
2302
+
2303
+ Do not start the requested work until all three steps are complete.
2304
+ </ultrawork-mode>
2305
+ `;
2306
+ var ULTRAWORK_SKILL_PATH_PLACEHOLDER = "{{ULTRAWORK_SKILL_PATH}}";
2307
+ var ULTRAWORK_SKILL_FILE_URL = new URL("../../../skills/ultrawork/SKILL.md", import.meta.url);
2274
2308
  var ULTRAWORK_DIRECTIVE = readFileSync(new URL("../directive.md", import.meta.url), "utf8");
2309
+ function resolveUltraworkSkillFilePath() {
2310
+ return fileURLToPath(ULTRAWORK_SKILL_FILE_URL);
2311
+ }
2312
+ function buildUltraworkSkillPointer(skillFilePath) {
2313
+ return ULTRAWORK_SKILL_POINTER_TEMPLATE.replace(ULTRAWORK_SKILL_PATH_PLACEHOLDER, skillFilePath);
2314
+ }
2315
+ function buildUltraworkAdditionalContext(options = {}) {
2316
+ const skillFilePath = options.skillFilePath === undefined ? resolveUltraworkSkillFilePath() : options.skillFilePath;
2317
+ if (skillFilePath !== null && existsSync5(skillFilePath)) {
2318
+ return buildUltraworkSkillPointer(skillFilePath);
2319
+ }
2320
+ return ULTRAWORK_DIRECTIVE;
2321
+ }
2322
+
2323
+ // components/ulw-loop/src/ultrawork-directive.ts
2275
2324
  var ULTRAWORK_CURRENT_PROMPT_PATTERN = /(?:ultrawork|ulw)/i;
2276
2325
  var ULTRAWORK_DIRECTIVE_MARKER = "<ultrawork-mode>";
2277
2326
  var TRANSCRIPT_SEARCH_BYTES = 512000;
@@ -2284,14 +2333,14 @@ var CONTEXT_PRESSURE_MARKERS = [
2284
2333
  "your input exceeds the context window",
2285
2334
  "long threads and multiple compactions"
2286
2335
  ];
2287
- function buildUltraworkDirectiveOutput(input) {
2336
+ function buildUltraworkDirectiveOutput(input, options = {}) {
2288
2337
  if (isContextPressureRecoveryPrompt(input.prompt))
2289
2338
  return "";
2290
2339
  if (hasUltraworkDirectiveAlreadyInTranscript(input.transcript_path))
2291
2340
  return "";
2292
2341
  if (isContextPressureTranscript(input.transcript_path))
2293
2342
  return "";
2294
- return isUltraworkPrompt(input.prompt) ? formatAdditionalContextOutput(ULTRAWORK_DIRECTIVE) : "";
2343
+ return isUltraworkPrompt(input.prompt) ? formatAdditionalContextOutput(buildUltraworkAdditionalContext(options)) : "";
2295
2344
  }
2296
2345
  function hasUltraworkDirectiveAlreadyInTranscript(transcriptPath) {
2297
2346
  if (transcriptPath === undefined || transcriptPath === null)
@@ -2319,7 +2368,7 @@ function hasUltraworkDirectiveAlreadyInTranscript(transcriptPath) {
2319
2368
  return false;
2320
2369
  }
2321
2370
  function readTranscriptTail(transcriptPath) {
2322
- const rawTranscript = readFileSync(transcriptPath);
2371
+ const rawTranscript = readFileSync2(transcriptPath);
2323
2372
  return rawTranscript.subarray(Math.max(0, rawTranscript.byteLength - TRANSCRIPT_SEARCH_BYTES)).toString("utf8");
2324
2373
  }
2325
2374
  function isUltraworkPrompt(prompt) {
@@ -2409,7 +2458,9 @@ async function applyUserPromptUlwLoopSteering(payload, options = {}) {
2409
2458
  if (proposal === null) {
2410
2459
  if (hasSteeringDirectiveMarker(payload.prompt))
2411
2460
  return "";
2412
- return options.includeUltraworkDirective ? buildUltraworkDirectiveOutput(payload) : "";
2461
+ if (!options.includeUltraworkDirective)
2462
+ return "";
2463
+ return options.ultraworkSkillFilePath === undefined ? buildUltraworkDirectiveOutput(payload) : buildUltraworkDirectiveOutput(payload, { skillFilePath: options.ultraworkSkillFilePath });
2413
2464
  }
2414
2465
  const result = await steerUlwLoop(payload.cwd, proposal, payloadScope(payload));
2415
2466
  if (!result.accepted)
@@ -10,6 +10,7 @@ export interface UserPromptSubmitPayload {
10
10
  }
11
11
  export interface UserPromptSubmitHookOptions {
12
12
  readonly includeUltraworkDirective?: boolean;
13
+ readonly ultraworkSkillFilePath?: string | null;
13
14
  }
14
15
  export interface PreToolUsePayload {
15
16
  readonly cwd: string;
@@ -36,7 +36,11 @@ export async function applyUserPromptUlwLoopSteering(payload, options = {}) {
36
36
  if (proposal === null) {
37
37
  if (hasSteeringDirectiveMarker(payload.prompt))
38
38
  return "";
39
- return options.includeUltraworkDirective ? buildUltraworkDirectiveOutput(payload) : "";
39
+ if (!options.includeUltraworkDirective)
40
+ return "";
41
+ return options.ultraworkSkillFilePath === undefined
42
+ ? buildUltraworkDirectiveOutput(payload)
43
+ : buildUltraworkDirectiveOutput(payload, { skillFilePath: options.ultraworkSkillFilePath });
40
44
  }
41
45
  const result = await steerUlwLoop(payload.cwd, proposal, payloadScope(payload));
42
46
  if (!result.accepted)
@@ -1,5 +1,6 @@
1
+ import { type UltraworkAdditionalContextOptions } from "./ultrawork-skill-pointer.js";
1
2
  export interface UltraworkDirectiveInput {
2
3
  readonly prompt: string;
3
4
  readonly transcript_path?: string | null;
4
5
  }
5
- export declare function buildUltraworkDirectiveOutput(input: UltraworkDirectiveInput): string;
6
+ export declare function buildUltraworkDirectiveOutput(input: UltraworkDirectiveInput, options?: UltraworkAdditionalContextOptions): string;
@@ -1,5 +1,5 @@
1
1
  import { readFileSync } from "node:fs";
2
- const ULTRAWORK_DIRECTIVE = readFileSync(new URL("../directive.md", import.meta.url), "utf8");
2
+ import { buildUltraworkAdditionalContext } from "./ultrawork-skill-pointer.js";
3
3
  const ULTRAWORK_CURRENT_PROMPT_PATTERN = /(?:ultrawork|ulw)/i;
4
4
  const ULTRAWORK_DIRECTIVE_MARKER = "<ultrawork-mode>";
5
5
  const TRANSCRIPT_SEARCH_BYTES = 512_000;
@@ -12,14 +12,16 @@ const CONTEXT_PRESSURE_MARKERS = [
12
12
  "your input exceeds the context window",
13
13
  "long threads and multiple compactions",
14
14
  ];
15
- export function buildUltraworkDirectiveOutput(input) {
15
+ export function buildUltraworkDirectiveOutput(input, options = {}) {
16
16
  if (isContextPressureRecoveryPrompt(input.prompt))
17
17
  return "";
18
18
  if (hasUltraworkDirectiveAlreadyInTranscript(input.transcript_path))
19
19
  return "";
20
20
  if (isContextPressureTranscript(input.transcript_path))
21
21
  return "";
22
- return isUltraworkPrompt(input.prompt) ? formatAdditionalContextOutput(ULTRAWORK_DIRECTIVE) : "";
22
+ return isUltraworkPrompt(input.prompt)
23
+ ? formatAdditionalContextOutput(buildUltraworkAdditionalContext(options))
24
+ : "";
23
25
  }
24
26
  function hasUltraworkDirectiveAlreadyInTranscript(transcriptPath) {
25
27
  if (transcriptPath === undefined || transcriptPath === null)
@@ -0,0 +1,7 @@
1
+ export declare const ULTRAWORK_SKILL_POINTER_TEMPLATE = "<ultrawork-mode>\nULTRAWORK MODE IS ACTIVE FOR THIS TASK.\n\nMANDATORY BOOTSTRAP: do all three steps, in order, before anything else.\n\n1. First user-visible line this turn MUST be exactly:\n`ULTRAWORK MODE ENABLED!`\n\n2. Call `create_goal` NOW with `objective` set to the user's request.\nSend `objective` only: no `status`, no budget fields. If the\n`create_goal` tool is unavailable, open your reply with a binding\n`# Goal` block instead. Never skip this step.\n\n3. Read the FULL ultrawork directive NOW, before any other tool call,\nplan, or edit. It is the `ultrawork` skill, stored at:\n\n{{ULTRAWORK_SKILL_PATH}}\n\nRead the whole file. If a read result comes back truncated, keep\nreading the remaining line ranges until you have seen every line.\nEvery rule in that file is binding for this entire task: no\ncompromise, no summarizing from memory, no skipping. If the file does\nnot exist, tell the user the omo ultrawork skill is missing and\ncontinue with steps 1 and 2 plus evidence-bound execution.\n\nDo not start the requested work until all three steps are complete.\n</ultrawork-mode>\n";
2
+ export interface UltraworkAdditionalContextOptions {
3
+ readonly skillFilePath?: string | null;
4
+ }
5
+ export declare function resolveUltraworkSkillFilePath(): string;
6
+ export declare function buildUltraworkSkillPointer(skillFilePath: string): string;
7
+ export declare function buildUltraworkAdditionalContext(options?: UltraworkAdditionalContextOptions): string;
@@ -0,0 +1,46 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ export const ULTRAWORK_SKILL_POINTER_TEMPLATE = `<ultrawork-mode>
4
+ ULTRAWORK MODE IS ACTIVE FOR THIS TASK.
5
+
6
+ MANDATORY BOOTSTRAP: do all three steps, in order, before anything else.
7
+
8
+ 1. First user-visible line this turn MUST be exactly:
9
+ \`ULTRAWORK MODE ENABLED!\`
10
+
11
+ 2. Call \`create_goal\` NOW with \`objective\` set to the user's request.
12
+ Send \`objective\` only: no \`status\`, no budget fields. If the
13
+ \`create_goal\` tool is unavailable, open your reply with a binding
14
+ \`# Goal\` block instead. Never skip this step.
15
+
16
+ 3. Read the FULL ultrawork directive NOW, before any other tool call,
17
+ plan, or edit. It is the \`ultrawork\` skill, stored at:
18
+
19
+ {{ULTRAWORK_SKILL_PATH}}
20
+
21
+ Read the whole file. If a read result comes back truncated, keep
22
+ reading the remaining line ranges until you have seen every line.
23
+ Every rule in that file is binding for this entire task: no
24
+ compromise, no summarizing from memory, no skipping. If the file does
25
+ not exist, tell the user the omo ultrawork skill is missing and
26
+ continue with steps 1 and 2 plus evidence-bound execution.
27
+
28
+ Do not start the requested work until all three steps are complete.
29
+ </ultrawork-mode>
30
+ `;
31
+ const ULTRAWORK_SKILL_PATH_PLACEHOLDER = "{{ULTRAWORK_SKILL_PATH}}";
32
+ const ULTRAWORK_SKILL_FILE_URL = new URL("../../../skills/ultrawork/SKILL.md", import.meta.url);
33
+ const ULTRAWORK_DIRECTIVE = readFileSync(new URL("../directive.md", import.meta.url), "utf8");
34
+ export function resolveUltraworkSkillFilePath() {
35
+ return fileURLToPath(ULTRAWORK_SKILL_FILE_URL);
36
+ }
37
+ export function buildUltraworkSkillPointer(skillFilePath) {
38
+ return ULTRAWORK_SKILL_POINTER_TEMPLATE.replace(ULTRAWORK_SKILL_PATH_PLACEHOLDER, skillFilePath);
39
+ }
40
+ export function buildUltraworkAdditionalContext(options = {}) {
41
+ const skillFilePath = options.skillFilePath === undefined ? resolveUltraworkSkillFilePath() : options.skillFilePath;
42
+ if (skillFilePath !== null && existsSync(skillFilePath)) {
43
+ return buildUltraworkSkillPointer(skillFilePath);
44
+ }
45
+ return ULTRAWORK_DIRECTIVE;
46
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-loop",
3
- "version": "4.15.0",
3
+ "version": "4.16.0",
4
4
  "description": "Codex plugin: durable repo-native multi-goal orchestration with embedded success criteria and observable evidence audit.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -127,7 +127,7 @@ Gather context BEFORE planning with parallel `explorer` / `librarian` workers pl
127
127
  First survey available skills: read every loosely-relevant skill's description, deliberately choose which this work uses, and prefer applying genuinely-relevant skills over working raw.
128
128
  Then run tier triage per goal — rigor (LIGHT/HEAVY below) and shape (`delivery` default, or `research` when the deliverable is a cited answer, not an artifact) — and record both in an `annotate_ledger` steering entry. Default is LIGHT — a narrow change inside existing layers. Take HEAVY only on a fact you can point to: a new module / abstraction / domain model; auth, security, or session; an external integration; a DB schema or migration; concurrency, transaction boundaries, or cache invalidation; a cross-domain refactor; or the user signaled care or demanded review. When unsure, take HEAVY; upgrade the moment a HEAVY fact surfaces, never downgrade mid-run.
129
129
  HEAVY goals: spawn the `plan` agent with the gathered context, follow its wave ordering and parallel grouping exactly, and run the verification it specifies; carry 3+ successCriteria covering happy path, edge, regression, and adversarial risk. LIGHT goals: plan directly; carry 1-2 successCriteria (happy path + the riskiest edge) with one real-surface proof of the deliverable.
130
- Research-shape goals change the cycle: BEFORE each investigation, read this goal's prior ledger findings and open hypotheses, then extend them — never re-investigate an answered question (the ledger is your research notebook). Record findings via `annotate_ledger` with their source (`file:line`, command output, doc URL) as `--evidence`. Track hypotheses as `HYPOTHESIS[id]: <claim> | status: open`, flipped to `confirmed`/`refuted` only on an observed source. A research criterion passes on a cited answer — skip QA-channel, cleanup, and commit, but keep source-observability (never "looks correct"). Keep hypotheses inside the user's stated question; a scope-widening one is an `add_subgoal` proposal you surface, never silent creep. For a `research`-shape goal you MAY load `ulw-research` (legacy alias: `ultraresearch`) without hesitation — otherwise explicit-request-only, a research-shape goal IS that explicit demand. Research-only: never for a `delivery` goal. It composes with the librarian routing above — `ulw-research` for saturation (many parallel sources, recursive expansion), a single `librarian` for one lookup.
130
+ Research-shape goals change the cycle: BEFORE each investigation, read this goal's prior ledger findings and open hypotheses, then extend them — never re-investigate an answered question (the ledger is your research notebook). Record findings via `annotate_ledger` with their source (`file:line`, command output, doc URL) as `--evidence`. Track hypotheses as `HYPOTHESIS[id]: <claim> | status: open`, flipped to `confirmed`/`refuted` only on an observed source. A research criterion passes on a cited answer — skip QA-channel, cleanup, and commit, but keep source-observability (never "looks correct"). Keep hypotheses inside the user's stated question; a scope-widening one is an `add_subgoal` proposal you surface, never silent creep. For a `research`-shape goal you MAY load `ulw-research` without hesitation — otherwise explicit-request-only, a research-shape goal IS that explicit demand. Research-only: never for a `delivery` goal. It composes with the librarian routing above — `ulw-research` for saturation (many parallel sources, recursive expansion), a single `librarian` for one lookup.
131
131
  For each criterion, define upfront: `id`, exact `scenario` (tool + inputs + binary pass/fail), `expectedEvidence` artifact path, adversarial classes, stop condition, and Manual-QA channel. Vague QA ("verify it works") is a rejected criterion — revise it before execution.
132
132
  For optimization work, capture baseline speed before changes plus behavior/regression proof. Every attempt records speed, behavior/regression, and the keep/revert/iterate decision.
133
133
  A criterion's adversarial classes are the ultraqa classes a fact about the change triggers: malformed input, prompt injection, cancel/resume, stale state, dirty worktree, hung or long commands, flaky tests, misleading success output, repeated interruptions. Record untriggered classes as not-applicable in one line.
@@ -15,6 +15,7 @@ export interface UserPromptSubmitPayload {
15
15
 
16
16
  export interface UserPromptSubmitHookOptions {
17
17
  readonly includeUltraworkDirective?: boolean;
18
+ readonly ultraworkSkillFilePath?: string | null;
18
19
  }
19
20
 
20
21
  export interface PreToolUsePayload {
@@ -74,7 +75,10 @@ export async function applyUserPromptUlwLoopSteering(
74
75
  const proposal = parseUlwLoopSteeringDirective(payload.prompt);
75
76
  if (proposal === null) {
76
77
  if (hasSteeringDirectiveMarker(payload.prompt)) return "";
77
- return options.includeUltraworkDirective ? buildUltraworkDirectiveOutput(payload) : "";
78
+ if (!options.includeUltraworkDirective) return "";
79
+ return options.ultraworkSkillFilePath === undefined
80
+ ? buildUltraworkDirectiveOutput(payload)
81
+ : buildUltraworkDirectiveOutput(payload, { skillFilePath: options.ultraworkSkillFilePath });
78
82
  }
79
83
  const result = await steerUlwLoop(payload.cwd, proposal, payloadScope(payload));
80
84
  if (!result.accepted) return "";
@@ -1,5 +1,7 @@
1
1
  import { readFileSync } from "node:fs";
2
2
 
3
+ import { buildUltraworkAdditionalContext, type UltraworkAdditionalContextOptions } from "./ultrawork-skill-pointer.js";
4
+
3
5
  export interface UltraworkDirectiveInput {
4
6
  readonly prompt: string;
5
7
  readonly transcript_path?: string | null;
@@ -12,7 +14,6 @@ interface UserPromptSubmitHookOutput {
12
14
  };
13
15
  }
14
16
 
15
- const ULTRAWORK_DIRECTIVE = readFileSync(new URL("../directive.md", import.meta.url), "utf8");
16
17
  const ULTRAWORK_CURRENT_PROMPT_PATTERN = /(?:ultrawork|ulw)/i;
17
18
  const ULTRAWORK_DIRECTIVE_MARKER = "<ultrawork-mode>";
18
19
  const TRANSCRIPT_SEARCH_BYTES = 512_000;
@@ -26,11 +27,16 @@ const CONTEXT_PRESSURE_MARKERS = [
26
27
  "long threads and multiple compactions",
27
28
  ] as const;
28
29
 
29
- export function buildUltraworkDirectiveOutput(input: UltraworkDirectiveInput): string {
30
+ export function buildUltraworkDirectiveOutput(
31
+ input: UltraworkDirectiveInput,
32
+ options: UltraworkAdditionalContextOptions = {},
33
+ ): string {
30
34
  if (isContextPressureRecoveryPrompt(input.prompt)) return "";
31
35
  if (hasUltraworkDirectiveAlreadyInTranscript(input.transcript_path)) return "";
32
36
  if (isContextPressureTranscript(input.transcript_path)) return "";
33
- return isUltraworkPrompt(input.prompt) ? formatAdditionalContextOutput(ULTRAWORK_DIRECTIVE) : "";
37
+ return isUltraworkPrompt(input.prompt)
38
+ ? formatAdditionalContextOutput(buildUltraworkAdditionalContext(options))
39
+ : "";
34
40
  }
35
41
 
36
42
  function hasUltraworkDirectiveAlreadyInTranscript(transcriptPath: string | null | undefined): boolean {
@@ -0,0 +1,55 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+
4
+ export const ULTRAWORK_SKILL_POINTER_TEMPLATE = `<ultrawork-mode>
5
+ ULTRAWORK MODE IS ACTIVE FOR THIS TASK.
6
+
7
+ MANDATORY BOOTSTRAP: do all three steps, in order, before anything else.
8
+
9
+ 1. First user-visible line this turn MUST be exactly:
10
+ \`ULTRAWORK MODE ENABLED!\`
11
+
12
+ 2. Call \`create_goal\` NOW with \`objective\` set to the user's request.
13
+ Send \`objective\` only: no \`status\`, no budget fields. If the
14
+ \`create_goal\` tool is unavailable, open your reply with a binding
15
+ \`# Goal\` block instead. Never skip this step.
16
+
17
+ 3. Read the FULL ultrawork directive NOW, before any other tool call,
18
+ plan, or edit. It is the \`ultrawork\` skill, stored at:
19
+
20
+ {{ULTRAWORK_SKILL_PATH}}
21
+
22
+ Read the whole file. If a read result comes back truncated, keep
23
+ reading the remaining line ranges until you have seen every line.
24
+ Every rule in that file is binding for this entire task: no
25
+ compromise, no summarizing from memory, no skipping. If the file does
26
+ not exist, tell the user the omo ultrawork skill is missing and
27
+ continue with steps 1 and 2 plus evidence-bound execution.
28
+
29
+ Do not start the requested work until all three steps are complete.
30
+ </ultrawork-mode>
31
+ `;
32
+
33
+ const ULTRAWORK_SKILL_PATH_PLACEHOLDER = "{{ULTRAWORK_SKILL_PATH}}";
34
+ const ULTRAWORK_SKILL_FILE_URL = new URL("../../../skills/ultrawork/SKILL.md", import.meta.url);
35
+ const ULTRAWORK_DIRECTIVE = readFileSync(new URL("../directive.md", import.meta.url), "utf8");
36
+
37
+ export interface UltraworkAdditionalContextOptions {
38
+ readonly skillFilePath?: string | null;
39
+ }
40
+
41
+ export function resolveUltraworkSkillFilePath(): string {
42
+ return fileURLToPath(ULTRAWORK_SKILL_FILE_URL);
43
+ }
44
+
45
+ export function buildUltraworkSkillPointer(skillFilePath: string): string {
46
+ return ULTRAWORK_SKILL_POINTER_TEMPLATE.replace(ULTRAWORK_SKILL_PATH_PLACEHOLDER, skillFilePath);
47
+ }
48
+
49
+ export function buildUltraworkAdditionalContext(options: UltraworkAdditionalContextOptions = {}): string {
50
+ const skillFilePath = options.skillFilePath === undefined ? resolveUltraworkSkillFilePath() : options.skillFilePath;
51
+ if (skillFilePath !== null && existsSync(skillFilePath)) {
52
+ return buildUltraworkSkillPointer(skillFilePath);
53
+ }
54
+ return ULTRAWORK_DIRECTIVE;
55
+ }
@@ -61,4 +61,53 @@ describe("standalone ultrawork directive injection", () => {
61
61
 
62
62
  expect(ulwLoopDirective).toBe(ultraworkDirective);
63
63
  });
64
+
65
+ it("#given an existing ultrawork skill file #when standalone injection runs #then emits the compact skill pointer", async () => {
66
+ const skillFilePath = join(await mkdtemp(join(tmpdir(), "ug-skill-")), "SKILL.md");
67
+ await writeFile(
68
+ skillFilePath,
69
+ "---\nname: ultrawork\n---\n\n<ultrawork-mode>\ndirective body\n</ultrawork-mode>\n",
70
+ );
71
+
72
+ const output = await applyUserPromptUlwLoopSteering(payload("ulw this change", "/tmp"), {
73
+ includeUltraworkDirective: true,
74
+ ultraworkSkillFilePath: skillFilePath,
75
+ });
76
+ const parsed = JSON.parse(output);
77
+ const context = parsed.hookSpecificOutput.additionalContext;
78
+
79
+ expect(context).toMatch(/^<ultrawork-mode>/);
80
+ expect(context).toContain(skillFilePath);
81
+ expect(context).toContain("create_goal");
82
+ expect(context).not.toContain("Tier triage");
83
+ });
84
+
85
+ it("#given a missing ultrawork skill file #when standalone injection runs #then falls back to the full directive", async () => {
86
+ const missingSkillFilePath = join(await mkdtemp(join(tmpdir(), "ug-skill-")), "SKILL.md");
87
+
88
+ const output = await applyUserPromptUlwLoopSteering(payload("ulw this change", "/tmp"), {
89
+ includeUltraworkDirective: true,
90
+ ultraworkSkillFilePath: missingSkillFilePath,
91
+ });
92
+ const parsed = JSON.parse(output);
93
+
94
+ expect(parsed.hookSpecificOutput.additionalContext).toContain("Tier triage");
95
+ });
96
+
97
+ it("#given the ulw-loop pointer template #when compared to ultrawork #then the copy stays byte-identical", async () => {
98
+ const ulwLoopPointerSource = await readFile(
99
+ new URL("../src/ultrawork-skill-pointer.ts", import.meta.url),
100
+ "utf8",
101
+ );
102
+ const ultraworkPointerSource = await readFile(
103
+ new URL("../../ultrawork/src/skill-pointer.ts", import.meta.url),
104
+ "utf8",
105
+ );
106
+ const templatePattern = /export const ULTRAWORK_SKILL_POINTER_TEMPLATE = `[\s\S]*?`;\n/;
107
+ const ulwLoopTemplate = ulwLoopPointerSource.match(templatePattern)?.[0];
108
+ const ultraworkTemplate = ultraworkPointerSource.match(templatePattern)?.[0];
109
+
110
+ expect(ulwLoopTemplate).toBeDefined();
111
+ expect(ulwLoopTemplate).toBe(ultraworkTemplate);
112
+ });
64
113
  });
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "4.15.0",
3
+ "version": "4.16.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sisyphuslabs/omo-codex-plugin",
9
- "version": "4.15.0",
9
+ "version": "4.16.0",
10
10
  "workspaces": [
11
11
  "components/codegraph",
12
12
  "components/comment-checker",
@@ -93,7 +93,7 @@
93
93
  },
94
94
  "components/codegraph": {
95
95
  "name": "@sisyphuslabs/codex-codegraph",
96
- "version": "4.15.0",
96
+ "version": "4.16.0",
97
97
  "bin": {
98
98
  "omo-codegraph": "dist/cli.js"
99
99
  },
@@ -112,7 +112,7 @@
112
112
  },
113
113
  "components/comment-checker": {
114
114
  "name": "@code-yeongyu/codex-comment-checker",
115
- "version": "4.15.0",
115
+ "version": "4.16.0",
116
116
  "license": "MIT",
117
117
  "bin": {
118
118
  "omo-comment-checker": "dist/cli.js"
@@ -133,7 +133,7 @@
133
133
  },
134
134
  "components/git-bash": {
135
135
  "name": "@sisyphuslabs/codex-git-bash-hook",
136
- "version": "4.15.0",
136
+ "version": "4.16.0",
137
137
  "bin": {
138
138
  "omo-git-bash-hook": "dist/cli.js"
139
139
  },
@@ -148,7 +148,7 @@
148
148
  },
149
149
  "components/lazycodex-executor-verify": {
150
150
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
151
- "version": "4.15.0",
151
+ "version": "4.16.0",
152
152
  "license": "MIT",
153
153
  "bin": {
154
154
  "lazycodex-executor-verify": "dist/cli.js"
@@ -165,7 +165,7 @@
165
165
  },
166
166
  "components/lsp": {
167
167
  "name": "@code-yeongyu/codex-lsp",
168
- "version": "4.15.0",
168
+ "version": "4.16.0",
169
169
  "license": "MIT",
170
170
  "dependencies": {
171
171
  "@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon"
@@ -185,7 +185,7 @@
185
185
  },
186
186
  "components/rules": {
187
187
  "name": "@code-yeongyu/codex-rules",
188
- "version": "4.15.0",
188
+ "version": "4.16.0",
189
189
  "license": "MIT",
190
190
  "dependencies": {
191
191
  "picomatch": "^4.0.3"
@@ -207,7 +207,7 @@
207
207
  },
208
208
  "components/start-work-continuation": {
209
209
  "name": "@code-yeongyu/codex-start-work-continuation",
210
- "version": "4.15.0",
210
+ "version": "4.16.0",
211
211
  "license": "MIT",
212
212
  "bin": {
213
213
  "omo-start-work-continuation": "dist/cli.js"
@@ -224,7 +224,7 @@
224
224
  },
225
225
  "components/teammode": {
226
226
  "name": "@sisyphuslabs/codex-teammode",
227
- "version": "4.15.0",
227
+ "version": "4.16.0",
228
228
  "devDependencies": {
229
229
  "@types/node": "^25.9.3",
230
230
  "bun-types": "^1.3.1",
@@ -237,7 +237,7 @@
237
237
  },
238
238
  "components/telemetry": {
239
239
  "name": "@code-yeongyu/codex-telemetry",
240
- "version": "4.15.0",
240
+ "version": "4.16.0",
241
241
  "license": "MIT",
242
242
  "bin": {
243
243
  "omo-telemetry": "dist/cli.js"
@@ -255,7 +255,7 @@
255
255
  },
256
256
  "components/ultrawork": {
257
257
  "name": "@code-yeongyu/codex-ultrawork",
258
- "version": "4.15.0",
258
+ "version": "4.16.0",
259
259
  "license": "MIT",
260
260
  "bin": {
261
261
  "omo-ultrawork": "dist/cli.js"
@@ -273,7 +273,7 @@
273
273
  },
274
274
  "components/ulw-loop": {
275
275
  "name": "@code-yeongyu/codex-ulw-loop",
276
- "version": "4.15.0",
276
+ "version": "4.16.0",
277
277
  "license": "MIT",
278
278
  "bin": {
279
279
  "omo-ulw-loop": "dist/cli.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "4.15.0",
3
+ "version": "4.16.0",
4
4
  "description": "Aggregate Codex plugin root for OMO components.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",