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