opencode-repos 0.3.0 → 0.3.1

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/index.ts +10 -6
  2. package/package.json +1 -1
  3. package/src/__tests__/git.test.ts +33 -2
  4. package/src/git.ts +32 -5
  5. package/.sisyphus/boulder.json +0 -8
  6. package/.sisyphus/notepads/opencode-repos/decisions.md +0 -15
  7. package/.sisyphus/notepads/opencode-repos/learnings.md +0 -384
  8. package/.sisyphus/plans/opencode-repos.md +0 -987
  9. package/.tmux-sessionizer +0 -8
  10. package/TODO.md +0 -3
  11. package/oh-my-opencode/.github/FUNDING.yml +0 -15
  12. package/oh-my-opencode/.github/ISSUE_TEMPLATE/bug_report.yml +0 -129
  13. package/oh-my-opencode/.github/ISSUE_TEMPLATE/config.yml +0 -8
  14. package/oh-my-opencode/.github/ISSUE_TEMPLATE/feature_request.yml +0 -100
  15. package/oh-my-opencode/.github/ISSUE_TEMPLATE/general.yml +0 -83
  16. package/oh-my-opencode/.github/assets/google.jpg +0 -0
  17. package/oh-my-opencode/.github/assets/hero.jpg +0 -0
  18. package/oh-my-opencode/.github/assets/indent.jpg +0 -0
  19. package/oh-my-opencode/.github/assets/microsoft.jpg +0 -0
  20. package/oh-my-opencode/.github/assets/omo.png +0 -0
  21. package/oh-my-opencode/.github/assets/orchestrator-atlas.png +0 -0
  22. package/oh-my-opencode/.github/assets/sisyphus.png +0 -0
  23. package/oh-my-opencode/.github/assets/sisyphuslabs.png +0 -0
  24. package/oh-my-opencode/.github/pull_request_template.md +0 -34
  25. package/oh-my-opencode/.github/workflows/ci.yml +0 -138
  26. package/oh-my-opencode/.github/workflows/cla.yml +0 -41
  27. package/oh-my-opencode/.github/workflows/lint-workflows.yml +0 -22
  28. package/oh-my-opencode/.github/workflows/publish.yml +0 -165
  29. package/oh-my-opencode/.github/workflows/sisyphus-agent.yml +0 -500
  30. package/oh-my-opencode/.opencode/background-tasks.json +0 -27
  31. package/oh-my-opencode/.opencode/command/get-unpublished-changes.md +0 -84
  32. package/oh-my-opencode/.opencode/command/omomomo.md +0 -37
  33. package/oh-my-opencode/.opencode/command/publish.md +0 -257
  34. package/oh-my-opencode/AGENTS.md +0 -179
  35. package/oh-my-opencode/CLA.md +0 -58
  36. package/oh-my-opencode/CONTRIBUTING.md +0 -268
  37. package/oh-my-opencode/LICENSE.md +0 -82
  38. package/oh-my-opencode/README.ja.md +0 -370
  39. package/oh-my-opencode/README.md +0 -376
  40. package/oh-my-opencode/README.zh-cn.md +0 -380
  41. package/oh-my-opencode/assets/oh-my-opencode.schema.json +0 -2171
  42. package/oh-my-opencode/bin/oh-my-opencode.js +0 -80
  43. package/oh-my-opencode/bin/platform.js +0 -38
  44. package/oh-my-opencode/bin/platform.test.ts +0 -148
  45. package/oh-my-opencode/bun.lock +0 -314
  46. package/oh-my-opencode/bunfig.toml +0 -2
  47. package/oh-my-opencode/docs/category-skill-guide.md +0 -200
  48. package/oh-my-opencode/docs/cli-guide.md +0 -272
  49. package/oh-my-opencode/docs/configurations.md +0 -654
  50. package/oh-my-opencode/docs/features.md +0 -550
  51. package/oh-my-opencode/docs/guide/installation.md +0 -288
  52. package/oh-my-opencode/docs/guide/overview.md +0 -97
  53. package/oh-my-opencode/docs/guide/understanding-orchestration-system.md +0 -445
  54. package/oh-my-opencode/docs/orchestration-guide.md +0 -152
  55. package/oh-my-opencode/docs/ultrawork-manifesto.md +0 -197
  56. package/oh-my-opencode/package.json +0 -89
  57. package/oh-my-opencode/packages/darwin-arm64/bin/.gitkeep +0 -0
  58. package/oh-my-opencode/packages/darwin-arm64/package.json +0 -22
  59. package/oh-my-opencode/packages/darwin-x64/bin/.gitkeep +0 -0
  60. package/oh-my-opencode/packages/darwin-x64/package.json +0 -22
  61. package/oh-my-opencode/packages/linux-arm64/bin/.gitkeep +0 -0
  62. package/oh-my-opencode/packages/linux-arm64/package.json +0 -25
  63. package/oh-my-opencode/packages/linux-arm64-musl/bin/.gitkeep +0 -0
  64. package/oh-my-opencode/packages/linux-arm64-musl/package.json +0 -25
  65. package/oh-my-opencode/packages/linux-x64/bin/.gitkeep +0 -0
  66. package/oh-my-opencode/packages/linux-x64/package.json +0 -25
  67. package/oh-my-opencode/packages/linux-x64-musl/bin/.gitkeep +0 -0
  68. package/oh-my-opencode/packages/linux-x64-musl/package.json +0 -25
  69. package/oh-my-opencode/packages/windows-x64/bin/.gitkeep +0 -0
  70. package/oh-my-opencode/packages/windows-x64/package.json +0 -22
  71. package/oh-my-opencode/postinstall.mjs +0 -43
  72. package/oh-my-opencode/script/build-binaries.ts +0 -103
  73. package/oh-my-opencode/script/build-schema.ts +0 -28
  74. package/oh-my-opencode/script/generate-changelog.ts +0 -92
  75. package/oh-my-opencode/script/publish.ts +0 -344
  76. package/oh-my-opencode/signatures/cla.json +0 -676
  77. package/oh-my-opencode/src/agents/AGENTS.md +0 -67
  78. package/oh-my-opencode/src/agents/atlas.ts +0 -1383
  79. package/oh-my-opencode/src/agents/dynamic-agent-prompt-builder.ts +0 -400
  80. package/oh-my-opencode/src/agents/explore.ts +0 -122
  81. package/oh-my-opencode/src/agents/index.ts +0 -13
  82. package/oh-my-opencode/src/agents/librarian.ts +0 -326
  83. package/oh-my-opencode/src/agents/metis.ts +0 -315
  84. package/oh-my-opencode/src/agents/momus.test.ts +0 -57
  85. package/oh-my-opencode/src/agents/momus.ts +0 -444
  86. package/oh-my-opencode/src/agents/multimodal-looker.ts +0 -56
  87. package/oh-my-opencode/src/agents/oracle.ts +0 -122
  88. package/oh-my-opencode/src/agents/prometheus-prompt.test.ts +0 -22
  89. package/oh-my-opencode/src/agents/prometheus-prompt.ts +0 -1196
  90. package/oh-my-opencode/src/agents/sisyphus-junior.test.ts +0 -232
  91. package/oh-my-opencode/src/agents/sisyphus-junior.ts +0 -134
  92. package/oh-my-opencode/src/agents/sisyphus.ts +0 -633
  93. package/oh-my-opencode/src/agents/types.ts +0 -80
  94. package/oh-my-opencode/src/agents/utils.test.ts +0 -311
  95. package/oh-my-opencode/src/agents/utils.ts +0 -240
  96. package/oh-my-opencode/src/cli/AGENTS.md +0 -91
  97. package/oh-my-opencode/src/cli/config-manager.test.ts +0 -364
  98. package/oh-my-opencode/src/cli/config-manager.ts +0 -641
  99. package/oh-my-opencode/src/cli/doctor/checks/auth.test.ts +0 -114
  100. package/oh-my-opencode/src/cli/doctor/checks/auth.ts +0 -115
  101. package/oh-my-opencode/src/cli/doctor/checks/config.test.ts +0 -103
  102. package/oh-my-opencode/src/cli/doctor/checks/config.ts +0 -123
  103. package/oh-my-opencode/src/cli/doctor/checks/dependencies.test.ts +0 -152
  104. package/oh-my-opencode/src/cli/doctor/checks/dependencies.ts +0 -163
  105. package/oh-my-opencode/src/cli/doctor/checks/gh.test.ts +0 -151
  106. package/oh-my-opencode/src/cli/doctor/checks/gh.ts +0 -171
  107. package/oh-my-opencode/src/cli/doctor/checks/index.ts +0 -34
  108. package/oh-my-opencode/src/cli/doctor/checks/lsp.test.ts +0 -134
  109. package/oh-my-opencode/src/cli/doctor/checks/lsp.ts +0 -77
  110. package/oh-my-opencode/src/cli/doctor/checks/mcp.test.ts +0 -115
  111. package/oh-my-opencode/src/cli/doctor/checks/mcp.ts +0 -128
  112. package/oh-my-opencode/src/cli/doctor/checks/opencode.test.ts +0 -227
  113. package/oh-my-opencode/src/cli/doctor/checks/opencode.ts +0 -178
  114. package/oh-my-opencode/src/cli/doctor/checks/plugin.test.ts +0 -109
  115. package/oh-my-opencode/src/cli/doctor/checks/plugin.ts +0 -124
  116. package/oh-my-opencode/src/cli/doctor/checks/version.test.ts +0 -148
  117. package/oh-my-opencode/src/cli/doctor/checks/version.ts +0 -135
  118. package/oh-my-opencode/src/cli/doctor/constants.ts +0 -72
  119. package/oh-my-opencode/src/cli/doctor/formatter.test.ts +0 -218
  120. package/oh-my-opencode/src/cli/doctor/formatter.ts +0 -140
  121. package/oh-my-opencode/src/cli/doctor/index.ts +0 -11
  122. package/oh-my-opencode/src/cli/doctor/runner.test.ts +0 -153
  123. package/oh-my-opencode/src/cli/doctor/runner.ts +0 -132
  124. package/oh-my-opencode/src/cli/doctor/types.ts +0 -113
  125. package/oh-my-opencode/src/cli/get-local-version/formatter.ts +0 -66
  126. package/oh-my-opencode/src/cli/get-local-version/index.ts +0 -106
  127. package/oh-my-opencode/src/cli/get-local-version/types.ts +0 -14
  128. package/oh-my-opencode/src/cli/index.ts +0 -153
  129. package/oh-my-opencode/src/cli/install.ts +0 -523
  130. package/oh-my-opencode/src/cli/model-fallback.ts +0 -246
  131. package/oh-my-opencode/src/cli/run/completion.test.ts +0 -170
  132. package/oh-my-opencode/src/cli/run/completion.ts +0 -79
  133. package/oh-my-opencode/src/cli/run/events.test.ts +0 -155
  134. package/oh-my-opencode/src/cli/run/events.ts +0 -325
  135. package/oh-my-opencode/src/cli/run/index.ts +0 -2
  136. package/oh-my-opencode/src/cli/run/runner.ts +0 -159
  137. package/oh-my-opencode/src/cli/run/types.ts +0 -76
  138. package/oh-my-opencode/src/cli/types.ts +0 -40
  139. package/oh-my-opencode/src/config/index.ts +0 -26
  140. package/oh-my-opencode/src/config/schema.test.ts +0 -444
  141. package/oh-my-opencode/src/config/schema.ts +0 -339
  142. package/oh-my-opencode/src/features/AGENTS.md +0 -77
  143. package/oh-my-opencode/src/features/background-agent/concurrency.test.ts +0 -418
  144. package/oh-my-opencode/src/features/background-agent/concurrency.ts +0 -137
  145. package/oh-my-opencode/src/features/background-agent/index.ts +0 -3
  146. package/oh-my-opencode/src/features/background-agent/manager.test.ts +0 -1928
  147. package/oh-my-opencode/src/features/background-agent/manager.ts +0 -1335
  148. package/oh-my-opencode/src/features/background-agent/types.ts +0 -66
  149. package/oh-my-opencode/src/features/boulder-state/constants.ts +0 -13
  150. package/oh-my-opencode/src/features/boulder-state/index.ts +0 -3
  151. package/oh-my-opencode/src/features/boulder-state/storage.test.ts +0 -250
  152. package/oh-my-opencode/src/features/boulder-state/storage.ts +0 -150
  153. package/oh-my-opencode/src/features/boulder-state/types.ts +0 -26
  154. package/oh-my-opencode/src/features/builtin-commands/commands.ts +0 -89
  155. package/oh-my-opencode/src/features/builtin-commands/index.ts +0 -2
  156. package/oh-my-opencode/src/features/builtin-commands/templates/init-deep.ts +0 -300
  157. package/oh-my-opencode/src/features/builtin-commands/templates/ralph-loop.ts +0 -38
  158. package/oh-my-opencode/src/features/builtin-commands/templates/refactor.ts +0 -619
  159. package/oh-my-opencode/src/features/builtin-commands/templates/start-work.ts +0 -72
  160. package/oh-my-opencode/src/features/builtin-commands/types.ts +0 -9
  161. package/oh-my-opencode/src/features/builtin-skills/frontend-ui-ux/SKILL.md +0 -78
  162. package/oh-my-opencode/src/features/builtin-skills/git-master/SKILL.md +0 -1105
  163. package/oh-my-opencode/src/features/builtin-skills/index.ts +0 -2
  164. package/oh-my-opencode/src/features/builtin-skills/skills.ts +0 -1203
  165. package/oh-my-opencode/src/features/builtin-skills/types.ts +0 -16
  166. package/oh-my-opencode/src/features/claude-code-agent-loader/index.ts +0 -2
  167. package/oh-my-opencode/src/features/claude-code-agent-loader/loader.ts +0 -90
  168. package/oh-my-opencode/src/features/claude-code-agent-loader/types.ts +0 -17
  169. package/oh-my-opencode/src/features/claude-code-command-loader/index.ts +0 -2
  170. package/oh-my-opencode/src/features/claude-code-command-loader/loader.ts +0 -144
  171. package/oh-my-opencode/src/features/claude-code-command-loader/types.ts +0 -46
  172. package/oh-my-opencode/src/features/claude-code-mcp-loader/env-expander.ts +0 -27
  173. package/oh-my-opencode/src/features/claude-code-mcp-loader/index.ts +0 -11
  174. package/oh-my-opencode/src/features/claude-code-mcp-loader/loader.test.ts +0 -162
  175. package/oh-my-opencode/src/features/claude-code-mcp-loader/loader.ts +0 -113
  176. package/oh-my-opencode/src/features/claude-code-mcp-loader/transformer.ts +0 -53
  177. package/oh-my-opencode/src/features/claude-code-mcp-loader/types.ts +0 -42
  178. package/oh-my-opencode/src/features/claude-code-plugin-loader/index.ts +0 -3
  179. package/oh-my-opencode/src/features/claude-code-plugin-loader/loader.ts +0 -486
  180. package/oh-my-opencode/src/features/claude-code-plugin-loader/types.ts +0 -210
  181. package/oh-my-opencode/src/features/claude-code-session-state/index.ts +0 -1
  182. package/oh-my-opencode/src/features/claude-code-session-state/state.test.ts +0 -126
  183. package/oh-my-opencode/src/features/claude-code-session-state/state.ts +0 -37
  184. package/oh-my-opencode/src/features/context-injector/collector.test.ts +0 -330
  185. package/oh-my-opencode/src/features/context-injector/collector.ts +0 -85
  186. package/oh-my-opencode/src/features/context-injector/index.ts +0 -14
  187. package/oh-my-opencode/src/features/context-injector/injector.test.ts +0 -122
  188. package/oh-my-opencode/src/features/context-injector/injector.ts +0 -167
  189. package/oh-my-opencode/src/features/context-injector/types.ts +0 -91
  190. package/oh-my-opencode/src/features/hook-message-injector/constants.ts +0 -6
  191. package/oh-my-opencode/src/features/hook-message-injector/index.ts +0 -4
  192. package/oh-my-opencode/src/features/hook-message-injector/injector.ts +0 -195
  193. package/oh-my-opencode/src/features/hook-message-injector/types.ts +0 -47
  194. package/oh-my-opencode/src/features/opencode-skill-loader/async-loader.test.ts +0 -448
  195. package/oh-my-opencode/src/features/opencode-skill-loader/async-loader.ts +0 -180
  196. package/oh-my-opencode/src/features/opencode-skill-loader/blocking.test.ts +0 -210
  197. package/oh-my-opencode/src/features/opencode-skill-loader/blocking.ts +0 -62
  198. package/oh-my-opencode/src/features/opencode-skill-loader/discover-worker.ts +0 -59
  199. package/oh-my-opencode/src/features/opencode-skill-loader/index.ts +0 -4
  200. package/oh-my-opencode/src/features/opencode-skill-loader/loader.test.ts +0 -273
  201. package/oh-my-opencode/src/features/opencode-skill-loader/loader.ts +0 -259
  202. package/oh-my-opencode/src/features/opencode-skill-loader/merger.ts +0 -267
  203. package/oh-my-opencode/src/features/opencode-skill-loader/skill-content.test.ts +0 -267
  204. package/oh-my-opencode/src/features/opencode-skill-loader/skill-content.ts +0 -206
  205. package/oh-my-opencode/src/features/opencode-skill-loader/types.ts +0 -38
  206. package/oh-my-opencode/src/features/skill-mcp-manager/env-cleaner.test.ts +0 -201
  207. package/oh-my-opencode/src/features/skill-mcp-manager/env-cleaner.ts +0 -27
  208. package/oh-my-opencode/src/features/skill-mcp-manager/index.ts +0 -2
  209. package/oh-my-opencode/src/features/skill-mcp-manager/manager.test.ts +0 -611
  210. package/oh-my-opencode/src/features/skill-mcp-manager/manager.ts +0 -520
  211. package/oh-my-opencode/src/features/skill-mcp-manager/types.ts +0 -14
  212. package/oh-my-opencode/src/features/task-toast-manager/index.ts +0 -2
  213. package/oh-my-opencode/src/features/task-toast-manager/manager.test.ts +0 -249
  214. package/oh-my-opencode/src/features/task-toast-manager/manager.ts +0 -215
  215. package/oh-my-opencode/src/features/task-toast-manager/types.ts +0 -24
  216. package/oh-my-opencode/src/hooks/AGENTS.md +0 -73
  217. package/oh-my-opencode/src/hooks/agent-usage-reminder/constants.ts +0 -54
  218. package/oh-my-opencode/src/hooks/agent-usage-reminder/index.ts +0 -109
  219. package/oh-my-opencode/src/hooks/agent-usage-reminder/storage.ts +0 -42
  220. package/oh-my-opencode/src/hooks/agent-usage-reminder/types.ts +0 -6
  221. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/executor.test.ts +0 -307
  222. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/executor.ts +0 -485
  223. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/index.ts +0 -151
  224. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/parser.ts +0 -201
  225. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.test.ts +0 -33
  226. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.ts +0 -184
  227. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-types.ts +0 -44
  228. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/storage.test.ts +0 -77
  229. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/storage.ts +0 -250
  230. package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/types.ts +0 -42
  231. package/oh-my-opencode/src/hooks/atlas/index.test.ts +0 -953
  232. package/oh-my-opencode/src/hooks/atlas/index.ts +0 -771
  233. package/oh-my-opencode/src/hooks/auto-slash-command/constants.ts +0 -12
  234. package/oh-my-opencode/src/hooks/auto-slash-command/detector.test.ts +0 -296
  235. package/oh-my-opencode/src/hooks/auto-slash-command/detector.ts +0 -65
  236. package/oh-my-opencode/src/hooks/auto-slash-command/executor.ts +0 -205
  237. package/oh-my-opencode/src/hooks/auto-slash-command/index.test.ts +0 -254
  238. package/oh-my-opencode/src/hooks/auto-slash-command/index.ts +0 -89
  239. package/oh-my-opencode/src/hooks/auto-slash-command/types.ts +0 -23
  240. package/oh-my-opencode/src/hooks/auto-update-checker/cache.ts +0 -93
  241. package/oh-my-opencode/src/hooks/auto-update-checker/checker.test.ts +0 -24
  242. package/oh-my-opencode/src/hooks/auto-update-checker/checker.ts +0 -284
  243. package/oh-my-opencode/src/hooks/auto-update-checker/constants.ts +0 -64
  244. package/oh-my-opencode/src/hooks/auto-update-checker/index.test.ts +0 -254
  245. package/oh-my-opencode/src/hooks/auto-update-checker/index.ts +0 -260
  246. package/oh-my-opencode/src/hooks/auto-update-checker/types.ts +0 -29
  247. package/oh-my-opencode/src/hooks/background-compaction/index.ts +0 -87
  248. package/oh-my-opencode/src/hooks/background-notification/index.ts +0 -28
  249. package/oh-my-opencode/src/hooks/background-notification/types.ts +0 -5
  250. package/oh-my-opencode/src/hooks/claude-code-hooks/AGENTS.md +0 -70
  251. package/oh-my-opencode/src/hooks/claude-code-hooks/config-loader.ts +0 -107
  252. package/oh-my-opencode/src/hooks/claude-code-hooks/config.ts +0 -103
  253. package/oh-my-opencode/src/hooks/claude-code-hooks/index.ts +0 -401
  254. package/oh-my-opencode/src/hooks/claude-code-hooks/plugin-config.ts +0 -12
  255. package/oh-my-opencode/src/hooks/claude-code-hooks/post-tool-use.ts +0 -199
  256. package/oh-my-opencode/src/hooks/claude-code-hooks/pre-compact.ts +0 -109
  257. package/oh-my-opencode/src/hooks/claude-code-hooks/pre-tool-use.ts +0 -172
  258. package/oh-my-opencode/src/hooks/claude-code-hooks/stop.ts +0 -118
  259. package/oh-my-opencode/src/hooks/claude-code-hooks/todo.ts +0 -76
  260. package/oh-my-opencode/src/hooks/claude-code-hooks/tool-input-cache.ts +0 -47
  261. package/oh-my-opencode/src/hooks/claude-code-hooks/transcript.ts +0 -252
  262. package/oh-my-opencode/src/hooks/claude-code-hooks/types.ts +0 -204
  263. package/oh-my-opencode/src/hooks/claude-code-hooks/user-prompt-submit.ts +0 -117
  264. package/oh-my-opencode/src/hooks/comment-checker/cli.test.ts +0 -68
  265. package/oh-my-opencode/src/hooks/comment-checker/cli.ts +0 -221
  266. package/oh-my-opencode/src/hooks/comment-checker/downloader.ts +0 -196
  267. package/oh-my-opencode/src/hooks/comment-checker/index.ts +0 -171
  268. package/oh-my-opencode/src/hooks/comment-checker/types.ts +0 -33
  269. package/oh-my-opencode/src/hooks/compaction-context-injector/index.ts +0 -61
  270. package/oh-my-opencode/src/hooks/context-window-monitor.ts +0 -99
  271. package/oh-my-opencode/src/hooks/delegate-task-retry/index.test.ts +0 -119
  272. package/oh-my-opencode/src/hooks/delegate-task-retry/index.ts +0 -136
  273. package/oh-my-opencode/src/hooks/directory-agents-injector/constants.ts +0 -9
  274. package/oh-my-opencode/src/hooks/directory-agents-injector/index.ts +0 -182
  275. package/oh-my-opencode/src/hooks/directory-agents-injector/storage.ts +0 -48
  276. package/oh-my-opencode/src/hooks/directory-agents-injector/types.ts +0 -5
  277. package/oh-my-opencode/src/hooks/directory-readme-injector/constants.ts +0 -9
  278. package/oh-my-opencode/src/hooks/directory-readme-injector/index.ts +0 -177
  279. package/oh-my-opencode/src/hooks/directory-readme-injector/storage.ts +0 -48
  280. package/oh-my-opencode/src/hooks/directory-readme-injector/types.ts +0 -5
  281. package/oh-my-opencode/src/hooks/edit-error-recovery/index.test.ts +0 -126
  282. package/oh-my-opencode/src/hooks/edit-error-recovery/index.ts +0 -57
  283. package/oh-my-opencode/src/hooks/empty-task-response-detector.ts +0 -27
  284. package/oh-my-opencode/src/hooks/index.ts +0 -32
  285. package/oh-my-opencode/src/hooks/interactive-bash-session/constants.ts +0 -15
  286. package/oh-my-opencode/src/hooks/interactive-bash-session/index.ts +0 -262
  287. package/oh-my-opencode/src/hooks/interactive-bash-session/storage.ts +0 -59
  288. package/oh-my-opencode/src/hooks/interactive-bash-session/types.ts +0 -11
  289. package/oh-my-opencode/src/hooks/keyword-detector/constants.ts +0 -300
  290. package/oh-my-opencode/src/hooks/keyword-detector/detector.ts +0 -52
  291. package/oh-my-opencode/src/hooks/keyword-detector/index.test.ts +0 -529
  292. package/oh-my-opencode/src/hooks/keyword-detector/index.ts +0 -100
  293. package/oh-my-opencode/src/hooks/keyword-detector/types.ts +0 -4
  294. package/oh-my-opencode/src/hooks/non-interactive-env/constants.ts +0 -70
  295. package/oh-my-opencode/src/hooks/non-interactive-env/detector.ts +0 -19
  296. package/oh-my-opencode/src/hooks/non-interactive-env/index.test.ts +0 -323
  297. package/oh-my-opencode/src/hooks/non-interactive-env/index.ts +0 -63
  298. package/oh-my-opencode/src/hooks/non-interactive-env/types.ts +0 -3
  299. package/oh-my-opencode/src/hooks/prometheus-md-only/constants.ts +0 -32
  300. package/oh-my-opencode/src/hooks/prometheus-md-only/index.test.ts +0 -488
  301. package/oh-my-opencode/src/hooks/prometheus-md-only/index.ts +0 -136
  302. package/oh-my-opencode/src/hooks/ralph-loop/constants.ts +0 -5
  303. package/oh-my-opencode/src/hooks/ralph-loop/index.test.ts +0 -835
  304. package/oh-my-opencode/src/hooks/ralph-loop/index.ts +0 -417
  305. package/oh-my-opencode/src/hooks/ralph-loop/storage.ts +0 -115
  306. package/oh-my-opencode/src/hooks/ralph-loop/types.ts +0 -19
  307. package/oh-my-opencode/src/hooks/rules-injector/constants.ts +0 -30
  308. package/oh-my-opencode/src/hooks/rules-injector/finder.test.ts +0 -381
  309. package/oh-my-opencode/src/hooks/rules-injector/finder.ts +0 -263
  310. package/oh-my-opencode/src/hooks/rules-injector/index.ts +0 -223
  311. package/oh-my-opencode/src/hooks/rules-injector/matcher.ts +0 -63
  312. package/oh-my-opencode/src/hooks/rules-injector/parser.test.ts +0 -226
  313. package/oh-my-opencode/src/hooks/rules-injector/parser.ts +0 -211
  314. package/oh-my-opencode/src/hooks/rules-injector/storage.ts +0 -59
  315. package/oh-my-opencode/src/hooks/rules-injector/types.ts +0 -57
  316. package/oh-my-opencode/src/hooks/session-notification-utils.ts +0 -140
  317. package/oh-my-opencode/src/hooks/session-notification.test.ts +0 -361
  318. package/oh-my-opencode/src/hooks/session-notification.ts +0 -330
  319. package/oh-my-opencode/src/hooks/session-recovery/constants.ts +0 -10
  320. package/oh-my-opencode/src/hooks/session-recovery/index.test.ts +0 -223
  321. package/oh-my-opencode/src/hooks/session-recovery/index.ts +0 -435
  322. package/oh-my-opencode/src/hooks/session-recovery/storage.ts +0 -390
  323. package/oh-my-opencode/src/hooks/session-recovery/types.ts +0 -98
  324. package/oh-my-opencode/src/hooks/start-work/index.test.ts +0 -402
  325. package/oh-my-opencode/src/hooks/start-work/index.ts +0 -242
  326. package/oh-my-opencode/src/hooks/task-resume-info/index.ts +0 -36
  327. package/oh-my-opencode/src/hooks/think-mode/detector.ts +0 -57
  328. package/oh-my-opencode/src/hooks/think-mode/index.test.ts +0 -353
  329. package/oh-my-opencode/src/hooks/think-mode/index.ts +0 -89
  330. package/oh-my-opencode/src/hooks/think-mode/switcher.test.ts +0 -461
  331. package/oh-my-opencode/src/hooks/think-mode/switcher.ts +0 -222
  332. package/oh-my-opencode/src/hooks/think-mode/types.ts +0 -21
  333. package/oh-my-opencode/src/hooks/thinking-block-validator/index.ts +0 -171
  334. package/oh-my-opencode/src/hooks/todo-continuation-enforcer.test.ts +0 -876
  335. package/oh-my-opencode/src/hooks/todo-continuation-enforcer.ts +0 -480
  336. package/oh-my-opencode/src/hooks/tool-output-truncator.test.ts +0 -168
  337. package/oh-my-opencode/src/hooks/tool-output-truncator.ts +0 -61
  338. package/oh-my-opencode/src/index.ts +0 -589
  339. package/oh-my-opencode/src/mcp/AGENTS.md +0 -70
  340. package/oh-my-opencode/src/mcp/context7.ts +0 -6
  341. package/oh-my-opencode/src/mcp/grep-app.ts +0 -6
  342. package/oh-my-opencode/src/mcp/index.test.ts +0 -86
  343. package/oh-my-opencode/src/mcp/index.ts +0 -32
  344. package/oh-my-opencode/src/mcp/types.ts +0 -9
  345. package/oh-my-opencode/src/mcp/websearch.ts +0 -10
  346. package/oh-my-opencode/src/plugin-config.test.ts +0 -119
  347. package/oh-my-opencode/src/plugin-config.ts +0 -135
  348. package/oh-my-opencode/src/plugin-handlers/config-handler.test.ts +0 -103
  349. package/oh-my-opencode/src/plugin-handlers/config-handler.ts +0 -399
  350. package/oh-my-opencode/src/plugin-handlers/index.ts +0 -1
  351. package/oh-my-opencode/src/plugin-state.ts +0 -30
  352. package/oh-my-opencode/src/shared/AGENTS.md +0 -63
  353. package/oh-my-opencode/src/shared/agent-tool-restrictions.ts +0 -44
  354. package/oh-my-opencode/src/shared/agent-variant.test.ts +0 -83
  355. package/oh-my-opencode/src/shared/agent-variant.ts +0 -40
  356. package/oh-my-opencode/src/shared/claude-config-dir.test.ts +0 -60
  357. package/oh-my-opencode/src/shared/claude-config-dir.ts +0 -11
  358. package/oh-my-opencode/src/shared/command-executor.ts +0 -225
  359. package/oh-my-opencode/src/shared/config-errors.ts +0 -18
  360. package/oh-my-opencode/src/shared/config-path.ts +0 -47
  361. package/oh-my-opencode/src/shared/data-path.ts +0 -22
  362. package/oh-my-opencode/src/shared/deep-merge.test.ts +0 -336
  363. package/oh-my-opencode/src/shared/deep-merge.ts +0 -53
  364. package/oh-my-opencode/src/shared/dynamic-truncator.ts +0 -193
  365. package/oh-my-opencode/src/shared/external-plugin-detector.test.ts +0 -133
  366. package/oh-my-opencode/src/shared/external-plugin-detector.ts +0 -132
  367. package/oh-my-opencode/src/shared/file-reference-resolver.ts +0 -85
  368. package/oh-my-opencode/src/shared/file-utils.ts +0 -40
  369. package/oh-my-opencode/src/shared/first-message-variant.test.ts +0 -32
  370. package/oh-my-opencode/src/shared/first-message-variant.ts +0 -28
  371. package/oh-my-opencode/src/shared/frontmatter.test.ts +0 -262
  372. package/oh-my-opencode/src/shared/frontmatter.ts +0 -31
  373. package/oh-my-opencode/src/shared/hook-disabled.ts +0 -22
  374. package/oh-my-opencode/src/shared/index.ts +0 -29
  375. package/oh-my-opencode/src/shared/jsonc-parser.test.ts +0 -266
  376. package/oh-my-opencode/src/shared/jsonc-parser.ts +0 -66
  377. package/oh-my-opencode/src/shared/logger.ts +0 -20
  378. package/oh-my-opencode/src/shared/migration.test.ts +0 -602
  379. package/oh-my-opencode/src/shared/migration.ts +0 -191
  380. package/oh-my-opencode/src/shared/model-resolver.test.ts +0 -101
  381. package/oh-my-opencode/src/shared/model-resolver.ts +0 -35
  382. package/oh-my-opencode/src/shared/model-sanitizer.ts +0 -12
  383. package/oh-my-opencode/src/shared/opencode-config-dir.test.ts +0 -318
  384. package/oh-my-opencode/src/shared/opencode-config-dir.ts +0 -142
  385. package/oh-my-opencode/src/shared/opencode-version.test.ts +0 -223
  386. package/oh-my-opencode/src/shared/opencode-version.ts +0 -72
  387. package/oh-my-opencode/src/shared/pattern-matcher.ts +0 -29
  388. package/oh-my-opencode/src/shared/permission-compat.test.ts +0 -134
  389. package/oh-my-opencode/src/shared/permission-compat.ts +0 -77
  390. package/oh-my-opencode/src/shared/session-cursor.test.ts +0 -66
  391. package/oh-my-opencode/src/shared/session-cursor.ts +0 -85
  392. package/oh-my-opencode/src/shared/shell-env.test.ts +0 -278
  393. package/oh-my-opencode/src/shared/shell-env.ts +0 -111
  394. package/oh-my-opencode/src/shared/snake-case.ts +0 -49
  395. package/oh-my-opencode/src/shared/system-directive.ts +0 -40
  396. package/oh-my-opencode/src/shared/tool-name.ts +0 -26
  397. package/oh-my-opencode/src/shared/zip-extractor.ts +0 -83
  398. package/oh-my-opencode/src/tools/AGENTS.md +0 -74
  399. package/oh-my-opencode/src/tools/ast-grep/cli.ts +0 -230
  400. package/oh-my-opencode/src/tools/ast-grep/constants.ts +0 -261
  401. package/oh-my-opencode/src/tools/ast-grep/downloader.ts +0 -128
  402. package/oh-my-opencode/src/tools/ast-grep/index.ts +0 -13
  403. package/oh-my-opencode/src/tools/ast-grep/tools.ts +0 -112
  404. package/oh-my-opencode/src/tools/ast-grep/types.ts +0 -61
  405. package/oh-my-opencode/src/tools/ast-grep/utils.ts +0 -102
  406. package/oh-my-opencode/src/tools/background-task/constants.ts +0 -7
  407. package/oh-my-opencode/src/tools/background-task/index.ts +0 -7
  408. package/oh-my-opencode/src/tools/background-task/tools.ts +0 -479
  409. package/oh-my-opencode/src/tools/background-task/types.ts +0 -16
  410. package/oh-my-opencode/src/tools/call-omo-agent/constants.ts +0 -7
  411. package/oh-my-opencode/src/tools/call-omo-agent/index.ts +0 -3
  412. package/oh-my-opencode/src/tools/call-omo-agent/tools.ts +0 -338
  413. package/oh-my-opencode/src/tools/call-omo-agent/types.ts +0 -27
  414. package/oh-my-opencode/src/tools/delegate-task/constants.ts +0 -205
  415. package/oh-my-opencode/src/tools/delegate-task/index.ts +0 -3
  416. package/oh-my-opencode/src/tools/delegate-task/tools.test.ts +0 -1575
  417. package/oh-my-opencode/src/tools/delegate-task/tools.ts +0 -885
  418. package/oh-my-opencode/src/tools/delegate-task/types.ts +0 -9
  419. package/oh-my-opencode/src/tools/glob/cli.test.ts +0 -158
  420. package/oh-my-opencode/src/tools/glob/cli.ts +0 -191
  421. package/oh-my-opencode/src/tools/glob/constants.ts +0 -12
  422. package/oh-my-opencode/src/tools/glob/index.ts +0 -3
  423. package/oh-my-opencode/src/tools/glob/tools.ts +0 -41
  424. package/oh-my-opencode/src/tools/glob/types.ts +0 -22
  425. package/oh-my-opencode/src/tools/glob/utils.ts +0 -26
  426. package/oh-my-opencode/src/tools/grep/cli.ts +0 -229
  427. package/oh-my-opencode/src/tools/grep/constants.ts +0 -127
  428. package/oh-my-opencode/src/tools/grep/downloader.test.ts +0 -103
  429. package/oh-my-opencode/src/tools/grep/downloader.ts +0 -145
  430. package/oh-my-opencode/src/tools/grep/index.ts +0 -3
  431. package/oh-my-opencode/src/tools/grep/tools.ts +0 -40
  432. package/oh-my-opencode/src/tools/grep/types.ts +0 -39
  433. package/oh-my-opencode/src/tools/grep/utils.ts +0 -53
  434. package/oh-my-opencode/src/tools/index.ts +0 -72
  435. package/oh-my-opencode/src/tools/interactive-bash/constants.ts +0 -18
  436. package/oh-my-opencode/src/tools/interactive-bash/index.ts +0 -4
  437. package/oh-my-opencode/src/tools/interactive-bash/tools.ts +0 -126
  438. package/oh-my-opencode/src/tools/interactive-bash/utils.ts +0 -71
  439. package/oh-my-opencode/src/tools/look-at/constants.ts +0 -3
  440. package/oh-my-opencode/src/tools/look-at/index.ts +0 -3
  441. package/oh-my-opencode/src/tools/look-at/tools.test.ts +0 -73
  442. package/oh-my-opencode/src/tools/look-at/tools.ts +0 -173
  443. package/oh-my-opencode/src/tools/look-at/types.ts +0 -4
  444. package/oh-my-opencode/src/tools/lsp/client.ts +0 -596
  445. package/oh-my-opencode/src/tools/lsp/config.test.ts +0 -130
  446. package/oh-my-opencode/src/tools/lsp/config.ts +0 -285
  447. package/oh-my-opencode/src/tools/lsp/constants.ts +0 -390
  448. package/oh-my-opencode/src/tools/lsp/index.ts +0 -7
  449. package/oh-my-opencode/src/tools/lsp/tools.ts +0 -261
  450. package/oh-my-opencode/src/tools/lsp/types.ts +0 -124
  451. package/oh-my-opencode/src/tools/lsp/utils.ts +0 -406
  452. package/oh-my-opencode/src/tools/session-manager/constants.ts +0 -97
  453. package/oh-my-opencode/src/tools/session-manager/index.ts +0 -3
  454. package/oh-my-opencode/src/tools/session-manager/storage.test.ts +0 -315
  455. package/oh-my-opencode/src/tools/session-manager/storage.ts +0 -238
  456. package/oh-my-opencode/src/tools/session-manager/tools.test.ts +0 -124
  457. package/oh-my-opencode/src/tools/session-manager/tools.ts +0 -146
  458. package/oh-my-opencode/src/tools/session-manager/types.ts +0 -99
  459. package/oh-my-opencode/src/tools/session-manager/utils.test.ts +0 -160
  460. package/oh-my-opencode/src/tools/session-manager/utils.ts +0 -199
  461. package/oh-my-opencode/src/tools/skill/constants.ts +0 -8
  462. package/oh-my-opencode/src/tools/skill/index.ts +0 -3
  463. package/oh-my-opencode/src/tools/skill/tools.test.ts +0 -239
  464. package/oh-my-opencode/src/tools/skill/tools.ts +0 -200
  465. package/oh-my-opencode/src/tools/skill/types.ts +0 -31
  466. package/oh-my-opencode/src/tools/skill-mcp/constants.ts +0 -3
  467. package/oh-my-opencode/src/tools/skill-mcp/index.ts +0 -3
  468. package/oh-my-opencode/src/tools/skill-mcp/tools.test.ts +0 -215
  469. package/oh-my-opencode/src/tools/skill-mcp/tools.ts +0 -172
  470. package/oh-my-opencode/src/tools/skill-mcp/types.ts +0 -8
  471. package/oh-my-opencode/src/tools/slashcommand/index.ts +0 -2
  472. package/oh-my-opencode/src/tools/slashcommand/tools.ts +0 -252
  473. package/oh-my-opencode/src/tools/slashcommand/types.ts +0 -28
  474. package/oh-my-opencode/test-setup.ts +0 -6
  475. package/oh-my-opencode/tsconfig.json +0 -20
@@ -1,99 +0,0 @@
1
- import type { PluginInput } from "@opencode-ai/plugin"
2
- import { createSystemDirective, SystemDirectiveTypes } from "../shared/system-directive"
3
-
4
- const ANTHROPIC_DISPLAY_LIMIT = 1_000_000
5
- const ANTHROPIC_ACTUAL_LIMIT =
6
- process.env.ANTHROPIC_1M_CONTEXT === "true" ||
7
- process.env.VERTEX_ANTHROPIC_1M_CONTEXT === "true"
8
- ? 1_000_000
9
- : 200_000
10
- const CONTEXT_WARNING_THRESHOLD = 0.70
11
-
12
- const CONTEXT_REMINDER = `${createSystemDirective(SystemDirectiveTypes.CONTEXT_WINDOW_MONITOR)}
13
-
14
- You are using Anthropic Claude with 1M context window.
15
- You have plenty of context remaining - do NOT rush or skip tasks.
16
- Complete your work thoroughly and methodically.`
17
-
18
- interface AssistantMessageInfo {
19
- role: "assistant"
20
- providerID: string
21
- tokens: {
22
- input: number
23
- output: number
24
- reasoning: number
25
- cache: { read: number; write: number }
26
- }
27
- }
28
-
29
- interface MessageWrapper {
30
- info: { role: string } & Partial<AssistantMessageInfo>
31
- }
32
-
33
- export function createContextWindowMonitorHook(ctx: PluginInput) {
34
- const remindedSessions = new Set<string>()
35
-
36
- const toolExecuteAfter = async (
37
- input: { tool: string; sessionID: string; callID: string },
38
- output: { title: string; output: string; metadata: unknown }
39
- ) => {
40
- const { sessionID } = input
41
-
42
- if (remindedSessions.has(sessionID)) return
43
-
44
- try {
45
- const response = await ctx.client.session.messages({
46
- path: { id: sessionID },
47
- })
48
-
49
- const messages = (response.data ?? response) as MessageWrapper[]
50
-
51
- const assistantMessages = messages
52
- .filter((m) => m.info.role === "assistant")
53
- .map((m) => m.info as AssistantMessageInfo)
54
-
55
- if (assistantMessages.length === 0) return
56
-
57
- const lastAssistant = assistantMessages[assistantMessages.length - 1]
58
- if (lastAssistant.providerID !== "anthropic") return
59
-
60
- // Use only the last assistant message's input tokens
61
- // This reflects the ACTUAL current context window usage (post-compaction)
62
- const lastTokens = lastAssistant.tokens
63
- const totalInputTokens = (lastTokens?.input ?? 0) + (lastTokens?.cache?.read ?? 0)
64
-
65
- const actualUsagePercentage = totalInputTokens / ANTHROPIC_ACTUAL_LIMIT
66
-
67
- if (actualUsagePercentage < CONTEXT_WARNING_THRESHOLD) return
68
-
69
- remindedSessions.add(sessionID)
70
-
71
- const displayUsagePercentage = totalInputTokens / ANTHROPIC_DISPLAY_LIMIT
72
- const usedPct = (displayUsagePercentage * 100).toFixed(1)
73
- const remainingPct = ((1 - displayUsagePercentage) * 100).toFixed(1)
74
- const usedTokens = totalInputTokens.toLocaleString()
75
- const limitTokens = ANTHROPIC_DISPLAY_LIMIT.toLocaleString()
76
-
77
- output.output += `\n\n${CONTEXT_REMINDER}
78
- [Context Status: ${usedPct}% used (${usedTokens}/${limitTokens} tokens), ${remainingPct}% remaining]`
79
- } catch {
80
- // Graceful degradation - do not disrupt tool execution
81
- }
82
- }
83
-
84
- const eventHandler = async ({ event }: { event: { type: string; properties?: unknown } }) => {
85
- const props = event.properties as Record<string, unknown> | undefined
86
-
87
- if (event.type === "session.deleted") {
88
- const sessionInfo = props?.info as { id?: string } | undefined
89
- if (sessionInfo?.id) {
90
- remindedSessions.delete(sessionInfo.id)
91
- }
92
- }
93
- }
94
-
95
- return {
96
- "tool.execute.after": toolExecuteAfter,
97
- event: eventHandler,
98
- }
99
- }
@@ -1,119 +0,0 @@
1
- import { describe, expect, it } from "bun:test"
2
- import {
3
- DELEGATE_TASK_ERROR_PATTERNS,
4
- detectDelegateTaskError,
5
- buildRetryGuidance,
6
- } from "./index"
7
-
8
- describe("sisyphus-task-retry", () => {
9
- describe("DELEGATE_TASK_ERROR_PATTERNS", () => {
10
- // #given error patterns are defined
11
- // #then should include all known delegate_task error types
12
- it("should contain all known error patterns", () => {
13
- expect(DELEGATE_TASK_ERROR_PATTERNS.length).toBeGreaterThan(5)
14
-
15
- const patternTexts = DELEGATE_TASK_ERROR_PATTERNS.map(p => p.pattern)
16
- expect(patternTexts).toContain("run_in_background")
17
- expect(patternTexts).toContain("skills")
18
- expect(patternTexts).toContain("category OR subagent_type")
19
- expect(patternTexts).toContain("Unknown category")
20
- expect(patternTexts).toContain("Unknown agent")
21
- })
22
- })
23
-
24
- describe("detectDelegateTaskError", () => {
25
- // #given tool output with run_in_background error
26
- // #when detecting error
27
- // #then should return matching error info
28
- it("should detect run_in_background missing error", () => {
29
- const output = "❌ Invalid arguments: 'run_in_background' parameter is REQUIRED. Use run_in_background=false for task delegation."
30
-
31
- const result = detectDelegateTaskError(output)
32
-
33
- expect(result).not.toBeNull()
34
- expect(result?.errorType).toBe("missing_run_in_background")
35
- })
36
-
37
- it("should detect skills missing error", () => {
38
- const output = "❌ Invalid arguments: 'skills' parameter is REQUIRED. Use skills=[] if no skills needed."
39
-
40
- const result = detectDelegateTaskError(output)
41
-
42
- expect(result).not.toBeNull()
43
- expect(result?.errorType).toBe("missing_skills")
44
- })
45
-
46
- it("should detect category/subagent mutual exclusion error", () => {
47
- const output = "❌ Invalid arguments: Provide EITHER category OR subagent_type, not both."
48
-
49
- const result = detectDelegateTaskError(output)
50
-
51
- expect(result).not.toBeNull()
52
- expect(result?.errorType).toBe("mutual_exclusion")
53
- })
54
-
55
- it("should detect unknown category error", () => {
56
- const output = '❌ Unknown category: "invalid-cat". Available: visual-engineering, ultrabrain, quick'
57
-
58
- const result = detectDelegateTaskError(output)
59
-
60
- expect(result).not.toBeNull()
61
- expect(result?.errorType).toBe("unknown_category")
62
- })
63
-
64
- it("should detect unknown agent error", () => {
65
- const output = '❌ Unknown agent: "fake-agent". Available agents: explore, librarian, oracle'
66
-
67
- const result = detectDelegateTaskError(output)
68
-
69
- expect(result).not.toBeNull()
70
- expect(result?.errorType).toBe("unknown_agent")
71
- })
72
-
73
- it("should return null for successful output", () => {
74
- const output = "Background task launched.\n\nTask ID: bg_12345\nSession ID: ses_abc"
75
-
76
- const result = detectDelegateTaskError(output)
77
-
78
- expect(result).toBeNull()
79
- })
80
- })
81
-
82
- describe("buildRetryGuidance", () => {
83
- // #given detected error
84
- // #when building retry guidance
85
- // #then should return actionable fix instructions
86
- it("should provide fix for missing run_in_background", () => {
87
- const errorInfo = { errorType: "missing_run_in_background", originalOutput: "" }
88
-
89
- const guidance = buildRetryGuidance(errorInfo)
90
-
91
- expect(guidance).toContain("run_in_background")
92
- expect(guidance).toContain("REQUIRED")
93
- })
94
-
95
- it("should provide fix for unknown category with available list", () => {
96
- const errorInfo = {
97
- errorType: "unknown_category",
98
- originalOutput: '❌ Unknown category: "bad". Available: visual-engineering, ultrabrain'
99
- }
100
-
101
- const guidance = buildRetryGuidance(errorInfo)
102
-
103
- expect(guidance).toContain("visual-engineering")
104
- expect(guidance).toContain("ultrabrain")
105
- })
106
-
107
- it("should provide fix for unknown agent with available list", () => {
108
- const errorInfo = {
109
- errorType: "unknown_agent",
110
- originalOutput: '❌ Unknown agent: "fake". Available agents: explore, oracle'
111
- }
112
-
113
- const guidance = buildRetryGuidance(errorInfo)
114
-
115
- expect(guidance).toContain("explore")
116
- expect(guidance).toContain("oracle")
117
- })
118
- })
119
- })
@@ -1,136 +0,0 @@
1
- import type { PluginInput } from "@opencode-ai/plugin"
2
-
3
- export interface DelegateTaskErrorPattern {
4
- pattern: string
5
- errorType: string
6
- fixHint: string
7
- }
8
-
9
- export const DELEGATE_TASK_ERROR_PATTERNS: DelegateTaskErrorPattern[] = [
10
- {
11
- pattern: "run_in_background",
12
- errorType: "missing_run_in_background",
13
- fixHint: "Add run_in_background=false (for delegation) or run_in_background=true (for parallel exploration)",
14
- },
15
- {
16
- pattern: "skills",
17
- errorType: "missing_skills",
18
- fixHint: "Add skills=[] parameter (empty array if no skills needed)",
19
- },
20
- {
21
- pattern: "category OR subagent_type",
22
- errorType: "mutual_exclusion",
23
- fixHint: "Provide ONLY one of: category (e.g., 'general', 'quick') OR subagent_type (e.g., 'oracle', 'explore')",
24
- },
25
- {
26
- pattern: "Must provide either category or subagent_type",
27
- errorType: "missing_category_or_agent",
28
- fixHint: "Add either category='general' OR subagent_type='explore'",
29
- },
30
- {
31
- pattern: "Unknown category",
32
- errorType: "unknown_category",
33
- fixHint: "Use a valid category from the Available list in the error message",
34
- },
35
- {
36
- pattern: "Agent name cannot be empty",
37
- errorType: "empty_agent",
38
- fixHint: "Provide a non-empty subagent_type value",
39
- },
40
- {
41
- pattern: "Unknown agent",
42
- errorType: "unknown_agent",
43
- fixHint: "Use a valid agent from the Available agents list in the error message",
44
- },
45
- {
46
- pattern: "Cannot call primary agent",
47
- errorType: "primary_agent",
48
- fixHint: "Primary agents cannot be called via delegate_task. Use a subagent like 'explore', 'oracle', or 'librarian'",
49
- },
50
- {
51
- pattern: "Skills not found",
52
- errorType: "unknown_skills",
53
- fixHint: "Use valid skill names from the Available list in the error message",
54
- },
55
- ]
56
-
57
- export interface DetectedError {
58
- errorType: string
59
- originalOutput: string
60
- }
61
-
62
- export function detectDelegateTaskError(output: string): DetectedError | null {
63
- if (!output.includes("❌")) return null
64
-
65
- for (const errorPattern of DELEGATE_TASK_ERROR_PATTERNS) {
66
- if (output.includes(errorPattern.pattern)) {
67
- return {
68
- errorType: errorPattern.errorType,
69
- originalOutput: output,
70
- }
71
- }
72
- }
73
-
74
- return null
75
- }
76
-
77
- function extractAvailableList(output: string): string | null {
78
- const availableMatch = output.match(/Available[^:]*:\s*(.+)$/m)
79
- return availableMatch ? availableMatch[1].trim() : null
80
- }
81
-
82
- export function buildRetryGuidance(errorInfo: DetectedError): string {
83
- const pattern = DELEGATE_TASK_ERROR_PATTERNS.find(
84
- (p) => p.errorType === errorInfo.errorType
85
- )
86
-
87
- if (!pattern) {
88
- return `[delegate_task ERROR] Fix the error and retry with correct parameters.`
89
- }
90
-
91
- let guidance = `
92
- [delegate_task CALL FAILED - IMMEDIATE RETRY REQUIRED]
93
-
94
- **Error Type**: ${errorInfo.errorType}
95
- **Fix**: ${pattern.fixHint}
96
- `
97
-
98
- const availableList = extractAvailableList(errorInfo.originalOutput)
99
- if (availableList) {
100
- guidance += `\n**Available Options**: ${availableList}\n`
101
- }
102
-
103
- guidance += `
104
- **Action**: Retry delegate_task NOW with corrected parameters.
105
-
106
- Example of CORRECT call:
107
- \`\`\`
108
- delegate_task(
109
- description="Task description",
110
- prompt="Detailed prompt...",
111
- category="unspecified-low", // OR subagent_type="explore"
112
- run_in_background=false,
113
- skills=[]
114
- )
115
- \`\`\`
116
- `
117
-
118
- return guidance
119
- }
120
-
121
- export function createDelegateTaskRetryHook(_ctx: PluginInput) {
122
- return {
123
- "tool.execute.after": async (
124
- input: { tool: string; sessionID: string; callID: string },
125
- output: { title: string; output: string; metadata: unknown }
126
- ) => {
127
- if (input.tool.toLowerCase() !== "delegate_task") return
128
-
129
- const errorInfo = detectDelegateTaskError(output.output)
130
- if (errorInfo) {
131
- const guidance = buildRetryGuidance(errorInfo)
132
- output.output += `\n${guidance}`
133
- }
134
- },
135
- }
136
- }
@@ -1,9 +0,0 @@
1
- import { join } from "node:path";
2
- import { getOpenCodeStorageDir } from "../../shared/data-path";
3
-
4
- export const OPENCODE_STORAGE = getOpenCodeStorageDir();
5
- export const AGENTS_INJECTOR_STORAGE = join(
6
- OPENCODE_STORAGE,
7
- "directory-agents",
8
- );
9
- export const AGENTS_FILENAME = "AGENTS.md";
@@ -1,182 +0,0 @@
1
- import type { PluginInput } from "@opencode-ai/plugin";
2
- import { existsSync, readFileSync } from "node:fs";
3
- import { dirname, join, resolve } from "node:path";
4
- import {
5
- loadInjectedPaths,
6
- saveInjectedPaths,
7
- clearInjectedPaths,
8
- } from "./storage";
9
- import { AGENTS_FILENAME } from "./constants";
10
- import { createDynamicTruncator } from "../../shared/dynamic-truncator";
11
-
12
- interface ToolExecuteInput {
13
- tool: string;
14
- sessionID: string;
15
- callID: string;
16
- }
17
-
18
- interface ToolExecuteOutput {
19
- title: string;
20
- output: string;
21
- metadata: unknown;
22
- }
23
-
24
- interface ToolExecuteBeforeOutput {
25
- args: unknown;
26
- }
27
-
28
- interface BatchToolCall {
29
- tool: string;
30
- parameters: Record<string, unknown>;
31
- }
32
-
33
- interface EventInput {
34
- event: {
35
- type: string;
36
- properties?: unknown;
37
- };
38
- }
39
-
40
- export function createDirectoryAgentsInjectorHook(ctx: PluginInput) {
41
- const sessionCaches = new Map<string, Set<string>>();
42
- const pendingBatchReads = new Map<string, string[]>();
43
- const truncator = createDynamicTruncator(ctx);
44
-
45
- function getSessionCache(sessionID: string): Set<string> {
46
- if (!sessionCaches.has(sessionID)) {
47
- sessionCaches.set(sessionID, loadInjectedPaths(sessionID));
48
- }
49
- return sessionCaches.get(sessionID)!;
50
- }
51
-
52
- function resolveFilePath(path: string): string | null {
53
- if (!path) return null;
54
- if (path.startsWith("/")) return path;
55
- return resolve(ctx.directory, path);
56
- }
57
-
58
- function findAgentsMdUp(startDir: string): string[] {
59
- const found: string[] = [];
60
- let current = startDir;
61
-
62
- while (true) {
63
- // Skip root AGENTS.md - OpenCode's system.ts already loads it via custom()
64
- // See: https://github.com/code-yeongyu/oh-my-opencode/issues/379
65
- const isRootDir = current === ctx.directory;
66
- if (!isRootDir) {
67
- const agentsPath = join(current, AGENTS_FILENAME);
68
- if (existsSync(agentsPath)) {
69
- found.push(agentsPath);
70
- }
71
- }
72
-
73
- if (isRootDir) break;
74
- const parent = dirname(current);
75
- if (parent === current) break;
76
- if (!parent.startsWith(ctx.directory)) break;
77
- current = parent;
78
- }
79
-
80
- return found.reverse();
81
- }
82
-
83
- async function processFilePathForInjection(
84
- filePath: string,
85
- sessionID: string,
86
- output: ToolExecuteOutput,
87
- ): Promise<void> {
88
- const resolved = resolveFilePath(filePath);
89
- if (!resolved) return;
90
-
91
- const dir = dirname(resolved);
92
- const cache = getSessionCache(sessionID);
93
- const agentsPaths = findAgentsMdUp(dir);
94
-
95
- for (const agentsPath of agentsPaths) {
96
- const agentsDir = dirname(agentsPath);
97
- if (cache.has(agentsDir)) continue;
98
-
99
- try {
100
- const content = readFileSync(agentsPath, "utf-8");
101
- const { result, truncated } = await truncator.truncate(sessionID, content);
102
- const truncationNotice = truncated
103
- ? `\n\n[Note: Content was truncated to save context window space. For full context, please read the file directly: ${agentsPath}]`
104
- : "";
105
- output.output += `\n\n[Directory Context: ${agentsPath}]\n${result}${truncationNotice}`;
106
- cache.add(agentsDir);
107
- } catch {}
108
- }
109
-
110
- saveInjectedPaths(sessionID, cache);
111
- }
112
-
113
- const toolExecuteBefore = async (
114
- input: ToolExecuteInput,
115
- output: ToolExecuteBeforeOutput,
116
- ) => {
117
- if (input.tool.toLowerCase() !== "batch") return;
118
-
119
- const args = output.args as { tool_calls?: BatchToolCall[] } | undefined;
120
- if (!args?.tool_calls) return;
121
-
122
- const readFilePaths: string[] = [];
123
- for (const call of args.tool_calls) {
124
- if (call.tool.toLowerCase() === "read" && call.parameters?.filePath) {
125
- readFilePaths.push(call.parameters.filePath as string);
126
- }
127
- }
128
-
129
- if (readFilePaths.length > 0) {
130
- pendingBatchReads.set(input.callID, readFilePaths);
131
- }
132
- };
133
-
134
- const toolExecuteAfter = async (
135
- input: ToolExecuteInput,
136
- output: ToolExecuteOutput,
137
- ) => {
138
- const toolName = input.tool.toLowerCase();
139
-
140
- if (toolName === "read") {
141
- await processFilePathForInjection(output.title, input.sessionID, output);
142
- return;
143
- }
144
-
145
- if (toolName === "batch") {
146
- const filePaths = pendingBatchReads.get(input.callID);
147
- if (filePaths) {
148
- for (const filePath of filePaths) {
149
- await processFilePathForInjection(filePath, input.sessionID, output);
150
- }
151
- pendingBatchReads.delete(input.callID);
152
- }
153
- }
154
- };
155
-
156
- const eventHandler = async ({ event }: EventInput) => {
157
- const props = event.properties as Record<string, unknown> | undefined;
158
-
159
- if (event.type === "session.deleted") {
160
- const sessionInfo = props?.info as { id?: string } | undefined;
161
- if (sessionInfo?.id) {
162
- sessionCaches.delete(sessionInfo.id);
163
- clearInjectedPaths(sessionInfo.id);
164
- }
165
- }
166
-
167
- if (event.type === "session.compacted") {
168
- const sessionID = (props?.sessionID ??
169
- (props?.info as { id?: string } | undefined)?.id) as string | undefined;
170
- if (sessionID) {
171
- sessionCaches.delete(sessionID);
172
- clearInjectedPaths(sessionID);
173
- }
174
- }
175
- };
176
-
177
- return {
178
- "tool.execute.before": toolExecuteBefore,
179
- "tool.execute.after": toolExecuteAfter,
180
- event: eventHandler,
181
- };
182
- }
@@ -1,48 +0,0 @@
1
- import {
2
- existsSync,
3
- mkdirSync,
4
- readFileSync,
5
- writeFileSync,
6
- unlinkSync,
7
- } from "node:fs";
8
- import { join } from "node:path";
9
- import { AGENTS_INJECTOR_STORAGE } from "./constants";
10
- import type { InjectedPathsData } from "./types";
11
-
12
- function getStoragePath(sessionID: string): string {
13
- return join(AGENTS_INJECTOR_STORAGE, `${sessionID}.json`);
14
- }
15
-
16
- export function loadInjectedPaths(sessionID: string): Set<string> {
17
- const filePath = getStoragePath(sessionID);
18
- if (!existsSync(filePath)) return new Set();
19
-
20
- try {
21
- const content = readFileSync(filePath, "utf-8");
22
- const data: InjectedPathsData = JSON.parse(content);
23
- return new Set(data.injectedPaths);
24
- } catch {
25
- return new Set();
26
- }
27
- }
28
-
29
- export function saveInjectedPaths(sessionID: string, paths: Set<string>): void {
30
- if (!existsSync(AGENTS_INJECTOR_STORAGE)) {
31
- mkdirSync(AGENTS_INJECTOR_STORAGE, { recursive: true });
32
- }
33
-
34
- const data: InjectedPathsData = {
35
- sessionID,
36
- injectedPaths: [...paths],
37
- updatedAt: Date.now(),
38
- };
39
-
40
- writeFileSync(getStoragePath(sessionID), JSON.stringify(data, null, 2));
41
- }
42
-
43
- export function clearInjectedPaths(sessionID: string): void {
44
- const filePath = getStoragePath(sessionID);
45
- if (existsSync(filePath)) {
46
- unlinkSync(filePath);
47
- }
48
- }
@@ -1,5 +0,0 @@
1
- export interface InjectedPathsData {
2
- sessionID: string;
3
- injectedPaths: string[];
4
- updatedAt: number;
5
- }
@@ -1,9 +0,0 @@
1
- import { join } from "node:path";
2
- import { getOpenCodeStorageDir } from "../../shared/data-path";
3
-
4
- export const OPENCODE_STORAGE = getOpenCodeStorageDir();
5
- export const README_INJECTOR_STORAGE = join(
6
- OPENCODE_STORAGE,
7
- "directory-readme",
8
- );
9
- export const README_FILENAME = "README.md";