outfitter 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dist/actions/add.d.ts +1 -1
  2. package/dist/actions/add.js +6 -5
  3. package/dist/actions/check-automation.d.ts +4 -2
  4. package/dist/actions/check-automation.js +13 -9
  5. package/dist/actions/check.d.ts +2 -2
  6. package/dist/actions/check.js +6 -6
  7. package/dist/actions/demo.d.ts +1 -1
  8. package/dist/actions/demo.js +3 -4
  9. package/dist/actions/docs.d.ts +7 -7
  10. package/dist/actions/docs.js +12 -13
  11. package/dist/actions/doctor.d.ts +1 -1
  12. package/dist/actions/doctor.js +8 -7
  13. package/dist/actions/init.d.ts +9 -7
  14. package/dist/actions/init.js +12 -10
  15. package/dist/actions/scaffold.d.ts +1 -1
  16. package/dist/actions/scaffold.js +14 -12
  17. package/dist/actions/shared.d.ts +1 -20
  18. package/dist/actions/shared.js +1 -5
  19. package/dist/actions/upgrade.d.ts +10 -2
  20. package/dist/actions/upgrade.js +15 -8
  21. package/dist/actions.js +51 -48
  22. package/dist/cli.js +51 -48
  23. package/dist/commands/add.js +4 -3
  24. package/dist/commands/check-action-ceremony.d.ts +1 -1
  25. package/dist/commands/check-action-ceremony.js +2 -2
  26. package/dist/commands/check-action-registry.d.ts +52 -0
  27. package/dist/commands/check-action-registry.js +13 -0
  28. package/dist/commands/check-docs-sentinel.d.ts +1 -1
  29. package/dist/commands/check-docs-sentinel.js +2 -2
  30. package/dist/commands/check-orchestrator.d.ts +1 -1
  31. package/dist/commands/check-orchestrator.js +2 -2
  32. package/dist/commands/check-preset-versions.d.ts +4 -2
  33. package/dist/commands/check-preset-versions.js +8 -3
  34. package/dist/commands/check-publish-guardrails.d.ts +1 -1
  35. package/dist/commands/check-publish-guardrails.js +2 -2
  36. package/dist/commands/check-surface-map-format.d.ts +1 -1
  37. package/dist/commands/check-surface-map-format.js +2 -2
  38. package/dist/commands/check-surface-map.d.ts +1 -1
  39. package/dist/commands/check-surface-map.js +2 -2
  40. package/dist/commands/check-tsdoc.d.ts +2 -2
  41. package/dist/commands/check.js +3 -3
  42. package/dist/commands/demo.d.ts +1 -1
  43. package/dist/commands/demo.js +1 -1
  44. package/dist/commands/docs-api.d.ts +3 -3
  45. package/dist/commands/docs-api.js +2 -2
  46. package/dist/commands/docs-export.d.ts +2 -2
  47. package/dist/commands/docs-export.js +2 -2
  48. package/dist/commands/docs-list.d.ts +2 -2
  49. package/dist/commands/docs-list.js +2 -2
  50. package/dist/commands/docs-search.d.ts +2 -2
  51. package/dist/commands/docs-search.js +2 -2
  52. package/dist/commands/docs-show.d.ts +2 -2
  53. package/dist/commands/docs-show.js +2 -2
  54. package/dist/commands/doctor.js +6 -5
  55. package/dist/commands/init-execution.d.ts +5 -5
  56. package/dist/commands/init-execution.js +6 -4
  57. package/dist/commands/init-option-resolution.d.ts +3 -3
  58. package/dist/commands/init-option-resolution.js +1 -1
  59. package/dist/commands/init-output.d.ts +5 -5
  60. package/dist/commands/init-output.js +3 -3
  61. package/dist/commands/init.d.ts +5 -5
  62. package/dist/commands/init.js +9 -9
  63. package/dist/commands/scaffold-output.js +3 -3
  64. package/dist/commands/scaffold-planning.d.ts +9 -10
  65. package/dist/commands/scaffold-planning.js +6 -4
  66. package/dist/commands/scaffold.js +12 -10
  67. package/dist/commands/shared-deps.js +2 -2
  68. package/dist/commands/upgrade-codemod-builder.d.ts +45 -0
  69. package/dist/commands/upgrade-codemod-builder.js +14 -0
  70. package/dist/commands/upgrade-output.js +2 -2
  71. package/dist/commands/upgrade-workspace.js +5 -1
  72. package/dist/commands/upgrade.js +9 -5
  73. package/dist/create/index.d.ts +1 -1
  74. package/dist/create/planner.js +1 -1
  75. package/dist/engine/blocks.d.ts +2 -2
  76. package/dist/engine/blocks.js +5 -4
  77. package/dist/engine/config.d.ts +2 -2
  78. package/dist/engine/config.js +6 -5
  79. package/dist/engine/dependency-versions.d.ts +11 -3
  80. package/dist/engine/dependency-versions.js +6 -2
  81. package/dist/engine/executor.d.ts +2 -2
  82. package/dist/engine/executor.js +23 -10
  83. package/dist/engine/index.d.ts +8 -9
  84. package/dist/engine/index.js +1 -5
  85. package/dist/engine/package-json.d.ts +3 -0
  86. package/dist/engine/package-json.js +10 -0
  87. package/dist/engine/post-scaffold.js +1 -1
  88. package/dist/engine/preset.d.ts +3 -3
  89. package/dist/engine/preset.js +4 -2
  90. package/dist/engine/render-plan.js +2 -2
  91. package/dist/engine/types.d.ts +1 -1
  92. package/dist/engine/workspace.d.ts +2 -2
  93. package/dist/engine/workspace.js +3 -2
  94. package/dist/index.d.ts +7 -7
  95. package/dist/manifest.js +1 -1
  96. package/dist/output-mode.d.ts +2 -2
  97. package/dist/output-mode.js +2 -4
  98. package/dist/scaffold-e2e/cli.d.ts +19 -0
  99. package/dist/scaffold-e2e/cli.js +14 -0
  100. package/dist/scaffold-e2e/config.d.ts +6 -0
  101. package/dist/scaffold-e2e/config.js +14 -0
  102. package/dist/scaffold-e2e/runner.d.ts +29 -0
  103. package/dist/scaffold-e2e/runner.js +17 -0
  104. package/dist/scaffold-e2e/template-guardrails.d.ts +25 -0
  105. package/dist/scaffold-e2e/template-guardrails.js +183 -0
  106. package/dist/scaffold-e2e/workspace.d.ts +27 -0
  107. package/dist/scaffold-e2e/workspace.js +18 -0
  108. package/dist/scripts/scaffold-e2e.js +78 -0
  109. package/dist/shared/{outfitter-qsrx7m4w.js → outfitter-00wxeg2g.js} +8 -8
  110. package/dist/shared/{outfitter-ex8gn945.js → outfitter-0cspz333.js} +4 -6
  111. package/dist/shared/{outfitter-rp89dafm.js → outfitter-0xp447gf.js} +55 -8
  112. package/dist/shared/outfitter-0zs8makw.js +94 -0
  113. package/dist/shared/{outfitter-5d9wbzhh.d.ts → outfitter-11r5ny73.d.ts} +2 -2
  114. package/dist/shared/{outfitter-gyayfx5r.js → outfitter-18s82np1.js} +1 -1
  115. package/dist/shared/{outfitter-954y4mzx.d.ts → outfitter-1dekqnaw.d.ts} +1 -1
  116. package/dist/shared/{outfitter-6t7xeyg1.js → outfitter-1t8gjzw6.js} +91 -3
  117. package/dist/shared/{outfitter-tqznjgbm.js → outfitter-23159bef.js} +6 -3
  118. package/dist/shared/{outfitter-y6ee0k45.d.ts → outfitter-232ean4v.d.ts} +1 -1
  119. package/dist/shared/{outfitter-3rcrvva8.js → outfitter-247et71q.js} +8 -8
  120. package/dist/shared/{outfitter-xs94pkfe.js → outfitter-3f261xh0.js} +5 -7
  121. package/dist/shared/outfitter-4bs5a2n4.js +31 -0
  122. package/dist/shared/{outfitter-76k25svs.js → outfitter-4c4q091c.js} +6 -28
  123. package/dist/shared/{outfitter-738z4c37.js → outfitter-4t818mq5.js} +21 -9
  124. package/dist/shared/{outfitter-4s9meh3j.js → outfitter-4w9sc6bw.js} +24 -0
  125. package/dist/shared/outfitter-5gaptj9b.js +83 -0
  126. package/dist/shared/{outfitter-2ysjerp6.d.ts → outfitter-5rc4hxdn.d.ts} +2 -2
  127. package/dist/shared/{outfitter-ttjr95y9.js → outfitter-7krhbg3b.js} +3 -3
  128. package/dist/shared/{outfitter-7n7vsz95.js → outfitter-7t7ces1x.js} +1 -42
  129. package/dist/shared/{outfitter-gdc7b7de.d.ts → outfitter-8231g70k.d.ts} +1 -1
  130. package/dist/shared/{outfitter-yhb23pjc.js → outfitter-8jd1sak0.js} +4 -4
  131. package/dist/shared/{outfitter-wkt0a0ra.js → outfitter-93e1shd4.js} +4 -6
  132. package/dist/shared/{outfitter-wyg1tpp5.d.ts → outfitter-a93yanw6.d.ts} +1 -1
  133. package/dist/shared/{outfitter-mstr60zz.js → outfitter-aa5nzw14.js} +47 -22
  134. package/dist/shared/{outfitter-fxry5n58.js → outfitter-b05mvbmx.js} +4 -4
  135. package/dist/shared/{outfitter-1fy7byz5.js → outfitter-bsjq8gkk.js} +6 -4
  136. package/dist/shared/{outfitter-ssrtakh3.js → outfitter-c50y6yr3.js} +4 -4
  137. package/dist/shared/{outfitter-cyvr4r8d.d.ts → outfitter-crxe5gth.d.ts} +4 -0
  138. package/dist/shared/{outfitter-fj2v5ffz.js → outfitter-d5kz9x7g.js} +1 -1
  139. package/dist/shared/{outfitter-dmfac1w9.js → outfitter-dna8exj2.js} +19 -10
  140. package/dist/shared/{outfitter-940h0x7b.js → outfitter-e44qcs0w.js} +3 -3
  141. package/dist/shared/{outfitter-r2awqszh.d.ts → outfitter-e5x0ybqt.d.ts} +12 -3
  142. package/dist/shared/{outfitter-3tx3adgj.js → outfitter-ez7qffv5.js} +8 -6
  143. package/dist/shared/outfitter-fgrqt6aq.js +179 -0
  144. package/dist/shared/outfitter-fhahf9f3.d.ts +14 -0
  145. package/dist/shared/{outfitter-c7sbs7es.js → outfitter-g6r9avgz.js} +3 -3
  146. package/dist/shared/{outfitter-ssynegbs.js → outfitter-ga59fa45.js} +1 -1
  147. package/dist/shared/{outfitter-tavatb5p.js → outfitter-gna739c3.js} +86 -31
  148. package/dist/shared/{outfitter-nxvjxrmw.d.ts → outfitter-grt5ngqq.d.ts} +1 -1
  149. package/dist/shared/{outfitter-58rn1sj1.d.ts → outfitter-gsjbcta2.d.ts} +1 -1
  150. package/dist/shared/{outfitter-q1g58t85.js → outfitter-gvpwpqnc.js} +0 -1
  151. package/dist/shared/{outfitter-x39awx8g.js → outfitter-hr4cvmjy.js} +47 -25
  152. package/dist/shared/{outfitter-xwzjgswj.js → outfitter-hw9f0zq9.js} +57 -21
  153. package/dist/shared/{outfitter-ksyvwmb5.js → outfitter-jhpcjeg1.js} +5 -5
  154. package/dist/shared/outfitter-kc46jq69.d.ts +12 -0
  155. package/dist/shared/{outfitter-px5sv5gn.js → outfitter-ksg34wka.js} +5 -5
  156. package/dist/shared/{outfitter-wrcqq29p.js → outfitter-n63ygpv3.js} +30 -23
  157. package/dist/shared/{outfitter-qsd5638j.js → outfitter-n9jp1abt.js} +16 -40
  158. package/dist/shared/{outfitter-d0kqashd.d.ts → outfitter-nhft74pe.d.ts} +4 -2
  159. package/dist/shared/{outfitter-8kmak0wc.d.ts → outfitter-nx1sywpb.d.ts} +1 -1
  160. package/dist/shared/{outfitter-5r6q2749.d.ts → outfitter-pw74st5t.d.ts} +1 -1
  161. package/dist/shared/{outfitter-h0wmtxw8.d.ts → outfitter-qka1skyw.d.ts} +1 -1
  162. package/dist/shared/{outfitter-6mpkh3zn.js → outfitter-qps83547.js} +30 -23
  163. package/dist/shared/outfitter-qzd5djgx.js +88 -0
  164. package/dist/shared/{outfitter-hf5bj2gq.js → outfitter-sh015v8k.js} +4 -4
  165. package/dist/shared/{outfitter-ypcvwg1s.js → outfitter-srznx3hj.js} +1 -1
  166. package/dist/shared/{outfitter-n0ed012k.js → outfitter-ssq33ym3.js} +8 -8
  167. package/dist/shared/outfitter-sxf8jjjn.js +7 -0
  168. package/dist/shared/{outfitter-p2wn07b7.js → outfitter-t535h0mw.js} +1 -1
  169. package/dist/shared/{outfitter-znbqe5zy.d.ts → outfitter-t8dg4tg5.d.ts} +1 -1
  170. package/dist/shared/{outfitter-ydw7x6bh.js → outfitter-t8mvabed.js} +1 -1
  171. package/dist/shared/{outfitter-6ddf91vh.js → outfitter-t9xkn37g.js} +11 -12
  172. package/dist/shared/{outfitter-x4cc5xsq.js → outfitter-wmgzyymq.js} +4 -4
  173. package/dist/shared/outfitter-wna6gp2t.js +56 -0
  174. package/dist/shared/outfitter-x0r7mfvy.js +142 -0
  175. package/dist/shared/{outfitter-b9cpnr7e.js → outfitter-x4f8v5vf.js} +1 -1
  176. package/dist/shared/{outfitter-x8w5sjnd.d.ts → outfitter-x6322tjp.d.ts} +1 -1
  177. package/dist/shared/{outfitter-6rtcemk7.d.ts → outfitter-xa4915yp.d.ts} +3 -2
  178. package/dist/shared/{outfitter-2z61gp5w.js → outfitter-xg5yryp2.js} +1 -1
  179. package/dist/shared/{outfitter-rdpw2sbp.d.ts → outfitter-xn5km042.d.ts} +6 -0
  180. package/dist/shared/{outfitter-cyhzstz0.js → outfitter-xqr4fp1n.js} +4 -4
  181. package/dist/shared/outfitter-z6tg0swx.js +87 -0
  182. package/dist/shared/{outfitter-1gmrtapz.js → outfitter-zmzrsvcn.js} +17 -21
  183. package/dist/shared/{outfitter-8ggmja91.js → outfitter-zqj1nte1.js} +66 -67
  184. package/dist/targets/index.d.ts +2 -2
  185. package/dist/targets/registry.d.ts +2 -2
  186. package/dist/targets/registry.js +13 -1
  187. package/dist/targets/types.d.ts +1 -1
  188. package/package.json +85 -39
  189. package/dist/actions/docs-output-mode.d.ts +0 -4
  190. package/dist/actions/docs-output-mode.js +0 -8
  191. package/dist/engine/template.d.ts +0 -4
  192. package/dist/engine/template.js +0 -34
  193. package/dist/shared/outfitter-7r12fj7f.js +0 -30
  194. package/dist/shared/outfitter-a79xrm12.d.ts +0 -17
  195. package/dist/shared/outfitter-ec83h4v2.js +0 -17
  196. package/dist/shared/outfitter-fbvfd5zq.d.ts +0 -13
  197. package/dist/shared/outfitter-yywcypw8.js +0 -53
@@ -0,0 +1,87 @@
1
+ // @bun
2
+ // apps/outfitter/src/scaffold-e2e/workspace.ts
3
+ import { existsSync, mkdirSync, readdirSync, rmSync } from "fs";
4
+ import { tmpdir } from "os";
5
+ import { join, resolve } from "path";
6
+ var SCAFFOLD_E2E_ROOT_NAME = "outfitter-scaffold-e2e";
7
+ var DEFAULT_SCAFFOLD_E2E_RETENTION_MS = 24 * 60 * 60 * 1000;
8
+ var RUN_DIR_NAME_PATTERN = /^(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})T(?<hour>\d{2})(?<minute>\d{2})(?<second>\d{2})-(?<label>[a-z0-9-]+?)(?:-[0-9a-f-]+)?$/u;
9
+ function pad(value) {
10
+ return value.toString().padStart(2, "0");
11
+ }
12
+ function formatTimestamp(now) {
13
+ const date = new Date(now);
14
+ return [
15
+ date.getUTCFullYear().toString(),
16
+ pad(date.getUTCMonth() + 1),
17
+ pad(date.getUTCDate()),
18
+ "T",
19
+ pad(date.getUTCHours()),
20
+ pad(date.getUTCMinutes()),
21
+ pad(date.getUTCSeconds())
22
+ ].join("");
23
+ }
24
+ function slugifyLabel(label) {
25
+ const normalized = (label ?? "run").toLowerCase().replace(/[^a-z0-9]+/gu, "-").replace(/^-+|-+$/gu, "");
26
+ return normalized.length > 0 ? normalized : "run";
27
+ }
28
+ function parseRunStart(name) {
29
+ const match = RUN_DIR_NAME_PATTERN.exec(name);
30
+ if (!match?.groups) {
31
+ return;
32
+ }
33
+ const { year, month, day, hour, minute, second } = match.groups;
34
+ return Date.UTC(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second));
35
+ }
36
+ function resolveScaffoldE2ERoot(rootDir) {
37
+ return resolve(rootDir ?? join(tmpdir(), SCAFFOLD_E2E_ROOT_NAME));
38
+ }
39
+ function createScaffoldE2ERunDir(options = {}) {
40
+ const rootDir = resolveScaffoldE2ERoot(options.rootDir);
41
+ const timestamp = formatTimestamp(options.now ?? Date.now());
42
+ const label = slugifyLabel(options.runLabel);
43
+ const runId = Bun.randomUUIDv7().toLowerCase();
44
+ const runDir = join(rootDir, `${timestamp}-${label}-${runId}`);
45
+ mkdirSync(runDir, { recursive: true });
46
+ return runDir;
47
+ }
48
+ function cleanupScaffoldE2ERunDir(runDir) {
49
+ if (existsSync(runDir)) {
50
+ rmSync(runDir, { recursive: true, force: true });
51
+ }
52
+ }
53
+ function pruneScaffoldE2ERuns(options = {}) {
54
+ const rootDir = resolveScaffoldE2ERoot(options.rootDir);
55
+ const now = options.now ?? Date.now();
56
+ const maxAgeMs = options.maxAgeMs ?? DEFAULT_SCAFFOLD_E2E_RETENTION_MS;
57
+ const removed = [];
58
+ const kept = [];
59
+ if (!existsSync(rootDir)) {
60
+ return { rootDir, removed, kept };
61
+ }
62
+ for (const entry of readdirSync(rootDir, { withFileTypes: true })) {
63
+ if (!entry.isDirectory()) {
64
+ continue;
65
+ }
66
+ const startedAt = parseRunStart(entry.name);
67
+ if (startedAt === undefined) {
68
+ continue;
69
+ }
70
+ const path = join(rootDir, entry.name);
71
+ const ageMs = Math.max(0, now - startedAt);
72
+ const shouldRemove = options.removeAll === true || ageMs > maxAgeMs;
73
+ if (shouldRemove) {
74
+ cleanupScaffoldE2ERunDir(path);
75
+ removed.push({ path, ageMs });
76
+ continue;
77
+ }
78
+ kept.push({ path, ageMs });
79
+ }
80
+ return {
81
+ rootDir,
82
+ removed: removed.toSorted((left, right) => left.path.localeCompare(right.path)),
83
+ kept: kept.toSorted((left, right) => left.path.localeCompare(right.path))
84
+ };
85
+ }
86
+
87
+ export { SCAFFOLD_E2E_ROOT_NAME, DEFAULT_SCAFFOLD_E2E_RETENTION_MS, resolveScaffoldE2ERoot, createScaffoldE2ERunDir, cleanupScaffoldE2ERunDir, pruneScaffoldE2ERuns };
@@ -1,39 +1,40 @@
1
1
  // @bun
2
2
  import {
3
3
  checkTsdocOutputSchema
4
- } from "./outfitter-dmfac1w9.js";
5
- import {
6
- resolveDocsOutputMode
7
- } from "./outfitter-ec83h4v2.js";
4
+ } from "./outfitter-dna8exj2.js";
8
5
  import {
9
6
  outputModeSchema,
10
7
  resolveCwdFromPreset,
11
8
  resolveStringFlag
12
- } from "./outfitter-7n7vsz95.js";
9
+ } from "./outfitter-7t7ces1x.js";
13
10
  import {
14
11
  printDocsListResults,
15
12
  runDocsList
16
- } from "./outfitter-yhb23pjc.js";
13
+ } from "./outfitter-8jd1sak0.js";
17
14
  import {
18
15
  printDocsApiResults,
19
16
  runDocsApi
20
- } from "./outfitter-cyhzstz0.js";
17
+ } from "./outfitter-xqr4fp1n.js";
21
18
  import {
22
19
  printDocsSearchResults,
23
20
  runDocsSearch
24
- } from "./outfitter-hf5bj2gq.js";
21
+ } from "./outfitter-sh015v8k.js";
25
22
  import {
26
23
  printDocsExportResults,
27
24
  runDocsExport
28
- } from "./outfitter-940h0x7b.js";
25
+ } from "./outfitter-e44qcs0w.js";
29
26
  import {
30
27
  printDocsShowResults,
31
28
  runDocsShow
32
- } from "./outfitter-c7sbs7es.js";
29
+ } from "./outfitter-g6r9avgz.js";
33
30
 
34
31
  // apps/outfitter/src/actions/docs.ts
35
32
  import { cwdPreset } from "@outfitter/cli/flags";
36
- import { jqPreset, outputModePreset } from "@outfitter/cli/query";
33
+ import {
34
+ jqPreset,
35
+ outputModePreset,
36
+ resolveOutputMode
37
+ } from "@outfitter/cli/query";
37
38
  import { defineAction, Result } from "@outfitter/contracts";
38
39
  import { z } from "zod";
39
40
  var docsListInputSchema = z.object({
@@ -69,9 +70,8 @@ var docsListAction = defineAction({
69
70
  ...docsListCwd.options
70
71
  ],
71
72
  mapInput: (context) => {
72
- const { outputMode: presetOutputMode } = docsListOutputMode.resolve(context.flags);
73
73
  const { jq } = docsListJq.resolve(context.flags);
74
- const outputMode = resolveDocsOutputMode(context.flags, presetOutputMode);
74
+ const { mode: outputMode } = resolveOutputMode(context.flags);
75
75
  const kind = resolveStringFlag(context.flags["kind"]);
76
76
  const pkg = resolveStringFlag(context.flags["package"]);
77
77
  return {
@@ -117,9 +117,8 @@ var docsShowAction = defineAction({
117
117
  ...docsShowCwd.options
118
118
  ],
119
119
  mapInput: (context) => {
120
- const { outputMode: presetOutputMode } = docsShowOutputMode.resolve(context.flags);
121
120
  const { jq } = docsShowJq.resolve(context.flags);
122
- const outputMode = resolveDocsOutputMode(context.flags, presetOutputMode);
121
+ const { mode: outputMode } = resolveOutputMode(context.flags);
123
122
  return {
124
123
  id: context.args[0],
125
124
  cwd: resolveCwdFromPreset(context.flags, docsShowCwd),
@@ -172,9 +171,8 @@ var docsSearchAction = defineAction({
172
171
  ...docsSearchCwd.options
173
172
  ],
174
173
  mapInput: (context) => {
175
- const { outputMode: presetOutputMode } = docsSearchOutputMode.resolve(context.flags);
176
174
  const { jq } = docsSearchJq.resolve(context.flags);
177
- const outputMode = resolveDocsOutputMode(context.flags, presetOutputMode);
175
+ const { mode: outputMode } = resolveOutputMode(context.flags);
178
176
  const kind = resolveStringFlag(context.flags["kind"]);
179
177
  const pkg = resolveStringFlag(context.flags["package"]);
180
178
  return {
@@ -231,9 +229,8 @@ var docsApiAction = defineAction({
231
229
  ...docsApiCwd.options
232
230
  ],
233
231
  mapInput: (context) => {
234
- const { outputMode: presetOutputMode } = docsApiOutputMode.resolve(context.flags);
235
232
  const { jq } = docsApiJq.resolve(context.flags);
236
- const outputMode = resolveDocsOutputMode(context.flags, presetOutputMode);
233
+ const { mode: outputMode } = resolveOutputMode(context.flags);
237
234
  const levelRaw = context.flags["level"];
238
235
  const validLevels = new Set(["documented", "partial", "undocumented"]);
239
236
  const level = typeof levelRaw === "string" && validLevels.has(levelRaw) ? levelRaw : undefined;
@@ -300,8 +297,7 @@ var docsExportAction = defineAction({
300
297
  ...docsExportCwd.options
301
298
  ],
302
299
  mapInput: (context) => {
303
- const { outputMode: presetOutputMode } = docsExportOutputMode.resolve(context.flags);
304
- const outputMode = resolveDocsOutputMode(context.flags, presetOutputMode);
300
+ const { mode: outputMode } = resolveOutputMode(context.flags);
305
301
  const targetRaw = resolveStringFlag(context.flags["target"]);
306
302
  const target = targetRaw ?? "all";
307
303
  return {
@@ -1,20 +1,20 @@
1
1
  // @bun
2
2
  import {
3
3
  resolveStructuredOutputMode
4
- } from "./outfitter-7r12fj7f.js";
4
+ } from "./outfitter-sxf8jjjn.js";
5
+ import {
6
+ DEPENDENCY_SECTIONS,
7
+ normalizeVersionRange
8
+ } from "./outfitter-hr4cvmjy.js";
5
9
 
6
10
  // apps/outfitter/src/commands/check-preset-versions.ts
7
11
  import { existsSync, readFileSync } from "fs";
8
12
  import { join, resolve } from "path";
9
- import { Result } from "@outfitter/contracts";
13
+ import { extractMessage, Result } from "@outfitter/contracts";
10
14
  import { getResolvedVersions } from "@outfitter/presets";
11
15
  import { isTypesBunVersionCompatible } from "@outfitter/tooling";
12
- var DEPENDENCY_SECTIONS = [
13
- "dependencies",
14
- "devDependencies",
15
- "peerDependencies",
16
- "optionalDependencies"
17
- ];
16
+ import { isPlainObject } from "@outfitter/types";
17
+ var EXTERNAL_TEMPLATE_VERSION = "catalog:";
18
18
 
19
19
  class CheckPresetVersionsError extends Error {
20
20
  _tag = "CheckPresetVersionsError";
@@ -23,61 +23,49 @@ class CheckPresetVersionsError extends Error {
23
23
  this.name = "CheckPresetVersionsError";
24
24
  }
25
25
  }
26
- function isRecord(value) {
27
- return typeof value === "object" && value !== null && !Array.isArray(value);
28
- }
29
- function normalizeVersionRange(version) {
30
- const trimmed = version.trim();
31
- const semverMatch = trimmed.match(/\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?/);
32
- if (semverMatch) {
33
- return semverMatch[0];
34
- }
35
- return trimmed.replace(/^[\^~>=<]+/, "");
36
- }
37
26
  function validatePresetDeps(workspaceRoot, resolvedVersions, problems) {
38
- const templateRoots = ["templates", "packages/presets/presets"];
27
+ const presetRoot = "packages/presets/presets";
39
28
  const glob = new Bun.Glob("**/package.json.template");
40
- for (const rootPath of templateRoots) {
41
- const absoluteRoot = join(workspaceRoot, rootPath);
42
- if (!existsSync(absoluteRoot)) {
29
+ const absoluteRoot = join(workspaceRoot, presetRoot);
30
+ if (!existsSync(absoluteRoot)) {
31
+ problems.push(`Canonical presets root not found: ${presetRoot}`);
32
+ return;
33
+ }
34
+ for (const relativePath of glob.scanSync({
35
+ cwd: absoluteRoot,
36
+ absolute: false
37
+ })) {
38
+ const templatePath = join(presetRoot, relativePath);
39
+ const absoluteTemplatePath = join(absoluteRoot, relativePath);
40
+ const parsed = JSON.parse(readFileSync(absoluteTemplatePath, "utf-8"));
41
+ if (!isPlainObject(parsed)) {
43
42
  continue;
44
43
  }
45
- for (const relativePath of glob.scanSync({
46
- cwd: absoluteRoot,
47
- absolute: false
48
- })) {
49
- const templatePath = join(rootPath, relativePath);
50
- const absoluteTemplatePath = join(absoluteRoot, relativePath);
51
- const parsed = JSON.parse(readFileSync(absoluteTemplatePath, "utf-8"));
52
- if (!isRecord(parsed)) {
44
+ for (const section of DEPENDENCY_SECTIONS) {
45
+ const deps = parsed[section];
46
+ if (!isPlainObject(deps)) {
53
47
  continue;
54
48
  }
55
- for (const section of DEPENDENCY_SECTIONS) {
56
- const deps = parsed[section];
57
- if (!isRecord(deps)) {
49
+ for (const [name, value] of Object.entries(deps)) {
50
+ if (typeof value !== "string") {
58
51
  continue;
59
52
  }
60
- for (const [name, value] of Object.entries(deps)) {
61
- if (typeof value !== "string") {
62
- continue;
63
- }
64
- if (name.startsWith("@outfitter/")) {
65
- if (value !== "workspace:*") {
66
- problems.push(`${templatePath}: ${name} must use workspace:* (found ${value})`);
67
- }
68
- continue;
69
- }
70
- if (name.includes("{{") || value.startsWith("workspace:")) {
71
- continue;
72
- }
73
- const expected = resolvedVersions[name];
74
- if (!expected) {
75
- problems.push(`${templatePath}: external dependency "${name}" is not declared in @outfitter/presets`);
76
- continue;
77
- }
78
- if (normalizeVersionRange(value) !== normalizeVersionRange(expected)) {
79
- problems.push(`${templatePath}: ${name} expected ${expected} (found ${value})`);
53
+ if (name.startsWith("@outfitter/")) {
54
+ if (value !== "workspace:*") {
55
+ problems.push(`${templatePath}: ${name} must use workspace:* (found ${value})`);
80
56
  }
57
+ continue;
58
+ }
59
+ if (name.includes("{{") || value.startsWith("workspace:")) {
60
+ continue;
61
+ }
62
+ const expected = resolvedVersions[name];
63
+ if (!expected) {
64
+ problems.push(`${templatePath}: external dependency "${name}" is not declared in @outfitter/presets`);
65
+ continue;
66
+ }
67
+ if (value !== EXTERNAL_TEMPLATE_VERSION) {
68
+ problems.push(`${templatePath}: ${name} must use ${EXTERNAL_TEMPLATE_VERSION} (found ${value})`);
81
69
  }
82
70
  }
83
71
  }
@@ -93,20 +81,20 @@ function validateRegistryVersions(workspaceRoot, resolvedVersions, problems) {
93
81
  problems.push(`Registry not found or unreadable: ${registryPath}`);
94
82
  return;
95
83
  }
96
- if (!isRecord(registry)) {
84
+ if (!isPlainObject(registry)) {
97
85
  problems.push(`Registry has invalid shape (expected object): ${registryPath}`);
98
86
  return;
99
87
  }
100
- if (!isRecord(registry["blocks"])) {
88
+ if (!isPlainObject(registry["blocks"])) {
101
89
  problems.push(`Registry has invalid shape (missing object "blocks" field): ${registryPath}`);
102
90
  return;
103
91
  }
104
92
  for (const [blockName, block] of Object.entries(registry["blocks"])) {
105
- if (!isRecord(block)) {
93
+ if (!isPlainObject(block)) {
106
94
  continue;
107
95
  }
108
96
  const devDeps = block["devDependencies"];
109
- if (!isRecord(devDeps)) {
97
+ if (!isPlainObject(devDeps)) {
110
98
  continue;
111
99
  }
112
100
  for (const [name, value] of Object.entries(devDeps)) {
@@ -125,7 +113,7 @@ function validateRegistryVersions(workspaceRoot, resolvedVersions, problems) {
125
113
  }
126
114
  function readDependencyVersion(packageJson, section, name) {
127
115
  const container = packageJson[section];
128
- if (!isRecord(container)) {
116
+ if (!isPlainObject(container)) {
129
117
  return;
130
118
  }
131
119
  const value = container[name];
@@ -133,14 +121,26 @@ function readDependencyVersion(packageJson, section, name) {
133
121
  }
134
122
  function validateBunVersionConsistency(workspaceRoot, problems) {
135
123
  const bunVersionPath = join(workspaceRoot, ".bun-version");
136
- const bunVersionFile = readFileSync(bunVersionPath, "utf-8").trim();
124
+ let bunVersionFile;
125
+ try {
126
+ bunVersionFile = readFileSync(bunVersionPath, "utf-8").trim();
127
+ } catch (error) {
128
+ problems.push(`.bun-version not found or unreadable: ${extractMessage(error)}`);
129
+ return;
130
+ }
137
131
  const rootPackagePath = join(workspaceRoot, "package.json");
138
- const parsedRootPackage = JSON.parse(readFileSync(rootPackagePath, "utf-8"));
139
- if (!isRecord(parsedRootPackage)) {
132
+ let parsedRootPackage;
133
+ try {
134
+ parsedRootPackage = JSON.parse(readFileSync(rootPackagePath, "utf-8"));
135
+ } catch (error) {
136
+ problems.push(`Root package.json could not be read or parsed: ${extractMessage(error)}`);
137
+ return;
138
+ }
139
+ if (!isPlainObject(parsedRootPackage)) {
140
140
  return;
141
141
  }
142
142
  const engines = parsedRootPackage["engines"];
143
- if (isRecord(engines) && typeof engines["bun"] === "string") {
143
+ if (isPlainObject(engines) && typeof engines["bun"] === "string") {
144
144
  const engineBun = normalizeVersionRange(engines["bun"]);
145
145
  if (engineBun !== bunVersionFile) {
146
146
  problems.push(`Bun version drift: .bun-version is ${bunVersionFile} but engines.bun is ${engines["bun"]}`);
@@ -155,7 +155,7 @@ function validateBunVersionConsistency(workspaceRoot, problems) {
155
155
  }
156
156
  let bunTypesVersion;
157
157
  const catalog = parsedRootPackage["catalog"];
158
- if (isRecord(catalog) && typeof catalog["@types/bun"] === "string") {
158
+ if (isPlainObject(catalog) && typeof catalog["@types/bun"] === "string") {
159
159
  bunTypesVersion = catalog["@types/bun"];
160
160
  }
161
161
  if (!bunTypesVersion) {
@@ -219,8 +219,7 @@ async function runCheckPresetVersions(options) {
219
219
  ok: problems.length === 0
220
220
  });
221
221
  } catch (error) {
222
- const message = error instanceof Error ? error.message : "Failed to check preset versions";
223
- return Result.err(new CheckPresetVersionsError(message));
222
+ return Result.err(new CheckPresetVersionsError(extractMessage(error)));
224
223
  }
225
224
  }
226
225
  async function printCheckPresetVersionsResult(result, options) {
@@ -298,4 +297,4 @@ if (import.meta.main) {
298
297
  });
299
298
  }
300
299
 
301
- export { CheckPresetVersionsError, runCheckPresetVersions, printCheckPresetVersionsResult, runCheckPresetVersionsFromArgv };
300
+ export { EXTERNAL_TEMPLATE_VERSION, CheckPresetVersionsError, validatePresetDeps, runCheckPresetVersions, printCheckPresetVersionsResult, runCheckPresetVersionsFromArgv };
@@ -1,4 +1,4 @@
1
1
  import "../shared/outfitter-y784nh31.js";
2
- import { INIT_TARGET_IDS, READY_TARGET_IDS, SCAFFOLD_TARGET_IDS, TARGET_IDS, TARGET_REGISTRY, getInitTarget, getReadyTarget, getScaffoldTarget, getTarget, listTargets, resolvePlacement } from "../shared/outfitter-5r6q2749.js";
3
- import { TargetCategory, TargetDefinition, TargetId, TargetScope, TargetStatus } from "../shared/outfitter-58rn1sj1.js";
2
+ import { INIT_TARGET_IDS, READY_TARGET_IDS, SCAFFOLD_TARGET_IDS, TARGET_IDS, TARGET_REGISTRY, getInitTarget, getReadyTarget, getScaffoldTarget, getTarget, listTargets, resolvePlacement } from "../shared/outfitter-pw74st5t.js";
3
+ import { TargetCategory, TargetDefinition, TargetId, TargetScope, TargetStatus } from "../shared/outfitter-gsjbcta2.js";
4
4
  export { resolvePlacement, listTargets, getTarget, getScaffoldTarget, getReadyTarget, getInitTarget, TargetStatus, TargetScope, TargetId, TargetDefinition, TargetCategory, TARGET_REGISTRY, TARGET_IDS, SCAFFOLD_TARGET_IDS, READY_TARGET_IDS, INIT_TARGET_IDS };
@@ -1,3 +1,3 @@
1
- import { INIT_TARGET_IDS, READY_TARGET_IDS, SCAFFOLD_TARGET_IDS, TARGET_IDS, TARGET_REGISTRY, getInitTarget, getReadyTarget, getScaffoldTarget, getTarget, listTargets, resolvePlacement } from "../shared/outfitter-5r6q2749.js";
2
- import "../shared/outfitter-58rn1sj1.js";
1
+ import { INIT_TARGET_IDS, READY_TARGET_IDS, SCAFFOLD_TARGET_IDS, TARGET_IDS, TARGET_REGISTRY, getInitTarget, getReadyTarget, getScaffoldTarget, getTarget, listTargets, resolvePlacement } from "../shared/outfitter-pw74st5t.js";
2
+ import "../shared/outfitter-gsjbcta2.js";
3
3
  export { resolvePlacement, listTargets, getTarget, getScaffoldTarget, getReadyTarget, getInitTarget, TARGET_REGISTRY, TARGET_IDS, SCAFFOLD_TARGET_IDS, READY_TARGET_IDS, INIT_TARGET_IDS };
@@ -4,7 +4,6 @@ import"../shared/outfitter-eepj7rf7.js";
4
4
  // apps/outfitter/src/targets/registry.ts
5
5
  import { NotFoundError, Result, ValidationError } from "@outfitter/contracts";
6
6
  var TARGET_ALIASES = new Map([
7
- ["basic", "minimal"],
8
7
  ["lib", "library"]
9
8
  ]);
10
9
  var TARGET_REGISTRY = new Map([
@@ -21,6 +20,19 @@ var TARGET_REGISTRY = new Map([
21
20
  scope: "init-only"
22
21
  }
23
22
  ],
23
+ [
24
+ "basic",
25
+ {
26
+ id: "basic",
27
+ description: "Basic Bun + TypeScript project with Outfitter conventions",
28
+ category: "library",
29
+ placement: "packages",
30
+ presetDir: "basic",
31
+ defaultBlocks: ["scaffolding"],
32
+ status: "ready",
33
+ scope: "init-only"
34
+ }
35
+ ],
24
36
  [
25
37
  "cli",
26
38
  {
@@ -1,2 +1,2 @@
1
- import { TargetCategory, TargetDefinition, TargetId, TargetScope, TargetStatus } from "../shared/outfitter-58rn1sj1.js";
1
+ import { TargetCategory, TargetDefinition, TargetId, TargetScope, TargetStatus } from "../shared/outfitter-gsjbcta2.js";
2
2
  export { TargetStatus, TargetScope, TargetId, TargetDefinition, TargetCategory };
package/package.json CHANGED
@@ -1,29 +1,11 @@
1
1
  {
2
2
  "name": "outfitter",
3
- "version": "0.3.4",
4
3
  "description": "Outfitter umbrella CLI for scaffolding and project management",
5
- "keywords": [
6
- "bun",
7
- "cli",
8
- "outfitter",
9
- "scaffolding",
10
- "typescript"
11
- ],
12
- "license": "MIT",
13
- "repository": {
14
- "type": "git",
15
- "url": "https://github.com/outfitter-dev/outfitter.git",
16
- "directory": "apps/outfitter"
17
- },
18
- "bin": {
19
- "out": "./dist/cli.js",
20
- "outfitter": "./dist/cli.js"
21
- },
4
+ "version": "0.4.0",
5
+ "type": "module",
22
6
  "files": [
23
7
  "dist"
24
8
  ],
25
- "type": "module",
26
- "sideEffects": false,
27
9
  "module": "./dist/index.js",
28
10
  "types": "./dist/index.d.ts",
29
11
  "exports": {
@@ -57,6 +39,12 @@
57
39
  "default": "./dist/commands/check-action-ceremony.js"
58
40
  }
59
41
  },
42
+ "./commands/check-action-registry": {
43
+ "import": {
44
+ "types": "./dist/commands/check-action-registry.d.ts",
45
+ "default": "./dist/commands/check-action-registry.js"
46
+ }
47
+ },
60
48
  "./commands/check-docs-sentinel": {
61
49
  "import": {
62
50
  "types": "./dist/commands/check-docs-sentinel.d.ts",
@@ -225,6 +213,12 @@
225
213
  "default": "./dist/commands/upgrade-apply.js"
226
214
  }
227
215
  },
216
+ "./commands/upgrade-codemod-builder": {
217
+ "import": {
218
+ "types": "./dist/commands/upgrade-codemod-builder.d.ts",
219
+ "default": "./dist/commands/upgrade-codemod-builder.js"
220
+ }
221
+ },
228
222
  "./commands/upgrade-codemods": {
229
223
  "import": {
230
224
  "types": "./dist/commands/upgrade-codemods.d.ts",
@@ -345,6 +339,12 @@
345
339
  "default": "./dist/engine/names.js"
346
340
  }
347
341
  },
342
+ "./engine/package-json": {
343
+ "import": {
344
+ "types": "./dist/engine/package-json.d.ts",
345
+ "default": "./dist/engine/package-json.js"
346
+ }
347
+ },
348
348
  "./engine/post-scaffold": {
349
349
  "import": {
350
350
  "types": "./dist/engine/post-scaffold.d.ts",
@@ -363,12 +363,6 @@
363
363
  "default": "./dist/engine/render-plan.js"
364
364
  }
365
365
  },
366
- "./engine/template": {
367
- "import": {
368
- "types": "./dist/engine/template.d.ts",
369
- "default": "./dist/engine/template.js"
370
- }
371
- },
372
366
  "./engine/types": {
373
367
  "import": {
374
368
  "types": "./dist/engine/types.d.ts",
@@ -388,6 +382,36 @@
388
382
  }
389
383
  },
390
384
  "./package.json": "./package.json",
385
+ "./scaffold-e2e/config": {
386
+ "import": {
387
+ "types": "./dist/scaffold-e2e/config.d.ts",
388
+ "default": "./dist/scaffold-e2e/config.js"
389
+ }
390
+ },
391
+ "./scaffold-e2e/runner": {
392
+ "import": {
393
+ "types": "./dist/scaffold-e2e/runner.d.ts",
394
+ "default": "./dist/scaffold-e2e/runner.js"
395
+ }
396
+ },
397
+ "./scaffold-e2e/template-guardrails": {
398
+ "import": {
399
+ "types": "./dist/scaffold-e2e/template-guardrails.d.ts",
400
+ "default": "./dist/scaffold-e2e/template-guardrails.js"
401
+ }
402
+ },
403
+ "./scaffold-e2e/workspace": {
404
+ "import": {
405
+ "types": "./dist/scaffold-e2e/workspace.d.ts",
406
+ "default": "./dist/scaffold-e2e/workspace.js"
407
+ }
408
+ },
409
+ "./scripts/scaffold-e2e": {
410
+ "import": {
411
+ "types": "./dist/scripts/scaffold-e2e.d.ts",
412
+ "default": "./dist/scripts/scaffold-e2e.js"
413
+ }
414
+ },
391
415
  "./targets": {
392
416
  "import": {
393
417
  "types": "./dist/targets/index.d.ts",
@@ -407,10 +431,31 @@
407
431
  }
408
432
  }
409
433
  },
434
+ "keywords": [
435
+ "bun",
436
+ "cli",
437
+ "outfitter",
438
+ "scaffolding",
439
+ "typescript"
440
+ ],
441
+ "license": "MIT",
442
+ "repository": {
443
+ "type": "git",
444
+ "url": "https://github.com/outfitter-dev/outfitter.git",
445
+ "directory": "apps/outfitter"
446
+ },
447
+ "bin": {
448
+ "out": "./dist/cli.js",
449
+ "outfitter": "./dist/cli.js"
450
+ },
451
+ "sideEffects": false,
410
452
  "scripts": {
411
- "build": "cd ../.. && bunup --filter outfitter",
453
+ "build": "cd ../.. && bash ./scripts/run-bunup-with-lock.sh bunup --filter outfitter",
412
454
  "postbuild": "bun link",
413
455
  "dev": "bun run src/cli.ts",
456
+ "scaffold:e2e:ci": "bun run ./src/scripts/scaffold-e2e.ts --ci",
457
+ "scaffold:e2e": "bun run ./src/scripts/scaffold-e2e.ts",
458
+ "scaffold:e2e:clean": "bun run ./src/scripts/scaffold-e2e.ts --clean",
414
459
  "test": "bun test",
415
460
  "test:init-integration": "bun test ./src/__tests__/init-*.test.ts",
416
461
  "test:upgrade-integration": "bun test ./src/__tests__/upgrade-integration-*.test.ts",
@@ -425,23 +470,24 @@
425
470
  },
426
471
  "dependencies": {
427
472
  "@clack/prompts": "^1.0.1",
428
- "@outfitter/cli": "0.5.3",
429
- "@outfitter/config": "0.3.4",
430
- "@outfitter/contracts": "0.4.2",
431
- "@outfitter/daemon": "0.2.5",
432
- "@outfitter/docs": "0.2.0",
433
- "@outfitter/logging": "0.4.2",
434
- "@outfitter/mcp": "0.4.3",
435
- "@outfitter/oxlint-plugin": "0.1.1",
436
- "@outfitter/presets": "0.2.1",
437
- "@outfitter/tooling": "0.3.4",
438
- "@outfitter/tui": "0.2.2",
439
- "@outfitter/types": "0.2.4",
473
+ "@outfitter/cli": "1.0.0",
474
+ "@outfitter/config": "0.4.0",
475
+ "@outfitter/contracts": "0.5.0",
476
+ "@outfitter/daemon": "0.2.6",
477
+ "@outfitter/docs": "0.2.1",
478
+ "@outfitter/logging": "0.4.3",
479
+ "@outfitter/mcp": "0.5.0",
480
+ "@outfitter/oxlint-plugin": "0.2.0",
481
+ "@outfitter/presets": "0.3.0",
482
+ "@outfitter/tooling": "0.3.5",
483
+ "@outfitter/tui": "0.2.3",
484
+ "@outfitter/types": "0.2.5",
440
485
  "commander": "^14.0.2",
441
486
  "typescript": "^5.9.3",
442
487
  "zod": "^4.3.5"
443
488
  },
444
489
  "devDependencies": {
490
+ "@outfitter/schema": "0.2.4",
445
491
  "@types/bun": "^1.3.9",
446
492
  "@types/node": "^25.3.0"
447
493
  },
@@ -1,4 +0,0 @@
1
- import { CliOutputMode } from "../shared/outfitter-a79xrm12.js";
2
- import { OutputMode } from "@outfitter/cli/types";
3
- declare function resolveDocsOutputMode(flags: Record<string, unknown>, presetOutputMode: OutputMode): CliOutputMode;
4
- export { resolveDocsOutputMode };
@@ -1,8 +0,0 @@
1
- // @bun
2
- import {
3
- resolveDocsOutputMode
4
- } from "../shared/outfitter-ec83h4v2.js";
5
- import"../shared/outfitter-eepj7rf7.js";
6
- export {
7
- resolveDocsOutputMode
8
- };
@@ -1,4 +0,0 @@
1
- import { copyTemplateFiles, getOutputFilename, getTemplatesDir, isBinaryFile, replacePlaceholders } from "../shared/outfitter-fbvfd5zq.js";
2
- import "../shared/outfitter-6rtcemk7.js";
3
- import "../shared/outfitter-cyvr4r8d.js";
4
- export { replacePlaceholders, isBinaryFile, getTemplatesDir, getOutputFilename, copyTemplateFiles };