goatcode-sh 0.0.1 → 0.1.3

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 (854) hide show
  1. package/.github/workflows/ci.yml +85 -0
  2. package/.github/workflows/release.yml +107 -0
  3. package/.opencode/plugins/goatcode.js +1 -0
  4. package/AGENTS.md +59 -0
  5. package/CONTRIBUTING.md +110 -0
  6. package/LICENSE +21 -0
  7. package/README.md +106 -12
  8. package/bun.lock +2081 -0
  9. package/bunfig.toml +3 -0
  10. package/dist/agents/advisor/config.d.ts +4 -0
  11. package/dist/agents/advisor/index.d.ts +2 -0
  12. package/dist/agents/advisor/plugin.d.ts +1 -0
  13. package/dist/agents/advisor/prompt-meta.d.ts +2 -0
  14. package/dist/agents/advisor/prompt.d.ts +1 -0
  15. package/dist/agents/agent-builder.d.ts +10 -0
  16. package/dist/agents/agent-registry.d.ts +8 -0
  17. package/dist/agents/builtin-agents.d.ts +2 -0
  18. package/dist/agents/deep-worker/config.d.ts +4 -0
  19. package/dist/agents/deep-worker/index.d.ts +2 -0
  20. package/dist/agents/deep-worker/plugin.d.ts +1 -0
  21. package/dist/agents/deep-worker/prompt-meta.d.ts +2 -0
  22. package/dist/agents/deep-worker/prompt.d.ts +1 -0
  23. package/dist/agents/explorer/config.d.ts +4 -0
  24. package/dist/agents/explorer/index.d.ts +2 -0
  25. package/dist/agents/explorer/plugin.d.ts +1 -0
  26. package/dist/agents/explorer/prompt-meta.d.ts +2 -0
  27. package/dist/agents/explorer/prompt.d.ts +1 -0
  28. package/dist/agents/fallback-chains.d.ts +2 -0
  29. package/dist/agents/index.d.ts +14 -0
  30. package/dist/agents/orchestrator/config.d.ts +4 -0
  31. package/dist/agents/orchestrator/index.d.ts +2 -0
  32. package/dist/agents/orchestrator/plugin.d.ts +1 -0
  33. package/dist/agents/orchestrator/prompt-meta.d.ts +2 -0
  34. package/dist/agents/orchestrator/prompt.d.ts +1 -0
  35. package/dist/agents/planner/config.d.ts +4 -0
  36. package/dist/agents/planner/index.d.ts +2 -0
  37. package/dist/agents/planner/plugin.d.ts +1 -0
  38. package/dist/agents/planner/prompt-meta.d.ts +2 -0
  39. package/dist/agents/planner/prompt.d.ts +1 -0
  40. package/dist/agents/prompt-meta.d.ts +11 -0
  41. package/dist/agents/prompt-registry.d.ts +4 -0
  42. package/dist/agents/researcher/config.d.ts +4 -0
  43. package/dist/agents/researcher/index.d.ts +2 -0
  44. package/dist/agents/researcher/plugin.d.ts +1 -0
  45. package/dist/agents/researcher/prompt-meta.d.ts +2 -0
  46. package/dist/agents/researcher/prompt.d.ts +1 -0
  47. package/dist/agents/tool-restrictions.d.ts +7 -0
  48. package/dist/agents/worker/config.d.ts +4 -0
  49. package/dist/agents/worker/index.d.ts +2 -0
  50. package/dist/agents/worker/plugin.d.ts +1 -0
  51. package/dist/agents/worker/prompt-meta.d.ts +2 -0
  52. package/dist/agents/worker/prompt.d.ts +1 -0
  53. package/dist/bootstrap.d.ts +3 -0
  54. package/dist/cli/cli.d.ts +3 -0
  55. package/dist/cli/commands/install.d.ts +12 -0
  56. package/dist/cli/commands/update.d.ts +1 -0
  57. package/dist/cli/config-generator.d.ts +26 -0
  58. package/dist/cli/index.d.ts +2 -0
  59. package/dist/config/defaults.d.ts +3 -0
  60. package/dist/config/define-config.d.ts +27 -0
  61. package/dist/config/index.d.ts +6 -0
  62. package/dist/config/loader.d.ts +3 -0
  63. package/dist/config/paths.d.ts +4 -0
  64. package/dist/config/schema.d.ts +273 -0
  65. package/dist/config/validator.d.ts +9 -0
  66. package/dist/features/auto-update/index.d.ts +3 -0
  67. package/dist/features/auto-update/plugin.d.ts +2 -0
  68. package/dist/features/auto-update/update-checker.d.ts +7 -0
  69. package/dist/features/background-agent/concurrency.d.ts +10 -0
  70. package/dist/features/background-agent/index.d.ts +6 -0
  71. package/dist/features/background-agent/manager.d.ts +18 -0
  72. package/dist/features/background-agent/poller.d.ts +17 -0
  73. package/dist/features/background-agent/singleton.d.ts +7 -0
  74. package/dist/features/background-agent/spawner.d.ts +6 -0
  75. package/dist/features/background-agent/types.d.ts +18 -0
  76. package/dist/features/builtin-features.d.ts +2 -0
  77. package/dist/features/categories/category-config.d.ts +9 -0
  78. package/dist/features/categories/category-resolver.d.ts +6 -0
  79. package/dist/features/categories/index.d.ts +3 -0
  80. package/dist/features/categories/prompt-appends.d.ts +10 -0
  81. package/dist/features/loops/file-store.d.ts +22 -0
  82. package/dist/features/loops/handler.d.ts +9 -0
  83. package/dist/features/loops/index.d.ts +5 -0
  84. package/dist/features/loops/memory-store.d.ts +11 -0
  85. package/dist/features/loops/plugin.d.ts +34 -0
  86. package/dist/features/loops/shared/event-utils.d.ts +7 -0
  87. package/dist/features/loops/state.d.ts +22 -0
  88. package/dist/features/prompt-builder/agent-table-builder.d.ts +6 -0
  89. package/dist/features/prompt-builder/category-section-builder.d.ts +2 -0
  90. package/dist/features/prompt-builder/dynamic-prompt-builder.d.ts +9 -0
  91. package/dist/features/prompt-builder/index.d.ts +7 -0
  92. package/dist/features/prompt-builder/skill-section-builder.d.ts +5 -0
  93. package/dist/features/session-state/index.d.ts +5 -0
  94. package/dist/features/session-state/session-cursor.d.ts +13 -0
  95. package/dist/features/session-state/session-store.d.ts +12 -0
  96. package/dist/features/session-state/session-tools-store.d.ts +4 -0
  97. package/dist/features/skills/builtin/git-master.d.ts +2 -0
  98. package/dist/features/skills/index.d.ts +10 -0
  99. package/dist/features/skills/skill-loader.d.ts +22 -0
  100. package/dist/features/skills/skill-merger.d.ts +2 -0
  101. package/dist/features/slash-commands/command-registry.d.ts +3 -0
  102. package/dist/features/slash-commands/commands/cancel-loop.d.ts +2 -0
  103. package/dist/features/slash-commands/commands/handoff.d.ts +2 -0
  104. package/dist/features/slash-commands/commands/init-deep.d.ts +2 -0
  105. package/dist/features/slash-commands/commands/loop.d.ts +2 -0
  106. package/dist/features/slash-commands/commands/start-work.d.ts +2 -0
  107. package/dist/features/slash-commands/commands/stop-continuation.d.ts +2 -0
  108. package/dist/features/slash-commands/index.d.ts +2 -0
  109. package/dist/features/slash-commands/types.d.ts +5 -0
  110. package/dist/hooks/anthropic-effort/handler.d.ts +5 -0
  111. package/dist/hooks/anthropic-effort/index.d.ts +3 -0
  112. package/dist/hooks/anthropic-effort/plugin.d.ts +1 -0
  113. package/dist/hooks/builtin-hooks.d.ts +2 -0
  114. package/dist/hooks/comment-checker/handler.d.ts +5 -0
  115. package/dist/hooks/comment-checker/index.d.ts +2 -0
  116. package/dist/hooks/comment-checker/plugin.d.ts +1 -0
  117. package/dist/hooks/compaction-context/handler.d.ts +2 -0
  118. package/dist/hooks/compaction-context/index.d.ts +2 -0
  119. package/dist/hooks/compaction-context/plugin.d.ts +1 -0
  120. package/dist/hooks/compaction-todo-preserver/handler.d.ts +4 -0
  121. package/dist/hooks/compaction-todo-preserver/index.d.ts +2 -0
  122. package/dist/hooks/compaction-todo-preserver/plugin.d.ts +1 -0
  123. package/dist/hooks/context-injector/handlers/agents.d.ts +1 -0
  124. package/dist/hooks/context-injector/handlers/readme.d.ts +1 -0
  125. package/dist/hooks/context-injector/handlers/rules.d.ts +1 -0
  126. package/dist/hooks/context-injector/index.d.ts +4 -0
  127. package/dist/hooks/context-injector/plugin.d.ts +1 -0
  128. package/dist/hooks/context-window-limit/handler.d.ts +6 -0
  129. package/dist/hooks/context-window-limit/index.d.ts +2 -0
  130. package/dist/hooks/context-window-limit/plugin.d.ts +1 -0
  131. package/dist/hooks/delegate-retry/handler.d.ts +16 -0
  132. package/dist/hooks/delegate-retry/index.d.ts +3 -0
  133. package/dist/hooks/delegate-retry/plugin.d.ts +1 -0
  134. package/dist/hooks/edit-error/handler.d.ts +6 -0
  135. package/dist/hooks/edit-error/index.d.ts +2 -0
  136. package/dist/hooks/edit-error/plugin.d.ts +1 -0
  137. package/dist/hooks/empty-response-detector/handler.d.ts +5 -0
  138. package/dist/hooks/empty-response-detector/index.d.ts +2 -0
  139. package/dist/hooks/empty-response-detector/plugin.d.ts +1 -0
  140. package/dist/hooks/error-diagnostics/handler.d.ts +6 -0
  141. package/dist/hooks/error-diagnostics/patterns.d.ts +3 -0
  142. package/dist/hooks/error-diagnostics/plugin.d.ts +1 -0
  143. package/dist/hooks/error-diagnostics/types.d.ts +14 -0
  144. package/dist/hooks/foreground-fallback/handler.d.ts +22 -0
  145. package/dist/hooks/foreground-fallback/index.d.ts +2 -0
  146. package/dist/hooks/foreground-fallback/plugin.d.ts +1 -0
  147. package/dist/hooks/hashline-diff-enhancer/handler.d.ts +28 -0
  148. package/dist/hooks/hashline-diff-enhancer/index.d.ts +2 -0
  149. package/dist/hooks/hashline-diff-enhancer/plugin.d.ts +1 -0
  150. package/dist/hooks/hashline-read-enhancer/handler.d.ts +4 -0
  151. package/dist/hooks/hashline-read-enhancer/index.d.ts +2 -0
  152. package/dist/hooks/hashline-read-enhancer/plugin.d.ts +1 -0
  153. package/dist/hooks/hook-composer.d.ts +4 -0
  154. package/dist/hooks/hook-ordering.d.ts +9 -0
  155. package/dist/hooks/hook-types.d.ts +3 -0
  156. package/dist/hooks/index.d.ts +6 -0
  157. package/dist/hooks/json-error/handler.d.ts +6 -0
  158. package/dist/hooks/json-error/index.d.ts +2 -0
  159. package/dist/hooks/json-error/plugin.d.ts +1 -0
  160. package/dist/hooks/keyword-detector/handler.d.ts +8 -0
  161. package/dist/hooks/keyword-detector/index.d.ts +3 -0
  162. package/dist/hooks/keyword-detector/plugin.d.ts +1 -0
  163. package/dist/hooks/model-fallback/handler.d.ts +21 -0
  164. package/dist/hooks/model-fallback/index.d.ts +2 -0
  165. package/dist/hooks/model-fallback/plugin.d.ts +1 -0
  166. package/dist/hooks/phase-reminder/handler.d.ts +5 -0
  167. package/dist/hooks/phase-reminder/index.d.ts +2 -0
  168. package/dist/hooks/phase-reminder/plugin.d.ts +1 -0
  169. package/dist/hooks/post-read-nudge/handler.d.ts +6 -0
  170. package/dist/hooks/post-read-nudge/index.d.ts +2 -0
  171. package/dist/hooks/post-read-nudge/plugin.d.ts +1 -0
  172. package/dist/hooks/preemptive-compaction/handler.d.ts +31 -0
  173. package/dist/hooks/preemptive-compaction/index.d.ts +2 -0
  174. package/dist/hooks/preemptive-compaction/plugin.d.ts +1 -0
  175. package/dist/hooks/runtime-fallback/handler.d.ts +21 -0
  176. package/dist/hooks/runtime-fallback/index.d.ts +2 -0
  177. package/dist/hooks/runtime-fallback/plugin.d.ts +1 -0
  178. package/dist/hooks/safe-hook-wrapper.d.ts +2 -0
  179. package/dist/hooks/session-recovery/handler.d.ts +6 -0
  180. package/dist/hooks/session-recovery/index.d.ts +2 -0
  181. package/dist/hooks/session-recovery/plugin.d.ts +1 -0
  182. package/dist/hooks/skill-discovery/plugin.d.ts +1 -0
  183. package/dist/hooks/stop-guard/handler.d.ts +4 -0
  184. package/dist/hooks/stop-guard/index.d.ts +2 -0
  185. package/dist/hooks/stop-guard/plugin.d.ts +1 -0
  186. package/dist/hooks/task-resume-info/handler.d.ts +4 -0
  187. package/dist/hooks/task-resume-info/index.d.ts +2 -0
  188. package/dist/hooks/task-resume-info/plugin.d.ts +1 -0
  189. package/dist/hooks/think-mode/handler.d.ts +4 -0
  190. package/dist/hooks/think-mode/index.d.ts +2 -0
  191. package/dist/hooks/think-mode/plugin.d.ts +1 -0
  192. package/dist/hooks/thinking-block-validator/handler.d.ts +4 -0
  193. package/dist/hooks/thinking-block-validator/index.d.ts +2 -0
  194. package/dist/hooks/thinking-block-validator/plugin.d.ts +1 -0
  195. package/dist/hooks/todo-enforcer/handler.d.ts +4 -0
  196. package/dist/hooks/todo-enforcer/index.d.ts +2 -0
  197. package/dist/hooks/todo-enforcer/plugin.d.ts +1 -0
  198. package/dist/hooks/todowrite-disabler/handler.d.ts +6 -0
  199. package/dist/hooks/todowrite-disabler/index.d.ts +2 -0
  200. package/dist/hooks/todowrite-disabler/plugin.d.ts +1 -0
  201. package/dist/hooks/tool-output-truncator/handler.d.ts +4 -0
  202. package/dist/hooks/tool-output-truncator/index.d.ts +2 -0
  203. package/dist/hooks/tool-output-truncator/plugin.d.ts +1 -0
  204. package/dist/hooks/write-file-guard/handler.d.ts +7 -0
  205. package/dist/hooks/write-file-guard/index.d.ts +2 -0
  206. package/dist/hooks/write-file-guard/plugin.d.ts +1 -0
  207. package/dist/index.d.ts +5 -0
  208. package/dist/index.js +8623 -0
  209. package/dist/plugin/compositor.d.ts +9 -0
  210. package/dist/plugin/index.d.ts +1 -0
  211. package/dist/plugin-api/define-plugin.d.ts +33 -0
  212. package/dist/plugin-api/index.d.ts +3 -0
  213. package/dist/plugin-api/types.d.ts +10 -0
  214. package/dist/registry/agent-aggregator.d.ts +3 -0
  215. package/dist/registry/contribution-aggregator.d.ts +10 -0
  216. package/dist/registry/dependency-resolver.d.ts +3 -0
  217. package/dist/registry/hook-aggregator.d.ts +2 -0
  218. package/dist/registry/index.d.ts +6 -0
  219. package/dist/registry/plugin-registry.d.ts +16 -0
  220. package/dist/registry/tool-aggregator.d.ts +3 -0
  221. package/dist/registry/types.d.ts +9 -0
  222. package/dist/runtime/index.d.ts +7 -0
  223. package/dist/shared/data-path.d.ts +4 -0
  224. package/dist/shared/deep-merge.d.ts +13 -0
  225. package/dist/shared/fallback-chain.d.ts +1 -0
  226. package/dist/shared/index.d.ts +19 -0
  227. package/dist/shared/logger.d.ts +4 -0
  228. package/dist/shared/model-availability.d.ts +1 -0
  229. package/dist/shared/model-normalization.d.ts +6 -0
  230. package/dist/shared/model-prefix-map.d.ts +11 -0
  231. package/dist/shared/model-resolution-pipeline.d.ts +14 -0
  232. package/dist/shared/models-dev.d.ts +29 -0
  233. package/dist/shared/provider-discovery.d.ts +28 -0
  234. package/dist/shared/provider-registry.d.ts +16 -0
  235. package/dist/shared/safe-create-hook.d.ts +3 -0
  236. package/dist/shared/snake-case.d.ts +1 -0
  237. package/dist/shared/truncate-description.d.ts +1 -0
  238. package/dist/test-utils/index.d.ts +6 -0
  239. package/dist/test-utils/mock-agent-config.d.ts +5 -0
  240. package/dist/test-utils/mock-hook-inputs.d.ts +20 -0
  241. package/dist/test-utils/mock-hook-outputs.d.ts +20 -0
  242. package/dist/test-utils/mock-plugin-context.d.ts +6 -0
  243. package/dist/test-utils/mock-sdk-client.d.ts +41 -0
  244. package/dist/test-utils/mock-tool-context.d.ts +6 -0
  245. package/dist/tools/ast-grep/index.d.ts +4 -0
  246. package/dist/tools/ast-grep/replace/handler.d.ts +7 -0
  247. package/dist/tools/ast-grep/replace/plugin.d.ts +1 -0
  248. package/dist/tools/ast-grep/replace/types.d.ts +37 -0
  249. package/dist/tools/ast-grep/search/handler.d.ts +14 -0
  250. package/dist/tools/ast-grep/search/plugin.d.ts +1 -0
  251. package/dist/tools/ast-grep/search/types.d.ts +37 -0
  252. package/dist/tools/background-task/cancel/handler.d.ts +4 -0
  253. package/dist/tools/background-task/cancel/plugin.d.ts +2 -0
  254. package/dist/tools/background-task/cancel/types.d.ts +4 -0
  255. package/dist/tools/background-task/index.d.ts +2 -0
  256. package/dist/tools/background-task/output/handler.d.ts +3 -0
  257. package/dist/tools/background-task/output/plugin.d.ts +2 -0
  258. package/dist/tools/background-task/output/types.d.ts +11 -0
  259. package/dist/tools/bridge.d.ts +7 -0
  260. package/dist/tools/builtin-tools.d.ts +2 -0
  261. package/dist/tools/delegate-task/category-resolver.d.ts +4 -0
  262. package/dist/tools/delegate-task/constants.d.ts +3 -0
  263. package/dist/tools/delegate-task/executor.d.ts +10 -0
  264. package/dist/tools/delegate-task/handler.d.ts +4 -0
  265. package/dist/tools/delegate-task/index.d.ts +7 -0
  266. package/dist/tools/delegate-task/plugin.d.ts +4 -0
  267. package/dist/tools/delegate-task/types.d.ts +17 -0
  268. package/dist/tools/glob/handler.d.ts +7 -0
  269. package/dist/tools/glob/index.d.ts +2 -0
  270. package/dist/tools/glob/plugin.d.ts +1 -0
  271. package/dist/tools/glob/types.d.ts +7 -0
  272. package/dist/tools/grep/handler.d.ts +13 -0
  273. package/dist/tools/grep/index.d.ts +2 -0
  274. package/dist/tools/grep/plugin.d.ts +1 -0
  275. package/dist/tools/grep/types.d.ts +15 -0
  276. package/dist/tools/hashline-edit/constants.d.ts +4 -0
  277. package/dist/tools/hashline-edit/edit-operations.d.ts +4 -0
  278. package/dist/tools/hashline-edit/handler.d.ts +5 -0
  279. package/dist/tools/hashline-edit/hash-computation.d.ts +2 -0
  280. package/dist/tools/hashline-edit/index.d.ts +5 -0
  281. package/dist/tools/hashline-edit/plugin.d.ts +3 -0
  282. package/dist/tools/hashline-edit/types.d.ts +21 -0
  283. package/dist/tools/index.d.ts +4 -0
  284. package/dist/tools/look-at/handler.d.ts +6 -0
  285. package/dist/tools/look-at/index.d.ts +3 -0
  286. package/dist/tools/look-at/plugin.d.ts +1 -0
  287. package/dist/tools/look-at/types.d.ts +9 -0
  288. package/dist/tools/lsp/client.d.ts +7 -0
  289. package/dist/tools/lsp/diagnostics/handler.d.ts +2 -0
  290. package/dist/tools/lsp/diagnostics/plugin.d.ts +1 -0
  291. package/dist/tools/lsp/diagnostics/types.d.ts +13 -0
  292. package/dist/tools/lsp/find-references/handler.d.ts +2 -0
  293. package/dist/tools/lsp/find-references/plugin.d.ts +1 -0
  294. package/dist/tools/lsp/find-references/types.d.ts +8 -0
  295. package/dist/tools/lsp/goto-definition/handler.d.ts +2 -0
  296. package/dist/tools/lsp/goto-definition/plugin.d.ts +1 -0
  297. package/dist/tools/lsp/goto-definition/types.d.ts +7 -0
  298. package/dist/tools/lsp/index.d.ts +6 -0
  299. package/dist/tools/lsp/prepare-rename/handler.d.ts +2 -0
  300. package/dist/tools/lsp/prepare-rename/plugin.d.ts +1 -0
  301. package/dist/tools/lsp/prepare-rename/types.d.ts +7 -0
  302. package/dist/tools/lsp/rename/handler.d.ts +2 -0
  303. package/dist/tools/lsp/rename/plugin.d.ts +1 -0
  304. package/dist/tools/lsp/rename/types.d.ts +8 -0
  305. package/dist/tools/lsp/symbols/handler.d.ts +2 -0
  306. package/dist/tools/lsp/symbols/plugin.d.ts +1 -0
  307. package/dist/tools/lsp/symbols/types.d.ts +11 -0
  308. package/dist/tools/session-manager/client-context.d.ts +3 -0
  309. package/dist/tools/session-manager/index.d.ts +5 -0
  310. package/dist/tools/session-manager/info/handler.d.ts +3 -0
  311. package/dist/tools/session-manager/info/plugin.d.ts +1 -0
  312. package/dist/tools/session-manager/info/types.d.ts +3 -0
  313. package/dist/tools/session-manager/list/handler.d.ts +3 -0
  314. package/dist/tools/session-manager/list/plugin.d.ts +1 -0
  315. package/dist/tools/session-manager/list/types.d.ts +6 -0
  316. package/dist/tools/session-manager/read/handler.d.ts +3 -0
  317. package/dist/tools/session-manager/read/plugin.d.ts +1 -0
  318. package/dist/tools/session-manager/read/types.d.ts +6 -0
  319. package/dist/tools/session-manager/search/handler.d.ts +3 -0
  320. package/dist/tools/session-manager/search/plugin.d.ts +1 -0
  321. package/dist/tools/session-manager/search/types.d.ts +6 -0
  322. package/dist/tools/session-manager/session-formatter.d.ts +29 -0
  323. package/dist/tools/session-manager/types.d.ts +36 -0
  324. package/dist/tools/shared/constants.d.ts +3 -0
  325. package/dist/tools/skill/handler.d.ts +4 -0
  326. package/dist/tools/skill/index.d.ts +3 -0
  327. package/dist/tools/skill/plugin.d.ts +1 -0
  328. package/dist/tools/skill/types.d.ts +12 -0
  329. package/dist/tools/skill-mcp/handler.d.ts +5 -0
  330. package/dist/tools/skill-mcp/index.d.ts +3 -0
  331. package/dist/tools/skill-mcp/plugin.d.ts +1 -0
  332. package/dist/tools/skill-mcp/types.d.ts +13 -0
  333. package/dist/tools/task/create/handler.d.ts +2 -0
  334. package/dist/tools/task/create/plugin.d.ts +1 -0
  335. package/dist/tools/task/format-task.d.ts +2 -0
  336. package/dist/tools/task/get/handler.d.ts +2 -0
  337. package/dist/tools/task/get/plugin.d.ts +1 -0
  338. package/dist/tools/task/index.d.ts +4 -0
  339. package/dist/tools/task/list/handler.d.ts +2 -0
  340. package/dist/tools/task/list/plugin.d.ts +1 -0
  341. package/dist/tools/task/storage.d.ts +7 -0
  342. package/dist/tools/task/types.d.ts +84 -0
  343. package/dist/tools/task/update/handler.d.ts +2 -0
  344. package/dist/tools/task/update/plugin.d.ts +1 -0
  345. package/dist/tools/tool-builder.d.ts +7 -0
  346. package/dist/tools/tool-registry-adapter.d.ts +3 -0
  347. package/dist/types/agent.d.ts +40 -0
  348. package/dist/types/category.d.ts +22 -0
  349. package/dist/types/config.d.ts +23 -0
  350. package/dist/types/hook.d.ts +18 -0
  351. package/dist/types/index.d.ts +12 -0
  352. package/dist/types/plugin.d.ts +41 -0
  353. package/dist/types/tool.d.ts +7 -0
  354. package/eval/README.md +160 -0
  355. package/eval/ablation-config.yaml +43 -0
  356. package/eval/assertions/ablation-scorer.ts +81 -0
  357. package/eval/assertions/hook-impact.ts +152 -0
  358. package/eval/assertions/task-completion.ts +65 -0
  359. package/eval/assertions/tool-accuracy.ts +56 -0
  360. package/eval/promptfooconfig.yaml +42 -0
  361. package/eval/providers/opencode-baseline.ts +63 -0
  362. package/eval/providers/opencode-client.ts +112 -0
  363. package/eval/providers/opencode-provider.ts +66 -0
  364. package/eval/spike/config.yaml +13 -0
  365. package/eval/spike/provider.ts +15 -0
  366. package/npm-reserve/README.md +19 -0
  367. package/npm-reserve/package.json +24 -0
  368. package/opencode.json +6 -0
  369. package/package.json +47 -8
  370. package/src/agents/advisor/config.ts +6 -0
  371. package/src/agents/advisor/index.ts +2 -0
  372. package/src/agents/advisor/plugin.test.ts +48 -0
  373. package/src/agents/advisor/plugin.ts +17 -0
  374. package/src/agents/advisor/prompt-meta.ts +14 -0
  375. package/src/agents/advisor/prompt.ts +93 -0
  376. package/src/agents/agent-builder.test.ts +66 -0
  377. package/src/agents/agent-builder.ts +97 -0
  378. package/src/agents/agent-plugins.test.ts +98 -0
  379. package/src/agents/agent-registry.ts +25 -0
  380. package/src/agents/builtin-agents.ts +18 -0
  381. package/src/agents/deep-worker/config.ts +6 -0
  382. package/src/agents/deep-worker/index.ts +2 -0
  383. package/src/agents/deep-worker/plugin.test.ts +31 -0
  384. package/src/agents/deep-worker/plugin.ts +16 -0
  385. package/src/agents/deep-worker/prompt-meta.ts +14 -0
  386. package/src/agents/deep-worker/prompt.ts +121 -0
  387. package/src/agents/disabled/analyst/config.ts +6 -0
  388. package/src/agents/disabled/analyst/index.ts +2 -0
  389. package/src/agents/disabled/analyst/plugin.ts +16 -0
  390. package/src/agents/disabled/analyst/prompt.ts +1 -0
  391. package/src/agents/disabled/executor/config.ts +9 -0
  392. package/src/agents/disabled/executor/index.ts +2 -0
  393. package/src/agents/disabled/executor/plugin.ts +16 -0
  394. package/src/agents/disabled/executor/prompt.ts +1 -0
  395. package/src/agents/disabled/inspector/config.ts +6 -0
  396. package/src/agents/disabled/inspector/index.ts +2 -0
  397. package/src/agents/disabled/inspector/plugin.ts +18 -0
  398. package/src/agents/disabled/inspector/prompt.ts +1 -0
  399. package/src/agents/disabled/reviewer/config.ts +6 -0
  400. package/src/agents/disabled/reviewer/index.ts +2 -0
  401. package/src/agents/disabled/reviewer/plugin.ts +18 -0
  402. package/src/agents/disabled/reviewer/prompt.ts +1 -0
  403. package/src/agents/explorer/config.ts +6 -0
  404. package/src/agents/explorer/index.ts +2 -0
  405. package/src/agents/explorer/plugin.test.ts +36 -0
  406. package/src/agents/explorer/plugin.ts +15 -0
  407. package/src/agents/explorer/prompt-meta.ts +14 -0
  408. package/src/agents/explorer/prompt.ts +96 -0
  409. package/src/agents/fallback-chains.ts +13 -0
  410. package/src/agents/index.ts +18 -0
  411. package/src/agents/model-resolution.test.ts +79 -0
  412. package/src/agents/orchestrator/config.ts +10 -0
  413. package/src/agents/orchestrator/index.ts +2 -0
  414. package/src/agents/orchestrator/plugin.test.ts +31 -0
  415. package/src/agents/orchestrator/plugin.ts +16 -0
  416. package/src/agents/orchestrator/prompt-meta.ts +14 -0
  417. package/src/agents/orchestrator/prompt.ts +166 -0
  418. package/src/agents/planner/config.ts +6 -0
  419. package/src/agents/planner/index.ts +2 -0
  420. package/src/agents/planner/plugin.test.ts +31 -0
  421. package/src/agents/planner/plugin.ts +16 -0
  422. package/src/agents/planner/prompt-meta.ts +14 -0
  423. package/src/agents/planner/prompt.ts +138 -0
  424. package/src/agents/prompt-meta.ts +12 -0
  425. package/src/agents/prompt-registry.test.ts +98 -0
  426. package/src/agents/prompt-registry.ts +22 -0
  427. package/src/agents/researcher/config.ts +6 -0
  428. package/src/agents/researcher/index.ts +2 -0
  429. package/src/agents/researcher/plugin.test.ts +31 -0
  430. package/src/agents/researcher/plugin.ts +16 -0
  431. package/src/agents/researcher/prompt-meta.ts +14 -0
  432. package/src/agents/researcher/prompt.ts +116 -0
  433. package/src/agents/tool-restrictions.ts +87 -0
  434. package/src/agents/worker/config.ts +6 -0
  435. package/src/agents/worker/index.ts +2 -0
  436. package/src/agents/worker/plugin.test.ts +31 -0
  437. package/src/agents/worker/plugin.ts +15 -0
  438. package/src/agents/worker/prompt-meta.ts +14 -0
  439. package/src/agents/worker/prompt.ts +83 -0
  440. package/src/bootstrap.integration.test.ts +168 -0
  441. package/src/bootstrap.ts +171 -0
  442. package/src/cli/cli.ts +42 -0
  443. package/src/cli/commands/install.test.ts +40 -0
  444. package/src/cli/commands/install.ts +125 -0
  445. package/src/cli/commands/update.test.ts +84 -0
  446. package/src/cli/commands/update.ts +45 -0
  447. package/src/cli/config-generator.test.ts +178 -0
  448. package/src/cli/config-generator.ts +119 -0
  449. package/src/cli/index.test.ts +34 -0
  450. package/src/cli/index.ts +4 -0
  451. package/src/config/defaults.ts +24 -0
  452. package/src/config/define-config.ts +38 -0
  453. package/src/config/index.ts +6 -0
  454. package/src/config/loader.test.ts +218 -0
  455. package/src/config/loader.ts +89 -0
  456. package/src/config/paths.ts +30 -0
  457. package/src/config/schema.test.ts +69 -0
  458. package/src/config/schema.ts +57 -0
  459. package/src/config/validator.ts +24 -0
  460. package/src/features/auto-update/auto-update.test.ts +105 -0
  461. package/src/features/auto-update/index.ts +4 -0
  462. package/src/features/auto-update/plugin.ts +45 -0
  463. package/src/features/auto-update/update-checker.ts +66 -0
  464. package/src/features/background-agent/concurrency.test.ts +65 -0
  465. package/src/features/background-agent/concurrency.ts +44 -0
  466. package/src/features/background-agent/index.ts +12 -0
  467. package/src/features/background-agent/manager.ts +214 -0
  468. package/src/features/background-agent/poller.test.ts +33 -0
  469. package/src/features/background-agent/poller.ts +75 -0
  470. package/src/features/background-agent/singleton.ts +26 -0
  471. package/src/features/background-agent/spawner.ts +51 -0
  472. package/src/features/background-agent/types.ts +20 -0
  473. package/src/features/builtin-features.ts +5 -0
  474. package/src/features/categories/categories.test.ts +68 -0
  475. package/src/features/categories/category-config.ts +70 -0
  476. package/src/features/categories/category-resolver.ts +36 -0
  477. package/src/features/categories/index.ts +8 -0
  478. package/src/features/categories/prompt-appends.ts +38 -0
  479. package/src/features/loops/file-store.ts +151 -0
  480. package/src/features/loops/handler.ts +89 -0
  481. package/src/features/loops/index.ts +28 -0
  482. package/src/features/loops/loops.test.ts +175 -0
  483. package/src/features/loops/memory-store.ts +53 -0
  484. package/src/features/loops/plugin.ts +107 -0
  485. package/src/features/loops/shared/event-utils.ts +50 -0
  486. package/src/features/loops/state.ts +44 -0
  487. package/src/features/prompt-builder/agent-table-builder.ts +23 -0
  488. package/src/features/prompt-builder/category-section-builder.ts +21 -0
  489. package/src/features/prompt-builder/dynamic-prompt-builder.ts +42 -0
  490. package/src/features/prompt-builder/index.ts +7 -0
  491. package/src/features/prompt-builder/prompt-builder.test.ts +244 -0
  492. package/src/features/prompt-builder/skill-section-builder.ts +25 -0
  493. package/src/features/session-state/index.ts +17 -0
  494. package/src/features/session-state/session-cursor.test.ts +137 -0
  495. package/src/features/session-state/session-cursor.ts +80 -0
  496. package/src/features/session-state/session-store.test.ts +82 -0
  497. package/src/features/session-state/session-store.ts +37 -0
  498. package/src/features/session-state/session-tools-store.ts +18 -0
  499. package/src/features/skills/builtin/git-master.ts +109 -0
  500. package/src/features/skills/index.ts +97 -0
  501. package/src/features/skills/skill-loader.ts +133 -0
  502. package/src/features/skills/skill-merger.ts +15 -0
  503. package/src/features/skills/skills.test.ts +120 -0
  504. package/src/features/slash-commands/command-registry.ts +36 -0
  505. package/src/features/slash-commands/commands/cancel-loop.ts +17 -0
  506. package/src/features/slash-commands/commands/handoff.ts +59 -0
  507. package/src/features/slash-commands/commands/init-deep.ts +40 -0
  508. package/src/features/slash-commands/commands/loop.ts +39 -0
  509. package/src/features/slash-commands/commands/start-work.ts +39 -0
  510. package/src/features/slash-commands/commands/stop-continuation.ts +21 -0
  511. package/src/features/slash-commands/index.ts +2 -0
  512. package/src/features/slash-commands/slash-commands.test.ts +68 -0
  513. package/src/features/slash-commands/types.ts +5 -0
  514. package/src/hooks/anthropic-effort/handler.test.ts +156 -0
  515. package/src/hooks/anthropic-effort/handler.ts +64 -0
  516. package/src/hooks/anthropic-effort/index.ts +3 -0
  517. package/src/hooks/anthropic-effort/plugin.ts +17 -0
  518. package/src/hooks/builtin-hooks.ts +64 -0
  519. package/src/hooks/comment-checker/handler.test.ts +65 -0
  520. package/src/hooks/comment-checker/handler.ts +60 -0
  521. package/src/hooks/comment-checker/index.ts +2 -0
  522. package/src/hooks/comment-checker/plugin.ts +15 -0
  523. package/src/hooks/compaction-context/handler.test.ts +160 -0
  524. package/src/hooks/compaction-context/handler.ts +179 -0
  525. package/src/hooks/compaction-context/index.ts +5 -0
  526. package/src/hooks/compaction-context/plugin.ts +40 -0
  527. package/src/hooks/compaction-todo-preserver/handler.test.ts +155 -0
  528. package/src/hooks/compaction-todo-preserver/handler.ts +129 -0
  529. package/src/hooks/compaction-todo-preserver/index.ts +2 -0
  530. package/src/hooks/compaction-todo-preserver/plugin.ts +18 -0
  531. package/src/hooks/context-injection.test.ts +124 -0
  532. package/src/hooks/context-injector/handlers/agents.test.ts +140 -0
  533. package/src/hooks/context-injector/handlers/agents.ts +101 -0
  534. package/src/hooks/context-injector/handlers/readme.ts +55 -0
  535. package/src/hooks/context-injector/handlers/rules.ts +62 -0
  536. package/src/hooks/context-injector/index.ts +4 -0
  537. package/src/hooks/context-injector/plugin.ts +56 -0
  538. package/src/hooks/context-window-limit/handler.test.ts +103 -0
  539. package/src/hooks/context-window-limit/handler.ts +128 -0
  540. package/src/hooks/context-window-limit/index.ts +6 -0
  541. package/src/hooks/context-window-limit/plugin.ts +15 -0
  542. package/src/hooks/continuation.test.ts +103 -0
  543. package/src/hooks/delegate-retry/handler.test.ts +212 -0
  544. package/src/hooks/delegate-retry/handler.ts +137 -0
  545. package/src/hooks/delegate-retry/index.ts +8 -0
  546. package/src/hooks/delegate-retry/plugin.ts +15 -0
  547. package/src/hooks/edit-error/handler.test.ts +82 -0
  548. package/src/hooks/edit-error/handler.ts +50 -0
  549. package/src/hooks/edit-error/index.ts +6 -0
  550. package/src/hooks/edit-error/plugin.ts +15 -0
  551. package/src/hooks/empty-response-detector/handler.test.ts +133 -0
  552. package/src/hooks/empty-response-detector/handler.ts +62 -0
  553. package/src/hooks/empty-response-detector/index.ts +2 -0
  554. package/src/hooks/empty-response-detector/plugin.ts +18 -0
  555. package/src/hooks/error-diagnostics/error-diagnostics.test.ts +116 -0
  556. package/src/hooks/error-diagnostics/handler.test.ts +147 -0
  557. package/src/hooks/error-diagnostics/handler.ts +135 -0
  558. package/src/hooks/error-diagnostics/patterns.ts +93 -0
  559. package/src/hooks/error-diagnostics/plugin.ts +11 -0
  560. package/src/hooks/error-diagnostics/types.ts +26 -0
  561. package/src/hooks/error-recovery.test.ts +85 -0
  562. package/src/hooks/foreground-fallback/handler.test.ts +229 -0
  563. package/src/hooks/foreground-fallback/handler.ts +294 -0
  564. package/src/hooks/foreground-fallback/index.ts +2 -0
  565. package/src/hooks/foreground-fallback/plugin.ts +18 -0
  566. package/src/hooks/hashline-diff-enhancer/handler.test.ts +166 -0
  567. package/src/hooks/hashline-diff-enhancer/handler.ts +186 -0
  568. package/src/hooks/hashline-diff-enhancer/index.ts +6 -0
  569. package/src/hooks/hashline-diff-enhancer/plugin.ts +24 -0
  570. package/src/hooks/hashline-read-enhancer/handler.test.ts +121 -0
  571. package/src/hooks/hashline-read-enhancer/handler.ts +165 -0
  572. package/src/hooks/hashline-read-enhancer/index.ts +2 -0
  573. package/src/hooks/hashline-read-enhancer/plugin.ts +18 -0
  574. package/src/hooks/hook-composer.test.ts +52 -0
  575. package/src/hooks/hook-composer.ts +17 -0
  576. package/src/hooks/hook-composition.integration.test.ts +274 -0
  577. package/src/hooks/hook-ordering.ts +41 -0
  578. package/src/hooks/hook-types.ts +22 -0
  579. package/src/hooks/index.ts +6 -0
  580. package/src/hooks/json-error/handler.test.ts +95 -0
  581. package/src/hooks/json-error/handler.ts +82 -0
  582. package/src/hooks/json-error/index.ts +6 -0
  583. package/src/hooks/json-error/plugin.ts +15 -0
  584. package/src/hooks/keyword-detector/handler.test.ts +113 -0
  585. package/src/hooks/keyword-detector/handler.ts +73 -0
  586. package/src/hooks/keyword-detector/index.ts +8 -0
  587. package/src/hooks/keyword-detector/plugin.ts +24 -0
  588. package/src/hooks/model-fallback/handler.test.ts +163 -0
  589. package/src/hooks/model-fallback/handler.ts +178 -0
  590. package/src/hooks/model-fallback/index.ts +2 -0
  591. package/src/hooks/model-fallback/plugin.ts +11 -0
  592. package/src/hooks/model-management.test.ts +121 -0
  593. package/src/hooks/phase-reminder/handler.test.ts +105 -0
  594. package/src/hooks/phase-reminder/handler.ts +54 -0
  595. package/src/hooks/phase-reminder/index.ts +2 -0
  596. package/src/hooks/phase-reminder/plugin.ts +18 -0
  597. package/src/hooks/post-read-nudge/handler.test.ts +159 -0
  598. package/src/hooks/post-read-nudge/handler.ts +64 -0
  599. package/src/hooks/post-read-nudge/index.ts +6 -0
  600. package/src/hooks/post-read-nudge/plugin.ts +18 -0
  601. package/src/hooks/preemptive-compaction/handler.test.ts +130 -0
  602. package/src/hooks/preemptive-compaction/handler.ts +84 -0
  603. package/src/hooks/preemptive-compaction/index.ts +2 -0
  604. package/src/hooks/preemptive-compaction/plugin.ts +15 -0
  605. package/src/hooks/productivity.test.ts +332 -0
  606. package/src/hooks/quality.test.ts +330 -0
  607. package/src/hooks/runtime-fallback/handler.test.ts +142 -0
  608. package/src/hooks/runtime-fallback/handler.ts +171 -0
  609. package/src/hooks/runtime-fallback/index.ts +2 -0
  610. package/src/hooks/runtime-fallback/plugin.ts +13 -0
  611. package/src/hooks/safe-hook-wrapper.test.ts +35 -0
  612. package/src/hooks/safe-hook-wrapper.ts +12 -0
  613. package/src/hooks/session-recovery/handler.test.ts +88 -0
  614. package/src/hooks/session-recovery/handler.ts +87 -0
  615. package/src/hooks/session-recovery/index.ts +6 -0
  616. package/src/hooks/session-recovery/plugin.ts +15 -0
  617. package/src/hooks/skill-discovery/plugin.ts +45 -0
  618. package/src/hooks/stop-guard/handler.test.ts +147 -0
  619. package/src/hooks/stop-guard/handler.ts +127 -0
  620. package/src/hooks/stop-guard/index.ts +2 -0
  621. package/src/hooks/stop-guard/plugin.ts +15 -0
  622. package/src/hooks/task-hooks.test.ts +324 -0
  623. package/src/hooks/task-resume-info/handler.test.ts +180 -0
  624. package/src/hooks/task-resume-info/handler.ts +61 -0
  625. package/src/hooks/task-resume-info/index.ts +2 -0
  626. package/src/hooks/task-resume-info/plugin.ts +15 -0
  627. package/src/hooks/think-mode/handler.test.ts +139 -0
  628. package/src/hooks/think-mode/handler.ts +50 -0
  629. package/src/hooks/think-mode/index.ts +2 -0
  630. package/src/hooks/think-mode/plugin.ts +15 -0
  631. package/src/hooks/thinking-block-validator/handler.test.ts +79 -0
  632. package/src/hooks/thinking-block-validator/handler.ts +93 -0
  633. package/src/hooks/thinking-block-validator/index.ts +2 -0
  634. package/src/hooks/thinking-block-validator/plugin.ts +18 -0
  635. package/src/hooks/todo-enforcer/handler.test.ts +153 -0
  636. package/src/hooks/todo-enforcer/handler.ts +100 -0
  637. package/src/hooks/todo-enforcer/index.ts +2 -0
  638. package/src/hooks/todo-enforcer/plugin.ts +15 -0
  639. package/src/hooks/todowrite-disabler/handler.test.ts +119 -0
  640. package/src/hooks/todowrite-disabler/handler.ts +50 -0
  641. package/src/hooks/todowrite-disabler/index.ts +6 -0
  642. package/src/hooks/todowrite-disabler/plugin.ts +46 -0
  643. package/src/hooks/tool-output-truncator/handler.test.ts +113 -0
  644. package/src/hooks/tool-output-truncator/handler.ts +83 -0
  645. package/src/hooks/tool-output-truncator/index.ts +2 -0
  646. package/src/hooks/tool-output-truncator/plugin.ts +18 -0
  647. package/src/hooks/tool-output.test.ts +238 -0
  648. package/src/hooks/workflow-reminders.test.ts +187 -0
  649. package/src/hooks/write-file-guard/handler.test.ts +107 -0
  650. package/src/hooks/write-file-guard/handler.ts +166 -0
  651. package/src/hooks/write-file-guard/index.ts +2 -0
  652. package/src/hooks/write-file-guard/plugin.ts +23 -0
  653. package/src/index.ts +8 -0
  654. package/src/plugin/compositor.ts +99 -0
  655. package/src/plugin/index.ts +1 -0
  656. package/src/plugin-api/define-plugin.test.ts +66 -0
  657. package/src/plugin-api/define-plugin.ts +36 -0
  658. package/src/plugin-api/index.ts +26 -0
  659. package/src/plugin-api/types.ts +28 -0
  660. package/src/registry/agent-aggregator.ts +13 -0
  661. package/src/registry/contribution-aggregator.test.ts +62 -0
  662. package/src/registry/contribution-aggregator.ts +114 -0
  663. package/src/registry/contribution-conflicts.integration.test.ts +186 -0
  664. package/src/registry/dependency-resolver.test.ts +35 -0
  665. package/src/registry/dependency-resolver.ts +64 -0
  666. package/src/registry/hook-aggregator.test.ts +78 -0
  667. package/src/registry/hook-aggregator.ts +63 -0
  668. package/src/registry/index.ts +6 -0
  669. package/src/registry/plugin-lifecycle.integration.test.ts +94 -0
  670. package/src/registry/plugin-overrides.integration.test.ts +140 -0
  671. package/src/registry/plugin-registry.test.ts +56 -0
  672. package/src/registry/plugin-registry.ts +82 -0
  673. package/src/registry/tool-aggregator.ts +13 -0
  674. package/src/registry/types.ts +11 -0
  675. package/src/runtime/index.ts +43 -0
  676. package/src/shared/data-path.ts +18 -0
  677. package/src/shared/deep-merge.test.ts +36 -0
  678. package/src/shared/deep-merge.ts +61 -0
  679. package/src/shared/fallback-chain.ts +8 -0
  680. package/src/shared/index.ts +59 -0
  681. package/src/shared/logger.ts +54 -0
  682. package/src/shared/model-availability.ts +18 -0
  683. package/src/shared/model-normalization.test.ts +75 -0
  684. package/src/shared/model-normalization.ts +28 -0
  685. package/src/shared/model-prefix-map.test.ts +75 -0
  686. package/src/shared/model-prefix-map.ts +58 -0
  687. package/src/shared/model-resolution-pipeline.test.ts +111 -0
  688. package/src/shared/model-resolution-pipeline.ts +55 -0
  689. package/src/shared/models-dev.test.ts +277 -0
  690. package/src/shared/models-dev.ts +176 -0
  691. package/src/shared/provider-discovery.test.ts +97 -0
  692. package/src/shared/provider-discovery.ts +73 -0
  693. package/src/shared/provider-registry.test.ts +212 -0
  694. package/src/shared/provider-registry.ts +157 -0
  695. package/src/shared/safe-create-hook.ts +15 -0
  696. package/src/shared/snake-case.ts +7 -0
  697. package/src/shared/truncate-description.ts +6 -0
  698. package/src/test-utils/index.ts +6 -0
  699. package/src/test-utils/mock-agent-config.ts +13 -0
  700. package/src/test-utils/mock-hook-inputs.ts +148 -0
  701. package/src/test-utils/mock-hook-outputs.ts +153 -0
  702. package/src/test-utils/mock-plugin-context.test.ts +32 -0
  703. package/src/test-utils/mock-plugin-context.ts +21 -0
  704. package/src/test-utils/mock-sdk-client.ts +52 -0
  705. package/src/test-utils/mock-tool-context.ts +24 -0
  706. package/src/tools/ast-grep/index.ts +4 -0
  707. package/src/tools/ast-grep/replace/handler.test.ts +93 -0
  708. package/src/tools/ast-grep/replace/handler.ts +89 -0
  709. package/src/tools/ast-grep/replace/plugin.ts +10 -0
  710. package/src/tools/ast-grep/replace/types.ts +14 -0
  711. package/src/tools/ast-grep/search/handler.test.ts +94 -0
  712. package/src/tools/ast-grep/search/handler.ts +93 -0
  713. package/src/tools/ast-grep/search/plugin.ts +10 -0
  714. package/src/tools/ast-grep/search/types.ts +42 -0
  715. package/src/tools/background-task/background-task.test.ts +185 -0
  716. package/src/tools/background-task/cancel/handler.test.ts +141 -0
  717. package/src/tools/background-task/cancel/handler.ts +52 -0
  718. package/src/tools/background-task/cancel/plugin.ts +30 -0
  719. package/src/tools/background-task/cancel/types.ts +4 -0
  720. package/src/tools/background-task/index.ts +2 -0
  721. package/src/tools/background-task/output/handler.test.ts +142 -0
  722. package/src/tools/background-task/output/handler.ts +93 -0
  723. package/src/tools/background-task/output/plugin.ts +60 -0
  724. package/src/tools/background-task/output/types.ts +11 -0
  725. package/src/tools/bridge.test.ts +55 -0
  726. package/src/tools/bridge.ts +13 -0
  727. package/src/tools/builtin-tools.ts +54 -0
  728. package/src/tools/code-search.test.ts +203 -0
  729. package/src/tools/delegate-task/category-resolver.ts +18 -0
  730. package/src/tools/delegate-task/constants.ts +43 -0
  731. package/src/tools/delegate-task/delegate-task.test.ts +245 -0
  732. package/src/tools/delegate-task/executor.ts +157 -0
  733. package/src/tools/delegate-task/handler.ts +107 -0
  734. package/src/tools/delegate-task/index.ts +7 -0
  735. package/src/tools/delegate-task/plugin.ts +30 -0
  736. package/src/tools/delegate-task/types.ts +19 -0
  737. package/src/tools/glob/handler.test.ts +80 -0
  738. package/src/tools/glob/handler.ts +74 -0
  739. package/src/tools/glob/index.ts +2 -0
  740. package/src/tools/glob/plugin.ts +10 -0
  741. package/src/tools/glob/types.ts +14 -0
  742. package/src/tools/grep/handler.test.ts +79 -0
  743. package/src/tools/grep/handler.ts +104 -0
  744. package/src/tools/grep/index.ts +2 -0
  745. package/src/tools/grep/plugin.ts +10 -0
  746. package/src/tools/grep/types.ts +28 -0
  747. package/src/tools/hashline-edit/constants.ts +10 -0
  748. package/src/tools/hashline-edit/edit-operations.ts +115 -0
  749. package/src/tools/hashline-edit/handler.test.ts +105 -0
  750. package/src/tools/hashline-edit/handler.ts +33 -0
  751. package/src/tools/hashline-edit/hash-computation.ts +20 -0
  752. package/src/tools/hashline-edit/hashline-edit.test.ts +62 -0
  753. package/src/tools/hashline-edit/index.ts +5 -0
  754. package/src/tools/hashline-edit/plugin.ts +28 -0
  755. package/src/tools/hashline-edit/types.ts +42 -0
  756. package/src/tools/index.ts +4 -0
  757. package/src/tools/look-at/handler.test.ts +189 -0
  758. package/src/tools/look-at/handler.ts +232 -0
  759. package/src/tools/look-at/index.ts +3 -0
  760. package/src/tools/look-at/look-at.test.ts +200 -0
  761. package/src/tools/look-at/plugin.ts +10 -0
  762. package/src/tools/look-at/types.ts +17 -0
  763. package/src/tools/lsp/client.ts +145 -0
  764. package/src/tools/lsp/diagnostics/handler.test.ts +94 -0
  765. package/src/tools/lsp/diagnostics/handler.ts +39 -0
  766. package/src/tools/lsp/diagnostics/plugin.ts +10 -0
  767. package/src/tools/lsp/diagnostics/types.ts +15 -0
  768. package/src/tools/lsp/find-references/handler.test.ts +79 -0
  769. package/src/tools/lsp/find-references/handler.ts +38 -0
  770. package/src/tools/lsp/find-references/plugin.ts +10 -0
  771. package/src/tools/lsp/find-references/types.ts +10 -0
  772. package/src/tools/lsp/goto-definition/handler.test.ts +80 -0
  773. package/src/tools/lsp/goto-definition/handler.ts +38 -0
  774. package/src/tools/lsp/goto-definition/plugin.ts +10 -0
  775. package/src/tools/lsp/goto-definition/types.ts +9 -0
  776. package/src/tools/lsp/index.ts +6 -0
  777. package/src/tools/lsp/lsp-tools.test.ts +150 -0
  778. package/src/tools/lsp/prepare-rename/handler.test.ts +81 -0
  779. package/src/tools/lsp/prepare-rename/handler.ts +34 -0
  780. package/src/tools/lsp/prepare-rename/plugin.ts +10 -0
  781. package/src/tools/lsp/prepare-rename/types.ts +9 -0
  782. package/src/tools/lsp/rename/handler.test.ts +87 -0
  783. package/src/tools/lsp/rename/handler.ts +34 -0
  784. package/src/tools/lsp/rename/plugin.ts +10 -0
  785. package/src/tools/lsp/rename/types.ts +10 -0
  786. package/src/tools/lsp/symbols/handler.test.ts +108 -0
  787. package/src/tools/lsp/symbols/handler.ts +43 -0
  788. package/src/tools/lsp/symbols/plugin.ts +10 -0
  789. package/src/tools/lsp/symbols/types.ts +13 -0
  790. package/src/tools/session-manager/client-context.ts +16 -0
  791. package/src/tools/session-manager/index.ts +5 -0
  792. package/src/tools/session-manager/info/handler.test.ts +100 -0
  793. package/src/tools/session-manager/info/handler.ts +27 -0
  794. package/src/tools/session-manager/info/plugin.ts +40 -0
  795. package/src/tools/session-manager/info/types.ts +3 -0
  796. package/src/tools/session-manager/list/handler.test.ts +122 -0
  797. package/src/tools/session-manager/list/handler.ts +56 -0
  798. package/src/tools/session-manager/list/plugin.ts +52 -0
  799. package/src/tools/session-manager/list/types.ts +6 -0
  800. package/src/tools/session-manager/read/handler.test.ts +114 -0
  801. package/src/tools/session-manager/read/handler.ts +36 -0
  802. package/src/tools/session-manager/read/plugin.ts +57 -0
  803. package/src/tools/session-manager/read/types.ts +6 -0
  804. package/src/tools/session-manager/search/handler.test.ts +115 -0
  805. package/src/tools/session-manager/search/handler.ts +72 -0
  806. package/src/tools/session-manager/search/plugin.ts +57 -0
  807. package/src/tools/session-manager/search/types.ts +6 -0
  808. package/src/tools/session-manager/session-formatter.ts +315 -0
  809. package/src/tools/session-manager/session-manager.test.ts +254 -0
  810. package/src/tools/session-manager/types.ts +41 -0
  811. package/src/tools/shared/constants.ts +3 -0
  812. package/src/tools/skill/handler.test.ts +57 -0
  813. package/src/tools/skill/handler.ts +27 -0
  814. package/src/tools/skill/index.ts +3 -0
  815. package/src/tools/skill/plugin.ts +41 -0
  816. package/src/tools/skill/types.ts +14 -0
  817. package/src/tools/skill-mcp/handler.test.ts +68 -0
  818. package/src/tools/skill-mcp/handler.ts +84 -0
  819. package/src/tools/skill-mcp/index.ts +3 -0
  820. package/src/tools/skill-mcp/plugin.ts +37 -0
  821. package/src/tools/skill-mcp/types.ts +15 -0
  822. package/src/tools/skill-tools.test.ts +172 -0
  823. package/src/tools/task/create/handler.test.ts +64 -0
  824. package/src/tools/task/create/handler.ts +43 -0
  825. package/src/tools/task/create/plugin.ts +10 -0
  826. package/src/tools/task/format-task.test.ts +37 -0
  827. package/src/tools/task/format-task.ts +19 -0
  828. package/src/tools/task/get/handler.test.ts +76 -0
  829. package/src/tools/task/get/handler.ts +35 -0
  830. package/src/tools/task/get/plugin.ts +10 -0
  831. package/src/tools/task/index.ts +4 -0
  832. package/src/tools/task/list/handler.test.ts +70 -0
  833. package/src/tools/task/list/handler.ts +48 -0
  834. package/src/tools/task/list/plugin.ts +10 -0
  835. package/src/tools/task/storage.ts +14 -0
  836. package/src/tools/task/task.test.ts +165 -0
  837. package/src/tools/task/types.ts +51 -0
  838. package/src/tools/task/update/handler.test.ts +86 -0
  839. package/src/tools/task/update/handler.ts +54 -0
  840. package/src/tools/task/update/plugin.ts +10 -0
  841. package/src/tools/tool-builder.test.ts +32 -0
  842. package/src/tools/tool-builder.ts +24 -0
  843. package/src/tools/tool-registry-adapter.test.ts +51 -0
  844. package/src/tools/tool-registry-adapter.ts +19 -0
  845. package/src/types/agent.ts +53 -0
  846. package/src/types/category.ts +32 -0
  847. package/src/types/config.ts +26 -0
  848. package/src/types/hook.ts +44 -0
  849. package/src/types/index.ts +12 -0
  850. package/src/types/plugin.ts +47 -0
  851. package/src/types/tool.ts +10 -0
  852. package/test-setup.ts +8 -0
  853. package/tsconfig.json +20 -0
  854. /package/{index.js → npm-reserve/index.js} +0 -0
@@ -0,0 +1,109 @@
1
+ import type { Skill } from "../skill-loader";
2
+
3
+ export const gitMasterSkill: Skill = {
4
+ name: "git-master",
5
+ description:
6
+ "MUST USE for any git operations. Atomic commits, branch strategy, rebase safety, and PR readiness workflow.",
7
+ template: `# Git Master
8
+
9
+ You are a Git specialist focused on clean history, safe collaboration, and reviewer-friendly pull requests.
10
+
11
+ ## Operating Principles
12
+
13
+ 1. Make atomic commits that can be reverted independently.
14
+ 2. Keep branch history readable for reviewers.
15
+ 3. Never run destructive git commands unless explicitly asked.
16
+ 4. Prefer safe defaults: \`--force-with-lease\` over \`--force\`, never rewrite shared main/master history.
17
+
18
+ ## Commit Strategy
19
+
20
+ ### Before committing
21
+
22
+ - Inspect status and both staged/unstaged diff.
23
+ - Detect existing commit-message style from recent history.
24
+ - Group changes by concern, not by file extension.
25
+ - Pair implementation and tests in the same commit.
26
+
27
+ ### Atomic grouping rules
28
+
29
+ - 3+ changed files across unrelated concerns must be split.
30
+ - Different directories generally imply different commits.
31
+ - A commit message should explain intent and impact, not file list.
32
+
33
+ ### Message style
34
+
35
+ - Follow repository conventions (semantic or plain style based on git log).
36
+ - Keep messages concise and specific.
37
+ - Avoid vague messages like "update" or "fix stuff".
38
+
39
+ ## Branch Naming
40
+
41
+ Use descriptive branch names:
42
+
43
+ - \`feat/<short-feature>\`
44
+ - \`fix/<bug-summary>\`
45
+ - \`refactor/<scope>\`
46
+ - \`chore/<task>\`
47
+
48
+ Examples:
49
+
50
+ - \`feat/skill-loader-project-overrides\`
51
+ - \`fix/retry-timeout-handling\`
52
+
53
+ ## Rebase and History Cleanup
54
+
55
+ ### Safe rebase policy
56
+
57
+ - Never rebase main/master directly.
58
+ - Rebase feature branches onto latest base branch before PR.
59
+ - If branch was pushed and rewritten, communicate clearly and use \`--force-with-lease\`.
60
+
61
+ ### Conflict handling
62
+
63
+ 1. Resolve conflicts file-by-file.
64
+ 2. Keep intended behavior and tests intact.
65
+ 3. Run validation again after conflict resolution.
66
+
67
+ ## Pull Request Workflow
68
+
69
+ ### Pre-PR checklist
70
+
71
+ - Working tree clean.
72
+ - Typecheck and tests pass.
73
+ - Commits are logically split and ordered.
74
+ - PR diff is scoped and reviewable.
75
+
76
+ ### PR content
77
+
78
+ - Title: concise summary of user value.
79
+ - Body should include:
80
+ - Summary
81
+ - Validation done
82
+ - Risks / follow-ups
83
+
84
+ ## Safety Rules
85
+
86
+ - Never commit secrets (\`.env\`, credential files, tokens).
87
+ - Never bypass hooks unless explicitly requested.
88
+ - Never force-push to main/master.
89
+ - Prefer a new commit over amend after hook failure.
90
+
91
+ ## Quick Command Sequence
92
+
93
+ \`\`\`bash
94
+ git status
95
+ git diff --staged --stat
96
+ git diff --stat
97
+ git log -20 --pretty=format:"%s"
98
+ \`\`\`
99
+
100
+ Then create focused commits in dependency order and verify with:
101
+
102
+ \`\`\`bash
103
+ git status
104
+ git log --oneline --decorate -20
105
+ \`\`\`
106
+
107
+ Apply this workflow for all git operations unless the user gives explicit alternative constraints.
108
+ `,
109
+ };
@@ -0,0 +1,97 @@
1
+ import { mkdirSync, readdirSync, rmSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { log } from "../../shared/logger";
4
+ import { getDataDir } from "../../shared/data-path";
5
+ import { gitMasterSkill } from "./builtin/git-master";
6
+ import {
7
+ createProjectSkillLoader,
8
+ loadProjectSkills,
9
+ type Skill,
10
+ type SkillLoader,
11
+ } from "./skill-loader";
12
+ import { mergeSkills } from "./skill-merger";
13
+ import * as skillHandler from "../../tools/skill/handler";
14
+
15
+ export { gitMasterSkill } from "./builtin/git-master";
16
+ export { createProjectSkillLoader, loadProjectSkills } from "./skill-loader";
17
+ export { mergeSkills } from "./skill-merger";
18
+ export type { Skill, SkillInfo, SkillLoader } from "./skill-loader";
19
+
20
+ export function getBuiltinSkills(): Skill[] {
21
+ return [gitMasterSkill];
22
+ }
23
+
24
+ function skillToMarkdown(skill: Skill): string {
25
+ return `---\nname: ${skill.name}\ndescription: ${skill.description}\n---\n\n${skill.template.trim()}\n`;
26
+ }
27
+
28
+ export function getBuiltinSkillsDir(): string | null {
29
+ try {
30
+ return join(getDataDir(), "goatcode-sh", "skills");
31
+ } catch (err) {
32
+ log("[skills] Failed to resolve built-in skills directory", { err });
33
+ return null;
34
+ }
35
+ }
36
+
37
+ export function syncBuiltinSkillFiles(): string | null {
38
+ const skillsDir = getBuiltinSkillsDir();
39
+ if (!skillsDir) return null;
40
+
41
+ const builtinSkills = getBuiltinSkills();
42
+ const expected = new Set(builtinSkills.map((skill) => skill.name));
43
+ let syncFailed = false;
44
+
45
+ try {
46
+ mkdirSync(skillsDir, { recursive: true });
47
+ for (const entry of readdirSync(skillsDir, { withFileTypes: true })) {
48
+ if (entry.isDirectory() && !expected.has(entry.name)) {
49
+ rmSync(join(skillsDir, entry.name), { recursive: true, force: true });
50
+ }
51
+ }
52
+ } catch (err) {
53
+ syncFailed = true;
54
+ log("[skills] Failed to reconcile built-in skills directory", { err });
55
+ }
56
+
57
+ for (const skill of builtinSkills) {
58
+ const skillDir = join(skillsDir, skill.name);
59
+ const skillFile = join(skillDir, "SKILL.md");
60
+
61
+ try {
62
+ mkdirSync(skillDir, { recursive: true });
63
+ writeFileSync(skillFile, skillToMarkdown(skill), "utf8");
64
+ } catch (err) {
65
+ syncFailed = true;
66
+ log(`[skills] Failed to write skill file: ${skillFile}`, { err });
67
+ }
68
+ }
69
+ return syncFailed ? null : skillsDir;
70
+ }
71
+
72
+ export function createMergedSkillLoader(directory: string): SkillLoader {
73
+ const projectSkills = loadProjectSkills(directory);
74
+ const mergedSkills = mergeSkills(getBuiltinSkills(), projectSkills);
75
+ const byName = new Map(mergedSkills.map((skill) => [skill.name, skill.template]));
76
+
77
+ return {
78
+ load(name: string): string | undefined {
79
+ return byName.get(name);
80
+ },
81
+ list() {
82
+ return mergedSkills.map((s) => ({ name: s.name, description: s.description }));
83
+ },
84
+ };
85
+ }
86
+
87
+ export function registerProjectSkillLoader(directory: string): void {
88
+ syncBuiltinSkillFiles();
89
+
90
+ if (typeof skillHandler.registerSkillLoader === "function") {
91
+ const loader = createMergedSkillLoader(directory);
92
+ skillHandler.registerSkillLoader(loader);
93
+ return;
94
+ }
95
+
96
+ log("[skills] registerSkillLoader not available in handler module");
97
+ }
@@ -0,0 +1,133 @@
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import { basename, join } from "node:path";
3
+ import { log } from "../../shared/logger";
4
+
5
+ export type Skill = {
6
+ name: string;
7
+ description: string;
8
+ template: string;
9
+ };
10
+
11
+ export type SkillInfo = {
12
+ name: string;
13
+ description: string;
14
+ };
15
+
16
+ export type SkillLoader = {
17
+ load(name: string): string | undefined;
18
+ list(): SkillInfo[];
19
+ };
20
+
21
+ type ParsedSkillFrontmatter = {
22
+ name?: string;
23
+ description?: string;
24
+ body: string;
25
+ };
26
+
27
+ const SKILLS_RELATIVE_DIR = ".opencode/skills";
28
+
29
+ export function parseSkillMarkdown(markdown: string): ParsedSkillFrontmatter {
30
+ const normalized = markdown.replace(/\r\n/g, "\n");
31
+ if (!normalized.startsWith("---\n")) {
32
+ return { body: normalized.trim() };
33
+ }
34
+
35
+ const closingIndex = normalized.indexOf("\n---\n", 4);
36
+ if (closingIndex < 0) {
37
+ return { body: normalized.trim() };
38
+ }
39
+
40
+ const frontmatterBlock = normalized.slice(4, closingIndex);
41
+ const body = normalized.slice(closingIndex + 5).trim();
42
+ const parsed: ParsedSkillFrontmatter = { body };
43
+
44
+ for (const line of frontmatterBlock.split("\n")) {
45
+ const separatorIndex = line.indexOf(":");
46
+ if (separatorIndex <= 0) {
47
+ continue;
48
+ }
49
+
50
+ const key = line.slice(0, separatorIndex).trim();
51
+ const rawValue = line.slice(separatorIndex + 1).trim();
52
+ const value = stripSurroundingQuotes(rawValue);
53
+
54
+ if (key === "name") {
55
+ parsed.name = value;
56
+ continue;
57
+ }
58
+
59
+ if (key === "description") {
60
+ parsed.description = value;
61
+ }
62
+ }
63
+
64
+ return parsed;
65
+ }
66
+
67
+ export function loadProjectSkills(directory: string): Skill[] {
68
+ const skillsDir = join(directory, SKILLS_RELATIVE_DIR);
69
+ if (!existsSync(skillsDir)) {
70
+ return [];
71
+ }
72
+
73
+ const files = readdirSync(skillsDir).filter((entry) => entry.endsWith(".md"));
74
+ const skills: Skill[] = [];
75
+
76
+ for (const fileName of files) {
77
+ const filePath = join(skillsDir, fileName);
78
+
79
+ try {
80
+ const content = readFileSync(filePath, "utf8");
81
+ const parsed = parseSkillMarkdown(content);
82
+ const fallbackName = basename(fileName, ".md");
83
+ const name = parsed.name?.trim() || fallbackName;
84
+ const description = parsed.description?.trim() || "";
85
+ const template = parsed.body.trim();
86
+
87
+ if (!name || !template) {
88
+ log("[skills] skipped invalid project skill", {
89
+ filePath,
90
+ name,
91
+ hasTemplate: template.length > 0,
92
+ });
93
+ continue;
94
+ }
95
+
96
+ skills.push({ name, description, template });
97
+ } catch (error) {
98
+ log("[skills] failed to load project skill file", { filePath, error });
99
+ }
100
+ }
101
+
102
+ return skills;
103
+ }
104
+
105
+ export function createProjectSkillLoader(directory: string): SkillLoader {
106
+ const skills = loadProjectSkills(directory);
107
+ const byName = new Map(skills.map((skill) => [skill.name, skill.template]));
108
+
109
+ return {
110
+ load(name: string): string | undefined {
111
+ return byName.get(name);
112
+ },
113
+ list(): SkillInfo[] {
114
+ return skills.map((s) => ({ name: s.name, description: s.description }));
115
+ },
116
+ };
117
+ }
118
+
119
+ function stripSurroundingQuotes(value: string): string {
120
+ if (value.length < 2) {
121
+ return value;
122
+ }
123
+
124
+ if (value.startsWith('"') && value.endsWith('"')) {
125
+ return value.slice(1, -1);
126
+ }
127
+
128
+ if (value.startsWith("'") && value.endsWith("'")) {
129
+ return value.slice(1, -1);
130
+ }
131
+
132
+ return value;
133
+ }
@@ -0,0 +1,15 @@
1
+ import type { Skill } from "./skill-loader";
2
+
3
+ export function mergeSkills(builtinSkills: Skill[], userSkills: Skill[]): Skill[] {
4
+ const merged = new Map<string, Skill>();
5
+
6
+ for (const builtinSkill of builtinSkills) {
7
+ merged.set(builtinSkill.name, builtinSkill);
8
+ }
9
+
10
+ for (const userSkill of userSkills) {
11
+ merged.set(userSkill.name, userSkill);
12
+ }
13
+
14
+ return Array.from(merged.values());
15
+ }
@@ -0,0 +1,120 @@
1
+ import { afterEach, describe, expect, it } from "bun:test";
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import {
6
+ createMergedSkillLoader,
7
+ gitMasterSkill,
8
+ loadProjectSkills,
9
+ mergeSkills,
10
+ registerProjectSkillLoader,
11
+ } from "./index";
12
+
13
+ const tempDirectories: string[] = [];
14
+
15
+ afterEach(() => {
16
+ for (const tempDirectory of tempDirectories.splice(0)) {
17
+ rmSync(tempDirectory, { recursive: true, force: true });
18
+ }
19
+ });
20
+
21
+ describe("#given builtin git-master skill", () => {
22
+ describe("#when reading its metadata", () => {
23
+ it("#then it has name, description, and non-empty template", () => {
24
+ expect(gitMasterSkill.name).toBe("git-master");
25
+ expect(gitMasterSkill.description.length).toBeGreaterThan(0);
26
+ expect(gitMasterSkill.template.length).toBeGreaterThan(0);
27
+ });
28
+ });
29
+ });
30
+
31
+ describe("#given project skills in .opencode/skills", () => {
32
+ describe("#when loading markdown files", () => {
33
+ it("#then frontmatter + body are parsed into skills", () => {
34
+ const projectDirectory = createTempProjectDirectory();
35
+ writeProjectSkill(
36
+ projectDirectory,
37
+ "release-checklist.md",
38
+ `---
39
+ name: release-checklist
40
+ description: release readiness checks
41
+ ---
42
+ Validate release notes and run smoke tests.
43
+ `,
44
+ );
45
+
46
+ const loaded = loadProjectSkills(projectDirectory);
47
+
48
+ expect(loaded).toHaveLength(1);
49
+ expect(loaded[0]).toEqual({
50
+ name: "release-checklist",
51
+ description: "release readiness checks",
52
+ template: "Validate release notes and run smoke tests.",
53
+ });
54
+ });
55
+ });
56
+ });
57
+
58
+ describe("#given builtin and user skills with same name", () => {
59
+ describe("#when merging skills", () => {
60
+ it("#then user skill overrides builtin by name", () => {
61
+ const merged = mergeSkills(
62
+ [{ name: "git-master", description: "builtin", template: "builtin template" }],
63
+ [{ name: "git-master", description: "user", template: "user template" }],
64
+ );
65
+
66
+ expect(merged).toHaveLength(1);
67
+ expect(merged[0]).toEqual({
68
+ name: "git-master",
69
+ description: "user",
70
+ template: "user template",
71
+ });
72
+ });
73
+ });
74
+ });
75
+
76
+ describe("#given a user override file for git-master", () => {
77
+ describe("#when creating merged skill loader", () => {
78
+ it("#then load('git-master') returns user template", () => {
79
+ const projectDirectory = createTempProjectDirectory();
80
+ writeProjectSkill(
81
+ projectDirectory,
82
+ "git-master.md",
83
+ `---
84
+ name: git-master
85
+ description: custom project git policy
86
+ ---
87
+ Use custom git policy for this repository.
88
+ `,
89
+ );
90
+
91
+ const loader = createMergedSkillLoader(projectDirectory);
92
+
93
+ expect(loader.load("git-master")).toBe("Use custom git policy for this repository.");
94
+ });
95
+ });
96
+ });
97
+
98
+ describe("#given registerProjectSkillLoader", () => {
99
+ describe("#when skillHandler.registerSkillLoader is not available", () => {
100
+ it("#then logs that registration is unavailable without throwing", () => {
101
+ //#given
102
+ const projectDirectory = createTempProjectDirectory();
103
+
104
+ //#when / #then — should not throw
105
+ expect(() => registerProjectSkillLoader(projectDirectory)).not.toThrow();
106
+ });
107
+ });
108
+ });
109
+
110
+ function createTempProjectDirectory(): string {
111
+ const directory = mkdtempSync(join(tmpdir(), "goatcode-skills-"));
112
+ tempDirectories.push(directory);
113
+ return directory;
114
+ }
115
+
116
+ function writeProjectSkill(projectDirectory: string, fileName: string, contents: string): void {
117
+ const skillDirectory = join(projectDirectory, ".opencode", "skills");
118
+ mkdirSync(skillDirectory, { recursive: true });
119
+ writeFileSync(join(skillDirectory, fileName), contents, "utf8");
120
+ }
@@ -0,0 +1,36 @@
1
+ import { log } from "../../shared/logger";
2
+ import type { SlashCommand } from "./types";
3
+ import { loopCommand } from "./commands/loop";
4
+ import { cancelLoopCommand } from "./commands/cancel-loop";
5
+ import { startWorkCommand } from "./commands/start-work";
6
+ import { stopContinuationCommand } from "./commands/stop-continuation";
7
+ import { handoffCommand } from "./commands/handoff";
8
+ import { initDeepCommand } from "./commands/init-deep";
9
+
10
+ const COMMANDS: SlashCommand[] = [
11
+ loopCommand,
12
+ cancelLoopCommand,
13
+ startWorkCommand,
14
+ stopContinuationCommand,
15
+ handoffCommand,
16
+ initDeepCommand,
17
+ ];
18
+
19
+ const COMMAND_MAP: Map<string, SlashCommand> = new Map();
20
+ for (const cmd of COMMANDS) {
21
+ if (COMMAND_MAP.has(cmd.name)) {
22
+ throw new Error(`Duplicate slash command name detected: ${cmd.name}`);
23
+ }
24
+ COMMAND_MAP.set(cmd.name, cmd);
25
+ }
26
+
27
+ export function getCommand(name: string): SlashCommand | undefined {
28
+ const command = COMMAND_MAP.get(name);
29
+ log("slash-commands: getCommand", { name, found: command !== undefined });
30
+ return command;
31
+ }
32
+
33
+ export function getAllCommands(): SlashCommand[] {
34
+ log("slash-commands: getAllCommands", { count: COMMANDS.length });
35
+ return [...COMMANDS];
36
+ }
@@ -0,0 +1,17 @@
1
+ import type { SlashCommand } from "../types";
2
+
3
+ export const cancelLoopCommand: SlashCommand = {
4
+ name: "cancel-loop",
5
+ description: "Cancel active loop and clear persisted loop state",
6
+ template: `<command-instruction>
7
+ Cancel the currently active unified loop.
8
+
9
+ This will:
10
+ 1. Stop the loop from continuing
11
+ 2. Clear in-memory loop state for the session
12
+ 3. Remove only this session's loop entry from .sisyphus/loop-state.json (do not delete other sessions)
13
+ 4. Allow the session to end normally
14
+
15
+ Check if a loop is active, cancel it, and inform the user of the result.
16
+ </command-instruction>`,
17
+ };
@@ -0,0 +1,59 @@
1
+ import type { SlashCommand } from "../types";
2
+
3
+ export const handoffCommand: SlashCommand = {
4
+ name: "handoff",
5
+ description: "Create a detailed context summary for continuing work in a new session",
6
+ template: `<command-instruction>
7
+ # Handoff Command
8
+
9
+ ## Purpose
10
+
11
+ Use /handoff when:
12
+ - The current session context is getting too long and quality is degrading
13
+ - You want to start fresh while preserving essential context from this session
14
+ - The context window is approaching capacity
15
+
16
+ This creates a detailed context summary that can be used to continue work in a new session.
17
+
18
+ ## PHASE 1: GATHER PROGRAMMATIC CONTEXT
19
+
20
+ Execute these tools to gather concrete data:
21
+
22
+ 1. session_read({ session_id: "$SESSION_ID" }) - full session history
23
+ 2. todoread() - current task progress
24
+ 3. Bash({ command: "git diff --stat HEAD~10..HEAD" }) - recent file changes
25
+ 4. Bash({ command: "git status --porcelain" }) - uncommitted changes
26
+
27
+ ## PHASE 2: EXTRACT CONTEXT
28
+
29
+ Write the context summary from first person perspective ("I did...", "I told you...").
30
+
31
+ Focus on:
32
+ - Capabilities and behavior, not file-by-file implementation details
33
+ - What matters for continuing the work
34
+ - USER REQUESTS (AS-IS) must be verbatim (do not paraphrase)
35
+ - EXPLICIT CONSTRAINTS must be verbatim only (do not invent)
36
+
37
+ ## PHASE 3: FORMAT OUTPUT
38
+
39
+ Generate a handoff summary using the HANDOFF CONTEXT format with sections:
40
+ USER REQUESTS (AS-IS), GOAL, WORK COMPLETED, CURRENT STATE, PENDING TASKS,
41
+ KEY FILES, IMPORTANT DECISIONS, EXPLICIT CONSTRAINTS, CONTEXT FOR CONTINUATION.
42
+
43
+ ## IMPORTANT CONSTRAINTS
44
+
45
+ - DO NOT attempt to programmatically create new sessions
46
+ - DO provide a self-contained summary that works without access to this session
47
+ - DO NOT include sensitive information (API keys, credentials, secrets)
48
+ - DO NOT exceed 10 files in the KEY FILES section
49
+ </command-instruction>
50
+
51
+ <session-context>
52
+ Session ID: $SESSION_ID
53
+ Timestamp: $TIMESTAMP
54
+ </session-context>
55
+
56
+ <user-request>
57
+ $ARGUMENTS
58
+ </user-request>`,
59
+ };
@@ -0,0 +1,40 @@
1
+ import type { SlashCommand } from "../types";
2
+
3
+ export const initDeepCommand: SlashCommand = {
4
+ name: "init-deep",
5
+ description: "Initialize hierarchical AGENTS.md knowledge base",
6
+ template: `<command-instruction>
7
+ # /init-deep
8
+
9
+ Generate hierarchical AGENTS.md files. Root + complexity-scored subdirectories.
10
+
11
+ ## Usage
12
+
13
+ \`\`\`
14
+ /init-deep # Update mode: modify existing + create new where warranted
15
+ /init-deep --create-new # Read existing -> remove all -> regenerate from scratch
16
+ /init-deep --max-depth=2 # Limit directory depth (default: 3)
17
+ \`\`\`
18
+
19
+ ## Workflow
20
+
21
+ 1. **Discovery + Analysis** (concurrent)
22
+ - Fire background explore agents immediately
23
+ - Main session: bash structure + LSP codemap + read existing AGENTS.md
24
+ 2. **Score & Decide** - Determine AGENTS.md locations from merged findings
25
+ 3. **Generate** - Root first, then subdirs in parallel
26
+ 4. **Review** - Deduplicate, trim, validate
27
+
28
+ ## Critical Rules
29
+
30
+ - TodoWrite ALL phases. Mark in_progress -> completed in real-time.
31
+ - Root AGENTS.md is ALWAYS created
32
+ - Child AGENTS.md never repeats parent content
33
+ - Remove generic advice that applies to ALL projects
34
+ - Telegraphic style: dense, no filler
35
+ </command-instruction>
36
+
37
+ <user-request>
38
+ $ARGUMENTS
39
+ </user-request>`,
40
+ };
@@ -0,0 +1,39 @@
1
+ import type { SlashCommand } from "../types";
2
+
3
+ export const loopCommand: SlashCommand = {
4
+ name: "loop",
5
+ description: "Start unified continuation loop until completion",
6
+ template: `<command-instruction>
7
+ You are starting a unified LOOP that can run in memory or with disk persistence.
8
+
9
+ ## How LOOP Works
10
+
11
+ 1. You will work on the task continuously
12
+ 2. When fully complete, output: \`<promise>{{COMPLETION_PROMISE}}</promise>\`
13
+ 3. If the promise is not emitted, the loop injects a continuation prompt automatically
14
+
15
+ ## Options
16
+
17
+ - \`--persist\`: use disk-backed state in \`.sisyphus/loop-state.json\` (resumable)
18
+ - without \`--persist\`: in-memory loop state (default)
19
+ - \`--max-iterations=N\`: set an explicit iteration limit
20
+
21
+ Default completion promise is "DONE".
22
+ Default max iterations is 100 for in-memory loops and 1000 for persisted loops.
23
+
24
+ ## Exit Conditions
25
+
26
+ 1. **Completion**: You emit the completion promise tag
27
+ 2. **Max Iterations**: Loop stops at configured limit
28
+ 3. **Cancel**: User runs \`/cancel-loop\`
29
+
30
+ ## Your Task
31
+
32
+ Parse the arguments below and begin working on the task. The format is:
33
+ \`"task description" [--completion-promise=TEXT] [--max-iterations=N] [--persist] [--strategy=reset|continue]\`
34
+ </command-instruction>
35
+
36
+ <user-task>
37
+ $ARGUMENTS
38
+ </user-task>`,
39
+ };