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,771 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Multi-Platform Sub-Agent Context Injection Hook
5
+
6
+ Injects task-specific context when sub-agents (implement, check, research) are spawned.
7
+
8
+ Core Design Philosophy:
9
+ - Hook is responsible for injecting all context, subagent works autonomously with complete info
10
+ - Each agent has a dedicated jsonl file defining its context
11
+ - No resume needed, no segmentation, behavior controlled by code not prompt
12
+
13
+ Trigger: PreToolUse (before Task tool call)
14
+
15
+ Context Source: Trellis active task resolver points to task directory
16
+ - implement.jsonl - Implement agent dedicated context
17
+ - check.jsonl - Check agent dedicated context
18
+ - prd.md - Requirements document
19
+ - design.md - Technical design for complex tasks
20
+ - implement.md - Execution plan for complex tasks
21
+ - codex-review-output.txt - Code Review results
22
+ """
23
+ from __future__ import annotations
24
+
25
+ # IMPORTANT: Suppress all warnings FIRST
26
+ import warnings
27
+ warnings.filterwarnings("ignore")
28
+
29
+ import json
30
+ import os
31
+ import sys
32
+ from pathlib import Path
33
+ from typing import Any
34
+
35
+ # IMPORTANT: Force stdout to use UTF-8 on Windows
36
+ # This fixes UnicodeEncodeError when outputting non-ASCII characters
37
+ if sys.platform.startswith("win"):
38
+ import io as _io
39
+ if hasattr(sys.stdout, "reconfigure"):
40
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr]
41
+ elif hasattr(sys.stdout, "detach"):
42
+ sys.stdout = _io.TextIOWrapper(sys.stdout.detach(), encoding="utf-8", errors="replace") # type: ignore[union-attr]
43
+
44
+
45
+ # =============================================================================
46
+ # Path Constants (change here to rename directories)
47
+ # =============================================================================
48
+
49
+ DIR_WORKFLOW = ".trellis"
50
+ DIR_SPEC = "spec"
51
+ FILE_TASK_JSON = "task.json"
52
+
53
+ # =============================================================================
54
+ # Subagent Constants (change here to rename subagent types)
55
+ # =============================================================================
56
+
57
+ AGENT_IMPLEMENT = "trellis-implement"
58
+ AGENT_CHECK = "trellis-check"
59
+ AGENT_RESEARCH = "trellis-research"
60
+
61
+ # Agents that require a task directory
62
+ AGENTS_REQUIRE_TASK = (AGENT_IMPLEMENT, AGENT_CHECK)
63
+ # All supported agents
64
+ AGENTS_ALL = (AGENT_IMPLEMENT, AGENT_CHECK, AGENT_RESEARCH)
65
+
66
+
67
+ def find_repo_root(start_path: str) -> str | None:
68
+ """
69
+ Find git repo root from start_path upwards
70
+
71
+ Returns:
72
+ Repo root path, or None if not found
73
+ """
74
+ current = Path(start_path).resolve()
75
+ while current != current.parent:
76
+ if (current / ".git").exists():
77
+ return str(current)
78
+ current = current.parent
79
+ return None
80
+
81
+
82
+ def _detect_platform(input_data: dict) -> str | None:
83
+ if isinstance(input_data.get("cursor_version"), str):
84
+ return "cursor"
85
+ env_map = {
86
+ "CLAUDE_PROJECT_DIR": "claude",
87
+ "CURSOR_PROJECT_DIR": "cursor",
88
+ "CODEBUDDY_PROJECT_DIR": "codebuddy",
89
+ "FACTORY_PROJECT_DIR": "droid",
90
+ "GEMINI_PROJECT_DIR": "gemini",
91
+ "QODER_PROJECT_DIR": "qoder",
92
+ "KIRO_PROJECT_DIR": "kiro",
93
+ "COPILOT_PROJECT_DIR": "copilot",
94
+ }
95
+ for env_name, platform in env_map.items():
96
+ if os.environ.get(env_name):
97
+ return platform
98
+ script_parts = set(Path(sys.argv[0]).parts)
99
+ if ".claude" in script_parts:
100
+ return "claude"
101
+ if ".cursor" in script_parts:
102
+ return "cursor"
103
+ if ".gemini" in script_parts:
104
+ return "gemini"
105
+ if ".qoder" in script_parts:
106
+ return "qoder"
107
+ if ".codebuddy" in script_parts:
108
+ return "codebuddy"
109
+ if ".factory" in script_parts:
110
+ return "droid"
111
+ if ".kiro" in script_parts:
112
+ return "kiro"
113
+ return None
114
+
115
+
116
+ def get_current_task(repo_root: str, input_data: dict) -> str | None:
117
+ """Resolve current task directory through the unified active task resolver."""
118
+ scripts_dir = Path(repo_root) / DIR_WORKFLOW / "scripts"
119
+ if str(scripts_dir) not in sys.path:
120
+ sys.path.insert(0, str(scripts_dir))
121
+ try:
122
+ from common.active_task import resolve_active_task # type: ignore[import-not-found]
123
+ except Exception:
124
+ return None
125
+
126
+ active = resolve_active_task(
127
+ Path(repo_root),
128
+ input_data,
129
+ platform=_detect_platform(input_data),
130
+ )
131
+ return active.task_path
132
+
133
+
134
+ def read_file_content(base_path: str, file_path: str) -> str | None:
135
+ """Read file content, return None if file doesn't exist"""
136
+ full_path = os.path.join(base_path, file_path)
137
+ if os.path.exists(full_path) and os.path.isfile(full_path):
138
+ try:
139
+ with open(full_path, "r", encoding="utf-8") as f:
140
+ return f.read()
141
+ except Exception:
142
+ return None
143
+ return None
144
+
145
+
146
+ def read_directory_contents(
147
+ base_path: str, dir_path: str, max_files: int = 20
148
+ ) -> list[tuple[str, str]]:
149
+ """
150
+ Read all .md files in a directory
151
+
152
+ Args:
153
+ base_path: Base path (usually repo_root)
154
+ dir_path: Directory relative path
155
+ max_files: Max files to read (prevent huge directories)
156
+
157
+ Returns:
158
+ [(file_path, content), ...]
159
+ """
160
+ full_path = os.path.join(base_path, dir_path)
161
+ if not os.path.exists(full_path) or not os.path.isdir(full_path):
162
+ return []
163
+
164
+ results = []
165
+ try:
166
+ # Only read .md files, sorted by filename
167
+ md_files = sorted(
168
+ [
169
+ f
170
+ for f in os.listdir(full_path)
171
+ if f.endswith(".md") and os.path.isfile(os.path.join(full_path, f))
172
+ ]
173
+ )
174
+
175
+ for filename in md_files[:max_files]:
176
+ file_full_path = os.path.join(full_path, filename)
177
+ relative_path = os.path.join(dir_path, filename)
178
+ try:
179
+ with open(file_full_path, "r", encoding="utf-8") as f:
180
+ content = f.read()
181
+ results.append((relative_path, content))
182
+ except Exception:
183
+ continue
184
+ except Exception:
185
+ pass
186
+
187
+ return results
188
+
189
+
190
+ def read_jsonl_entries(base_path: str, jsonl_path: str) -> list[tuple[str, str]]:
191
+ """
192
+ Read all file/directory contents referenced in jsonl file
193
+
194
+ Schema:
195
+ {"file": "path/to/file.md", "reason": "..."}
196
+ {"file": "path/to/dir/", "type": "directory", "reason": "..."}
197
+ {"_example": "..."} # seed row — skipped (no `file` field)
198
+
199
+ Rows without a ``file`` field (e.g. the self-describing seed line written
200
+ by ``task.py create`` before the agent has curated entries) are skipped
201
+ silently. If the resulting entry list is empty, a stderr warning is
202
+ emitted so the operator can debug missing context.
203
+
204
+ Returns:
205
+ [(path, content), ...]
206
+ """
207
+ full_path = os.path.join(base_path, jsonl_path)
208
+ if not os.path.exists(full_path):
209
+ print(
210
+ f"[inject-subagent-context] WARN: {jsonl_path} not found — "
211
+ f"sub-agent will receive only task artifacts",
212
+ file=sys.stderr,
213
+ )
214
+ return []
215
+
216
+ results = []
217
+ saw_real_entry = False
218
+ try:
219
+ with open(full_path, "r", encoding="utf-8") as f:
220
+ for line in f:
221
+ line = line.strip()
222
+ if not line:
223
+ continue
224
+ try:
225
+ item = json.loads(line)
226
+ file_path = item.get("file") or item.get("path")
227
+ entry_type = item.get("type", "file")
228
+
229
+ if not file_path:
230
+ # Seed / comment row — skip silently
231
+ continue
232
+
233
+ saw_real_entry = True
234
+ if entry_type == "directory":
235
+ # Read all .md files in directory
236
+ dir_contents = read_directory_contents(base_path, file_path)
237
+ results.extend(dir_contents)
238
+ else:
239
+ # Read single file
240
+ content = read_file_content(base_path, file_path)
241
+ if content:
242
+ results.append((file_path, content))
243
+ except json.JSONDecodeError:
244
+ continue
245
+ except Exception:
246
+ pass
247
+
248
+ if not saw_real_entry:
249
+ print(
250
+ f"[inject-subagent-context] WARN: {jsonl_path} has no curated "
251
+ f"entries (only seed / empty) — sub-agent will receive only "
252
+ f"task artifacts. See workflow.md planning artifact guidance.",
253
+ file=sys.stderr,
254
+ )
255
+
256
+ return results
257
+
258
+
259
+
260
+
261
+ def get_agent_context(repo_root: str, task_dir: str, agent_type: str) -> str:
262
+ """
263
+ Get context from {agent_type}.jsonl for the specified agent.
264
+ Only reads implement.jsonl or check.jsonl (the two JSONL files the task system creates).
265
+ """
266
+ context_parts = []
267
+
268
+ agent_jsonl = f"{task_dir}/{agent_type}.jsonl"
269
+ for file_path, content in read_jsonl_entries(repo_root, agent_jsonl):
270
+ context_parts.append(f"=== {file_path} ===\n{content}")
271
+
272
+ return "\n\n".join(context_parts)
273
+
274
+
275
+ def get_implement_context(repo_root: str, task_dir: str) -> str:
276
+ """
277
+ Complete context for Implement Agent
278
+
279
+ Read order:
280
+ 1. All files in implement.jsonl (spec/research manifests)
281
+ 2. prd.md (requirements)
282
+ 3. design.md if present (technical design)
283
+ 4. implement.md if present (execution plan)
284
+ """
285
+ context_parts = []
286
+
287
+ # 1. Read implement.jsonl
288
+ base_context = get_agent_context(repo_root, task_dir, "implement")
289
+ if base_context:
290
+ context_parts.append(base_context)
291
+
292
+ # 2. Requirements document
293
+ prd_content = read_file_content(repo_root, f"{task_dir}/prd.md")
294
+ if prd_content:
295
+ context_parts.append(f"=== {task_dir}/prd.md (Requirements) ===\n{prd_content}")
296
+
297
+ # 3. Technical design for complex tasks
298
+ design_content = read_file_content(repo_root, f"{task_dir}/design.md")
299
+ if design_content:
300
+ context_parts.append(
301
+ f"=== {task_dir}/design.md (Technical Design) ===\n{design_content}"
302
+ )
303
+
304
+ # 4. Execution plan for complex tasks
305
+ implement_plan_content = read_file_content(repo_root, f"{task_dir}/implement.md")
306
+ if implement_plan_content:
307
+ context_parts.append(
308
+ f"=== {task_dir}/implement.md (Execution Plan) ===\n{implement_plan_content}"
309
+ )
310
+
311
+ return "\n\n".join(context_parts)
312
+
313
+
314
+ def get_check_context(repo_root: str, task_dir: str) -> str:
315
+ """
316
+ Context for Check Agent: check.jsonl + task artifacts.
317
+ """
318
+ context_parts = []
319
+
320
+ for file_path, content in read_jsonl_entries(repo_root, f"{task_dir}/check.jsonl"):
321
+ context_parts.append(f"=== {file_path} ===\n{content}")
322
+
323
+ prd_content = read_file_content(repo_root, f"{task_dir}/prd.md")
324
+ if prd_content:
325
+ context_parts.append(f"=== {task_dir}/prd.md (Requirements) ===\n{prd_content}")
326
+
327
+ design_content = read_file_content(repo_root, f"{task_dir}/design.md")
328
+ if design_content:
329
+ context_parts.append(
330
+ f"=== {task_dir}/design.md (Technical Design) ===\n{design_content}"
331
+ )
332
+
333
+ implement_plan_content = read_file_content(repo_root, f"{task_dir}/implement.md")
334
+ if implement_plan_content:
335
+ context_parts.append(
336
+ f"=== {task_dir}/implement.md (Execution Plan) ===\n{implement_plan_content}"
337
+ )
338
+
339
+ return "\n\n".join(context_parts)
340
+
341
+
342
+ def get_finish_context(repo_root: str, task_dir: str) -> str:
343
+ """
344
+ Context for Finish phase: reuses check.jsonl + prd.md
345
+ (Finish is a final check, same context source.)
346
+ """
347
+ return get_check_context(repo_root, task_dir)
348
+
349
+
350
+
351
+ def build_implement_prompt(original_prompt: str, context: str) -> str:
352
+ """Build complete prompt for Implement"""
353
+ return f"""<!-- trellis-hook-injected -->
354
+ # Implement Agent Task
355
+
356
+ You are the Implement Agent in the Multi-Agent Pipeline.
357
+
358
+ ## Your Context
359
+
360
+ All the information you need has been prepared for you:
361
+
362
+ {context}
363
+
364
+ ---
365
+
366
+ ## Your Task
367
+
368
+ {original_prompt}
369
+
370
+ ---
371
+
372
+ ## Workflow
373
+
374
+ 1. **Understand specs** - All dev specs are injected above, understand them
375
+ 2. **Understand task artifacts** - Read requirements, technical design if present, and execution plan if present
376
+ 3. **Implement feature** - Implement following specs and task artifacts
377
+ 4. **Self-check** - Ensure code quality against check specs
378
+
379
+ ## Important Constraints
380
+
381
+ - Do NOT execute git commit, only code modifications
382
+ - Follow all dev specs injected above
383
+ - Report list of modified/created files when done"""
384
+
385
+
386
+ def build_check_prompt(original_prompt: str, context: str) -> str:
387
+ """Build complete prompt for Check"""
388
+ return f"""<!-- trellis-hook-injected -->
389
+ # Check Agent Task
390
+
391
+ You are the Check Agent in the Multi-Agent Pipeline (code and cross-layer checker).
392
+
393
+ ## Your Context
394
+
395
+ All check specs and dev specs you need:
396
+
397
+ {context}
398
+
399
+ ---
400
+
401
+ ## Your Task
402
+
403
+ {original_prompt}
404
+
405
+ ---
406
+
407
+ ## Workflow
408
+
409
+ 1. **Get changes** - Run `git diff --name-only` and `git diff` to get code changes
410
+ 2. **Check against specs** - Check item by item against specs above
411
+ 3. **Self-fix** - Fix issues directly, don't just report
412
+ 4. **Run verification** - Run project's lint and typecheck commands
413
+
414
+ ## Important Constraints
415
+
416
+ - Fix issues yourself, don't just report
417
+ - Must execute complete checklist in check specs
418
+ - Pay special attention to impact radius analysis (L1-L5)"""
419
+
420
+
421
+ def build_finish_prompt(original_prompt: str, context: str) -> str:
422
+ """Build complete prompt for Finish (final check before PR)"""
423
+ return f"""<!-- trellis-hook-injected -->
424
+ # Finish Agent Task
425
+
426
+ You are performing the final check before creating a PR.
427
+
428
+ ## Your Context
429
+
430
+ Finish checklist and requirements:
431
+
432
+ {context}
433
+
434
+ ---
435
+
436
+ ## Your Task
437
+
438
+ {original_prompt}
439
+
440
+ ---
441
+
442
+ ## Workflow
443
+
444
+ 1. **Review changes** - Run `git diff --name-only` to see all changed files
445
+ 2. **Verify task artifacts** - Check requirements in prd.md and, when present, design.md / implement.md
446
+ 3. **Spec sync** - Analyze whether changes introduce new patterns, contracts, or conventions
447
+ - If new pattern/convention found: read target spec file → update it → update index.md if needed
448
+ - If infra/cross-layer change: follow the 7-section mandatory template from update-spec.md
449
+ - If pure code fix with no new patterns: skip this step
450
+ 4. **Run final checks** - Execute lint and typecheck
451
+ 5. **Confirm ready** - Ensure code is ready for PR
452
+
453
+ ## Important Constraints
454
+
455
+ - You MAY update spec files when gaps are detected (use update-spec.md as guide)
456
+ - MUST read the target spec file BEFORE editing (avoid duplicating existing content)
457
+ - Do NOT update specs for trivial changes (typos, formatting, obvious fixes)
458
+ - If critical CODE issues found, report them clearly (fix specs, not code)
459
+ - Verify all acceptance criteria in prd.md are met
460
+ - Verify design.md and implement.md constraints when those files are present"""
461
+
462
+
463
+
464
+ def get_research_context(repo_root: str, task_dir: str | None) -> str:
465
+ """
466
+ Context for Research Agent — project structure overview for spec directories.
467
+
468
+ `task_dir` kept for signature parity with get_implement_context / get_check_context
469
+ so the dispatcher can call them uniformly.
470
+ """
471
+ _ = task_dir
472
+ context_parts = []
473
+
474
+ # 1. Project structure overview (dynamically discover spec directories)
475
+ spec_path = f"{DIR_WORKFLOW}/{DIR_SPEC}"
476
+ spec_root = Path(repo_root) / DIR_WORKFLOW / DIR_SPEC
477
+
478
+ # Build spec tree dynamically
479
+ tree_lines = [f"{spec_path}/"]
480
+ if spec_root.is_dir():
481
+ pkg_dirs = sorted(d for d in spec_root.iterdir() if d.is_dir())
482
+ for i, pkg_dir in enumerate(pkg_dirs):
483
+ is_last = i == len(pkg_dirs) - 1
484
+ prefix = "└── " if is_last else "├── "
485
+ layers = sorted(d.name for d in pkg_dir.iterdir() if d.is_dir())
486
+ layer_info = f" ({', '.join(layers)})" if layers else ""
487
+ tree_lines.append(f"{prefix}{pkg_dir.name}/{layer_info}")
488
+
489
+ spec_tree = "\n".join(tree_lines)
490
+
491
+ project_structure = f"""## Project Spec Directory Structure
492
+
493
+ ```
494
+ {spec_tree}
495
+ ```
496
+
497
+ To get structured package info, run: `python3 ./{DIR_WORKFLOW}/scripts/get_context.py --mode packages`
498
+
499
+ ## Search Tips
500
+
501
+ - Spec files: `{spec_path}/**/*.md`
502
+ - Code search: Use Glob and Grep tools
503
+ - Tech solutions: Use mcp__exa__web_search_exa or mcp__exa__get_code_context_exa"""
504
+
505
+ context_parts.append(project_structure)
506
+
507
+ return "\n\n".join(context_parts)
508
+
509
+
510
+ def build_research_prompt(original_prompt: str, context: str) -> str:
511
+ """Build complete prompt for Research"""
512
+ return f"""# Research Agent Task
513
+
514
+ You are the Research Agent in the Multi-Agent Pipeline (search researcher).
515
+
516
+ ## Core Principle
517
+
518
+ **You do one thing: find and explain information.**
519
+
520
+ You are a documenter, not a reviewer.
521
+
522
+ ## Project Info
523
+
524
+ {context}
525
+
526
+ ---
527
+
528
+ ## Your Task
529
+
530
+ {original_prompt}
531
+
532
+ ---
533
+
534
+ ## Workflow
535
+
536
+ 1. **Understand query** - Determine search type (internal/external) and scope
537
+ 2. **Plan search** - List search steps for complex queries
538
+ 3. **Execute search** - Execute multiple independent searches in parallel
539
+ 4. **Organize results** - Output structured report
540
+
541
+ ## Search Tools
542
+
543
+ | Tool | Purpose |
544
+ |------|---------|
545
+ | Glob | Search by filename pattern |
546
+ | Grep | Search by content |
547
+ | Read | Read file content |
548
+ | mcp__exa__web_search_exa | External web search |
549
+ | mcp__exa__get_code_context_exa | External code/doc search |
550
+
551
+ ## Strict Boundaries
552
+
553
+ **Only allowed**: Describe what exists, where it is, how it works
554
+
555
+ **Forbidden** (unless explicitly asked):
556
+ - Suggest improvements
557
+ - Criticize implementation
558
+ - Recommend refactoring
559
+ - Modify any files
560
+
561
+ ## Report Format
562
+
563
+ Provide structured search results including:
564
+ - List of files found (with paths)
565
+ - Code pattern analysis (if applicable)
566
+ - Related spec documents
567
+ - External references (if any)"""
568
+
569
+
570
+ def _string_value(value: Any) -> str:
571
+ if isinstance(value, str):
572
+ stripped = value.strip()
573
+ return stripped
574
+ return ""
575
+
576
+
577
+ def _extract_subagent_name(value: Any) -> str:
578
+ """Extract a sub-agent name from common platform encodings.
579
+
580
+ Cursor's native Task args encode custom sub-agents as a protobuf oneof,
581
+ which can appear in hook JSON as either ``{"custom": {"name": "..."}}``
582
+ or ``{"type": {"case": "custom", "value": {"name": "..."}}}``.
583
+ """
584
+ direct = _string_value(value)
585
+ if direct:
586
+ return direct
587
+
588
+ if not isinstance(value, dict):
589
+ return ""
590
+
591
+ for key in ("name", "subagent_type_name", "subagentTypeName"):
592
+ direct = _string_value(value.get(key))
593
+ if direct:
594
+ return direct
595
+
596
+ custom = value.get("custom")
597
+ if isinstance(custom, dict):
598
+ custom_name = _string_value(custom.get("name"))
599
+ if custom_name:
600
+ return custom_name
601
+
602
+ oneof = value.get("type")
603
+ if isinstance(oneof, dict):
604
+ case_name = _string_value(oneof.get("case"))
605
+ if case_name == "custom":
606
+ nested_value = oneof.get("value")
607
+ if isinstance(nested_value, dict):
608
+ custom_name = _string_value(nested_value.get("name"))
609
+ if custom_name:
610
+ return custom_name
611
+ if case_name:
612
+ return case_name
613
+
614
+ case_name = _string_value(value.get("case"))
615
+ if case_name == "custom":
616
+ nested_value = value.get("value")
617
+ if isinstance(nested_value, dict):
618
+ custom_name = _string_value(nested_value.get("name"))
619
+ if custom_name:
620
+ return custom_name
621
+ if case_name:
622
+ return case_name
623
+
624
+ for agent_name in AGENTS_ALL:
625
+ if agent_name in value:
626
+ return agent_name
627
+
628
+ return ""
629
+
630
+
631
+ def _extract_subagent_type(tool_input: dict) -> str:
632
+ for key in (
633
+ "subagent_type",
634
+ "subagentType",
635
+ "subagent_type_name",
636
+ "subagentTypeName",
637
+ "agent_type",
638
+ "agentType",
639
+ "name",
640
+ ):
641
+ agent_name = _extract_subagent_name(tool_input.get(key))
642
+ if agent_name:
643
+ return agent_name
644
+ return ""
645
+
646
+
647
+ def _parse_hook_input(input_data: dict) -> tuple[str, str, dict]:
648
+ """Parse hook input across different platform formats.
649
+
650
+ Returns (subagent_type, original_prompt, tool_input).
651
+ Handles:
652
+ - Claude Code / Qoder / CodeBuddy / Droid: tool_name=Task|Agent, tool_input.subagent_type
653
+ - Cursor: tool_name=Task|Subagent, tool_input.subagent_type
654
+ - Copilot CLI: toolName=task (camelCase key, lowercase value)
655
+ - Gemini CLI: tool_name IS the agent name (BeforeTool matcher already filtered)
656
+ - Kiro: agentSpawn hook, agent_name field at top level
657
+ """
658
+ tool_input = input_data.get("tool_input", {})
659
+
660
+ # Standard format: Task/Agent tool with subagent_type
661
+ tool_name = input_data.get("tool_name", "") or input_data.get("toolName", "")
662
+ if tool_name.lower() in ("task", "agent", "subagent"):
663
+ return (
664
+ _extract_subagent_type(tool_input),
665
+ tool_input.get("prompt", ""),
666
+ tool_input,
667
+ )
668
+
669
+ # Kiro: agentSpawn hook passes agent_name at top level
670
+ agent_name = input_data.get("agent_name", "")
671
+ if agent_name:
672
+ return agent_name, tool_input.get("prompt", input_data.get("prompt", "")), tool_input
673
+
674
+ # Gemini CLI: BeforeTool where tool_name IS the agent name
675
+ # (matcher already ensured it's one of our agents)
676
+ if tool_name in AGENTS_ALL:
677
+ return tool_name, tool_input.get("prompt", ""), tool_input
678
+
679
+ # Copilot CLI: toolName field (camelCase), value might be the agent name
680
+ tool_name_camel = input_data.get("toolName", "")
681
+ if tool_name_camel in AGENTS_ALL:
682
+ return tool_name_camel, input_data.get("toolArgs", ""), tool_input
683
+
684
+ return "", "", tool_input
685
+
686
+
687
+ def main():
688
+ if os.environ.get("TRELLIS_HOOKS") == "0" or os.environ.get("TRELLIS_DISABLE_HOOKS") == "1":
689
+ sys.exit(0)
690
+
691
+ try:
692
+ input_data = json.load(sys.stdin)
693
+ except json.JSONDecodeError:
694
+ sys.exit(0)
695
+
696
+ subagent_type, original_prompt, tool_input = _parse_hook_input(input_data)
697
+ cwd = input_data.get("cwd", os.getcwd())
698
+
699
+ # Only handle subagent types we care about
700
+ if subagent_type not in AGENTS_ALL:
701
+ sys.exit(0)
702
+
703
+ # Find repo root
704
+ repo_root = find_repo_root(cwd)
705
+ if not repo_root:
706
+ sys.exit(0)
707
+
708
+ # Get current task directory (research doesn't require it)
709
+ task_dir = get_current_task(repo_root, input_data)
710
+
711
+ # implement/check need task directory
712
+ if subagent_type in AGENTS_REQUIRE_TASK:
713
+ if not task_dir:
714
+ sys.exit(0)
715
+ # Check if task directory exists
716
+ task_dir_full = os.path.join(repo_root, task_dir)
717
+ if not os.path.exists(task_dir_full):
718
+ sys.exit(0)
719
+
720
+ # Check for [finish] marker in prompt (check agent with finish context)
721
+ is_finish_phase = "[finish]" in original_prompt.lower()
722
+
723
+ # Get context and build prompt based on subagent type
724
+ if subagent_type == AGENT_IMPLEMENT:
725
+ assert task_dir is not None # validated above
726
+ context = get_implement_context(repo_root, task_dir)
727
+ new_prompt = build_implement_prompt(original_prompt, context)
728
+ elif subagent_type == AGENT_CHECK:
729
+ assert task_dir is not None # validated above
730
+ if is_finish_phase:
731
+ # Finish phase: use finish context (lighter, focused on final verification)
732
+ context = get_finish_context(repo_root, task_dir)
733
+ new_prompt = build_finish_prompt(original_prompt, context)
734
+ else:
735
+ # Regular check phase: use check context (full specs for self-fix loop)
736
+ context = get_check_context(repo_root, task_dir)
737
+ new_prompt = build_check_prompt(original_prompt, context)
738
+ elif subagent_type == AGENT_RESEARCH:
739
+ # Research can work without task directory
740
+ context = get_research_context(repo_root, task_dir)
741
+ new_prompt = build_research_prompt(original_prompt, context)
742
+ else:
743
+ sys.exit(0)
744
+
745
+ if not context:
746
+ sys.exit(0)
747
+
748
+ # Return updated input — use a multi-format output that covers all platforms.
749
+ # Most platforms ignore unrecognized fields, so we include multiple formats.
750
+ # The platform picks whichever fields it understands.
751
+ updated = {**tool_input, "prompt": new_prompt}
752
+ output = {
753
+ # Claude Code / Qoder / CodeBuddy / Droid format
754
+ "hookSpecificOutput": {
755
+ "hookEventName": "PreToolUse",
756
+ "permissionDecision": "allow",
757
+ "updatedInput": updated,
758
+ },
759
+ # Cursor format
760
+ "permission": "allow",
761
+ "updated_input": updated,
762
+ # Gemini format
763
+ "updatedInput": updated,
764
+ }
765
+
766
+ print(json.dumps(output, ensure_ascii=False))
767
+ sys.exit(0)
768
+
769
+
770
+ if __name__ == "__main__":
771
+ main()