trellis-herbivore 0.1.0

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 (629) hide show
  1. package/bin/trellis.js +3 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +174 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/commands/channel/adapters/claude.d.ts +38 -0
  7. package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
  8. package/dist/commands/channel/adapters/claude.js +209 -0
  9. package/dist/commands/channel/adapters/claude.js.map +1 -0
  10. package/dist/commands/channel/adapters/codex.d.ts +77 -0
  11. package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
  12. package/dist/commands/channel/adapters/codex.js +495 -0
  13. package/dist/commands/channel/adapters/codex.js.map +1 -0
  14. package/dist/commands/channel/adapters/index.d.ts +79 -0
  15. package/dist/commands/channel/adapters/index.d.ts.map +1 -0
  16. package/dist/commands/channel/adapters/index.js +109 -0
  17. package/dist/commands/channel/adapters/index.js.map +1 -0
  18. package/dist/commands/channel/adapters/types.d.ts +33 -0
  19. package/dist/commands/channel/adapters/types.d.ts.map +1 -0
  20. package/dist/commands/channel/adapters/types.js +2 -0
  21. package/dist/commands/channel/adapters/types.js.map +1 -0
  22. package/dist/commands/channel/agent-loader.d.ts +32 -0
  23. package/dist/commands/channel/agent-loader.d.ts.map +1 -0
  24. package/dist/commands/channel/agent-loader.js +154 -0
  25. package/dist/commands/channel/agent-loader.js.map +1 -0
  26. package/dist/commands/channel/context-loader.d.ts +26 -0
  27. package/dist/commands/channel/context-loader.d.ts.map +1 -0
  28. package/dist/commands/channel/context-loader.js +290 -0
  29. package/dist/commands/channel/context-loader.js.map +1 -0
  30. package/dist/commands/channel/context.d.ts +16 -0
  31. package/dist/commands/channel/context.d.ts.map +1 -0
  32. package/dist/commands/channel/context.js +83 -0
  33. package/dist/commands/channel/context.js.map +1 -0
  34. package/dist/commands/channel/create.d.ts +27 -0
  35. package/dist/commands/channel/create.d.ts.map +1 -0
  36. package/dist/commands/channel/create.js +39 -0
  37. package/dist/commands/channel/create.js.map +1 -0
  38. package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
  39. package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
  40. package/dist/commands/channel/dev-parse-trace.js +70 -0
  41. package/dist/commands/channel/dev-parse-trace.js.map +1 -0
  42. package/dist/commands/channel/index.d.ts +3 -0
  43. package/dist/commands/channel/index.d.ts.map +1 -0
  44. package/dist/commands/channel/index.js +496 -0
  45. package/dist/commands/channel/index.js.map +1 -0
  46. package/dist/commands/channel/kill.d.ts +7 -0
  47. package/dist/commands/channel/kill.d.ts.map +1 -0
  48. package/dist/commands/channel/kill.js +121 -0
  49. package/dist/commands/channel/kill.js.map +1 -0
  50. package/dist/commands/channel/list.d.ts +17 -0
  51. package/dist/commands/channel/list.d.ts.map +1 -0
  52. package/dist/commands/channel/list.js +233 -0
  53. package/dist/commands/channel/list.js.map +1 -0
  54. package/dist/commands/channel/messages.d.ts +16 -0
  55. package/dist/commands/channel/messages.d.ts.map +1 -0
  56. package/dist/commands/channel/messages.js +237 -0
  57. package/dist/commands/channel/messages.js.map +1 -0
  58. package/dist/commands/channel/rm.d.ts +27 -0
  59. package/dist/commands/channel/rm.d.ts.map +1 -0
  60. package/dist/commands/channel/rm.js +216 -0
  61. package/dist/commands/channel/rm.js.map +1 -0
  62. package/dist/commands/channel/run.d.ts +31 -0
  63. package/dist/commands/channel/run.d.ts.map +1 -0
  64. package/dist/commands/channel/run.js +137 -0
  65. package/dist/commands/channel/run.js.map +1 -0
  66. package/dist/commands/channel/send.d.ts +12 -0
  67. package/dist/commands/channel/send.d.ts.map +1 -0
  68. package/dist/commands/channel/send.js +24 -0
  69. package/dist/commands/channel/send.js.map +1 -0
  70. package/dist/commands/channel/spawn.d.ts +25 -0
  71. package/dist/commands/channel/spawn.d.ts.map +1 -0
  72. package/dist/commands/channel/spawn.js +192 -0
  73. package/dist/commands/channel/spawn.js.map +1 -0
  74. package/dist/commands/channel/store/events.d.ts +39 -0
  75. package/dist/commands/channel/store/events.d.ts.map +1 -0
  76. package/dist/commands/channel/store/events.js +87 -0
  77. package/dist/commands/channel/store/events.js.map +1 -0
  78. package/dist/commands/channel/store/filter.d.ts +3 -0
  79. package/dist/commands/channel/store/filter.d.ts.map +1 -0
  80. package/dist/commands/channel/store/filter.js +2 -0
  81. package/dist/commands/channel/store/filter.js.map +1 -0
  82. package/dist/commands/channel/store/lock.d.ts +23 -0
  83. package/dist/commands/channel/store/lock.d.ts.map +1 -0
  84. package/dist/commands/channel/store/lock.js +99 -0
  85. package/dist/commands/channel/store/lock.js.map +1 -0
  86. package/dist/commands/channel/store/paths.d.ts +63 -0
  87. package/dist/commands/channel/store/paths.d.ts.map +1 -0
  88. package/dist/commands/channel/store/paths.js +246 -0
  89. package/dist/commands/channel/store/paths.js.map +1 -0
  90. package/dist/commands/channel/store/schema.d.ts +27 -0
  91. package/dist/commands/channel/store/schema.d.ts.map +1 -0
  92. package/dist/commands/channel/store/schema.js +34 -0
  93. package/dist/commands/channel/store/schema.js.map +1 -0
  94. package/dist/commands/channel/store/thread-state.d.ts +5 -0
  95. package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
  96. package/dist/commands/channel/store/thread-state.js +16 -0
  97. package/dist/commands/channel/store/thread-state.js.map +1 -0
  98. package/dist/commands/channel/store/watch.d.ts +19 -0
  99. package/dist/commands/channel/store/watch.d.ts.map +1 -0
  100. package/dist/commands/channel/store/watch.js +130 -0
  101. package/dist/commands/channel/store/watch.js.map +1 -0
  102. package/dist/commands/channel/supervisor/inbox.d.ts +25 -0
  103. package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
  104. package/dist/commands/channel/supervisor/inbox.js +99 -0
  105. package/dist/commands/channel/supervisor/inbox.js.map +1 -0
  106. package/dist/commands/channel/supervisor/shutdown.d.ts +66 -0
  107. package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
  108. package/dist/commands/channel/supervisor/shutdown.js +143 -0
  109. package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
  110. package/dist/commands/channel/supervisor/stdout.d.ts +49 -0
  111. package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
  112. package/dist/commands/channel/supervisor/stdout.js +107 -0
  113. package/dist/commands/channel/supervisor/stdout.js.map +1 -0
  114. package/dist/commands/channel/supervisor.d.ts +47 -0
  115. package/dist/commands/channel/supervisor.d.ts.map +1 -0
  116. package/dist/commands/channel/supervisor.js +283 -0
  117. package/dist/commands/channel/supervisor.js.map +1 -0
  118. package/dist/commands/channel/text-body.d.ts +13 -0
  119. package/dist/commands/channel/text-body.d.ts.map +1 -0
  120. package/dist/commands/channel/text-body.js +47 -0
  121. package/dist/commands/channel/text-body.js.map +1 -0
  122. package/dist/commands/channel/threads.d.ts +39 -0
  123. package/dist/commands/channel/threads.d.ts.map +1 -0
  124. package/dist/commands/channel/threads.js +106 -0
  125. package/dist/commands/channel/threads.js.map +1 -0
  126. package/dist/commands/channel/title.d.ts +12 -0
  127. package/dist/commands/channel/title.d.ts.map +1 -0
  128. package/dist/commands/channel/title.js +24 -0
  129. package/dist/commands/channel/title.js.map +1 -0
  130. package/dist/commands/channel/wait.d.ts +18 -0
  131. package/dist/commands/channel/wait.d.ts.map +1 -0
  132. package/dist/commands/channel/wait.js +76 -0
  133. package/dist/commands/channel/wait.js.map +1 -0
  134. package/dist/commands/init.d.ts +57 -0
  135. package/dist/commands/init.d.ts.map +1 -0
  136. package/dist/commands/init.js +1466 -0
  137. package/dist/commands/init.js.map +1 -0
  138. package/dist/commands/mem.d.ts +234 -0
  139. package/dist/commands/mem.d.ts.map +1 -0
  140. package/dist/commands/mem.js +1869 -0
  141. package/dist/commands/mem.js.map +1 -0
  142. package/dist/commands/uninstall.d.ts +27 -0
  143. package/dist/commands/uninstall.d.ts.map +1 -0
  144. package/dist/commands/uninstall.js +339 -0
  145. package/dist/commands/uninstall.js.map +1 -0
  146. package/dist/commands/update.d.ts +72 -0
  147. package/dist/commands/update.d.ts.map +1 -0
  148. package/dist/commands/update.js +1926 -0
  149. package/dist/commands/update.js.map +1 -0
  150. package/dist/commands/upgrade.d.ts +28 -0
  151. package/dist/commands/upgrade.d.ts.map +1 -0
  152. package/dist/commands/upgrade.js +84 -0
  153. package/dist/commands/upgrade.js.map +1 -0
  154. package/dist/configurators/antigravity.d.ts +7 -0
  155. package/dist/configurators/antigravity.d.ts.map +1 -0
  156. package/dist/configurators/antigravity.js +19 -0
  157. package/dist/configurators/antigravity.js.map +1 -0
  158. package/dist/configurators/claude.d.ts +9 -0
  159. package/dist/configurators/claude.d.ts.map +1 -0
  160. package/dist/configurators/claude.js +72 -0
  161. package/dist/configurators/claude.js.map +1 -0
  162. package/dist/configurators/codebuddy.d.ts +10 -0
  163. package/dist/configurators/codebuddy.d.ts.map +1 -0
  164. package/dist/configurators/codebuddy.js +30 -0
  165. package/dist/configurators/codebuddy.js.map +1 -0
  166. package/dist/configurators/codex.d.ts +8 -0
  167. package/dist/configurators/codex.d.ts.map +1 -0
  168. package/dist/configurators/codex.js +87 -0
  169. package/dist/configurators/codex.js.map +1 -0
  170. package/dist/configurators/copilot.d.ts +10 -0
  171. package/dist/configurators/copilot.d.ts.map +1 -0
  172. package/dist/configurators/copilot.js +51 -0
  173. package/dist/configurators/copilot.js.map +1 -0
  174. package/dist/configurators/cursor.d.ts +10 -0
  175. package/dist/configurators/cursor.d.ts.map +1 -0
  176. package/dist/configurators/cursor.js +29 -0
  177. package/dist/configurators/cursor.js.map +1 -0
  178. package/dist/configurators/droid.d.ts +10 -0
  179. package/dist/configurators/droid.d.ts.map +1 -0
  180. package/dist/configurators/droid.js +30 -0
  181. package/dist/configurators/droid.js.map +1 -0
  182. package/dist/configurators/gemini.d.ts +16 -0
  183. package/dist/configurators/gemini.d.ts.map +1 -0
  184. package/dist/configurators/gemini.js +38 -0
  185. package/dist/configurators/gemini.js.map +1 -0
  186. package/dist/configurators/index.d.ts +65 -0
  187. package/dist/configurators/index.d.ts.map +1 -0
  188. package/dist/configurators/index.js +367 -0
  189. package/dist/configurators/index.js.map +1 -0
  190. package/dist/configurators/kilo.d.ts +7 -0
  191. package/dist/configurators/kilo.d.ts.map +1 -0
  192. package/dist/configurators/kilo.js +19 -0
  193. package/dist/configurators/kilo.js.map +1 -0
  194. package/dist/configurators/kiro.d.ts +8 -0
  195. package/dist/configurators/kiro.d.ts.map +1 -0
  196. package/dist/configurators/kiro.js +24 -0
  197. package/dist/configurators/kiro.js.map +1 -0
  198. package/dist/configurators/opencode.d.ts +14 -0
  199. package/dist/configurators/opencode.d.ts.map +1 -0
  200. package/dist/configurators/opencode.js +96 -0
  201. package/dist/configurators/opencode.js.map +1 -0
  202. package/dist/configurators/pi.d.ts +3 -0
  203. package/dist/configurators/pi.d.ts.map +1 -0
  204. package/dist/configurators/pi.js +45 -0
  205. package/dist/configurators/pi.js.map +1 -0
  206. package/dist/configurators/qoder.d.ts +11 -0
  207. package/dist/configurators/qoder.d.ts.map +1 -0
  208. package/dist/configurators/qoder.js +31 -0
  209. package/dist/configurators/qoder.js.map +1 -0
  210. package/dist/configurators/shared.d.ts +178 -0
  211. package/dist/configurators/shared.d.ts.map +1 -0
  212. package/dist/configurators/shared.js +538 -0
  213. package/dist/configurators/shared.js.map +1 -0
  214. package/dist/configurators/windsurf.d.ts +7 -0
  215. package/dist/configurators/windsurf.d.ts.map +1 -0
  216. package/dist/configurators/windsurf.js +19 -0
  217. package/dist/configurators/windsurf.js.map +1 -0
  218. package/dist/configurators/workflow.d.ts +29 -0
  219. package/dist/configurators/workflow.d.ts.map +1 -0
  220. package/dist/configurators/workflow.js +163 -0
  221. package/dist/configurators/workflow.js.map +1 -0
  222. package/dist/constants/paths.d.ts +70 -0
  223. package/dist/constants/paths.d.ts.map +1 -0
  224. package/dist/constants/paths.js +79 -0
  225. package/dist/constants/paths.js.map +1 -0
  226. package/dist/constants/version.d.ts +9 -0
  227. package/dist/constants/version.d.ts.map +1 -0
  228. package/dist/constants/version.js +15 -0
  229. package/dist/constants/version.js.map +1 -0
  230. package/dist/index.d.ts +9 -0
  231. package/dist/index.d.ts.map +1 -0
  232. package/dist/index.js +9 -0
  233. package/dist/index.js.map +1 -0
  234. package/dist/migrations/index.d.ts +62 -0
  235. package/dist/migrations/index.d.ts.map +1 -0
  236. package/dist/migrations/index.js +187 -0
  237. package/dist/migrations/index.js.map +1 -0
  238. package/dist/migrations/manifests/0.1.9.json +30 -0
  239. package/dist/migrations/manifests/0.2.0.json +49 -0
  240. package/dist/migrations/manifests/0.2.12.json +9 -0
  241. package/dist/migrations/manifests/0.2.13.json +9 -0
  242. package/dist/migrations/manifests/0.2.14.json +175 -0
  243. package/dist/migrations/manifests/0.2.15.json +33 -0
  244. package/dist/migrations/manifests/0.3.0-beta.0.json +297 -0
  245. package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
  246. package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
  247. package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
  248. package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
  249. package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
  250. package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
  251. package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
  252. package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
  253. package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
  254. package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
  255. package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
  256. package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
  257. package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
  258. package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
  259. package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
  260. package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
  261. package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
  262. package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
  263. package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
  264. package/dist/migrations/manifests/0.3.0-rc.3.json +9 -0
  265. package/dist/migrations/manifests/0.3.0-rc.4.json +9 -0
  266. package/dist/migrations/manifests/0.3.0-rc.5.json +9 -0
  267. package/dist/migrations/manifests/0.3.0-rc.6.json +9 -0
  268. package/dist/migrations/manifests/0.3.0.json +11 -0
  269. package/dist/migrations/manifests/0.3.1.json +9 -0
  270. package/dist/migrations/manifests/0.3.10.json +9 -0
  271. package/dist/migrations/manifests/0.3.2.json +9 -0
  272. package/dist/migrations/manifests/0.3.3.json +9 -0
  273. package/dist/migrations/manifests/0.3.4.json +21 -0
  274. package/dist/migrations/manifests/0.3.5.json +9 -0
  275. package/dist/migrations/manifests/0.3.6.json +9 -0
  276. package/dist/migrations/manifests/0.3.7.json +9 -0
  277. package/dist/migrations/manifests/0.3.8.json +9 -0
  278. package/dist/migrations/manifests/0.3.9.json +9 -0
  279. package/dist/migrations/manifests/0.4.0-beta.1.json +228 -0
  280. package/dist/migrations/manifests/0.4.0-beta.10.json +9 -0
  281. package/dist/migrations/manifests/0.4.0-beta.2.json +9 -0
  282. package/dist/migrations/manifests/0.4.0-beta.3.json +9 -0
  283. package/dist/migrations/manifests/0.4.0-beta.4.json +9 -0
  284. package/dist/migrations/manifests/0.4.0-beta.5.json +9 -0
  285. package/dist/migrations/manifests/0.4.0-beta.6.json +9 -0
  286. package/dist/migrations/manifests/0.4.0-beta.7.json +9 -0
  287. package/dist/migrations/manifests/0.4.0-beta.8.json +34 -0
  288. package/dist/migrations/manifests/0.4.0-beta.9.json +9 -0
  289. package/dist/migrations/manifests/0.4.0-rc.0.json +9 -0
  290. package/dist/migrations/manifests/0.4.0-rc.1.json +9 -0
  291. package/dist/migrations/manifests/0.4.0.json +9 -0
  292. package/dist/migrations/manifests/0.5.0-beta.0.json +1646 -0
  293. package/dist/migrations/manifests/0.5.0-beta.1.json +9 -0
  294. package/dist/migrations/manifests/0.5.0-beta.10.json +9 -0
  295. package/dist/migrations/manifests/0.5.0-beta.11.json +9 -0
  296. package/dist/migrations/manifests/0.5.0-beta.12.json +9 -0
  297. package/dist/migrations/manifests/0.5.0-beta.13.json +9 -0
  298. package/dist/migrations/manifests/0.5.0-beta.14.json +9 -0
  299. package/dist/migrations/manifests/0.5.0-beta.15.json +116 -0
  300. package/dist/migrations/manifests/0.5.0-beta.16.json +9 -0
  301. package/dist/migrations/manifests/0.5.0-beta.17.json +9 -0
  302. package/dist/migrations/manifests/0.5.0-beta.18.json +9 -0
  303. package/dist/migrations/manifests/0.5.0-beta.19.json +9 -0
  304. package/dist/migrations/manifests/0.5.0-beta.2.json +9 -0
  305. package/dist/migrations/manifests/0.5.0-beta.3.json +9 -0
  306. package/dist/migrations/manifests/0.5.0-beta.4.json +9 -0
  307. package/dist/migrations/manifests/0.5.0-beta.5.json +222 -0
  308. package/dist/migrations/manifests/0.5.0-beta.6.json +9 -0
  309. package/dist/migrations/manifests/0.5.0-beta.7.json +9 -0
  310. package/dist/migrations/manifests/0.5.0-beta.8.json +9 -0
  311. package/dist/migrations/manifests/0.5.0-beta.9.json +48 -0
  312. package/dist/migrations/manifests/0.5.0-rc.0.json +9 -0
  313. package/dist/migrations/manifests/0.5.0-rc.1.json +9 -0
  314. package/dist/migrations/manifests/0.5.0-rc.2.json +9 -0
  315. package/dist/migrations/manifests/0.5.0-rc.3.json +9 -0
  316. package/dist/migrations/manifests/0.5.0-rc.4.json +9 -0
  317. package/dist/migrations/manifests/0.5.0-rc.5.json +9 -0
  318. package/dist/migrations/manifests/0.5.0-rc.6.json +9 -0
  319. package/dist/migrations/manifests/0.5.0-rc.7.json +9 -0
  320. package/dist/migrations/manifests/0.5.0.json +9 -0
  321. package/dist/migrations/manifests/0.5.1.json +9 -0
  322. package/dist/migrations/manifests/0.5.10.json +9 -0
  323. package/dist/migrations/manifests/0.5.11.json +16 -0
  324. package/dist/migrations/manifests/0.5.12.json +9 -0
  325. package/dist/migrations/manifests/0.5.13.json +9 -0
  326. package/dist/migrations/manifests/0.5.14.json +9 -0
  327. package/dist/migrations/manifests/0.5.15.json +9 -0
  328. package/dist/migrations/manifests/0.5.2.json +9 -0
  329. package/dist/migrations/manifests/0.5.3.json +9 -0
  330. package/dist/migrations/manifests/0.5.4.json +9 -0
  331. package/dist/migrations/manifests/0.5.5.json +9 -0
  332. package/dist/migrations/manifests/0.5.6.json +9 -0
  333. package/dist/migrations/manifests/0.5.7.json +16 -0
  334. package/dist/migrations/manifests/0.5.8.json +9 -0
  335. package/dist/migrations/manifests/0.5.9.json +9 -0
  336. package/dist/migrations/manifests/0.6.0-beta.0.json +16 -0
  337. package/dist/migrations/manifests/0.6.0-beta.1.json +9 -0
  338. package/dist/migrations/manifests/0.6.0-beta.10.json +9 -0
  339. package/dist/migrations/manifests/0.6.0-beta.11.json +9 -0
  340. package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
  341. package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
  342. package/dist/migrations/manifests/0.6.0-beta.14.json +9 -0
  343. package/dist/migrations/manifests/0.6.0-beta.2.json +9 -0
  344. package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
  345. package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
  346. package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
  347. package/dist/migrations/manifests/0.6.0-beta.6.json +16 -0
  348. package/dist/migrations/manifests/0.6.0-beta.7.json +9 -0
  349. package/dist/migrations/manifests/0.6.0-beta.8.json +9 -0
  350. package/dist/migrations/manifests/0.6.0-beta.9.json +9 -0
  351. package/dist/templates/claude/agents/trellis-check.md +114 -0
  352. package/dist/templates/claude/agents/trellis-implement.md +113 -0
  353. package/dist/templates/claude/agents/trellis-research.md +137 -0
  354. package/dist/templates/claude/index.d.ts +22 -0
  355. package/dist/templates/claude/index.d.ts.map +1 -0
  356. package/dist/templates/claude/index.js +46 -0
  357. package/dist/templates/claude/index.js.map +1 -0
  358. package/dist/templates/claude/settings.json +73 -0
  359. package/dist/templates/codebuddy/agents/trellis-check.md +109 -0
  360. package/dist/templates/codebuddy/agents/trellis-implement.md +110 -0
  361. package/dist/templates/codebuddy/agents/trellis-research.md +137 -0
  362. package/dist/templates/codebuddy/index.d.ts +15 -0
  363. package/dist/templates/codebuddy/index.d.ts.map +1 -0
  364. package/dist/templates/codebuddy/index.js +15 -0
  365. package/dist/templates/codebuddy/index.js.map +1 -0
  366. package/dist/templates/codebuddy/settings.json +59 -0
  367. package/dist/templates/codex/agents/trellis-check.toml +84 -0
  368. package/dist/templates/codex/agents/trellis-implement.toml +65 -0
  369. package/dist/templates/codex/agents/trellis-research.toml +73 -0
  370. package/dist/templates/codex/config.toml +35 -0
  371. package/dist/templates/codex/hooks/session-start.py +545 -0
  372. package/dist/templates/codex/hooks.json +15 -0
  373. package/dist/templates/codex/index.d.ts +39 -0
  374. package/dist/templates/codex/index.d.ts.map +1 -0
  375. package/dist/templates/codex/index.js +85 -0
  376. package/dist/templates/codex/index.js.map +1 -0
  377. package/dist/templates/codex/skills/before-dev/SKILL.md +40 -0
  378. package/dist/templates/codex/skills/brainstorm/SKILL.md +112 -0
  379. package/dist/templates/codex/skills/break-loop/SKILL.md +130 -0
  380. package/dist/templates/codex/skills/check/SKILL.md +98 -0
  381. package/dist/templates/codex/skills/check-cross-layer/SKILL.md +158 -0
  382. package/dist/templates/codex/skills/create-command/SKILL.md +101 -0
  383. package/dist/templates/codex/skills/finish-work/SKILL.md +90 -0
  384. package/dist/templates/codex/skills/improve-ut/SKILL.md +69 -0
  385. package/dist/templates/codex/skills/integrate-skill/SKILL.md +221 -0
  386. package/dist/templates/codex/skills/onboard/SKILL.md +363 -0
  387. package/dist/templates/codex/skills/record-session/SKILL.md +67 -0
  388. package/dist/templates/codex/skills/start/SKILL.md +64 -0
  389. package/dist/templates/codex/skills/update-spec/SKILL.md +335 -0
  390. package/dist/templates/common/bundled-skills/trellis-meta/SKILL.md +73 -0
  391. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/add-project-local-conventions.md +83 -0
  392. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-agents.md +54 -0
  393. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +84 -0
  394. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-hooks.md +57 -0
  395. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-skills-or-commands.md +78 -0
  396. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +83 -0
  397. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-task-lifecycle.md +90 -0
  398. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +65 -0
  399. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/overview.md +55 -0
  400. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +68 -0
  401. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/generated-files.md +80 -0
  402. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/overview.md +51 -0
  403. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +102 -0
  404. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +103 -0
  405. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workflow.md +75 -0
  406. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workspace-memory.md +71 -0
  407. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +80 -0
  408. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/hooks-and-settings.md +69 -0
  409. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/overview.md +59 -0
  410. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/platform-map.md +74 -0
  411. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/skills-and-commands.md +83 -0
  412. package/dist/templates/common/commands/continue.md +56 -0
  413. package/dist/templates/common/commands/finish-work.md +66 -0
  414. package/dist/templates/common/commands/start.md +59 -0
  415. package/dist/templates/common/index.d.ts +48 -0
  416. package/dist/templates/common/index.d.ts.map +1 -0
  417. package/dist/templates/common/index.js +104 -0
  418. package/dist/templates/common/index.js.map +1 -0
  419. package/dist/templates/common/skills/before-dev.md +35 -0
  420. package/dist/templates/common/skills/brainstorm.md +112 -0
  421. package/dist/templates/common/skills/break-loop.md +125 -0
  422. package/dist/templates/common/skills/check.md +93 -0
  423. package/dist/templates/common/skills/update-spec.md +351 -0
  424. package/dist/templates/copilot/hooks/session-start.py +547 -0
  425. package/dist/templates/copilot/hooks.json +19 -0
  426. package/dist/templates/copilot/index.d.ts +23 -0
  427. package/dist/templates/copilot/index.d.ts.map +1 -0
  428. package/dist/templates/copilot/index.js +54 -0
  429. package/dist/templates/copilot/index.js.map +1 -0
  430. package/dist/templates/copilot/prompts/before-dev.prompt.md +39 -0
  431. package/dist/templates/copilot/prompts/brainstorm.prompt.md +111 -0
  432. package/dist/templates/copilot/prompts/break-loop.prompt.md +129 -0
  433. package/dist/templates/copilot/prompts/check-cross-layer.prompt.md +157 -0
  434. package/dist/templates/copilot/prompts/check.prompt.md +97 -0
  435. package/dist/templates/copilot/prompts/create-command.prompt.md +116 -0
  436. package/dist/templates/copilot/prompts/finish-work.prompt.md +99 -0
  437. package/dist/templates/copilot/prompts/integrate-skill.prompt.md +223 -0
  438. package/dist/templates/copilot/prompts/onboard.prompt.md +362 -0
  439. package/dist/templates/copilot/prompts/parallel.prompt.md +204 -0
  440. package/dist/templates/copilot/prompts/record-session.prompt.md +66 -0
  441. package/dist/templates/copilot/prompts/start.prompt.md +63 -0
  442. package/dist/templates/copilot/prompts/update-spec.prompt.md +358 -0
  443. package/dist/templates/cursor/agents/trellis-check.md +108 -0
  444. package/dist/templates/cursor/agents/trellis-implement.md +109 -0
  445. package/dist/templates/cursor/agents/trellis-research.md +136 -0
  446. package/dist/templates/cursor/hooks.json +30 -0
  447. package/dist/templates/cursor/index.d.ts +13 -0
  448. package/dist/templates/cursor/index.d.ts.map +1 -0
  449. package/dist/templates/cursor/index.js +13 -0
  450. package/dist/templates/cursor/index.js.map +1 -0
  451. package/dist/templates/droid/droids/trellis-check.md +101 -0
  452. package/dist/templates/droid/droids/trellis-implement.md +102 -0
  453. package/dist/templates/droid/droids/trellis-research.md +137 -0
  454. package/dist/templates/droid/index.d.ts +15 -0
  455. package/dist/templates/droid/index.d.ts.map +1 -0
  456. package/dist/templates/droid/index.js +15 -0
  457. package/dist/templates/droid/index.js.map +1 -0
  458. package/dist/templates/droid/settings.json +59 -0
  459. package/dist/templates/extract.d.ts +40 -0
  460. package/dist/templates/extract.d.ts.map +1 -0
  461. package/dist/templates/extract.js +106 -0
  462. package/dist/templates/extract.js.map +1 -0
  463. package/dist/templates/gemini/agents/trellis-check.md +101 -0
  464. package/dist/templates/gemini/agents/trellis-implement.md +102 -0
  465. package/dist/templates/gemini/agents/trellis-research.md +136 -0
  466. package/dist/templates/gemini/index.d.ts +13 -0
  467. package/dist/templates/gemini/index.d.ts.map +1 -0
  468. package/dist/templates/gemini/index.js +13 -0
  469. package/dist/templates/gemini/index.js.map +1 -0
  470. package/dist/templates/gemini/settings.json +28 -0
  471. package/dist/templates/kiro/agents/trellis-check.json +26 -0
  472. package/dist/templates/kiro/agents/trellis-implement.json +26 -0
  473. package/dist/templates/kiro/agents/trellis-research.json +30 -0
  474. package/dist/templates/kiro/index.d.ts +18 -0
  475. package/dist/templates/kiro/index.d.ts.map +1 -0
  476. package/dist/templates/kiro/index.js +18 -0
  477. package/dist/templates/kiro/index.js.map +1 -0
  478. package/dist/templates/markdown/agents.md +21 -0
  479. package/dist/templates/markdown/gitignore.txt +15 -0
  480. package/dist/templates/markdown/index.d.ts +27 -0
  481. package/dist/templates/markdown/index.d.ts.map +1 -0
  482. package/dist/templates/markdown/index.js +52 -0
  483. package/dist/templates/markdown/index.js.map +1 -0
  484. package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
  485. package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
  486. package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
  487. package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
  488. package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
  489. package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
  490. package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
  491. package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
  492. package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
  493. package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
  494. package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
  495. package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
  496. package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
  497. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +223 -0
  498. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +259 -0
  499. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +595 -0
  500. package/dist/templates/markdown/spec/guides/index.md.txt +97 -0
  501. package/dist/templates/markdown/workspace-index.md +125 -0
  502. package/dist/templates/markdown/worktree.yaml.txt +58 -0
  503. package/dist/templates/opencode/agents/trellis-check.md +116 -0
  504. package/dist/templates/opencode/agents/trellis-implement.md +118 -0
  505. package/dist/templates/opencode/agents/trellis-research.md +145 -0
  506. package/dist/templates/opencode/lib/session-utils.js +521 -0
  507. package/dist/templates/opencode/lib/trellis-context.js +381 -0
  508. package/dist/templates/opencode/package.json +5 -0
  509. package/dist/templates/opencode/plugins/inject-subagent-context.js +513 -0
  510. package/dist/templates/opencode/plugins/inject-workflow-state.js +159 -0
  511. package/dist/templates/opencode/plugins/session-start.js +101 -0
  512. package/dist/templates/pi/agents/trellis-check.md +36 -0
  513. package/dist/templates/pi/agents/trellis-implement.md +41 -0
  514. package/dist/templates/pi/agents/trellis-research.md +25 -0
  515. package/dist/templates/pi/extensions/trellis/index.ts.txt +1174 -0
  516. package/dist/templates/pi/index.d.ts +5 -0
  517. package/dist/templates/pi/index.d.ts.map +1 -0
  518. package/dist/templates/pi/index.js +12 -0
  519. package/dist/templates/pi/index.js.map +1 -0
  520. package/dist/templates/pi/settings.json +21 -0
  521. package/dist/templates/qoder/agents/trellis-check.md +102 -0
  522. package/dist/templates/qoder/agents/trellis-implement.md +103 -0
  523. package/dist/templates/qoder/agents/trellis-research.md +137 -0
  524. package/dist/templates/qoder/index.d.ts +15 -0
  525. package/dist/templates/qoder/index.d.ts.map +1 -0
  526. package/dist/templates/qoder/index.js +15 -0
  527. package/dist/templates/qoder/index.js.map +1 -0
  528. package/dist/templates/qoder/settings.json +47 -0
  529. package/dist/templates/shared-hooks/index.d.ts +50 -0
  530. package/dist/templates/shared-hooks/index.d.ts.map +1 -0
  531. package/dist/templates/shared-hooks/index.js +89 -0
  532. package/dist/templates/shared-hooks/index.js.map +1 -0
  533. package/dist/templates/shared-hooks/inject-shell-session-context.py +183 -0
  534. package/dist/templates/shared-hooks/inject-subagent-context.py +771 -0
  535. package/dist/templates/shared-hooks/inject-workflow-state.py +363 -0
  536. package/dist/templates/shared-hooks/session-start.py +827 -0
  537. package/dist/templates/template-utils.d.ts +26 -0
  538. package/dist/templates/template-utils.d.ts.map +1 -0
  539. package/dist/templates/template-utils.js +60 -0
  540. package/dist/templates/template-utils.js.map +1 -0
  541. package/dist/templates/trellis/config.yaml +90 -0
  542. package/dist/templates/trellis/gitignore.txt +32 -0
  543. package/dist/templates/trellis/index.d.ts +52 -0
  544. package/dist/templates/trellis/index.d.ts.map +1 -0
  545. package/dist/templates/trellis/index.js +97 -0
  546. package/dist/templates/trellis/index.js.map +1 -0
  547. package/dist/templates/trellis/scripts/__init__.py +5 -0
  548. package/dist/templates/trellis/scripts/add_session.py +547 -0
  549. package/dist/templates/trellis/scripts/common/__init__.py +92 -0
  550. package/dist/templates/trellis/scripts/common/active_task.py +626 -0
  551. package/dist/templates/trellis/scripts/common/cli_adapter.py +811 -0
  552. package/dist/templates/trellis/scripts/common/config.py +445 -0
  553. package/dist/templates/trellis/scripts/common/developer.py +190 -0
  554. package/dist/templates/trellis/scripts/common/git.py +31 -0
  555. package/dist/templates/trellis/scripts/common/git_context.py +106 -0
  556. package/dist/templates/trellis/scripts/common/io.py +37 -0
  557. package/dist/templates/trellis/scripts/common/log.py +45 -0
  558. package/dist/templates/trellis/scripts/common/packages_context.py +238 -0
  559. package/dist/templates/trellis/scripts/common/paths.py +447 -0
  560. package/dist/templates/trellis/scripts/common/safe_commit.py +285 -0
  561. package/dist/templates/trellis/scripts/common/session_context.py +821 -0
  562. package/dist/templates/trellis/scripts/common/task_context.py +223 -0
  563. package/dist/templates/trellis/scripts/common/task_queue.py +188 -0
  564. package/dist/templates/trellis/scripts/common/task_store.py +698 -0
  565. package/dist/templates/trellis/scripts/common/task_utils.py +274 -0
  566. package/dist/templates/trellis/scripts/common/tasks.py +112 -0
  567. package/dist/templates/trellis/scripts/common/trellis_config.py +131 -0
  568. package/dist/templates/trellis/scripts/common/types.py +110 -0
  569. package/dist/templates/trellis/scripts/common/workflow_phase.py +212 -0
  570. package/dist/templates/trellis/scripts/get_context.py +16 -0
  571. package/dist/templates/trellis/scripts/get_developer.py +26 -0
  572. package/dist/templates/trellis/scripts/hooks/linear_sync.py +243 -0
  573. package/dist/templates/trellis/scripts/init_developer.py +51 -0
  574. package/dist/templates/trellis/scripts/task.py +500 -0
  575. package/dist/templates/trellis/tasks/.gitkeep +0 -0
  576. package/dist/templates/trellis/workflow.md +690 -0
  577. package/dist/types/ai-tools.d.ts +95 -0
  578. package/dist/types/ai-tools.d.ts.map +1 -0
  579. package/dist/types/ai-tools.js +280 -0
  580. package/dist/types/ai-tools.js.map +1 -0
  581. package/dist/types/migration.d.ts +125 -0
  582. package/dist/types/migration.d.ts.map +1 -0
  583. package/dist/types/migration.js +8 -0
  584. package/dist/types/migration.js.map +1 -0
  585. package/dist/utils/compare-versions.d.ts +12 -0
  586. package/dist/utils/compare-versions.d.ts.map +1 -0
  587. package/dist/utils/compare-versions.js +86 -0
  588. package/dist/utils/compare-versions.js.map +1 -0
  589. package/dist/utils/cwd-guard.d.ts +38 -0
  590. package/dist/utils/cwd-guard.d.ts.map +1 -0
  591. package/dist/utils/cwd-guard.js +62 -0
  592. package/dist/utils/cwd-guard.js.map +1 -0
  593. package/dist/utils/file-writer.d.ts +36 -0
  594. package/dist/utils/file-writer.d.ts.map +1 -0
  595. package/dist/utils/file-writer.js +203 -0
  596. package/dist/utils/file-writer.js.map +1 -0
  597. package/dist/utils/manifest-prune.d.ts +61 -0
  598. package/dist/utils/manifest-prune.d.ts.map +1 -0
  599. package/dist/utils/manifest-prune.js +136 -0
  600. package/dist/utils/manifest-prune.js.map +1 -0
  601. package/dist/utils/posix.d.ts +13 -0
  602. package/dist/utils/posix.d.ts.map +1 -0
  603. package/dist/utils/posix.js +15 -0
  604. package/dist/utils/posix.js.map +1 -0
  605. package/dist/utils/project-detector.d.ts +46 -0
  606. package/dist/utils/project-detector.d.ts.map +1 -0
  607. package/dist/utils/project-detector.js +666 -0
  608. package/dist/utils/project-detector.js.map +1 -0
  609. package/dist/utils/proxy.d.ts +25 -0
  610. package/dist/utils/proxy.d.ts.map +1 -0
  611. package/dist/utils/proxy.js +60 -0
  612. package/dist/utils/proxy.js.map +1 -0
  613. package/dist/utils/task-json.d.ts +13 -0
  614. package/dist/utils/task-json.d.ts.map +1 -0
  615. package/dist/utils/task-json.js +12 -0
  616. package/dist/utils/task-json.js.map +1 -0
  617. package/dist/utils/template-fetcher.d.ts +150 -0
  618. package/dist/utils/template-fetcher.d.ts.map +1 -0
  619. package/dist/utils/template-fetcher.js +907 -0
  620. package/dist/utils/template-fetcher.js.map +1 -0
  621. package/dist/utils/template-hash.d.ts +123 -0
  622. package/dist/utils/template-hash.d.ts.map +1 -0
  623. package/dist/utils/template-hash.js +334 -0
  624. package/dist/utils/template-hash.js.map +1 -0
  625. package/dist/utils/uninstall-scrubbers.d.ts +66 -0
  626. package/dist/utils/uninstall-scrubbers.d.ts.map +1 -0
  627. package/dist/utils/uninstall-scrubbers.js +342 -0
  628. package/dist/utils/uninstall-scrubbers.js.map +1 -0
  629. package/package.json +90 -0
@@ -0,0 +1,513 @@
1
+ /* global process */
2
+ /**
3
+ * Trellis Context Injection Plugin
4
+ *
5
+ * Injects context when Task tool is called with supported subagent types.
6
+ * Uses OpenCode's tool.execute.before hook.
7
+ */
8
+
9
+ import { existsSync, readdirSync } from "fs"
10
+ import { join } from "path"
11
+ import { TrellisContext, debugLog } from "../lib/trellis-context.js"
12
+
13
+ // Supported subagent types
14
+ const AGENTS_ALL = ["implement", "check", "research"]
15
+ const AGENTS_REQUIRE_TASK = ["implement", "check"]
16
+
17
+ // Match `Active task: <path>` on the first non-empty line of the dispatch
18
+ // prompt. Mirrors the contract in workflow.md's [workflow-state:in_progress]
19
+ // breadcrumb so multi-window users can disambiguate which task is targeted.
20
+ const ACTIVE_TASK_HINT_RE = /^\s*Active task:\s*(\S+)\s*$/m
21
+
22
+ function extractActiveTaskHint(prompt) {
23
+ if (typeof prompt !== "string" || !prompt) return null
24
+ const match = prompt.match(ACTIVE_TASK_HINT_RE)
25
+ return match ? match[1].trim() : null
26
+ }
27
+
28
+ /**
29
+ * Get context for implement agent. `taskDir` may be relative
30
+ * (`.trellis/tasks/foo`) or absolute; both are resolved via
31
+ * `ctx.resolveTaskDir`.
32
+ */
33
+ function getImplementContext(ctx, taskDir) {
34
+ const parts = []
35
+ const taskDirFull = ctx.resolveTaskDir(taskDir)
36
+ if (!taskDirFull) return ""
37
+
38
+ const jsonlPath = join(taskDirFull, "implement.jsonl")
39
+ const entries = ctx.readJsonlWithFiles(jsonlPath)
40
+ if (entries.length > 0) {
41
+ parts.push(ctx.buildContextFromEntries(entries))
42
+ }
43
+
44
+ const prd = ctx.readFile(join(taskDirFull, "prd.md"))
45
+ if (prd) {
46
+ parts.push(`=== ${taskDir}/prd.md (Requirements) ===\n${prd}`)
47
+ }
48
+
49
+ const design = ctx.readFile(join(taskDirFull, "design.md"))
50
+ if (design) {
51
+ parts.push(`=== ${taskDir}/design.md (Technical Design) ===\n${design}`)
52
+ }
53
+
54
+ const implementPlan = ctx.readFile(join(taskDirFull, "implement.md"))
55
+ if (implementPlan) {
56
+ parts.push(`=== ${taskDir}/implement.md (Execution Plan) ===\n${implementPlan}`)
57
+ }
58
+
59
+ return parts.join("\n\n")
60
+ }
61
+
62
+ /**
63
+ * Get context for check agent. `taskDir` may be relative or absolute.
64
+ */
65
+ function getCheckContext(ctx, taskDir) {
66
+ const parts = []
67
+ const taskDirFull = ctx.resolveTaskDir(taskDir)
68
+ if (!taskDirFull) return ""
69
+
70
+ const jsonlPath = join(taskDirFull, "check.jsonl")
71
+ const entries = ctx.readJsonlWithFiles(jsonlPath)
72
+ if (entries.length > 0) {
73
+ parts.push(ctx.buildContextFromEntries(entries))
74
+ }
75
+
76
+ const prd = ctx.readFile(join(taskDirFull, "prd.md"))
77
+ if (prd) {
78
+ parts.push(`=== ${taskDir}/prd.md (Requirements) ===\n${prd}`)
79
+ }
80
+
81
+ const design = ctx.readFile(join(taskDirFull, "design.md"))
82
+ if (design) {
83
+ parts.push(`=== ${taskDir}/design.md (Technical Design) ===\n${design}`)
84
+ }
85
+
86
+ const implementPlan = ctx.readFile(join(taskDirFull, "implement.md"))
87
+ if (implementPlan) {
88
+ parts.push(`=== ${taskDir}/implement.md (Execution Plan) ===\n${implementPlan}`)
89
+ }
90
+
91
+ return parts.join("\n\n")
92
+ }
93
+
94
+ /**
95
+ * Get context for finish phase (final check before PR)
96
+ */
97
+ function getFinishContext(ctx, taskDir) {
98
+ // Finish reuses check context (same JSONL source)
99
+ return getCheckContext(ctx, taskDir)
100
+ }
101
+
102
+
103
+ /**
104
+ * Get context for research agent
105
+ */
106
+ function getResearchContext(ctx) {
107
+ const parts = []
108
+
109
+ // Dynamic project structure (scan actual spec directory)
110
+ const specPath = ".trellis/spec"
111
+ const specFull = join(ctx.directory, specPath)
112
+
113
+ const structureLines = [`## Project Spec Directory Structure\n\n\`\`\`\n${specPath}/`]
114
+ if (existsSync(specFull)) {
115
+ try {
116
+ const entries = readdirSync(specFull, { withFileTypes: true })
117
+ .filter(d => d.isDirectory() && !d.name.startsWith("."))
118
+ .sort((a, b) => a.name.localeCompare(b.name))
119
+
120
+ for (const entry of entries) {
121
+ const entryPath = join(specFull, entry.name)
122
+ if (existsSync(join(entryPath, "index.md"))) {
123
+ structureLines.push(`├── ${entry.name}/`)
124
+ } else {
125
+ try {
126
+ const nested = readdirSync(entryPath, { withFileTypes: true })
127
+ .filter(d => d.isDirectory() && existsSync(join(entryPath, d.name, "index.md")))
128
+ .sort((a, b) => a.name.localeCompare(b.name))
129
+ if (nested.length > 0) {
130
+ structureLines.push(`├── ${entry.name}/`)
131
+ for (const n of nested) {
132
+ structureLines.push(`│ ├── ${n.name}/`)
133
+ }
134
+ }
135
+ } catch {
136
+ // Ignore nested read errors
137
+ }
138
+ }
139
+ }
140
+ } catch {
141
+ // Ignore read errors
142
+ }
143
+ }
144
+ structureLines.push("```")
145
+
146
+ parts.push(structureLines.join("\n") + `
147
+
148
+ ## Search Tips
149
+
150
+ - Spec files: \`.trellis/spec/**/*.md\`
151
+ - Known issues: \`.trellis/big-question/\`
152
+ - Code search: Use Glob and Grep tools
153
+ - Tech solutions: Use mcp__exa__web_search_exa or mcp__exa__get_code_context_exa`)
154
+
155
+ return parts.join("\n\n")
156
+ }
157
+
158
+ /**
159
+ * Build enhanced prompt with context
160
+ */
161
+ function buildPrompt(agentType, originalPrompt, context, isFinish = false) {
162
+ const templates = {
163
+ implement: `<!-- trellis-hook-injected -->
164
+ # Implement Agent Task
165
+
166
+ You are the Implement Agent in the Multi-Agent Pipeline.
167
+
168
+ ## Your Context
169
+
170
+ ${context}
171
+
172
+ ---
173
+
174
+ ## Your Task
175
+
176
+ ${originalPrompt}
177
+
178
+ ---
179
+
180
+ ## Workflow
181
+
182
+ 1. **Understand specs** - All dev specs are injected above
183
+ 2. **Understand task artifacts** - Read requirements, technical design if present, and execution plan if present
184
+ 3. **Implement feature** - Follow specs and task artifacts
185
+ 4. **Self-check** - Ensure code quality
186
+
187
+ ## Important Constraints
188
+
189
+ - Do NOT execute git commit
190
+ - Follow all dev specs injected above
191
+ - Report list of modified/created files when done`,
192
+
193
+ check: isFinish ? `<!-- trellis-hook-injected -->
194
+ # Finish Agent Task
195
+
196
+ You are performing the final check before creating a PR.
197
+
198
+ ## Your Context
199
+
200
+ ${context}
201
+
202
+ ---
203
+
204
+ ## Your Task
205
+
206
+ ${originalPrompt}
207
+
208
+ ---
209
+
210
+ ## Workflow
211
+
212
+ 1. **Review changes** - Run \`git diff --name-only\` to see all changed files
213
+ 2. **Verify task artifacts** - Check prd.md and, when present, design.md / implement.md
214
+ 3. **Spec sync** - Analyze whether changes introduce new patterns, contracts, or conventions
215
+ - If new pattern/convention found: read target spec file → update it → update index.md if needed
216
+ - If infra/cross-layer change: follow the 7-section mandatory template from update-spec.md
217
+ - If pure code fix with no new patterns: skip this step
218
+ 4. **Run final checks** - Execute lint and typecheck
219
+ 5. **Confirm ready** - Ensure code is ready for PR
220
+
221
+ ## Important Constraints
222
+
223
+ - You MAY update spec files when gaps are detected (use update-spec.md as guide)
224
+ - MUST read the target spec file BEFORE editing (avoid duplicating existing content)
225
+ - Do NOT update specs for trivial changes (typos, formatting, obvious fixes)
226
+ - If critical CODE issues found, report them clearly (fix specs, not code)
227
+ - Verify all acceptance criteria in prd.md are met
228
+ - Verify design.md and implement.md constraints when those files are present` :
229
+ `<!-- trellis-hook-injected -->
230
+ # Check Agent Task
231
+
232
+ You are the Check Agent in the Multi-Agent Pipeline.
233
+
234
+ ## Your Context
235
+
236
+ ${context}
237
+
238
+ ---
239
+
240
+ ## Your Task
241
+
242
+ ${originalPrompt}
243
+
244
+ ---
245
+
246
+ ## Workflow
247
+
248
+ 1. **Get changes** - Run \`git diff --name-only\` and \`git diff\`
249
+ 2. **Check against specs** - Check item by item
250
+ 3. **Self-fix** - Fix issues directly, don't just report
251
+ 4. **Run verification** - Run lint and typecheck
252
+
253
+ ## Important Constraints
254
+
255
+ - Fix issues yourself, don't just report
256
+ - Must execute complete checklist`,
257
+
258
+ research: `<!-- trellis-hook-injected -->
259
+ # Research Agent Task
260
+
261
+ You are the Research Agent in the Multi-Agent Pipeline.
262
+
263
+ ## Core Principle
264
+
265
+ **You do one thing: find and explain information.**
266
+
267
+ ## Project Info
268
+
269
+ ${context}
270
+
271
+ ---
272
+
273
+ ## Your Task
274
+
275
+ ${originalPrompt}
276
+
277
+ ---
278
+
279
+ ## Workflow
280
+
281
+ 1. **Understand query** - Determine search type and scope
282
+ 2. **Plan search** - List search steps
283
+ 3. **Execute search** - Run multiple searches in parallel
284
+ 4. **Organize results** - Output structured report
285
+
286
+ ## Strict Boundaries
287
+
288
+ **Only allowed**: Describe what exists, where it is, how it works
289
+
290
+ **Forbidden**: Suggest improvements, criticize implementation, modify files`
291
+ }
292
+
293
+ return templates[agentType] || originalPrompt
294
+ }
295
+
296
+ function shellQuote(value) {
297
+ return `'${String(value).replace(/'/g, "'\\''")}'`
298
+ }
299
+
300
+ function powershellQuote(value) {
301
+ return `'${String(value).replace(/'/g, "''")}'`
302
+ }
303
+
304
+ function envValue(env, key) {
305
+ const value = env?.[key]
306
+ return typeof value === "string" && value.trim() ? value.trim() : null
307
+ }
308
+
309
+ function shellBasename(value) {
310
+ return value.replace(/\\/g, "/").split("/").pop()?.toLowerCase() || ""
311
+ }
312
+
313
+ function isWindowsPosixShell(env = process.env) {
314
+ if (envValue(env, "MSYSTEM")) return true
315
+ if (envValue(env, "MINGW_PREFIX")) return true
316
+ if (envValue(env, "OPENCODE_GIT_BASH_PATH")) return true
317
+
318
+ const ostype = envValue(env, "OSTYPE")?.toLowerCase() || ""
319
+ if (/(msys|mingw|cygwin)/.test(ostype)) return true
320
+
321
+ const shell = shellBasename(envValue(env, "SHELL") || "")
322
+ return /^(bash|sh|zsh)(\.exe)?$/.test(shell)
323
+ }
324
+
325
+ function buildTrellisContextPrefix(contextKey, hostPlatform = process.platform, env = process.env) {
326
+ if (hostPlatform === "win32" && !isWindowsPosixShell(env)) {
327
+ return `$env:TRELLIS_CONTEXT_ID = ${powershellQuote(contextKey)}; `
328
+ }
329
+
330
+ return `export TRELLIS_CONTEXT_ID=${shellQuote(contextKey)}; `
331
+ }
332
+
333
+ function getBashCommandKey(args) {
334
+ if (!args || typeof args !== "object") return null
335
+ if (typeof args.command === "string") return "command"
336
+ if (typeof args.cmd === "string") return "cmd"
337
+ return null
338
+ }
339
+
340
+ function commandStartsWithTrellisContext(command) {
341
+ const firstCommand = command.trimStart().split(/[;&|]/, 1)[0].trimStart()
342
+ return (
343
+ /^TRELLIS_CONTEXT_ID\s*=/.test(firstCommand) ||
344
+ /^export\s+TRELLIS_CONTEXT_ID\s*=/.test(firstCommand) ||
345
+ /^env\s+(?:(?:-\S+|[A-Za-z_][A-Za-z0-9_]*=\S*)\s+)*TRELLIS_CONTEXT_ID\s*=/.test(firstCommand) ||
346
+ /^\$env:TRELLIS_CONTEXT_ID\s*=/i.test(firstCommand)
347
+ )
348
+ }
349
+
350
+ /**
351
+ * OpenCode TUI may not expose OPENCODE_RUN_ID to Bash. The plugin hook still
352
+ * receives session identity, so inject it into Bash commands before execution.
353
+ */
354
+ function injectTrellisContextIntoBash(ctx, input, output, hostPlatform, env) {
355
+ const args = output?.args
356
+ const commandKey = getBashCommandKey(args)
357
+ if (!commandKey) return false
358
+
359
+ const command = args[commandKey]
360
+ if (!command.trim()) return false
361
+ if (commandStartsWithTrellisContext(command)) return false
362
+
363
+ const contextKey = ctx.getContextKey(input)
364
+ if (!contextKey) return false
365
+
366
+ args[commandKey] = `${buildTrellisContextPrefix(contextKey, hostPlatform, env)}${command}`
367
+ return true
368
+ }
369
+
370
+ // OpenCode plugin factory: `export default async (input) => hooks`.
371
+ // OpenCode 1.2.x iterates every module export and invokes it as a function
372
+ // (packages/opencode/src/plugin/index.ts — `for ([_, fn] of Object.entries(mod)) await fn(input)`);
373
+ // the previous `{ id, server }` object shape failed with
374
+ // `TypeError: fn is not a function` in 1.2.x.
375
+ export default async ({ directory, platform: hostPlatform = process.platform, env = process.env }) => {
376
+ const ctx = new TrellisContext(directory)
377
+ debugLog("inject", "Plugin loaded, directory:", directory)
378
+
379
+ return {
380
+ "tool.execute.before": async (input, output) => {
381
+ try {
382
+ if (process.env.TRELLIS_HOOKS === "0" || process.env.TRELLIS_DISABLE_HOOKS === "1") {
383
+ return
384
+ }
385
+ debugLog("inject", "tool.execute.before called, tool:", input?.tool)
386
+
387
+ const toolName = input?.tool?.toLowerCase()
388
+ if (toolName === "bash") {
389
+ if (injectTrellisContextIntoBash(ctx, input, output, hostPlatform, env)) {
390
+ debugLog("inject", "Injected TRELLIS_CONTEXT_ID into Bash command")
391
+ }
392
+ return
393
+ }
394
+
395
+ if (toolName !== "task") {
396
+ return
397
+ }
398
+
399
+ const args = output?.args
400
+ if (!args) return
401
+
402
+ const rawSubagentType = args.subagent_type
403
+ // Strip "trellis-" prefix added by v0.5.0-beta.5 agent rename migration
404
+ const subagentType = (rawSubagentType || "").replace(/^trellis-/, "")
405
+ const originalPrompt = args.prompt || ""
406
+
407
+ debugLog("inject", "Task tool called, subagent_type:", rawSubagentType)
408
+
409
+ if (!AGENTS_ALL.includes(subagentType)) {
410
+ debugLog("inject", "Skipping - unsupported subagent_type")
411
+ return
412
+ }
413
+
414
+ // Resolve active task in this priority order (only later steps
415
+ // run when earlier ones miss):
416
+ // 1. Exact session runtime context lookup for input.sessionID
417
+ // 2. `Active task: <path>` hint in the dispatch prompt
418
+ // (explicit per-dispatch override — beats single-session
419
+ // inference so multi-window users can disambiguate)
420
+ // 3. Single-session fallback — only when exactly 1 session
421
+ // runtime file exists locally
422
+ let taskDir = null
423
+ let taskSource = null
424
+
425
+ const contextKey = ctx.getContextKey(input)
426
+ if (contextKey) {
427
+ const context = ctx.readContext(contextKey)
428
+ const exactRef = ctx.normalizeTaskRef(context?.current_task || "")
429
+ if (exactRef) {
430
+ taskDir = exactRef
431
+ taskSource = `session:${contextKey}`
432
+ }
433
+ }
434
+
435
+ if (!taskDir) {
436
+ const hintRef = extractActiveTaskHint(originalPrompt)
437
+ if (hintRef) {
438
+ const hintNormalized = ctx.normalizeTaskRef(hintRef)
439
+ if (hintNormalized) {
440
+ const hintDir = ctx.resolveTaskDir(hintNormalized)
441
+ if (hintDir && existsSync(hintDir)) {
442
+ taskDir = hintNormalized
443
+ taskSource = "prompt-hint"
444
+ debugLog("inject", "Resolved task from Active task: hint:", hintNormalized)
445
+ }
446
+ }
447
+ }
448
+ }
449
+
450
+ if (!taskDir) {
451
+ const fallback = ctx._resolveSingleSessionFallback()
452
+ if (fallback?.taskPath) {
453
+ const fallbackDir = ctx.resolveTaskDir(fallback.taskPath)
454
+ if (fallbackDir && existsSync(fallbackDir)) {
455
+ taskDir = fallback.taskPath
456
+ taskSource = fallback.source
457
+ debugLog("inject", "Resolved task via single-session fallback:", taskDir, "source:", taskSource)
458
+ }
459
+ }
460
+ }
461
+
462
+ // Agents requiring task directory
463
+ if (AGENTS_REQUIRE_TASK.includes(subagentType)) {
464
+ // subagentType is already stripped of "trellis-" prefix above
465
+ if (!taskDir) {
466
+ debugLog("inject", "Skipping - no current task")
467
+ return
468
+ }
469
+ const taskDirFull = ctx.resolveTaskDir(taskDir)
470
+ if (!taskDirFull || !existsSync(taskDirFull)) {
471
+ debugLog("inject", "Skipping - task directory not found")
472
+ return
473
+ }
474
+ }
475
+
476
+ // Check for [finish] marker
477
+ const isFinish = originalPrompt.toLowerCase().includes("[finish]")
478
+
479
+ // Get context based on agent type
480
+ let context = ""
481
+ switch (subagentType) {
482
+ case "implement":
483
+ context = getImplementContext(ctx, taskDir)
484
+ break
485
+ case "check":
486
+ context = isFinish
487
+ ? getFinishContext(ctx, taskDir)
488
+ : getCheckContext(ctx, taskDir)
489
+ break
490
+ case "research":
491
+ context = getResearchContext(ctx, taskDir)
492
+ break
493
+ }
494
+
495
+ if (!context) {
496
+ debugLog("inject", "No context to inject")
497
+ return
498
+ }
499
+
500
+ const newPrompt = buildPrompt(subagentType, originalPrompt, context, isFinish)
501
+
502
+ // Mutate args in-place — whole-object replacement does NOT work for the task tool
503
+ // because the runtime holds a local reference to the same args object.
504
+ args.prompt = newPrompt
505
+
506
+ debugLog("inject", "Injected context for", subagentType, "prompt length:", newPrompt.length)
507
+
508
+ } catch (error) {
509
+ debugLog("inject", "Error in tool.execute.before:", error.message, error.stack)
510
+ }
511
+ }
512
+ }
513
+ }
@@ -0,0 +1,159 @@
1
+ /* global process */
2
+ /**
3
+ * Trellis Workflow State Injection Plugin
4
+ *
5
+ * Per-turn UserPromptSubmit equivalent for OpenCode.
6
+ *
7
+ * On every chat.message, if a Trellis task is active, inject a short
8
+ * <workflow-state> breadcrumb reminding the main AI what task is
9
+ * active and its expected flow. Breadcrumb text is pulled exclusively
10
+ * from the project's workflow.md [workflow-state:STATUS] tag blocks —
11
+ * workflow.md is the single source of truth. There are no fallback
12
+ * tables in this plugin: when workflow.md is missing or a tag is
13
+ * absent, the breadcrumb degrades to a generic
14
+ * "Refer to workflow.md for current step." line so users see (and fix)
15
+ * the broken state instead of the plugin silently masking it.
16
+ *
17
+ * Unlike session-start, this plugin does NOT dedupe — the breadcrumb
18
+ * should surface on every turn so long conversations don't drift.
19
+ *
20
+ * Silently skips when:
21
+ * - No .trellis/ directory
22
+ * - No active task in the session runtime context
23
+ * - task.json malformed or missing status
24
+ */
25
+
26
+ import { existsSync, readFileSync } from "fs"
27
+ import { join } from "path"
28
+ import { TrellisContext, debugLog, isTrellisSubagent } from "../lib/trellis-context.js"
29
+
30
+ // Supports STATUS values with letters, digits, underscores, hyphens
31
+ // (so "in-review" / "blocked-by-team" work alongside "in_progress").
32
+ const TAG_RE = /\[workflow-state:([A-Za-z0-9_-]+)\]\s*\n([\s\S]*?)\n\s*\[\/workflow-state:\1\]/g
33
+
34
+ /**
35
+ * Parse workflow.md for [workflow-state:STATUS] blocks.
36
+ *
37
+ * Returns {status: body}. workflow.md is the single source of truth —
38
+ * there are no fallback tables here. Missing tags (or a missing /
39
+ * unreadable workflow.md) fall back to a generic line in
40
+ * buildBreadcrumb so users see the broken state and fix workflow.md
41
+ * rather than the plugin silently masking it.
42
+ */
43
+ function loadBreadcrumbs(directory) {
44
+ const workflowPath = join(directory, ".trellis", "workflow.md")
45
+ if (!existsSync(workflowPath)) return {}
46
+ let content
47
+ try {
48
+ content = readFileSync(workflowPath, "utf-8")
49
+ } catch {
50
+ return {}
51
+ }
52
+ const result = {}
53
+ for (const match of content.matchAll(TAG_RE)) {
54
+ const status = match[1]
55
+ const body = match[2].trim()
56
+ if (body) result[status] = body
57
+ }
58
+ return result
59
+ }
60
+
61
+ /**
62
+ * Get (taskId, status) from active task, or null if no active task.
63
+ */
64
+ function getActiveTask(ctx, platformInput = null) {
65
+ const active = ctx.getActiveTask(platformInput)
66
+ const taskRef = active.taskPath
67
+ if (!taskRef) return null
68
+ const taskDir = ctx.resolveTaskDir(taskRef)
69
+ if (active.stale || !taskDir || !existsSync(taskDir)) {
70
+ return { id: taskRef.split("/").pop(), status: "stale", source: active.source }
71
+ }
72
+ const taskJsonPath = join(taskDir, "task.json")
73
+ if (!existsSync(taskJsonPath)) return null
74
+ try {
75
+ const data = JSON.parse(readFileSync(taskJsonPath, "utf-8"))
76
+ const status = typeof data.status === "string" ? data.status : ""
77
+ if (!status) return null
78
+ const id = data.id || taskRef.split("/").pop()
79
+ return { id, status, source: active.source }
80
+ } catch {
81
+ return null
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Build the <workflow-state>...</workflow-state> block.
87
+ * - Known status (tag present in workflow.md) → detailed body
88
+ * - Unknown status (no tag, or workflow.md missing) → generic
89
+ * "Refer to workflow.md for current step." line
90
+ * - no_task pseudo-status (id === null) → header omits task info
91
+ */
92
+ function buildBreadcrumb(id, status, templates) {
93
+ let body = templates[status]
94
+ if (body === undefined) {
95
+ body = "Refer to workflow.md for current step."
96
+ }
97
+ let header = id === null ? `Status: ${status}` : `Task: ${id} (${status})`
98
+ return `<workflow-state>\n${header}\n${body}\n</workflow-state>`
99
+ }
100
+
101
+ // OpenCode 1.2.x expects plugins to be factory functions (see inject-subagent-context.js comment).
102
+ export default async ({ directory }) => {
103
+ const ctx = new TrellisContext(directory)
104
+ debugLog("workflow-state", "Plugin loaded, directory:", directory)
105
+
106
+ return {
107
+ // chat.message fires on every user message. Inject breadcrumb in-place
108
+ // so it persists in conversation history.
109
+ "chat.message": async (input, output) => {
110
+ try {
111
+ // Skip Trellis sub-agent turns — the per-turn breadcrumb is for the
112
+ // main session only; sub-agent context comes from the parent's
113
+ // tool.execute.before injection.
114
+ if (isTrellisSubagent(input)) {
115
+ debugLog("workflow-state", "Skipping trellis subagent turn:", input?.agent)
116
+ return
117
+ }
118
+ if (process.env.TRELLIS_HOOKS === "0" || process.env.TRELLIS_DISABLE_HOOKS === "1") {
119
+ return
120
+ }
121
+ if (process.env.OPENCODE_NON_INTERACTIVE === "1") {
122
+ return
123
+ }
124
+ if (!ctx.isTrellisProject()) {
125
+ return
126
+ }
127
+ const templates = loadBreadcrumbs(directory)
128
+ const task = getActiveTask(ctx, input)
129
+ const breadcrumb = task
130
+ ? buildBreadcrumb(task.id, task.status, templates, task.source)
131
+ : buildBreadcrumb(null, "no_task", templates)
132
+
133
+ const parts = output?.parts || []
134
+ const textPartIndex = parts.findIndex(
135
+ p => p.type === "text" && p.text !== undefined,
136
+ )
137
+ if (textPartIndex !== -1) {
138
+ const originalText = parts[textPartIndex].text || ""
139
+ parts[textPartIndex].text = `${breadcrumb}\n\n${originalText}`
140
+ } else {
141
+ parts.unshift({ type: "text", text: breadcrumb })
142
+ }
143
+ debugLog(
144
+ "workflow-state",
145
+ "Injected breadcrumb for task",
146
+ task ? task.id : "none",
147
+ "status",
148
+ task ? task.status : "no_task",
149
+ )
150
+ } catch (error) {
151
+ debugLog(
152
+ "workflow-state",
153
+ "Error in chat.message:",
154
+ error instanceof Error ? error.message : String(error),
155
+ )
156
+ }
157
+ },
158
+ }
159
+ }