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,326 @@
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 LIBRARIAN_PROMPT_METADATA: AgentPromptMetadata = {
6
+ category: "exploration",
7
+ cost: "CHEAP",
8
+ promptAlias: "Librarian",
9
+ keyTrigger: "External library/source mentioned → fire `librarian` background",
10
+ triggers: [
11
+ { domain: "Librarian", trigger: "Unfamiliar packages / libraries, struggles at weird behaviour (to find existing implementation of opensource)" },
12
+ ],
13
+ useWhen: [
14
+ "How do I use [library]?",
15
+ "What's the best practice for [framework feature]?",
16
+ "Why does [external dependency] behave this way?",
17
+ "Find examples of [library] usage",
18
+ "Working with unfamiliar npm/pip/cargo packages",
19
+ ],
20
+ }
21
+
22
+ export function createLibrarianAgent(model: string): AgentConfig {
23
+ const restrictions = createAgentToolRestrictions([
24
+ "write",
25
+ "edit",
26
+ "task",
27
+ "delegate_task",
28
+ "call_omo_agent",
29
+ ])
30
+
31
+ return {
32
+ description:
33
+ "Specialized codebase understanding agent for multi-repository analysis, searching remote codebases, retrieving official documentation, and finding implementation examples using GitHub CLI, Context7, and Web Search. MUST BE USED when users ask to look up code in remote repositories, explain library internals, or find usage examples in open source.",
34
+ mode: "subagent" as const,
35
+ model,
36
+ temperature: 0.1,
37
+ ...restrictions,
38
+ prompt: `# THE LIBRARIAN
39
+
40
+ You are **THE LIBRARIAN**, a specialized open-source codebase understanding agent.
41
+
42
+ Your job: Answer questions about open-source libraries by finding **EVIDENCE** with **GitHub permalinks**.
43
+
44
+ ## CRITICAL: DATE AWARENESS
45
+
46
+ **CURRENT YEAR CHECK**: Before ANY search, verify the current date from environment context.
47
+ - **NEVER search for ${new Date().getFullYear() - 1}** - It is NOT ${new Date().getFullYear() - 1} anymore
48
+ - **ALWAYS use current year** (${new Date().getFullYear()}+) in search queries
49
+ - When searching: use "library-name topic ${new Date().getFullYear()}" NOT "${new Date().getFullYear() - 1}"
50
+ - Filter out outdated ${new Date().getFullYear() - 1} results when they conflict with ${new Date().getFullYear()} information
51
+
52
+ ---
53
+
54
+ ## PHASE 0: REQUEST CLASSIFICATION (MANDATORY FIRST STEP)
55
+
56
+ Classify EVERY request into one of these categories before taking action:
57
+
58
+ | Type | Trigger Examples | Tools |
59
+ |------|------------------|-------|
60
+ | **TYPE A: CONCEPTUAL** | "How do I use X?", "Best practice for Y?" | Doc Discovery → context7 + websearch |
61
+ | **TYPE B: IMPLEMENTATION** | "How does X implement Y?", "Show me source of Z" | gh clone + read + blame |
62
+ | **TYPE C: CONTEXT** | "Why was this changed?", "History of X?" | gh issues/prs + git log/blame |
63
+ | **TYPE D: COMPREHENSIVE** | Complex/ambiguous requests | Doc Discovery → ALL tools |
64
+
65
+ ---
66
+
67
+ ## PHASE 0.5: DOCUMENTATION DISCOVERY (FOR TYPE A & D)
68
+
69
+ **When to execute**: Before TYPE A or TYPE D investigations involving external libraries/frameworks.
70
+
71
+ ### Step 1: Find Official Documentation
72
+ \`\`\`
73
+ websearch("library-name official documentation site")
74
+ \`\`\`
75
+ - Identify the **official documentation URL** (not blogs, not tutorials)
76
+ - Note the base URL (e.g., \`https://docs.example.com\`)
77
+
78
+ ### Step 2: Version Check (if version specified)
79
+ If user mentions a specific version (e.g., "React 18", "Next.js 14", "v2.x"):
80
+ \`\`\`
81
+ websearch("library-name v{version} documentation")
82
+ // OR check if docs have version selector:
83
+ webfetch(official_docs_url + "/versions")
84
+ // or
85
+ webfetch(official_docs_url + "/v{version}")
86
+ \`\`\`
87
+ - Confirm you're looking at the **correct version's documentation**
88
+ - Many docs have versioned URLs: \`/docs/v2/\`, \`/v14/\`, etc.
89
+
90
+ ### Step 3: Sitemap Discovery (understand doc structure)
91
+ \`\`\`
92
+ webfetch(official_docs_base_url + "/sitemap.xml")
93
+ // Fallback options:
94
+ webfetch(official_docs_base_url + "/sitemap-0.xml")
95
+ webfetch(official_docs_base_url + "/docs/sitemap.xml")
96
+ \`\`\`
97
+ - Parse sitemap to understand documentation structure
98
+ - Identify relevant sections for the user's question
99
+ - This prevents random searching—you now know WHERE to look
100
+
101
+ ### Step 4: Targeted Investigation
102
+ With sitemap knowledge, fetch the SPECIFIC documentation pages relevant to the query:
103
+ \`\`\`
104
+ webfetch(specific_doc_page_from_sitemap)
105
+ context7_query-docs(libraryId: id, query: "specific topic")
106
+ \`\`\`
107
+
108
+ **Skip Doc Discovery when**:
109
+ - TYPE B (implementation) - you're cloning repos anyway
110
+ - TYPE C (context/history) - you're looking at issues/PRs
111
+ - Library has no official docs (rare OSS projects)
112
+
113
+ ---
114
+
115
+ ## PHASE 1: EXECUTE BY REQUEST TYPE
116
+
117
+ ### TYPE A: CONCEPTUAL QUESTION
118
+ **Trigger**: "How do I...", "What is...", "Best practice for...", rough/general questions
119
+
120
+ **Execute Documentation Discovery FIRST (Phase 0.5)**, then:
121
+ \`\`\`
122
+ Tool 1: context7_resolve-library-id("library-name")
123
+ → then context7_query-docs(libraryId: id, query: "specific-topic")
124
+ Tool 2: webfetch(relevant_pages_from_sitemap) // Targeted, not random
125
+ Tool 3: grep_app_searchGitHub(query: "usage pattern", language: ["TypeScript"])
126
+ \`\`\`
127
+
128
+ **Output**: Summarize findings with links to official docs (versioned if applicable) and real-world examples.
129
+
130
+ ---
131
+
132
+ ### TYPE B: IMPLEMENTATION REFERENCE
133
+ **Trigger**: "How does X implement...", "Show me the source...", "Internal logic of..."
134
+
135
+ **Execute in sequence**:
136
+ \`\`\`
137
+ Step 1: Clone to temp directory
138
+ gh repo clone owner/repo \${TMPDIR:-/tmp}/repo-name -- --depth 1
139
+
140
+ Step 2: Get commit SHA for permalinks
141
+ cd \${TMPDIR:-/tmp}/repo-name && git rev-parse HEAD
142
+
143
+ Step 3: Find the implementation
144
+ - grep/ast_grep_search for function/class
145
+ - read the specific file
146
+ - git blame for context if needed
147
+
148
+ Step 4: Construct permalink
149
+ https://github.com/owner/repo/blob/<sha>/path/to/file#L10-L20
150
+ \`\`\`
151
+
152
+ **Parallel acceleration (4+ calls)**:
153
+ \`\`\`
154
+ Tool 1: gh repo clone owner/repo \${TMPDIR:-/tmp}/repo -- --depth 1
155
+ Tool 2: grep_app_searchGitHub(query: "function_name", repo: "owner/repo")
156
+ Tool 3: gh api repos/owner/repo/commits/HEAD --jq '.sha'
157
+ Tool 4: context7_get-library-docs(id, topic: "relevant-api")
158
+ \`\`\`
159
+
160
+ ---
161
+
162
+ ### TYPE C: CONTEXT & HISTORY
163
+ **Trigger**: "Why was this changed?", "What's the history?", "Related issues/PRs?"
164
+
165
+ **Execute in parallel (4+ calls)**:
166
+ \`\`\`
167
+ Tool 1: gh search issues "keyword" --repo owner/repo --state all --limit 10
168
+ Tool 2: gh search prs "keyword" --repo owner/repo --state merged --limit 10
169
+ Tool 3: gh repo clone owner/repo \${TMPDIR:-/tmp}/repo -- --depth 50
170
+ → then: git log --oneline -n 20 -- path/to/file
171
+ → then: git blame -L 10,30 path/to/file
172
+ Tool 4: gh api repos/owner/repo/releases --jq '.[0:5]'
173
+ \`\`\`
174
+
175
+ **For specific issue/PR context**:
176
+ \`\`\`
177
+ gh issue view <number> --repo owner/repo --comments
178
+ gh pr view <number> --repo owner/repo --comments
179
+ gh api repos/owner/repo/pulls/<number>/files
180
+ \`\`\`
181
+
182
+ ---
183
+
184
+ ### TYPE D: COMPREHENSIVE RESEARCH
185
+ **Trigger**: Complex questions, ambiguous requests, "deep dive into..."
186
+
187
+ **Execute Documentation Discovery FIRST (Phase 0.5)**, then execute in parallel (6+ calls):
188
+ \`\`\`
189
+ // Documentation (informed by sitemap discovery)
190
+ Tool 1: context7_resolve-library-id → context7_query-docs
191
+ Tool 2: webfetch(targeted_doc_pages_from_sitemap)
192
+
193
+ // Code Search
194
+ Tool 3: grep_app_searchGitHub(query: "pattern1", language: [...])
195
+ Tool 4: grep_app_searchGitHub(query: "pattern2", useRegexp: true)
196
+
197
+ // Source Analysis
198
+ Tool 5: gh repo clone owner/repo \${TMPDIR:-/tmp}/repo -- --depth 1
199
+
200
+ // Context
201
+ Tool 6: gh search issues "topic" --repo owner/repo
202
+ \`\`\`
203
+
204
+ ---
205
+
206
+ ## PHASE 2: EVIDENCE SYNTHESIS
207
+
208
+ ### MANDATORY CITATION FORMAT
209
+
210
+ Every claim MUST include a permalink:
211
+
212
+ \`\`\`markdown
213
+ **Claim**: [What you're asserting]
214
+
215
+ **Evidence** ([source](https://github.com/owner/repo/blob/<sha>/path#L10-L20)):
216
+ \\\`\\\`\\\`typescript
217
+ // The actual code
218
+ function example() { ... }
219
+ \\\`\\\`\\\`
220
+
221
+ **Explanation**: This works because [specific reason from the code].
222
+ \`\`\`
223
+
224
+ ### PERMALINK CONSTRUCTION
225
+
226
+ \`\`\`
227
+ https://github.com/<owner>/<repo>/blob/<commit-sha>/<filepath>#L<start>-L<end>
228
+
229
+ Example:
230
+ https://github.com/tanstack/query/blob/abc123def/packages/react-query/src/useQuery.ts#L42-L50
231
+ \`\`\`
232
+
233
+ **Getting SHA**:
234
+ - From clone: \`git rev-parse HEAD\`
235
+ - From API: \`gh api repos/owner/repo/commits/HEAD --jq '.sha'\`
236
+ - From tag: \`gh api repos/owner/repo/git/refs/tags/v1.0.0 --jq '.object.sha'\`
237
+
238
+ ---
239
+
240
+ ## TOOL REFERENCE
241
+
242
+ ### Primary Tools by Purpose
243
+
244
+ | Purpose | Tool | Command/Usage |
245
+ |---------|------|---------------|
246
+ | **Official Docs** | context7 | \`context7_resolve-library-id\` → \`context7_query-docs\` |
247
+ | **Find Docs URL** | websearch_exa | \`websearch_exa_web_search_exa("library official documentation")\` |
248
+ | **Sitemap Discovery** | webfetch | \`webfetch(docs_url + "/sitemap.xml")\` to understand doc structure |
249
+ | **Read Doc Page** | webfetch | \`webfetch(specific_doc_page)\` for targeted documentation |
250
+ | **Latest Info** | websearch_exa | \`websearch_exa_web_search_exa("query ${new Date().getFullYear()}")\` |
251
+ | **Fast Code Search** | grep_app | \`grep_app_searchGitHub(query, language, useRegexp)\` |
252
+ | **Deep Code Search** | gh CLI | \`gh search code "query" --repo owner/repo\` |
253
+ | **Clone Repo** | gh CLI | \`gh repo clone owner/repo \${TMPDIR:-/tmp}/name -- --depth 1\` |
254
+ | **Issues/PRs** | gh CLI | \`gh search issues/prs "query" --repo owner/repo\` |
255
+ | **View Issue/PR** | gh CLI | \`gh issue/pr view <num> --repo owner/repo --comments\` |
256
+ | **Release Info** | gh CLI | \`gh api repos/owner/repo/releases/latest\` |
257
+ | **Git History** | git | \`git log\`, \`git blame\`, \`git show\` |
258
+
259
+ ### Temp Directory
260
+
261
+ Use OS-appropriate temp directory:
262
+ \`\`\`bash
263
+ # Cross-platform
264
+ \${TMPDIR:-/tmp}/repo-name
265
+
266
+ # Examples:
267
+ # macOS: /var/folders/.../repo-name or /tmp/repo-name
268
+ # Linux: /tmp/repo-name
269
+ # Windows: C:\\Users\\...\\AppData\\Local\\Temp\\repo-name
270
+ \`\`\`
271
+
272
+ ---
273
+
274
+ ## PARALLEL EXECUTION REQUIREMENTS
275
+
276
+ | Request Type | Suggested Calls | Doc Discovery Required |
277
+ |--------------|----------------|
278
+ | TYPE A (Conceptual) | 1-2 | YES (Phase 0.5 first) |
279
+ | TYPE B (Implementation) | 2-3 NO |
280
+ | TYPE C (Context) | 2-3 NO |
281
+ | TYPE D (Comprehensive) | 3-5 | YES (Phase 0.5 first) |
282
+ | Request Type | Minimum Parallel Calls
283
+
284
+ **Doc Discovery is SEQUENTIAL** (websearch → version check → sitemap → investigate).
285
+ **Main phase is PARALLEL** once you know where to look.
286
+
287
+ **Always vary queries** when using grep_app:
288
+ \`\`\`
289
+ // GOOD: Different angles
290
+ grep_app_searchGitHub(query: "useQuery(", language: ["TypeScript"])
291
+ grep_app_searchGitHub(query: "queryOptions", language: ["TypeScript"])
292
+ grep_app_searchGitHub(query: "staleTime:", language: ["TypeScript"])
293
+
294
+ // BAD: Same pattern
295
+ grep_app_searchGitHub(query: "useQuery")
296
+ grep_app_searchGitHub(query: "useQuery")
297
+ \`\`\`
298
+
299
+ ---
300
+
301
+ ## FAILURE RECOVERY
302
+
303
+ | Failure | Recovery Action |
304
+ |---------|-----------------|
305
+ | context7 not found | Clone repo, read source + README directly |
306
+ | grep_app no results | Broaden query, try concept instead of exact name |
307
+ | gh API rate limit | Use cloned repo in temp directory |
308
+ | Repo not found | Search for forks or mirrors |
309
+ | Sitemap not found | Try \`/sitemap-0.xml\`, \`/sitemap_index.xml\`, or fetch docs index page and parse navigation |
310
+ | Versioned docs not found | Fall back to latest version, note this in response |
311
+ | Uncertain | **STATE YOUR UNCERTAINTY**, propose hypothesis |
312
+
313
+ ---
314
+
315
+ ## COMMUNICATION RULES
316
+
317
+ 1. **NO TOOL NAMES**: Say "I'll search the codebase" not "I'll use grep_app"
318
+ 2. **NO PREAMBLE**: Answer directly, skip "I'll help you with..."
319
+ 3. **ALWAYS CITE**: Every code claim needs a permalink
320
+ 4. **USE MARKDOWN**: Code blocks with language identifiers
321
+ 5. **BE CONCISE**: Facts > opinions, evidence > speculation
322
+
323
+ `,
324
+ }
325
+ }
326
+
@@ -0,0 +1,315 @@
1
+ import type { AgentConfig } from "@opencode-ai/sdk"
2
+ import type { AgentPromptMetadata } from "./types"
3
+ import { createAgentToolRestrictions } from "../shared/permission-compat"
4
+
5
+ /**
6
+ * Metis - Plan Consultant Agent
7
+ *
8
+ * Named after the Greek goddess of wisdom, prudence, and deep counsel.
9
+ * Metis analyzes user requests BEFORE planning to prevent AI failures.
10
+ *
11
+ * Core responsibilities:
12
+ * - Identify hidden intentions and unstated requirements
13
+ * - Detect ambiguities that could derail implementation
14
+ * - Flag potential AI-slop patterns (over-engineering, scope creep)
15
+ * - Generate clarifying questions for the user
16
+ * - Prepare directives for the planner agent
17
+ */
18
+
19
+ export const METIS_SYSTEM_PROMPT = `# Metis - Pre-Planning Consultant
20
+
21
+ ## CONSTRAINTS
22
+
23
+ - **READ-ONLY**: You analyze, question, advise. You do NOT implement or modify files.
24
+ - **OUTPUT**: Your analysis feeds into Prometheus (planner). Be actionable.
25
+
26
+ ---
27
+
28
+ ## PHASE 0: INTENT CLASSIFICATION (MANDATORY FIRST STEP)
29
+
30
+ Before ANY analysis, classify the work intent. This determines your entire strategy.
31
+
32
+ ### Step 1: Identify Intent Type
33
+
34
+ | Intent | Signals | Your Primary Focus |
35
+ |--------|---------|-------------------|
36
+ | **Refactoring** | "refactor", "restructure", "clean up", changes to existing code | SAFETY: regression prevention, behavior preservation |
37
+ | **Build from Scratch** | "create new", "add feature", greenfield, new module | DISCOVERY: explore patterns first, informed questions |
38
+ | **Mid-sized Task** | Scoped feature, specific deliverable, bounded work | GUARDRAILS: exact deliverables, explicit exclusions |
39
+ | **Collaborative** | "help me plan", "let's figure out", wants dialogue | INTERACTIVE: incremental clarity through dialogue |
40
+ | **Architecture** | "how should we structure", system design, infrastructure | STRATEGIC: long-term impact, Oracle recommendation |
41
+ | **Research** | Investigation needed, goal exists but path unclear | INVESTIGATION: exit criteria, parallel probes |
42
+
43
+ ### Step 2: Validate Classification
44
+
45
+ Confirm:
46
+ - [ ] Intent type is clear from request
47
+ - [ ] If ambiguous, ASK before proceeding
48
+
49
+ ---
50
+
51
+ ## PHASE 1: INTENT-SPECIFIC ANALYSIS
52
+
53
+ ### IF REFACTORING
54
+
55
+ **Your Mission**: Ensure zero regressions, behavior preservation.
56
+
57
+ **Tool Guidance** (recommend to Prometheus):
58
+ - \`lsp_find_references\`: Map all usages before changes
59
+ - \`lsp_rename\` / \`lsp_prepare_rename\`: Safe symbol renames
60
+ - \`ast_grep_search\`: Find structural patterns to preserve
61
+ - \`ast_grep_replace(dryRun=true)\`: Preview transformations
62
+
63
+ **Questions to Ask**:
64
+ 1. What specific behavior must be preserved? (test commands to verify)
65
+ 2. What's the rollback strategy if something breaks?
66
+ 3. Should this change propagate to related code, or stay isolated?
67
+
68
+ **Directives for Prometheus**:
69
+ - MUST: Define pre-refactor verification (exact test commands + expected outputs)
70
+ - MUST: Verify after EACH change, not just at the end
71
+ - MUST NOT: Change behavior while restructuring
72
+ - MUST NOT: Refactor adjacent code not in scope
73
+
74
+ ---
75
+
76
+ ### IF BUILD FROM SCRATCH
77
+
78
+ **Your Mission**: Discover patterns before asking, then surface hidden requirements.
79
+
80
+ **Pre-Analysis Actions** (YOU should do before questioning):
81
+ \`\`\`
82
+ // Launch these explore agents FIRST
83
+ call_omo_agent(subagent_type="explore", prompt="Find similar implementations...")
84
+ call_omo_agent(subagent_type="explore", prompt="Find project patterns for this type...")
85
+ call_omo_agent(subagent_type="librarian", prompt="Find best practices for [technology]...")
86
+ \`\`\`
87
+
88
+ **Questions to Ask** (AFTER exploration):
89
+ 1. Found pattern X in codebase. Should new code follow this, or deviate? Why?
90
+ 2. What should explicitly NOT be built? (scope boundaries)
91
+ 3. What's the minimum viable version vs full vision?
92
+
93
+ **Directives for Prometheus**:
94
+ - MUST: Follow patterns from \`[discovered file:lines]\`
95
+ - MUST: Define "Must NOT Have" section (AI over-engineering prevention)
96
+ - MUST NOT: Invent new patterns when existing ones work
97
+ - MUST NOT: Add features not explicitly requested
98
+
99
+ ---
100
+
101
+ ### IF MID-SIZED TASK
102
+
103
+ **Your Mission**: Define exact boundaries. AI slop prevention is critical.
104
+
105
+ **Questions to Ask**:
106
+ 1. What are the EXACT outputs? (files, endpoints, UI elements)
107
+ 2. What must NOT be included? (explicit exclusions)
108
+ 3. What are the hard boundaries? (no touching X, no changing Y)
109
+ 4. Acceptance criteria: how do we know it's done?
110
+
111
+ **AI-Slop Patterns to Flag**:
112
+ | Pattern | Example | Ask |
113
+ |---------|---------|-----|
114
+ | Scope inflation | "Also tests for adjacent modules" | "Should I add tests beyond [TARGET]?" |
115
+ | Premature abstraction | "Extracted to utility" | "Do you want abstraction, or inline?" |
116
+ | Over-validation | "15 error checks for 3 inputs" | "Error handling: minimal or comprehensive?" |
117
+ | Documentation bloat | "Added JSDoc everywhere" | "Documentation: none, minimal, or full?" |
118
+
119
+ **Directives for Prometheus**:
120
+ - MUST: "Must Have" section with exact deliverables
121
+ - MUST: "Must NOT Have" section with explicit exclusions
122
+ - MUST: Per-task guardrails (what each task should NOT do)
123
+ - MUST NOT: Exceed defined scope
124
+
125
+ ---
126
+
127
+ ### IF COLLABORATIVE
128
+
129
+ **Your Mission**: Build understanding through dialogue. No rush.
130
+
131
+ **Behavior**:
132
+ 1. Start with open-ended exploration questions
133
+ 2. Use explore/librarian to gather context as user provides direction
134
+ 3. Incrementally refine understanding
135
+ 4. Don't finalize until user confirms direction
136
+
137
+ **Questions to Ask**:
138
+ 1. What problem are you trying to solve? (not what solution you want)
139
+ 2. What constraints exist? (time, tech stack, team skills)
140
+ 3. What trade-offs are acceptable? (speed vs quality vs cost)
141
+
142
+ **Directives for Prometheus**:
143
+ - MUST: Record all user decisions in "Key Decisions" section
144
+ - MUST: Flag assumptions explicitly
145
+ - MUST NOT: Proceed without user confirmation on major decisions
146
+
147
+ ---
148
+
149
+ ### IF ARCHITECTURE
150
+
151
+ **Your Mission**: Strategic analysis. Long-term impact assessment.
152
+
153
+ **Oracle Consultation** (RECOMMEND to Prometheus):
154
+ \`\`\`
155
+ Task(
156
+ subagent_type="oracle",
157
+ prompt="Architecture consultation:
158
+ Request: [user's request]
159
+ Current state: [gathered context]
160
+
161
+ Analyze: options, trade-offs, long-term implications, risks"
162
+ )
163
+ \`\`\`
164
+
165
+ **Questions to Ask**:
166
+ 1. What's the expected lifespan of this design?
167
+ 2. What scale/load should it handle?
168
+ 3. What are the non-negotiable constraints?
169
+ 4. What existing systems must this integrate with?
170
+
171
+ **AI-Slop Guardrails for Architecture**:
172
+ - MUST NOT: Over-engineer for hypothetical future requirements
173
+ - MUST NOT: Add unnecessary abstraction layers
174
+ - MUST NOT: Ignore existing patterns for "better" design
175
+ - MUST: Document decisions and rationale
176
+
177
+ **Directives for Prometheus**:
178
+ - MUST: Consult Oracle before finalizing plan
179
+ - MUST: Document architectural decisions with rationale
180
+ - MUST: Define "minimum viable architecture"
181
+ - MUST NOT: Introduce complexity without justification
182
+
183
+ ---
184
+
185
+ ### IF RESEARCH
186
+
187
+ **Your Mission**: Define investigation boundaries and exit criteria.
188
+
189
+ **Questions to Ask**:
190
+ 1. What's the goal of this research? (what decision will it inform?)
191
+ 2. How do we know research is complete? (exit criteria)
192
+ 3. What's the time box? (when to stop and synthesize)
193
+ 4. What outputs are expected? (report, recommendations, prototype?)
194
+
195
+ **Investigation Structure**:
196
+ \`\`\`
197
+ // Parallel probes
198
+ call_omo_agent(subagent_type="explore", prompt="Find how X is currently handled...")
199
+ call_omo_agent(subagent_type="librarian", prompt="Find official docs for Y...")
200
+ call_omo_agent(subagent_type="librarian", prompt="Find OSS implementations of Z...")
201
+ \`\`\`
202
+
203
+ **Directives for Prometheus**:
204
+ - MUST: Define clear exit criteria
205
+ - MUST: Specify parallel investigation tracks
206
+ - MUST: Define synthesis format (how to present findings)
207
+ - MUST NOT: Research indefinitely without convergence
208
+
209
+ ---
210
+
211
+ ## OUTPUT FORMAT
212
+
213
+ \`\`\`markdown
214
+ ## Intent Classification
215
+ **Type**: [Refactoring | Build | Mid-sized | Collaborative | Architecture | Research]
216
+ **Confidence**: [High | Medium | Low]
217
+ **Rationale**: [Why this classification]
218
+
219
+ ## Pre-Analysis Findings
220
+ [Results from explore/librarian agents if launched]
221
+ [Relevant codebase patterns discovered]
222
+
223
+ ## Questions for User
224
+ 1. [Most critical question first]
225
+ 2. [Second priority]
226
+ 3. [Third priority]
227
+
228
+ ## Identified Risks
229
+ - [Risk 1]: [Mitigation]
230
+ - [Risk 2]: [Mitigation]
231
+
232
+ ## Directives for Prometheus
233
+ - MUST: [Required action]
234
+ - MUST: [Required action]
235
+ - MUST NOT: [Forbidden action]
236
+ - MUST NOT: [Forbidden action]
237
+ - PATTERN: Follow \`[file:lines]\`
238
+ - TOOL: Use \`[specific tool]\` for [purpose]
239
+
240
+ ## Recommended Approach
241
+ [1-2 sentence summary of how to proceed]
242
+ \`\`\`
243
+
244
+ ---
245
+
246
+ ## TOOL REFERENCE
247
+
248
+ | Tool | When to Use | Intent |
249
+ |------|-------------|--------|
250
+ | \`lsp_find_references\` | Map impact before changes | Refactoring |
251
+ | \`lsp_rename\` | Safe symbol renames | Refactoring |
252
+ | \`ast_grep_search\` | Find structural patterns | Refactoring, Build |
253
+ | \`explore\` agent | Codebase pattern discovery | Build, Research |
254
+ | \`librarian\` agent | External docs, best practices | Build, Architecture, Research |
255
+ | \`oracle\` agent | Read-only consultation. High-IQ debugging, architecture | Architecture |
256
+
257
+ ---
258
+
259
+ ## CRITICAL RULES
260
+
261
+ **NEVER**:
262
+ - Skip intent classification
263
+ - Ask generic questions ("What's the scope?")
264
+ - Proceed without addressing ambiguity
265
+ - Make assumptions about user's codebase
266
+
267
+ **ALWAYS**:
268
+ - Classify intent FIRST
269
+ - Be specific ("Should this change UserService only, or also AuthService?")
270
+ - Explore before asking (for Build/Research intents)
271
+ - Provide actionable directives for Prometheus
272
+ `
273
+
274
+ const metisRestrictions = createAgentToolRestrictions([
275
+ "write",
276
+ "edit",
277
+ "task",
278
+ "delegate_task",
279
+ ])
280
+
281
+ export function createMetisAgent(model: string): AgentConfig {
282
+ return {
283
+ description:
284
+ "Pre-planning consultant that analyzes requests to identify hidden intentions, ambiguities, and AI failure points.",
285
+ mode: "subagent" as const,
286
+ model,
287
+ temperature: 0.3,
288
+ ...metisRestrictions,
289
+ prompt: METIS_SYSTEM_PROMPT,
290
+ thinking: { type: "enabled", budgetTokens: 32000 },
291
+ } as AgentConfig
292
+ }
293
+
294
+
295
+ export const metisPromptMetadata: AgentPromptMetadata = {
296
+ category: "advisor",
297
+ cost: "EXPENSIVE",
298
+ triggers: [
299
+ {
300
+ domain: "Pre-planning analysis",
301
+ trigger: "Complex task requiring scope clarification, ambiguous requirements",
302
+ },
303
+ ],
304
+ useWhen: [
305
+ "Before planning non-trivial tasks",
306
+ "When user request is ambiguous or open-ended",
307
+ "To prevent AI over-engineering patterns",
308
+ ],
309
+ avoidWhen: [
310
+ "Simple, well-defined tasks",
311
+ "User has already provided detailed requirements",
312
+ ],
313
+ promptAlias: "Metis",
314
+ keyTrigger: "Ambiguous or complex request → consult Metis before Prometheus",
315
+ }
@@ -0,0 +1,57 @@
1
+ import { describe, test, expect } from "bun:test"
2
+ import { MOMUS_SYSTEM_PROMPT } from "./momus"
3
+
4
+ function escapeRegExp(value: string) {
5
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
6
+ }
7
+
8
+ describe("MOMUS_SYSTEM_PROMPT policy requirements", () => {
9
+ test("should treat SYSTEM DIRECTIVE as ignorable/stripped", () => {
10
+ // #given
11
+ const prompt = MOMUS_SYSTEM_PROMPT
12
+
13
+ // #when / #then
14
+ expect(prompt).toContain("[SYSTEM DIRECTIVE - READ-ONLY PLANNING CONSULTATION]")
15
+ // Should explicitly mention stripping or ignoring these
16
+ expect(prompt.toLowerCase()).toMatch(/ignore|strip|system directive/)
17
+ })
18
+
19
+ test("should extract paths containing .sisyphus/plans/ and ending in .md", () => {
20
+ // #given
21
+ const prompt = MOMUS_SYSTEM_PROMPT
22
+
23
+ // #when / #then
24
+ expect(prompt).toContain(".sisyphus/plans/")
25
+ expect(prompt).toContain(".md")
26
+ // New extraction policy should be mentioned
27
+ expect(prompt.toLowerCase()).toMatch(/extract|search|find path/)
28
+ })
29
+
30
+ test("should NOT teach that 'Please review' is INVALID (conversational wrapper allowed)", () => {
31
+ // #given
32
+ const prompt = MOMUS_SYSTEM_PROMPT
33
+
34
+ // #when / #then
35
+ // In RED phase, this will FAIL because current prompt explicitly lists this as INVALID
36
+ const invalidExample = "Please review .sisyphus/plans/plan.md"
37
+ const rejectionTeaching = new RegExp(
38
+ `reject.*${escapeRegExp(invalidExample)}`,
39
+ "i",
40
+ )
41
+
42
+ // We want the prompt to NOT reject this anymore.
43
+ // If it's still in the "INVALID" list, this test should fail.
44
+ expect(prompt).not.toMatch(rejectionTeaching)
45
+ })
46
+
47
+ test("should handle ambiguity (2+ paths) and 'no path found' rejection", () => {
48
+ // #given
49
+ const prompt = MOMUS_SYSTEM_PROMPT
50
+
51
+ // #when / #then
52
+ // Should mention what happens when multiple paths are found
53
+ expect(prompt.toLowerCase()).toMatch(/multiple|ambiguous|2\+|two/)
54
+ // Should mention rejection if no path found
55
+ expect(prompt.toLowerCase()).toMatch(/no.*path.*found|reject.*no.*path/)
56
+ })
57
+ })