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
package/index.ts CHANGED
@@ -347,9 +347,11 @@ async function ensureRepoAvailable(
347
347
  const repoPath = join(cacheDir, owner, repo)
348
348
  const url = buildGitUrl(owner, repo, useHttps)
349
349
 
350
+ let actualBranch = branch
350
351
  try {
351
352
  await withManifestLock(async () => {
352
- await cloneRepo(url, repoPath, { branch })
353
+ const cloneResult = await cloneRepo(url, repoPath, { branch })
354
+ actualBranch = cloneResult.branch
353
355
 
354
356
  const now = new Date().toISOString()
355
357
  const updatedManifest = await loadManifest()
@@ -359,7 +361,7 @@ async function ensureRepoAvailable(
359
361
  clonedAt: now,
360
362
  lastAccessed: now,
361
363
  lastUpdated: now,
362
- currentBranch: branch,
364
+ currentBranch: actualBranch,
363
365
  shallow: true,
364
366
  }
365
367
  await saveManifest(updatedManifest)
@@ -371,7 +373,7 @@ async function ensureRepoAvailable(
371
373
 
372
374
  return {
373
375
  repoPath,
374
- branch,
376
+ branch: actualBranch,
375
377
  type: "cached",
376
378
  }
377
379
  }
@@ -988,8 +990,10 @@ When user mentions another project or asks about external code:
988
990
  } catch {}
989
991
  }
990
992
 
993
+ let actualBranch = branch
991
994
  try {
992
- await cloneRepo(url, destPath, { branch })
995
+ const cloneResult = await cloneRepo(url, destPath, { branch })
996
+ actualBranch = cloneResult.branch
993
997
  } catch (error) {
994
998
  const message =
995
999
  error instanceof Error ? error.message : String(error)
@@ -1003,7 +1007,7 @@ When user mentions another project or asks about external code:
1003
1007
  clonedAt: now,
1004
1008
  lastAccessed: now,
1005
1009
  lastUpdated: now,
1006
- currentBranch: branch,
1010
+ currentBranch: actualBranch,
1007
1011
  shallow: true,
1008
1012
  }
1009
1013
  manifest.repos[repoKey] = entry
@@ -1012,7 +1016,7 @@ When user mentions another project or asks about external code:
1012
1016
 
1013
1017
  return {
1014
1018
  path: destPath,
1015
- branch,
1019
+ branch: actualBranch,
1016
1020
  status: "cloned" as const,
1017
1021
  alreadyExists: false,
1018
1022
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-repos",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Repository cache, registry, and cross-codebase intelligence for OpenCode agents",
5
5
  "main": "index.ts",
6
6
  "type": "module",
@@ -8,6 +8,7 @@ import {
8
8
  cloneRepo,
9
9
  updateRepo,
10
10
  getRepoInfo,
11
+ getRemoteDefaultBranch,
11
12
  } from "../git"
12
13
 
13
14
  describe("parseRepoSpec", () => {
@@ -90,6 +91,22 @@ describe("buildGitUrl", () => {
90
91
  })
91
92
  })
92
93
 
94
+ describe("getRemoteDefaultBranch", () => {
95
+ test("returns default branch for a public repo", async () => {
96
+ const branch = await getRemoteDefaultBranch(
97
+ "https://github.com/octocat/Hello-World.git"
98
+ )
99
+ expect(branch).toBe("master")
100
+ })
101
+
102
+ test("returns null for nonexistent repo", async () => {
103
+ const branch = await getRemoteDefaultBranch(
104
+ "https://github.com/nonexistent-user-12345/nonexistent-repo-67890.git"
105
+ )
106
+ expect(branch).toBeNull()
107
+ })
108
+ })
109
+
93
110
  describe("git operations (integration)", () => {
94
111
  const testDir = join(tmpdir(), `opencode-repos-test-${Date.now()}`)
95
112
  const repoPath = join(testDir, "test-repo")
@@ -102,13 +119,14 @@ describe("git operations (integration)", () => {
102
119
  await rm(testDir, { recursive: true, force: true })
103
120
  })
104
121
 
105
- test("cloneRepo clones a public repository", async () => {
106
- await cloneRepo(
122
+ test("cloneRepo clones a public repository and returns branch", async () => {
123
+ const result = await cloneRepo(
107
124
  "https://github.com/octocat/Hello-World.git",
108
125
  repoPath,
109
126
  { branch: "master" }
110
127
  )
111
128
 
129
+ expect(result.branch).toBe("master")
112
130
  const exists = await Bun.file(join(repoPath, ".git/config")).exists()
113
131
  expect(exists).toBe(true)
114
132
  })
@@ -143,4 +161,17 @@ describe("git operations (integration)", () => {
143
161
  expect(exists).toBe(false)
144
162
  }
145
163
  })
164
+
165
+ test("cloneRepo falls back to actual default branch when main does not exist", async () => {
166
+ const fallbackPath = join(testDir, "fallback-repo")
167
+
168
+ const result = await cloneRepo(
169
+ "https://github.com/octocat/Hello-World.git",
170
+ fallbackPath
171
+ )
172
+
173
+ expect(result.branch).toBe("master")
174
+ const exists = await Bun.file(join(fallbackPath, ".git/config")).exists()
175
+ expect(exists).toBe(true)
176
+ })
146
177
  })
package/src/git.ts CHANGED
@@ -58,20 +58,47 @@ export function buildGitUrl(owner: string, repo: string, useHttps: boolean = fal
58
58
  return `git@github.com:${owner}/${repo}.git`
59
59
  }
60
60
 
61
+ export async function getRemoteDefaultBranch(url: string): Promise<string | null> {
62
+ try {
63
+ const output = await $`git ls-remote --symref ${url} HEAD`.text()
64
+ const match = output.match(/ref: refs\/heads\/(\S+)\s+HEAD/)
65
+ return match?.[1] ?? null
66
+ } catch {
67
+ return null
68
+ }
69
+ }
70
+
61
71
  export async function cloneRepo(
62
72
  url: string,
63
73
  destPath: string,
64
74
  options: CloneOptions = {}
65
- ): Promise<void> {
66
- const branch = options.branch || "main"
75
+ ): Promise<{ branch: string }> {
76
+ const requestedBranch = options.branch || "main"
67
77
 
68
78
  try {
69
- await $`git clone --depth=1 --branch ${branch} --config core.hooksPath=/dev/null ${url} ${destPath}`.quiet()
70
- } catch (error) {
79
+ await $`git clone --depth=1 --branch ${requestedBranch} --config core.hooksPath=/dev/null ${url} ${destPath}`.quiet()
80
+ return { branch: requestedBranch }
81
+ } catch (firstError) {
71
82
  try {
72
83
  await rm(destPath, { recursive: true, force: true })
73
84
  } catch {}
74
- throw error
85
+
86
+ if (!options.branch) {
87
+ const defaultBranch = await getRemoteDefaultBranch(url)
88
+ if (defaultBranch && defaultBranch !== requestedBranch) {
89
+ try {
90
+ await $`git clone --depth=1 --branch ${defaultBranch} --config core.hooksPath=/dev/null ${url} ${destPath}`.quiet()
91
+ return { branch: defaultBranch }
92
+ } catch (secondError) {
93
+ try {
94
+ await rm(destPath, { recursive: true, force: true })
95
+ } catch {}
96
+ throw secondError
97
+ }
98
+ }
99
+ }
100
+
101
+ throw firstError
75
102
  }
76
103
  }
77
104
 
@@ -1,8 +0,0 @@
1
- {
2
- "active_plan": "/Users/liamvinberg/personal/projects/opencode-repos/.sisyphus/plans/opencode-repos.md",
3
- "started_at": "2026-01-20T14:19:14.152Z",
4
- "session_ids": [
5
- "ses_42439dcabffexjguXrkWPjNecT"
6
- ],
7
- "plan_name": "opencode-repos"
8
- }
@@ -1,15 +0,0 @@
1
- # Decisions - opencode-repos
2
-
3
- ## Task 0: Project Setup
4
-
5
- ### Placeholder Test File
6
- **Decision**: Created `src/__tests__/setup.test.ts` with a trivial passing test.
7
- **Rationale**: `bun test` exits with code 1 when no tests found, which would fail verification. A placeholder ensures clean test runs during development.
8
-
9
- ### tsconfig.json Pattern
10
- **Decision**: Followed opencode-tmux tsconfig exactly rather than bun init default.
11
- **Rationale**: Consistency with existing plugin ecosystem. The tmux pattern is proven to work with OpenCode plugin system.
12
-
13
- ### Directory Structure
14
- **Decision**: Using `src/` directory for modules rather than flat structure.
15
- **Rationale**: Plan specifies src/ directory. Allows separation of implementation from root-level plugin entry point.
@@ -1,384 +0,0 @@
1
- # Learnings - opencode-repos
2
-
3
- ## Task 0: Project Setup
4
-
5
- ### Plugin Version Discovery
6
- - @opencode-ai/plugin does not have version 0.0.1
7
- - Earliest version is 1.1.x series
8
- - tmux plugin pattern: peerDependencies uses `*`, devDependencies uses `^1.1.25`
9
-
10
- ### Bun Test Behavior
11
- - `bun test` exits with code 1 when no test files found
12
- - Need at least one placeholder test for clean CI/verification
13
- - Test file pattern: `**{.test,.spec,_test_,_spec_}.{js,ts,jsx,tsx}`
14
-
15
- ### tsconfig.json
16
- - Bun init creates tsconfig with comments (invalid JSON for some tools)
17
- - Replaced with clean JSON matching tmux plugin pattern
18
- - Key settings: ES2022 target, ESNext module, bundler moduleResolution
19
-
20
- ## Task 1: Manifest Types and Operations
21
-
22
- ### Atomic File Writes
23
- - Pattern: write to .tmp file, then rename (atomic at OS level)
24
- - `fs.rename()` is atomic on POSIX systems
25
- - Prevents partial writes from corrupting manifest
26
-
27
- ### File Locking Pattern
28
- - Manual lock file approach works well with Bun
29
- - Check lock existence, check staleness (>5 min), create lock, execute, release
30
- - Use `stat().mtimeMs` to check lock age
31
- - Stale lock detection prevents deadlocks from crashed processes
32
-
33
- ### Bun File APIs
34
- - `Bun.file(path).exists()` for existence check
35
- - `Bun.file(path).text()` for reading
36
- - `Bun.write(path, content)` for writing
37
- - `Bun.sleep(ms)` for delays in lock retry loop
38
-
39
- ### Test Isolation
40
- - Tests modify real cache dir (~/.cache/opencode-repos)
41
- - Use beforeEach/afterEach to clean up
42
- - `rm(path, { recursive: true, force: true })` for cleanup
43
-
44
- ### Graceful Error Handling
45
- - Missing manifest: return empty, don't throw
46
- - Corrupted JSON: log warning, return empty
47
- - Lock acquisition failure: throw after max attempts
48
-
49
- ## Task 2: Git Operations Module
50
-
51
- ### Bun Shell Execution
52
- - Import `$` from "bun" for shell commands
53
- - Use `.quiet()` to suppress stdout/stderr output
54
- - Use `.text()` to get string output from commands
55
- - Pattern: `await $\`git command\`.quiet()` for silent execution
56
-
57
- ### Git Clone Flags
58
- - `--depth=1`: Shallow clone (single commit)
59
- - `--single-branch`: Only fetch specified branch
60
- - `--branch ${branch}`: Specify branch to clone
61
- - `--config core.hooksPath=/dev/null`: Disable git hooks
62
-
63
- ### Git Directory Operations
64
- - Use `-C ${path}` to run git commands in a specific directory
65
- - Avoids need to change working directory
66
-
67
- ### Cleanup on Failure
68
- - Wrap clone in try/catch
69
- - On failure, remove destination directory with `rm(destPath, { recursive: true, force: true })`
70
- - Nested try/catch for cleanup to ignore cleanup errors
71
-
72
- ### Repo Spec Parsing
73
- - Format: "owner/repo" or "owner/repo@branch"
74
- - Split on "@" first for branch extraction
75
- - Split on "/" for owner/repo
76
- - Branch can contain "/" (e.g., "feature/my-branch")
77
- - Validate: owner and repo must not be empty
78
-
79
- ### Integration Testing
80
- - Use `tmpdir()` for test directories
81
- - Use `beforeAll`/`afterAll` for setup/teardown
82
- - GitHub's octocat/Hello-World is a good public test repo
83
- - Commit hashes match pattern `/^[a-f0-9]{40}$/`
84
-
85
- ## Task 3: Plugin Export and repo_clone Tool
86
-
87
- ### Plugin Export Pattern
88
- - Import `Plugin` type and `tool` from "@opencode-ai/plugin"
89
- - Plugin is an async function returning object with `tool` property
90
- - Tools are defined using `tool({ description, args, execute })`
91
- - Export both named (`OpencodeRepos`) and default export
92
-
93
- ### Tool Schema Pattern
94
- - Use `tool.schema.string()`, `tool.schema.boolean()` for arg types
95
- - Chain `.optional()`, `.default(value)`, `.describe()` for metadata
96
- - Args are automatically validated before execute() is called
97
-
98
- ### Smart Clone Flow
99
- - Check manifest first (within lock) for existing entry
100
- - If cached and not force: update lastAccessed, return path
101
- - If force: delete existing directory before clone
102
- - Clone to `~/.cache/opencode-repos/{owner}/{repo}@{branch}/`
103
- - Update manifest with new entry after successful clone
104
-
105
- ### Error Handling in Tools
106
- - Wrap error messages: `error instanceof Error ? error.message : String(error)`
107
- - Throw descriptive errors with repo context
108
- - Return markdown-formatted success messages
109
-
110
- ### Manifest Locking
111
- - All manifest read/write operations wrapped in `withManifestLock()`
112
- - Ensures concurrent clone operations don't corrupt manifest
113
- - Lock is released even if operation throws
114
-
115
- ## Task 4: repo_list Tool
116
-
117
- ### List Tool Pattern
118
- - Reference: opencode-tmux tmux_list tool (lines 414-471)
119
- - Use enum schema for filtering: `tool.schema.enum(["all", "cached", "local"])`
120
- - Return markdown-formatted output with tables
121
-
122
- ### Markdown Table Output
123
- - Header row with column names
124
- - Separator row with dashes
125
- - Data rows with pipe-separated values
126
- - Summary line at end with counts
127
-
128
- ### Repo Key Parsing
129
- - Keys stored as "owner/repo@branch"
130
- - Extract repo name: `repoKey.substring(0, repoKey.lastIndexOf("@"))`
131
- - Branch available from entry.defaultBranch
132
-
133
- ### Size Formatting
134
- - sizeBytes may not exist (local repos don't track size yet)
135
- - Format as MB: `Math.round(entry.sizeBytes / 1024 / 1024)`
136
- - Show "-" if sizeBytes undefined
137
-
138
- ### Filtering Logic
139
- - Object.entries() to iterate manifest.repos
140
- - Filter by entry.type matching args.type
141
- - "all" type returns everything
142
-
143
- ## Task 5: repo_read Tool
144
-
145
- ### Glob Pattern Support
146
- - Use `glob` npm package (v10.x) for file pattern matching
147
- - Check for `*` or `?` in path to determine if glob needed
148
- - `glob(pattern, { nodir: true })` returns only files, not directories
149
- - Single file paths work without glob
150
-
151
- ### File Reading Pattern
152
- - Use `readFile(path, "utf-8")` from node:fs/promises
153
- - Split content by newlines for line counting
154
- - Truncate at maxLines with `[truncated at N lines, M total]` message
155
- - Handle errors per-file to continue reading other files
156
-
157
- ### Relative Path Display
158
- - Store repoPath from manifest entry
159
- - Calculate relative: `filePath.replace(repoPath + "/", "")`
160
- - Display relative paths in output for readability
161
-
162
- ### Manifest Update After Read
163
- - Update lastAccessed timestamp after successful read
164
- - Use withManifestLock for atomic update
165
- - Re-load manifest inside lock to avoid stale data
166
-
167
- ### Error Handling
168
- - Repo not found: Return helpful message with repo_clone suggestion
169
- - No files found: Return message with the pattern that failed
170
- - File read error: Include in output but continue with other files
171
-
172
- ## Task 6: Scanner Module
173
-
174
- ### fd Command for Git Discovery
175
- - `fd -H -t d '^.git$' --max-depth 4 ${searchPath}` finds all .git directories
176
- - `-H`: Include hidden files/dirs (required since .git is hidden)
177
- - `-t d`: Type directory only
178
- - `'^.git$'`: Regex for exact match ".git"
179
- - `--max-depth 4`: Limit depth to avoid deep nested structures
180
-
181
- ### Remote URL Parsing
182
- - SSH format: `git@github.com:owner/repo.git` -> extract with regex `/git@github\.com:(.+)/`
183
- - HTTPS format: `https://github.com/owner/repo.git` -> extract with regex `/https:\/\/github\.com\/(.+)/`
184
- - Remove `.git` suffix first with `.replace(/\.git$/, "")`
185
- - Return null for unsupported formats (GitLab, Bitbucket, etc.)
186
-
187
- ### Graceful Error Handling
188
- - Invalid search path: catch and continue to next path
189
- - Repo without remote: catch git error and continue
190
- - Repo with git errors: catch and continue
191
- - No repos found: return empty array (not an error)
192
-
193
- ### Git Commands for Repo Info
194
- - `git -C ${repoPath} remote get-url origin`: Get remote URL
195
- - `git -C ${repoPath} branch --show-current`: Get current branch
196
- - Default to "main" if branch is empty (detached HEAD state)
197
-
198
- ## Task 7: repo_scan Tool
199
-
200
- ### Config Loading Pattern
201
- - Config file location: `~/.config/opencode/opencode-repos.json`
202
- - Use `existsSync()` to check file existence before reading
203
- - Parse JSON with try/catch, return null on failure
204
- - Config interface: `{ localSearchPaths: string[] }`
205
-
206
- ### Tool Args Override Pattern
207
- - Accept optional `paths` array argument
208
- - If provided, use args.paths directly
209
- - If not provided, fall back to config file
210
- - If neither available, return helpful error with config file example
211
-
212
- ### Manifest Update for Local Repos
213
- - Local repos use `type: "local"` (vs `type: "cached"` for cloned)
214
- - Local repos have `shallow: false` (they're full clones)
215
- - Add to both `manifest.repos` and `manifest.localIndex`
216
- - `localIndex` maps remote URL to local path for quick lookups
217
-
218
- ### Repo Key Construction
219
- - Use `matchRemoteToSpec()` to convert remote URL to "owner/repo" format
220
- - Skip non-GitHub remotes (matchRemoteToSpec returns null)
221
- - Construct key as `${spec}@${branch}` to match cached repo format
222
- - Check for existing entry before adding to avoid duplicates
223
-
224
- ### Summary Output Format
225
- - Report total found, new registered, and already existing
226
- - Include helpful message about repo_list when new repos added
227
- - Handle zero repos found case with list of searched paths
228
-
229
- ## Task 8a: repo_update Tool
230
-
231
- ### Update vs Status Pattern
232
- - Cached repos: fetch + reset to update to latest
233
- - Local repos: show status only, never modify
234
- - Differentiate by `entry.type === "local"` check
235
-
236
- ### Git Update Commands
237
- - `updateRepo(path, branch)` from git module handles fetch + reset
238
- - `getRepoInfo(path)` returns commit hash for confirmation message
239
- - Commit hash truncated to 7 chars for display: `info.commit.substring(0, 7)`
240
-
241
- ### Git Status for Local Repos
242
- - Use `git -C ${path} status --short` for compact status
243
- - Empty output means working tree is clean
244
- - Display "Working tree clean" when status is empty
245
-
246
- ### Manifest Timestamp Updates
247
- - Update both `lastUpdated` and `lastAccessed` on successful update
248
- - Use `withManifestLock` for atomic manifest updates
249
- - Re-load manifest inside lock to avoid stale data
250
-
251
- ### Error Recovery Suggestions
252
- - Repo not found: suggest `repo_clone`
253
- - Update failed: suggest `repo_clone({ force: true })` to re-clone
254
- - Corrupted repos can be fixed by force re-clone
255
-
256
- ## Task 8b: repo_remove Tool
257
-
258
- ### Removal Behavior by Type
259
- - Cached repos: require confirmation, delete directory + unregister from manifest
260
- - Local repos: unregister only, preserve files on disk
261
- - Distinction prevents accidental deletion of user-managed repos
262
-
263
- ### Confirmation Pattern
264
- - Use `confirm: boolean` arg with default false
265
- - Without confirm: return message explaining what will happen
266
- - With confirm: proceed with deletion
267
- - Local repos don't need confirmation since files aren't deleted
268
-
269
- ### Manifest Cleanup for Local Repos
270
- - Delete from `manifest.repos[repoKey]`
271
- - Also delete from `manifest.localIndex` by finding matching path
272
- - Iterate localIndex entries to find remote URL that maps to entry.path
273
-
274
- ### Error Recovery on Delete Failure
275
- - If `rm()` fails, still try to unregister from manifest
276
- - Wrap manifest cleanup in nested try/catch to ignore cleanup errors
277
- - Return message noting manual cleanup may be needed
278
- - User can manually delete directory at the path shown
279
-
280
- ### rm() Options
281
- - `{ recursive: true, force: true }` for directory deletion
282
- - `force: true` prevents errors if directory doesn't exist
283
- - `recursive: true` required for non-empty directories
284
-
285
- ## Task 9: Define repo-explorer Agent
286
-
287
- ### AgentConfig Type Location
288
- - Import from `@opencode-ai/sdk` not `@opencode-ai/plugin`
289
- - Type defined in `node_modules/@opencode-ai/sdk/dist/gen/types.gen.d.ts`
290
- - v2 types have more permissions than v1 types
291
-
292
- ### AgentConfig Properties
293
- - `description`: When to use this agent (shown in agent selection)
294
- - `mode`: "subagent" | "primary" | "all" - subagent for spawned agents
295
- - `temperature`: 0.1 for focused, deterministic exploration
296
- - `permission`: Object with permission rules per tool category
297
- - `prompt`: System prompt defining agent behavior
298
-
299
- ### Permission Structure (v1 SDK)
300
- - Available permissions: `edit`, `bash`, `webfetch`, `doom_loop`, `external_directory`
301
- - Values: "ask" | "allow" | "deny"
302
- - `task` and `delegate_task` permissions NOT available in v1 SDK types
303
- - For read-only agent: `edit: "deny"` is sufficient
304
-
305
- ### System Prompt Best Practices
306
- - Clearly state agent capabilities
307
- - Define exploration approach (high-level to detailed)
308
- - Specify output format (file paths, code snippets, explanations)
309
- - State constraints explicitly (read-only, no modifications)
310
- - Include example questions the agent can answer
311
-
312
- ### Agent File Location
313
- - Created in `src/agents/` directory
314
- - Export function pattern: `createRepoExplorerAgent(): AgentConfig`
315
- - Function returns config object, not the agent itself
316
-
317
- ## Task 10: repo_explore Tool and Config Handler
318
-
319
- ### Plugin Config Handler Pattern
320
- - Plugin can return `config` function alongside `tool` object
321
- - Config handler receives OpenCode config object
322
- - Register agents by merging into `config.agent`: `config.agent = { ...config.agent, "name": agentConfig }`
323
- - Config handler runs before tools are available
324
-
325
- ### Agent Spawning via ctx.client
326
- - Tool execute function receives `ctx` as second parameter
327
- - `ctx.client.session.prompt()` spawns agent sessions
328
- - Body format: `{ agent: "agent-name", parts: [{ type: "text", text: prompt }] }`
329
- - Agent name must match what was registered in config handler
330
-
331
- ### Auto-Clone Pattern for repo_explore
332
- - Check manifest for existing repo entry
333
- - If not found, clone it first (reuse repo_clone logic inline)
334
- - Use same CACHE_DIR and manifest update pattern
335
- - Return helpful error if clone fails
336
-
337
- ### Exploration Prompt Structure
338
- - Include working directory path for agent context
339
- - State the question clearly
340
- - List available tools (read, glob, grep, bash)
341
- - Provide guidance on exploration approach
342
- - Agent's system prompt handles the rest
343
-
344
- ### Manifest Access Tracking
345
- - Update `lastAccessed` after successful exploration
346
- - Use `withManifestLock` for atomic update
347
- - Re-load manifest inside lock to avoid stale data
348
-
349
- ## Task 11: Documentation and Final Polish
350
-
351
- ### README Structure
352
- - Follow opencode-tmux README pattern for consistency
353
- - Include: Features, Installation, Quick Start, Configuration, Tools, Agent, Use Cases, Limitations, Development
354
- - Each tool section: description, arguments, examples, returns
355
- - Use TypeScript code blocks for examples
356
-
357
- ### package.json Keywords
358
- - Required keywords: opencode, opencode-plugin, repos, repository, cache, codebase
359
- - Keywords help with npm discoverability
360
- - Keep description concise but comprehensive
361
-
362
- ### Plugin API Learnings
363
- - `PluginInput` has `client` property for SDK access
364
- - `ToolContext` has `sessionID` for current session
365
- - `client.session.prompt()` requires `path.id` with session ID
366
- - Response handling: check `response.error`, extract text from `response.data.parts`
367
-
368
- ### Type Safety with SDK Response
369
- - Parts array contains various types (text, tool, file, etc.)
370
- - Filter by `p.type === "text"` to get text parts
371
- - Use `"text" in p` guard for safe property access
372
- - TypeScript type predicates need to match full Part type
373
-
374
- ### LSP vs tsc Discrepancies
375
- - LSP may show stale errors after file changes
376
- - Always verify with `bunx tsc --noEmit` as source of truth
377
- - tsc clean = code is correct, ignore stale LSP errors
378
-
379
- ### Project Completion Summary
380
- - 7 tools implemented: repo_clone, repo_list, repo_read, repo_scan, repo_update, repo_remove, repo_explore
381
- - 1 custom agent: repo-explorer (read-only codebase exploration)
382
- - 27 tests passing across 3 test files
383
- - Config file support for local search paths
384
- - Comprehensive README with examples for all tools