@mudssky/trellis 0.6.16-mudssky.5

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 (846) hide show
  1. package/AGENT_INSTALL.md +100 -0
  2. package/COPYRIGHT +15 -0
  3. package/INTEGRATION.md +140 -0
  4. package/LICENSE +235 -0
  5. package/README.md +125 -0
  6. package/bin/trellis.js +3 -0
  7. package/corresponding-source.tar.gz +0 -0
  8. package/dist/cli/index.d.ts +3 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +304 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/commands/ablate.d.ts +14 -0
  13. package/dist/commands/ablate.d.ts.map +1 -0
  14. package/dist/commands/ablate.js +308 -0
  15. package/dist/commands/ablate.js.map +1 -0
  16. package/dist/commands/channel/adapters/claude.d.ts +53 -0
  17. package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
  18. package/dist/commands/channel/adapters/claude.js +225 -0
  19. package/dist/commands/channel/adapters/claude.js.map +1 -0
  20. package/dist/commands/channel/adapters/codex.d.ts +93 -0
  21. package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
  22. package/dist/commands/channel/adapters/codex.js +573 -0
  23. package/dist/commands/channel/adapters/codex.js.map +1 -0
  24. package/dist/commands/channel/adapters/index.d.ts +94 -0
  25. package/dist/commands/channel/adapters/index.d.ts.map +1 -0
  26. package/dist/commands/channel/adapters/index.js +116 -0
  27. package/dist/commands/channel/adapters/index.js.map +1 -0
  28. package/dist/commands/channel/adapters/types.d.ts +33 -0
  29. package/dist/commands/channel/adapters/types.d.ts.map +1 -0
  30. package/dist/commands/channel/adapters/types.js +2 -0
  31. package/dist/commands/channel/adapters/types.js.map +1 -0
  32. package/dist/commands/channel/agent-loader.d.ts +32 -0
  33. package/dist/commands/channel/agent-loader.d.ts.map +1 -0
  34. package/dist/commands/channel/agent-loader.js +158 -0
  35. package/dist/commands/channel/agent-loader.js.map +1 -0
  36. package/dist/commands/channel/context-loader.d.ts +26 -0
  37. package/dist/commands/channel/context-loader.d.ts.map +1 -0
  38. package/dist/commands/channel/context-loader.js +311 -0
  39. package/dist/commands/channel/context-loader.js.map +1 -0
  40. package/dist/commands/channel/context-trust.d.ts +31 -0
  41. package/dist/commands/channel/context-trust.d.ts.map +1 -0
  42. package/dist/commands/channel/context-trust.js +139 -0
  43. package/dist/commands/channel/context-trust.js.map +1 -0
  44. package/dist/commands/channel/context.d.ts +16 -0
  45. package/dist/commands/channel/context.d.ts.map +1 -0
  46. package/dist/commands/channel/context.js +83 -0
  47. package/dist/commands/channel/context.js.map +1 -0
  48. package/dist/commands/channel/create.d.ts +27 -0
  49. package/dist/commands/channel/create.d.ts.map +1 -0
  50. package/dist/commands/channel/create.js +39 -0
  51. package/dist/commands/channel/create.js.map +1 -0
  52. package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
  53. package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
  54. package/dist/commands/channel/dev-parse-trace.js +70 -0
  55. package/dist/commands/channel/dev-parse-trace.js.map +1 -0
  56. package/dist/commands/channel/guard.d.ts +150 -0
  57. package/dist/commands/channel/guard.d.ts.map +1 -0
  58. package/dist/commands/channel/guard.js +480 -0
  59. package/dist/commands/channel/guard.js.map +1 -0
  60. package/dist/commands/channel/index.d.ts +3 -0
  61. package/dist/commands/channel/index.d.ts.map +1 -0
  62. package/dist/commands/channel/index.js +535 -0
  63. package/dist/commands/channel/index.js.map +1 -0
  64. package/dist/commands/channel/interrupt.d.ts +10 -0
  65. package/dist/commands/channel/interrupt.d.ts.map +1 -0
  66. package/dist/commands/channel/interrupt.js +22 -0
  67. package/dist/commands/channel/interrupt.js.map +1 -0
  68. package/dist/commands/channel/kill.d.ts +7 -0
  69. package/dist/commands/channel/kill.d.ts.map +1 -0
  70. package/dist/commands/channel/kill.js +130 -0
  71. package/dist/commands/channel/kill.js.map +1 -0
  72. package/dist/commands/channel/list.d.ts +17 -0
  73. package/dist/commands/channel/list.d.ts.map +1 -0
  74. package/dist/commands/channel/list.js +233 -0
  75. package/dist/commands/channel/list.js.map +1 -0
  76. package/dist/commands/channel/messages.d.ts +15 -0
  77. package/dist/commands/channel/messages.d.ts.map +1 -0
  78. package/dist/commands/channel/messages.js +245 -0
  79. package/dist/commands/channel/messages.js.map +1 -0
  80. package/dist/commands/channel/rm.d.ts +27 -0
  81. package/dist/commands/channel/rm.d.ts.map +1 -0
  82. package/dist/commands/channel/rm.js +216 -0
  83. package/dist/commands/channel/rm.js.map +1 -0
  84. package/dist/commands/channel/run.d.ts +30 -0
  85. package/dist/commands/channel/run.d.ts.map +1 -0
  86. package/dist/commands/channel/run.js +130 -0
  87. package/dist/commands/channel/run.js.map +1 -0
  88. package/dist/commands/channel/send.d.ts +11 -0
  89. package/dist/commands/channel/send.d.ts.map +1 -0
  90. package/dist/commands/channel/send.js +24 -0
  91. package/dist/commands/channel/send.js.map +1 -0
  92. package/dist/commands/channel/spawn.d.ts +43 -0
  93. package/dist/commands/channel/spawn.d.ts.map +1 -0
  94. package/dist/commands/channel/spawn.js +247 -0
  95. package/dist/commands/channel/spawn.js.map +1 -0
  96. package/dist/commands/channel/store/events.d.ts +22 -0
  97. package/dist/commands/channel/store/events.d.ts.map +1 -0
  98. package/dist/commands/channel/store/events.js +43 -0
  99. package/dist/commands/channel/store/events.js.map +1 -0
  100. package/dist/commands/channel/store/filter.d.ts +3 -0
  101. package/dist/commands/channel/store/filter.d.ts.map +1 -0
  102. package/dist/commands/channel/store/filter.js +2 -0
  103. package/dist/commands/channel/store/filter.js.map +1 -0
  104. package/dist/commands/channel/store/lock.d.ts +23 -0
  105. package/dist/commands/channel/store/lock.d.ts.map +1 -0
  106. package/dist/commands/channel/store/lock.js +99 -0
  107. package/dist/commands/channel/store/lock.js.map +1 -0
  108. package/dist/commands/channel/store/paths.d.ts +77 -0
  109. package/dist/commands/channel/store/paths.d.ts.map +1 -0
  110. package/dist/commands/channel/store/paths.js +272 -0
  111. package/dist/commands/channel/store/paths.js.map +1 -0
  112. package/dist/commands/channel/store/schema.d.ts +27 -0
  113. package/dist/commands/channel/store/schema.d.ts.map +1 -0
  114. package/dist/commands/channel/store/schema.js +34 -0
  115. package/dist/commands/channel/store/schema.js.map +1 -0
  116. package/dist/commands/channel/store/thread-state.d.ts +5 -0
  117. package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
  118. package/dist/commands/channel/store/thread-state.js +16 -0
  119. package/dist/commands/channel/store/thread-state.js.map +1 -0
  120. package/dist/commands/channel/store/watch.d.ts +19 -0
  121. package/dist/commands/channel/store/watch.d.ts.map +1 -0
  122. package/dist/commands/channel/store/watch.js +153 -0
  123. package/dist/commands/channel/store/watch.js.map +1 -0
  124. package/dist/commands/channel/supervisor/idle.d.ts +45 -0
  125. package/dist/commands/channel/supervisor/idle.d.ts.map +1 -0
  126. package/dist/commands/channel/supervisor/idle.js +70 -0
  127. package/dist/commands/channel/supervisor/idle.js.map +1 -0
  128. package/dist/commands/channel/supervisor/inbox.d.ts +30 -0
  129. package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
  130. package/dist/commands/channel/supervisor/inbox.js +160 -0
  131. package/dist/commands/channel/supervisor/inbox.js.map +1 -0
  132. package/dist/commands/channel/supervisor/shutdown.d.ts +68 -0
  133. package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
  134. package/dist/commands/channel/supervisor/shutdown.js +146 -0
  135. package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
  136. package/dist/commands/channel/supervisor/stdout.d.ts +71 -0
  137. package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
  138. package/dist/commands/channel/supervisor/stdout.js +229 -0
  139. package/dist/commands/channel/supervisor/stdout.js.map +1 -0
  140. package/dist/commands/channel/supervisor/turns.d.ts +31 -0
  141. package/dist/commands/channel/supervisor/turns.d.ts.map +1 -0
  142. package/dist/commands/channel/supervisor/turns.js +45 -0
  143. package/dist/commands/channel/supervisor/turns.js.map +1 -0
  144. package/dist/commands/channel/supervisor/warning.d.ts +48 -0
  145. package/dist/commands/channel/supervisor/warning.d.ts.map +1 -0
  146. package/dist/commands/channel/supervisor/warning.js +77 -0
  147. package/dist/commands/channel/supervisor/warning.js.map +1 -0
  148. package/dist/commands/channel/supervisor.d.ts +91 -0
  149. package/dist/commands/channel/supervisor.d.ts.map +1 -0
  150. package/dist/commands/channel/supervisor.js +463 -0
  151. package/dist/commands/channel/supervisor.js.map +1 -0
  152. package/dist/commands/channel/text-body.d.ts +13 -0
  153. package/dist/commands/channel/text-body.d.ts.map +1 -0
  154. package/dist/commands/channel/text-body.js +47 -0
  155. package/dist/commands/channel/text-body.js.map +1 -0
  156. package/dist/commands/channel/threads.d.ts +39 -0
  157. package/dist/commands/channel/threads.d.ts.map +1 -0
  158. package/dist/commands/channel/threads.js +107 -0
  159. package/dist/commands/channel/threads.js.map +1 -0
  160. package/dist/commands/channel/title.d.ts +12 -0
  161. package/dist/commands/channel/title.d.ts.map +1 -0
  162. package/dist/commands/channel/title.js +24 -0
  163. package/dist/commands/channel/title.js.map +1 -0
  164. package/dist/commands/channel/wait.d.ts +17 -0
  165. package/dist/commands/channel/wait.d.ts.map +1 -0
  166. package/dist/commands/channel/wait.js +75 -0
  167. package/dist/commands/channel/wait.js.map +1 -0
  168. package/dist/commands/init.d.ts +71 -0
  169. package/dist/commands/init.d.ts.map +1 -0
  170. package/dist/commands/init.js +1631 -0
  171. package/dist/commands/init.js.map +1 -0
  172. package/dist/commands/integration.d.ts +23 -0
  173. package/dist/commands/integration.d.ts.map +1 -0
  174. package/dist/commands/integration.js +373 -0
  175. package/dist/commands/integration.js.map +1 -0
  176. package/dist/commands/mem.d.ts +30 -0
  177. package/dist/commands/mem.d.ts.map +1 -0
  178. package/dist/commands/mem.js +424 -0
  179. package/dist/commands/mem.js.map +1 -0
  180. package/dist/commands/uninstall.d.ts +36 -0
  181. package/dist/commands/uninstall.d.ts.map +1 -0
  182. package/dist/commands/uninstall.js +205 -0
  183. package/dist/commands/uninstall.js.map +1 -0
  184. package/dist/commands/update.d.ts +104 -0
  185. package/dist/commands/update.d.ts.map +1 -0
  186. package/dist/commands/update.js +2184 -0
  187. package/dist/commands/update.js.map +1 -0
  188. package/dist/commands/upgrade.d.ts +28 -0
  189. package/dist/commands/upgrade.d.ts.map +1 -0
  190. package/dist/commands/upgrade.js +86 -0
  191. package/dist/commands/upgrade.js.map +1 -0
  192. package/dist/commands/workflow.d.ts +35 -0
  193. package/dist/commands/workflow.d.ts.map +1 -0
  194. package/dist/commands/workflow.js +233 -0
  195. package/dist/commands/workflow.js.map +1 -0
  196. package/dist/configurators/antigravity.d.ts +7 -0
  197. package/dist/configurators/antigravity.d.ts.map +1 -0
  198. package/dist/configurators/antigravity.js +11 -0
  199. package/dist/configurators/antigravity.js.map +1 -0
  200. package/dist/configurators/claude.d.ts +23 -0
  201. package/dist/configurators/claude.d.ts.map +1 -0
  202. package/dist/configurators/claude.js +124 -0
  203. package/dist/configurators/claude.js.map +1 -0
  204. package/dist/configurators/codebuddy.d.ts +10 -0
  205. package/dist/configurators/codebuddy.d.ts.map +1 -0
  206. package/dist/configurators/codebuddy.js +24 -0
  207. package/dist/configurators/codebuddy.js.map +1 -0
  208. package/dist/configurators/codex.d.ts +57 -0
  209. package/dist/configurators/codex.d.ts.map +1 -0
  210. package/dist/configurators/codex.js +170 -0
  211. package/dist/configurators/codex.js.map +1 -0
  212. package/dist/configurators/copilot.d.ts +14 -0
  213. package/dist/configurators/copilot.d.ts.map +1 -0
  214. package/dist/configurators/copilot.js +46 -0
  215. package/dist/configurators/copilot.js.map +1 -0
  216. package/dist/configurators/cursor.d.ts +10 -0
  217. package/dist/configurators/cursor.d.ts.map +1 -0
  218. package/dist/configurators/cursor.js +23 -0
  219. package/dist/configurators/cursor.js.map +1 -0
  220. package/dist/configurators/devin.d.ts +8 -0
  221. package/dist/configurators/devin.d.ts.map +1 -0
  222. package/dist/configurators/devin.js +12 -0
  223. package/dist/configurators/devin.js.map +1 -0
  224. package/dist/configurators/droid.d.ts +10 -0
  225. package/dist/configurators/droid.d.ts.map +1 -0
  226. package/dist/configurators/droid.js +24 -0
  227. package/dist/configurators/droid.js.map +1 -0
  228. package/dist/configurators/dsh.d.ts +29 -0
  229. package/dist/configurators/dsh.d.ts.map +1 -0
  230. package/dist/configurators/dsh.js +64 -0
  231. package/dist/configurators/dsh.js.map +1 -0
  232. package/dist/configurators/gemini.d.ts +18 -0
  233. package/dist/configurators/gemini.d.ts.map +1 -0
  234. package/dist/configurators/gemini.js +39 -0
  235. package/dist/configurators/gemini.js.map +1 -0
  236. package/dist/configurators/grok.d.ts +17 -0
  237. package/dist/configurators/grok.d.ts.map +1 -0
  238. package/dist/configurators/grok.js +38 -0
  239. package/dist/configurators/grok.js.map +1 -0
  240. package/dist/configurators/index.d.ts +68 -0
  241. package/dist/configurators/index.d.ts.map +1 -0
  242. package/dist/configurators/index.js +191 -0
  243. package/dist/configurators/index.js.map +1 -0
  244. package/dist/configurators/kilo.d.ts +7 -0
  245. package/dist/configurators/kilo.d.ts.map +1 -0
  246. package/dist/configurators/kilo.js +11 -0
  247. package/dist/configurators/kilo.js.map +1 -0
  248. package/dist/configurators/kimi.d.ts +26 -0
  249. package/dist/configurators/kimi.d.ts.map +1 -0
  250. package/dist/configurators/kimi.js +74 -0
  251. package/dist/configurators/kimi.js.map +1 -0
  252. package/dist/configurators/kiro.d.ts +11 -0
  253. package/dist/configurators/kiro.d.ts.map +1 -0
  254. package/dist/configurators/kiro.js +30 -0
  255. package/dist/configurators/kiro.js.map +1 -0
  256. package/dist/configurators/omp.d.ts +6 -0
  257. package/dist/configurators/omp.d.ts.map +1 -0
  258. package/dist/configurators/omp.js +28 -0
  259. package/dist/configurators/omp.js.map +1 -0
  260. package/dist/configurators/opencode.d.ts +5 -0
  261. package/dist/configurators/opencode.d.ts.map +1 -0
  262. package/dist/configurators/opencode.js +81 -0
  263. package/dist/configurators/opencode.js.map +1 -0
  264. package/dist/configurators/pi.d.ts +5 -0
  265. package/dist/configurators/pi.d.ts.map +1 -0
  266. package/dist/configurators/pi.js +39 -0
  267. package/dist/configurators/pi.js.map +1 -0
  268. package/dist/configurators/qoder.d.ts +12 -0
  269. package/dist/configurators/qoder.d.ts.map +1 -0
  270. package/dist/configurators/qoder.js +30 -0
  271. package/dist/configurators/qoder.js.map +1 -0
  272. package/dist/configurators/reasonix.d.ts +17 -0
  273. package/dist/configurators/reasonix.d.ts.map +1 -0
  274. package/dist/configurators/reasonix.js +37 -0
  275. package/dist/configurators/reasonix.js.map +1 -0
  276. package/dist/configurators/shared.d.ts +187 -0
  277. package/dist/configurators/shared.d.ts.map +1 -0
  278. package/dist/configurators/shared.js +589 -0
  279. package/dist/configurators/shared.js.map +1 -0
  280. package/dist/configurators/snow.d.ts +25 -0
  281. package/dist/configurators/snow.d.ts.map +1 -0
  282. package/dist/configurators/snow.js +69 -0
  283. package/dist/configurators/snow.js.map +1 -0
  284. package/dist/configurators/trae.d.ts +16 -0
  285. package/dist/configurators/trae.d.ts.map +1 -0
  286. package/dist/configurators/trae.js +34 -0
  287. package/dist/configurators/trae.js.map +1 -0
  288. package/dist/configurators/workflow.d.ts +53 -0
  289. package/dist/configurators/workflow.d.ts.map +1 -0
  290. package/dist/configurators/workflow.js +212 -0
  291. package/dist/configurators/workflow.js.map +1 -0
  292. package/dist/configurators/zcode.d.ts +25 -0
  293. package/dist/configurators/zcode.d.ts.map +1 -0
  294. package/dist/configurators/zcode.js +67 -0
  295. package/dist/configurators/zcode.js.map +1 -0
  296. package/dist/constants/paths.d.ts +74 -0
  297. package/dist/constants/paths.d.ts.map +1 -0
  298. package/dist/constants/paths.js +83 -0
  299. package/dist/constants/paths.js.map +1 -0
  300. package/dist/constants/version.d.ts +12 -0
  301. package/dist/constants/version.d.ts.map +1 -0
  302. package/dist/constants/version.js +18 -0
  303. package/dist/constants/version.js.map +1 -0
  304. package/dist/index.d.ts +9 -0
  305. package/dist/index.d.ts.map +1 -0
  306. package/dist/index.js +9 -0
  307. package/dist/index.js.map +1 -0
  308. package/dist/migrations/index.d.ts +62 -0
  309. package/dist/migrations/index.d.ts.map +1 -0
  310. package/dist/migrations/index.js +190 -0
  311. package/dist/migrations/index.js.map +1 -0
  312. package/dist/migrations/manifests/0.1.9.json +30 -0
  313. package/dist/migrations/manifests/0.2.0.json +49 -0
  314. package/dist/migrations/manifests/0.2.12.json +9 -0
  315. package/dist/migrations/manifests/0.2.13.json +9 -0
  316. package/dist/migrations/manifests/0.2.14.json +175 -0
  317. package/dist/migrations/manifests/0.2.15.json +33 -0
  318. package/dist/migrations/manifests/0.3.0-beta.0.json +297 -0
  319. package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
  320. package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
  321. package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
  322. package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
  323. package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
  324. package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
  325. package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
  326. package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
  327. package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
  328. package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
  329. package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
  330. package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
  331. package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
  332. package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
  333. package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
  334. package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
  335. package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
  336. package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
  337. package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
  338. package/dist/migrations/manifests/0.3.0-rc.3.json +9 -0
  339. package/dist/migrations/manifests/0.3.0-rc.4.json +9 -0
  340. package/dist/migrations/manifests/0.3.0-rc.5.json +9 -0
  341. package/dist/migrations/manifests/0.3.0-rc.6.json +9 -0
  342. package/dist/migrations/manifests/0.3.0.json +11 -0
  343. package/dist/migrations/manifests/0.3.1.json +9 -0
  344. package/dist/migrations/manifests/0.3.10.json +9 -0
  345. package/dist/migrations/manifests/0.3.2.json +9 -0
  346. package/dist/migrations/manifests/0.3.3.json +9 -0
  347. package/dist/migrations/manifests/0.3.4.json +21 -0
  348. package/dist/migrations/manifests/0.3.5.json +9 -0
  349. package/dist/migrations/manifests/0.3.6.json +9 -0
  350. package/dist/migrations/manifests/0.3.7.json +9 -0
  351. package/dist/migrations/manifests/0.3.8.json +9 -0
  352. package/dist/migrations/manifests/0.3.9.json +9 -0
  353. package/dist/migrations/manifests/0.4.0-beta.1.json +228 -0
  354. package/dist/migrations/manifests/0.4.0-beta.10.json +9 -0
  355. package/dist/migrations/manifests/0.4.0-beta.2.json +9 -0
  356. package/dist/migrations/manifests/0.4.0-beta.3.json +9 -0
  357. package/dist/migrations/manifests/0.4.0-beta.4.json +9 -0
  358. package/dist/migrations/manifests/0.4.0-beta.5.json +9 -0
  359. package/dist/migrations/manifests/0.4.0-beta.6.json +9 -0
  360. package/dist/migrations/manifests/0.4.0-beta.7.json +9 -0
  361. package/dist/migrations/manifests/0.4.0-beta.8.json +34 -0
  362. package/dist/migrations/manifests/0.4.0-beta.9.json +9 -0
  363. package/dist/migrations/manifests/0.4.0-rc.0.json +9 -0
  364. package/dist/migrations/manifests/0.4.0-rc.1.json +9 -0
  365. package/dist/migrations/manifests/0.4.0.json +9 -0
  366. package/dist/migrations/manifests/0.5.0-beta.0.json +1646 -0
  367. package/dist/migrations/manifests/0.5.0-beta.1.json +9 -0
  368. package/dist/migrations/manifests/0.5.0-beta.10.json +9 -0
  369. package/dist/migrations/manifests/0.5.0-beta.11.json +9 -0
  370. package/dist/migrations/manifests/0.5.0-beta.12.json +9 -0
  371. package/dist/migrations/manifests/0.5.0-beta.13.json +9 -0
  372. package/dist/migrations/manifests/0.5.0-beta.14.json +9 -0
  373. package/dist/migrations/manifests/0.5.0-beta.15.json +116 -0
  374. package/dist/migrations/manifests/0.5.0-beta.16.json +9 -0
  375. package/dist/migrations/manifests/0.5.0-beta.17.json +9 -0
  376. package/dist/migrations/manifests/0.5.0-beta.18.json +9 -0
  377. package/dist/migrations/manifests/0.5.0-beta.19.json +9 -0
  378. package/dist/migrations/manifests/0.5.0-beta.2.json +9 -0
  379. package/dist/migrations/manifests/0.5.0-beta.3.json +9 -0
  380. package/dist/migrations/manifests/0.5.0-beta.4.json +9 -0
  381. package/dist/migrations/manifests/0.5.0-beta.5.json +222 -0
  382. package/dist/migrations/manifests/0.5.0-beta.6.json +9 -0
  383. package/dist/migrations/manifests/0.5.0-beta.7.json +9 -0
  384. package/dist/migrations/manifests/0.5.0-beta.8.json +9 -0
  385. package/dist/migrations/manifests/0.5.0-beta.9.json +48 -0
  386. package/dist/migrations/manifests/0.5.0-rc.0.json +9 -0
  387. package/dist/migrations/manifests/0.5.0-rc.1.json +9 -0
  388. package/dist/migrations/manifests/0.5.0-rc.2.json +9 -0
  389. package/dist/migrations/manifests/0.5.0-rc.3.json +9 -0
  390. package/dist/migrations/manifests/0.5.0-rc.4.json +9 -0
  391. package/dist/migrations/manifests/0.5.0-rc.5.json +9 -0
  392. package/dist/migrations/manifests/0.5.0-rc.6.json +9 -0
  393. package/dist/migrations/manifests/0.5.0-rc.7.json +9 -0
  394. package/dist/migrations/manifests/0.5.0.json +9 -0
  395. package/dist/migrations/manifests/0.5.1.json +9 -0
  396. package/dist/migrations/manifests/0.5.10.json +9 -0
  397. package/dist/migrations/manifests/0.5.11.json +16 -0
  398. package/dist/migrations/manifests/0.5.12.json +9 -0
  399. package/dist/migrations/manifests/0.5.13.json +9 -0
  400. package/dist/migrations/manifests/0.5.14.json +9 -0
  401. package/dist/migrations/manifests/0.5.15.json +9 -0
  402. package/dist/migrations/manifests/0.5.16.json +9 -0
  403. package/dist/migrations/manifests/0.5.17.json +9 -0
  404. package/dist/migrations/manifests/0.5.18.json +9 -0
  405. package/dist/migrations/manifests/0.5.19.json +9 -0
  406. package/dist/migrations/manifests/0.5.2.json +9 -0
  407. package/dist/migrations/manifests/0.5.3.json +9 -0
  408. package/dist/migrations/manifests/0.5.4.json +9 -0
  409. package/dist/migrations/manifests/0.5.5.json +9 -0
  410. package/dist/migrations/manifests/0.5.6.json +9 -0
  411. package/dist/migrations/manifests/0.5.7.json +16 -0
  412. package/dist/migrations/manifests/0.5.8.json +9 -0
  413. package/dist/migrations/manifests/0.5.9.json +9 -0
  414. package/dist/migrations/manifests/0.6.0-beta.0.json +16 -0
  415. package/dist/migrations/manifests/0.6.0-beta.1.json +9 -0
  416. package/dist/migrations/manifests/0.6.0-beta.10.json +9 -0
  417. package/dist/migrations/manifests/0.6.0-beta.11.json +9 -0
  418. package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
  419. package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
  420. package/dist/migrations/manifests/0.6.0-beta.14.json +9 -0
  421. package/dist/migrations/manifests/0.6.0-beta.15.json +9 -0
  422. package/dist/migrations/manifests/0.6.0-beta.16.json +9 -0
  423. package/dist/migrations/manifests/0.6.0-beta.17.json +9 -0
  424. package/dist/migrations/manifests/0.6.0-beta.18.json +16 -0
  425. package/dist/migrations/manifests/0.6.0-beta.19.json +9 -0
  426. package/dist/migrations/manifests/0.6.0-beta.2.json +9 -0
  427. package/dist/migrations/manifests/0.6.0-beta.20.json +9 -0
  428. package/dist/migrations/manifests/0.6.0-beta.21.json +9 -0
  429. package/dist/migrations/manifests/0.6.0-beta.22.json +9 -0
  430. package/dist/migrations/manifests/0.6.0-beta.23.json +88 -0
  431. package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
  432. package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
  433. package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
  434. package/dist/migrations/manifests/0.6.0-beta.6.json +16 -0
  435. package/dist/migrations/manifests/0.6.0-beta.7.json +9 -0
  436. package/dist/migrations/manifests/0.6.0-beta.8.json +9 -0
  437. package/dist/migrations/manifests/0.6.0-beta.9.json +9 -0
  438. package/dist/migrations/manifests/0.6.0-rc.0.json +9 -0
  439. package/dist/migrations/manifests/0.6.0.json +1 -0
  440. package/dist/migrations/manifests/0.6.1.json +9 -0
  441. package/dist/migrations/manifests/0.6.10.json +9 -0
  442. package/dist/migrations/manifests/0.6.11.json +9 -0
  443. package/dist/migrations/manifests/0.6.12.json +9 -0
  444. package/dist/migrations/manifests/0.6.13.json +9 -0
  445. package/dist/migrations/manifests/0.6.14.json +9 -0
  446. package/dist/migrations/manifests/0.6.15.json +9 -0
  447. package/dist/migrations/manifests/0.6.16.json +9 -0
  448. package/dist/migrations/manifests/0.6.2.json +9 -0
  449. package/dist/migrations/manifests/0.6.3.json +24 -0
  450. package/dist/migrations/manifests/0.6.4.json +9 -0
  451. package/dist/migrations/manifests/0.6.5.json +9 -0
  452. package/dist/migrations/manifests/0.6.6.json +17 -0
  453. package/dist/migrations/manifests/0.6.7.json +9 -0
  454. package/dist/migrations/manifests/0.6.8.json +17 -0
  455. package/dist/migrations/manifests/0.6.9.json +9 -0
  456. package/dist/migrations/manifests/0.7.0-beta.0.json +9 -0
  457. package/dist/migrations/manifests/0.7.0-beta.1.json +9 -0
  458. package/dist/migrations/manifests/0.7.0-beta.2.json +9 -0
  459. package/dist/migrations/manifests/0.7.0-beta.3.json +9 -0
  460. package/dist/templates/claude/agents/trellis-check.md +115 -0
  461. package/dist/templates/claude/agents/trellis-implement.md +110 -0
  462. package/dist/templates/claude/agents/trellis-research.md +137 -0
  463. package/dist/templates/claude/hooks/statusline.py +332 -0
  464. package/dist/templates/claude/index.d.ts +31 -0
  465. package/dist/templates/claude/index.d.ts.map +1 -0
  466. package/dist/templates/claude/index.js +58 -0
  467. package/dist/templates/claude/index.js.map +1 -0
  468. package/dist/templates/claude/settings.json +73 -0
  469. package/dist/templates/codebuddy/agents/trellis-check.md +115 -0
  470. package/dist/templates/codebuddy/agents/trellis-implement.md +110 -0
  471. package/dist/templates/codebuddy/agents/trellis-research.md +137 -0
  472. package/dist/templates/codebuddy/index.d.ts +15 -0
  473. package/dist/templates/codebuddy/index.d.ts.map +1 -0
  474. package/dist/templates/codebuddy/index.js +15 -0
  475. package/dist/templates/codebuddy/index.js.map +1 -0
  476. package/dist/templates/codebuddy/settings.json +69 -0
  477. package/dist/templates/codex/agents/trellis-check.toml +56 -0
  478. package/dist/templates/codex/agents/trellis-implement.toml +37 -0
  479. package/dist/templates/codex/agents/trellis-research.toml +78 -0
  480. package/dist/templates/codex/config.toml +39 -0
  481. package/dist/templates/codex/hooks/session-start.py +552 -0
  482. package/dist/templates/codex/hooks.json +27 -0
  483. package/dist/templates/codex/index.d.ts +35 -0
  484. package/dist/templates/codex/index.d.ts.map +1 -0
  485. package/dist/templates/codex/index.js +68 -0
  486. package/dist/templates/codex/index.js.map +1 -0
  487. package/dist/templates/command-renderer.d.ts +2 -0
  488. package/dist/templates/command-renderer.d.ts.map +1 -0
  489. package/dist/templates/command-renderer.js +13 -0
  490. package/dist/templates/command-renderer.js.map +1 -0
  491. package/dist/templates/common/bundled-skills/trellis-channel/SKILL.md +67 -0
  492. package/dist/templates/common/bundled-skills/trellis-channel/references/command-reference.md +480 -0
  493. package/dist/templates/common/bundled-skills/trellis-channel/references/forum.md +233 -0
  494. package/dist/templates/common/bundled-skills/trellis-channel/references/progress-debugging.md +226 -0
  495. package/dist/templates/common/bundled-skills/trellis-channel/references/workers.md +276 -0
  496. package/dist/templates/common/bundled-skills/trellis-channel/references/workflows.md +128 -0
  497. package/dist/templates/common/bundled-skills/trellis-meta/SKILL.md +85 -0
  498. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/add-project-local-conventions.md +83 -0
  499. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-agents.md +56 -0
  500. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +84 -0
  501. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-hooks.md +57 -0
  502. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-skills-or-commands.md +123 -0
  503. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +83 -0
  504. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-task-lifecycle.md +90 -0
  505. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +65 -0
  506. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/overview.md +55 -0
  507. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/bundled-skills.md +159 -0
  508. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +68 -0
  509. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/generated-files.md +80 -0
  510. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/multi-agent-channel.md +69 -0
  511. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/overview.md +51 -0
  512. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +102 -0
  513. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +130 -0
  514. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workflow.md +75 -0
  515. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workspace-memory.md +71 -0
  516. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +83 -0
  517. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/hooks-and-settings.md +72 -0
  518. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/overview.md +59 -0
  519. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/platform-map.md +112 -0
  520. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/skills-and-commands.md +86 -0
  521. package/dist/templates/common/bundled-skills/trellis-session-insight/SKILL.md +81 -0
  522. package/dist/templates/common/bundled-skills/trellis-session-insight/references/cli-quick-reference.md +65 -0
  523. package/dist/templates/common/bundled-skills/trellis-session-insight/references/triggering-patterns.md +93 -0
  524. package/dist/templates/common/bundled-skills/trellis-spec-bootstrap/SKILL.md +41 -0
  525. package/dist/templates/common/bundled-skills/trellis-spec-bootstrap/references/mcp-setup.md +90 -0
  526. package/dist/templates/common/bundled-skills/trellis-spec-bootstrap/references/repository-analysis.md +59 -0
  527. package/dist/templates/common/bundled-skills/trellis-spec-bootstrap/references/spec-task-planning.md +61 -0
  528. package/dist/templates/common/bundled-skills/trellis-spec-bootstrap/references/spec-writing.md +70 -0
  529. package/dist/templates/common/commands/continue.md +56 -0
  530. package/dist/templates/common/commands/finish-work.md +66 -0
  531. package/dist/templates/common/commands/start.md +59 -0
  532. package/dist/templates/common/index.d.ts +48 -0
  533. package/dist/templates/common/index.d.ts.map +1 -0
  534. package/dist/templates/common/index.js +105 -0
  535. package/dist/templates/common/index.js.map +1 -0
  536. package/dist/templates/common/skills/before-dev.md +46 -0
  537. package/dist/templates/common/skills/brainstorm.md +195 -0
  538. package/dist/templates/common/skills/break-loop.md +184 -0
  539. package/dist/templates/common/skills/check.md +106 -0
  540. package/dist/templates/common/skills/update-spec.md +351 -0
  541. package/dist/templates/copilot/copilot-instructions.md +11 -0
  542. package/dist/templates/copilot/hooks/session-start.py +548 -0
  543. package/dist/templates/copilot/hooks.json +19 -0
  544. package/dist/templates/copilot/index.d.ts +28 -0
  545. package/dist/templates/copilot/index.d.ts.map +1 -0
  546. package/dist/templates/copilot/index.js +62 -0
  547. package/dist/templates/copilot/index.js.map +1 -0
  548. package/dist/templates/copilot/prompts/before-dev.prompt.md +39 -0
  549. package/dist/templates/copilot/prompts/brainstorm.prompt.md +156 -0
  550. package/dist/templates/copilot/prompts/break-loop.prompt.md +129 -0
  551. package/dist/templates/copilot/prompts/check-cross-layer.prompt.md +170 -0
  552. package/dist/templates/copilot/prompts/check.prompt.md +110 -0
  553. package/dist/templates/copilot/prompts/create-command.prompt.md +116 -0
  554. package/dist/templates/copilot/prompts/finish-work.prompt.md +99 -0
  555. package/dist/templates/copilot/prompts/integrate-skill.prompt.md +223 -0
  556. package/dist/templates/copilot/prompts/onboard.prompt.md +362 -0
  557. package/dist/templates/copilot/prompts/parallel.prompt.md +204 -0
  558. package/dist/templates/copilot/prompts/record-session.prompt.md +66 -0
  559. package/dist/templates/copilot/prompts/start.prompt.md +63 -0
  560. package/dist/templates/copilot/prompts/update-spec.prompt.md +358 -0
  561. package/dist/templates/cursor/agents/trellis-check.md +114 -0
  562. package/dist/templates/cursor/agents/trellis-implement.md +109 -0
  563. package/dist/templates/cursor/agents/trellis-research.md +136 -0
  564. package/dist/templates/cursor/hooks.json +24 -0
  565. package/dist/templates/cursor/index.d.ts +13 -0
  566. package/dist/templates/cursor/index.d.ts.map +1 -0
  567. package/dist/templates/cursor/index.js +13 -0
  568. package/dist/templates/cursor/index.js.map +1 -0
  569. package/dist/templates/droid/droids/trellis-check.md +107 -0
  570. package/dist/templates/droid/droids/trellis-implement.md +102 -0
  571. package/dist/templates/droid/droids/trellis-research.md +137 -0
  572. package/dist/templates/droid/index.d.ts +15 -0
  573. package/dist/templates/droid/index.d.ts.map +1 -0
  574. package/dist/templates/droid/index.js +15 -0
  575. package/dist/templates/droid/index.js.map +1 -0
  576. package/dist/templates/droid/settings.json +69 -0
  577. package/dist/templates/dsh/DSH.md +56 -0
  578. package/dist/templates/dsh/index.d.ts +21 -0
  579. package/dist/templates/dsh/index.d.ts.map +1 -0
  580. package/dist/templates/dsh/index.js +25 -0
  581. package/dist/templates/dsh/index.js.map +1 -0
  582. package/dist/templates/extract.d.ts +40 -0
  583. package/dist/templates/extract.d.ts.map +1 -0
  584. package/dist/templates/extract.js +113 -0
  585. package/dist/templates/extract.js.map +1 -0
  586. package/dist/templates/gemini/agents/trellis-check.md +107 -0
  587. package/dist/templates/gemini/agents/trellis-implement.md +102 -0
  588. package/dist/templates/gemini/agents/trellis-research.md +136 -0
  589. package/dist/templates/gemini/index.d.ts +13 -0
  590. package/dist/templates/gemini/index.d.ts.map +1 -0
  591. package/dist/templates/gemini/index.js +13 -0
  592. package/dist/templates/gemini/index.js.map +1 -0
  593. package/dist/templates/gemini/settings.json +40 -0
  594. package/dist/templates/grok/agents/trellis-check.md +105 -0
  595. package/dist/templates/grok/agents/trellis-implement.md +116 -0
  596. package/dist/templates/grok/agents/trellis-research.md +146 -0
  597. package/dist/templates/grok/index.d.ts +16 -0
  598. package/dist/templates/grok/index.d.ts.map +1 -0
  599. package/dist/templates/grok/index.js +19 -0
  600. package/dist/templates/grok/index.js.map +1 -0
  601. package/dist/templates/kimi/agents/trellis-check.md +103 -0
  602. package/dist/templates/kimi/agents/trellis-implement.md +115 -0
  603. package/dist/templates/kimi/agents/trellis-research.md +144 -0
  604. package/dist/templates/kimi/index.d.ts +20 -0
  605. package/dist/templates/kimi/index.d.ts.map +1 -0
  606. package/dist/templates/kimi/index.js +23 -0
  607. package/dist/templates/kimi/index.js.map +1 -0
  608. package/dist/templates/kiro/agents/trellis-check.json +26 -0
  609. package/dist/templates/kiro/agents/trellis-implement.json +26 -0
  610. package/dist/templates/kiro/agents/trellis-research.json +30 -0
  611. package/dist/templates/kiro/agents/trellis.json +34 -0
  612. package/dist/templates/kiro/hooks/trellis-workflow-state.kiro.hook +14 -0
  613. package/dist/templates/kiro/index.d.ts +32 -0
  614. package/dist/templates/kiro/index.d.ts.map +1 -0
  615. package/dist/templates/kiro/index.js +28 -0
  616. package/dist/templates/kiro/index.js.map +1 -0
  617. package/dist/templates/markdown/agents.md +21 -0
  618. package/dist/templates/markdown/gitignore.txt +15 -0
  619. package/dist/templates/markdown/index.d.ts +27 -0
  620. package/dist/templates/markdown/index.d.ts.map +1 -0
  621. package/dist/templates/markdown/index.js +53 -0
  622. package/dist/templates/markdown/index.js.map +1 -0
  623. package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
  624. package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
  625. package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
  626. package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
  627. package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
  628. package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
  629. package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
  630. package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
  631. package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
  632. package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
  633. package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
  634. package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
  635. package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
  636. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +223 -0
  637. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +327 -0
  638. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +633 -0
  639. package/dist/templates/markdown/spec/guides/index.md.txt +97 -0
  640. package/dist/templates/markdown/workspace-index.md +125 -0
  641. package/dist/templates/markdown/worktree.yaml.txt +58 -0
  642. package/dist/templates/omp/agents/trellis-check.md +41 -0
  643. package/dist/templates/omp/agents/trellis-implement.md +45 -0
  644. package/dist/templates/omp/agents/trellis-research.md +30 -0
  645. package/dist/templates/omp/extensions/trellis/index.ts.txt +1783 -0
  646. package/dist/templates/omp/index.d.ts +4 -0
  647. package/dist/templates/omp/index.d.ts.map +1 -0
  648. package/dist/templates/omp/index.js +9 -0
  649. package/dist/templates/omp/index.js.map +1 -0
  650. package/dist/templates/opencode/agents/trellis-check.md +122 -0
  651. package/dist/templates/opencode/agents/trellis-implement.md +118 -0
  652. package/dist/templates/opencode/agents/trellis-research.md +145 -0
  653. package/dist/templates/opencode/lib/context-visibility.js +148 -0
  654. package/dist/templates/opencode/lib/session-utils.js +527 -0
  655. package/dist/templates/opencode/lib/trellis-context.js +627 -0
  656. package/dist/templates/opencode/package.json +5 -0
  657. package/dist/templates/opencode/plugins/inject-subagent-context.js +569 -0
  658. package/dist/templates/opencode/plugins/inject-workflow-state.js +240 -0
  659. package/dist/templates/opencode/plugins/session-start.js +65 -0
  660. package/dist/templates/pi/agents/trellis-check.md +37 -0
  661. package/dist/templates/pi/agents/trellis-implement.md +42 -0
  662. package/dist/templates/pi/agents/trellis-research.md +25 -0
  663. package/dist/templates/pi/extensions/trellis/index.ts.txt +2149 -0
  664. package/dist/templates/pi/index.d.ts +5 -0
  665. package/dist/templates/pi/index.d.ts.map +1 -0
  666. package/dist/templates/pi/index.js +12 -0
  667. package/dist/templates/pi/index.js.map +1 -0
  668. package/dist/templates/pi/settings.json +9 -0
  669. package/dist/templates/qoder/agents/trellis-check.md +108 -0
  670. package/dist/templates/qoder/agents/trellis-implement.md +103 -0
  671. package/dist/templates/qoder/agents/trellis-research.md +137 -0
  672. package/dist/templates/qoder/index.d.ts +15 -0
  673. package/dist/templates/qoder/index.d.ts.map +1 -0
  674. package/dist/templates/qoder/index.js +15 -0
  675. package/dist/templates/qoder/index.js.map +1 -0
  676. package/dist/templates/qoder/settings.json +59 -0
  677. package/dist/templates/reasonix/agents/trellis-check.md +36 -0
  678. package/dist/templates/reasonix/agents/trellis-implement.md +41 -0
  679. package/dist/templates/reasonix/index.d.ts +13 -0
  680. package/dist/templates/reasonix/index.d.ts.map +1 -0
  681. package/dist/templates/reasonix/index.js +16 -0
  682. package/dist/templates/reasonix/index.js.map +1 -0
  683. package/dist/templates/shared-hooks/index.d.ts +77 -0
  684. package/dist/templates/shared-hooks/index.d.ts.map +1 -0
  685. package/dist/templates/shared-hooks/index.js +141 -0
  686. package/dist/templates/shared-hooks/index.js.map +1 -0
  687. package/dist/templates/shared-hooks/inject-shell-session-context.py +292 -0
  688. package/dist/templates/shared-hooks/inject-subagent-context.py +1212 -0
  689. package/dist/templates/shared-hooks/inject-workflow-state.py +488 -0
  690. package/dist/templates/shared-hooks/session-start.py +949 -0
  691. package/dist/templates/snow/SNOW.md +86 -0
  692. package/dist/templates/snow/agents/trellis-check.md +135 -0
  693. package/dist/templates/snow/agents/trellis-implement.md +153 -0
  694. package/dist/templates/snow/agents/trellis-research.md +114 -0
  695. package/dist/templates/snow/hooks/beforeSubAgentStart.json +15 -0
  696. package/dist/templates/snow/hooks/onSessionStart.json +15 -0
  697. package/dist/templates/snow/hooks/onUserMessage.json +15 -0
  698. package/dist/templates/snow/hooks/write-trellis-context.py +644 -0
  699. package/dist/templates/snow/index.d.ts +26 -0
  700. package/dist/templates/snow/index.d.ts.map +1 -0
  701. package/dist/templates/snow/index.js +36 -0
  702. package/dist/templates/snow/index.js.map +1 -0
  703. package/dist/templates/template-utils.d.ts +26 -0
  704. package/dist/templates/template-utils.d.ts.map +1 -0
  705. package/dist/templates/template-utils.js +65 -0
  706. package/dist/templates/template-utils.js.map +1 -0
  707. package/dist/templates/trae/agents/trellis-check.md +108 -0
  708. package/dist/templates/trae/agents/trellis-implement.md +103 -0
  709. package/dist/templates/trae/agents/trellis-research.md +137 -0
  710. package/dist/templates/trae/hooks.json +39 -0
  711. package/dist/templates/trae/index.d.ts +15 -0
  712. package/dist/templates/trae/index.d.ts.map +1 -0
  713. package/dist/templates/trae/index.js +15 -0
  714. package/dist/templates/trae/index.js.map +1 -0
  715. package/dist/templates/trellis/agents/check.md +70 -0
  716. package/dist/templates/trellis/agents/implement.md +71 -0
  717. package/dist/templates/trellis/config.yaml +177 -0
  718. package/dist/templates/trellis/gitattributes.txt +9 -0
  719. package/dist/templates/trellis/gitignore.txt +32 -0
  720. package/dist/templates/trellis/index.d.ts +67 -0
  721. package/dist/templates/trellis/index.d.ts.map +1 -0
  722. package/dist/templates/trellis/index.js +134 -0
  723. package/dist/templates/trellis/index.js.map +1 -0
  724. package/dist/templates/trellis/scripts/__init__.py +5 -0
  725. package/dist/templates/trellis/scripts/add_session.py +1545 -0
  726. package/dist/templates/trellis/scripts/common/__init__.py +94 -0
  727. package/dist/templates/trellis/scripts/common/active_task.py +857 -0
  728. package/dist/templates/trellis/scripts/common/cli_adapter.py +950 -0
  729. package/dist/templates/trellis/scripts/common/config.py +482 -0
  730. package/dist/templates/trellis/scripts/common/developer.py +192 -0
  731. package/dist/templates/trellis/scripts/common/git.py +203 -0
  732. package/dist/templates/trellis/scripts/common/git_context.py +106 -0
  733. package/dist/templates/trellis/scripts/common/io.py +160 -0
  734. package/dist/templates/trellis/scripts/common/log.py +45 -0
  735. package/dist/templates/trellis/scripts/common/packages_context.py +238 -0
  736. package/dist/templates/trellis/scripts/common/paths.py +543 -0
  737. package/dist/templates/trellis/scripts/common/safe_commit.py +322 -0
  738. package/dist/templates/trellis/scripts/common/session_context.py +892 -0
  739. package/dist/templates/trellis/scripts/common/task_context.py +470 -0
  740. package/dist/templates/trellis/scripts/common/task_queue.py +188 -0
  741. package/dist/templates/trellis/scripts/common/task_store.py +1883 -0
  742. package/dist/templates/trellis/scripts/common/task_utils.py +498 -0
  743. package/dist/templates/trellis/scripts/common/tasks.py +122 -0
  744. package/dist/templates/trellis/scripts/common/trellis_config.py +257 -0
  745. package/dist/templates/trellis/scripts/common/types.py +110 -0
  746. package/dist/templates/trellis/scripts/common/workflow_phase.py +242 -0
  747. package/dist/templates/trellis/scripts/get_context.py +16 -0
  748. package/dist/templates/trellis/scripts/get_developer.py +26 -0
  749. package/dist/templates/trellis/scripts/hooks/linear_sync.py +243 -0
  750. package/dist/templates/trellis/scripts/init_developer.py +51 -0
  751. package/dist/templates/trellis/scripts/task.py +811 -0
  752. package/dist/templates/trellis/tasks/.gitkeep +0 -0
  753. package/dist/templates/trellis/workflow.md +721 -0
  754. package/dist/templates/zcode/agents/trellis-check.md +109 -0
  755. package/dist/templates/zcode/agents/trellis-implement.md +111 -0
  756. package/dist/templates/zcode/agents/trellis-research.md +133 -0
  757. package/dist/templates/zcode/config.json +52 -0
  758. package/dist/templates/zcode/index.d.ts +25 -0
  759. package/dist/templates/zcode/index.d.ts.map +1 -0
  760. package/dist/templates/zcode/index.js +29 -0
  761. package/dist/templates/zcode/index.js.map +1 -0
  762. package/dist/types/ai-tools.d.ts +105 -0
  763. package/dist/types/ai-tools.d.ts.map +1 -0
  764. package/dist/types/ai-tools.js +502 -0
  765. package/dist/types/ai-tools.js.map +1 -0
  766. package/dist/types/migration.d.ts +125 -0
  767. package/dist/types/migration.d.ts.map +1 -0
  768. package/dist/types/migration.js +8 -0
  769. package/dist/types/migration.js.map +1 -0
  770. package/dist/utils/ablation-store.d.ts +123 -0
  771. package/dist/utils/ablation-store.d.ts.map +1 -0
  772. package/dist/utils/ablation-store.js +749 -0
  773. package/dist/utils/ablation-store.js.map +1 -0
  774. package/dist/utils/agent-refs.d.ts +31 -0
  775. package/dist/utils/agent-refs.d.ts.map +1 -0
  776. package/dist/utils/agent-refs.js +63 -0
  777. package/dist/utils/agent-refs.js.map +1 -0
  778. package/dist/utils/atomic-write.d.ts +12 -0
  779. package/dist/utils/atomic-write.d.ts.map +1 -0
  780. package/dist/utils/atomic-write.js +30 -0
  781. package/dist/utils/atomic-write.js.map +1 -0
  782. package/dist/utils/compare-versions.d.ts +12 -0
  783. package/dist/utils/compare-versions.d.ts.map +1 -0
  784. package/dist/utils/compare-versions.js +86 -0
  785. package/dist/utils/compare-versions.js.map +1 -0
  786. package/dist/utils/cwd-guard.d.ts +38 -0
  787. package/dist/utils/cwd-guard.d.ts.map +1 -0
  788. package/dist/utils/cwd-guard.js +63 -0
  789. package/dist/utils/cwd-guard.js.map +1 -0
  790. package/dist/utils/file-writer.d.ts +36 -0
  791. package/dist/utils/file-writer.d.ts.map +1 -0
  792. package/dist/utils/file-writer.js +204 -0
  793. package/dist/utils/file-writer.js.map +1 -0
  794. package/dist/utils/integration.d.ts +96 -0
  795. package/dist/utils/integration.d.ts.map +1 -0
  796. package/dist/utils/integration.js +1549 -0
  797. package/dist/utils/integration.js.map +1 -0
  798. package/dist/utils/managed-paths.d.ts +5 -0
  799. package/dist/utils/managed-paths.d.ts.map +1 -0
  800. package/dist/utils/managed-paths.js +51 -0
  801. package/dist/utils/managed-paths.js.map +1 -0
  802. package/dist/utils/managed-removal.d.ts +74 -0
  803. package/dist/utils/managed-removal.d.ts.map +1 -0
  804. package/dist/utils/managed-removal.js +270 -0
  805. package/dist/utils/managed-removal.js.map +1 -0
  806. package/dist/utils/manifest-prune.d.ts +61 -0
  807. package/dist/utils/manifest-prune.d.ts.map +1 -0
  808. package/dist/utils/manifest-prune.js +135 -0
  809. package/dist/utils/manifest-prune.js.map +1 -0
  810. package/dist/utils/posix.d.ts +13 -0
  811. package/dist/utils/posix.d.ts.map +1 -0
  812. package/dist/utils/posix.js +15 -0
  813. package/dist/utils/posix.js.map +1 -0
  814. package/dist/utils/project-detector.d.ts +46 -0
  815. package/dist/utils/project-detector.d.ts.map +1 -0
  816. package/dist/utils/project-detector.js +666 -0
  817. package/dist/utils/project-detector.js.map +1 -0
  818. package/dist/utils/proxy.d.ts +25 -0
  819. package/dist/utils/proxy.d.ts.map +1 -0
  820. package/dist/utils/proxy.js +60 -0
  821. package/dist/utils/proxy.js.map +1 -0
  822. package/dist/utils/registry-config.d.ts +7 -0
  823. package/dist/utils/registry-config.d.ts.map +1 -0
  824. package/dist/utils/registry-config.js +173 -0
  825. package/dist/utils/registry-config.js.map +1 -0
  826. package/dist/utils/task-json.d.ts +13 -0
  827. package/dist/utils/task-json.d.ts.map +1 -0
  828. package/dist/utils/task-json.js +12 -0
  829. package/dist/utils/task-json.js.map +1 -0
  830. package/dist/utils/template-fetcher.d.ts +161 -0
  831. package/dist/utils/template-fetcher.d.ts.map +1 -0
  832. package/dist/utils/template-fetcher.js +1020 -0
  833. package/dist/utils/template-fetcher.js.map +1 -0
  834. package/dist/utils/template-hash.d.ts +127 -0
  835. package/dist/utils/template-hash.d.ts.map +1 -0
  836. package/dist/utils/template-hash.js +335 -0
  837. package/dist/utils/template-hash.js.map +1 -0
  838. package/dist/utils/uninstall-scrubbers.d.ts +66 -0
  839. package/dist/utils/uninstall-scrubbers.d.ts.map +1 -0
  840. package/dist/utils/uninstall-scrubbers.js +417 -0
  841. package/dist/utils/uninstall-scrubbers.js.map +1 -0
  842. package/dist/utils/workflow-resolver.d.ts +86 -0
  843. package/dist/utils/workflow-resolver.d.ts.map +1 -0
  844. package/dist/utils/workflow-resolver.js +266 -0
  845. package/dist/utils/workflow-resolver.js.map +1 -0
  846. package/package.json +58 -0
@@ -0,0 +1,1020 @@
1
+ /**
2
+ * Remote template fetcher for Trellis CLI
3
+ *
4
+ * Fetches spec templates from the official marketplace:
5
+ * https://github.com/mindfold-ai/marketplace
6
+ */
7
+ import { randomUUID } from "node:crypto";
8
+ import fs from "node:fs";
9
+ import os from "node:os";
10
+ import path from "node:path";
11
+ import { downloadTemplate } from "giget";
12
+ import { toPosix } from "./posix.js";
13
+ import { COMMAND_NAME } from "../constants/version.js";
14
+ import { renderCommandInstructions } from "../templates/command-renderer.js";
15
+ // =============================================================================
16
+ // Constants
17
+ // =============================================================================
18
+ export const TEMPLATE_INDEX_URL = "https://raw.githubusercontent.com/mindfold-ai/marketplace/main/index.json";
19
+ const TEMPLATE_REPO = "gh:mindfold-ai/marketplace";
20
+ /** Map template type to installation path */
21
+ const INSTALL_PATHS = {
22
+ spec: ".trellis/spec",
23
+ skill: ".agents/skills",
24
+ command: ".claude/commands",
25
+ full: ".", // Entire project root
26
+ };
27
+ /** Timeout constants for network operations */
28
+ export const TIMEOUTS = {
29
+ /** Timeout for fetching the template index (ms) */
30
+ INDEX_FETCH_MS: 5_000,
31
+ /** Timeout for downloading a template via giget (ms) */
32
+ DOWNLOAD_MS: 30_000,
33
+ };
34
+ export class RegistryBackendError extends Error {
35
+ kind;
36
+ constructor(kind, message) {
37
+ super(message);
38
+ this.name = "RegistryBackendError";
39
+ this.kind = kind;
40
+ }
41
+ }
42
+ // =============================================================================
43
+ // Registry Source Parsing
44
+ // =============================================================================
45
+ /** Maps provider prefixes to raw file URL patterns */
46
+ const RAW_URL_PATTERNS = {
47
+ gh: "https://raw.githubusercontent.com/{repo}/{ref}/{subdir}",
48
+ github: "https://raw.githubusercontent.com/{repo}/{ref}/{subdir}",
49
+ gitlab: "https://gitlab.com/{repo}/-/raw/{ref}/{subdir}",
50
+ bitbucket: "https://bitbucket.org/{repo}/raw/{ref}/{subdir}",
51
+ };
52
+ export const SUPPORTED_PROVIDERS = Object.keys(RAW_URL_PATTERNS);
53
+ /**
54
+ * Convert an HTTPS URL to giget-style source format.
55
+ * e.g. "https://github.com/user/repo" → "gh:user/repo"
56
+ * "https://github.com/user/repo/tree/branch/path" → "gh:user/repo/path#branch"
57
+ * Returns the original string if it's not a recognized HTTPS URL.
58
+ */
59
+ export function normalizeRegistrySource(source) {
60
+ const patterns = [
61
+ { re: /^https?:\/\/github\.com\//, prefix: "gh:" },
62
+ { re: /^https?:\/\/gitlab\.com\//, prefix: "gitlab:" },
63
+ { re: /^https?:\/\/bitbucket\.org\//, prefix: "bitbucket:" },
64
+ ];
65
+ for (const { re, prefix } of patterns) {
66
+ if (!re.test(source))
67
+ continue;
68
+ const path = source.replace(re, "");
69
+ // Handle /tree/<branch>/<subdir> format (GitHub browse URLs)
70
+ const treeMatch = path.match(/^([^/]+\/[^/]+)\/tree\/([^/]+)(?:\/(.+?))?(?:\.git)?\/?$/);
71
+ if (treeMatch) {
72
+ const [, repo, ref, subdir] = treeMatch;
73
+ return `${prefix}${repo}${subdir ? `/${subdir}` : ""}#${ref}`;
74
+ }
75
+ // Plain URL: strip trailing .git and /
76
+ const cleaned = path.replace(/\.git\/?$/, "").replace(/\/$/, "");
77
+ return `${prefix}${cleaned}`;
78
+ }
79
+ return source;
80
+ }
81
+ /** Known public domains that have dedicated giget provider prefixes */
82
+ const KNOWN_PUBLIC_DOMAINS = ["github.com", "gitlab.com", "bitbucket.org"];
83
+ /** Maps SSH/HTTPS domains of public providers to their giget prefix */
84
+ const PUBLIC_DOMAIN_TO_PREFIX = {
85
+ "github.com": "gh",
86
+ "gitlab.com": "gitlab",
87
+ "bitbucket.org": "bitbucket",
88
+ };
89
+ function buildRegistryGitUrl(input) {
90
+ if (input.sourceKind === "ssh" && input.sshHost) {
91
+ if (input.sshStyle === "ssh-url") {
92
+ const port = input.sshPort ? `:${input.sshPort}` : "";
93
+ return `ssh://git@${input.sshHost}${port}/${input.repo}.git`;
94
+ }
95
+ return `git@${input.sshHost}:${input.repo}.git`;
96
+ }
97
+ if (input.host) {
98
+ return `https://${input.host}/${input.repo}.git`;
99
+ }
100
+ switch (input.provider) {
101
+ case "gh":
102
+ case "github":
103
+ return `https://github.com/${input.repo}.git`;
104
+ case "gitlab":
105
+ return `https://gitlab.com/${input.repo}.git`;
106
+ case "bitbucket":
107
+ return `https://bitbucket.org/${input.repo}.git`;
108
+ default:
109
+ return input.repo;
110
+ }
111
+ }
112
+ /**
113
+ * Parse a giget-style registry source into its components.
114
+ *
115
+ * Supported input formats:
116
+ * | Format | Example | Provider | Host? |
117
+ * |-------------------------------------|----------------------------------------------|-----------|-----------|
118
+ * | giget prefix | gh:org/repo, gitlab:org/repo#ref | native | no |
119
+ * | Public HTTPS | https://github.com/org/repo | native | no |
120
+ * | Public SSH | git@github.com:org/repo | native | no |
121
+ * | Self-hosted HTTPS | https://git.corp.com/org/repo | gitlab | yes |
122
+ * | Self-hosted SSH | git@git.corp.com:org/repo | gitlab | yes |
123
+ * | ssh:// protocol (with/without port) | ssh://git@host:2222/org/repo | gitlab | yes |
124
+ * | HTTPS with port | https://host:8443/org/repo | gitlab | yes |
125
+ * | GitLab browse URL | https://host/org/repo/-/tree/branch/path | gitlab | yes |
126
+ *
127
+ * Ref defaults to "main" if not specified.
128
+ * Unknown domains default to GitLab URL patterns (covers self-hosted GitLab CE/EE).
129
+ *
130
+ * @throws Error if provider is unsupported
131
+ */
132
+ export function parseRegistrySource(source) {
133
+ // --- Self-hosted URL detection (SSH + unknown HTTPS) ---
134
+ let host;
135
+ let normalizedInput;
136
+ let sourceKind = "prefixed";
137
+ let sshHost;
138
+ let sshPort;
139
+ let sshStyle;
140
+ // SSH URL: git@host:org/repo[.git] or ssh://git@host[:port]/org/repo[.git]
141
+ const scpSshMatch = source.match(/^git@([^:]+):(.+?)(?:\.git)?\/?$/);
142
+ const protocolSshMatch = source.match(/^ssh:\/\/git@([^/:]+)(?::(\d+))?\/(.+?)(?:\.git)?\/?$/);
143
+ if (scpSshMatch || protocolSshMatch) {
144
+ sourceKind = "ssh";
145
+ sshStyle = scpSshMatch ? "scp" : "ssh-url";
146
+ const sshDomain = scpSshMatch?.[1] ?? protocolSshMatch?.[1] ?? "";
147
+ const sshPath = scpSshMatch?.[2] ?? protocolSshMatch?.[3] ?? "";
148
+ sshPort = protocolSshMatch?.[2];
149
+ sshHost = sshDomain;
150
+ const publicPrefix = PUBLIC_DOMAIN_TO_PREFIX[sshDomain];
151
+ if (publicPrefix) {
152
+ // Public provider SSH (e.g., git@github.com:org/repo) — use native prefix, no host
153
+ normalizedInput = `${publicPrefix}:${sshPath}`;
154
+ }
155
+ else {
156
+ // Self-hosted SSH — default to gitlab provider with host
157
+ host = sshDomain;
158
+ normalizedInput = `gitlab:${sshPath}`;
159
+ }
160
+ }
161
+ // HTTPS URL to unknown domain (not github.com/gitlab.com/bitbucket.org)
162
+ if (!normalizedInput) {
163
+ const httpsMatch = source.match(/^https?:\/\/([^/]+)\/(.+?)(?:\.git)?\/?$/);
164
+ if (httpsMatch) {
165
+ sourceKind = "https";
166
+ const domain = httpsMatch[1];
167
+ if (!KNOWN_PUBLIC_DOMAINS.includes(domain)) {
168
+ host = domain;
169
+ const pathPart = httpsMatch[2];
170
+ // Handle GitLab browse URLs: /org/repo/-/tree/branch/path
171
+ const treeMatch = pathPart.match(/^([^/]+\/[^/]+)(?:\/-)?\/tree\/([^/]+)(?:\/(.+?))?$/);
172
+ if (treeMatch) {
173
+ const [, repoPath, ref, subdir] = treeMatch;
174
+ normalizedInput = `gitlab:${repoPath}${subdir ? `/${subdir}` : ""}#${ref}`;
175
+ }
176
+ else {
177
+ normalizedInput = `gitlab:${pathPart}`;
178
+ }
179
+ }
180
+ }
181
+ }
182
+ // Auto-convert known HTTPS URLs to giget format (existing logic)
183
+ const normalized = normalizedInput ?? normalizeRegistrySource(source);
184
+ // Extract provider prefix
185
+ const colonIndex = normalized.indexOf(":");
186
+ if (colonIndex === -1) {
187
+ throw new Error(`Invalid registry source "${source}". Expected format: gh:user/repo/path`);
188
+ }
189
+ const provider = normalized.slice(0, colonIndex);
190
+ const rest = normalized.slice(colonIndex + 1);
191
+ // Check supported provider
192
+ const pattern = RAW_URL_PATTERNS[provider];
193
+ if (!pattern) {
194
+ const supported = [...new Set(Object.keys(RAW_URL_PATTERNS))].join(", ");
195
+ throw new Error(`Unsupported provider "${provider}". Supported: ${supported}`);
196
+ }
197
+ // Parse rest: user/repo/subdir#ref
198
+ // Match: user/repo (required), /subdir (optional), #ref (optional)
199
+ const refMatch = rest.match(/^([^#]+?)(?:#(.+))?$/);
200
+ if (!refMatch) {
201
+ throw new Error(`Invalid registry source "${normalized}". Expected format: ${provider}:user/repo/path`);
202
+ }
203
+ const pathPart = refMatch[1];
204
+ const ref = refMatch[2] ?? "main";
205
+ // Split into repo (first two segments) and subdir (rest)
206
+ const segments = pathPart.split("/").filter(Boolean);
207
+ if (segments.length < 2) {
208
+ throw new Error(`Invalid registry source "${normalized}". Must include user/repo at minimum.`);
209
+ }
210
+ const repo = `${segments[0]}/${segments[1]}`;
211
+ const subdir = segments.slice(2).join("/");
212
+ // Build raw base URL
213
+ let rawBaseUrl = pattern
214
+ .replace("{repo}", repo)
215
+ .replace("{ref}", ref)
216
+ .replace("{subdir}", subdir);
217
+ // Replace public domain with self-hosted host in rawBaseUrl
218
+ if (host && provider === "gitlab") {
219
+ rawBaseUrl = rawBaseUrl.replace("https://gitlab.com", `https://${host}`);
220
+ }
221
+ // Build giget source (use normalized format)
222
+ const gigetSource = normalized;
223
+ const gitUrl = buildRegistryGitUrl({
224
+ provider,
225
+ host,
226
+ repo,
227
+ sourceKind,
228
+ sshHost,
229
+ sshPort,
230
+ sshStyle,
231
+ });
232
+ const preferGit = sourceKind === "ssh" || host !== undefined;
233
+ return {
234
+ provider,
235
+ repo,
236
+ subdir,
237
+ ref,
238
+ rawBaseUrl,
239
+ gigetSource,
240
+ host,
241
+ gitUrl,
242
+ preferGit,
243
+ sourceKind,
244
+ };
245
+ }
246
+ // =============================================================================
247
+ // Helpers
248
+ // =============================================================================
249
+ /**
250
+ * Temporarily set `GIGET_GITLAB_URL` env var for self-hosted GitLab downloads.
251
+ * Restores the previous value (or deletes it) after the callback completes.
252
+ */
253
+ async function withGigetHost(host, fn) {
254
+ if (!host)
255
+ return fn();
256
+ const prev = process.env.GIGET_GITLAB_URL;
257
+ process.env.GIGET_GITLAB_URL = `https://${host}`;
258
+ try {
259
+ return await fn();
260
+ }
261
+ finally {
262
+ if (prev === undefined)
263
+ delete process.env.GIGET_GITLAB_URL;
264
+ else
265
+ process.env.GIGET_GITLAB_URL = prev;
266
+ }
267
+ }
268
+ /**
269
+ * Race a promise against a timeout.
270
+ * giget does not support AbortSignal, so we use Promise.race instead.
271
+ * The timer is cleaned up on success to avoid keeping the process alive.
272
+ */
273
+ function withTimeout(promise, ms, label) {
274
+ let timer;
275
+ const timeoutPromise = new Promise((_, reject) => {
276
+ timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms / 1000}s`)), ms);
277
+ });
278
+ return Promise.race([promise, timeoutPromise]).finally(() => {
279
+ clearTimeout(timer);
280
+ });
281
+ }
282
+ // =============================================================================
283
+ // Fetch Template Index
284
+ // =============================================================================
285
+ /**
286
+ * Fetch available templates from the remote index
287
+ * Returns empty array on network error or timeout (allows fallback to blank)
288
+ *
289
+ * @param indexUrl - URL to fetch index.json from (defaults to official marketplace)
290
+ */
291
+ export async function fetchTemplateIndex(indexUrl) {
292
+ try {
293
+ const url = indexUrl ?? TEMPLATE_INDEX_URL;
294
+ const res = await fetch(url, {
295
+ signal: AbortSignal.timeout(TIMEOUTS.INDEX_FETCH_MS),
296
+ });
297
+ if (!res.ok) {
298
+ throw new Error(`HTTP ${res.status}`);
299
+ }
300
+ const index = (await res.json());
301
+ return index.templates;
302
+ }
303
+ catch {
304
+ // Network error or timeout - return empty array, caller will fallback to blank
305
+ return [];
306
+ }
307
+ }
308
+ function isRecord(value) {
309
+ return typeof value === "object" && value !== null;
310
+ }
311
+ function parseTemplateIndex(raw, sourceLabel) {
312
+ let parsed;
313
+ try {
314
+ parsed = JSON.parse(raw);
315
+ }
316
+ catch (error) {
317
+ const detail = error instanceof Error ? error.message : String(error);
318
+ throw new RegistryBackendError("invalid-json", `${sourceLabel} is not valid JSON: ${detail}`);
319
+ }
320
+ if (!isRecord(parsed) || !Array.isArray(parsed.templates)) {
321
+ throw new RegistryBackendError("invalid-json", `${sourceLabel} must contain a templates array.`);
322
+ }
323
+ const templates = [];
324
+ for (const item of parsed.templates) {
325
+ if (!isRecord(item)) {
326
+ throw new RegistryBackendError("invalid-json", `${sourceLabel} contains an invalid template entry.`);
327
+ }
328
+ const { id, type, name, description, path: templatePath, tags } = item;
329
+ if (typeof id !== "string" ||
330
+ typeof type !== "string" ||
331
+ typeof name !== "string" ||
332
+ typeof templatePath !== "string") {
333
+ throw new RegistryBackendError("invalid-json", `${sourceLabel} template entries must include string id, type, name, and path fields.`);
334
+ }
335
+ templates.push({
336
+ id,
337
+ type,
338
+ name,
339
+ path: templatePath,
340
+ ...(typeof description === "string" ? { description } : {}),
341
+ ...(Array.isArray(tags) && tags.every((tag) => typeof tag === "string")
342
+ ? { tags }
343
+ : {}),
344
+ });
345
+ }
346
+ const version = typeof parsed.version === "number" ? parsed.version : 1;
347
+ return { version, templates };
348
+ }
349
+ function emptyProbeResult(backend, isNotFound, error) {
350
+ return { templates: [], isNotFound, backend, ...(error ? { error } : {}) };
351
+ }
352
+ function shouldFallbackToGit(registry, result) {
353
+ if (registry?.provider !== "gitlab")
354
+ return false;
355
+ if (result.backend !== "http" || result.isNotFound)
356
+ return false;
357
+ return result.error?.kind === "auth" || result.error?.kind === "invalid-json";
358
+ }
359
+ async function probeRegistryIndexHttp(indexUrl) {
360
+ try {
361
+ const res = await fetch(indexUrl, {
362
+ signal: AbortSignal.timeout(TIMEOUTS.INDEX_FETCH_MS),
363
+ });
364
+ if (res.status === 404) {
365
+ return emptyProbeResult("http", true);
366
+ }
367
+ if (res.status === 401 || res.status === 403) {
368
+ return emptyProbeResult("http", false, new RegistryBackendError("auth", `Registry index requires authentication (HTTP ${res.status}). Use a registry source accessible by your local Git credentials.`));
369
+ }
370
+ if (!res.ok) {
371
+ return emptyProbeResult("http", false, new RegistryBackendError("network", `Could not reach registry index (HTTP ${res.status}). Check your network connection and try again.`));
372
+ }
373
+ const index = parseTemplateIndex(await res.text(), "Registry index.json");
374
+ return { templates: index.templates, isNotFound: false, backend: "http" };
375
+ }
376
+ catch (error) {
377
+ if (error instanceof RegistryBackendError) {
378
+ return emptyProbeResult("http", false, error);
379
+ }
380
+ return emptyProbeResult("http", false, new RegistryBackendError("network", `Could not reach registry index: ${error instanceof Error ? error.message : String(error)}`));
381
+ }
382
+ }
383
+ /**
384
+ * Probe a registry's index.json, distinguishing "not found" from transient errors.
385
+ * Used by the registry flow to decide marketplace vs direct-download mode.
386
+ *
387
+ * - 404 → { templates: [], isNotFound: true }
388
+ * - Other HTTP error / network timeout → { templates: [], isNotFound: false }
389
+ * - 200 + valid JSON → { templates: [...], isNotFound: false }
390
+ */
391
+ export async function probeRegistryIndex(indexUrl, registry) {
392
+ if (registry?.preferGit) {
393
+ return probeRegistryIndexGit(registry);
394
+ }
395
+ const httpResult = await probeRegistryIndexHttp(indexUrl);
396
+ if (registry && shouldFallbackToGit(registry, httpResult)) {
397
+ return probeRegistryIndexGit(registry);
398
+ }
399
+ return httpResult;
400
+ }
401
+ export async function removeDirectory(dir) {
402
+ await fs.promises.rm(dir, {
403
+ recursive: true,
404
+ force: true,
405
+ maxRetries: 5,
406
+ retryDelay: 100,
407
+ });
408
+ }
409
+ async function runGit(args) {
410
+ const { execFile } = await import("node:child_process");
411
+ return new Promise((resolve, reject) => {
412
+ execFile("git", args, {
413
+ encoding: "utf-8",
414
+ maxBuffer: 10 * 1024 * 1024,
415
+ timeout: TIMEOUTS.DOWNLOAD_MS,
416
+ }, (error, stdout, stderr) => {
417
+ if (error) {
418
+ const commandError = error;
419
+ commandError.stdout = stdout;
420
+ commandError.stderr = stderr;
421
+ reject(commandError);
422
+ return;
423
+ }
424
+ resolve({ stdout, stderr });
425
+ });
426
+ });
427
+ }
428
+ function getCommandErrorText(error) {
429
+ if (!(error instanceof Error))
430
+ return String(error);
431
+ const commandError = error;
432
+ return [commandError.message, commandError.stderr, commandError.stdout]
433
+ .filter((part) => typeof part === "string" && part.length > 0)
434
+ .join("\n");
435
+ }
436
+ function classifyGitError(error, stage, registry) {
437
+ const text = getCommandErrorText(error);
438
+ const lower = text.toLowerCase();
439
+ if (lower.includes("enoent") ||
440
+ lower.includes("not found: git") ||
441
+ lower.includes("spawn git")) {
442
+ return new RegistryBackendError("git-unavailable", 'Git is required to access this registry, but the "git" command was not found.');
443
+ }
444
+ if (lower.includes("authentication failed") ||
445
+ lower.includes("permission denied") ||
446
+ lower.includes("access denied") ||
447
+ lower.includes("could not read from remote repository") ||
448
+ lower.includes("terminal prompts disabled")) {
449
+ return new RegistryBackendError("auth", `Authentication failed or registry is not accessible via Git. Check your local Git credentials for ${registry.gitUrl}.`);
450
+ }
451
+ if (stage !== "clone" &&
452
+ (lower.includes("couldn't find remote ref") ||
453
+ lower.includes("could not find remote ref") ||
454
+ lower.includes("invalid reference") ||
455
+ lower.includes("reference is not a tree") ||
456
+ lower.includes("pathspec"))) {
457
+ return new RegistryBackendError("ref-not-found", `Registry ref "${registry.ref}" was not found in ${registry.gitUrl}.`);
458
+ }
459
+ if (lower.includes("could not resolve host") ||
460
+ lower.includes("failed to connect") ||
461
+ lower.includes("network is unreachable") ||
462
+ lower.includes("operation timed out") ||
463
+ lower.includes("timed out") ||
464
+ lower.includes("connection refused")) {
465
+ return new RegistryBackendError("network", `Could not reach registry ${registry.gitUrl}. Check your network connection and Git remote access.`);
466
+ }
467
+ if (stage === "clone" &&
468
+ (lower.includes("repository not found") ||
469
+ lower.includes("does not appear to be a git repository") ||
470
+ lower.includes("could not read from remote repository"))) {
471
+ return new RegistryBackendError("not-found", `Registry repository was not found or is not accessible: ${registry.gitUrl}.`);
472
+ }
473
+ return new RegistryBackendError("unknown", `Git registry operation failed: ${text}`);
474
+ }
475
+ async function cloneRegistryRef(registry) {
476
+ const dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "trellis-registry-"));
477
+ try {
478
+ try {
479
+ await runGit([
480
+ "clone",
481
+ "--filter=blob:none",
482
+ "--no-checkout",
483
+ registry.gitUrl,
484
+ dir,
485
+ ]);
486
+ await runGit(["-C", dir, "config", "core.autocrlf", "false"]);
487
+ }
488
+ catch (error) {
489
+ throw classifyGitError(error, "clone", registry);
490
+ }
491
+ try {
492
+ await runGit([
493
+ "-C",
494
+ dir,
495
+ "fetch",
496
+ "--depth",
497
+ "1",
498
+ "origin",
499
+ registry.ref,
500
+ ]);
501
+ await runGit(["-C", dir, "checkout", "--detach", "FETCH_HEAD"]);
502
+ }
503
+ catch (error) {
504
+ throw classifyGitError(error, "fetch", registry);
505
+ }
506
+ return {
507
+ dir,
508
+ cleanup: async () => {
509
+ await removeDirectory(dir);
510
+ },
511
+ };
512
+ }
513
+ catch (error) {
514
+ await removeDirectory(dir);
515
+ throw error;
516
+ }
517
+ }
518
+ function resolveInsideRegistryRoot(root, relativePath, label) {
519
+ const resolvedRoot = path.resolve(root);
520
+ const resolved = path.resolve(resolvedRoot, relativePath.length > 0 ? relativePath : ".");
521
+ const relative = path.relative(resolvedRoot, resolved);
522
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
523
+ throw new RegistryBackendError("path-not-found", `${label} path "${relativePath}" must stay inside the registry repository.`);
524
+ }
525
+ return resolved;
526
+ }
527
+ async function isDirectory(dir) {
528
+ try {
529
+ return (await fs.promises.stat(dir)).isDirectory();
530
+ }
531
+ catch {
532
+ return false;
533
+ }
534
+ }
535
+ async function isFile(filePath) {
536
+ try {
537
+ return (await fs.promises.stat(filePath)).isFile();
538
+ }
539
+ catch {
540
+ return false;
541
+ }
542
+ }
543
+ async function getGitRegistryRoot(checkoutDir, registry) {
544
+ const registryRoot = resolveInsideRegistryRoot(checkoutDir, registry.subdir, "Registry");
545
+ if (!(await isDirectory(registryRoot))) {
546
+ throw new RegistryBackendError("path-not-found", `Registry path "${registry.subdir.length > 0 ? registry.subdir : "."}" was not found in ${registry.gitUrl}#${registry.ref}.`);
547
+ }
548
+ return registryRoot;
549
+ }
550
+ async function probeRegistryIndexGit(registry) {
551
+ try {
552
+ const checkout = await cloneRegistryRef(registry);
553
+ try {
554
+ const registryRoot = await getGitRegistryRoot(checkout.dir, registry);
555
+ const indexPath = path.join(registryRoot, "index.json");
556
+ if (!(await isFile(indexPath))) {
557
+ return emptyProbeResult("git", true);
558
+ }
559
+ const index = parseTemplateIndex(await fs.promises.readFile(indexPath, "utf-8"), "Registry index.json");
560
+ return { templates: index.templates, isNotFound: false, backend: "git" };
561
+ }
562
+ finally {
563
+ await checkout.cleanup();
564
+ }
565
+ }
566
+ catch (error) {
567
+ const registryError = error instanceof RegistryBackendError
568
+ ? error
569
+ : new RegistryBackendError("unknown", `Git registry probe failed: ${error instanceof Error ? error.message : String(error)}`);
570
+ return emptyProbeResult("git", false, registryError);
571
+ }
572
+ }
573
+ /**
574
+ * Find a template by ID from the index
575
+ */
576
+ export async function findTemplate(templateId, indexUrl) {
577
+ const templates = await fetchTemplateIndex(indexUrl);
578
+ return templates.find((t) => t.id === templateId) ?? null;
579
+ }
580
+ // =============================================================================
581
+ // Download Template
582
+ // =============================================================================
583
+ /**
584
+ * Get the installation path for a template type
585
+ */
586
+ export function getInstallPath(cwd, templateType) {
587
+ const relativePath = INSTALL_PATHS[templateType] || INSTALL_PATHS.spec;
588
+ return path.join(cwd, relativePath);
589
+ }
590
+ /** Render only freshly downloaded Markdown specs, never merged user files. */
591
+ async function renderDownloadedInstructions(directory) {
592
+ if (COMMAND_NAME === "trellis")
593
+ return;
594
+ for (const entry of await fs.promises.readdir(directory, {
595
+ withFileTypes: true,
596
+ })) {
597
+ const file = path.join(directory, entry.name);
598
+ if (entry.isDirectory()) {
599
+ await renderDownloadedInstructions(file);
600
+ }
601
+ else if (entry.isFile() && /\.mdx?$/i.test(entry.name)) {
602
+ const original = await fs.promises.readFile(file, "utf-8");
603
+ const rendered = renderCommandInstructions(original);
604
+ if (rendered !== original)
605
+ await fs.promises.writeFile(file, rendered, "utf-8");
606
+ }
607
+ }
608
+ }
609
+ /**
610
+ * Download a template with the specified strategy
611
+ *
612
+ * @param templatePath - Path in the docs repo (e.g., "marketplace/specs/electron-fullstack")
613
+ * OR a full giget source (e.g., "gh:myorg/myrepo/my-spec")
614
+ * @param destDir - Destination directory
615
+ * @param strategy - How to handle existing directory: skip, overwrite, or append
616
+ * @param repoSource - Optional giget repo source override. When set, templatePath is
617
+ * treated as relative to this repo. When not set, uses TEMPLATE_REPO.
618
+ * Pass null to use templatePath as a full giget source directly.
619
+ * @returns true if template was downloaded, false if skipped
620
+ */
621
+ export async function downloadWithStrategy(templatePath, destDir, strategy, repoSource) {
622
+ // Build the giget download source
623
+ const gigetSource = repoSource === null
624
+ ? templatePath // templatePath is already a full giget source
625
+ : `${repoSource ?? TEMPLATE_REPO}/${templatePath}`;
626
+ const exists = fs.existsSync(destDir);
627
+ // skip: Directory exists, don't download
628
+ if (strategy === "skip" && exists) {
629
+ return false;
630
+ }
631
+ // overwrite: Download to a temp dir first, then swap it in. Deleting
632
+ // destDir up-front and downloading in place would destroy the user's
633
+ // existing spec if the download fails (network timeout, etc.) — the
634
+ // operation they asked for never completed, yet their data is gone.
635
+ if (strategy === "overwrite" && exists) {
636
+ // randomUUID, not Date.now(): both branches below use this same name
637
+ // and millisecond resolution is not enough to keep two of them apart.
638
+ // Two runs landing in the same millisecond share a directory, and the
639
+ // first to finish cleaning up deletes the other's download mid-read.
640
+ const tempDir = path.join(os.tmpdir(), `trellis-template-${randomUUID()}`);
641
+ try {
642
+ await withTimeout(downloadTemplate(gigetSource, {
643
+ dir: tempDir,
644
+ }), TIMEOUTS.DOWNLOAD_MS, "Template download");
645
+ await renderDownloadedInstructions(tempDir);
646
+ // Download succeeded — only now is it safe to replace the old dir.
647
+ // copyMissing into a freshly removed dir copies everything, and works
648
+ // across filesystems (tempDir lives in os.tmpdir()).
649
+ await fs.promises.rm(destDir, { recursive: true, force: true });
650
+ await copyMissing(tempDir, destDir);
651
+ }
652
+ finally {
653
+ // Best-effort cleanup; also settles giget's orphaned download promise
654
+ // on timeout (giget has no AbortSignal, so removing the dir ENOENTs it).
655
+ // A rejected rm (EBUSY/EPERM) must not replace the download outcome.
656
+ try {
657
+ await fs.promises.rm(tempDir, { recursive: true, force: true });
658
+ }
659
+ catch {
660
+ // Best-effort cleanup
661
+ }
662
+ }
663
+ return true;
664
+ }
665
+ // append: Download to temp dir, then merge missing files
666
+ if (strategy === "append" && exists) {
667
+ // randomUUID, not Date.now(): both branches below use this same name
668
+ // and millisecond resolution is not enough to keep two of them apart.
669
+ // Two runs landing in the same millisecond share a directory, and the
670
+ // first to finish cleaning up deletes the other's download mid-read.
671
+ const tempDir = path.join(os.tmpdir(), `trellis-template-${randomUUID()}`);
672
+ try {
673
+ await withTimeout(downloadTemplate(gigetSource, {
674
+ dir: tempDir,
675
+ }), TIMEOUTS.DOWNLOAD_MS, "Template download");
676
+ await renderDownloadedInstructions(tempDir);
677
+ await copyMissing(tempDir, destDir);
678
+ }
679
+ catch (error) {
680
+ // Clean up partially written files on timeout.
681
+ // Note: giget does not support AbortSignal, so the background download may
682
+ // still be running. Removing the directory causes it to fail with ENOENT,
683
+ // which settles the orphaned promise harmlessly.
684
+ if (error instanceof Error && error.message.includes("timed out")) {
685
+ try {
686
+ fs.rmSync(tempDir, { recursive: true, force: true });
687
+ }
688
+ catch {
689
+ // Best-effort cleanup
690
+ }
691
+ }
692
+ throw error;
693
+ }
694
+ finally {
695
+ // Clean up temp directory. A rejected rm (EBUSY/EPERM) must not
696
+ // replace the download outcome.
697
+ try {
698
+ await fs.promises.rm(tempDir, { recursive: true, force: true });
699
+ }
700
+ catch {
701
+ // Best-effort cleanup
702
+ }
703
+ }
704
+ return true;
705
+ }
706
+ // Default: Direct download (for new directory or after overwrite)
707
+ try {
708
+ await withTimeout(downloadTemplate(gigetSource, {
709
+ dir: destDir,
710
+ }), TIMEOUTS.DOWNLOAD_MS, "Template download");
711
+ await renderDownloadedInstructions(destDir);
712
+ }
713
+ catch (error) {
714
+ // Clean up partially written files on timeout.
715
+ // Note: giget does not support AbortSignal, so the background download may
716
+ // still be running. Removing the directory causes it to fail with ENOENT,
717
+ // which settles the orphaned promise harmlessly.
718
+ if (error instanceof Error && error.message.includes("timed out")) {
719
+ try {
720
+ fs.rmSync(destDir, { recursive: true, force: true });
721
+ }
722
+ catch {
723
+ // Best-effort cleanup
724
+ }
725
+ }
726
+ throw error;
727
+ }
728
+ return true;
729
+ }
730
+ /**
731
+ * Copy only files that don't exist in the destination
732
+ */
733
+ async function copyMissing(src, dest) {
734
+ // Ensure destination exists
735
+ if (!fs.existsSync(dest)) {
736
+ await fs.promises.mkdir(dest, { recursive: true });
737
+ }
738
+ const entries = await fs.promises.readdir(src, { withFileTypes: true });
739
+ for (const entry of entries) {
740
+ const srcPath = path.join(src, entry.name);
741
+ const destPath = path.join(dest, entry.name);
742
+ if (entry.isDirectory()) {
743
+ // Recursively copy missing files in subdirectory
744
+ await copyMissing(srcPath, destPath);
745
+ }
746
+ else if (!fs.existsSync(destPath)) {
747
+ // Only copy if file doesn't exist
748
+ await fs.promises.copyFile(srcPath, destPath);
749
+ }
750
+ }
751
+ }
752
+ /**
753
+ * Copy all files from src to dest, overwriting existing files.
754
+ */
755
+ async function copyAll(src, dest) {
756
+ await fs.promises.mkdir(dest, { recursive: true });
757
+ const entries = await fs.promises.readdir(src, { withFileTypes: true });
758
+ for (const entry of entries) {
759
+ const srcPath = path.join(src, entry.name);
760
+ const destPath = path.join(dest, entry.name);
761
+ if (entry.isDirectory()) {
762
+ await copyAll(srcPath, destPath);
763
+ }
764
+ else {
765
+ await fs.promises.copyFile(srcPath, destPath);
766
+ }
767
+ }
768
+ }
769
+ async function copyDirectoryWithStrategy(srcDir, destDir, strategy) {
770
+ const exists = fs.existsSync(destDir);
771
+ if (strategy === "skip" && exists) {
772
+ return false;
773
+ }
774
+ if (strategy === "overwrite" && exists) {
775
+ await fs.promises.rm(destDir, { recursive: true, force: true });
776
+ }
777
+ if (strategy === "append" && exists) {
778
+ await copyMissing(srcDir, destDir);
779
+ return true;
780
+ }
781
+ await copyAll(srcDir, destDir);
782
+ return true;
783
+ }
784
+ async function downloadGitRegistryPath(registry, relativePath, destDir, strategy) {
785
+ const checkout = await cloneRegistryRef(registry);
786
+ try {
787
+ const sourceRoot = resolveInsideRegistryRoot(checkout.dir, relativePath, "Template");
788
+ if (!(await isDirectory(sourceRoot))) {
789
+ throw new RegistryBackendError("path-not-found", `Template path "${relativePath.length > 0 ? relativePath : "."}" was not found in ${registry.gitUrl}#${registry.ref}.`);
790
+ }
791
+ await renderDownloadedInstructions(sourceRoot);
792
+ return await copyDirectoryWithStrategy(sourceRoot, destDir, strategy);
793
+ }
794
+ finally {
795
+ await checkout.cleanup();
796
+ }
797
+ }
798
+ async function downloadGitRegistryDirect(registry, destDir, strategy) {
799
+ const checkout = await cloneRegistryRef(registry);
800
+ try {
801
+ const sourceRoot = await getGitRegistryRoot(checkout.dir, registry);
802
+ await renderDownloadedInstructions(sourceRoot);
803
+ return await copyDirectoryWithStrategy(sourceRoot, destDir, strategy);
804
+ }
805
+ finally {
806
+ await checkout.cleanup();
807
+ }
808
+ }
809
+ function resolveRegistryBackend(registry, backendOverride) {
810
+ return backendOverride ?? (registry.preferGit ? "git" : "http");
811
+ }
812
+ /**
813
+ * Download a template by ID
814
+ *
815
+ * @param cwd - Current working directory
816
+ * @param templateId - Template ID from the index
817
+ * @param strategy - How to handle existing directory
818
+ * @param template - Optional pre-fetched SpecTemplate to avoid double-fetch
819
+ * @param registry - Optional registry source (parsed). When set, uses the registry's
820
+ * repo as the giget source instead of the default TEMPLATE_REPO.
821
+ * @returns Object with success status and message
822
+ */
823
+ export async function downloadTemplateById(cwd, templateId, strategy, template, registry, destDirOverride, registryBackend) {
824
+ // Use pre-fetched template or find from index
825
+ let resolved = template;
826
+ let backend = registryBackend;
827
+ if (!resolved) {
828
+ const indexUrl = registry ? `${registry.rawBaseUrl}/index.json` : undefined;
829
+ if (registry && indexUrl) {
830
+ // Use probe to distinguish "template not in index" from "registry unreachable"
831
+ const probeResult = await probeRegistryIndex(indexUrl, registry);
832
+ backend = probeResult.backend;
833
+ if (probeResult.error) {
834
+ return {
835
+ success: false,
836
+ message: probeResult.error.message,
837
+ };
838
+ }
839
+ if (probeResult.templates.length === 0 && !probeResult.isNotFound) {
840
+ return {
841
+ success: false,
842
+ message: "Could not reach registry. Check your network connection and try again.",
843
+ };
844
+ }
845
+ if (probeResult.isNotFound) {
846
+ return {
847
+ success: false,
848
+ message: "Registry has no index.json. Remove --template to use direct download mode.",
849
+ };
850
+ }
851
+ resolved = probeResult.templates.find((t) => t.id === templateId);
852
+ }
853
+ else {
854
+ resolved = (await findTemplate(templateId, indexUrl)) ?? undefined;
855
+ }
856
+ }
857
+ if (!resolved) {
858
+ return {
859
+ success: false,
860
+ message: `Template "${templateId}" not found`,
861
+ };
862
+ }
863
+ // Only support spec type in MVP
864
+ if (resolved.type !== "spec") {
865
+ return {
866
+ success: false,
867
+ message: `Template type "${resolved.type}" is not supported yet (only "spec" is supported)`,
868
+ };
869
+ }
870
+ // Get destination path (use override for monorepo per-package downloads)
871
+ const destDir = destDirOverride ?? getInstallPath(cwd, resolved.type);
872
+ // Check if directory exists for skip strategy
873
+ if (strategy === "skip" && fs.existsSync(destDir)) {
874
+ return {
875
+ success: true,
876
+ skipped: true,
877
+ message: `Skipped: ${destDir} already exists`,
878
+ };
879
+ }
880
+ // Download template
881
+ try {
882
+ if (registry) {
883
+ if (resolveRegistryBackend(registry, backend) === "git") {
884
+ await downloadGitRegistryPath(registry, resolved.path, destDir, strategy);
885
+ }
886
+ else {
887
+ // Custom registry: build full giget source with ref at the end
888
+ // giget format: provider:user/repo/path#ref
889
+ const fullSource = `${registry.provider}:${registry.repo}/${resolved.path}#${registry.ref}`;
890
+ await withGigetHost(registry.host, () => downloadWithStrategy(fullSource, destDir, strategy, null));
891
+ }
892
+ }
893
+ else {
894
+ await downloadWithStrategy(resolved.path, destDir, strategy);
895
+ }
896
+ return {
897
+ success: true,
898
+ message: `Downloaded template "${templateId}" to ${destDir}`,
899
+ };
900
+ }
901
+ catch (error) {
902
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
903
+ if (error instanceof RegistryBackendError) {
904
+ return {
905
+ success: false,
906
+ message: error.message,
907
+ };
908
+ }
909
+ // Classify errors for user-friendly messages
910
+ if (errorMessage.includes("timed out")) {
911
+ return {
912
+ success: false,
913
+ message: "Download timed out. Check your network connection and try again.",
914
+ };
915
+ }
916
+ if (errorMessage.includes("Failed to download") ||
917
+ errorMessage.includes("Failed to fetch")) {
918
+ return {
919
+ success: false,
920
+ message: "Could not reach template server. Check your network connection.",
921
+ };
922
+ }
923
+ return {
924
+ success: false,
925
+ message: `Download failed: ${errorMessage}`,
926
+ };
927
+ }
928
+ }
929
+ /**
930
+ * Download a registry source directly to the spec directory (no index.json).
931
+ * Used when the registry source points to a spec directory, not a marketplace.
932
+ */
933
+ export async function downloadRegistryDirect(cwd, registry, strategy, destDirOverride, registryBackend) {
934
+ const destDir = destDirOverride ?? getInstallPath(cwd, "spec");
935
+ if (strategy === "skip" && fs.existsSync(destDir)) {
936
+ return {
937
+ success: true,
938
+ skipped: true,
939
+ message: `Skipped: ${destDir} already exists`,
940
+ };
941
+ }
942
+ try {
943
+ if (resolveRegistryBackend(registry, registryBackend) === "git") {
944
+ await downloadGitRegistryDirect(registry, destDir, strategy);
945
+ }
946
+ else {
947
+ await withGigetHost(registry.host, () => downloadWithStrategy(registry.gigetSource, destDir, strategy, null));
948
+ }
949
+ return {
950
+ success: true,
951
+ message: `Downloaded spec from ${registry.gigetSource} to ${destDir}`,
952
+ };
953
+ }
954
+ catch (error) {
955
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
956
+ if (error instanceof RegistryBackendError) {
957
+ return {
958
+ success: false,
959
+ message: error.message,
960
+ };
961
+ }
962
+ if (errorMessage.includes("timed out")) {
963
+ return {
964
+ success: false,
965
+ message: "Download timed out. Check your network connection and try again.",
966
+ };
967
+ }
968
+ if (errorMessage.includes("Failed to download") ||
969
+ errorMessage.includes("Failed to fetch")) {
970
+ return {
971
+ success: false,
972
+ message: "Could not reach template server. Check your network connection.",
973
+ };
974
+ }
975
+ return {
976
+ success: false,
977
+ message: `Download failed: ${errorMessage}`,
978
+ };
979
+ }
980
+ }
981
+ export function collectDirectoryFiles(root, relativeRoot) {
982
+ const files = new Map();
983
+ if (!fs.existsSync(root))
984
+ return files;
985
+ const walk = (dir) => {
986
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
987
+ const fullPath = path.join(dir, entry.name);
988
+ if (entry.isDirectory()) {
989
+ walk(fullPath);
990
+ }
991
+ else if (entry.isFile()) {
992
+ const relativePath = toPosix(path.join(relativeRoot, path.relative(root, fullPath)));
993
+ files.set(relativePath, fs.readFileSync(fullPath, "utf-8"));
994
+ }
995
+ }
996
+ };
997
+ walk(root);
998
+ return files;
999
+ }
1000
+ /**
1001
+ * Download a direct registry spec into a temporary directory and return its
1002
+ * files as update-template entries under `.trellis/spec/**`.
1003
+ */
1004
+ export async function fetchRegistrySpecTemplates(registry, registryBackend) {
1005
+ const tempRoot = await fs.promises.mkdtemp(path.join(os.tmpdir(), "trellis-registry-spec-"));
1006
+ try {
1007
+ const result = await downloadRegistryDirect(tempRoot, registry, "overwrite", undefined, registryBackend);
1008
+ if (!result.success) {
1009
+ return { success: false, message: result.message, files: new Map() };
1010
+ }
1011
+ return {
1012
+ success: true,
1013
+ files: collectDirectoryFiles(path.join(tempRoot, ".trellis", "spec"), ".trellis/spec"),
1014
+ };
1015
+ }
1016
+ finally {
1017
+ await removeDirectory(tempRoot);
1018
+ }
1019
+ }
1020
+ //# sourceMappingURL=template-fetcher.js.map