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,12 +0,0 @@
1
- export const HOOK_NAME = "auto-slash-command" as const
2
-
3
- export const AUTO_SLASH_COMMAND_TAG_OPEN = "<auto-slash-command>"
4
- export const AUTO_SLASH_COMMAND_TAG_CLOSE = "</auto-slash-command>"
5
-
6
- export const SLASH_COMMAND_PATTERN = /^\/([a-zA-Z][\w-]*)\s*(.*)/
7
-
8
- export const EXCLUDED_COMMANDS = new Set([
9
- "ralph-loop",
10
- "cancel-ralph",
11
- "ulw-loop",
12
- ])
@@ -1,296 +0,0 @@
1
- import { describe, expect, it } from "bun:test"
2
- import {
3
- parseSlashCommand,
4
- detectSlashCommand,
5
- isExcludedCommand,
6
- removeCodeBlocks,
7
- extractPromptText,
8
- } from "./detector"
9
-
10
- describe("auto-slash-command detector", () => {
11
- describe("removeCodeBlocks", () => {
12
- it("should remove markdown code blocks", () => {
13
- // #given text with code blocks
14
- const text = "Hello ```code here``` world"
15
-
16
- // #when removing code blocks
17
- const result = removeCodeBlocks(text)
18
-
19
- // #then code blocks should be removed
20
- expect(result).toBe("Hello world")
21
- })
22
-
23
- it("should remove multiline code blocks", () => {
24
- // #given text with multiline code blocks
25
- const text = `Before
26
- \`\`\`javascript
27
- /command-inside-code
28
- \`\`\`
29
- After`
30
-
31
- // #when removing code blocks
32
- const result = removeCodeBlocks(text)
33
-
34
- // #then code blocks should be removed
35
- expect(result).toContain("Before")
36
- expect(result).toContain("After")
37
- expect(result).not.toContain("/command-inside-code")
38
- })
39
-
40
- it("should handle text without code blocks", () => {
41
- // #given text without code blocks
42
- const text = "Just regular text"
43
-
44
- // #when removing code blocks
45
- const result = removeCodeBlocks(text)
46
-
47
- // #then text should remain unchanged
48
- expect(result).toBe("Just regular text")
49
- })
50
- })
51
-
52
- describe("parseSlashCommand", () => {
53
- it("should parse simple command without args", () => {
54
- // #given a simple slash command
55
- const text = "/commit"
56
-
57
- // #when parsing
58
- const result = parseSlashCommand(text)
59
-
60
- // #then should extract command correctly
61
- expect(result).not.toBeNull()
62
- expect(result?.command).toBe("commit")
63
- expect(result?.args).toBe("")
64
- })
65
-
66
- it("should parse command with arguments", () => {
67
- // #given a slash command with arguments
68
- const text = "/plan create a new feature for auth"
69
-
70
- // #when parsing
71
- const result = parseSlashCommand(text)
72
-
73
- // #then should extract command and args
74
- expect(result).not.toBeNull()
75
- expect(result?.command).toBe("plan")
76
- expect(result?.args).toBe("create a new feature for auth")
77
- })
78
-
79
- it("should parse command with quoted arguments", () => {
80
- // #given a slash command with quoted arguments
81
- const text = '/execute "build the API"'
82
-
83
- // #when parsing
84
- const result = parseSlashCommand(text)
85
-
86
- // #then should extract command and args
87
- expect(result).not.toBeNull()
88
- expect(result?.command).toBe("execute")
89
- expect(result?.args).toBe('"build the API"')
90
- })
91
-
92
- it("should parse command with hyphen in name", () => {
93
- // #given a slash command with hyphen
94
- const text = "/frontend-template-creator project"
95
-
96
- // #when parsing
97
- const result = parseSlashCommand(text)
98
-
99
- // #then should extract full command name
100
- expect(result).not.toBeNull()
101
- expect(result?.command).toBe("frontend-template-creator")
102
- expect(result?.args).toBe("project")
103
- })
104
-
105
- it("should return null for non-slash text", () => {
106
- // #given text without slash
107
- const text = "regular text"
108
-
109
- // #when parsing
110
- const result = parseSlashCommand(text)
111
-
112
- // #then should return null
113
- expect(result).toBeNull()
114
- })
115
-
116
- it("should return null for slash not at start", () => {
117
- // #given text with slash in middle
118
- const text = "some text /command"
119
-
120
- // #when parsing
121
- const result = parseSlashCommand(text)
122
-
123
- // #then should return null (slash not at start)
124
- expect(result).toBeNull()
125
- })
126
-
127
- it("should return null for just a slash", () => {
128
- // #given just a slash
129
- const text = "/"
130
-
131
- // #when parsing
132
- const result = parseSlashCommand(text)
133
-
134
- // #then should return null
135
- expect(result).toBeNull()
136
- })
137
-
138
- it("should return null for slash followed by number", () => {
139
- // #given slash followed by number
140
- const text = "/123"
141
-
142
- // #when parsing
143
- const result = parseSlashCommand(text)
144
-
145
- // #then should return null (command must start with letter)
146
- expect(result).toBeNull()
147
- })
148
-
149
- it("should handle whitespace before slash", () => {
150
- // #given command with leading whitespace
151
- const text = " /commit"
152
-
153
- // #when parsing
154
- const result = parseSlashCommand(text)
155
-
156
- // #then should parse after trimming
157
- expect(result).not.toBeNull()
158
- expect(result?.command).toBe("commit")
159
- })
160
- })
161
-
162
- describe("isExcludedCommand", () => {
163
- it("should exclude ralph-loop", () => {
164
- // #given ralph-loop command
165
- // #when checking exclusion
166
- // #then should be excluded
167
- expect(isExcludedCommand("ralph-loop")).toBe(true)
168
- })
169
-
170
- it("should exclude cancel-ralph", () => {
171
- // #given cancel-ralph command
172
- // #when checking exclusion
173
- // #then should be excluded
174
- expect(isExcludedCommand("cancel-ralph")).toBe(true)
175
- })
176
-
177
- it("should be case-insensitive for exclusion", () => {
178
- // #given uppercase variants
179
- // #when checking exclusion
180
- // #then should still be excluded
181
- expect(isExcludedCommand("RALPH-LOOP")).toBe(true)
182
- expect(isExcludedCommand("Cancel-Ralph")).toBe(true)
183
- })
184
-
185
- it("should not exclude regular commands", () => {
186
- // #given regular commands
187
- // #when checking exclusion
188
- // #then should not be excluded
189
- expect(isExcludedCommand("commit")).toBe(false)
190
- expect(isExcludedCommand("plan")).toBe(false)
191
- expect(isExcludedCommand("execute")).toBe(false)
192
- })
193
- })
194
-
195
- describe("detectSlashCommand", () => {
196
- it("should detect slash command in plain text", () => {
197
- // #given plain text with slash command
198
- const text = "/commit fix typo"
199
-
200
- // #when detecting
201
- const result = detectSlashCommand(text)
202
-
203
- // #then should detect
204
- expect(result).not.toBeNull()
205
- expect(result?.command).toBe("commit")
206
- expect(result?.args).toBe("fix typo")
207
- })
208
-
209
- it("should NOT detect slash command inside code block", () => {
210
- // #given slash command inside code block
211
- const text = "```bash\n/command\n```"
212
-
213
- // #when detecting
214
- const result = detectSlashCommand(text)
215
-
216
- // #then should not detect (only code block content)
217
- expect(result).toBeNull()
218
- })
219
-
220
- it("should detect command when text has code blocks elsewhere", () => {
221
- // #given slash command before code block
222
- const text = "/commit fix\n```code```"
223
-
224
- // #when detecting
225
- const result = detectSlashCommand(text)
226
-
227
- // #then should detect the command
228
- expect(result).not.toBeNull()
229
- expect(result?.command).toBe("commit")
230
- })
231
-
232
- it("should NOT detect excluded commands", () => {
233
- // #given excluded command
234
- const text = "/ralph-loop do something"
235
-
236
- // #when detecting
237
- const result = detectSlashCommand(text)
238
-
239
- // #then should not detect
240
- expect(result).toBeNull()
241
- })
242
-
243
- it("should return null for non-command text", () => {
244
- // #given regular text
245
- const text = "Just some regular text"
246
-
247
- // #when detecting
248
- const result = detectSlashCommand(text)
249
-
250
- // #then should return null
251
- expect(result).toBeNull()
252
- })
253
- })
254
-
255
- describe("extractPromptText", () => {
256
- it("should extract text from parts", () => {
257
- // #given message parts
258
- const parts = [
259
- { type: "text", text: "Hello " },
260
- { type: "tool_use", id: "123" },
261
- { type: "text", text: "world" },
262
- ]
263
-
264
- // #when extracting
265
- const result = extractPromptText(parts)
266
-
267
- // #then should join text parts
268
- expect(result).toBe("Hello world")
269
- })
270
-
271
- it("should handle empty parts", () => {
272
- // #given empty parts
273
- const parts: Array<{ type: string; text?: string }> = []
274
-
275
- // #when extracting
276
- const result = extractPromptText(parts)
277
-
278
- // #then should return empty string
279
- expect(result).toBe("")
280
- })
281
-
282
- it("should handle parts without text", () => {
283
- // #given parts without text content
284
- const parts = [
285
- { type: "tool_use", id: "123" },
286
- { type: "tool_result", output: "result" },
287
- ]
288
-
289
- // #when extracting
290
- const result = extractPromptText(parts)
291
-
292
- // #then should return empty string
293
- expect(result).toBe("")
294
- })
295
- })
296
- })
@@ -1,65 +0,0 @@
1
- import {
2
- SLASH_COMMAND_PATTERN,
3
- EXCLUDED_COMMANDS,
4
- } from "./constants"
5
- import type { ParsedSlashCommand } from "./types"
6
-
7
- const CODE_BLOCK_PATTERN = /```[\s\S]*?```/g
8
-
9
- export function removeCodeBlocks(text: string): string {
10
- return text.replace(CODE_BLOCK_PATTERN, "")
11
- }
12
-
13
- export function parseSlashCommand(text: string): ParsedSlashCommand | null {
14
- const trimmed = text.trim()
15
-
16
- if (!trimmed.startsWith("/")) {
17
- return null
18
- }
19
-
20
- const match = trimmed.match(SLASH_COMMAND_PATTERN)
21
- if (!match) {
22
- return null
23
- }
24
-
25
- const [raw, command, args] = match
26
- return {
27
- command: command.toLowerCase(),
28
- args: args.trim(),
29
- raw,
30
- }
31
- }
32
-
33
- export function isExcludedCommand(command: string): boolean {
34
- return EXCLUDED_COMMANDS.has(command.toLowerCase())
35
- }
36
-
37
- export function detectSlashCommand(text: string): ParsedSlashCommand | null {
38
- const textWithoutCodeBlocks = removeCodeBlocks(text)
39
- const trimmed = textWithoutCodeBlocks.trim()
40
-
41
- if (!trimmed.startsWith("/")) {
42
- return null
43
- }
44
-
45
- const parsed = parseSlashCommand(trimmed)
46
-
47
- if (!parsed) {
48
- return null
49
- }
50
-
51
- if (isExcludedCommand(parsed.command)) {
52
- return null
53
- }
54
-
55
- return parsed
56
- }
57
-
58
- export function extractPromptText(
59
- parts: Array<{ type: string; text?: string }>
60
- ): string {
61
- return parts
62
- .filter((p) => p.type === "text")
63
- .map((p) => p.text || "")
64
- .join(" ")
65
- }
@@ -1,205 +0,0 @@
1
- import { existsSync, readdirSync, readFileSync } from "fs"
2
- import { join, basename, dirname } from "path"
3
- import { homedir } from "os"
4
- import {
5
- parseFrontmatter,
6
- resolveCommandsInText,
7
- resolveFileReferencesInText,
8
- sanitizeModelField,
9
- getClaudeConfigDir,
10
- } from "../../shared"
11
- import type { CommandFrontmatter } from "../../features/claude-code-command-loader/types"
12
- import { isMarkdownFile } from "../../shared/file-utils"
13
- import { discoverAllSkills, type LoadedSkill, type LazyContentLoader } from "../../features/opencode-skill-loader"
14
- import type { ParsedSlashCommand } from "./types"
15
-
16
- interface CommandScope {
17
- type: "user" | "project" | "opencode" | "opencode-project" | "skill"
18
- }
19
-
20
- interface CommandMetadata {
21
- name: string
22
- description: string
23
- argumentHint?: string
24
- model?: string
25
- agent?: string
26
- subtask?: boolean
27
- }
28
-
29
- interface CommandInfo {
30
- name: string
31
- path?: string
32
- metadata: CommandMetadata
33
- content?: string
34
- scope: CommandScope["type"]
35
- lazyContentLoader?: LazyContentLoader
36
- }
37
-
38
- function discoverCommandsFromDir(commandsDir: string, scope: CommandScope["type"]): CommandInfo[] {
39
- if (!existsSync(commandsDir)) {
40
- return []
41
- }
42
-
43
- const entries = readdirSync(commandsDir, { withFileTypes: true })
44
- const commands: CommandInfo[] = []
45
-
46
- for (const entry of entries) {
47
- if (!isMarkdownFile(entry)) continue
48
-
49
- const commandPath = join(commandsDir, entry.name)
50
- const commandName = basename(entry.name, ".md")
51
-
52
- try {
53
- const content = readFileSync(commandPath, "utf-8")
54
- const { data, body } = parseFrontmatter<CommandFrontmatter>(content)
55
-
56
- const isOpencodeSource = scope === "opencode" || scope === "opencode-project"
57
- const metadata: CommandMetadata = {
58
- name: commandName,
59
- description: data.description || "",
60
- argumentHint: data["argument-hint"],
61
- model: sanitizeModelField(data.model, isOpencodeSource ? "opencode" : "claude-code"),
62
- agent: data.agent,
63
- subtask: Boolean(data.subtask),
64
- }
65
-
66
- commands.push({
67
- name: commandName,
68
- path: commandPath,
69
- metadata,
70
- content: body,
71
- scope,
72
- })
73
- } catch {
74
- continue
75
- }
76
- }
77
-
78
- return commands
79
- }
80
-
81
- function skillToCommandInfo(skill: LoadedSkill): CommandInfo {
82
- return {
83
- name: skill.name,
84
- path: skill.path,
85
- metadata: {
86
- name: skill.name,
87
- description: skill.definition.description || "",
88
- argumentHint: skill.definition.argumentHint,
89
- model: skill.definition.model,
90
- agent: skill.definition.agent,
91
- subtask: skill.definition.subtask,
92
- },
93
- content: skill.definition.template,
94
- scope: "skill",
95
- lazyContentLoader: skill.lazyContent,
96
- }
97
- }
98
-
99
- export interface ExecutorOptions {
100
- skills?: LoadedSkill[]
101
- }
102
-
103
- async function discoverAllCommands(options?: ExecutorOptions): Promise<CommandInfo[]> {
104
- const userCommandsDir = join(getClaudeConfigDir(), "commands")
105
- const projectCommandsDir = join(process.cwd(), ".claude", "commands")
106
- const opencodeGlobalDir = join(homedir(), ".config", "opencode", "command")
107
- const opencodeProjectDir = join(process.cwd(), ".opencode", "command")
108
-
109
- const userCommands = discoverCommandsFromDir(userCommandsDir, "user")
110
- const opencodeGlobalCommands = discoverCommandsFromDir(opencodeGlobalDir, "opencode")
111
- const projectCommands = discoverCommandsFromDir(projectCommandsDir, "project")
112
- const opencodeProjectCommands = discoverCommandsFromDir(opencodeProjectDir, "opencode-project")
113
-
114
- const skills = options?.skills ?? await discoverAllSkills()
115
- const skillCommands = skills.map(skillToCommandInfo)
116
-
117
- return [
118
- ...opencodeProjectCommands,
119
- ...projectCommands,
120
- ...opencodeGlobalCommands,
121
- ...userCommands,
122
- ...skillCommands,
123
- ]
124
- }
125
-
126
- async function findCommand(commandName: string, options?: ExecutorOptions): Promise<CommandInfo | null> {
127
- const allCommands = await discoverAllCommands(options)
128
- return allCommands.find(
129
- (cmd) => cmd.name.toLowerCase() === commandName.toLowerCase()
130
- ) ?? null
131
- }
132
-
133
- async function formatCommandTemplate(cmd: CommandInfo, args: string): Promise<string> {
134
- const sections: string[] = []
135
-
136
- sections.push(`# /${cmd.name} Command\n`)
137
-
138
- if (cmd.metadata.description) {
139
- sections.push(`**Description**: ${cmd.metadata.description}\n`)
140
- }
141
-
142
- if (args) {
143
- sections.push(`**User Arguments**: ${args}\n`)
144
- }
145
-
146
- if (cmd.metadata.model) {
147
- sections.push(`**Model**: ${cmd.metadata.model}\n`)
148
- }
149
-
150
- if (cmd.metadata.agent) {
151
- sections.push(`**Agent**: ${cmd.metadata.agent}\n`)
152
- }
153
-
154
- sections.push(`**Scope**: ${cmd.scope}\n`)
155
- sections.push("---\n")
156
- sections.push("## Command Instructions\n")
157
-
158
- let content = cmd.content || ""
159
- if (!content && cmd.lazyContentLoader) {
160
- content = await cmd.lazyContentLoader.load()
161
- }
162
-
163
- const commandDir = cmd.path ? dirname(cmd.path) : process.cwd()
164
- const withFileRefs = await resolveFileReferencesInText(content, commandDir)
165
- const resolvedContent = await resolveCommandsInText(withFileRefs)
166
- sections.push(resolvedContent.trim())
167
-
168
- if (args) {
169
- sections.push("\n\n---\n")
170
- sections.push("## User Request\n")
171
- sections.push(args)
172
- }
173
-
174
- return sections.join("\n")
175
- }
176
-
177
- export interface ExecuteResult {
178
- success: boolean
179
- replacementText?: string
180
- error?: string
181
- }
182
-
183
- export async function executeSlashCommand(parsed: ParsedSlashCommand, options?: ExecutorOptions): Promise<ExecuteResult> {
184
- const command = await findCommand(parsed.command, options)
185
-
186
- if (!command) {
187
- return {
188
- success: false,
189
- error: `Command "/${parsed.command}" not found. Use the slashcommand tool to list available commands.`,
190
- }
191
- }
192
-
193
- try {
194
- const template = await formatCommandTemplate(command, parsed.args)
195
- return {
196
- success: true,
197
- replacementText: template,
198
- }
199
- } catch (err) {
200
- return {
201
- success: false,
202
- error: `Failed to load command "/${parsed.command}": ${err instanceof Error ? err.message : String(err)}`,
203
- }
204
- }
205
- }