oh-my-opencode 4.19.1 → 4.19.3

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 (268) hide show
  1. package/.agents/command/publish.md +95 -28
  2. package/.agents/skills/publish/SKILL.md +20 -6
  3. package/.opencode/command/publish.md +95 -28
  4. package/README.ja.md +2 -2
  5. package/README.ko.md +2 -2
  6. package/README.md +2 -2
  7. package/README.ru.md +2 -2
  8. package/README.zh-cn.md +2 -2
  9. package/THIRD-PARTY-NOTICES.md +7 -7
  10. package/dist/agents/atlas/agent.d.ts +4 -2
  11. package/dist/agents/explore.d.ts +4 -2
  12. package/dist/agents/hephaestus/agent.d.ts +4 -2
  13. package/dist/agents/librarian.d.ts +4 -2
  14. package/dist/agents/metis.d.ts +4 -2
  15. package/dist/agents/momus.d.ts +3 -2
  16. package/dist/agents/multimodal-looker.d.ts +4 -2
  17. package/dist/agents/oracle.d.ts +4 -2
  18. package/dist/agents/sisyphus/claude-opus-5.d.ts +33 -0
  19. package/dist/agents/sisyphus/index.d.ts +2 -0
  20. package/dist/agents/sisyphus-agent-factory.d.ts +5 -2
  21. package/dist/agents/sisyphus-junior/agent.d.ts +4 -1
  22. package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +1 -1
  23. package/dist/agents/types.d.ts +2 -2
  24. package/dist/cli/config-migrate.d.ts +8 -0
  25. package/dist/cli/doctor/checks/legacy-config-leftovers.d.ts +10 -0
  26. package/dist/cli/doctor/checks/model-resolution-config.d.ts +1 -1
  27. package/dist/cli/doctor/checks/tools-lsp.d.ts +1 -1
  28. package/dist/cli/doctor/framework/constants.d.ts +1 -1
  29. package/dist/cli/index.js +95391 -88524
  30. package/dist/cli-node/index.js +95504 -88637
  31. package/dist/config/schema/agent-names.d.ts +26 -26
  32. package/dist/config/schema/agent-overrides.d.ts +400 -400
  33. package/dist/config/schema/browser-automation.d.ts +2 -2
  34. package/dist/config/schema/categories.d.ts +36 -36
  35. package/dist/config/schema/commands.d.ts +2 -2
  36. package/dist/config/schema/dynamic-context-pruning.d.ts +1 -1
  37. package/dist/config/schema/experimental.d.ts +1 -1
  38. package/dist/config/schema/fallback-models.d.ts +25 -25
  39. package/dist/config/schema/hooks.d.ts +43 -43
  40. package/dist/config/schema/internal/permission.d.ts +9 -9
  41. package/dist/config/schema/keyword-detector.d.ts +6 -6
  42. package/dist/config/schema/oh-my-opencode-config.d.ts +402 -402
  43. package/dist/config/schema/tmux.d.ts +6 -6
  44. package/dist/config/validate.d.ts +2 -1
  45. package/dist/config-migration/deep-diff.d.ts +1 -0
  46. package/dist/config-migration/discovery-paths.d.ts +11 -0
  47. package/dist/config-migration/discovery-roots.d.ts +7 -0
  48. package/dist/config-migration/discovery.d.ts +4 -0
  49. package/dist/config-migration/index.d.ts +9 -0
  50. package/dist/config-migration/legacy-history.d.ts +3 -0
  51. package/dist/config-migration/migration-executor.d.ts +4 -0
  52. package/dist/config-migration/migration-plans.d.ts +14 -0
  53. package/dist/config-migration/record-values.d.ts +4 -0
  54. package/dist/config-migration/schema-url.d.ts +1 -0
  55. package/dist/config-migration/transform-config-jsonc.d.ts +2 -0
  56. package/dist/config-migration/transform-opencode.d.ts +2 -0
  57. package/dist/config-migration/transform-types.d.ts +24 -0
  58. package/dist/config-migration/types.d.ts +39 -0
  59. package/dist/create-hooks.d.ts +35 -35
  60. package/dist/features/background-agent/spawner/tmux-callback-invoker.d.ts +11 -0
  61. package/dist/features/builtin-commands/templates/hyperplan.d.ts +1 -1
  62. package/dist/features/builtin-commands/templates/start-work.d.ts +1 -1
  63. package/dist/features/claude-tasks/types.d.ts +4 -4
  64. package/dist/features/team-mode/team-runtime/shutdown-helpers.d.ts +1 -1
  65. package/dist/features/team-mode/team-runtime/shutdown-test-fixtures.d.ts +4 -4
  66. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +42 -42
  67. package/dist/features/tmux-subagent/environment-eligibility.d.ts +2 -0
  68. package/dist/features/tmux-subagent/index.d.ts +1 -0
  69. package/dist/features/tmux-subagent/tracked-session-state.d.ts +1 -0
  70. package/dist/features/tui-sidebar/snapshot-schema.d.ts +6 -6
  71. package/dist/help/schema/acp.d.ts +3 -3
  72. package/dist/help/schema/doctor.d.ts +4 -4
  73. package/dist/help/schema/status.d.ts +3 -3
  74. package/dist/hooks/auto-update-checker/constants.d.ts +3 -3
  75. package/dist/hooks/goal/types.d.ts +5 -5
  76. package/dist/hooks/non-interactive-env/constants.d.ts +4 -1
  77. package/dist/hooks/start-work/parse-user-request.d.ts +2 -0
  78. package/dist/hooks/start-work/worktree-block.d.ts +5 -0
  79. package/dist/index.js +35450 -28257
  80. package/dist/mcp/types.d.ts +3 -3
  81. package/dist/oh-my-opencode.schema.json +1 -1
  82. package/dist/plugin/chat-message/loop-commands.d.ts +1 -0
  83. package/dist/plugin/command-execute-before.d.ts +3 -3
  84. package/dist/plugin/hooks/create-core-hooks.d.ts +25 -25
  85. package/dist/plugin-config/omo-config-chain.d.ts +14 -0
  86. package/dist/plugin-config/unknown-key-diagnostics.d.ts +5 -0
  87. package/dist/plugin-config.d.ts +2 -2
  88. package/dist/shared/agent-display-names.d.ts +1 -1
  89. package/dist/shared/jsonc-parser.d.ts +1 -1
  90. package/dist/shared/migration.d.ts +5 -1
  91. package/dist/shared/opencode-config-dir-types.d.ts +0 -1
  92. package/dist/shared/plugin-identity.d.ts +6 -8
  93. package/dist/shared/project-discovery-dirs.d.ts +0 -1
  94. package/dist/shared/tmux/tmux-utils/environment.d.ts +1 -1
  95. package/dist/shared/tmux/tmux-utils.d.ts +1 -1
  96. package/dist/shared/typescript-native-source-parser.d.ts +7 -0
  97. package/dist/skills/coding-agent-sessions/SKILL.md +5 -2
  98. package/dist/skills/coding-agent-sessions/references/all-platforms.md +3 -1
  99. package/dist/skills/coding-agent-sessions/references/senpi.md +15 -5
  100. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +46 -0
  101. package/dist/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +19 -10
  102. package/dist/skills/debugging/SKILL.md +2 -1
  103. package/dist/skills/debugging/references/methodology/03-flaky-triage.md +47 -0
  104. package/dist/skills/frontend/ATTRIBUTION.md +7 -0
  105. package/dist/skills/frontend/SKILL.md +4 -1
  106. package/dist/skills/frontend/references/design/README.md +8 -0
  107. package/dist/skills/frontend/references/design/_INDEX.md +14 -1
  108. package/dist/skills/frontend/references/design/interaction-skill.md +144 -0
  109. package/dist/skills/programming/SKILL.md +11 -1
  110. package/dist/skills/programming/references/logging.md +6 -1
  111. package/dist/skills/programming/scripts/typescript/check-no-excuse-rules.ts +51 -17
  112. package/dist/skills/start-work/SKILL.md +12 -2
  113. package/dist/skills/ulw-plan/SKILL.md +1 -1
  114. package/dist/skills/ulw-plan/references/full-workflow.md +12 -1
  115. package/dist/skills/ulw-plan/references/intent-clear.md +1 -1
  116. package/dist/startup-migration.d.ts +28 -0
  117. package/dist/testing/create-plugin-module.d.ts +4 -0
  118. package/dist/tools/task/types.d.ts +10 -10
  119. package/dist/tui.js +31812 -26849
  120. package/package.json +14 -14
  121. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +21 -5
  122. package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +11 -2
  123. package/packages/omo-codex/THIRD-PARTY-NOTICES.md +2 -2
  124. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  125. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +8 -4
  126. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  127. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  128. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +11 -5
  129. package/packages/omo-codex/plugin/components/codegraph/NOTICE +1 -1
  130. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +10272 -2600
  131. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +7341 -562
  132. package/packages/omo-codex/plugin/components/codegraph/package.json +2 -2
  133. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +33 -0
  134. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +36 -10
  135. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +170 -186
  136. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +34 -0
  137. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +22 -5
  138. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +106 -0
  139. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +145 -0
  140. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +21 -0
  141. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +139 -0
  142. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +15 -0
  143. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +32 -0
  144. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +109 -0
  145. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +148 -0
  146. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +126 -186
  147. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +9 -4
  148. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +160 -0
  149. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +12 -110
  150. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +29 -20
  151. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +3 -3
  152. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +2 -2
  153. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +11 -5
  154. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +3 -3
  155. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +2 -1
  156. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +50 -5
  157. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +3 -2
  158. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +24 -13
  159. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +70 -13
  160. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +58 -0
  161. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +104 -0
  162. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +4 -2
  163. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +116 -0
  164. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +114 -119
  165. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  166. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  167. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  168. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  169. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  170. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  171. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  172. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  173. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  174. package/packages/omo-codex/plugin/components/rules/dist/cli.js +31 -14
  175. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  176. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  177. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +1 -1
  178. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  179. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  180. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  181. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  182. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  183. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  184. package/packages/omo-codex/plugin/components/ultrawork/directive.md +12 -7
  185. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  186. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  187. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +12 -7
  188. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +1 -1
  189. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +12 -1
  190. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +1 -1
  191. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +12 -7
  192. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  193. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  194. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +19 -1
  195. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  196. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  197. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  198. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  199. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  200. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  201. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  202. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  203. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  204. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  205. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  206. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  207. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  208. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  209. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  210. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  211. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  212. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  213. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  214. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  215. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  216. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  217. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  218. package/packages/omo-codex/plugin/package-lock.json +42 -41
  219. package/packages/omo-codex/plugin/package.json +1 -1
  220. package/packages/omo-codex/plugin/shared/src/config-loader.ts +165 -16
  221. package/packages/omo-codex/plugin/shared/src/config-migration.ts +162 -0
  222. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +196 -18
  223. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +5 -2
  224. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +3 -1
  225. package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +15 -5
  226. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +46 -0
  227. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +19 -10
  228. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -1
  229. package/packages/omo-codex/plugin/skills/debugging/references/methodology/03-flaky-triage.md +47 -0
  230. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +7 -0
  231. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +4 -1
  232. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +8 -0
  233. package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +14 -1
  234. package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +144 -0
  235. package/packages/omo-codex/plugin/skills/programming/SKILL.md +11 -1
  236. package/packages/omo-codex/plugin/skills/programming/references/logging.md +6 -1
  237. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +51 -17
  238. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +12 -2
  239. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +12 -7
  240. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +19 -1
  241. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +1 -1
  242. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +12 -1
  243. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +1 -1
  244. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +22 -0
  245. package/packages/omo-codex/scripts/install-dist/install-local.mjs +1 -1
  246. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +5 -2
  247. package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +3 -1
  248. package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +15 -5
  249. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +46 -0
  250. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +19 -10
  251. package/packages/shared-skills/skills/debugging/SKILL.md +2 -1
  252. package/packages/shared-skills/skills/debugging/references/methodology/03-flaky-triage.md +47 -0
  253. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +7 -0
  254. package/packages/shared-skills/skills/frontend/SKILL.md +4 -1
  255. package/packages/shared-skills/skills/frontend/references/design/README.md +8 -0
  256. package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +14 -1
  257. package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +144 -0
  258. package/packages/shared-skills/skills/programming/SKILL.md +11 -1
  259. package/packages/shared-skills/skills/programming/references/logging.md +6 -1
  260. package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.ts +51 -17
  261. package/packages/shared-skills/skills/start-work/SKILL.md +12 -2
  262. package/packages/shared-skills/skills/ulw-plan/SKILL.md +1 -1
  263. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +12 -1
  264. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +1 -1
  265. package/dist/plugin-config/layered-config-loader.d.ts +0 -2
  266. package/dist/plugin-config/single-config-loader.d.ts +0 -4
  267. package/dist/shared/migrate-legacy-config-file.d.ts +0 -1
  268. package/dist/shared/migration/config-migration.d.ts +0 -1
@@ -1,33 +1,33 @@
1
1
  import { z } from "zod";
2
2
  import type { TmuxConfig, TmuxIsolation, TmuxLayout } from "@oh-my-opencode/tmux-core";
3
3
  export declare const TmuxLayoutSchema: z.ZodEnum<{
4
+ "even-horizontal": "even-horizontal";
5
+ "even-vertical": "even-vertical";
4
6
  "main-horizontal": "main-horizontal";
5
7
  "main-vertical": "main-vertical";
6
8
  tiled: "tiled";
7
- "even-horizontal": "even-horizontal";
8
- "even-vertical": "even-vertical";
9
9
  }>;
10
10
  export declare const TmuxIsolationSchema: z.ZodEnum<{
11
+ inline: "inline";
11
12
  session: "session";
12
13
  window: "window";
13
- inline: "inline";
14
14
  }>;
15
15
  export declare const TmuxConfigSchema: z.ZodObject<{
16
16
  enabled: z.ZodDefault<z.ZodBoolean>;
17
17
  layout: z.ZodDefault<z.ZodEnum<{
18
+ "even-horizontal": "even-horizontal";
19
+ "even-vertical": "even-vertical";
18
20
  "main-horizontal": "main-horizontal";
19
21
  "main-vertical": "main-vertical";
20
22
  tiled: "tiled";
21
- "even-horizontal": "even-horizontal";
22
- "even-vertical": "even-vertical";
23
23
  }>>;
24
24
  main_pane_size: z.ZodDefault<z.ZodNumber>;
25
25
  main_pane_min_width: z.ZodDefault<z.ZodNumber>;
26
26
  agent_pane_min_width: z.ZodDefault<z.ZodNumber>;
27
27
  isolation: z.ZodDefault<z.ZodEnum<{
28
+ inline: "inline";
28
29
  session: "session";
29
30
  window: "window";
30
- inline: "inline";
31
31
  }>>;
32
32
  }, z.core.$strip>;
33
33
  export type { TmuxConfig, TmuxIsolation, TmuxLayout };
@@ -1,3 +1,4 @@
1
+ import type { OmoConfigEnv } from "@oh-my-opencode/omo-config-core";
1
2
  import { type OhMyOpenCodeConfig } from "./schema";
2
3
  export type PluginConfigValidation = {
3
4
  readonly valid: boolean;
@@ -5,4 +6,4 @@ export type PluginConfigValidation = {
5
6
  readonly path: string | null;
6
7
  readonly config: OhMyOpenCodeConfig;
7
8
  };
8
- export declare function validatePluginConfig(directory: string): PluginConfigValidation;
9
+ export declare function validatePluginConfig(directory: string, environment?: OmoConfigEnv): PluginConfigValidation;
@@ -0,0 +1 @@
1
+ export declare function deepDifference(base: Readonly<Record<string, unknown>>, profile: Readonly<Record<string, unknown>>): Record<string, unknown>;
@@ -0,0 +1,11 @@
1
+ import { type ConfigMigrationDiscoveryOptions, type ConfigMigrationPathOperations } from "./types";
2
+ export declare const CONFIG_FILE_NAMES: readonly ["oh-my-openagent.jsonc", "oh-my-openagent.json", "oh-my-opencode.jsonc", "oh-my-opencode.json"];
3
+ export declare function isWindowsPathOperations(options: ConfigMigrationDiscoveryOptions): boolean;
4
+ export declare function discoveryFileSystem(options: ConfigMigrationDiscoveryOptions): import("./types").ConfigMigrationDiscoveryFileSystem;
5
+ export declare function usesWindowsPathSemantics(options: ConfigMigrationDiscoveryOptions): boolean;
6
+ export declare function hostPathOperations(options: ConfigMigrationDiscoveryOptions): ConfigMigrationPathOperations;
7
+ export declare function canonicalPath(path: string, options: ConfigMigrationDiscoveryOptions): string;
8
+ export declare function pathKey(path: string, options: ConfigMigrationDiscoveryOptions): string;
9
+ export declare function configPaths(directory: string, options: ConfigMigrationDiscoveryOptions): readonly string[];
10
+ export declare function profileDirectories(root: string, options: ConfigMigrationDiscoveryOptions): readonly string[];
11
+ export declare function projectDirectories(options: ConfigMigrationDiscoveryOptions): readonly string[];
@@ -0,0 +1,7 @@
1
+ import type { ConfigMigrationDiscoveryOptions } from "./types";
2
+ export type ConfigRoot = {
3
+ readonly activeProfile?: string;
4
+ readonly path: string;
5
+ readonly precedence: number;
6
+ };
7
+ export declare function configRoots(options: ConfigMigrationDiscoveryOptions): readonly ConfigRoot[];
@@ -0,0 +1,4 @@
1
+ import { type ConfigMigrationDiscoveryOptions, type LegacyConfigMigrationGroup } from "./types";
2
+ export declare const OPENCODE_CONFIG_MIGRATION_ID = "2026-07-opencode-config-unification";
3
+ export declare const CONFIG_JSONC_MIGRATION_ID = "2026-07-codex-config-jsonc";
4
+ export declare function discoverLegacyConfigGroups(options: ConfigMigrationDiscoveryOptions): readonly LegacyConfigMigrationGroup[];
@@ -0,0 +1,9 @@
1
+ export { CONFIG_JSONC_MIGRATION_ID, OPENCODE_CONFIG_MIGRATION_ID, discoverLegacyConfigGroups, } from "./discovery";
2
+ export { createLegacyConfigMigrationPlans, } from "./migration-plans";
3
+ export { executeLegacyConfigMigrationPlan } from "./migration-executor";
4
+ export { transformConfigJsoncSources } from "./transform-config-jsonc";
5
+ export { transformOpenCodeSources } from "./transform-opencode";
6
+ export type { ExecuteLegacyConfigMigrationPlanOptions } from "./migration-executor";
7
+ export type { CreateLegacyConfigMigrationPlansOptions, LegacyConfigMigrationPlan, } from "./migration-plans";
8
+ export type { ConfigMigrationTransformResult, LoadedLegacyConfigSource, OpenCodeTransformScope, TransformConfigJsoncSourcesInput, TransformOpenCodeSourcesInput, } from "./transform-types";
9
+ export type { ConfigMigrationDiscoveryFileSystem, ConfigMigrationDiscoveryOptions, ConfigMigrationPathOperations, DiscoveredLegacyConfigSource, LegacyConfigMigrationGroup, LegacyConfigSourceKind, } from "./types";
@@ -0,0 +1,3 @@
1
+ import type { DiscoveredLegacyConfigSource } from "./types";
2
+ import type { LoadedLegacyConfigSource } from "./transform-types";
3
+ export declare function legacyMigrationHistory(discovered: readonly DiscoveredLegacyConfigSource[], loaded: readonly LoadedLegacyConfigSource[]): Record<string, readonly string[]>;
@@ -0,0 +1,4 @@
1
+ import { type MigrationRunResult, type RunMigrationOptions } from "@oh-my-opencode/omo-config-core";
2
+ import type { LegacyConfigMigrationPlan } from "./migration-plans";
3
+ export type ExecuteLegacyConfigMigrationPlanOptions = Omit<RunMigrationOptions, "id" | "sources" | "targetPath" | "transform">;
4
+ export declare function executeLegacyConfigMigrationPlan(plan: LegacyConfigMigrationPlan, options?: ExecuteLegacyConfigMigrationPlanOptions): MigrationRunResult;
@@ -0,0 +1,14 @@
1
+ import type { MigrationSourceDescriptor, MigrationTransform } from "@oh-my-opencode/omo-config-core";
2
+ import type { ConfigMigrationDiscoveryOptions } from "./types";
3
+ import type { ConfigMigrationTransformResult } from "./transform-types";
4
+ export type LegacyConfigMigrationPlan = {
5
+ readonly id: string;
6
+ readonly inspect: (sources: Parameters<MigrationTransform>[0]) => ConfigMigrationTransformResult;
7
+ readonly sources: readonly MigrationSourceDescriptor[];
8
+ readonly targetPath: string;
9
+ readonly transform: MigrationTransform;
10
+ };
11
+ export type CreateLegacyConfigMigrationPlansOptions = ConfigMigrationDiscoveryOptions & {
12
+ readonly backupTimestamp?: string;
13
+ };
14
+ export declare function createLegacyConfigMigrationPlans(options: CreateLegacyConfigMigrationPlansOptions): readonly LegacyConfigMigrationPlan[];
@@ -0,0 +1,4 @@
1
+ export declare function isPlainRecord(value: unknown): value is Record<string, unknown>;
2
+ export declare function copyRecord(value: Readonly<Record<string, unknown>>): Record<string, unknown>;
3
+ export declare function mergeRecords(base: Readonly<Record<string, unknown>>, override: Readonly<Record<string, unknown>>): Record<string, unknown>;
4
+ export declare function withoutLegacyMetadata(value: Readonly<Record<string, unknown>>): Record<string, unknown>;
@@ -0,0 +1 @@
1
+ export declare const OMO_SCHEMA_URL = "https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/dev/assets/omo.schema.json";
@@ -0,0 +1,2 @@
1
+ import type { ConfigMigrationTransformResult, TransformConfigJsoncSourcesInput } from "./transform-types";
2
+ export declare function transformConfigJsoncSources(input: TransformConfigJsoncSourcesInput): ConfigMigrationTransformResult;
@@ -0,0 +1,2 @@
1
+ import type { TransformOpenCodeSourcesInput, ConfigMigrationTransformResult } from "./transform-types";
2
+ export declare function transformOpenCodeSources(input: TransformOpenCodeSourcesInput): ConfigMigrationTransformResult;
@@ -0,0 +1,24 @@
1
+ import type { DiscoveredLegacyConfigSource } from "./types";
2
+ export type LoadedLegacyConfigSource = {
3
+ readonly path: string;
4
+ readonly value: unknown;
5
+ };
6
+ export type ConfigMigrationTransformResult = {
7
+ readonly diagnostics: readonly string[];
8
+ readonly document: Record<string, unknown>;
9
+ };
10
+ export type OpenCodeTransformScope = {
11
+ readonly kind: "user";
12
+ } | {
13
+ readonly kind: "project";
14
+ readonly projectRoot: string;
15
+ };
16
+ export type TransformOpenCodeSourcesInput = {
17
+ readonly discovered: readonly DiscoveredLegacyConfigSource[];
18
+ readonly scope: OpenCodeTransformScope;
19
+ readonly sources: readonly LoadedLegacyConfigSource[];
20
+ };
21
+ export type TransformConfigJsoncSourcesInput = {
22
+ readonly discovered: readonly DiscoveredLegacyConfigSource[];
23
+ readonly sources: readonly LoadedLegacyConfigSource[];
24
+ };
@@ -0,0 +1,39 @@
1
+ export type ConfigMigrationPathOperations = {
2
+ readonly basename: (path: string) => string;
3
+ readonly dirname: (path: string) => string;
4
+ readonly isAbsolute: (path: string) => boolean;
5
+ readonly join: (...paths: string[]) => string;
6
+ readonly normalize: (path: string) => string;
7
+ readonly relative: (from: string, to: string) => string;
8
+ readonly resolve: (...paths: string[]) => string;
9
+ };
10
+ export type ConfigMigrationDiscoveryFileSystem = {
11
+ readonly existsSync: (path: string) => boolean;
12
+ readonly readdirSync: (path: string) => string[];
13
+ readonly realpathSync: (path: string) => string;
14
+ };
15
+ export declare const DEFAULT_DISCOVERY_FILE_SYSTEM: ConfigMigrationDiscoveryFileSystem;
16
+ export type LegacyConfigSourceKind = "config-jsonc" | "migration-sidecar" | "profile-config" | "project-config" | "user-config";
17
+ export type DiscoveredLegacyConfigSource = {
18
+ readonly baseRoot?: string;
19
+ readonly configPath: string;
20
+ readonly isActiveProfile?: boolean;
21
+ readonly kind: LegacyConfigSourceKind;
22
+ readonly path: string;
23
+ readonly precedence: number;
24
+ readonly profile?: string;
25
+ readonly projectRoot?: string;
26
+ };
27
+ export type LegacyConfigMigrationGroup = {
28
+ readonly id: string;
29
+ readonly sources: readonly DiscoveredLegacyConfigSource[];
30
+ };
31
+ export type ConfigMigrationDiscoveryOptions = {
32
+ readonly cwd: string;
33
+ readonly environment?: Readonly<Record<string, string | undefined>>;
34
+ readonly fileSystem?: ConfigMigrationDiscoveryFileSystem;
35
+ readonly homeDir: string;
36
+ readonly pathOperations: ConfigMigrationPathOperations;
37
+ readonly platform?: NodeJS.Platform;
38
+ readonly tauriConfigDirs?: readonly string[];
39
+ };
@@ -31,41 +31,6 @@ export declare function createHooks(args: {
31
31
  mergedSkills: LoadedSkill[];
32
32
  availableSkills: AvailableSkill[];
33
33
  }): {
34
- disposeHooks: () => void;
35
- categorySkillReminder: ReturnType<typeof import("./hooks").createCategorySkillReminderHook> | null;
36
- autoSlashCommand: ReturnType<typeof import("./hooks").createAutoSlashCommandHook> | null;
37
- stopContinuationGuard: ReturnType<typeof import("./hooks").createStopContinuationGuardHook> | null;
38
- compactionContextInjector: ReturnType<typeof import("./hooks").createCompactionContextInjector> | null;
39
- compactionTodoPreserver: ReturnType<typeof import("./hooks").createCompactionTodoPreserverHook> | null;
40
- todoContinuationEnforcer: ReturnType<typeof import("./hooks").createTodoContinuationEnforcer> | null;
41
- unstableAgentBabysitter: ReturnType<typeof import("./plugin/unstable-agent-babysitter").createUnstableAgentBabysitter> | null;
42
- backgroundNotificationHook: ReturnType<typeof import("./hooks").createBackgroundNotificationHook> | null;
43
- atlasHook: ReturnType<typeof import("./hooks").createAtlasHook> | null;
44
- claudeCodeHooks: ReturnType<typeof import("./hooks").createClaudeCodeHooksHook> | null;
45
- keywordDetector: ReturnType<typeof import("./hooks").createKeywordDetectorHook> | null;
46
- contextInjectorMessagesTransform: ReturnType<typeof import("./features/context-injector").createContextInjectorMessagesTransformHook>;
47
- teamModeStatusInjector: ReturnType<typeof import("./hooks").createTeamModeStatusInjector> | null;
48
- teamMailboxInjector: ReturnType<typeof import("./hooks").createTeamMailboxInjector> | null;
49
- toolPairValidator: ReturnType<typeof import("./hooks").createToolPairValidatorHook> | null;
50
- monitorStatusInjector: ReturnType<typeof import("./hooks").createMonitorStatusInjectorHook> | null;
51
- commentChecker: ReturnType<typeof import("./hooks").createCommentCheckerHooks> | null;
52
- toolOutputTruncator: ReturnType<typeof import("./hooks").createToolOutputTruncatorHook> | null;
53
- directoryAgentsInjector: ReturnType<typeof import("./hooks").createDirectoryAgentsInjectorHook> | null;
54
- directoryReadmeInjector: ReturnType<typeof import("./hooks").createDirectoryReadmeInjectorHook> | null;
55
- emptyTaskResponseDetector: ReturnType<typeof import("./hooks").createEmptyTaskResponseDetectorHook> | null;
56
- rulesInjector: ReturnType<typeof import("./hooks").createRulesInjectorHook> | null;
57
- tasksTodowriteDisabler: ReturnType<typeof import("./hooks").createTasksTodowriteDisablerHook> | null;
58
- writeExistingFileGuard: ReturnType<typeof import("./hooks").createWriteExistingFileGuardHook> | null;
59
- bashFileReadGuard: ReturnType<typeof import("./hooks").createBashFileReadGuardHook> | null;
60
- hashlineReadEnhancer: ReturnType<typeof import("./hooks").createHashlineReadEnhancerHook> | null;
61
- jsonErrorRecovery: ReturnType<typeof import("./hooks").createJsonErrorRecoveryHook> | null;
62
- readImageResizer: ReturnType<typeof import("./hooks").createReadImageResizerHook> | null;
63
- todoDescriptionOverride: ReturnType<typeof import("./hooks").createTodoDescriptionOverrideHook> | null;
64
- webfetchRedirectGuard: ReturnType<typeof import("./hooks").createWebFetchRedirectGuardHook> | null;
65
- fsyncSkipWarning: ReturnType<typeof import("./hooks").createFsyncSkipWarningHook> | null;
66
- teamToolGating: ReturnType<typeof import("./hooks").createTeamToolGating> | null;
67
- notepadWriteGuard: ReturnType<typeof import("./hooks").createNotepadWriteGuardHook> | null;
68
- planFormatValidator: ReturnType<typeof import("./hooks").createPlanFormatValidatorHook> | null;
69
34
  preemptiveCompaction: ReturnType<typeof import("./hooks").createPreemptiveCompactionHook> | null;
70
35
  sessionNotification: ReturnType<typeof import("./hooks").createSessionNotification> | null;
71
36
  thinkMode: ReturnType<typeof import("./hooks").createThinkModeHook> | null;
@@ -90,5 +55,40 @@ export declare function createHooks(args: {
90
55
  taskResumeInfo: ReturnType<typeof import("./hooks").createTaskResumeInfoHook> | null;
91
56
  runtimeFallback: ReturnType<typeof import("./hooks").createRuntimeFallbackHook> | null;
92
57
  legacyPluginToast: ReturnType<typeof import("./hooks").createLegacyPluginToastHook> | null;
58
+ commentChecker: ReturnType<typeof import("./hooks").createCommentCheckerHooks> | null;
59
+ toolOutputTruncator: ReturnType<typeof import("./hooks").createToolOutputTruncatorHook> | null;
60
+ directoryAgentsInjector: ReturnType<typeof import("./hooks").createDirectoryAgentsInjectorHook> | null;
61
+ directoryReadmeInjector: ReturnType<typeof import("./hooks").createDirectoryReadmeInjectorHook> | null;
62
+ emptyTaskResponseDetector: ReturnType<typeof import("./hooks").createEmptyTaskResponseDetectorHook> | null;
63
+ rulesInjector: ReturnType<typeof import("./hooks").createRulesInjectorHook> | null;
64
+ tasksTodowriteDisabler: ReturnType<typeof import("./hooks").createTasksTodowriteDisablerHook> | null;
65
+ writeExistingFileGuard: ReturnType<typeof import("./hooks").createWriteExistingFileGuardHook> | null;
66
+ bashFileReadGuard: ReturnType<typeof import("./hooks").createBashFileReadGuardHook> | null;
67
+ hashlineReadEnhancer: ReturnType<typeof import("./hooks").createHashlineReadEnhancerHook> | null;
68
+ jsonErrorRecovery: ReturnType<typeof import("./hooks").createJsonErrorRecoveryHook> | null;
69
+ readImageResizer: ReturnType<typeof import("./hooks").createReadImageResizerHook> | null;
70
+ todoDescriptionOverride: ReturnType<typeof import("./hooks").createTodoDescriptionOverrideHook> | null;
71
+ webfetchRedirectGuard: ReturnType<typeof import("./hooks").createWebFetchRedirectGuardHook> | null;
72
+ fsyncSkipWarning: ReturnType<typeof import("./hooks").createFsyncSkipWarningHook> | null;
73
+ teamToolGating: ReturnType<typeof import("./hooks").createTeamToolGating> | null;
74
+ notepadWriteGuard: ReturnType<typeof import("./hooks").createNotepadWriteGuardHook> | null;
75
+ planFormatValidator: ReturnType<typeof import("./hooks").createPlanFormatValidatorHook> | null;
76
+ claudeCodeHooks: ReturnType<typeof import("./hooks").createClaudeCodeHooksHook> | null;
77
+ keywordDetector: ReturnType<typeof import("./hooks").createKeywordDetectorHook> | null;
78
+ contextInjectorMessagesTransform: ReturnType<typeof import("./features/context-injector").createContextInjectorMessagesTransformHook>;
79
+ teamModeStatusInjector: ReturnType<typeof import("./hooks").createTeamModeStatusInjector> | null;
80
+ teamMailboxInjector: ReturnType<typeof import("./hooks").createTeamMailboxInjector> | null;
81
+ toolPairValidator: ReturnType<typeof import("./hooks").createToolPairValidatorHook> | null;
82
+ monitorStatusInjector: ReturnType<typeof import("./hooks").createMonitorStatusInjectorHook> | null;
83
+ stopContinuationGuard: ReturnType<typeof import("./hooks").createStopContinuationGuardHook> | null;
84
+ compactionContextInjector: ReturnType<typeof import("./hooks").createCompactionContextInjector> | null;
85
+ compactionTodoPreserver: ReturnType<typeof import("./hooks").createCompactionTodoPreserverHook> | null;
86
+ todoContinuationEnforcer: ReturnType<typeof import("./hooks").createTodoContinuationEnforcer> | null;
87
+ unstableAgentBabysitter: ReturnType<typeof import("./plugin/unstable-agent-babysitter").createUnstableAgentBabysitter> | null;
88
+ backgroundNotificationHook: ReturnType<typeof import("./hooks").createBackgroundNotificationHook> | null;
89
+ atlasHook: ReturnType<typeof import("./hooks").createAtlasHook> | null;
90
+ categorySkillReminder: ReturnType<typeof import("./hooks").createCategorySkillReminderHook> | null;
91
+ autoSlashCommand: ReturnType<typeof import("./hooks").createAutoSlashCommandHook> | null;
92
+ disposeHooks: () => void;
93
93
  };
94
94
  export {};
@@ -0,0 +1,11 @@
1
+ import type { OnSubagentSessionCreated } from "../constants";
2
+ export interface TmuxCallbackInvocation {
3
+ callback: OnSubagentSessionCreated | undefined;
4
+ tmuxEnabled: boolean;
5
+ suppress: boolean;
6
+ sessionID: string;
7
+ parentID: string;
8
+ title: string;
9
+ log: (message: string, data?: unknown) => void;
10
+ }
11
+ export declare function invokeTmuxSessionCreatedCallback(invocation: TmuxCallbackInvocation): void;
@@ -1 +1 @@
1
- export declare const HYPERPLAN_TEMPLATE = "You are running the `/hyperplan` command \u2014 adversarial multi-agent planning via team-mode.\n\nLOAD THE HYPERPLAN SKILL IMMEDIATELY:\n\n```\nskill(name=\"hyperplan\")\n```\n\nAfter loading the skill, follow its 7-phase workflow EXACTLY using this user request.\n\nRoster contract: call `team_create` with category members `unspecified-low`, `unspecified-high`, `ultrabrain`, and `artistry`. Include `deep` only if the category is enabled; if `deep` is disabled or unavailable, retry without only that member and state the degraded roster.\n\n<user-request>\n$ARGUMENTS\n</user-request>\n\nIf team-mode is unavailable (`team_*` tools missing), instruct the user to set `team_mode.enabled: true` in `~/.config/opencode/oh-my-opencode.jsonc` and restart opencode.";
1
+ export declare const HYPERPLAN_TEMPLATE = "You are running the `/hyperplan` command \u2014 adversarial multi-agent planning via team-mode.\n\nLOAD THE HYPERPLAN SKILL IMMEDIATELY:\n\n```\nskill(name=\"hyperplan\")\n```\n\nAfter loading the skill, follow its 7-phase workflow EXACTLY using this user request.\n\nRoster contract: call `team_create` with category members `unspecified-low`, `unspecified-high`, `ultrabrain`, and `artistry`. Include `deep` only if the category is enabled; if `deep` is disabled or unavailable, retry without only that member and state the degraded roster.\n\n<user-request>\n$ARGUMENTS\n</user-request>\n\nIf team-mode is unavailable (`team_*` tools missing), instruct the user to set `team_mode.enabled: true` in `~/.omo/omo.jsonc` and restart opencode.";
@@ -1 +1 @@
1
- export declare const START_WORK_TEMPLATE = "You are starting an Atlas work session.\n\n## ARGUMENTS\n\n- `/start-work [plan-name] [--worktree <path>]`\n - `plan-name` (optional): name or partial match of the plan to start\n - `--worktree <path>` (optional): absolute path to an existing git worktree to work in\n - If specified and valid: hook pre-sets worktree_path in boulder.json\n - If specified but invalid: you must run `git worktree add <path> <branch>` first\n - If omitted: work directly in the current project directory (no worktree)\n\n## WHAT TO DO\n\n1. **Find available plans**: Search for Prometheus-generated plan files at `.omo/plans/`\n\n2. **Check for active boulder state**: Read `.omo/boulder.json` if it exists\n\n3. **Decision logic**:\n - If multiple active works are listed in your context:\n - This means boulder.json has more than one work with status: `active` or `paused`\n - Use the Question tool to ask the user which plan to resume\n - Resume by running `/start-work {plan-name}` for the selected plan\n - If the user says \"start a new plan\", continue with cold-start auto-selection logic\n - If exactly one active work is listed and the user did not name a plan:\n - Auto-resume that single active work\n - If no active plan OR plan is complete:\n - List available plan files\n - If ONE plan: auto-select it\n - If MULTIPLE plans: show list with timestamps, ask user to select\n\n4. **Worktree Setup** (ONLY when `--worktree` was explicitly specified and `worktree_path` not already set in boulder.json):\n 1. `git worktree list --porcelain` - see available worktrees\n 2. Create: `git worktree add <absolute-path> <branch-or-HEAD>`\n 3. Update boulder.json to add `\"worktree_path\": \"<absolute-path>\"`\n 4. All work happens inside that worktree directory\n\n5. **Create/Update boulder.json**:\n ```json\n {\n \"active_plan\": \"/absolute/path/to/plan.md\",\n \"started_at\": \"ISO_TIMESTAMP\",\n \"session_ids\": [\"session_id_1\", \"session_id_2\"],\n \"plan_name\": \"plan-name\",\n \"worktree_path\": \"/absolute/path/to/git/worktree\"\n }\n ```\n\n6. **Read the plan file** and start executing tasks according to atlas workflow\n\n## OUTPUT FORMAT\n\nWhen listing plans for selection:\n```\nAvailable Work Plans\n\nCurrent Time: {ISO timestamp}\nSession ID: {current session id}\n\n1. [plan-name-1.md] - Modified: {date} - Progress: 3/10 tasks\n2. [plan-name-2.md] - Modified: {date} - Progress: 0/5 tasks\n\nWhich plan would you like to work on? (Enter number or plan name)\n```\n\nWhen resuming existing work:\n```\nResuming Work Session\n\nActive Plan: {plan-name}\nProgress: {completed}/{total} tasks\nSessions: {count} (appending current session)\nWorktree: {worktree_path}\n\nReading plan and continuing from last incomplete task...\n```\n\nWhen auto-selecting single plan:\n```\nStarting Work Session\n\nPlan: {plan-name}\nSession ID: {session_id}\nStarted: {timestamp}\nWorktree: {worktree_path}\n\nReading plan and beginning execution...\n```\n\n## CRITICAL\n\n- The session_id is injected by the hook - use it directly\n- Always update boulder.json BEFORE starting work\n- If worktree_path is set in boulder.json, all work happens inside that worktree directory\n- Read the FULL plan file before delegating any tasks\n- Follow atlas delegation protocols (7-section format)\n\n## TASK BREAKDOWN (MANDATORY)\n\nAfter reading the plan file, you MUST decompose every plan task into granular, implementation-level sub-steps and register ALL of them as task/todo items BEFORE starting any work.\n\n**How to break down**:\n- Each plan checkbox item (e.g., `- [ ] Add user authentication`) must be split into concrete, actionable sub-tasks\n- Sub-tasks should be specific enough that each one touches a clear set of files/functions\n- Include: file to modify, what to change, expected behavior, and how to verify\n- Do NOT leave any task vague - \"implement feature X\" is NOT acceptable; \"add validateToken() to src/auth/middleware.ts that checks JWT expiry and returns 401\" IS acceptable\n\n**Example breakdown**:\nPlan task: `- [ ] Add rate limiting to API`\n\u2192 Todo items:\n 1. Create `src/middleware/rate-limiter.ts` with sliding window algorithm (max 100 req/min per IP)\n 2. Add RateLimiter middleware to `src/app.ts` router chain, before auth middleware\n 3. Add rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining) to response in `rate-limiter.ts`\n 4. Add test: verify 429 response after exceeding limit in `src/middleware/rate-limiter.test.ts`\n 5. Add test: verify headers are present on normal responses\n\nRegister these as task/todo items so progress is tracked and visible throughout the session.\n\n## WORKTREE COMPLETION\n\nWhen working in a worktree (`worktree_path` is set in boulder.json) and ALL plan tasks are complete:\n1. Commit all remaining changes in the worktree\n2. **Sync .omo state back**: Copy `.omo/` from the worktree to the main repo before removal.\n This is CRITICAL when `.omo/` is gitignored - state written during worktree execution would otherwise be lost.\n ```bash\n cp -r <worktree-path>/.omo/* <main-repo>/.omo/ 2>/dev/null || true\n ```\n3. Switch to the main working directory (the original repo, NOT the worktree)\n4. Merge the worktree branch into the current branch: `git merge <worktree-branch>`\n5. If merge succeeds, clean up: `git worktree remove <worktree-path>`\n6. Remove the boulder.json state\n\nThis is the DEFAULT behavior when `--worktree` was used. Skip merge only if the user explicitly instructs otherwise (e.g., asks to create a PR instead).";
1
+ export declare const START_WORK_TEMPLATE = "You are starting an Atlas work session.\n\n## ARGUMENTS\n\n- `/start-work [plan-name] [--worktree <path>] [--make-pr] [--ship]`\n - `plan-name` (optional): name or partial match of the plan to start\n - `--worktree <path>` (optional): absolute path to an existing git worktree to work in\n - If specified and valid: hook pre-sets worktree_path in boulder.json\n - If specified but invalid: you must run `git worktree add <path> <branch>` first\n - If omitted: work directly in the current project directory (no worktree)\n - `--make-pr` (optional): deliver the work as a pull request. IMPLIES worktree mode - when `--worktree` is omitted, create a task-owned worktree before implementation. On completion push the branch, open a reviewer-readable PR, and hand off with the PR URL (merge only on explicit user ask)\n - `--ship` (optional): full delivery lifecycle; implies `--make-pr`. After the PR opens, keep working until it is MERGED (CI + review gates, feedback addressed), then clean up the worktree and sync `.omo/` state back\n\n## WHAT TO DO\n\n1. **Find available plans**: Search for Prometheus-generated plan files at `.omo/plans/`\n\n2. **Check for active boulder state**: Read `.omo/boulder.json` if it exists\n\n3. **Decision logic**:\n - If multiple active works are listed in your context:\n - This means boulder.json has more than one work with status: `active` or `paused`\n - Use the Question tool to ask the user which plan to resume\n - Resume by running `/start-work {plan-name}` for the selected plan\n - If the user says \"start a new plan\", continue with cold-start auto-selection logic\n - If exactly one active work is listed and the user did not name a plan:\n - Auto-resume that single active work\n - If no active plan OR plan is complete:\n - List available plan files\n - If ONE plan: auto-select it\n - If MULTIPLE plans: show list with timestamps, ask user to select\n\n4. **Worktree Setup** (ONLY when `--worktree` was explicitly specified and `worktree_path` not already set in boulder.json):\n 1. `git worktree list --porcelain` - see available worktrees\n 2. Create: `git worktree add <absolute-path> <branch-or-HEAD>`\n 3. Update boulder.json to add `\"worktree_path\": \"<absolute-path>\"`\n 4. All work happens inside that worktree directory\n\n5. **Create/Update boulder.json**:\n ```json\n {\n \"active_plan\": \"/absolute/path/to/plan.md\",\n \"started_at\": \"ISO_TIMESTAMP\",\n \"session_ids\": [\"session_id_1\", \"session_id_2\"],\n \"plan_name\": \"plan-name\",\n \"worktree_path\": \"/absolute/path/to/git/worktree\"\n }\n ```\n\n6. **Read the plan file** and start executing tasks according to atlas workflow\n\n## OUTPUT FORMAT\n\nWhen listing plans for selection:\n```\nAvailable Work Plans\n\nCurrent Time: {ISO timestamp}\nSession ID: {current session id}\n\n1. [plan-name-1.md] - Modified: {date} - Progress: 3/10 tasks\n2. [plan-name-2.md] - Modified: {date} - Progress: 0/5 tasks\n\nWhich plan would you like to work on? (Enter number or plan name)\n```\n\nWhen resuming existing work:\n```\nResuming Work Session\n\nActive Plan: {plan-name}\nProgress: {completed}/{total} tasks\nSessions: {count} (appending current session)\nWorktree: {worktree_path}\n\nReading plan and continuing from last incomplete task...\n```\n\nWhen auto-selecting single plan:\n```\nStarting Work Session\n\nPlan: {plan-name}\nSession ID: {session_id}\nStarted: {timestamp}\nWorktree: {worktree_path}\n\nReading plan and beginning execution...\n```\n\n## CRITICAL\n\n- The session_id is injected by the hook - use it directly\n- Always update boulder.json BEFORE starting work\n- If worktree_path is set in boulder.json, all work happens inside that worktree directory\n- Read the FULL plan file before delegating any tasks\n- Follow atlas delegation protocols (7-section format)\n\n## GOAL + TASK BREAKDOWN (MANDATORY)\n\nDo BOTH of these immediately after reading the plan file, BEFORE starting any work. Skipping either is a defect.\n\n**1. Set the goal, in detail.** When a goal tool is available (`create_goal`), call it with a DETAILED objective: the plan name and path, the concrete end state, the phase/task counts, the delivery mode (direct, `--make-pr`, or `--ship`), and how completion will be verified. One work session = one goal. No goal tool -> record the same objective as the first `.omo/start-work/ledger.jsonl` entry.\n\n**2. Register every phase and task as todos.** Decompose every plan task into granular, implementation-level sub-steps and register ALL of them as task/todo items, grouped phase by phase (one phase per plan wave), BEFORE starting any work. Keep them current at every moment: mark in_progress when work dispatches and done immediately after its verification passes - never batch-complete at the end, never execute work that is not a registered todo. Discovered work is appended as a todo before it runs.\n\n**How to break down**:\n- Each plan checkbox item (e.g., `- [ ] Add user authentication`) must be split into concrete, actionable sub-tasks\n- Sub-tasks should be specific enough that each one touches a clear set of files/functions\n- Include: file to modify, what to change, expected behavior, and how to verify\n- Do NOT leave any task vague - \"implement feature X\" is NOT acceptable; \"add validateToken() to src/auth/middleware.ts that checks JWT expiry and returns 401\" IS acceptable\n\n**Example breakdown**:\nPlan task: `- [ ] Add rate limiting to API`\n\u2192 Todo items:\n 1. Create `src/middleware/rate-limiter.ts` with sliding window algorithm (max 100 req/min per IP)\n 2. Add RateLimiter middleware to `src/app.ts` router chain, before auth middleware\n 3. Add rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining) to response in `rate-limiter.ts`\n 4. Add test: verify 429 response after exceeding limit in `src/middleware/rate-limiter.test.ts`\n 5. Add test: verify headers are present on normal responses\n\nRegister these as task/todo items so progress is tracked and visible throughout the session.\n\n## WORKTREE COMPLETION\n\nWhen working in a worktree (`worktree_path` is set in boulder.json) and ALL plan tasks are complete:\n1. Commit all remaining changes in the worktree\n2. **Sync .omo state back**: Copy `.omo/` from the worktree to the main repo before removal.\n This is CRITICAL when `.omo/` is gitignored - state written during worktree execution would otherwise be lost.\n ```bash\n cp -r <worktree-path>/.omo/* <main-repo>/.omo/ 2>/dev/null || true\n ```\n3. Switch to the main working directory (the original repo, NOT the worktree)\n4. Merge the worktree branch into the current branch: `git merge <worktree-branch>`\n5. If merge succeeds, clean up: `git worktree remove <worktree-path>`\n6. Remove the boulder.json state\n\nThis is the DEFAULT behavior when `--worktree` was used alone. When `--make-pr` or `--ship` is active, skip the local merge and follow the PR Delivery Mode instructions in the session context instead: push the branch and open a PR (`--make-pr` hands off with the PR URL; `--ship` keeps working until the PR is merged), then clean up. Otherwise skip merge only if the user explicitly instructs otherwise (e.g., asks to create a PR instead).";
@@ -1,9 +1,9 @@
1
1
  import { z } from "zod";
2
2
  export declare const TaskStatusSchema: z.ZodEnum<{
3
- deleted: "deleted";
4
3
  completed: "completed";
5
- pending: "pending";
4
+ deleted: "deleted";
6
5
  in_progress: "in_progress";
6
+ pending: "pending";
7
7
  }>;
8
8
  export type TaskStatus = z.infer<typeof TaskStatusSchema>;
9
9
  export declare const TaskSchema: z.ZodObject<{
@@ -11,10 +11,10 @@ export declare const TaskSchema: z.ZodObject<{
11
11
  subject: z.ZodString;
12
12
  description: z.ZodString;
13
13
  status: z.ZodEnum<{
14
- deleted: "deleted";
15
14
  completed: "completed";
16
- pending: "pending";
15
+ deleted: "deleted";
17
16
  in_progress: "in_progress";
17
+ pending: "pending";
18
18
  }>;
19
19
  activeForm: z.ZodOptional<z.ZodString>;
20
20
  blocks: z.ZodArray<z.ZodString>;
@@ -1,5 +1,5 @@
1
1
  import type { Message, RuntimeState } from "../types";
2
- export declare const DELETABLE_MEMBER_STATUSES: Set<"running" | "completed" | "pending" | "idle" | "shutdown_approved" | "errored">;
2
+ export declare const DELETABLE_MEMBER_STATUSES: Set<"completed" | "errored" | "idle" | "pending" | "running" | "shutdown_approved">;
3
3
  export declare function createShutdownMessage(from: string, to: string, kind: Message["kind"], body: string): Message;
4
4
  export declare function getRuntimeMember(runtimeState: RuntimeState, memberName: string): RuntimeState["members"][number];
5
5
  export declare function getLeadMemberName(runtimeState: RuntimeState): string;
@@ -17,14 +17,14 @@ export declare function readInboxMessages(teamRunId: string, memberName: string,
17
17
  messageId: string;
18
18
  from: string;
19
19
  to: string;
20
- kind: "message" | "shutdown_request" | "shutdown_approved" | "shutdown_rejected" | "announcement";
20
+ kind: "announcement" | "message" | "shutdown_approved" | "shutdown_rejected" | "shutdown_request";
21
21
  body: string;
22
- timestamp: number;
23
22
  summary?: string | undefined;
24
23
  references?: {
25
24
  path: string;
26
25
  description?: string | undefined;
27
26
  }[] | undefined;
27
+ timestamp: number;
28
28
  correlationId?: string | undefined;
29
29
  color?: string | undefined;
30
30
  }[]>;
@@ -33,14 +33,14 @@ export declare function createTestMessage(overrides?: Partial<Parameters<typeof
33
33
  messageId: string;
34
34
  from: string;
35
35
  to: string;
36
- kind: "message" | "shutdown_request" | "shutdown_approved" | "shutdown_rejected" | "announcement";
36
+ kind: "announcement" | "message" | "shutdown_approved" | "shutdown_rejected" | "shutdown_request";
37
37
  body: string;
38
- timestamp: number;
39
38
  summary?: string | undefined;
40
39
  references?: {
41
40
  path: string;
42
41
  description?: string | undefined;
43
42
  }[] | undefined;
43
+ timestamp: number;
44
44
  correlationId?: string | undefined;
45
45
  color?: string | undefined;
46
46
  };
@@ -11,17 +11,23 @@ export declare const createTeamRunMock: import("bun:test").Mock<(spec: TeamSpec,
11
11
  version: 1;
12
12
  teamRunId: string;
13
13
  teamName: string;
14
- specSource: "user" | "project";
14
+ specSource: "project" | "user";
15
15
  createdAt: number;
16
- status: "failed" | "deleted" | "active" | "creating" | "shutdown_requested" | "deleting" | "orphaned";
16
+ status: "active" | "creating" | "deleted" | "deleting" | "failed" | "orphaned" | "shutdown_requested";
17
+ leadSessionId?: string | undefined;
18
+ tmuxLayout?: {
19
+ ownedSession: boolean;
20
+ targetSessionId: string;
21
+ focusWindowId?: string | undefined;
22
+ gridWindowId?: string | undefined;
23
+ paneIds?: string[] | undefined;
24
+ } | undefined;
17
25
  members: {
18
26
  name: string;
19
- agentType: "leader" | "general-purpose";
20
- status: "running" | "completed" | "pending" | "idle" | "shutdown_approved" | "errored";
21
- pendingInjectedMessageIds: string[];
22
27
  sessionId?: string | undefined;
23
28
  tmuxPaneId?: string | undefined;
24
29
  tmuxGridPaneId?: string | undefined;
30
+ agentType: "general-purpose" | "leader";
25
31
  subagent_type?: string | undefined;
26
32
  category?: string | undefined;
27
33
  model?: {
@@ -33,13 +39,15 @@ export declare const createTeamRunMock: import("bun:test").Mock<(spec: TeamSpec,
33
39
  top_p?: number | undefined;
34
40
  maxTokens?: number | undefined;
35
41
  thinking?: {
36
- type: "enabled" | "disabled";
42
+ type: "disabled" | "enabled";
37
43
  budgetTokens?: number | undefined;
38
44
  } | undefined;
39
45
  } | undefined;
46
+ status: "completed" | "errored" | "idle" | "pending" | "running" | "shutdown_approved";
40
47
  color?: string | undefined;
41
48
  worktreePath?: string | undefined;
42
49
  lastInjectedTurnMarker?: string | undefined;
50
+ pendingInjectedMessageIds: string[];
43
51
  }[];
44
52
  shutdownRequests: {
45
53
  memberId: string;
@@ -56,14 +64,6 @@ export declare const createTeamRunMock: import("bun:test").Mock<(spec: TeamSpec,
56
64
  maxWallClockMinutes: number;
57
65
  maxMemberTurns: number;
58
66
  };
59
- leadSessionId?: string | undefined;
60
- tmuxLayout?: {
61
- ownedSession: boolean;
62
- targetSessionId: string;
63
- focusWindowId?: string | undefined;
64
- gridWindowId?: string | undefined;
65
- paneIds?: string[] | undefined;
66
- } | undefined;
67
67
  }>>;
68
68
  export declare const deleteTeamMock: import("bun:test").Mock<(teamRunId: string, _config?: unknown, _tmuxMgr?: unknown, _bgMgr?: unknown, options?: {
69
69
  force?: boolean;
@@ -77,57 +77,63 @@ export declare const rejectShutdownMock: import("bun:test").Mock<(teamRunId: str
77
77
  export declare const loadTeamSpecMock: import("bun:test").Mock<() => Promise<{
78
78
  version: 1;
79
79
  name: string;
80
+ description?: string | undefined;
80
81
  createdAt: number;
82
+ leadAgentId?: string | undefined;
83
+ teamAllowedPaths?: string[] | undefined;
84
+ sessionPermission?: string | undefined;
81
85
  members: ({
82
86
  name: string;
87
+ cwd?: string | undefined;
88
+ worktreePath?: string | undefined;
89
+ subscriptions?: string[] | undefined;
83
90
  backendType: "in-process" | "tmux";
91
+ color?: string | undefined;
84
92
  isActive: boolean;
85
93
  kind: "category";
86
94
  category: string;
87
95
  prompt: string;
96
+ } | {
97
+ name: string;
88
98
  cwd?: string | undefined;
89
99
  worktreePath?: string | undefined;
90
100
  subscriptions?: string[] | undefined;
91
- color?: string | undefined;
92
- } | {
93
- name: string;
94
101
  backendType: "in-process" | "tmux";
102
+ color?: string | undefined;
95
103
  isActive: boolean;
96
104
  kind: "subagent_type";
97
105
  subagent_type: string;
98
- cwd?: string | undefined;
99
- worktreePath?: string | undefined;
100
- subscriptions?: string[] | undefined;
101
- color?: string | undefined;
102
106
  prompt?: string | undefined;
103
107
  })[];
104
- description?: string | undefined;
105
- leadAgentId?: string | undefined;
106
- teamAllowedPaths?: string[] | undefined;
107
- sessionPermission?: string | undefined;
108
108
  }>>;
109
109
  export declare const listActiveTeamsMock: import("bun:test").Mock<() => Promise<{
110
110
  teamRunId: string;
111
111
  teamName: string;
112
- status: "failed" | "deleted" | "active" | "creating" | "shutdown_requested" | "deleting" | "orphaned";
112
+ status: "active" | "creating" | "deleted" | "deleting" | "failed" | "orphaned" | "shutdown_requested";
113
113
  memberCount: number;
114
- scope: "user" | "project";
114
+ scope: "project" | "user";
115
115
  }[]>>;
116
116
  export declare const loadRuntimeStateMock: import("bun:test").Mock<(teamRunId: string) => Promise<{
117
117
  version: 1;
118
118
  teamRunId: string;
119
119
  teamName: string;
120
- specSource: "user" | "project";
120
+ specSource: "project" | "user";
121
121
  createdAt: number;
122
- status: "failed" | "deleted" | "active" | "creating" | "shutdown_requested" | "deleting" | "orphaned";
122
+ status: "active" | "creating" | "deleted" | "deleting" | "failed" | "orphaned" | "shutdown_requested";
123
+ leadSessionId?: string | undefined;
124
+ tmuxLayout?: {
125
+ ownedSession: boolean;
126
+ targetSessionId: string;
127
+ focusWindowId?: string | undefined;
128
+ gridWindowId?: string | undefined;
129
+ paneIds?: string[] | undefined;
130
+ } | undefined;
123
131
  members: {
124
132
  name: string;
125
- agentType: "leader" | "general-purpose";
126
- status: "running" | "completed" | "pending" | "idle" | "shutdown_approved" | "errored";
127
- pendingInjectedMessageIds: string[];
128
133
  sessionId?: string | undefined;
129
134
  tmuxPaneId?: string | undefined;
130
135
  tmuxGridPaneId?: string | undefined;
136
+ agentType: "general-purpose" | "leader";
131
137
  subagent_type?: string | undefined;
132
138
  category?: string | undefined;
133
139
  model?: {
@@ -139,13 +145,15 @@ export declare const loadRuntimeStateMock: import("bun:test").Mock<(teamRunId: s
139
145
  top_p?: number | undefined;
140
146
  maxTokens?: number | undefined;
141
147
  thinking?: {
142
- type: "enabled" | "disabled";
148
+ type: "disabled" | "enabled";
143
149
  budgetTokens?: number | undefined;
144
150
  } | undefined;
145
151
  } | undefined;
152
+ status: "completed" | "errored" | "idle" | "pending" | "running" | "shutdown_approved";
146
153
  color?: string | undefined;
147
154
  worktreePath?: string | undefined;
148
155
  lastInjectedTurnMarker?: string | undefined;
156
+ pendingInjectedMessageIds: string[];
149
157
  }[];
150
158
  shutdownRequests: {
151
159
  memberId: string;
@@ -162,14 +170,6 @@ export declare const loadRuntimeStateMock: import("bun:test").Mock<(teamRunId: s
162
170
  maxWallClockMinutes: number;
163
171
  maxMemberTurns: number;
164
172
  };
165
- leadSessionId?: string | undefined;
166
- tmuxLayout?: {
167
- ownedSession: boolean;
168
- targetSessionId: string;
169
- focusWindowId?: string | undefined;
170
- gridWindowId?: string | undefined;
171
- paneIds?: string[] | undefined;
172
- } | undefined;
173
173
  }>>;
174
174
  export declare const config: {
175
175
  enabled: boolean;
@@ -179,10 +179,10 @@ export declare const config: {
179
179
  max_messages_per_run: number;
180
180
  max_wall_clock_minutes: number;
181
181
  max_member_turns: number;
182
+ base_dir?: string | undefined;
182
183
  message_payload_max_bytes: number;
183
184
  recipient_unread_max_bytes: number;
184
185
  mailbox_poll_interval_ms: number;
185
- base_dir?: string | undefined;
186
186
  };
187
187
  export declare const mockClient: OpencodeClient;
188
188
  export declare const backgroundManager: BackgroundManager;
@@ -0,0 +1,2 @@
1
+ import type { TmuxConfig } from "../../config/schema";
2
+ export declare function selectTmuxManagerEnvironmentPredicate(isolation: TmuxConfig["isolation"]): () => boolean;
@@ -1,4 +1,5 @@
1
1
  export * from "./manager";
2
+ export * from "./environment-eligibility";
2
3
  export * from "./event-handlers";
3
4
  export * from "./polling";
4
5
  export * from "./session-created-event";
@@ -4,5 +4,6 @@ export declare function createTrackedSession(params: {
4
4
  paneId: string;
5
5
  description: string;
6
6
  now?: Date;
7
+ attachActivated?: boolean;
7
8
  }): TrackedSession;
8
9
  export declare function markTrackedSessionClosePending(tracked: TrackedSession): TrackedSession;