opencode-repos 0.2.0 → 0.3.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 (475) hide show
  1. package/AGENTS.md +180 -0
  2. package/README.md +103 -3
  3. package/TODO.md +3 -0
  4. package/index.ts +1590 -158
  5. package/oh-my-opencode/.github/FUNDING.yml +15 -0
  6. package/oh-my-opencode/.github/ISSUE_TEMPLATE/bug_report.yml +129 -0
  7. package/oh-my-opencode/.github/ISSUE_TEMPLATE/config.yml +8 -0
  8. package/oh-my-opencode/.github/ISSUE_TEMPLATE/feature_request.yml +100 -0
  9. package/oh-my-opencode/.github/ISSUE_TEMPLATE/general.yml +83 -0
  10. package/oh-my-opencode/.github/assets/google.jpg +0 -0
  11. package/oh-my-opencode/.github/assets/hero.jpg +0 -0
  12. package/oh-my-opencode/.github/assets/indent.jpg +0 -0
  13. package/oh-my-opencode/.github/assets/microsoft.jpg +0 -0
  14. package/oh-my-opencode/.github/assets/omo.png +0 -0
  15. package/oh-my-opencode/.github/assets/orchestrator-atlas.png +0 -0
  16. package/oh-my-opencode/.github/assets/sisyphus.png +0 -0
  17. package/oh-my-opencode/.github/assets/sisyphuslabs.png +0 -0
  18. package/oh-my-opencode/.github/pull_request_template.md +34 -0
  19. package/oh-my-opencode/.github/workflows/ci.yml +138 -0
  20. package/oh-my-opencode/.github/workflows/cla.yml +41 -0
  21. package/oh-my-opencode/.github/workflows/lint-workflows.yml +22 -0
  22. package/oh-my-opencode/.github/workflows/publish.yml +165 -0
  23. package/oh-my-opencode/.github/workflows/sisyphus-agent.yml +500 -0
  24. package/oh-my-opencode/.opencode/background-tasks.json +27 -0
  25. package/oh-my-opencode/.opencode/command/get-unpublished-changes.md +84 -0
  26. package/oh-my-opencode/.opencode/command/omomomo.md +37 -0
  27. package/oh-my-opencode/.opencode/command/publish.md +257 -0
  28. package/oh-my-opencode/AGENTS.md +179 -0
  29. package/oh-my-opencode/CLA.md +58 -0
  30. package/oh-my-opencode/CONTRIBUTING.md +268 -0
  31. package/oh-my-opencode/LICENSE.md +82 -0
  32. package/oh-my-opencode/README.ja.md +370 -0
  33. package/oh-my-opencode/README.md +376 -0
  34. package/oh-my-opencode/README.zh-cn.md +380 -0
  35. package/oh-my-opencode/assets/oh-my-opencode.schema.json +2171 -0
  36. package/oh-my-opencode/bin/oh-my-opencode.js +80 -0
  37. package/oh-my-opencode/bin/platform.js +38 -0
  38. package/oh-my-opencode/bin/platform.test.ts +148 -0
  39. package/oh-my-opencode/bun.lock +314 -0
  40. package/oh-my-opencode/bunfig.toml +2 -0
  41. package/oh-my-opencode/docs/category-skill-guide.md +200 -0
  42. package/oh-my-opencode/docs/cli-guide.md +272 -0
  43. package/oh-my-opencode/docs/configurations.md +654 -0
  44. package/oh-my-opencode/docs/features.md +550 -0
  45. package/oh-my-opencode/docs/guide/installation.md +288 -0
  46. package/oh-my-opencode/docs/guide/overview.md +97 -0
  47. package/oh-my-opencode/docs/guide/understanding-orchestration-system.md +445 -0
  48. package/oh-my-opencode/docs/orchestration-guide.md +152 -0
  49. package/oh-my-opencode/docs/ultrawork-manifesto.md +197 -0
  50. package/oh-my-opencode/package.json +89 -0
  51. package/oh-my-opencode/packages/darwin-arm64/bin/.gitkeep +0 -0
  52. package/oh-my-opencode/packages/darwin-arm64/package.json +22 -0
  53. package/oh-my-opencode/packages/darwin-x64/bin/.gitkeep +0 -0
  54. package/oh-my-opencode/packages/darwin-x64/package.json +22 -0
  55. package/oh-my-opencode/packages/linux-arm64/bin/.gitkeep +0 -0
  56. package/oh-my-opencode/packages/linux-arm64/package.json +25 -0
  57. package/oh-my-opencode/packages/linux-arm64-musl/bin/.gitkeep +0 -0
  58. package/oh-my-opencode/packages/linux-arm64-musl/package.json +25 -0
  59. package/oh-my-opencode/packages/linux-x64/bin/.gitkeep +0 -0
  60. package/oh-my-opencode/packages/linux-x64/package.json +25 -0
  61. package/oh-my-opencode/packages/linux-x64-musl/bin/.gitkeep +0 -0
  62. package/oh-my-opencode/packages/linux-x64-musl/package.json +25 -0
  63. package/oh-my-opencode/packages/windows-x64/bin/.gitkeep +0 -0
  64. package/oh-my-opencode/packages/windows-x64/package.json +22 -0
  65. package/oh-my-opencode/postinstall.mjs +43 -0
  66. package/oh-my-opencode/script/build-binaries.ts +103 -0
  67. package/oh-my-opencode/script/build-schema.ts +28 -0
  68. package/oh-my-opencode/script/generate-changelog.ts +92 -0
  69. package/oh-my-opencode/script/publish.ts +344 -0
  70. package/oh-my-opencode/signatures/cla.json +676 -0
  71. package/oh-my-opencode/src/agents/AGENTS.md +67 -0
  72. package/oh-my-opencode/src/agents/atlas.ts +1383 -0
  73. package/oh-my-opencode/src/agents/dynamic-agent-prompt-builder.ts +400 -0
  74. package/oh-my-opencode/src/agents/explore.ts +122 -0
  75. package/oh-my-opencode/src/agents/index.ts +13 -0
  76. package/oh-my-opencode/src/agents/librarian.ts +326 -0
  77. package/oh-my-opencode/src/agents/metis.ts +315 -0
  78. package/oh-my-opencode/src/agents/momus.test.ts +57 -0
  79. package/oh-my-opencode/src/agents/momus.ts +444 -0
  80. package/oh-my-opencode/src/agents/multimodal-looker.ts +56 -0
  81. package/oh-my-opencode/src/agents/oracle.ts +122 -0
  82. package/oh-my-opencode/src/agents/prometheus-prompt.test.ts +22 -0
  83. package/oh-my-opencode/src/agents/prometheus-prompt.ts +1196 -0
  84. package/oh-my-opencode/src/agents/sisyphus-junior.test.ts +232 -0
  85. package/oh-my-opencode/src/agents/sisyphus-junior.ts +134 -0
  86. package/oh-my-opencode/src/agents/sisyphus.ts +633 -0
  87. package/oh-my-opencode/src/agents/types.ts +80 -0
  88. package/oh-my-opencode/src/agents/utils.test.ts +311 -0
  89. package/oh-my-opencode/src/agents/utils.ts +240 -0
  90. package/oh-my-opencode/src/cli/AGENTS.md +91 -0
  91. package/oh-my-opencode/src/cli/config-manager.test.ts +364 -0
  92. package/oh-my-opencode/src/cli/config-manager.ts +641 -0
  93. package/oh-my-opencode/src/cli/doctor/checks/auth.test.ts +114 -0
  94. package/oh-my-opencode/src/cli/doctor/checks/auth.ts +115 -0
  95. package/oh-my-opencode/src/cli/doctor/checks/config.test.ts +103 -0
  96. package/oh-my-opencode/src/cli/doctor/checks/config.ts +123 -0
  97. package/oh-my-opencode/src/cli/doctor/checks/dependencies.test.ts +152 -0
  98. package/oh-my-opencode/src/cli/doctor/checks/dependencies.ts +163 -0
  99. package/oh-my-opencode/src/cli/doctor/checks/gh.test.ts +151 -0
  100. package/oh-my-opencode/src/cli/doctor/checks/gh.ts +171 -0
  101. package/oh-my-opencode/src/cli/doctor/checks/index.ts +34 -0
  102. package/oh-my-opencode/src/cli/doctor/checks/lsp.test.ts +134 -0
  103. package/oh-my-opencode/src/cli/doctor/checks/lsp.ts +77 -0
  104. package/oh-my-opencode/src/cli/doctor/checks/mcp.test.ts +115 -0
  105. package/oh-my-opencode/src/cli/doctor/checks/mcp.ts +128 -0
  106. package/oh-my-opencode/src/cli/doctor/checks/opencode.test.ts +227 -0
  107. package/oh-my-opencode/src/cli/doctor/checks/opencode.ts +178 -0
  108. package/oh-my-opencode/src/cli/doctor/checks/plugin.test.ts +109 -0
  109. package/oh-my-opencode/src/cli/doctor/checks/plugin.ts +124 -0
  110. package/oh-my-opencode/src/cli/doctor/checks/version.test.ts +148 -0
  111. package/oh-my-opencode/src/cli/doctor/checks/version.ts +135 -0
  112. package/oh-my-opencode/src/cli/doctor/constants.ts +72 -0
  113. package/oh-my-opencode/src/cli/doctor/formatter.test.ts +218 -0
  114. package/oh-my-opencode/src/cli/doctor/formatter.ts +140 -0
  115. package/oh-my-opencode/src/cli/doctor/index.ts +11 -0
  116. package/oh-my-opencode/src/cli/doctor/runner.test.ts +153 -0
  117. package/oh-my-opencode/src/cli/doctor/runner.ts +132 -0
  118. package/oh-my-opencode/src/cli/doctor/types.ts +113 -0
  119. package/oh-my-opencode/src/cli/get-local-version/formatter.ts +66 -0
  120. package/oh-my-opencode/src/cli/get-local-version/index.ts +106 -0
  121. package/oh-my-opencode/src/cli/get-local-version/types.ts +14 -0
  122. package/oh-my-opencode/src/cli/index.ts +153 -0
  123. package/oh-my-opencode/src/cli/install.ts +523 -0
  124. package/oh-my-opencode/src/cli/model-fallback.ts +246 -0
  125. package/oh-my-opencode/src/cli/run/completion.test.ts +170 -0
  126. package/oh-my-opencode/src/cli/run/completion.ts +79 -0
  127. package/oh-my-opencode/src/cli/run/events.test.ts +155 -0
  128. package/oh-my-opencode/src/cli/run/events.ts +325 -0
  129. package/oh-my-opencode/src/cli/run/index.ts +2 -0
  130. package/oh-my-opencode/src/cli/run/runner.ts +159 -0
  131. package/oh-my-opencode/src/cli/run/types.ts +76 -0
  132. package/oh-my-opencode/src/cli/types.ts +40 -0
  133. package/oh-my-opencode/src/config/index.ts +26 -0
  134. package/oh-my-opencode/src/config/schema.test.ts +444 -0
  135. package/oh-my-opencode/src/config/schema.ts +339 -0
  136. package/oh-my-opencode/src/features/AGENTS.md +77 -0
  137. package/oh-my-opencode/src/features/background-agent/concurrency.test.ts +418 -0
  138. package/oh-my-opencode/src/features/background-agent/concurrency.ts +137 -0
  139. package/oh-my-opencode/src/features/background-agent/index.ts +3 -0
  140. package/oh-my-opencode/src/features/background-agent/manager.test.ts +1928 -0
  141. package/oh-my-opencode/src/features/background-agent/manager.ts +1335 -0
  142. package/oh-my-opencode/src/features/background-agent/types.ts +66 -0
  143. package/oh-my-opencode/src/features/boulder-state/constants.ts +13 -0
  144. package/oh-my-opencode/src/features/boulder-state/index.ts +3 -0
  145. package/oh-my-opencode/src/features/boulder-state/storage.test.ts +250 -0
  146. package/oh-my-opencode/src/features/boulder-state/storage.ts +150 -0
  147. package/oh-my-opencode/src/features/boulder-state/types.ts +26 -0
  148. package/oh-my-opencode/src/features/builtin-commands/commands.ts +89 -0
  149. package/oh-my-opencode/src/features/builtin-commands/index.ts +2 -0
  150. package/oh-my-opencode/src/features/builtin-commands/templates/init-deep.ts +300 -0
  151. package/oh-my-opencode/src/features/builtin-commands/templates/ralph-loop.ts +38 -0
  152. package/oh-my-opencode/src/features/builtin-commands/templates/refactor.ts +619 -0
  153. package/oh-my-opencode/src/features/builtin-commands/templates/start-work.ts +72 -0
  154. package/oh-my-opencode/src/features/builtin-commands/types.ts +9 -0
  155. package/oh-my-opencode/src/features/builtin-skills/frontend-ui-ux/SKILL.md +78 -0
  156. package/oh-my-opencode/src/features/builtin-skills/git-master/SKILL.md +1105 -0
  157. package/oh-my-opencode/src/features/builtin-skills/index.ts +2 -0
  158. package/oh-my-opencode/src/features/builtin-skills/skills.ts +1203 -0
  159. package/oh-my-opencode/src/features/builtin-skills/types.ts +16 -0
  160. package/oh-my-opencode/src/features/claude-code-agent-loader/index.ts +2 -0
  161. package/oh-my-opencode/src/features/claude-code-agent-loader/loader.ts +90 -0
  162. package/oh-my-opencode/src/features/claude-code-agent-loader/types.ts +17 -0
  163. package/oh-my-opencode/src/features/claude-code-command-loader/index.ts +2 -0
  164. package/oh-my-opencode/src/features/claude-code-command-loader/loader.ts +144 -0
  165. package/oh-my-opencode/src/features/claude-code-command-loader/types.ts +46 -0
  166. package/oh-my-opencode/src/features/claude-code-mcp-loader/env-expander.ts +27 -0
  167. package/oh-my-opencode/src/features/claude-code-mcp-loader/index.ts +11 -0
  168. package/oh-my-opencode/src/features/claude-code-mcp-loader/loader.test.ts +162 -0
  169. package/oh-my-opencode/src/features/claude-code-mcp-loader/loader.ts +113 -0
  170. package/oh-my-opencode/src/features/claude-code-mcp-loader/transformer.ts +53 -0
  171. package/oh-my-opencode/src/features/claude-code-mcp-loader/types.ts +42 -0
  172. package/oh-my-opencode/src/features/claude-code-plugin-loader/index.ts +3 -0
  173. package/oh-my-opencode/src/features/claude-code-plugin-loader/loader.ts +486 -0
  174. package/oh-my-opencode/src/features/claude-code-plugin-loader/types.ts +210 -0
  175. package/oh-my-opencode/src/features/claude-code-session-state/index.ts +1 -0
  176. package/oh-my-opencode/src/features/claude-code-session-state/state.test.ts +126 -0
  177. package/oh-my-opencode/src/features/claude-code-session-state/state.ts +37 -0
  178. package/oh-my-opencode/src/features/context-injector/collector.test.ts +330 -0
  179. package/oh-my-opencode/src/features/context-injector/collector.ts +85 -0
  180. package/oh-my-opencode/src/features/context-injector/index.ts +14 -0
  181. package/oh-my-opencode/src/features/context-injector/injector.test.ts +122 -0
  182. package/oh-my-opencode/src/features/context-injector/injector.ts +167 -0
  183. package/oh-my-opencode/src/features/context-injector/types.ts +91 -0
  184. package/oh-my-opencode/src/features/hook-message-injector/constants.ts +6 -0
  185. package/oh-my-opencode/src/features/hook-message-injector/index.ts +4 -0
  186. package/oh-my-opencode/src/features/hook-message-injector/injector.ts +195 -0
  187. package/oh-my-opencode/src/features/hook-message-injector/types.ts +47 -0
  188. package/oh-my-opencode/src/features/opencode-skill-loader/async-loader.test.ts +448 -0
  189. package/oh-my-opencode/src/features/opencode-skill-loader/async-loader.ts +180 -0
  190. package/oh-my-opencode/src/features/opencode-skill-loader/blocking.test.ts +210 -0
  191. package/oh-my-opencode/src/features/opencode-skill-loader/blocking.ts +62 -0
  192. package/oh-my-opencode/src/features/opencode-skill-loader/discover-worker.ts +59 -0
  193. package/oh-my-opencode/src/features/opencode-skill-loader/index.ts +4 -0
  194. package/oh-my-opencode/src/features/opencode-skill-loader/loader.test.ts +273 -0
  195. package/oh-my-opencode/src/features/opencode-skill-loader/loader.ts +259 -0
  196. package/oh-my-opencode/src/features/opencode-skill-loader/merger.ts +267 -0
  197. package/oh-my-opencode/src/features/opencode-skill-loader/skill-content.test.ts +267 -0
  198. package/oh-my-opencode/src/features/opencode-skill-loader/skill-content.ts +206 -0
  199. package/oh-my-opencode/src/features/opencode-skill-loader/types.ts +38 -0
  200. package/oh-my-opencode/src/features/skill-mcp-manager/env-cleaner.test.ts +201 -0
  201. package/oh-my-opencode/src/features/skill-mcp-manager/env-cleaner.ts +27 -0
  202. package/oh-my-opencode/src/features/skill-mcp-manager/index.ts +2 -0
  203. package/oh-my-opencode/src/features/skill-mcp-manager/manager.test.ts +611 -0
  204. package/oh-my-opencode/src/features/skill-mcp-manager/manager.ts +520 -0
  205. package/oh-my-opencode/src/features/skill-mcp-manager/types.ts +14 -0
  206. package/oh-my-opencode/src/features/task-toast-manager/index.ts +2 -0
  207. package/oh-my-opencode/src/features/task-toast-manager/manager.test.ts +249 -0
  208. package/oh-my-opencode/src/features/task-toast-manager/manager.ts +215 -0
  209. package/oh-my-opencode/src/features/task-toast-manager/types.ts +24 -0
  210. package/oh-my-opencode/src/hooks/AGENTS.md +73 -0
  211. package/oh-my-opencode/src/hooks/agent-usage-reminder/constants.ts +54 -0
  212. package/oh-my-opencode/src/hooks/agent-usage-reminder/index.ts +109 -0
  213. package/oh-my-opencode/src/hooks/agent-usage-reminder/storage.ts +42 -0
  214. package/oh-my-opencode/src/hooks/agent-usage-reminder/types.ts +6 -0
  215. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/executor.test.ts +307 -0
  216. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/executor.ts +485 -0
  217. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/index.ts +151 -0
  218. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/parser.ts +201 -0
  219. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.test.ts +33 -0
  220. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.ts +184 -0
  221. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-types.ts +44 -0
  222. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/storage.test.ts +77 -0
  223. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/storage.ts +250 -0
  224. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/types.ts +42 -0
  225. package/oh-my-opencode/src/hooks/atlas/index.test.ts +953 -0
  226. package/oh-my-opencode/src/hooks/atlas/index.ts +771 -0
  227. package/oh-my-opencode/src/hooks/auto-slash-command/constants.ts +12 -0
  228. package/oh-my-opencode/src/hooks/auto-slash-command/detector.test.ts +296 -0
  229. package/oh-my-opencode/src/hooks/auto-slash-command/detector.ts +65 -0
  230. package/oh-my-opencode/src/hooks/auto-slash-command/executor.ts +205 -0
  231. package/oh-my-opencode/src/hooks/auto-slash-command/index.test.ts +254 -0
  232. package/oh-my-opencode/src/hooks/auto-slash-command/index.ts +89 -0
  233. package/oh-my-opencode/src/hooks/auto-slash-command/types.ts +23 -0
  234. package/oh-my-opencode/src/hooks/auto-update-checker/cache.ts +93 -0
  235. package/oh-my-opencode/src/hooks/auto-update-checker/checker.test.ts +24 -0
  236. package/oh-my-opencode/src/hooks/auto-update-checker/checker.ts +284 -0
  237. package/oh-my-opencode/src/hooks/auto-update-checker/constants.ts +64 -0
  238. package/oh-my-opencode/src/hooks/auto-update-checker/index.test.ts +254 -0
  239. package/oh-my-opencode/src/hooks/auto-update-checker/index.ts +260 -0
  240. package/oh-my-opencode/src/hooks/auto-update-checker/types.ts +29 -0
  241. package/oh-my-opencode/src/hooks/background-compaction/index.ts +87 -0
  242. package/oh-my-opencode/src/hooks/background-notification/index.ts +28 -0
  243. package/oh-my-opencode/src/hooks/background-notification/types.ts +5 -0
  244. package/oh-my-opencode/src/hooks/claude-code-hooks/AGENTS.md +70 -0
  245. package/oh-my-opencode/src/hooks/claude-code-hooks/config-loader.ts +107 -0
  246. package/oh-my-opencode/src/hooks/claude-code-hooks/config.ts +103 -0
  247. package/oh-my-opencode/src/hooks/claude-code-hooks/index.ts +401 -0
  248. package/oh-my-opencode/src/hooks/claude-code-hooks/plugin-config.ts +12 -0
  249. package/oh-my-opencode/src/hooks/claude-code-hooks/post-tool-use.ts +199 -0
  250. package/oh-my-opencode/src/hooks/claude-code-hooks/pre-compact.ts +109 -0
  251. package/oh-my-opencode/src/hooks/claude-code-hooks/pre-tool-use.ts +172 -0
  252. package/oh-my-opencode/src/hooks/claude-code-hooks/stop.ts +118 -0
  253. package/oh-my-opencode/src/hooks/claude-code-hooks/todo.ts +76 -0
  254. package/oh-my-opencode/src/hooks/claude-code-hooks/tool-input-cache.ts +47 -0
  255. package/oh-my-opencode/src/hooks/claude-code-hooks/transcript.ts +252 -0
  256. package/oh-my-opencode/src/hooks/claude-code-hooks/types.ts +204 -0
  257. package/oh-my-opencode/src/hooks/claude-code-hooks/user-prompt-submit.ts +117 -0
  258. package/oh-my-opencode/src/hooks/comment-checker/cli.test.ts +68 -0
  259. package/oh-my-opencode/src/hooks/comment-checker/cli.ts +221 -0
  260. package/oh-my-opencode/src/hooks/comment-checker/downloader.ts +196 -0
  261. package/oh-my-opencode/src/hooks/comment-checker/index.ts +171 -0
  262. package/oh-my-opencode/src/hooks/comment-checker/types.ts +33 -0
  263. package/oh-my-opencode/src/hooks/compaction-context-injector/index.ts +61 -0
  264. package/oh-my-opencode/src/hooks/context-window-monitor.ts +99 -0
  265. package/oh-my-opencode/src/hooks/delegate-task-retry/index.test.ts +119 -0
  266. package/oh-my-opencode/src/hooks/delegate-task-retry/index.ts +136 -0
  267. package/oh-my-opencode/src/hooks/directory-agents-injector/constants.ts +9 -0
  268. package/oh-my-opencode/src/hooks/directory-agents-injector/index.ts +182 -0
  269. package/oh-my-opencode/src/hooks/directory-agents-injector/storage.ts +48 -0
  270. package/oh-my-opencode/src/hooks/directory-agents-injector/types.ts +5 -0
  271. package/oh-my-opencode/src/hooks/directory-readme-injector/constants.ts +9 -0
  272. package/oh-my-opencode/src/hooks/directory-readme-injector/index.ts +177 -0
  273. package/oh-my-opencode/src/hooks/directory-readme-injector/storage.ts +48 -0
  274. package/oh-my-opencode/src/hooks/directory-readme-injector/types.ts +5 -0
  275. package/oh-my-opencode/src/hooks/edit-error-recovery/index.test.ts +126 -0
  276. package/oh-my-opencode/src/hooks/edit-error-recovery/index.ts +57 -0
  277. package/oh-my-opencode/src/hooks/empty-task-response-detector.ts +27 -0
  278. package/oh-my-opencode/src/hooks/index.ts +32 -0
  279. package/oh-my-opencode/src/hooks/interactive-bash-session/constants.ts +15 -0
  280. package/oh-my-opencode/src/hooks/interactive-bash-session/index.ts +262 -0
  281. package/oh-my-opencode/src/hooks/interactive-bash-session/storage.ts +59 -0
  282. package/oh-my-opencode/src/hooks/interactive-bash-session/types.ts +11 -0
  283. package/oh-my-opencode/src/hooks/keyword-detector/constants.ts +300 -0
  284. package/oh-my-opencode/src/hooks/keyword-detector/detector.ts +52 -0
  285. package/oh-my-opencode/src/hooks/keyword-detector/index.test.ts +529 -0
  286. package/oh-my-opencode/src/hooks/keyword-detector/index.ts +100 -0
  287. package/oh-my-opencode/src/hooks/keyword-detector/types.ts +4 -0
  288. package/oh-my-opencode/src/hooks/non-interactive-env/constants.ts +70 -0
  289. package/oh-my-opencode/src/hooks/non-interactive-env/detector.ts +19 -0
  290. package/oh-my-opencode/src/hooks/non-interactive-env/index.test.ts +323 -0
  291. package/oh-my-opencode/src/hooks/non-interactive-env/index.ts +63 -0
  292. package/oh-my-opencode/src/hooks/non-interactive-env/types.ts +3 -0
  293. package/oh-my-opencode/src/hooks/prometheus-md-only/constants.ts +32 -0
  294. package/oh-my-opencode/src/hooks/prometheus-md-only/index.test.ts +488 -0
  295. package/oh-my-opencode/src/hooks/prometheus-md-only/index.ts +136 -0
  296. package/oh-my-opencode/src/hooks/ralph-loop/constants.ts +5 -0
  297. package/oh-my-opencode/src/hooks/ralph-loop/index.test.ts +835 -0
  298. package/oh-my-opencode/src/hooks/ralph-loop/index.ts +417 -0
  299. package/oh-my-opencode/src/hooks/ralph-loop/storage.ts +115 -0
  300. package/oh-my-opencode/src/hooks/ralph-loop/types.ts +19 -0
  301. package/oh-my-opencode/src/hooks/rules-injector/constants.ts +30 -0
  302. package/oh-my-opencode/src/hooks/rules-injector/finder.test.ts +381 -0
  303. package/oh-my-opencode/src/hooks/rules-injector/finder.ts +263 -0
  304. package/oh-my-opencode/src/hooks/rules-injector/index.ts +223 -0
  305. package/oh-my-opencode/src/hooks/rules-injector/matcher.ts +63 -0
  306. package/oh-my-opencode/src/hooks/rules-injector/parser.test.ts +226 -0
  307. package/oh-my-opencode/src/hooks/rules-injector/parser.ts +211 -0
  308. package/oh-my-opencode/src/hooks/rules-injector/storage.ts +59 -0
  309. package/oh-my-opencode/src/hooks/rules-injector/types.ts +57 -0
  310. package/oh-my-opencode/src/hooks/session-notification-utils.ts +140 -0
  311. package/oh-my-opencode/src/hooks/session-notification.test.ts +361 -0
  312. package/oh-my-opencode/src/hooks/session-notification.ts +330 -0
  313. package/oh-my-opencode/src/hooks/session-recovery/constants.ts +10 -0
  314. package/oh-my-opencode/src/hooks/session-recovery/index.test.ts +223 -0
  315. package/oh-my-opencode/src/hooks/session-recovery/index.ts +435 -0
  316. package/oh-my-opencode/src/hooks/session-recovery/storage.ts +390 -0
  317. package/oh-my-opencode/src/hooks/session-recovery/types.ts +98 -0
  318. package/oh-my-opencode/src/hooks/start-work/index.test.ts +402 -0
  319. package/oh-my-opencode/src/hooks/start-work/index.ts +242 -0
  320. package/oh-my-opencode/src/hooks/task-resume-info/index.ts +36 -0
  321. package/oh-my-opencode/src/hooks/think-mode/detector.ts +57 -0
  322. package/oh-my-opencode/src/hooks/think-mode/index.test.ts +353 -0
  323. package/oh-my-opencode/src/hooks/think-mode/index.ts +89 -0
  324. package/oh-my-opencode/src/hooks/think-mode/switcher.test.ts +461 -0
  325. package/oh-my-opencode/src/hooks/think-mode/switcher.ts +222 -0
  326. package/oh-my-opencode/src/hooks/think-mode/types.ts +21 -0
  327. package/oh-my-opencode/src/hooks/thinking-block-validator/index.ts +171 -0
  328. package/oh-my-opencode/src/hooks/todo-continuation-enforcer.test.ts +876 -0
  329. package/oh-my-opencode/src/hooks/todo-continuation-enforcer.ts +480 -0
  330. package/oh-my-opencode/src/hooks/tool-output-truncator.test.ts +168 -0
  331. package/oh-my-opencode/src/hooks/tool-output-truncator.ts +61 -0
  332. package/oh-my-opencode/src/index.ts +589 -0
  333. package/oh-my-opencode/src/mcp/AGENTS.md +70 -0
  334. package/oh-my-opencode/src/mcp/context7.ts +6 -0
  335. package/oh-my-opencode/src/mcp/grep-app.ts +6 -0
  336. package/oh-my-opencode/src/mcp/index.test.ts +86 -0
  337. package/oh-my-opencode/src/mcp/index.ts +32 -0
  338. package/oh-my-opencode/src/mcp/types.ts +9 -0
  339. package/oh-my-opencode/src/mcp/websearch.ts +10 -0
  340. package/oh-my-opencode/src/plugin-config.test.ts +119 -0
  341. package/oh-my-opencode/src/plugin-config.ts +135 -0
  342. package/oh-my-opencode/src/plugin-handlers/config-handler.test.ts +103 -0
  343. package/oh-my-opencode/src/plugin-handlers/config-handler.ts +399 -0
  344. package/oh-my-opencode/src/plugin-handlers/index.ts +1 -0
  345. package/oh-my-opencode/src/plugin-state.ts +30 -0
  346. package/oh-my-opencode/src/shared/AGENTS.md +63 -0
  347. package/oh-my-opencode/src/shared/agent-tool-restrictions.ts +44 -0
  348. package/oh-my-opencode/src/shared/agent-variant.test.ts +83 -0
  349. package/oh-my-opencode/src/shared/agent-variant.ts +40 -0
  350. package/oh-my-opencode/src/shared/claude-config-dir.test.ts +60 -0
  351. package/oh-my-opencode/src/shared/claude-config-dir.ts +11 -0
  352. package/oh-my-opencode/src/shared/command-executor.ts +225 -0
  353. package/oh-my-opencode/src/shared/config-errors.ts +18 -0
  354. package/oh-my-opencode/src/shared/config-path.ts +47 -0
  355. package/oh-my-opencode/src/shared/data-path.ts +22 -0
  356. package/oh-my-opencode/src/shared/deep-merge.test.ts +336 -0
  357. package/oh-my-opencode/src/shared/deep-merge.ts +53 -0
  358. package/oh-my-opencode/src/shared/dynamic-truncator.ts +193 -0
  359. package/oh-my-opencode/src/shared/external-plugin-detector.test.ts +133 -0
  360. package/oh-my-opencode/src/shared/external-plugin-detector.ts +132 -0
  361. package/oh-my-opencode/src/shared/file-reference-resolver.ts +85 -0
  362. package/oh-my-opencode/src/shared/file-utils.ts +40 -0
  363. package/oh-my-opencode/src/shared/first-message-variant.test.ts +32 -0
  364. package/oh-my-opencode/src/shared/first-message-variant.ts +28 -0
  365. package/oh-my-opencode/src/shared/frontmatter.test.ts +262 -0
  366. package/oh-my-opencode/src/shared/frontmatter.ts +31 -0
  367. package/oh-my-opencode/src/shared/hook-disabled.ts +22 -0
  368. package/oh-my-opencode/src/shared/index.ts +29 -0
  369. package/oh-my-opencode/src/shared/jsonc-parser.test.ts +266 -0
  370. package/oh-my-opencode/src/shared/jsonc-parser.ts +66 -0
  371. package/oh-my-opencode/src/shared/logger.ts +20 -0
  372. package/oh-my-opencode/src/shared/migration.test.ts +602 -0
  373. package/oh-my-opencode/src/shared/migration.ts +191 -0
  374. package/oh-my-opencode/src/shared/model-resolver.test.ts +101 -0
  375. package/oh-my-opencode/src/shared/model-resolver.ts +35 -0
  376. package/oh-my-opencode/src/shared/model-sanitizer.ts +12 -0
  377. package/oh-my-opencode/src/shared/opencode-config-dir.test.ts +318 -0
  378. package/oh-my-opencode/src/shared/opencode-config-dir.ts +142 -0
  379. package/oh-my-opencode/src/shared/opencode-version.test.ts +223 -0
  380. package/oh-my-opencode/src/shared/opencode-version.ts +72 -0
  381. package/oh-my-opencode/src/shared/pattern-matcher.ts +29 -0
  382. package/oh-my-opencode/src/shared/permission-compat.test.ts +134 -0
  383. package/oh-my-opencode/src/shared/permission-compat.ts +77 -0
  384. package/oh-my-opencode/src/shared/session-cursor.test.ts +66 -0
  385. package/oh-my-opencode/src/shared/session-cursor.ts +85 -0
  386. package/oh-my-opencode/src/shared/shell-env.test.ts +278 -0
  387. package/oh-my-opencode/src/shared/shell-env.ts +111 -0
  388. package/oh-my-opencode/src/shared/snake-case.ts +49 -0
  389. package/oh-my-opencode/src/shared/system-directive.ts +40 -0
  390. package/oh-my-opencode/src/shared/tool-name.ts +26 -0
  391. package/oh-my-opencode/src/shared/zip-extractor.ts +83 -0
  392. package/oh-my-opencode/src/tools/AGENTS.md +74 -0
  393. package/oh-my-opencode/src/tools/ast-grep/cli.ts +230 -0
  394. package/oh-my-opencode/src/tools/ast-grep/constants.ts +261 -0
  395. package/oh-my-opencode/src/tools/ast-grep/downloader.ts +128 -0
  396. package/oh-my-opencode/src/tools/ast-grep/index.ts +13 -0
  397. package/oh-my-opencode/src/tools/ast-grep/tools.ts +112 -0
  398. package/oh-my-opencode/src/tools/ast-grep/types.ts +61 -0
  399. package/oh-my-opencode/src/tools/ast-grep/utils.ts +102 -0
  400. package/oh-my-opencode/src/tools/background-task/constants.ts +7 -0
  401. package/oh-my-opencode/src/tools/background-task/index.ts +7 -0
  402. package/oh-my-opencode/src/tools/background-task/tools.ts +479 -0
  403. package/oh-my-opencode/src/tools/background-task/types.ts +16 -0
  404. package/oh-my-opencode/src/tools/call-omo-agent/constants.ts +7 -0
  405. package/oh-my-opencode/src/tools/call-omo-agent/index.ts +3 -0
  406. package/oh-my-opencode/src/tools/call-omo-agent/tools.ts +338 -0
  407. package/oh-my-opencode/src/tools/call-omo-agent/types.ts +27 -0
  408. package/oh-my-opencode/src/tools/delegate-task/constants.ts +205 -0
  409. package/oh-my-opencode/src/tools/delegate-task/index.ts +3 -0
  410. package/oh-my-opencode/src/tools/delegate-task/tools.test.ts +1575 -0
  411. package/oh-my-opencode/src/tools/delegate-task/tools.ts +885 -0
  412. package/oh-my-opencode/src/tools/delegate-task/types.ts +9 -0
  413. package/oh-my-opencode/src/tools/glob/cli.test.ts +158 -0
  414. package/oh-my-opencode/src/tools/glob/cli.ts +191 -0
  415. package/oh-my-opencode/src/tools/glob/constants.ts +12 -0
  416. package/oh-my-opencode/src/tools/glob/index.ts +3 -0
  417. package/oh-my-opencode/src/tools/glob/tools.ts +41 -0
  418. package/oh-my-opencode/src/tools/glob/types.ts +22 -0
  419. package/oh-my-opencode/src/tools/glob/utils.ts +26 -0
  420. package/oh-my-opencode/src/tools/grep/cli.ts +229 -0
  421. package/oh-my-opencode/src/tools/grep/constants.ts +127 -0
  422. package/oh-my-opencode/src/tools/grep/downloader.test.ts +103 -0
  423. package/oh-my-opencode/src/tools/grep/downloader.ts +145 -0
  424. package/oh-my-opencode/src/tools/grep/index.ts +3 -0
  425. package/oh-my-opencode/src/tools/grep/tools.ts +40 -0
  426. package/oh-my-opencode/src/tools/grep/types.ts +39 -0
  427. package/oh-my-opencode/src/tools/grep/utils.ts +53 -0
  428. package/oh-my-opencode/src/tools/index.ts +72 -0
  429. package/oh-my-opencode/src/tools/interactive-bash/constants.ts +18 -0
  430. package/oh-my-opencode/src/tools/interactive-bash/index.ts +4 -0
  431. package/oh-my-opencode/src/tools/interactive-bash/tools.ts +126 -0
  432. package/oh-my-opencode/src/tools/interactive-bash/utils.ts +71 -0
  433. package/oh-my-opencode/src/tools/look-at/constants.ts +3 -0
  434. package/oh-my-opencode/src/tools/look-at/index.ts +3 -0
  435. package/oh-my-opencode/src/tools/look-at/tools.test.ts +73 -0
  436. package/oh-my-opencode/src/tools/look-at/tools.ts +173 -0
  437. package/oh-my-opencode/src/tools/look-at/types.ts +4 -0
  438. package/oh-my-opencode/src/tools/lsp/client.ts +596 -0
  439. package/oh-my-opencode/src/tools/lsp/config.test.ts +130 -0
  440. package/oh-my-opencode/src/tools/lsp/config.ts +285 -0
  441. package/oh-my-opencode/src/tools/lsp/constants.ts +390 -0
  442. package/oh-my-opencode/src/tools/lsp/index.ts +7 -0
  443. package/oh-my-opencode/src/tools/lsp/tools.ts +261 -0
  444. package/oh-my-opencode/src/tools/lsp/types.ts +124 -0
  445. package/oh-my-opencode/src/tools/lsp/utils.ts +406 -0
  446. package/oh-my-opencode/src/tools/session-manager/constants.ts +97 -0
  447. package/oh-my-opencode/src/tools/session-manager/index.ts +3 -0
  448. package/oh-my-opencode/src/tools/session-manager/storage.test.ts +315 -0
  449. package/oh-my-opencode/src/tools/session-manager/storage.ts +238 -0
  450. package/oh-my-opencode/src/tools/session-manager/tools.test.ts +124 -0
  451. package/oh-my-opencode/src/tools/session-manager/tools.ts +146 -0
  452. package/oh-my-opencode/src/tools/session-manager/types.ts +99 -0
  453. package/oh-my-opencode/src/tools/session-manager/utils.test.ts +160 -0
  454. package/oh-my-opencode/src/tools/session-manager/utils.ts +199 -0
  455. package/oh-my-opencode/src/tools/skill/constants.ts +8 -0
  456. package/oh-my-opencode/src/tools/skill/index.ts +3 -0
  457. package/oh-my-opencode/src/tools/skill/tools.test.ts +239 -0
  458. package/oh-my-opencode/src/tools/skill/tools.ts +200 -0
  459. package/oh-my-opencode/src/tools/skill/types.ts +31 -0
  460. package/oh-my-opencode/src/tools/skill-mcp/constants.ts +3 -0
  461. package/oh-my-opencode/src/tools/skill-mcp/index.ts +3 -0
  462. package/oh-my-opencode/src/tools/skill-mcp/tools.test.ts +215 -0
  463. package/oh-my-opencode/src/tools/skill-mcp/tools.ts +172 -0
  464. package/oh-my-opencode/src/tools/skill-mcp/types.ts +8 -0
  465. package/oh-my-opencode/src/tools/slashcommand/index.ts +2 -0
  466. package/oh-my-opencode/src/tools/slashcommand/tools.ts +252 -0
  467. package/oh-my-opencode/src/tools/slashcommand/types.ts +28 -0
  468. package/oh-my-opencode/test-setup.ts +6 -0
  469. package/oh-my-opencode/tsconfig.json +20 -0
  470. package/package.json +1 -1
  471. package/src/__tests__/git.test.ts +7 -2
  472. package/src/__tests__/manifest.test.ts +5 -5
  473. package/src/agents/repo-explorer.ts +2 -1
  474. package/src/git.ts +18 -3
  475. package/src/manifest.ts +22 -15
@@ -0,0 +1,400 @@
1
+ import type { AgentPromptMetadata, BuiltinAgentName } from "./types"
2
+
3
+ export interface AvailableAgent {
4
+ name: BuiltinAgentName
5
+ description: string
6
+ metadata: AgentPromptMetadata
7
+ }
8
+
9
+ export interface AvailableTool {
10
+ name: string
11
+ category: "lsp" | "ast" | "search" | "session" | "command" | "other"
12
+ }
13
+
14
+ export interface AvailableSkill {
15
+ name: string
16
+ description: string
17
+ location: "user" | "project" | "plugin"
18
+ }
19
+
20
+ export interface AvailableCategory {
21
+ name: string
22
+ description: string
23
+ }
24
+
25
+ export function categorizeTools(toolNames: string[]): AvailableTool[] {
26
+ return toolNames.map((name) => {
27
+ let category: AvailableTool["category"] = "other"
28
+ if (name.startsWith("lsp_")) {
29
+ category = "lsp"
30
+ } else if (name.startsWith("ast_grep")) {
31
+ category = "ast"
32
+ } else if (name === "grep" || name === "glob") {
33
+ category = "search"
34
+ } else if (name.startsWith("session_")) {
35
+ category = "session"
36
+ } else if (name === "slashcommand") {
37
+ category = "command"
38
+ }
39
+ return { name, category }
40
+ })
41
+ }
42
+
43
+ function formatToolsForPrompt(tools: AvailableTool[]): string {
44
+ const lspTools = tools.filter((t) => t.category === "lsp")
45
+ const astTools = tools.filter((t) => t.category === "ast")
46
+ const searchTools = tools.filter((t) => t.category === "search")
47
+
48
+ const parts: string[] = []
49
+
50
+ if (searchTools.length > 0) {
51
+ parts.push(...searchTools.map((t) => `\`${t.name}\``))
52
+ }
53
+
54
+ if (lspTools.length > 0) {
55
+ parts.push("`lsp_*`")
56
+ }
57
+
58
+ if (astTools.length > 0) {
59
+ parts.push("`ast_grep`")
60
+ }
61
+
62
+ return parts.join(", ")
63
+ }
64
+
65
+ export function buildKeyTriggersSection(agents: AvailableAgent[], skills: AvailableSkill[] = []): string {
66
+ const keyTriggers = agents
67
+ .filter((a) => a.metadata.keyTrigger)
68
+ .map((a) => `- ${a.metadata.keyTrigger}`)
69
+
70
+ const skillTriggers = skills
71
+ .filter((s) => s.description)
72
+ .map((s) => `- **Skill \`${s.name}\`**: ${extractTriggerFromDescription(s.description)}`)
73
+
74
+ const allTriggers = [...keyTriggers, ...skillTriggers]
75
+
76
+ if (allTriggers.length === 0) return ""
77
+
78
+ return `### Key Triggers (check BEFORE classification):
79
+
80
+ **BLOCKING: Check skills FIRST before any action.**
81
+ If a skill matches, invoke it IMMEDIATELY via \`skill\` tool.
82
+
83
+ ${allTriggers.join("\n")}
84
+ - **GitHub mention (@mention in issue/PR)** → This is a WORK REQUEST. Plan full cycle: investigate → implement → create PR
85
+ - **"Look into" + "create PR"** → Not just research. Full implementation cycle expected.`
86
+ }
87
+
88
+ function extractTriggerFromDescription(description: string): string {
89
+ const triggerMatch = description.match(/Trigger[s]?[:\s]+([^.]+)/i)
90
+ if (triggerMatch) return triggerMatch[1].trim()
91
+
92
+ const activateMatch = description.match(/Activate when[:\s]+([^.]+)/i)
93
+ if (activateMatch) return activateMatch[1].trim()
94
+
95
+ const useWhenMatch = description.match(/Use (?:this )?when[:\s]+([^.]+)/i)
96
+ if (useWhenMatch) return useWhenMatch[1].trim()
97
+
98
+ return description.split(".")[0] || description
99
+ }
100
+
101
+ export function buildToolSelectionTable(
102
+ agents: AvailableAgent[],
103
+ tools: AvailableTool[] = [],
104
+ skills: AvailableSkill[] = []
105
+ ): string {
106
+ const rows: string[] = [
107
+ "### Tool & Skill Selection:",
108
+ "",
109
+ "**Priority Order**: Skills → Direct Tools → Agents",
110
+ "",
111
+ ]
112
+
113
+ if (skills.length > 0) {
114
+ rows.push("#### Skills (INVOKE FIRST if matching)")
115
+ rows.push("")
116
+ rows.push("| Skill | When to Use |")
117
+ rows.push("|-------|-------------|")
118
+ for (const skill of skills) {
119
+ const shortDesc = extractTriggerFromDescription(skill.description)
120
+ rows.push(`| \`${skill.name}\` | ${shortDesc} |`)
121
+ }
122
+ rows.push("")
123
+ }
124
+
125
+ rows.push("#### Tools & Agents")
126
+ rows.push("")
127
+ rows.push("| Resource | Cost | When to Use |")
128
+ rows.push("|----------|------|-------------|")
129
+
130
+ if (tools.length > 0) {
131
+ const toolsDisplay = formatToolsForPrompt(tools)
132
+ rows.push(`| ${toolsDisplay} | FREE | Not Complex, Scope Clear, No Implicit Assumptions |`)
133
+ }
134
+
135
+ const costOrder = { FREE: 0, CHEAP: 1, EXPENSIVE: 2 }
136
+ const sortedAgents = [...agents]
137
+ .filter((a) => a.metadata.category !== "utility")
138
+ .sort((a, b) => costOrder[a.metadata.cost] - costOrder[b.metadata.cost])
139
+
140
+ for (const agent of sortedAgents) {
141
+ const shortDesc = agent.description.split(".")[0] || agent.description
142
+ rows.push(`| \`${agent.name}\` agent | ${agent.metadata.cost} | ${shortDesc} |`)
143
+ }
144
+
145
+ rows.push("")
146
+ rows.push("**Default flow**: skill (if match) → explore/librarian (background) + tools → oracle (if required)")
147
+
148
+ return rows.join("\n")
149
+ }
150
+
151
+ export function buildExploreSection(agents: AvailableAgent[]): string {
152
+ const exploreAgent = agents.find((a) => a.name === "explore")
153
+ if (!exploreAgent) return ""
154
+
155
+ const useWhen = exploreAgent.metadata.useWhen || []
156
+ const avoidWhen = exploreAgent.metadata.avoidWhen || []
157
+
158
+ return `### Explore Agent = Contextual Grep
159
+
160
+ Use it as a **peer tool**, not a fallback. Fire liberally.
161
+
162
+ | Use Direct Tools | Use Explore Agent |
163
+ |------------------|-------------------|
164
+ ${avoidWhen.map((w) => `| ${w} | |`).join("\n")}
165
+ ${useWhen.map((w) => `| | ${w} |`).join("\n")}`
166
+ }
167
+
168
+ export function buildLibrarianSection(agents: AvailableAgent[]): string {
169
+ const librarianAgent = agents.find((a) => a.name === "librarian")
170
+ if (!librarianAgent) return ""
171
+
172
+ const useWhen = librarianAgent.metadata.useWhen || []
173
+
174
+ return `### Librarian Agent = Reference Grep
175
+
176
+ Search **external references** (docs, OSS, web). Fire proactively when unfamiliar libraries are involved.
177
+
178
+ | Contextual Grep (Internal) | Reference Grep (External) |
179
+ |----------------------------|---------------------------|
180
+ | Search OUR codebase | Search EXTERNAL resources |
181
+ | Find patterns in THIS repo | Find examples in OTHER repos |
182
+ | How does our code work? | How does this library work? |
183
+ | Project-specific logic | Official API documentation |
184
+ | | Library best practices & quirks |
185
+ | | OSS implementation examples |
186
+
187
+ **Trigger phrases** (fire librarian immediately):
188
+ ${useWhen.map((w) => `- "${w}"`).join("\n")}`
189
+ }
190
+
191
+ export function buildDelegationTable(agents: AvailableAgent[]): string {
192
+ const rows: string[] = [
193
+ "### Delegation Table:",
194
+ "",
195
+ "| Domain | Delegate To | Trigger |",
196
+ "|--------|-------------|---------|",
197
+ ]
198
+
199
+ for (const agent of agents) {
200
+ for (const trigger of agent.metadata.triggers) {
201
+ rows.push(`| ${trigger.domain} | \`${agent.name}\` | ${trigger.trigger} |`)
202
+ }
203
+ }
204
+
205
+ return rows.join("\n")
206
+ }
207
+
208
+ export function buildCategorySkillsDelegationGuide(categories: AvailableCategory[], skills: AvailableSkill[]): string {
209
+ if (categories.length === 0 && skills.length === 0) return ""
210
+
211
+ const categoryRows = categories.map((c) => {
212
+ const desc = c.description || c.name
213
+ return `| \`${c.name}\` | ${desc} |`
214
+ })
215
+
216
+ const skillRows = skills.map((s) => {
217
+ const desc = s.description.split(".")[0] || s.description
218
+ return `| \`${s.name}\` | ${desc} |`
219
+ })
220
+
221
+ return `### Category + Skills Delegation System
222
+
223
+ **delegate_task() combines categories and skills for optimal task execution.**
224
+
225
+ #### Available Categories (Domain-Optimized Models)
226
+
227
+ Each category is configured with a model optimized for that domain. Read the description to understand when to use it.
228
+
229
+ | Category | Domain / Best For |
230
+ |----------|-------------------|
231
+ ${categoryRows.join("\n")}
232
+
233
+ #### Available Skills (Domain Expertise Injection)
234
+
235
+ Skills inject specialized instructions into the subagent. Read the description to understand when each skill applies.
236
+
237
+ | Skill | Expertise Domain |
238
+ |-------|------------------|
239
+ ${skillRows.join("\n")}
240
+
241
+ ---
242
+
243
+ ### MANDATORY: Category + Skill Selection Protocol
244
+
245
+ **STEP 1: Select Category**
246
+ - Read each category's description
247
+ - Match task requirements to category domain
248
+ - Select the category whose domain BEST fits the task
249
+
250
+ **STEP 2: Evaluate ALL Skills**
251
+ For EVERY skill listed above, ask yourself:
252
+ > "Does this skill's expertise domain overlap with my task?"
253
+
254
+ - If YES → INCLUDE in \`skills=[...]\`
255
+ - If NO → You MUST justify why (see below)
256
+
257
+ **STEP 3: Justify Omissions**
258
+
259
+ If you choose NOT to include a skill that MIGHT be relevant, you MUST provide:
260
+
261
+ \`\`\`
262
+ SKILL EVALUATION for "[skill-name]":
263
+ - Skill domain: [what the skill description says]
264
+ - Task domain: [what your task is about]
265
+ - Decision: OMIT
266
+ - Reason: [specific explanation of why domains don't overlap]
267
+ \`\`\`
268
+
269
+ **WHY JUSTIFICATION IS MANDATORY:**
270
+ - Forces you to actually READ skill descriptions
271
+ - Prevents lazy omission of potentially useful skills
272
+ - Subagents are STATELESS - they only know what you tell them
273
+ - Missing a relevant skill = suboptimal output
274
+
275
+ ---
276
+
277
+ ### Delegation Pattern
278
+
279
+ \`\`\`typescript
280
+ delegate_task(
281
+ category="[selected-category]",
282
+ skills=["skill-1", "skill-2"], // Include ALL relevant skills
283
+ prompt="..."
284
+ )
285
+ \`\`\`
286
+
287
+ **ANTI-PATTERN (will produce poor results):**
288
+ \`\`\`typescript
289
+ delegate_task(category="...", skills=[], prompt="...") // Empty skills without justification
290
+ \`\`\``
291
+ }
292
+
293
+ export function buildOracleSection(agents: AvailableAgent[]): string {
294
+ const oracleAgent = agents.find((a) => a.name === "oracle")
295
+ if (!oracleAgent) return ""
296
+
297
+ const useWhen = oracleAgent.metadata.useWhen || []
298
+ const avoidWhen = oracleAgent.metadata.avoidWhen || []
299
+
300
+ return `<Oracle_Usage>
301
+ ## Oracle — Read-Only High-IQ Consultant
302
+
303
+ Oracle is a read-only, expensive, high-quality reasoning model for debugging and architecture. Consultation only.
304
+
305
+ ### WHEN to Consult:
306
+
307
+ | Trigger | Action |
308
+ |---------|--------|
309
+ ${useWhen.map((w) => `| ${w} | Oracle FIRST, then implement |`).join("\n")}
310
+
311
+ ### WHEN NOT to Consult:
312
+
313
+ ${avoidWhen.map((w) => `- ${w}`).join("\n")}
314
+
315
+ ### Usage Pattern:
316
+ Briefly announce "Consulting Oracle for [reason]" before invocation.
317
+
318
+ **Exception**: This is the ONLY case where you announce before acting. For all other work, start immediately without status updates.
319
+ </Oracle_Usage>`
320
+ }
321
+
322
+ export function buildHardBlocksSection(): string {
323
+ const blocks = [
324
+ "| Type error suppression (`as any`, `@ts-ignore`) | Never |",
325
+ "| Commit without explicit request | Never |",
326
+ "| Speculate about unread code | Never |",
327
+ "| Leave code in broken state after failures | Never |",
328
+ "| Delegate without evaluating available skills | Never - MUST justify skill omissions |",
329
+ ]
330
+
331
+ return `## Hard Blocks (NEVER violate)
332
+
333
+ | Constraint | No Exceptions |
334
+ |------------|---------------|
335
+ ${blocks.join("\n")}`
336
+ }
337
+
338
+ export function buildAntiPatternsSection(): string {
339
+ const patterns = [
340
+ "| **Type Safety** | `as any`, `@ts-ignore`, `@ts-expect-error` |",
341
+ "| **Error Handling** | Empty catch blocks `catch(e) {}` |",
342
+ "| **Testing** | Deleting failing tests to \"pass\" |",
343
+ "| **Search** | Firing agents for single-line typos or obvious syntax errors |",
344
+ "| **Delegation** | Using `skills=[]` without justifying why no skills apply |",
345
+ "| **Debugging** | Shotgun debugging, random changes |",
346
+ ]
347
+
348
+ return `## Anti-Patterns (BLOCKING violations)
349
+
350
+ | Category | Forbidden |
351
+ |----------|-----------|
352
+ ${patterns.join("\n")}`
353
+ }
354
+
355
+ export function buildUltraworkSection(
356
+ agents: AvailableAgent[],
357
+ categories: AvailableCategory[],
358
+ skills: AvailableSkill[]
359
+ ): string {
360
+ const lines: string[] = []
361
+
362
+ if (categories.length > 0) {
363
+ lines.push("**Categories** (for implementation tasks):")
364
+ for (const cat of categories) {
365
+ const shortDesc = cat.description || cat.name
366
+ lines.push(`- \`${cat.name}\`: ${shortDesc}`)
367
+ }
368
+ lines.push("")
369
+ }
370
+
371
+ if (skills.length > 0) {
372
+ lines.push("**Skills** (combine with categories - EVALUATE ALL for relevance):")
373
+ for (const skill of skills) {
374
+ const shortDesc = skill.description.split(".")[0] || skill.description
375
+ lines.push(`- \`${skill.name}\`: ${shortDesc}`)
376
+ }
377
+ lines.push("")
378
+ }
379
+
380
+ if (agents.length > 0) {
381
+ const ultraworkAgentPriority = ["explore", "librarian", "plan", "oracle"]
382
+ const sortedAgents = [...agents].sort((a, b) => {
383
+ const aIdx = ultraworkAgentPriority.indexOf(a.name)
384
+ const bIdx = ultraworkAgentPriority.indexOf(b.name)
385
+ if (aIdx === -1 && bIdx === -1) return 0
386
+ if (aIdx === -1) return 1
387
+ if (bIdx === -1) return -1
388
+ return aIdx - bIdx
389
+ })
390
+
391
+ lines.push("**Agents** (for specialized consultation/exploration):")
392
+ for (const agent of sortedAgents) {
393
+ const shortDesc = agent.description.split(".")[0] || agent.description
394
+ const suffix = agent.name === "explore" || agent.name === "librarian" ? " (multiple)" : ""
395
+ lines.push(`- \`${agent.name}${suffix}\`: ${shortDesc}`)
396
+ }
397
+ }
398
+
399
+ return lines.join("\n")
400
+ }
@@ -0,0 +1,122 @@
1
+ import type { AgentConfig } from "@opencode-ai/sdk"
2
+ import type { AgentPromptMetadata } from "./types"
3
+ import { createAgentToolRestrictions } from "../shared/permission-compat"
4
+
5
+ export const EXPLORE_PROMPT_METADATA: AgentPromptMetadata = {
6
+ category: "exploration",
7
+ cost: "FREE",
8
+ promptAlias: "Explore",
9
+ keyTrigger: "2+ modules involved → fire `explore` background",
10
+ triggers: [
11
+ { domain: "Explore", trigger: "Find existing codebase structure, patterns and styles" },
12
+ ],
13
+ useWhen: [
14
+ "Multiple search angles needed",
15
+ "Unfamiliar module structure",
16
+ "Cross-layer pattern discovery",
17
+ ],
18
+ avoidWhen: [
19
+ "You know exactly what to search",
20
+ "Single keyword/pattern suffices",
21
+ "Known file location",
22
+ ],
23
+ }
24
+
25
+ export function createExploreAgent(model: string): AgentConfig {
26
+ const restrictions = createAgentToolRestrictions([
27
+ "write",
28
+ "edit",
29
+ "task",
30
+ "delegate_task",
31
+ "call_omo_agent",
32
+ ])
33
+
34
+ return {
35
+ description:
36
+ 'Contextual grep for codebases. Answers "Where is X?", "Which file has Y?", "Find the code that does Z". Fire multiple in parallel for broad searches. Specify thoroughness: "quick" for basic, "medium" for moderate, "very thorough" for comprehensive analysis.',
37
+ mode: "subagent" as const,
38
+ model,
39
+ temperature: 0.1,
40
+ ...restrictions,
41
+ prompt: `You are a codebase search specialist. Your job: find files and code, return actionable results.
42
+
43
+ ## Your Mission
44
+
45
+ Answer questions like:
46
+ - "Where is X implemented?"
47
+ - "Which files contain Y?"
48
+ - "Find the code that does Z"
49
+
50
+ ## CRITICAL: What You Must Deliver
51
+
52
+ Every response MUST include:
53
+
54
+ ### 1. Intent Analysis (Required)
55
+ Before ANY search, wrap your analysis in <analysis> tags:
56
+
57
+ <analysis>
58
+ **Literal Request**: [What they literally asked]
59
+ **Actual Need**: [What they're really trying to accomplish]
60
+ **Success Looks Like**: [What result would let them proceed immediately]
61
+ </analysis>
62
+
63
+ ### 2. Parallel Execution (Required)
64
+ Launch **3+ tools simultaneously** in your first action. Never sequential unless output depends on prior result.
65
+
66
+ ### 3. Structured Results (Required)
67
+ Always end with this exact format:
68
+
69
+ <results>
70
+ <files>
71
+ - /absolute/path/to/file1.ts — [why this file is relevant]
72
+ - /absolute/path/to/file2.ts — [why this file is relevant]
73
+ </files>
74
+
75
+ <answer>
76
+ [Direct answer to their actual need, not just file list]
77
+ [If they asked "where is auth?", explain the auth flow you found]
78
+ </answer>
79
+
80
+ <next_steps>
81
+ [What they should do with this information]
82
+ [Or: "Ready to proceed - no follow-up needed"]
83
+ </next_steps>
84
+ </results>
85
+
86
+ ## Success Criteria
87
+
88
+ | Criterion | Requirement |
89
+ |-----------|-------------|
90
+ | **Paths** | ALL paths must be **absolute** (start with /) |
91
+ | **Completeness** | Find ALL relevant matches, not just the first one |
92
+ | **Actionability** | Caller can proceed **without asking follow-up questions** |
93
+ | **Intent** | Address their **actual need**, not just literal request |
94
+
95
+ ## Failure Conditions
96
+
97
+ Your response has **FAILED** if:
98
+ - Any path is relative (not absolute)
99
+ - You missed obvious matches in the codebase
100
+ - Caller needs to ask "but where exactly?" or "what about X?"
101
+ - You only answered the literal question, not the underlying need
102
+ - No <results> block with structured output
103
+
104
+ ## Constraints
105
+
106
+ - **Read-only**: You cannot create, modify, or delete files
107
+ - **No emojis**: Keep output clean and parseable
108
+ - **No file creation**: Report findings as message text, never write files
109
+
110
+ ## Tool Strategy
111
+
112
+ Use the right tool for the job:
113
+ - **Semantic search** (definitions, references): LSP tools
114
+ - **Structural patterns** (function shapes, class structures): ast_grep_search
115
+ - **Text patterns** (strings, comments, logs): grep
116
+ - **File patterns** (find by name/extension): glob
117
+ - **History/evolution** (when added, who changed): git commands
118
+
119
+ Flood with parallel calls. Cross-validate findings across multiple tools.`,
120
+ }
121
+ }
122
+
@@ -0,0 +1,13 @@
1
+ export * from "./types"
2
+ export { createBuiltinAgents } from "./utils"
3
+ export type { AvailableAgent, AvailableCategory, AvailableSkill } from "./dynamic-agent-prompt-builder"
4
+ export { createSisyphusAgent } from "./sisyphus"
5
+ export { createOracleAgent, ORACLE_PROMPT_METADATA } from "./oracle"
6
+ export { createLibrarianAgent, LIBRARIAN_PROMPT_METADATA } from "./librarian"
7
+ export { createExploreAgent, EXPLORE_PROMPT_METADATA } from "./explore"
8
+
9
+
10
+ export { createMultimodalLookerAgent, MULTIMODAL_LOOKER_PROMPT_METADATA } from "./multimodal-looker"
11
+ export { createMetisAgent, METIS_SYSTEM_PROMPT, metisPromptMetadata } from "./metis"
12
+ export { createMomusAgent, MOMUS_SYSTEM_PROMPT, momusPromptMetadata } from "./momus"
13
+ export { createAtlasAgent, atlasPromptMetadata } from "./atlas"