opencode-repos 0.3.0 → 0.3.2

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 +25 -11
  2. package/package.json +27 -27
  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,771 +0,0 @@
1
- import type { PluginInput } from "@opencode-ai/plugin"
2
- import { execSync } from "node:child_process"
3
- import { existsSync, readdirSync } from "node:fs"
4
- import { join } from "node:path"
5
- import {
6
- readBoulderState,
7
- appendSessionId,
8
- getPlanProgress,
9
- } from "../../features/boulder-state"
10
- import { getMainSessionID, subagentSessions } from "../../features/claude-code-session-state"
11
- import { findNearestMessageWithFields, MESSAGE_STORAGE } from "../../features/hook-message-injector"
12
- import { log } from "../../shared/logger"
13
- import { createSystemDirective, SYSTEM_DIRECTIVE_PREFIX, SystemDirectiveTypes } from "../../shared/system-directive"
14
- import type { BackgroundManager } from "../../features/background-agent"
15
-
16
- export const HOOK_NAME = "atlas"
17
-
18
- /**
19
- * Cross-platform check if a path is inside .sisyphus/ directory.
20
- * Handles both forward slashes (Unix) and backslashes (Windows).
21
- */
22
- function isSisyphusPath(filePath: string): boolean {
23
- return /\.sisyphus[/\\]/.test(filePath)
24
- }
25
-
26
- const WRITE_EDIT_TOOLS = ["Write", "Edit", "write", "edit"]
27
-
28
- const DIRECT_WORK_REMINDER = `
29
-
30
- ---
31
-
32
- ${createSystemDirective(SystemDirectiveTypes.DELEGATION_REQUIRED)}
33
-
34
- You just performed direct file modifications outside \`.sisyphus/\`.
35
-
36
- **You are an ORCHESTRATOR, not an IMPLEMENTER.**
37
-
38
- As an orchestrator, you should:
39
- - **DELEGATE** implementation work to subagents via \`delegate_task\`
40
- - **VERIFY** the work done by subagents
41
- - **COORDINATE** multiple tasks and ensure completion
42
-
43
- You should NOT:
44
- - Write code directly (except for \`.sisyphus/\` files like plans and notepads)
45
- - Make direct file edits outside \`.sisyphus/\`
46
- - Implement features yourself
47
-
48
- **If you need to make changes:**
49
- 1. Use \`delegate_task\` to delegate to an appropriate subagent
50
- 2. Provide clear instructions in the prompt
51
- 3. Verify the subagent's work after completion
52
-
53
- ---
54
- `
55
-
56
- const BOULDER_CONTINUATION_PROMPT = `${createSystemDirective(SystemDirectiveTypes.BOULDER_CONTINUATION)}
57
-
58
- You have an active work plan with incomplete tasks. Continue working.
59
-
60
- RULES:
61
- - Proceed without asking for permission
62
- - Mark each checkbox [x] in the plan file when done
63
- - Use the notepad at .sisyphus/notepads/{PLAN_NAME}/ to record learnings
64
- - Do not stop until all tasks are complete
65
- - If blocked, document the blocker and move to the next task`
66
-
67
- const VERIFICATION_REMINDER = `**MANDATORY: WHAT YOU MUST DO RIGHT NOW**
68
-
69
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
70
-
71
- ⚠️ CRITICAL: Subagents FREQUENTLY LIE about completion.
72
- Tests FAILING, code has ERRORS, implementation INCOMPLETE - but they say "done".
73
-
74
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
75
-
76
- **STEP 1: VERIFY WITH YOUR OWN TOOL CALLS (DO THIS NOW)**
77
-
78
- Run these commands YOURSELF - do NOT trust agent's claims:
79
- 1. \`lsp_diagnostics\` on changed files → Must be CLEAN
80
- 2. \`bash\` to run tests → Must PASS
81
- 3. \`bash\` to run build/typecheck → Must succeed
82
- 4. \`Read\` the actual code → Must match requirements
83
-
84
- **STEP 2: DETERMINE IF HANDS-ON QA IS NEEDED**
85
-
86
- | Deliverable Type | QA Method | Tool |
87
- |------------------|-----------|------|
88
- | **Frontend/UI** | Browser interaction | \`/playwright\` skill |
89
- | **TUI/CLI** | Run interactively | \`interactive_bash\` (tmux) |
90
- | **API/Backend** | Send real requests | \`bash\` with curl |
91
-
92
- Static analysis CANNOT catch: visual bugs, animation issues, user flow breakages.
93
-
94
- **STEP 3: IF QA IS NEEDED - ADD TO TODO IMMEDIATELY**
95
-
96
- \`\`\`
97
- todowrite([
98
- { id: "qa-X", content: "HANDS-ON QA: [specific verification action]", status: "pending", priority: "high" }
99
- ])
100
- \`\`\`
101
-
102
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
103
-
104
- **BLOCKING: DO NOT proceed to Step 4 until Steps 1-3 are VERIFIED.**`
105
-
106
- const ORCHESTRATOR_DELEGATION_REQUIRED = `
107
-
108
- ---
109
-
110
- ⚠️⚠️⚠️ ${createSystemDirective(SystemDirectiveTypes.DELEGATION_REQUIRED)} ⚠️⚠️⚠️
111
-
112
- **STOP. YOU ARE VIOLATING ORCHESTRATOR PROTOCOL.**
113
-
114
- You (Atlas) are attempting to directly modify a file outside \`.sisyphus/\`.
115
-
116
- **Path attempted:** $FILE_PATH
117
-
118
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
119
-
120
- 🚫 **THIS IS FORBIDDEN** (except for VERIFICATION purposes)
121
-
122
- As an ORCHESTRATOR, you MUST:
123
- 1. **DELEGATE** all implementation work via \`delegate_task\`
124
- 2. **VERIFY** the work done by subagents (reading files is OK)
125
- 3. **COORDINATE** - you orchestrate, you don't implement
126
-
127
- **ALLOWED direct file operations:**
128
- - Files inside \`.sisyphus/\` (plans, notepads, drafts)
129
- - Reading files for verification
130
- - Running diagnostics/tests
131
-
132
- **FORBIDDEN direct file operations:**
133
- - Writing/editing source code
134
- - Creating new files outside \`.sisyphus/\`
135
- - Any implementation work
136
-
137
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
138
-
139
- **IF THIS IS FOR VERIFICATION:**
140
- Proceed if you are verifying subagent work by making a small fix.
141
- But for any substantial changes, USE \`delegate_task\`.
142
-
143
- **CORRECT APPROACH:**
144
- \`\`\`
145
- delegate_task(
146
- category="...",
147
- prompt="[specific single task with clear acceptance criteria]"
148
- )
149
- \`\`\`
150
-
151
- ⚠️⚠️⚠️ DELEGATE. DON'T IMPLEMENT. ⚠️⚠️⚠️
152
-
153
- ---
154
- `
155
-
156
- const SINGLE_TASK_DIRECTIVE = `
157
-
158
- ${createSystemDirective(SystemDirectiveTypes.SINGLE_TASK_ONLY)}
159
-
160
- **STOP. READ THIS BEFORE PROCEEDING.**
161
-
162
- If you were NOT given **exactly ONE atomic task**, you MUST:
163
- 1. **IMMEDIATELY REFUSE** this request
164
- 2. **DEMAND** the orchestrator provide a single, specific task
165
-
166
- **Your response if multiple tasks detected:**
167
- > "I refuse to proceed. You provided multiple tasks. An orchestrator's impatience destroys work quality.
168
- >
169
- > PROVIDE EXACTLY ONE TASK. One file. One change. One verification.
170
- >
171
- > Your rushing will cause: incomplete work, missed edge cases, broken tests, wasted context."
172
-
173
- **WARNING TO ORCHESTRATOR:**
174
- - Your hasty batching RUINS deliverables
175
- - Each task needs FULL attention and PROPER verification
176
- - Batch delegation = sloppy work = rework = wasted tokens
177
-
178
- **REFUSE multi-task requests. DEMAND single-task clarity.**
179
- `
180
-
181
- function buildVerificationReminder(sessionId: string): string {
182
- return `${VERIFICATION_REMINDER}
183
-
184
- ---
185
-
186
- **If ANY verification fails, use this immediately:**
187
- \`\`\`
188
- delegate_task(resume="${sessionId}", prompt="fix: [describe the specific failure]")
189
- \`\`\``
190
- }
191
-
192
- function buildOrchestratorReminder(planName: string, progress: { total: number; completed: number }, sessionId: string): string {
193
- const remaining = progress.total - progress.completed
194
- return `
195
- ---
196
-
197
- **BOULDER STATE:** Plan: \`${planName}\` | ${progress.completed}/${progress.total} done | ${remaining} remaining
198
-
199
- ---
200
-
201
- ${buildVerificationReminder(sessionId)}
202
-
203
- **STEP 4: MARK COMPLETION IN PLAN FILE (IMMEDIATELY)**
204
-
205
- RIGHT NOW - Do not delay. Verification passed → Mark IMMEDIATELY.
206
-
207
- Update the plan file \`.sisyphus/tasks/${planName}.yaml\`:
208
- - Change \`[ ]\` to \`[x]\` for the completed task
209
- - Use \`Edit\` tool to modify the checkbox
210
-
211
- **DO THIS BEFORE ANYTHING ELSE. Unmarked = Untracked = Lost progress.**
212
-
213
- **STEP 5: COMMIT ATOMIC UNIT**
214
-
215
- - Stage ONLY the verified changes
216
- - Commit with clear message describing what was done
217
-
218
- **STEP 6: PROCEED TO NEXT TASK**
219
-
220
- - Read the plan file to identify the next \`[ ]\` task
221
- - Start immediately - DO NOT STOP
222
-
223
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
224
-
225
- **${remaining} tasks remain. Keep bouldering.**`
226
- }
227
-
228
- function buildStandaloneVerificationReminder(sessionId: string): string {
229
- return `
230
- ---
231
-
232
- ${buildVerificationReminder(sessionId)}
233
-
234
- **STEP 4: UPDATE TODO STATUS (IMMEDIATELY)**
235
-
236
- RIGHT NOW - Do not delay. Verification passed → Mark IMMEDIATELY.
237
-
238
- 1. Run \`todoread\` to see your todo list
239
- 2. Mark the completed task as \`completed\` using \`todowrite\`
240
-
241
- **DO THIS BEFORE ANYTHING ELSE. Unmarked = Untracked = Lost progress.**
242
-
243
- **STEP 5: EXECUTE QA TASKS (IF ANY)**
244
-
245
- If QA tasks exist in your todo list:
246
- - Execute them BEFORE proceeding
247
- - Mark each QA task complete after successful verification
248
-
249
- **STEP 6: PROCEED TO NEXT PENDING TASK**
250
-
251
- - Identify the next \`pending\` task from your todo list
252
- - Start immediately - DO NOT STOP
253
-
254
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
255
-
256
- **NO TODO = NO TRACKING = INCOMPLETE WORK. Use todowrite aggressively.**`
257
- }
258
-
259
- function extractSessionIdFromOutput(output: string): string {
260
- const match = output.match(/Session ID:\s*(ses_[a-zA-Z0-9]+)/)
261
- return match?.[1] ?? "<session_id>"
262
- }
263
-
264
- interface GitFileStat {
265
- path: string
266
- added: number
267
- removed: number
268
- status: "modified" | "added" | "deleted"
269
- }
270
-
271
- function getGitDiffStats(directory: string): GitFileStat[] {
272
- try {
273
- const output = execSync("git diff --numstat HEAD", {
274
- cwd: directory,
275
- encoding: "utf-8",
276
- timeout: 5000,
277
- }).trim()
278
-
279
- if (!output) return []
280
-
281
- const statusOutput = execSync("git status --porcelain", {
282
- cwd: directory,
283
- encoding: "utf-8",
284
- timeout: 5000,
285
- }).trim()
286
-
287
- const statusMap = new Map<string, "modified" | "added" | "deleted">()
288
- for (const line of statusOutput.split("\n")) {
289
- if (!line) continue
290
- const status = line.substring(0, 2).trim()
291
- const filePath = line.substring(3)
292
- if (status === "A" || status === "??") {
293
- statusMap.set(filePath, "added")
294
- } else if (status === "D") {
295
- statusMap.set(filePath, "deleted")
296
- } else {
297
- statusMap.set(filePath, "modified")
298
- }
299
- }
300
-
301
- const stats: GitFileStat[] = []
302
- for (const line of output.split("\n")) {
303
- const parts = line.split("\t")
304
- if (parts.length < 3) continue
305
-
306
- const [addedStr, removedStr, path] = parts
307
- const added = addedStr === "-" ? 0 : parseInt(addedStr, 10)
308
- const removed = removedStr === "-" ? 0 : parseInt(removedStr, 10)
309
-
310
- stats.push({
311
- path,
312
- added,
313
- removed,
314
- status: statusMap.get(path) ?? "modified",
315
- })
316
- }
317
-
318
- return stats
319
- } catch {
320
- return []
321
- }
322
- }
323
-
324
- function formatFileChanges(stats: GitFileStat[], notepadPath?: string): string {
325
- if (stats.length === 0) return "[FILE CHANGES SUMMARY]\nNo file changes detected.\n"
326
-
327
- const modified = stats.filter((s) => s.status === "modified")
328
- const added = stats.filter((s) => s.status === "added")
329
- const deleted = stats.filter((s) => s.status === "deleted")
330
-
331
- const lines: string[] = ["[FILE CHANGES SUMMARY]"]
332
-
333
- if (modified.length > 0) {
334
- lines.push("Modified files:")
335
- for (const f of modified) {
336
- lines.push(` ${f.path} (+${f.added}, -${f.removed})`)
337
- }
338
- lines.push("")
339
- }
340
-
341
- if (added.length > 0) {
342
- lines.push("Created files:")
343
- for (const f of added) {
344
- lines.push(` ${f.path} (+${f.added})`)
345
- }
346
- lines.push("")
347
- }
348
-
349
- if (deleted.length > 0) {
350
- lines.push("Deleted files:")
351
- for (const f of deleted) {
352
- lines.push(` ${f.path} (-${f.removed})`)
353
- }
354
- lines.push("")
355
- }
356
-
357
- if (notepadPath) {
358
- const notepadStat = stats.find((s) => s.path.includes("notepad") || s.path.includes(".sisyphus"))
359
- if (notepadStat) {
360
- lines.push("[NOTEPAD UPDATED]")
361
- lines.push(` ${notepadStat.path} (+${notepadStat.added})`)
362
- lines.push("")
363
- }
364
- }
365
-
366
- return lines.join("\n")
367
- }
368
-
369
- interface ToolExecuteAfterInput {
370
- tool: string
371
- sessionID?: string
372
- callID?: string
373
- }
374
-
375
- interface ToolExecuteAfterOutput {
376
- title: string
377
- output: string
378
- metadata: Record<string, unknown>
379
- }
380
-
381
- function getMessageDir(sessionID: string): string | null {
382
- if (!existsSync(MESSAGE_STORAGE)) return null
383
-
384
- const directPath = join(MESSAGE_STORAGE, sessionID)
385
- if (existsSync(directPath)) return directPath
386
-
387
- for (const dir of readdirSync(MESSAGE_STORAGE)) {
388
- const sessionPath = join(MESSAGE_STORAGE, dir, sessionID)
389
- if (existsSync(sessionPath)) return sessionPath
390
- }
391
-
392
- return null
393
- }
394
-
395
- function isCallerOrchestrator(sessionID?: string): boolean {
396
- if (!sessionID) return false
397
- const messageDir = getMessageDir(sessionID)
398
- if (!messageDir) return false
399
- const nearest = findNearestMessageWithFields(messageDir)
400
- return nearest?.agent === "Atlas"
401
- }
402
-
403
- interface SessionState {
404
- lastEventWasAbortError?: boolean
405
- lastContinuationInjectedAt?: number
406
- }
407
-
408
- const CONTINUATION_COOLDOWN_MS = 5000
409
-
410
- export interface AtlasHookOptions {
411
- directory: string
412
- backgroundManager?: BackgroundManager
413
- }
414
-
415
- function isAbortError(error: unknown): boolean {
416
- if (!error) return false
417
-
418
- if (typeof error === "object") {
419
- const errObj = error as Record<string, unknown>
420
- const name = errObj.name as string | undefined
421
- const message = (errObj.message as string | undefined)?.toLowerCase() ?? ""
422
-
423
- if (name === "MessageAbortedError" || name === "AbortError") return true
424
- if (name === "DOMException" && message.includes("abort")) return true
425
- if (message.includes("aborted") || message.includes("cancelled") || message.includes("interrupted")) return true
426
- }
427
-
428
- if (typeof error === "string") {
429
- const lower = error.toLowerCase()
430
- return lower.includes("abort") || lower.includes("cancel") || lower.includes("interrupt")
431
- }
432
-
433
- return false
434
- }
435
-
436
- export function createAtlasHook(
437
- ctx: PluginInput,
438
- options?: AtlasHookOptions
439
- ) {
440
- const backgroundManager = options?.backgroundManager
441
- const sessions = new Map<string, SessionState>()
442
- const pendingFilePaths = new Map<string, string>()
443
-
444
- function getState(sessionID: string): SessionState {
445
- let state = sessions.get(sessionID)
446
- if (!state) {
447
- state = {}
448
- sessions.set(sessionID, state)
449
- }
450
- return state
451
- }
452
-
453
- async function injectContinuation(sessionID: string, planName: string, remaining: number, total: number): Promise<void> {
454
- const hasRunningBgTasks = backgroundManager
455
- ? backgroundManager.getTasksByParentSession(sessionID).some(t => t.status === "running")
456
- : false
457
-
458
- if (hasRunningBgTasks) {
459
- log(`[${HOOK_NAME}] Skipped injection: background tasks running`, { sessionID })
460
- return
461
- }
462
-
463
- const prompt = BOULDER_CONTINUATION_PROMPT
464
- .replace(/{PLAN_NAME}/g, planName) +
465
- `\n\n[Status: ${total - remaining}/${total} completed, ${remaining} remaining]`
466
-
467
- try {
468
- log(`[${HOOK_NAME}] Injecting boulder continuation`, { sessionID, planName, remaining })
469
-
470
- let model: { providerID: string; modelID: string } | undefined
471
- try {
472
- const messagesResp = await ctx.client.session.messages({ path: { id: sessionID } })
473
- const messages = (messagesResp.data ?? []) as Array<{
474
- info?: { model?: { providerID: string; modelID: string }; modelID?: string; providerID?: string }
475
- }>
476
- for (let i = messages.length - 1; i >= 0; i--) {
477
- const info = messages[i].info
478
- const msgModel = info?.model
479
- if (msgModel?.providerID && msgModel?.modelID) {
480
- model = { providerID: msgModel.providerID, modelID: msgModel.modelID }
481
- break
482
- }
483
- if (info?.providerID && info?.modelID) {
484
- model = { providerID: info.providerID, modelID: info.modelID }
485
- break
486
- }
487
- }
488
- } catch {
489
- const messageDir = getMessageDir(sessionID)
490
- const currentMessage = messageDir ? findNearestMessageWithFields(messageDir) : null
491
- model = currentMessage?.model?.providerID && currentMessage?.model?.modelID
492
- ? { providerID: currentMessage.model.providerID, modelID: currentMessage.model.modelID }
493
- : undefined
494
- }
495
-
496
- await ctx.client.session.prompt({
497
- path: { id: sessionID },
498
- body: {
499
- agent: "Atlas",
500
- ...(model !== undefined ? { model } : {}),
501
- parts: [{ type: "text", text: prompt }],
502
- },
503
- query: { directory: ctx.directory },
504
- })
505
-
506
- log(`[${HOOK_NAME}] Boulder continuation injected`, { sessionID })
507
- } catch (err) {
508
- log(`[${HOOK_NAME}] Boulder continuation failed`, { sessionID, error: String(err) })
509
- }
510
- }
511
-
512
- return {
513
- handler: async ({ event }: { event: { type: string; properties?: unknown } }): Promise<void> => {
514
- const props = event.properties as Record<string, unknown> | undefined
515
-
516
- if (event.type === "session.error") {
517
- const sessionID = props?.sessionID as string | undefined
518
- if (!sessionID) return
519
-
520
- const state = getState(sessionID)
521
- const isAbort = isAbortError(props?.error)
522
- state.lastEventWasAbortError = isAbort
523
-
524
- log(`[${HOOK_NAME}] session.error`, { sessionID, isAbort })
525
- return
526
- }
527
-
528
- if (event.type === "session.idle") {
529
- const sessionID = props?.sessionID as string | undefined
530
- if (!sessionID) return
531
-
532
- log(`[${HOOK_NAME}] session.idle`, { sessionID })
533
-
534
- // Read boulder state FIRST to check if this session is part of an active boulder
535
- const boulderState = readBoulderState(ctx.directory)
536
- const isBoulderSession = boulderState?.session_ids.includes(sessionID) ?? false
537
-
538
- const mainSessionID = getMainSessionID()
539
- const isMainSession = sessionID === mainSessionID
540
- const isBackgroundTaskSession = subagentSessions.has(sessionID)
541
-
542
- // Allow continuation if: main session OR background task OR boulder session
543
- if (mainSessionID && !isMainSession && !isBackgroundTaskSession && !isBoulderSession) {
544
- log(`[${HOOK_NAME}] Skipped: not main, background task, or boulder session`, { sessionID })
545
- return
546
- }
547
-
548
- const state = getState(sessionID)
549
-
550
- if (state.lastEventWasAbortError) {
551
- state.lastEventWasAbortError = false
552
- log(`[${HOOK_NAME}] Skipped: abort error immediately before idle`, { sessionID })
553
- return
554
- }
555
-
556
- const hasRunningBgTasks = backgroundManager
557
- ? backgroundManager.getTasksByParentSession(sessionID).some(t => t.status === "running")
558
- : false
559
-
560
- if (hasRunningBgTasks) {
561
- log(`[${HOOK_NAME}] Skipped: background tasks running`, { sessionID })
562
- return
563
- }
564
-
565
-
566
- if (!boulderState) {
567
- log(`[${HOOK_NAME}] No active boulder`, { sessionID })
568
- return
569
- }
570
-
571
- if (!isCallerOrchestrator(sessionID)) {
572
- log(`[${HOOK_NAME}] Skipped: last agent is not Atlas`, { sessionID })
573
- return
574
- }
575
-
576
- const progress = getPlanProgress(boulderState.active_plan)
577
- if (progress.isComplete) {
578
- log(`[${HOOK_NAME}] Boulder complete`, { sessionID, plan: boulderState.plan_name })
579
- return
580
- }
581
-
582
- const now = Date.now()
583
- if (state.lastContinuationInjectedAt && now - state.lastContinuationInjectedAt < CONTINUATION_COOLDOWN_MS) {
584
- log(`[${HOOK_NAME}] Skipped: continuation cooldown active`, { sessionID, cooldownRemaining: CONTINUATION_COOLDOWN_MS - (now - state.lastContinuationInjectedAt) })
585
- return
586
- }
587
-
588
- state.lastContinuationInjectedAt = now
589
- const remaining = progress.total - progress.completed
590
- injectContinuation(sessionID, boulderState.plan_name, remaining, progress.total)
591
- return
592
- }
593
-
594
- if (event.type === "message.updated") {
595
- const info = props?.info as Record<string, unknown> | undefined
596
- const sessionID = info?.sessionID as string | undefined
597
-
598
- if (!sessionID) return
599
-
600
- const state = sessions.get(sessionID)
601
- if (state) {
602
- state.lastEventWasAbortError = false
603
- }
604
- return
605
- }
606
-
607
- if (event.type === "message.part.updated") {
608
- const info = props?.info as Record<string, unknown> | undefined
609
- const sessionID = info?.sessionID as string | undefined
610
- const role = info?.role as string | undefined
611
-
612
- if (sessionID && role === "assistant") {
613
- const state = sessions.get(sessionID)
614
- if (state) {
615
- state.lastEventWasAbortError = false
616
- }
617
- }
618
- return
619
- }
620
-
621
- if (event.type === "tool.execute.before" || event.type === "tool.execute.after") {
622
- const sessionID = props?.sessionID as string | undefined
623
- if (sessionID) {
624
- const state = sessions.get(sessionID)
625
- if (state) {
626
- state.lastEventWasAbortError = false
627
- }
628
- }
629
- return
630
- }
631
-
632
- if (event.type === "session.deleted") {
633
- const sessionInfo = props?.info as { id?: string } | undefined
634
- if (sessionInfo?.id) {
635
- sessions.delete(sessionInfo.id)
636
- log(`[${HOOK_NAME}] Session deleted: cleaned up`, { sessionID: sessionInfo.id })
637
- }
638
- return
639
- }
640
- },
641
-
642
- "tool.execute.before": async (
643
- input: { tool: string; sessionID?: string; callID?: string },
644
- output: { args: Record<string, unknown>; message?: string }
645
- ): Promise<void> => {
646
- if (!isCallerOrchestrator(input.sessionID)) {
647
- return
648
- }
649
-
650
- // Check Write/Edit tools for orchestrator - inject strong warning
651
- if (WRITE_EDIT_TOOLS.includes(input.tool)) {
652
- const filePath = (output.args.filePath ?? output.args.path ?? output.args.file) as string | undefined
653
- if (filePath && !isSisyphusPath(filePath)) {
654
- // Store filePath for use in tool.execute.after
655
- if (input.callID) {
656
- pendingFilePaths.set(input.callID, filePath)
657
- }
658
- const warning = ORCHESTRATOR_DELEGATION_REQUIRED.replace("$FILE_PATH", filePath)
659
- output.message = (output.message || "") + warning
660
- log(`[${HOOK_NAME}] Injected delegation warning for direct file modification`, {
661
- sessionID: input.sessionID,
662
- tool: input.tool,
663
- filePath,
664
- })
665
- }
666
- return
667
- }
668
-
669
- // Check delegate_task - inject single-task directive
670
- if (input.tool === "delegate_task") {
671
- const prompt = output.args.prompt as string | undefined
672
- if (prompt && !prompt.includes(SYSTEM_DIRECTIVE_PREFIX)) {
673
- output.args.prompt = prompt + `\n<system-reminder>${SINGLE_TASK_DIRECTIVE}</system-reminder>`
674
- log(`[${HOOK_NAME}] Injected single-task directive to delegate_task`, {
675
- sessionID: input.sessionID,
676
- })
677
- }
678
- }
679
- },
680
-
681
- "tool.execute.after": async (
682
- input: ToolExecuteAfterInput,
683
- output: ToolExecuteAfterOutput
684
- ): Promise<void> => {
685
- if (!isCallerOrchestrator(input.sessionID)) {
686
- return
687
- }
688
-
689
- if (WRITE_EDIT_TOOLS.includes(input.tool)) {
690
- let filePath = input.callID ? pendingFilePaths.get(input.callID) : undefined
691
- if (input.callID) {
692
- pendingFilePaths.delete(input.callID)
693
- }
694
- if (!filePath) {
695
- filePath = output.metadata?.filePath as string | undefined
696
- }
697
- if (filePath && !isSisyphusPath(filePath)) {
698
- output.output = (output.output || "") + DIRECT_WORK_REMINDER
699
- log(`[${HOOK_NAME}] Direct work reminder appended`, {
700
- sessionID: input.sessionID,
701
- tool: input.tool,
702
- filePath,
703
- })
704
- }
705
- return
706
- }
707
-
708
- if (input.tool !== "delegate_task") {
709
- return
710
- }
711
-
712
- const outputStr = output.output && typeof output.output === "string" ? output.output : ""
713
- const isBackgroundLaunch = outputStr.includes("Background task launched") || outputStr.includes("Background task resumed")
714
-
715
- if (isBackgroundLaunch) {
716
- return
717
- }
718
-
719
- if (output.output && typeof output.output === "string") {
720
- const gitStats = getGitDiffStats(ctx.directory)
721
- const fileChanges = formatFileChanges(gitStats)
722
- const subagentSessionId = extractSessionIdFromOutput(output.output)
723
-
724
- const boulderState = readBoulderState(ctx.directory)
725
-
726
- if (boulderState) {
727
- const progress = getPlanProgress(boulderState.active_plan)
728
-
729
- if (input.sessionID && !boulderState.session_ids.includes(input.sessionID)) {
730
- appendSessionId(ctx.directory, input.sessionID)
731
- log(`[${HOOK_NAME}] Appended session to boulder`, {
732
- sessionID: input.sessionID,
733
- plan: boulderState.plan_name,
734
- })
735
- }
736
-
737
- // Preserve original subagent response - critical for debugging failed tasks
738
- const originalResponse = output.output
739
-
740
- output.output = `
741
- ## SUBAGENT WORK COMPLETED
742
-
743
- ${fileChanges}
744
-
745
- ---
746
-
747
- **Subagent Response:**
748
-
749
- ${originalResponse}
750
-
751
- <system-reminder>
752
- ${buildOrchestratorReminder(boulderState.plan_name, progress, subagentSessionId)}
753
- </system-reminder>`
754
-
755
- log(`[${HOOK_NAME}] Output transformed for orchestrator mode (boulder)`, {
756
- plan: boulderState.plan_name,
757
- progress: `${progress.completed}/${progress.total}`,
758
- fileCount: gitStats.length,
759
- })
760
- } else {
761
- output.output += `\n<system-reminder>\n${buildStandaloneVerificationReminder(subagentSessionId)}\n</system-reminder>`
762
-
763
- log(`[${HOOK_NAME}] Verification reminder appended for orchestrator`, {
764
- sessionID: input.sessionID,
765
- fileCount: gitStats.length,
766
- })
767
- }
768
- }
769
- },
770
- }
771
- }