outfitter 0.2.7 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/README.md +34 -7
  2. package/dist/actions/add.d.ts +18 -0
  3. package/dist/actions/add.js +14 -0
  4. package/dist/actions/check-automation.d.ts +20 -0
  5. package/dist/actions/check-automation.js +27 -0
  6. package/dist/actions/check.d.ts +34 -0
  7. package/dist/actions/check.js +19 -0
  8. package/dist/actions/demo.d.ts +12 -0
  9. package/dist/actions/demo.js +11 -0
  10. package/dist/actions/docs-output-mode.d.ts +4 -0
  11. package/dist/actions/docs-output-mode.js +8 -0
  12. package/dist/actions/docs.d.ts +25 -0
  13. package/dist/actions/docs.js +31 -0
  14. package/dist/actions/doctor.d.ts +10 -0
  15. package/dist/actions/doctor.js +15 -0
  16. package/dist/actions/init.d.ts +28 -0
  17. package/dist/actions/init.js +31 -0
  18. package/dist/actions/scaffold.d.ts +19 -0
  19. package/dist/actions/scaffold.js +21 -0
  20. package/dist/actions/shared.d.ts +61 -0
  21. package/dist/actions/shared.js +30 -0
  22. package/dist/actions/upgrade.d.ts +17 -0
  23. package/dist/actions/upgrade.js +21 -0
  24. package/dist/actions.d.ts +1 -1
  25. package/dist/actions.js +53 -22
  26. package/dist/cli.js +66 -4
  27. package/dist/commands/add.js +3 -3
  28. package/dist/commands/check-action-ceremony.d.ts +55 -0
  29. package/dist/commands/check-action-ceremony.js +15 -0
  30. package/dist/commands/check-docs-sentinel.d.ts +27 -0
  31. package/dist/commands/check-docs-sentinel.js +18 -0
  32. package/dist/commands/check-orchestrator.d.ts +2 -0
  33. package/dist/commands/check-orchestrator.js +17 -0
  34. package/dist/commands/check-preset-versions.d.ts +20 -0
  35. package/dist/commands/check-preset-versions.js +15 -0
  36. package/dist/commands/check-publish-guardrails.d.ts +38 -0
  37. package/dist/commands/check-publish-guardrails.js +19 -0
  38. package/dist/commands/check-surface-map-format.d.ts +29 -0
  39. package/dist/commands/check-surface-map-format.js +19 -0
  40. package/dist/commands/check-surface-map.d.ts +20 -0
  41. package/dist/commands/check-surface-map.js +15 -0
  42. package/dist/commands/check-tsdoc.d.ts +2 -21
  43. package/dist/commands/check-tsdoc.js +3 -2
  44. package/dist/commands/check.d.ts +2 -0
  45. package/dist/commands/check.js +3 -3
  46. package/dist/commands/demo.js +1 -1
  47. package/dist/commands/docs-api.d.ts +4 -0
  48. package/dist/commands/docs-api.js +13 -0
  49. package/dist/commands/docs-export.d.ts +4 -0
  50. package/dist/commands/docs-export.js +12 -0
  51. package/dist/commands/docs-list.d.ts +3 -0
  52. package/dist/commands/docs-list.js +13 -0
  53. package/dist/commands/docs-module-loader.d.ts +2 -2
  54. package/dist/commands/docs-module-loader.js +2 -2
  55. package/dist/commands/docs-search.d.ts +3 -0
  56. package/dist/commands/docs-search.js +13 -0
  57. package/dist/commands/docs-show.d.ts +3 -0
  58. package/dist/commands/docs-show.js +13 -0
  59. package/dist/commands/docs-types.d.ts +21 -0
  60. package/dist/commands/doctor.js +4 -12
  61. package/dist/commands/init-execution.d.ts +8 -0
  62. package/dist/commands/init-execution.js +11 -0
  63. package/dist/commands/init-option-resolution.d.ts +5 -0
  64. package/dist/commands/init-option-resolution.js +14 -0
  65. package/dist/commands/init-output.d.ts +9 -0
  66. package/dist/commands/init-output.js +11 -0
  67. package/dist/commands/init.d.ts +7 -5
  68. package/dist/commands/init.js +10 -18
  69. package/dist/commands/jq-utils.d.ts +17 -0
  70. package/dist/commands/jq-utils.js +8 -0
  71. package/dist/commands/repo.d.ts +3 -3
  72. package/dist/commands/repo.js +8 -4
  73. package/dist/commands/scaffold-output.d.ts +4 -0
  74. package/dist/commands/scaffold-output.js +11 -0
  75. package/dist/commands/scaffold-planning.d.ts +65 -0
  76. package/dist/commands/scaffold-planning.js +20 -0
  77. package/dist/commands/scaffold.d.ts +3 -3
  78. package/dist/commands/scaffold.js +10 -16
  79. package/dist/commands/shared-deps.d.ts +5 -4
  80. package/dist/commands/shared-deps.js +3 -3
  81. package/dist/commands/upgrade-apply.d.ts +14 -0
  82. package/dist/commands/upgrade-apply.js +8 -0
  83. package/dist/commands/upgrade-codemods.d.ts +5 -0
  84. package/dist/commands/upgrade-codemods.js +4 -5
  85. package/dist/commands/upgrade-latest-version.d.ts +8 -0
  86. package/dist/commands/upgrade-latest-version.js +8 -0
  87. package/dist/commands/upgrade-migration-docs.d.ts +3 -0
  88. package/dist/commands/upgrade-migration-docs.js +15 -0
  89. package/dist/commands/upgrade-migration-frontmatter.d.ts +2 -0
  90. package/dist/commands/upgrade-migration-frontmatter.js +10 -0
  91. package/dist/commands/upgrade-migration-guides.d.ts +5 -0
  92. package/dist/commands/upgrade-migration-guides.js +10 -0
  93. package/dist/commands/upgrade-output.d.ts +5 -0
  94. package/dist/commands/upgrade-output.js +11 -0
  95. package/dist/commands/upgrade-planner.js +1 -1
  96. package/dist/commands/upgrade-report.d.ts +5 -0
  97. package/dist/commands/upgrade-report.js +8 -0
  98. package/dist/commands/upgrade-workspace.js +2 -2
  99. package/dist/commands/upgrade.d.ts +4 -220
  100. package/dist/commands/upgrade.js +21 -9
  101. package/dist/create/index.d.ts +3 -3
  102. package/dist/create/index.js +2 -30
  103. package/dist/create/planner.d.ts +2 -2
  104. package/dist/create/planner.js +80 -17
  105. package/dist/create/presets.d.ts +2 -2
  106. package/dist/create/presets.js +2 -2
  107. package/dist/create/types.d.ts +1 -1
  108. package/dist/engine/blocks.d.ts +2 -2
  109. package/dist/engine/blocks.js +5 -5
  110. package/dist/engine/collector.d.ts +1 -1
  111. package/dist/engine/collector.js +1 -1
  112. package/dist/engine/config.d.ts +2 -2
  113. package/dist/engine/config.js +4 -4
  114. package/dist/engine/dependency-versions.d.ts +13 -8
  115. package/dist/engine/dependency-versions.js +4 -4
  116. package/dist/engine/executor.d.ts +2 -2
  117. package/dist/engine/executor.js +149 -12
  118. package/dist/engine/index.d.ts +9 -7
  119. package/dist/engine/index.js +17 -31
  120. package/dist/engine/names.js +1 -1
  121. package/dist/engine/post-scaffold.d.ts +2 -2
  122. package/dist/engine/post-scaffold.js +1 -1
  123. package/dist/engine/preset.d.ts +3 -0
  124. package/dist/engine/preset.js +17 -0
  125. package/dist/engine/render-plan.d.ts +1 -1
  126. package/dist/engine/render-plan.js +1 -1
  127. package/dist/engine/template.d.ts +3 -2
  128. package/dist/engine/template.js +24 -7
  129. package/dist/engine/types.d.ts +1 -1
  130. package/dist/engine/types.js +1 -1
  131. package/dist/engine/workspace.d.ts +2 -2
  132. package/dist/engine/workspace.js +1 -1
  133. package/dist/index.d.ts +17 -398
  134. package/dist/index.js +7 -164
  135. package/dist/manifest.js +2 -2
  136. package/dist/output-mode.js +1 -1
  137. package/dist/shared/{outfitter-6fgk6adm.d.ts → outfitter-1tfa9hke.d.ts} +16 -1
  138. package/dist/shared/{outfitter-6bkqjk86.d.ts → outfitter-2nx0k4b3.d.ts} +1 -0
  139. package/dist/shared/outfitter-2ysjerp6.d.ts +44 -0
  140. package/dist/shared/outfitter-2z61gp5w.js +29 -0
  141. package/dist/shared/outfitter-34vg353f.d.ts +82 -0
  142. package/dist/shared/{outfitter-5yjr404v.d.ts → outfitter-3dq4r10s.d.ts} +5 -3
  143. package/dist/shared/outfitter-3rcrvva8.js +103 -0
  144. package/dist/shared/{outfitter-79vfxt6y.js → outfitter-3tx3adgj.js} +12 -3
  145. package/dist/shared/{outfitter-63gse8fv.js → outfitter-507ra35w.js} +33 -64
  146. package/dist/shared/outfitter-56jq0rh2.d.ts +42 -0
  147. package/dist/shared/{outfitter-r419zfgs.d.ts → outfitter-58rn1sj1.d.ts} +1 -1
  148. package/dist/shared/outfitter-5d9wbzhh.d.ts +19 -0
  149. package/dist/shared/outfitter-5j7zee11.d.ts +180 -0
  150. package/dist/shared/{outfitter-s7jetkge.d.ts → outfitter-5r6q2749.d.ts} +1 -1
  151. package/dist/shared/outfitter-5vx1bp7h.js +41 -0
  152. package/dist/shared/outfitter-6ddf91vh.js +190 -0
  153. package/dist/shared/{outfitter-mt7d1ek2.js → outfitter-6mpkh3zn.js} +39 -305
  154. package/dist/shared/{outfitter-ybbazsxq.d.ts → outfitter-6rtcemk7.d.ts} +8 -4
  155. package/dist/shared/{outfitter-9x1brcmq.js → outfitter-6t7xeyg1.js} +13 -38
  156. package/dist/shared/outfitter-738z4c37.js +262 -0
  157. package/dist/shared/{outfitter-yvksv5qb.js → outfitter-76k25svs.js} +4 -4
  158. package/dist/shared/outfitter-7n7vsz95.js +101 -0
  159. package/dist/shared/outfitter-7q9fnbwa.js +60 -0
  160. package/dist/shared/outfitter-84chvazx.js +480 -0
  161. package/dist/shared/outfitter-8ggmja91.js +301 -0
  162. package/dist/shared/{outfitter-qakwgrrh.d.ts → outfitter-8kmak0wc.d.ts} +1 -1
  163. package/dist/shared/outfitter-940h0x7b.js +71 -0
  164. package/dist/shared/{outfitter-fn20r49x.d.ts → outfitter-954y4mzx.d.ts} +1 -1
  165. package/dist/shared/outfitter-b9cpnr7e.js +110 -0
  166. package/dist/shared/outfitter-c7sbs7es.js +92 -0
  167. package/dist/shared/outfitter-cyhzstz0.js +93 -0
  168. package/dist/shared/{outfitter-n9g1zk4x.d.ts → outfitter-cyvr4r8d.d.ts} +3 -2
  169. package/dist/shared/outfitter-d0kqashd.d.ts +98 -0
  170. package/dist/shared/outfitter-dx4hn4ta.js +325 -0
  171. package/dist/shared/{outfitter-bn9c8p2e.js → outfitter-e84cr97g.js} +37 -9
  172. package/dist/shared/outfitter-ec83h4v2.js +17 -0
  173. package/dist/shared/{outfitter-vh4xgb93.js → outfitter-ekb6t1zz.js} +4 -4
  174. package/dist/shared/outfitter-ex8gn945.js +51 -0
  175. package/dist/shared/outfitter-f3a70135.js +75 -0
  176. package/dist/shared/outfitter-fbvfd5zq.d.ts +13 -0
  177. package/dist/shared/outfitter-fj2v5ffz.js +165 -0
  178. package/dist/shared/outfitter-fx1m251y.js +122 -0
  179. package/dist/shared/outfitter-fxry5n58.js +254 -0
  180. package/dist/shared/outfitter-g3hvjshg.js +1 -0
  181. package/dist/shared/{outfitter-f9znfhkn.d.ts → outfitter-gdc7b7de.d.ts} +1 -1
  182. package/dist/shared/outfitter-gyayfx5r.js +156 -0
  183. package/dist/shared/outfitter-h0wmtxw8.d.ts +23 -0
  184. package/dist/shared/{outfitter-z5sx06qe.d.ts → outfitter-hcexcvxe.d.ts} +1 -1
  185. package/dist/shared/outfitter-hf5bj2gq.js +117 -0
  186. package/dist/shared/{outfitter-e9rrfekb.d.ts → outfitter-htx4asgr.d.ts} +4 -3
  187. package/dist/shared/outfitter-jkct38dh.js +53 -0
  188. package/dist/shared/outfitter-jwxggvz4.js +42 -0
  189. package/dist/shared/outfitter-k6zyvg2n.js +306 -0
  190. package/dist/shared/outfitter-mstr60zz.js +215 -0
  191. package/dist/shared/outfitter-n0ed012k.js +101 -0
  192. package/dist/shared/outfitter-n13pqaft.js +19 -0
  193. package/dist/shared/outfitter-nxvjxrmw.d.ts +48 -0
  194. package/dist/shared/outfitter-p2wn07b7.js +160 -0
  195. package/dist/shared/{outfitter-5y646xzk.js → outfitter-px5sv5gn.js} +29 -9
  196. package/dist/shared/outfitter-q1g58t85.js +8 -0
  197. package/dist/shared/{outfitter-pj9vp00r.js → outfitter-qsd5638j.js} +26 -249
  198. package/dist/shared/outfitter-qsrx7m4w.js +72 -0
  199. package/dist/shared/outfitter-r2awqszh.d.ts +52 -0
  200. package/dist/shared/outfitter-rdpw2sbp.d.ts +77 -0
  201. package/dist/shared/outfitter-rp89dafm.js +109 -0
  202. package/dist/shared/outfitter-s1c0whzj.js +121 -0
  203. package/dist/shared/{outfitter-w1j80j1r.js → outfitter-ssrtakh3.js} +21 -5
  204. package/dist/shared/outfitter-ssynegbs.js +167 -0
  205. package/dist/shared/{outfitter-zwyvewr1.js → outfitter-svts4wk2.js} +1 -1
  206. package/dist/shared/outfitter-tavatb5p.js +166 -0
  207. package/dist/shared/outfitter-tqznjgbm.js +44 -0
  208. package/dist/shared/{outfitter-yraebrmw.d.ts → outfitter-wcrp7d7m.d.ts} +1 -1
  209. package/dist/shared/outfitter-wkt0a0ra.js +67 -0
  210. package/dist/shared/{outfitter-ha89qf8q.js → outfitter-wrcqq29p.js} +4 -4
  211. package/dist/shared/outfitter-wyg1tpp5.d.ts +43 -0
  212. package/dist/shared/outfitter-x0vpb7tj.js +126 -0
  213. package/dist/shared/{outfitter-m44n0qzw.js → outfitter-x39awx8g.js} +11 -26
  214. package/dist/shared/outfitter-x4cc5xsq.js +168 -0
  215. package/dist/shared/outfitter-x8w5sjnd.d.ts +39 -0
  216. package/dist/shared/{outfitter-amc4jbs1.d.ts → outfitter-xr6g13nz.d.ts} +2 -2
  217. package/dist/shared/outfitter-xs94pkfe.js +106 -0
  218. package/dist/shared/outfitter-y37yfehn.d.ts +37 -0
  219. package/dist/shared/{outfitter-fhnjpjwc.d.ts → outfitter-y6ee0k45.d.ts} +1 -1
  220. package/dist/shared/{outfitter-j833sxws.js → outfitter-ydw7x6bh.js} +1 -1
  221. package/dist/shared/outfitter-yhb23pjc.js +89 -0
  222. package/dist/shared/{outfitter-mtbpabf3.js → outfitter-ypcvwg1s.js} +1 -1
  223. package/dist/shared/outfitter-znbqe5zy.d.ts +45 -0
  224. package/dist/shared/{outfitter-dpj9erew.d.ts → outfitter-zng6w0t9.d.ts} +1 -1
  225. package/dist/targets/index.d.ts +2 -2
  226. package/dist/targets/index.js +2 -3
  227. package/dist/targets/registry.d.ts +2 -2
  228. package/dist/targets/registry.js +207 -14
  229. package/dist/targets/types.d.ts +1 -1
  230. package/package.json +203 -40
  231. package/dist/shared/chunk-x6644tk8.js +0 -6491
  232. package/dist/shared/outfitter-20f6a2n4.js +0 -35
  233. package/dist/shared/outfitter-5akzvppx.js +0 -125
  234. package/dist/shared/outfitter-7ch26yq8.js +0 -885
  235. package/dist/shared/outfitter-ehp18x1n.js +0 -1
  236. package/dist/shared/outfitter-h3q6ae6d.d.ts +0 -48
  237. package/dist/shared/outfitter-hvsaxgcp.js +0 -1
  238. package/dist/shared/outfitter-p71qb0f0.js +0 -82
  239. package/dist/shared/outfitter-pcj9gg2g.js +0 -909
  240. package/dist/shared/outfitter-xe5mzgdc.js +0 -208
  241. package/dist/shared/outfitter-z0we32cp.d.ts +0 -63
  242. package/template-versions.json +0 -22
  243. package/templates/.gitkeep +0 -0
  244. package/templates/basic/.gitignore.template +0 -30
  245. package/templates/basic/.lefthook.yml.template +0 -26
  246. package/templates/basic/package.json.template +0 -46
  247. package/templates/basic/src/index.ts.template +0 -26
  248. package/templates/basic/tsconfig.json.template +0 -34
  249. package/templates/cli/.gitignore.template +0 -4
  250. package/templates/cli/.lefthook.yml.template +0 -26
  251. package/templates/cli/README.md.template +0 -35
  252. package/templates/cli/biome.json.template +0 -4
  253. package/templates/cli/package.json.template +0 -53
  254. package/templates/cli/src/cli.ts.template +0 -8
  255. package/templates/cli/src/index.ts.template +0 -7
  256. package/templates/cli/src/program.ts.template +0 -31
  257. package/templates/cli/tsconfig.json.template +0 -34
  258. package/templates/daemon/.gitignore.template +0 -4
  259. package/templates/daemon/.lefthook.yml.template +0 -26
  260. package/templates/daemon/README.md.template +0 -67
  261. package/templates/daemon/biome.json.template +0 -4
  262. package/templates/daemon/package.json.template +0 -56
  263. package/templates/daemon/src/cli.ts.template +0 -96
  264. package/templates/daemon/src/daemon-main.ts.template +0 -79
  265. package/templates/daemon/src/daemon.ts.template +0 -11
  266. package/templates/daemon/src/index.ts.template +0 -7
  267. package/templates/daemon/tsconfig.json.template +0 -23
  268. package/templates/full-stack/.gitignore.template +0 -30
  269. package/templates/full-stack/README.md.template +0 -30
  270. package/templates/full-stack/apps/cli/package.json.template +0 -39
  271. package/templates/full-stack/apps/cli/src/cli.ts.template +0 -24
  272. package/templates/full-stack/apps/cli/src/index.test.ts.template +0 -18
  273. package/templates/full-stack/apps/cli/src/index.ts.template +0 -5
  274. package/templates/full-stack/apps/cli/tsconfig.json.template +0 -37
  275. package/templates/full-stack/apps/mcp/package.json.template +0 -40
  276. package/templates/full-stack/apps/mcp/src/index.test.ts.template +0 -18
  277. package/templates/full-stack/apps/mcp/src/index.ts.template +0 -6
  278. package/templates/full-stack/apps/mcp/src/mcp.ts.template +0 -22
  279. package/templates/full-stack/apps/mcp/src/server.ts.template +0 -10
  280. package/templates/full-stack/apps/mcp/tsconfig.json.template +0 -37
  281. package/templates/full-stack/package.json.template +0 -16
  282. package/templates/full-stack/packages/core/package.json.template +0 -36
  283. package/templates/full-stack/packages/core/src/handlers.ts.template +0 -31
  284. package/templates/full-stack/packages/core/src/index.test.ts.template +0 -30
  285. package/templates/full-stack/packages/core/src/index.ts.template +0 -8
  286. package/templates/full-stack/packages/core/src/types.ts.template +0 -13
  287. package/templates/full-stack/packages/core/tsconfig.json.template +0 -34
  288. package/templates/library/.gitignore.template +0 -30
  289. package/templates/library/README.md.template +0 -29
  290. package/templates/library/bunup.config.ts.template +0 -20
  291. package/templates/library/package.json.template +0 -55
  292. package/templates/library/src/handlers.ts.template +0 -31
  293. package/templates/library/src/index.test.ts.template +0 -35
  294. package/templates/library/src/index.ts.template +0 -8
  295. package/templates/library/src/types.ts.template +0 -13
  296. package/templates/library/tsconfig.json.template +0 -34
  297. package/templates/mcp/.gitignore.template +0 -4
  298. package/templates/mcp/.lefthook.yml.template +0 -26
  299. package/templates/mcp/README.md.template +0 -54
  300. package/templates/mcp/biome.json.template +0 -4
  301. package/templates/mcp/package.json.template +0 -53
  302. package/templates/mcp/src/index.ts.template +0 -7
  303. package/templates/mcp/src/mcp.ts.template +0 -33
  304. package/templates/mcp/src/server.ts.template +0 -8
  305. package/templates/mcp/tsconfig.json.template +0 -23
  306. package/templates/minimal/.gitignore.template +0 -30
  307. package/templates/minimal/.lefthook.yml.template +0 -26
  308. package/templates/minimal/package.json.template +0 -53
  309. package/templates/minimal/src/index.ts.template +0 -26
  310. package/templates/minimal/tsconfig.json.template +0 -34
  311. /package/dist/{shared/outfitter-344t1r38.js → commands/docs-types.js} +0 -0
  312. /package/dist/shared/{outfitter-mdt37hqm.js → outfitter-eepj7rf7.js} +0 -0
@@ -0,0 +1,41 @@
1
+ // @bun
2
+ // apps/outfitter/src/commands/jq-utils.ts
3
+ async function applyJq(data, expr, options) {
4
+ try {
5
+ const json = JSON.stringify(data);
6
+ const args = ["jq", ...options?.compact ? ["-c"] : [], expr];
7
+ const proc = Bun.spawn(args, {
8
+ stdin: new Response(json),
9
+ stdout: "pipe",
10
+ stderr: "pipe"
11
+ });
12
+ const [stdout, stderr, exitCode] = await Promise.all([
13
+ new Response(proc.stdout).text(),
14
+ new Response(proc.stderr).text(),
15
+ proc.exited
16
+ ]);
17
+ if (exitCode !== 0) {
18
+ process.stderr.write(`jq error: ${stderr.trim()}
19
+ `);
20
+ return options?.compact ? `${JSON.stringify(data)}
21
+ ` : `${JSON.stringify(data, null, 2)}
22
+ `;
23
+ }
24
+ return stdout;
25
+ } catch (error) {
26
+ const message = error instanceof Error ? error.message : "unknown jq execution error";
27
+ const missingBinary = /enoent|not found/i.test(message);
28
+ if (missingBinary) {
29
+ process.stderr.write(`jq is not installed. Install jq or omit --jq to continue.
30
+ `);
31
+ } else {
32
+ process.stderr.write(`jq execution error: ${message}
33
+ `);
34
+ }
35
+ return options?.compact ? `${JSON.stringify(data)}
36
+ ` : `${JSON.stringify(data, null, 2)}
37
+ `;
38
+ }
39
+ }
40
+
41
+ export { applyJq };
@@ -0,0 +1,190 @@
1
+ // @bun
2
+ import {
3
+ buildScaffoldPlan,
4
+ convertToWorkspace,
5
+ detectProjectStructure,
6
+ ensureWorkspacePattern,
7
+ validateScaffoldTargetName
8
+ } from "./outfitter-qsd5638j.js";
9
+ import {
10
+ getScaffoldTarget
11
+ } from "./outfitter-g3hvjshg.js";
12
+ import {
13
+ deriveProjectName,
14
+ executePlan,
15
+ isPathWithin
16
+ } from "./outfitter-q1g58t85.js";
17
+ import {
18
+ printScaffoldResults
19
+ } from "./outfitter-qsrx7m4w.js";
20
+ import {
21
+ runPostScaffold
22
+ } from "./outfitter-4s9meh3j.js";
23
+ import {
24
+ scaffoldWorkspaceRoot
25
+ } from "./outfitter-1fy7byz5.js";
26
+ import {
27
+ OperationCollector
28
+ } from "./outfitter-1h7k8xxt.js";
29
+
30
+ // apps/outfitter/src/commands/scaffold.ts
31
+ import { existsSync } from "fs";
32
+ import { basename, join, resolve } from "path";
33
+ import { exitWithError } from "@outfitter/cli";
34
+ import { Result } from "@outfitter/contracts";
35
+ class ScaffoldCommandError extends Error {
36
+ _tag = "ScaffoldCommandError";
37
+ constructor(message) {
38
+ super(message);
39
+ this.name = "ScaffoldCommandError";
40
+ }
41
+ }
42
+ async function runScaffold(options) {
43
+ const targetResult = getScaffoldTarget(options.target);
44
+ if (targetResult.isErr()) {
45
+ return Result.err(new ScaffoldCommandError(targetResult.error.message));
46
+ }
47
+ const target = targetResult.value;
48
+ const targetName = deriveProjectName(options.name ?? target.id);
49
+ const targetNameValidation = validateScaffoldTargetName(targetName);
50
+ if (targetNameValidation.isErr()) {
51
+ return Result.err(new ScaffoldCommandError(targetNameValidation.error));
52
+ }
53
+ const dryRun = options.dryRun;
54
+ const collector = dryRun ? new OperationCollector : undefined;
55
+ const structureResult = detectProjectStructure(options.cwd);
56
+ if (structureResult.isErr()) {
57
+ return Result.err(new ScaffoldCommandError(structureResult.error));
58
+ }
59
+ let rootDir = resolve(options.cwd);
60
+ let converted = false;
61
+ let movedExisting;
62
+ let workspacePatternsUpdated = false;
63
+ if (structureResult.value.kind === "workspace") {
64
+ rootDir = structureResult.value.rootDir;
65
+ const patternResult = ensureWorkspacePattern(rootDir, target.placement, dryRun, collector);
66
+ if (patternResult.isErr()) {
67
+ return Result.err(new ScaffoldCommandError(patternResult.error));
68
+ }
69
+ workspacePatternsUpdated = patternResult.value;
70
+ } else if (structureResult.value.kind === "single-package") {
71
+ const conversionResult = convertToWorkspace(structureResult.value.rootDir, structureResult.value.packageJson, dryRun, collector);
72
+ if (conversionResult.isErr()) {
73
+ return Result.err(new ScaffoldCommandError(conversionResult.error));
74
+ }
75
+ rootDir = structureResult.value.rootDir;
76
+ converted = true;
77
+ movedExisting = conversionResult.value.movedExisting;
78
+ } else {
79
+ const workspaceName = `${basename(rootDir)}-workspace`;
80
+ if (dryRun) {
81
+ const packageJsonPath = join(rootDir, "package.json");
82
+ if (existsSync(packageJsonPath) && !options.force) {
83
+ return Result.err(new ScaffoldCommandError(`Directory '${rootDir}' already has a package.json. Use --force to overwrite.`));
84
+ }
85
+ collector?.add({
86
+ type: "dir-create",
87
+ path: join(rootDir, "apps")
88
+ });
89
+ collector?.add({
90
+ type: "dir-create",
91
+ path: join(rootDir, "packages")
92
+ });
93
+ collector?.add(existsSync(packageJsonPath) ? {
94
+ type: "file-overwrite",
95
+ path: packageJsonPath,
96
+ source: "generated"
97
+ } : {
98
+ type: "file-create",
99
+ path: packageJsonPath,
100
+ source: "generated"
101
+ });
102
+ const gitignorePath = join(rootDir, ".gitignore");
103
+ if (options.force || !existsSync(gitignorePath)) {
104
+ collector?.add(existsSync(gitignorePath) ? {
105
+ type: "file-overwrite",
106
+ path: gitignorePath,
107
+ source: "generated"
108
+ } : {
109
+ type: "file-create",
110
+ path: gitignorePath,
111
+ source: "generated"
112
+ });
113
+ }
114
+ } else {
115
+ const workspaceResult = scaffoldWorkspaceRoot(rootDir, workspaceName, options.force);
116
+ if (workspaceResult.isErr()) {
117
+ return Result.err(new ScaffoldCommandError(workspaceResult.error.message));
118
+ }
119
+ }
120
+ converted = true;
121
+ }
122
+ const targetBaseDir = resolve(rootDir, target.placement);
123
+ const targetDir = resolve(targetBaseDir, targetName);
124
+ if (!isPathWithin(targetBaseDir, targetDir)) {
125
+ return Result.err(new ScaffoldCommandError(`Invalid target name '${targetName}': path escapes '${targetBaseDir}'`));
126
+ }
127
+ if (existsSync(targetDir) && !options.force && !dryRun) {
128
+ return Result.err(new ScaffoldCommandError(`'${target.placement}/${targetName}/' already exists. Use --force to overwrite.`));
129
+ }
130
+ const plan = buildScaffoldPlan(target, rootDir, targetName, options);
131
+ const executeResult = await executePlan(plan, {
132
+ force: options.force,
133
+ ...collector ? { collector } : {}
134
+ });
135
+ if (executeResult.isErr()) {
136
+ return Result.err(new ScaffoldCommandError(executeResult.error.message));
137
+ }
138
+ const postScaffoldResult = await runPostScaffold({
139
+ rootDir,
140
+ projectDir: targetDir,
141
+ origin: "scaffold",
142
+ target: target.id,
143
+ structure: "workspace",
144
+ skipInstall: options.skipInstall,
145
+ skipGit: true,
146
+ skipCommit: true,
147
+ dryRun,
148
+ installTimeoutMs: options.installTimeout ?? 60000
149
+ }, collector);
150
+ if (postScaffoldResult.isErr()) {
151
+ return Result.err(new ScaffoldCommandError("Post-scaffold step failed"));
152
+ }
153
+ return Result.ok({
154
+ target: target.id,
155
+ rootDir,
156
+ targetDir,
157
+ converted,
158
+ movedExisting,
159
+ workspacePatternsUpdated,
160
+ blocksAdded: executeResult.value.blocksAdded,
161
+ postScaffold: postScaffoldResult.value,
162
+ ...collector ? { dryRunPlan: collector.toJSON() } : {}
163
+ });
164
+ }
165
+ function scaffoldCommand(program) {
166
+ program.command("scaffold <target> [name]").description("Add a capability to an existing project").option("-f, --force", "Overwrite existing files", false).option("--skip-install", "Skip bun install", false).option("--dry-run", "Preview changes without executing", false).option("--with <blocks>", "Comma-separated tooling blocks to add").option("--no-tooling", "Skip default tooling blocks").option("--local", "Use workspace:* for @outfitter dependencies").option("--install-timeout <ms>", "bun install timeout in ms").action(async (target, name, _flags, command) => {
167
+ const resolvedFlags = command.optsWithGlobals();
168
+ const mode = resolvedFlags.json ? "json" : undefined;
169
+ const outputOptions = mode ? { mode } : undefined;
170
+ const result = await runScaffold({
171
+ target,
172
+ name,
173
+ force: Boolean(resolvedFlags.force),
174
+ skipInstall: Boolean(resolvedFlags.skipInstall),
175
+ dryRun: Boolean(resolvedFlags.dryRun),
176
+ with: resolvedFlags.with,
177
+ noTooling: resolvedFlags.noTooling,
178
+ local: resolvedFlags.local,
179
+ cwd: process.cwd(),
180
+ ...resolvedFlags.installTimeout !== undefined ? { installTimeout: resolvedFlags.installTimeout } : {}
181
+ });
182
+ if (result.isErr()) {
183
+ exitWithError(result.error, outputOptions);
184
+ return;
185
+ }
186
+ await printScaffoldResults(result.value, outputOptions);
187
+ });
188
+ }
189
+
190
+ export { ScaffoldCommandError, runScaffold, scaffoldCommand };
@@ -1,43 +1,30 @@
1
1
  // @bun
2
2
  import {
3
- runPostScaffold
4
- } from "./outfitter-4s9meh3j.js";
3
+ printInitResults
4
+ } from "./outfitter-n0ed012k.js";
5
+ import {
6
+ isBinaryPreset,
7
+ parseBlocks,
8
+ resolvePresetFromFlags
9
+ } from "./outfitter-2z61gp5w.js";
10
+ import {
11
+ executeInitPipeline
12
+ } from "./outfitter-tavatb5p.js";
5
13
  import {
6
14
  INIT_TARGET_IDS,
7
15
  TARGET_REGISTRY,
8
16
  getInitTarget
9
- } from "./outfitter-xe5mzgdc.js";
10
- import {
11
- OperationCollector
12
- } from "./outfitter-1h7k8xxt.js";
13
- import {
14
- renderOperationPlan
15
- } from "./outfitter-ttjr95y9.js";
16
- import {
17
- executePlan
18
- } from "./outfitter-5akzvppx.js";
19
- import {
20
- scaffoldWorkspaceRoot
21
- } from "./outfitter-1fy7byz5.js";
17
+ } from "./outfitter-g3hvjshg.js";
22
18
  import {
23
19
  deriveBinName,
24
20
  deriveProjectName,
25
- isPathWithin,
26
- resolveAuthor,
27
21
  resolvePackageName,
28
- resolveYear,
29
22
  sanitizePackageName,
30
- validatePackageName,
31
- validateProjectDirectoryName
32
- } from "./outfitter-4q1zfmvc.js";
33
- import {
34
- resolveStructuredOutputMode
35
- } from "./outfitter-7r12fj7f.js";
23
+ validatePackageName
24
+ } from "./outfitter-q1g58t85.js";
36
25
 
37
26
  // apps/outfitter/src/commands/init.ts
38
- import { existsSync } from "fs";
39
- import { realpath } from "fs/promises";
40
- import { basename, join, resolve } from "path";
27
+ import { basename, resolve } from "path";
41
28
  import {
42
29
  cancel,
43
30
  confirm,
@@ -47,7 +34,7 @@ import {
47
34
  select,
48
35
  text
49
36
  } from "@clack/prompts";
50
- import { exitWithError, output } from "@outfitter/cli";
37
+ import { exitWithError } from "@outfitter/cli";
51
38
  import { Result } from "@outfitter/contracts";
52
39
  class InitError extends Error {
53
40
  _tag = "InitError";
@@ -56,47 +43,13 @@ class InitError extends Error {
56
43
  this.name = "InitError";
57
44
  }
58
45
  }
59
- function parseBlocks(withFlag) {
60
- if (!withFlag) {
61
- return;
62
- }
63
- const blocks = withFlag.split(",").map((value) => value.trim()).filter((value) => value.length > 0);
64
- return blocks.length > 0 ? blocks : undefined;
65
- }
66
- function isBinaryPreset(preset) {
67
- return preset === "cli" || preset === "daemon";
68
- }
69
- function isValidInitPreset(value) {
70
- return value === "minimal" || value === "cli" || value === "mcp" || value === "daemon" || value === "library" || value === "full-stack";
71
- }
72
- function resolvePresetFromFlags(options) {
73
- const presetFromFlag = options.preset;
74
- if (presetFromFlag) {
75
- if (!isValidInitPreset(presetFromFlag)) {
76
- return Result.err(new InitError(`Unknown preset '${presetFromFlag}'. Available presets: ${INIT_TARGET_IDS.join(", ")}`));
77
- }
78
- return Result.ok(presetFromFlag);
79
- }
80
- if (options.template) {
81
- const mapped = options.template === "basic" ? "minimal" : options.template;
82
- process.stderr.write(`Warning: --template is deprecated and will be removed in the next major version.
83
- ` + ` Use --preset instead: outfitter init --preset ${mapped}
84
- ` + (options.template === "basic" ? ` Note: "basic" has been renamed to "minimal".
85
- ` : ""));
86
- if (isValidInitPreset(mapped)) {
87
- return Result.ok(mapped);
88
- }
89
- return Result.err(new InitError(`Unknown template '${options.template}'. Available presets: ${INIT_TARGET_IDS.join(", ")}`));
90
- }
91
- return Result.ok(undefined);
92
- }
93
46
  async function resolveInitInput(options, presetOverride) {
94
47
  const rootDir = resolve(options.targetDir);
95
48
  const defaultName = basename(rootDir);
96
49
  const defaultPackageName = sanitizePackageName(defaultName) || defaultName;
97
- const presetFromFlagsResult = resolvePresetFromFlags(options);
50
+ const presetFromFlagsResult = resolvePresetFromFlags(options.preset, INIT_TARGET_IDS);
98
51
  if (presetFromFlagsResult.isErr()) {
99
- return presetFromFlagsResult;
52
+ return Result.err(new InitError(presetFromFlagsResult.error));
100
53
  }
101
54
  const presetFromFlags = presetFromFlagsResult.value;
102
55
  if (options.yes || !process.stdout.isTTY) {
@@ -261,41 +214,6 @@ async function resolveInitInput(options, presetOverride) {
261
214
  ...binName ? { binName } : {}
262
215
  });
263
216
  }
264
- function toInitError(error) {
265
- if (error instanceof InitError) {
266
- return error;
267
- }
268
- if (error instanceof Error) {
269
- return new InitError(error.message);
270
- }
271
- return new InitError("Unknown init error");
272
- }
273
- function buildInitPlan(target, input, projectDir, resolvedBinName) {
274
- const blocks = input.includeTooling ? input.blocksOverride ?? [...target.defaultBlocks] : [];
275
- return {
276
- values: {
277
- name: deriveProjectName(input.packageName),
278
- projectName: deriveProjectName(input.packageName),
279
- packageName: input.packageName,
280
- binName: resolvedBinName,
281
- version: "0.1.0",
282
- description: "A new project created with Outfitter",
283
- author: resolveAuthor(),
284
- year: resolveYear()
285
- },
286
- changes: [
287
- {
288
- type: "copy-template",
289
- template: target.templateDir,
290
- targetDir: projectDir,
291
- overlayBaseTemplate: true
292
- },
293
- { type: "inject-shared-config" },
294
- ...input.local ? [{ type: "rewrite-local-dependencies", mode: "workspace" }] : [],
295
- ...blocks.length > 0 ? [{ type: "add-blocks", blocks }] : []
296
- ]
297
- };
298
- }
299
217
  async function runInit(options, presetOverride) {
300
218
  const inputResult = await resolveInitInput(options, presetOverride);
301
219
  if (inputResult.isErr()) {
@@ -306,202 +224,32 @@ async function runInit(options, presetOverride) {
306
224
  if (targetResult.isErr()) {
307
225
  return Result.err(new InitError(targetResult.error.message));
308
226
  }
309
- const target = targetResult.value;
310
- const projectName = deriveProjectName(input.packageName);
311
- if (input.structure === "workspace") {
312
- const invalidProjectName = validateProjectDirectoryName(projectName);
313
- if (invalidProjectName) {
314
- return Result.err(new InitError(`Invalid workspace project name '${projectName}': ${invalidProjectName}`));
315
- }
316
- }
317
- const dryRun = Boolean(options.dryRun);
318
- const collector = dryRun ? new OperationCollector : undefined;
319
- const projectBaseDir = resolve(input.rootDir, target.placement);
320
- const resolvedProjectDir = resolve(projectBaseDir, projectName);
321
- if (input.structure === "workspace" && !isPathWithin(projectBaseDir, resolvedProjectDir)) {
322
- return Result.err(new InitError(`Invalid workspace project name '${projectName}': path escapes '${projectBaseDir}'`));
323
- }
324
- const projectDir = input.structure === "workspace" ? resolvedProjectDir : input.rootDir;
325
- if (input.structure === "single") {
326
- if (existsSync(join(input.rootDir, "package.json")) && !options.force) {
327
- return Result.err(new InitError(`Directory '${input.rootDir}' already has a package.json. ` + `Use --force to overwrite, or use 'outfitter add' for existing projects.`));
328
- }
329
- } else {
330
- const workspaceName = input.workspaceName ?? basename(input.rootDir);
331
- const workspacePackageJsonPath = join(input.rootDir, "package.json");
332
- if (dryRun) {
333
- if (existsSync(workspacePackageJsonPath) && !options.force) {
334
- return Result.err(new InitError(`Directory '${input.rootDir}' already has a package.json. Use --force to overwrite.`));
335
- }
336
- collector?.add({
337
- type: "dir-create",
338
- path: join(input.rootDir, "apps")
339
- });
340
- collector?.add({
341
- type: "dir-create",
342
- path: join(input.rootDir, "packages")
343
- });
344
- collector?.add(existsSync(workspacePackageJsonPath) ? {
345
- type: "file-overwrite",
346
- path: workspacePackageJsonPath,
347
- source: "generated"
348
- } : {
349
- type: "file-create",
350
- path: workspacePackageJsonPath,
351
- source: "generated"
352
- });
353
- const readmePath = join(input.rootDir, "README.md");
354
- if (options.force || !existsSync(readmePath)) {
355
- collector?.add(existsSync(readmePath) ? {
356
- type: "file-overwrite",
357
- path: readmePath,
358
- source: "generated"
359
- } : {
360
- type: "file-create",
361
- path: readmePath,
362
- source: "generated"
363
- });
364
- }
365
- const gitignorePath = join(input.rootDir, ".gitignore");
366
- if (options.force || !existsSync(gitignorePath)) {
367
- collector?.add(existsSync(gitignorePath) ? {
368
- type: "file-overwrite",
369
- path: gitignorePath,
370
- source: "generated"
371
- } : {
372
- type: "file-create",
373
- path: gitignorePath,
374
- source: "generated"
375
- });
376
- }
377
- } else {
378
- const workspaceResult = scaffoldWorkspaceRoot(input.rootDir, workspaceName, options.force);
379
- if (workspaceResult.isErr()) {
380
- return Result.err(new InitError(workspaceResult.error.message));
381
- }
382
- }
383
- }
384
- const resolvedBinName = input.binName ?? deriveBinName(deriveProjectName(input.packageName));
385
- const plan = buildInitPlan(target, input, projectDir, resolvedBinName);
386
- const executeResult = await executePlan(plan, {
227
+ const executeResult = await executeInitPipeline(input, targetResult.value, {
228
+ dryRun: Boolean(options.dryRun),
387
229
  force: options.force,
388
- ...collector ? { collector } : {}
389
- });
390
- if (executeResult.isErr()) {
391
- return Result.err(toInitError(executeResult.error));
392
- }
393
- const postScaffoldResult = await runPostScaffold({
394
- rootDir: input.rootDir,
395
- projectDir,
396
- origin: "init",
397
- target: input.preset,
398
- structure: input.structure,
399
230
  skipInstall: Boolean(options.skipInstall),
400
231
  skipGit: Boolean(options.skipGit),
401
232
  skipCommit: Boolean(options.skipCommit),
402
- dryRun,
403
- installTimeoutMs: options.installTimeout ?? 60000
404
- }, collector);
405
- if (postScaffoldResult.isErr()) {
406
- return Result.err(new InitError("Post-scaffold step failed"));
407
- }
408
- const result = {
409
- structure: input.structure,
410
- rootDir: input.rootDir,
411
- projectDir,
412
- preset: input.preset,
413
- packageName: input.packageName,
414
- blocksAdded: executeResult.value.blocksAdded,
415
- postScaffold: postScaffoldResult.value,
416
- ...collector ? { dryRunPlan: collector.toJSON() } : {}
417
- };
418
- return Result.ok(result);
419
- }
420
- async function printInitResults(result, options) {
421
- let rootDir = result.rootDir;
422
- let projectDir = result.projectDir;
423
- try {
424
- rootDir = await realpath(rootDir);
425
- projectDir = await realpath(projectDir);
426
- } catch {}
427
- const structuredMode = resolveStructuredOutputMode(options?.mode);
428
- if (result.dryRunPlan) {
429
- if (structuredMode) {
430
- await output({
431
- rootDir,
432
- projectDir,
433
- structure: result.structure,
434
- preset: result.preset,
435
- packageName: result.packageName,
436
- ...result.dryRunPlan
437
- }, { mode: structuredMode });
438
- return;
439
- }
440
- const collector = new OperationCollector;
441
- for (const op of result.dryRunPlan.operations) {
442
- collector.add(op);
443
- }
444
- await renderOperationPlan(collector, { rootDir });
445
- return;
446
- }
447
- if (structuredMode) {
448
- await output({
449
- structure: result.structure,
450
- rootDir,
451
- projectDir,
452
- preset: result.preset,
453
- packageName: result.packageName,
454
- blocksAdded: result.blocksAdded ?? null,
455
- postScaffold: result.postScaffold,
456
- nextSteps: result.postScaffold.nextSteps
457
- }, { mode: structuredMode });
458
- return;
459
- }
460
- const lines = [
461
- `Project initialized successfully in ${rootDir}`,
462
- `Structure: ${result.structure}`,
463
- `Preset: ${result.preset}`
464
- ];
465
- if (result.structure === "workspace") {
466
- lines.push(`Workspace project path: ${projectDir}`);
467
- }
468
- if (result.blocksAdded) {
469
- const { created, skipped, dependencies, devDependencies } = result.blocksAdded;
470
- if (created.length > 0) {
471
- lines.push("", `Added ${created.length} tooling file(s):`);
472
- for (const file of created) {
473
- lines.push(` \u2713 ${file}`);
474
- }
475
- }
476
- if (skipped.length > 0) {
477
- lines.push("", `Skipped ${skipped.length} existing file(s):`);
478
- for (const file of skipped) {
479
- lines.push(` - ${file}`);
480
- }
481
- }
482
- const depCount = Object.keys(dependencies).length + Object.keys(devDependencies).length;
483
- if (depCount > 0) {
484
- lines.push("", `Added ${depCount} package(s) to package.json:`);
485
- for (const [name, version] of Object.entries(dependencies)) {
486
- lines.push(` + ${name}@${version}`);
487
- }
488
- for (const [name, version] of Object.entries(devDependencies)) {
489
- lines.push(` + ${name}@${version} (dev)`);
490
- }
491
- }
492
- }
493
- if (result.postScaffold.installResult === "failed") {
494
- lines.push("", `Warning: bun install failed: ${result.postScaffold.installError ?? "unknown"}`);
495
- }
496
- if (result.postScaffold.gitInitResult === "failed") {
497
- lines.push("", `Warning: git setup failed: ${result.postScaffold.gitError ?? "unknown"}`);
498
- }
499
- lines.push("", "Next steps:");
500
- for (const step of result.postScaffold.nextSteps) {
501
- lines.push(` ${step}`);
233
+ installTimeout: options.installTimeout ?? 60000
234
+ });
235
+ if (executeResult.isErr()) {
236
+ return Result.err(new InitError(executeResult.error));
502
237
  }
503
- await output(lines, { mode: "human" });
238
+ return Result.ok(executeResult.value);
504
239
  }
240
+ var resolveLocal = (flags) => {
241
+ if (flags.local === true || flags.workspace === true) {
242
+ return true;
243
+ }
244
+ return;
245
+ };
246
+ var resolveOutputMode = (flags) => {
247
+ if (flags.json) {
248
+ return "json";
249
+ }
250
+ return;
251
+ };
252
+ var withCommonOptions = (command) => command.option("-n, --name <name>", "Package name (defaults to directory name)").option("-b, --bin <name>", "Binary name (defaults to project name)").option("-p, --preset <preset>", "Preset to use (minimal|cli|mcp|daemon|library|full-stack)").option("-s, --structure <mode>", "Project structure (single|workspace)").option("--workspace-name <name>", "Workspace root package name").option("-f, --force", "Overwrite existing files", false).option("--local", "Use workspace:* for @outfitter dependencies").option("--workspace", "Alias for --local").option("--with <blocks>", "Comma-separated tooling blocks to add").option("--no-tooling", "Skip default tooling blocks").option("-y, --yes", "Skip prompts and use defaults", false).option("--dry-run", "Preview changes without writing files", false).option("--skip-install", "Skip bun install", false).option("--skip-git", "Skip git init and initial commit", false).option("--skip-commit", "Skip initial commit only", false).option("--install-timeout <ms>", "bun install timeout in ms");
505
253
  function initCommand(program) {
506
254
  const init = program.command("init").description("Create a new Outfitter project");
507
255
  const resolveFlags = (flags, command) => {
@@ -510,20 +258,7 @@ function initCommand(program) {
510
258
  }
511
259
  return typeof flags.opts === "function" ? flags.opts() : flags;
512
260
  };
513
- const resolveLocal = (flags) => {
514
- if (flags.local === true || flags.workspace === true) {
515
- return true;
516
- }
517
- return;
518
- };
519
- const resolveOutputMode = (flags) => {
520
- if (flags.json) {
521
- return "json";
522
- }
523
- return;
524
- };
525
- const withCommonOptions = (command) => command.option("-n, --name <name>", "Package name (defaults to directory name)").option("-b, --bin <name>", "Binary name (defaults to project name)").option("-p, --preset <preset>", "Preset to use (minimal|cli|mcp|daemon|library|full-stack)").option("-s, --structure <mode>", "Project structure (single|workspace)").option("--workspace-name <name>", "Workspace root package name").option("-f, --force", "Overwrite existing files", false).option("--local", "Use workspace:* for @outfitter dependencies").option("--workspace", "Alias for --local").option("--with <blocks>", "Comma-separated tooling blocks to add").option("--no-tooling", "Skip default tooling blocks").option("-y, --yes", "Skip prompts and use defaults", false).option("--dry-run", "Preview changes without writing files", false).option("--skip-install", "Skip bun install", false).option("--skip-git", "Skip git init and initial commit", false).option("--skip-commit", "Skip initial commit only", false).option("--install-timeout <ms>", "bun install timeout in ms");
526
- withCommonOptions(init.argument("[directory]").option("-t, --template <template>", "Template to use (deprecated)")).action(async (directory, flags, command) => {
261
+ withCommonOptions(init.argument("[directory]")).action(async (directory, flags, command) => {
527
262
  const targetDir = directory ?? process.cwd();
528
263
  const resolvedFlags = resolveFlags(flags, command);
529
264
  const mode = resolveOutputMode(resolvedFlags);
@@ -533,7 +268,6 @@ function initCommand(program) {
533
268
  name: resolvedFlags.name,
534
269
  bin: resolvedFlags.bin,
535
270
  preset: resolvedFlags.preset,
536
- template: resolvedFlags.template,
537
271
  structure: resolvedFlags.structure,
538
272
  workspaceName: resolvedFlags.workspaceName,
539
273
  local: resolveLocal(resolvedFlags),
@@ -695,4 +429,4 @@ function initCommand(program) {
695
429
  });
696
430
  }
697
431
 
698
- export { InitError, runInit, printInitResults, initCommand };
432
+ export { InitError, runInit, initCommand };
@@ -1,14 +1,18 @@
1
- import { EngineOptions, PlaceholderValues, ScaffoldError } from "./outfitter-n9g1zk4x.js";
1
+ import { EngineOptions, PlaceholderValues, ScaffoldError } from "./outfitter-cyvr4r8d.js";
2
2
  import { Result } from "@outfitter/contracts";
3
- declare function getTemplatesDir(): string;
3
+ /**
4
+ * Get the directory containing scaffold preset files.
5
+ * Delegates to `@outfitter/presets` which is the single source of truth.
6
+ */
7
+ declare function getPresetsBaseDir(): string;
4
8
  declare function getOutputFilename(templateFilename: string): string;
5
9
  declare function isBinaryFile(filename: string): boolean;
6
10
  declare function replacePlaceholders(content: string, values: PlaceholderValues): string;
7
- declare function copyTemplateFiles(templateDir: string, targetDir: string, values: PlaceholderValues, options: EngineOptions, copyOptions?: {
11
+ declare function copyPresetFiles(presetDir: string, targetDir: string, values: PlaceholderValues, options: EngineOptions, copyOptions?: {
8
12
  readonly allowOverwrite?: boolean;
9
13
  readonly overwritablePaths?: ReadonlySet<string>;
10
14
  readonly writtenPaths?: Set<string>;
11
15
  readonly skipFilter?: (relativePath: string) => boolean;
12
16
  readonly relativePrefix?: string;
13
17
  }): Result<void, ScaffoldError>;
14
- export { getTemplatesDir, getOutputFilename, isBinaryFile, replacePlaceholders, copyTemplateFiles };
18
+ export { getPresetsBaseDir, getOutputFilename, isBinaryFile, replacePlaceholders, copyPresetFiles };