oh-my-opencode 4.16.3 → 4.17.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 (177) hide show
  1. package/.agents/command/omomomo.md +1 -1
  2. package/.agents/skills/hyperplan/SKILL.md +3 -3
  3. package/.agents/skills/omomomo/SKILL.md +1 -1
  4. package/.opencode/command/omomomo.md +1 -1
  5. package/.opencode/skills/hyperplan/SKILL.md +3 -3
  6. package/.opencode/skills/pre-publish-review/SKILL.md +3 -0
  7. package/README.ja.md +4 -4
  8. package/README.ko.md +4 -4
  9. package/README.md +2 -2
  10. package/README.ru.md +4 -4
  11. package/README.zh-cn.md +4 -4
  12. package/dist/cli/index.js +179 -63
  13. package/dist/cli-node/index.js +179 -63
  14. package/dist/features/team-mode/test-support/async-test-helpers.d.ts +2 -2
  15. package/dist/index.js +121 -58
  16. package/dist/plugin/chat-message/types.d.ts +4 -0
  17. package/dist/plugin/command-execute-before.d.ts +1 -0
  18. package/dist/plugin/stop-continuation.d.ts +17 -0
  19. package/dist/skills/remove-ai-slops/SKILL.md +2 -2
  20. package/dist/skills/start-work/SKILL.md +5 -2
  21. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  22. package/dist/tui.js +71 -29
  23. package/package.json +15 -14
  24. package/packages/git-bash-mcp/package.json +27 -0
  25. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +3 -1
  26. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +84 -19
  27. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  28. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  31. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  32. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  33. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  35. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +6 -2
  36. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +6 -2
  37. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +2 -2
  38. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  39. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +6 -2
  40. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  41. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +67 -2
  42. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  43. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +0 -13
  45. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +1 -1
  46. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  47. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  48. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  49. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  50. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +1 -79
  51. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  52. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  53. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  54. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +2 -2
  56. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +2 -2
  57. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +6 -6
  58. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +5 -5
  59. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +26 -0
  60. package/packages/omo-codex/plugin/components/ultrawork/agents/{lazycodex-executor.toml → lazycodex-worker-low.toml} +6 -4
  61. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +26 -0
  62. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +2 -2
  63. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +4 -4
  64. package/packages/omo-codex/plugin/components/ultrawork/directive.md +55 -28
  65. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  66. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  67. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +55 -28
  68. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  69. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +22 -0
  70. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -68
  71. package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
  72. package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +2 -0
  73. package/packages/omo-codex/plugin/components/ulw-loop/README.md +3 -1
  74. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +55 -28
  75. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +6 -1
  76. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
  77. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +13 -2
  78. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +405 -25
  79. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +12 -1
  80. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +4 -2
  81. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +7 -0
  82. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +16 -1
  83. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +1 -0
  84. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.d.ts +6 -0
  85. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +20 -0
  86. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +1 -0
  87. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +12 -9
  88. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +3 -0
  89. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +148 -0
  90. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.d.ts +2 -0
  91. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +209 -0
  92. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +25 -2
  93. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  94. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -15
  95. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +29 -27
  96. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +6 -1
  97. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +14 -3
  98. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +10 -0
  99. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +12 -1
  100. package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +4 -2
  101. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +27 -1
  102. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +1 -0
  103. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +23 -0
  104. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +16 -9
  105. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +138 -0
  106. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +208 -0
  107. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +12 -0
  108. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +4 -1
  109. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +8 -35
  110. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +24 -13
  111. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -2
  112. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +43 -8
  113. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +55 -2
  114. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +228 -0
  115. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +193 -0
  116. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  117. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  118. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  119. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  120. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  121. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  122. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  123. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  124. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  125. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +18 -0
  126. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  127. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  128. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  129. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  130. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  131. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  132. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  133. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +17 -0
  134. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  135. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +2 -2
  136. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  137. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  138. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  139. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  140. package/packages/omo-codex/plugin/package-lock.json +13 -13
  141. package/packages/omo-codex/plugin/package.json +1 -1
  142. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  143. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +8 -2
  144. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +2 -2
  145. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +2 -2
  146. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -4
  147. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +8 -2
  148. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +5 -2
  149. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +55 -28
  150. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -15
  151. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +29 -27
  152. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  153. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
  154. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +2 -2
  155. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +76 -16
  156. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -2
  157. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -1
  158. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +4 -4
  159. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -4
  160. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
  161. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +4 -101
  162. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +14 -14
  163. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +11 -0
  164. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -1
  165. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +4 -2
  166. package/packages/omo-codex/plugin/test/ulw-plan-skill-contract.test.mjs +9 -40
  167. package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +4 -277
  168. package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
  169. package/packages/omo-codex/scripts/install-config.test.mjs +22 -3
  170. package/packages/omo-codex/scripts/install-dist/install-local.mjs +91 -21
  171. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +2 -2
  172. package/packages/shared-skills/skills/start-work/SKILL.md +5 -2
  173. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
  174. package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
  175. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +0 -70
  176. package/packages/omo-codex/plugin/test/ulw-research-epistemic-contract.test.mjs +0 -98
  177. package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
package/dist/index.js CHANGED
@@ -21139,6 +21139,11 @@ var CATEGORY_MODEL_REQUIREMENTS = {
21139
21139
  },
21140
21140
  deep: {
21141
21141
  fallbackChain: [
21142
+ {
21143
+ providers: ["openai", "vercel"],
21144
+ model: "gpt-5.6-terra",
21145
+ variant: "xhigh"
21146
+ },
21142
21147
  {
21143
21148
  providers: ["openai", "vercel"],
21144
21149
  model: "gpt-5.6-sol",
@@ -21202,6 +21207,11 @@ var CATEGORY_MODEL_REQUIREMENTS = {
21202
21207
  },
21203
21208
  "unspecified-low": {
21204
21209
  fallbackChain: [
21210
+ {
21211
+ providers: ["openai", "vercel"],
21212
+ model: "gpt-5.6-luna",
21213
+ variant: "xhigh"
21214
+ },
21205
21215
  {
21206
21216
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
21207
21217
  model: "claude-sonnet-4-6"
@@ -22603,6 +22613,38 @@ var SUPPLEMENTAL_MODEL_CAPABILITIES = {
22603
22613
  output: 128000
22604
22614
  }
22605
22615
  },
22616
+ "gpt-5.6-terra": {
22617
+ id: "gpt-5.6-terra",
22618
+ family: "gpt-mini",
22619
+ reasoning: true,
22620
+ temperature: false,
22621
+ toolCall: true,
22622
+ modalities: {
22623
+ input: ["text", "image", "pdf"],
22624
+ output: ["text"]
22625
+ },
22626
+ limit: {
22627
+ context: 1050000,
22628
+ input: 922000,
22629
+ output: 128000
22630
+ }
22631
+ },
22632
+ "gpt-5.6-luna": {
22633
+ id: "gpt-5.6-luna",
22634
+ family: "gpt-nano",
22635
+ reasoning: true,
22636
+ temperature: false,
22637
+ toolCall: true,
22638
+ modalities: {
22639
+ input: ["text", "image", "pdf"],
22640
+ output: ["text"]
22641
+ },
22642
+ limit: {
22643
+ context: 1050000,
22644
+ input: 922000,
22645
+ output: 128000
22646
+ }
22647
+ },
22606
22648
  "gpt-5.5": {
22607
22649
  id: "gpt-5.5",
22608
22650
  family: "gpt",
@@ -23506,28 +23548,6 @@ function truncateDescription(description, maxLength = 120) {
23506
23548
  }
23507
23549
 
23508
23550
  // packages/omo-opencode/src/tools/delegate-task/anthropic-categories.ts
23509
- var UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context>
23510
- You are working on tasks that don't fit specific categories but require moderate effort.
23511
-
23512
- <Selection_Gate>
23513
- BEFORE selecting this category, VERIFY ALL conditions:
23514
- 1. Task does NOT fit: quick (trivial), visual-engineering (UI), ultrabrain (deep logic), artistry (creative), writing (docs)
23515
- 2. Task requires more than trivial effort but is NOT system-wide
23516
- 3. Scope is contained within a few files/modules
23517
-
23518
- If task fits ANY other category, DO NOT select unspecified-low.
23519
- This is NOT a default choice - it's for genuinely unclassifiable moderate-effort work.
23520
- </Selection_Gate>
23521
- </Category_Context>
23522
-
23523
- <Caller_Warning>
23524
- THIS CATEGORY USES A MID-TIER MODEL (claude-sonnet-4-6).
23525
-
23526
- **PROVIDE CLEAR STRUCTURE:**
23527
- 1. MUST DO: Enumerate required actions explicitly
23528
- 2. MUST NOT DO: State forbidden actions to prevent scope creep
23529
- 3. EXPECTED OUTPUT: Define concrete success criteria
23530
- </Caller_Warning>`;
23531
23551
  var UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
23532
23552
  You are working on tasks that don't fit specific categories but require substantial effort.
23533
23553
 
@@ -23543,12 +23563,6 @@ If task is unclassifiable but moderate-effort, use unspecified-low instead.
23543
23563
  </Selection_Gate>
23544
23564
  </Category_Context>`;
23545
23565
  var ANTHROPIC_CATEGORIES = [
23546
- {
23547
- name: "unspecified-low",
23548
- config: { model: "anthropic/claude-sonnet-4-6" },
23549
- description: "Tasks that don't fit other categories, low effort required",
23550
- promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
23551
- },
23552
23566
  {
23553
23567
  name: "unspecified-high",
23554
23568
  config: { model: "anthropic/claude-opus-4-7", variant: "max" },
@@ -23856,6 +23870,28 @@ EXPECTED OUTPUT:
23856
23870
 
23857
23871
  If your prompt lacks this structure, REWRITE IT before delegating.
23858
23872
  </Caller_Warning>`;
23873
+ var UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context>
23874
+ You are working on tasks that don't fit specific categories but require moderate effort.
23875
+
23876
+ <Selection_Gate>
23877
+ BEFORE selecting this category, VERIFY ALL conditions:
23878
+ 1. Task does NOT fit: quick (trivial), visual-engineering (UI), ultrabrain (deep logic), artistry (creative), writing (docs)
23879
+ 2. Task requires more than trivial effort but is NOT system-wide
23880
+ 3. Scope is contained within a few files/modules
23881
+
23882
+ If task fits ANY other category, DO NOT select unspecified-low.
23883
+ This is NOT a default choice - it's for genuinely unclassifiable moderate-effort work.
23884
+ </Selection_Gate>
23885
+ </Category_Context>
23886
+
23887
+ <Caller_Warning>
23888
+ THIS CATEGORY USES A LIGHTWEIGHT MODEL (gpt-5.6-luna).
23889
+
23890
+ **PROVIDE CLEAR STRUCTURE:**
23891
+ 1. MUST DO: Enumerate required actions explicitly
23892
+ 2. MUST NOT DO: State forbidden actions to prevent scope creep
23893
+ 3. EXPECTED OUTPUT: Define concrete success criteria
23894
+ </Caller_Warning>`;
23859
23895
  var OPENAI_CATEGORIES = [
23860
23896
  {
23861
23897
  name: "ultrabrain",
@@ -23865,7 +23901,7 @@ var OPENAI_CATEGORIES = [
23865
23901
  },
23866
23902
  {
23867
23903
  name: "deep",
23868
- config: { model: "openai/gpt-5.6-sol", variant: "high" },
23904
+ config: { model: "openai/gpt-5.6-terra", variant: "xhigh" },
23869
23905
  description: "Goal-oriented autonomous problem-solving on hairy problems requiring deep research. ONE goal + ONE deliverable per call \u2014 multiple goals must fan out as parallel `deep` calls, never bundled into one.",
23870
23906
  promptAppend: DEEP_CATEGORY_PROMPT_APPEND,
23871
23907
  resolvePromptAppend: resolveDeepCategoryPromptAppend
@@ -23875,6 +23911,12 @@ var OPENAI_CATEGORIES = [
23875
23911
  config: { model: "openai/gpt-5.4-mini" },
23876
23912
  description: "Trivial tasks - single file changes, typo fixes, simple modifications",
23877
23913
  promptAppend: QUICK_CATEGORY_PROMPT_APPEND
23914
+ },
23915
+ {
23916
+ name: "unspecified-low",
23917
+ config: { model: "openai/gpt-5.6-luna", variant: "xhigh" },
23918
+ description: "Tasks that don't fit other categories, low effort required",
23919
+ promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
23878
23920
  }
23879
23921
  ];
23880
23922
 
@@ -89613,7 +89655,7 @@ function getCachedVersion(options = {}) {
89613
89655
  // package.json
89614
89656
  var package_default = {
89615
89657
  name: "oh-my-opencode",
89616
- version: "4.16.3",
89658
+ version: "4.17.0",
89617
89659
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
89618
89660
  main: "./dist/index.js",
89619
89661
  types: "dist/index.d.ts",
@@ -89676,6 +89718,7 @@ var package_default = {
89676
89718
  "packages/lsp-tools-mcp/dist",
89677
89719
  "packages/lsp-daemon/package.json",
89678
89720
  "packages/lsp-daemon/dist",
89721
+ "packages/git-bash-mcp/package.json",
89679
89722
  "packages/git-bash-mcp/dist",
89680
89723
  "packages/shared-skills/package.json",
89681
89724
  "packages/shared-skills/index.mjs",
@@ -89741,7 +89784,7 @@ var package_default = {
89741
89784
  "typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/pi-goal/tsconfig.json && tsgo --noEmit -p packages/pi-webfetch/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json",
89742
89785
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
89743
89786
  test: "bun test",
89744
- "test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
89787
+ "test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && npm --prefix packages/omo-codex/plugin/components/ulw-loop test && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
89745
89788
  "test:senpi": "node packages/omo-senpi/plugin/scripts/build-extension.mjs && node packages/omo-senpi/plugin/scripts/sync-skills.mjs && node packages/omo-senpi/plugin/scripts/embed-directive.mjs --check && bun test packages/omo-senpi",
89746
89789
  "test:windows-codex": "bun run test:codex",
89747
89790
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build"
@@ -89823,18 +89866,18 @@ var package_default = {
89823
89866
  typescript: "^6.0.3"
89824
89867
  },
89825
89868
  optionalDependencies: {
89826
- "oh-my-opencode-darwin-arm64": "4.16.3",
89827
- "oh-my-opencode-darwin-x64": "4.16.3",
89828
- "oh-my-opencode-darwin-x64-baseline": "4.16.3",
89829
- "oh-my-opencode-linux-arm64": "4.16.3",
89830
- "oh-my-opencode-linux-arm64-musl": "4.16.3",
89831
- "oh-my-opencode-linux-x64": "4.16.3",
89832
- "oh-my-opencode-linux-x64-baseline": "4.16.3",
89833
- "oh-my-opencode-linux-x64-musl": "4.16.3",
89834
- "oh-my-opencode-linux-x64-musl-baseline": "4.16.3",
89835
- "oh-my-opencode-windows-arm64": "4.16.3",
89836
- "oh-my-opencode-windows-x64": "4.16.3",
89837
- "oh-my-opencode-windows-x64-baseline": "4.16.3"
89869
+ "oh-my-opencode-darwin-arm64": "4.17.0",
89870
+ "oh-my-opencode-darwin-x64": "4.17.0",
89871
+ "oh-my-opencode-darwin-x64-baseline": "4.17.0",
89872
+ "oh-my-opencode-linux-arm64": "4.17.0",
89873
+ "oh-my-opencode-linux-arm64-musl": "4.17.0",
89874
+ "oh-my-opencode-linux-x64": "4.17.0",
89875
+ "oh-my-opencode-linux-x64-baseline": "4.17.0",
89876
+ "oh-my-opencode-linux-x64-musl": "4.17.0",
89877
+ "oh-my-opencode-linux-x64-musl-baseline": "4.17.0",
89878
+ "oh-my-opencode-windows-arm64": "4.17.0",
89879
+ "oh-my-opencode-windows-x64": "4.17.0",
89880
+ "oh-my-opencode-windows-x64-baseline": "4.17.0"
89838
89881
  },
89839
89882
  overrides: {
89840
89883
  "@earendil-works/pi-agent-core": "0.80.3",
@@ -94916,10 +94959,10 @@ Trigger when ANY apply: user said "\uC5C4\uBC00" / "strictly" / "rigorously" / "
94916
94959
 
94917
94960
  Procedure (non-negotiable):
94918
94961
  1. Spawn a reviewer via \`task(category="ultrabrain", subagent_type="plan", load_skills=[...], run_in_background=false, prompt="<goal + scenarios + evidence + diff + notepad path>")\` \u2014 or any high-rigor reviewer agent available.
94919
- 2. Reviewer verdict is BINDING. There is no "false positive". Do not argue, minimise, or explain away.
94920
- 3. Fix every concern. Re-run the FULL scenario QA. Capture fresh evidence. Update notepad.
94921
- 4. Re-submit to the SAME reviewer. Loop until UNCONDITIONAL approval. "looks good but..." = REJECTION.
94922
- 5. Only on unconditional approval may you declare done.
94962
+ 2. Verify each reviewer concern yourself. A concern blocks only when it names a success criterion the evidence fails; record concerns that cite no criterion as notes with a one-line reason \u2014 fixed or declined at your judgment.
94963
+ 3. Fix every criterion-cited blocker. Re-run ONLY the scenario QA affected by the fix; capture fresh evidence for the delta. Update notepad.
94964
+ 4. Re-submit to the SAME reviewer at most twice, passing only the delta diff, the blockers it cited, and the already-approved criteria marked out-of-scope. An approval whose only remaining items are notes counts as approval.
94965
+ 5. On approval, declare done. If criterion-cited blockers remain after two re-reviews, stop and surface them to the user \u2014 do not loop further.
94923
94966
 
94924
94967
  ## ZERO TOLERANCE FAILURES
94925
94968
  - **NO Scope Reduction**: Never make "demo", "skeleton", "simplified", "basic" versions - deliver FULL implementation
@@ -95205,7 +95248,7 @@ If ANY answer is no \u2192 GO BACK AND DO IT. Do not claim completion.
95205
95248
 
95206
95249
  ### REVIEWER GATE (triggered, not optional)
95207
95250
 
95208
- Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or refactor/migration/perf/security. Spawn a high-rigor reviewer via \`task\` with: goal, scenarios, evidence paths, full diff, notepad path. Verdict is BINDING. "looks good but..." = REJECTION. Fix every concern, re-run full scenario QA, capture fresh evidence, resubmit. Loop until UNCONDITIONAL approval.
95251
+ Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or refactor/migration/perf/security. Spawn a high-rigor reviewer via \`task\` with: goal, scenarios, evidence paths, full diff, notepad path. A concern blocks only when it names a success criterion the evidence fails; others are notes. Fix cited blockers, re-run the affected scenario QA, capture fresh delta evidence, and resubmit at most twice; an approval with only notes left counts as approval. Remaining cited blockers after two re-reviews go to the user.
95209
95252
 
95210
95253
  <MANUAL_QA_MANDATE>
95211
95254
  ### YOU MUST EXECUTE MANUAL QA. THIS IS NOT OPTIONAL. DO NOT SKIP THIS.
@@ -95455,7 +95498,7 @@ If QA starts a server, browser, tmux session, port, temp dir, or background proc
95455
95498
 
95456
95499
  Use a high-rigor reviewer when the task touches 3+ files, changes security/performance/migration behavior, lasts 30+ minutes, or the user asks for strict review.
95457
95500
 
95458
- Reviewer verdict is binding. Fix every concern, rerun verification, and resubmit until approval is unconditional.
95501
+ A reviewer concern binds only when it cites a success criterion the evidence fails; other concerns are notes. Fix cited blockers, rerun the affected verification, and resubmit the delta at most twice; then surface remaining blockers to the user.
95459
95502
 
95460
95503
  ## ZERO TOLERANCE FAILURES
95461
95504
 
@@ -95649,7 +95692,7 @@ Name the exact tool + exact invocation per scenario (literal \`curl\` / \`send-k
95649
95692
 
95650
95693
  ## REVIEWER GATE (triggered)
95651
95694
 
95652
- Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or it's a refactor/migration/perf/security change. Spawn a high-rigor reviewer via \`task\` with goal + scenarios + evidence + diff. Reviewer verdict is BINDING; "looks good but..." = rejection. Re-submit until UNCONDITIONAL approval before declaring done.
95695
+ Trigger if user said "\uC5C4\uBC00"/"strictly"/"rigorously"/"properly review", or task touches 3+ files OR ran 20+ turns OR 30+ min, or it's a refactor/migration/perf/security change. Spawn a high-rigor reviewer via \`task\` with goal + scenarios + evidence + diff. A concern blocks only when it cites a success criterion the evidence fails \u2014 others are notes. Fix cited blockers, re-run only the affected QA, and re-submit the delta at most twice; an approval with only notes left counts as approval. If cited blockers remain after two re-reviews, surface them to the user before declaring done.
95653
95696
 
95654
95697
  ## COMPLETION CRITERIA
95655
95698
 
@@ -148838,6 +148881,8 @@ call_omo_agent(subagent_type="librarian", prompt="I'm looking for proven impleme
148838
148881
  - MUST NOT: Create criteria requiring "user clicks/interacts..."
148839
148882
  - MUST NOT: Use placeholders without concrete examples (bad: "[endpoint]", good: "/api/users")
148840
148883
  - MUST NOT: Write vague QA scenarios ("verify it works", "check the page loads", "test the API returns data")
148884
+ - MUST: For a PROSE deliverable (a prompt, \`SKILL.md\`, rule, or markdown/instruction file), make QA a human/agent READ against the intended behavior, or assert only a machine-consumed value (a parsed field, a sentinel a runtime greps, a doc JSON sample through its real validator) \u2014 the file's wording has no behavioral seam
148885
+ - MUST NOT: Turn a prompt/doc change into a text-grep acceptance criterion (\`grep "<sentence>" SKILL.md\`, word/char counts, phrase presence/absence) \u2014 that pins a diff, not behavior, and blocks every legitimate edit
148841
148886
 
148842
148887
  ## Recommended Approach
148843
148888
  [1-2 sentence summary of how to proceed]
@@ -160695,6 +160740,18 @@ function parseRalphLoopArguments(rawArguments) {
160695
160740
 
160696
160741
  // packages/omo-opencode/src/plugin/command-execute-before.ts
160697
160742
  init_logger2();
160743
+
160744
+ // packages/omo-opencode/src/plugin/stop-continuation.ts
160745
+ function stopContinuation(args) {
160746
+ const { directory, hooks, sessionID } = args;
160747
+ hooks.stopContinuationGuard?.stop?.(sessionID);
160748
+ hooks.todoContinuationEnforcer?.cancelAllCountdowns();
160749
+ hooks.ralphLoop?.cancelLoop(sessionID);
160750
+ clearBoulderState(directory);
160751
+ log2("[stop-continuation] All continuation mechanisms stopped", { sessionID });
160752
+ }
160753
+
160754
+ // packages/omo-opencode/src/plugin/command-execute-before.ts
160698
160755
  var NATIVE_LOOP_TRIGGERED_FLAG = "__omoNativeLoopTriggered";
160699
160756
  function hasPartsOutput(value) {
160700
160757
  if (typeof value !== "object" || value === null)
@@ -160704,11 +160761,14 @@ function hasPartsOutput(value) {
160704
160761
  return Array.isArray(parts);
160705
160762
  }
160706
160763
  function createCommandExecuteBeforeHandler(args) {
160707
- const { hooks } = args;
160764
+ const { directory, hooks } = args;
160708
160765
  return async (input, output) => {
160709
160766
  await hooks.autoSlashCommand?.["command.execute.before"]?.(input, output);
160710
160767
  const normalizedCommand = input.command.toLowerCase();
160711
160768
  const sessionID = input.sessionID;
160769
+ if (normalizedCommand === "stop-continuation" && sessionID) {
160770
+ stopContinuation({ directory, hooks, sessionID });
160771
+ }
160712
160772
  if (hooks.ralphLoop && sessionID) {
160713
160773
  if (normalizedCommand === "ralph-loop" || normalizedCommand === "ulw-loop") {
160714
160774
  const parsedArguments = parseRalphLoopArguments(input.arguments || "");
@@ -160954,6 +161014,14 @@ function createChatMessageHandler3(args) {
160954
161014
  if (input.agent) {
160955
161015
  updateSessionAgent(input.sessionID, input.agent);
160956
161016
  }
161017
+ const slashCommand = detectSlashCommand(extractPromptText3(output.parts));
161018
+ if (slashCommand?.command === "stop-continuation") {
161019
+ stopContinuation({
161020
+ directory: ctx.directory,
161021
+ hooks,
161022
+ sessionID: input.sessionID
161023
+ });
161024
+ }
160957
161025
  const isFirstMessage = firstMessageVariantGate.shouldOverride(input.sessionID);
160958
161026
  if (isFirstMessage) {
160959
161027
  firstMessageVariantGate.markApplied(input.sessionID);
@@ -162941,13 +163009,7 @@ function createToolExecuteBeforeHandler3(args) {
162941
163009
  const command = rawName?.replace(/^\//, "").toLowerCase();
162942
163010
  const sessionID = input.sessionID || getMainSessionID();
162943
163011
  if (command === "stop-continuation" && sessionID) {
162944
- hooks.stopContinuationGuard?.stop(sessionID);
162945
- hooks.todoContinuationEnforcer?.cancelAllCountdowns();
162946
- hooks.ralphLoop?.cancelLoop(sessionID);
162947
- clearBoulderState(ctx.directory);
162948
- log2("[stop-continuation] All continuation mechanisms stopped", {
162949
- sessionID
162950
- });
163012
+ stopContinuation({ directory: ctx.directory, hooks, sessionID });
162951
163013
  }
162952
163014
  const workStartingCommands = ["start-work", "ralph-loop", "ulw-loop"];
162953
163015
  if (workStartingCommands.includes(command ?? "") && sessionID) {
@@ -162981,6 +163043,7 @@ function createPluginInterface(args) {
162981
163043
  },
162982
163044
  "chat.headers": createChatHeadersHandler({ ctx }),
162983
163045
  "command.execute.before": createCommandExecuteBeforeHandler({
163046
+ directory: ctx.directory,
162984
163047
  hooks
162985
163048
  }),
162986
163049
  "chat.message": createChatMessageHandler3({
@@ -49,6 +49,9 @@ type RalphLoopHook = {
49
49
  resumeLoop?: (sessionID: string) => boolean;
50
50
  cancelLoop: (sessionID: string) => boolean | void;
51
51
  };
52
+ type TodoContinuationEnforcerHook = {
53
+ cancelAllCountdowns: () => void;
54
+ };
52
55
  export type ChatMessageHooks = {
53
56
  modelFallback?: ChatMessageHook | null;
54
57
  stopContinuationGuard?: StopContinuationGuard | null;
@@ -63,5 +66,6 @@ export type ChatMessageHooks = {
63
66
  hephaestusAgentsMdInjector?: ChatMessageHook | null;
64
67
  startWork?: ChatMessageHook | null;
65
68
  ralphLoop?: RalphLoopHook | null;
69
+ todoContinuationEnforcer?: TodoContinuationEnforcerHook | null;
66
70
  };
67
71
  export {};
@@ -14,6 +14,7 @@ type CommandExecuteBeforeOutput = {
14
14
  };
15
15
  declare const NATIVE_LOOP_TRIGGERED_FLAG = "__omoNativeLoopTriggered";
16
16
  export declare function createCommandExecuteBeforeHandler(args: {
17
+ directory: string;
17
18
  hooks: CreatedHooks;
18
19
  }): (input: CommandExecuteBeforeInput, output: CommandExecuteBeforeOutput) => Promise<void>;
19
20
  export { NATIVE_LOOP_TRIGGERED_FLAG };
@@ -0,0 +1,17 @@
1
+ type StopContinuationHooks = {
2
+ readonly stopContinuationGuard?: {
3
+ readonly stop?: (sessionID: string) => void;
4
+ } | null;
5
+ readonly todoContinuationEnforcer?: {
6
+ readonly cancelAllCountdowns: () => void;
7
+ } | null;
8
+ readonly ralphLoop?: {
9
+ readonly cancelLoop: (sessionID: string) => boolean | void;
10
+ } | null;
11
+ };
12
+ export declare function stopContinuation(args: {
13
+ readonly directory: string;
14
+ readonly hooks: StopContinuationHooks;
15
+ readonly sessionID: string;
16
+ }): void;
17
+ export {};
@@ -62,7 +62,7 @@ The agent looks for these nine categories. The first three are stylistic, the ne
62
62
  **Hard rule**: only apply when behavior equivalence is obvious. Do NOT change algorithms with subtle correctness implications. Do NOT micro-optimize hot paths without a benchmark. If in doubt, SKIP.
63
63
 
64
64
  ### Behavior coverage
65
- 9. **Missing tests** — behavior present in changed files that is not locked by any regression test. The fix is not to remove code but to ADD the narrowest test that pins the behavior.
65
+ 9. **Missing tests** — behavior present in changed files that is not locked by any regression test. The fix is not to remove code but to ADD the narrowest test that pins the behavior. EXCEPTION: a PROSE file (prompt, `SKILL.md`, rule, markdown) has no behavioral seam — do NOT add a text/word-count/phrase pin for it; that guards a diff, not behavior. Cover only a machine-consumed value (parsed field, sentinel a runtime greps, a doc JSON sample through its real validator) or leave it to review.
66
66
 
67
67
  ### Structural
68
68
  10. **Oversized modules** — any source file exceeding **250 pure LOC** (non-blank, non-comment lines). This is an architectural defect, not a style preference. Measure: `awk '!/^[[:space:]]*$/ && !/^[[:space:]]*(#|\/\/)/' <file> | wc -l`.
@@ -122,7 +122,7 @@ For each in-scope source file:
122
122
 
123
123
  1. Identify the public/observable behavior the file exposes (exported functions, HTTP handlers, CLI commands, classes used elsewhere).
124
124
  2. Check whether existing tests cover that behavior. Use `git grep` / project test conventions to find related test files.
125
- 3. **If behavior is uncovered or weakly covered, write the narrowest regression test that pins current behavior BEFORE editing the file.** Tests should pin observable outputs, not implementation details.
125
+ 3. **If behavior is uncovered or weakly covered, write the narrowest regression test that pins current behavior BEFORE editing the file.** Tests should pin observable outputs, not implementation details. A PROSE file (prompt/`SKILL.md`/rule/markdown) is exempt — its wording is not behavior; skip the test and rely on review, or assert only a machine-consumed value.
126
126
  4. Run the test suite (or at minimum the relevant tests). They must be **green** before any cleanup begins.
127
127
 
128
128
  If you cannot establish a green baseline (e.g., test runner is broken), STOP and report. Do not proceed with cleanup on unverified ground.
@@ -14,13 +14,16 @@ Translate any OpenCode-only tool name in an inherited example to its Codex equiv
14
14
  | OpenCode example | Codex tool to use |
15
15
  | --- | --- |
16
16
  | final-review `task(...)` | `multi_agent_v1.spawn_agent({"message":"TASK: act as a rigorous reviewer. ...","agent_type":"lazycodex-gate-reviewer","fork_context":false})` |
17
- | worker `task(...)` | `multi_agent_v1.spawn_agent({"message":"TASK: act as <role>. ...","fork_context":false})` |
17
+ | worker `task(...)` | `multi_agent_v1.spawn_agent({"message":"TASK: act as <role>. ...","fork_context":false})` — for implementation workers add `agent_type: "lazycodex-worker-<low|medium|high>"` when the spawn schema exposes `agent_type` |
18
18
  | `background_output(task_id="...")` | `multi_agent_v1.wait_agent(...)` for mailbox signals |
19
19
  | `team_*(...)` | `multi_agent_v1.spawn_agent` + `multi_agent_v1.send_input` + `multi_agent_v1.wait_agent` + `multi_agent_v1.close_agent` |
20
20
 
21
21
  When translating `load_skills=[...]`, name the skills inside the spawned agent's `message`. If a code block below conflicts with this section, this section wins.
22
22
 
23
- Codex exposes ONE of two subagent tool surfaces per session; check your own tool list and route accordingly. If `multi_agent_v1.*` tools exist, use the table above as written. If instead a flat `spawn_agent` with a required `task_name` exists (`multi_agent_v2`), rewrite every `multi_agent_v1.*` example: `multi_agent_v1.spawn_agent({...,"fork_context":false})` becomes `spawn_agent({"task_name":"<lowercase_digits_underscores>","message":...,"agent_type":...,"fork_turns":"none"})` (`"all"` only when full parent history is truly required); `send_input` becomes `send_message`; do not call `close_agent`/`resume_agent` (finished agents end on their own; `followup_task` re-tasks one, `interrupt_agent` stops one); `wait_agent` takes only `timeout_ms` and returns on any child mailbox activity. `agent_type` works the same on both surfaces. If a code block below conflicts with this section, this section wins.
23
+ Codex exposes ONE of two subagent tool surfaces per session; check your own tool list and route accordingly. If `multi_agent_v1.*` tools exist, use the table above as written. If instead a flat `spawn_agent` with a required `task_name` exists (`multi_agent_v2`), rewrite every `multi_agent_v1.*` example: `multi_agent_v1.spawn_agent({...,"fork_context":false})` becomes `spawn_agent({"task_name":"<lowercase_digits_underscores>","message":...,"agent_type":...,"fork_turns":"none"})` (`"all"` only when full parent history is truly required); `send_input` becomes `send_message`; do not call `close_agent`/`resume_agent` (finished agents end on their own; `followup_task` re-tasks one, `interrupt_agent` stops one); `wait_agent` takes only `timeout_ms` and returns on any child mailbox activity. On the v2 surface `agent_type` may be absent from the spawn schema when absent, omit it and describe the role inside `message`. If a code block below conflicts with this section, this section wins.
24
+
25
+ ### Delegation by difficulty (Codex tier workers)
26
+ When tier worker agents are installed (Codex), size each implementation lane by difficulty and pass the matching `agent_type` where the spawn schema exposes it: LOW (one-file fix, boilerplate, config/copy) -> `lazycodex-worker-low`; MEDIUM (standard feature, few files, known patterns) -> `lazycodex-worker-medium`; HIGH (new module, cross-module refactor, concurrency/security/migration) -> `lazycodex-worker-high`. Explorer/librarian research lanes keep their own roles. Difficulty (model power) is orthogonal to the LIGHT/HEAVY rigor tier in step 4 — judge each on its own facts. On spawn surfaces without `agent_type` (deployed v2), state the tier inside `message`.
24
27
 
25
28
  ## Codex Subagent Reliability
26
29
 
@@ -221,7 +221,7 @@ Your next move: <fill - e.g. approve, or run a high-accuracy review>. Full execu
221
221
  ## Verification strategy
222
222
  > Zero human intervention - all verification is agent-executed.
223
223
  - Test decision: <TDD | tests-after | none> + framework
224
- - Evidence: .omo/evidence/task-<N>-${slug}.<ext>
224
+ - Evidence: <attemptDir>/task-<N>-${slug}.<ext> (attemptDir = currentAttemptDir from 'omo ulw-loop status --json', .omo/evidence/ulw/<session>/<goalId>/a<attempt>; outside ulw-loop use .omo/evidence/)
225
225
 
226
226
  ## Execution strategy
227
227
  ### Parallel execution waves
@@ -239,7 +239,7 @@ Your next move: <fill - e.g. approve, or run a high-accuracy review>. Full execu
239
239
  Parallelization: Wave <N> | Blocked by: <...> | Blocks: <...>
240
240
  References (executor has NO interview context - be exhaustive): <src/path:lines>
241
241
  Acceptance criteria (agent-executable): <exact command or assertion>
242
- QA scenarios (name the exact tool + invocation): happy + failure, Evidence .omo/evidence/task-1-${slug}.<ext>
242
+ QA scenarios (name the exact tool + invocation): happy + failure, Evidence <attemptDir>/task-1-${slug}.<ext>
243
243
  Commit: <Y/N> | <type>(<scope>): <summary>
244
244
 
245
245
  ## Final verification wave
package/dist/tui.js CHANGED
@@ -20904,6 +20904,11 @@ var init_category_model_requirements = __esm(() => {
20904
20904
  },
20905
20905
  deep: {
20906
20906
  fallbackChain: [
20907
+ {
20908
+ providers: ["openai", "vercel"],
20909
+ model: "gpt-5.6-terra",
20910
+ variant: "xhigh"
20911
+ },
20907
20912
  {
20908
20913
  providers: ["openai", "vercel"],
20909
20914
  model: "gpt-5.6-sol",
@@ -20967,6 +20972,11 @@ var init_category_model_requirements = __esm(() => {
20967
20972
  },
20968
20973
  "unspecified-low": {
20969
20974
  fallbackChain: [
20975
+ {
20976
+ providers: ["openai", "vercel"],
20977
+ model: "gpt-5.6-luna",
20978
+ variant: "xhigh"
20979
+ },
20970
20980
  {
20971
20981
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
20972
20982
  model: "claude-sonnet-4-6"
@@ -21364,6 +21374,38 @@ var init_supplemental_entries = __esm(() => {
21364
21374
  output: 128000
21365
21375
  }
21366
21376
  },
21377
+ "gpt-5.6-terra": {
21378
+ id: "gpt-5.6-terra",
21379
+ family: "gpt-mini",
21380
+ reasoning: true,
21381
+ temperature: false,
21382
+ toolCall: true,
21383
+ modalities: {
21384
+ input: ["text", "image", "pdf"],
21385
+ output: ["text"]
21386
+ },
21387
+ limit: {
21388
+ context: 1050000,
21389
+ input: 922000,
21390
+ output: 128000
21391
+ }
21392
+ },
21393
+ "gpt-5.6-luna": {
21394
+ id: "gpt-5.6-luna",
21395
+ family: "gpt-nano",
21396
+ reasoning: true,
21397
+ temperature: false,
21398
+ toolCall: true,
21399
+ modalities: {
21400
+ input: ["text", "image", "pdf"],
21401
+ output: ["text"]
21402
+ },
21403
+ limit: {
21404
+ context: 1050000,
21405
+ input: 922000,
21406
+ output: 128000
21407
+ }
21408
+ },
21367
21409
  "gpt-5.5": {
21368
21410
  id: "gpt-5.5",
21369
21411
  family: "gpt",
@@ -21882,28 +21924,7 @@ var init_agent_display_names = __esm(() => {
21882
21924
  REVERSE_DISPLAY_NAMES = Object.fromEntries(Object.entries(AGENT_DISPLAY_NAMES).map(([key, displayName]) => [displayName.toLowerCase(), key]));
21883
21925
  });
21884
21926
  // packages/omo-opencode/src/tools/delegate-task/anthropic-categories.ts
21885
- var UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context>
21886
- You are working on tasks that don't fit specific categories but require moderate effort.
21887
-
21888
- <Selection_Gate>
21889
- BEFORE selecting this category, VERIFY ALL conditions:
21890
- 1. Task does NOT fit: quick (trivial), visual-engineering (UI), ultrabrain (deep logic), artistry (creative), writing (docs)
21891
- 2. Task requires more than trivial effort but is NOT system-wide
21892
- 3. Scope is contained within a few files/modules
21893
-
21894
- If task fits ANY other category, DO NOT select unspecified-low.
21895
- This is NOT a default choice - it's for genuinely unclassifiable moderate-effort work.
21896
- </Selection_Gate>
21897
- </Category_Context>
21898
-
21899
- <Caller_Warning>
21900
- THIS CATEGORY USES A MID-TIER MODEL (claude-sonnet-4-6).
21901
-
21902
- **PROVIDE CLEAR STRUCTURE:**
21903
- 1. MUST DO: Enumerate required actions explicitly
21904
- 2. MUST NOT DO: State forbidden actions to prevent scope creep
21905
- 3. EXPECTED OUTPUT: Define concrete success criteria
21906
- </Caller_Warning>`, UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
21927
+ var UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
21907
21928
  You are working on tasks that don't fit specific categories but require substantial effort.
21908
21929
 
21909
21930
  <Selection_Gate>
@@ -21919,12 +21940,6 @@ If task is unclassifiable but moderate-effort, use unspecified-low instead.
21919
21940
  </Category_Context>`, ANTHROPIC_CATEGORIES;
21920
21941
  var init_anthropic_categories = __esm(() => {
21921
21942
  ANTHROPIC_CATEGORIES = [
21922
- {
21923
- name: "unspecified-low",
21924
- config: { model: "anthropic/claude-sonnet-4-6" },
21925
- description: "Tasks that don't fit other categories, low effort required",
21926
- promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
21927
- },
21928
21943
  {
21929
21944
  name: "unspecified-high",
21930
21945
  config: { model: "anthropic/claude-opus-4-7", variant: "max" },
@@ -22221,6 +22236,27 @@ EXPECTED OUTPUT:
22221
22236
  \`\`\`
22222
22237
 
22223
22238
  If your prompt lacks this structure, REWRITE IT before delegating.
22239
+ </Caller_Warning>`, UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context>
22240
+ You are working on tasks that don't fit specific categories but require moderate effort.
22241
+
22242
+ <Selection_Gate>
22243
+ BEFORE selecting this category, VERIFY ALL conditions:
22244
+ 1. Task does NOT fit: quick (trivial), visual-engineering (UI), ultrabrain (deep logic), artistry (creative), writing (docs)
22245
+ 2. Task requires more than trivial effort but is NOT system-wide
22246
+ 3. Scope is contained within a few files/modules
22247
+
22248
+ If task fits ANY other category, DO NOT select unspecified-low.
22249
+ This is NOT a default choice - it's for genuinely unclassifiable moderate-effort work.
22250
+ </Selection_Gate>
22251
+ </Category_Context>
22252
+
22253
+ <Caller_Warning>
22254
+ THIS CATEGORY USES A LIGHTWEIGHT MODEL (gpt-5.6-luna).
22255
+
22256
+ **PROVIDE CLEAR STRUCTURE:**
22257
+ 1. MUST DO: Enumerate required actions explicitly
22258
+ 2. MUST NOT DO: State forbidden actions to prevent scope creep
22259
+ 3. EXPECTED OUTPUT: Define concrete success criteria
22224
22260
  </Caller_Warning>`, OPENAI_CATEGORIES;
22225
22261
  var init_openai_categories = __esm(() => {
22226
22262
  init_types3();
@@ -22233,7 +22269,7 @@ var init_openai_categories = __esm(() => {
22233
22269
  },
22234
22270
  {
22235
22271
  name: "deep",
22236
- config: { model: "openai/gpt-5.6-sol", variant: "high" },
22272
+ config: { model: "openai/gpt-5.6-terra", variant: "xhigh" },
22237
22273
  description: "Goal-oriented autonomous problem-solving on hairy problems requiring deep research. ONE goal + ONE deliverable per call \u2014 multiple goals must fan out as parallel `deep` calls, never bundled into one.",
22238
22274
  promptAppend: DEEP_CATEGORY_PROMPT_APPEND,
22239
22275
  resolvePromptAppend: resolveDeepCategoryPromptAppend
@@ -22243,6 +22279,12 @@ var init_openai_categories = __esm(() => {
22243
22279
  config: { model: "openai/gpt-5.4-mini" },
22244
22280
  description: "Trivial tasks - single file changes, typo fixes, simple modifications",
22245
22281
  promptAppend: QUICK_CATEGORY_PROMPT_APPEND
22282
+ },
22283
+ {
22284
+ name: "unspecified-low",
22285
+ config: { model: "openai/gpt-5.6-luna", variant: "xhigh" },
22286
+ description: "Tasks that don't fit other categories, low effort required",
22287
+ promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
22246
22288
  }
22247
22289
  ];
22248
22290
  });