outfitter 0.2.7 → 0.3.2

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 (203) hide show
  1. package/README.md +1 -2
  2. package/dist/cli.js +1 -1
  3. package/dist/index.d.ts +5 -6
  4. package/dist/index.js +8 -7
  5. package/dist/shared/{chunk-x6644tk8.js → chunk-3pwh8ys4.js} +124 -154
  6. package/package.json +15 -11
  7. package/dist/actions.d.ts +0 -2
  8. package/dist/actions.js +0 -35
  9. package/dist/commands/add.d.ts +0 -54
  10. package/dist/commands/add.js +0 -16
  11. package/dist/commands/check-tsdoc.d.ts +0 -22
  12. package/dist/commands/check-tsdoc.js +0 -8
  13. package/dist/commands/check.d.ts +0 -91
  14. package/dist/commands/check.js +0 -14
  15. package/dist/commands/demo.d.ts +0 -21
  16. package/dist/commands/demo.js +0 -8
  17. package/dist/commands/docs-module-loader.d.ts +0 -2
  18. package/dist/commands/docs-module-loader.js +0 -8
  19. package/dist/commands/doctor.d.ts +0 -2
  20. package/dist/commands/doctor.js +0 -25
  21. package/dist/commands/init.d.ts +0 -7
  22. package/dist/commands/init.js +0 -32
  23. package/dist/commands/repo.d.ts +0 -3
  24. package/dist/commands/repo.js +0 -9
  25. package/dist/commands/scaffold.d.ts +0 -4
  26. package/dist/commands/scaffold.js +0 -32
  27. package/dist/commands/shared-deps.d.ts +0 -21
  28. package/dist/commands/shared-deps.js +0 -11
  29. package/dist/commands/upgrade-codemods.d.ts +0 -42
  30. package/dist/commands/upgrade-codemods.js +0 -15
  31. package/dist/commands/upgrade-planner.d.ts +0 -58
  32. package/dist/commands/upgrade-planner.js +0 -8
  33. package/dist/commands/upgrade-workspace.d.ts +0 -2
  34. package/dist/commands/upgrade-workspace.js +0 -16
  35. package/dist/commands/upgrade.d.ts +0 -221
  36. package/dist/commands/upgrade.js +0 -25
  37. package/dist/create/index.d.ts +0 -5
  38. package/dist/create/index.js +0 -30
  39. package/dist/create/planner.d.ts +0 -3
  40. package/dist/create/planner.js +0 -22
  41. package/dist/create/presets.d.ts +0 -3
  42. package/dist/create/presets.js +0 -12
  43. package/dist/create/types.d.ts +0 -2
  44. package/dist/create/types.js +0 -1
  45. package/dist/engine/blocks.d.ts +0 -3
  46. package/dist/engine/blocks.js +0 -12
  47. package/dist/engine/collector.d.ts +0 -2
  48. package/dist/engine/collector.js +0 -8
  49. package/dist/engine/config.d.ts +0 -3
  50. package/dist/engine/config.js +0 -15
  51. package/dist/engine/dependency-versions.d.ts +0 -12
  52. package/dist/engine/dependency-versions.js +0 -12
  53. package/dist/engine/executor.d.ts +0 -3
  54. package/dist/engine/executor.js +0 -19
  55. package/dist/engine/index.d.ts +0 -8
  56. package/dist/engine/index.js +0 -68
  57. package/dist/engine/names.d.ts +0 -2
  58. package/dist/engine/names.js +0 -24
  59. package/dist/engine/post-scaffold.d.ts +0 -3
  60. package/dist/engine/post-scaffold.js +0 -8
  61. package/dist/engine/render-plan.d.ts +0 -7
  62. package/dist/engine/render-plan.js +0 -9
  63. package/dist/engine/template.d.ts +0 -3
  64. package/dist/engine/template.js +0 -17
  65. package/dist/engine/types.d.ts +0 -2
  66. package/dist/engine/types.js +0 -8
  67. package/dist/engine/workspace.d.ts +0 -3
  68. package/dist/engine/workspace.js +0 -20
  69. package/dist/manifest.d.ts +0 -71
  70. package/dist/manifest.js +0 -16
  71. package/dist/output-mode.d.ts +0 -2
  72. package/dist/output-mode.js +0 -10
  73. package/dist/shared/outfitter-109s75x0.d.ts +0 -76
  74. package/dist/shared/outfitter-1fy7byz5.js +0 -170
  75. package/dist/shared/outfitter-1h7k8xxt.js +0 -29
  76. package/dist/shared/outfitter-20f6a2n4.js +0 -35
  77. package/dist/shared/outfitter-344t1r38.js +0 -1
  78. package/dist/shared/outfitter-4q1zfmvc.js +0 -154
  79. package/dist/shared/outfitter-4s9meh3j.js +0 -221
  80. package/dist/shared/outfitter-5akzvppx.js +0 -125
  81. package/dist/shared/outfitter-5y646xzk.js +0 -301
  82. package/dist/shared/outfitter-5yjr404v.d.ts +0 -22
  83. package/dist/shared/outfitter-63gse8fv.js +0 -316
  84. package/dist/shared/outfitter-6bkqjk86.d.ts +0 -3
  85. package/dist/shared/outfitter-6fgk6adm.d.ts +0 -40
  86. package/dist/shared/outfitter-79vfxt6y.js +0 -269
  87. package/dist/shared/outfitter-7ch26yq8.js +0 -885
  88. package/dist/shared/outfitter-7r12fj7f.js +0 -30
  89. package/dist/shared/outfitter-8y2dfx6n.js +0 -11
  90. package/dist/shared/outfitter-9x1brcmq.js +0 -184
  91. package/dist/shared/outfitter-a79xrm12.d.ts +0 -17
  92. package/dist/shared/outfitter-amc4jbs1.d.ts +0 -50
  93. package/dist/shared/outfitter-bn9c8p2e.js +0 -204
  94. package/dist/shared/outfitter-bpr28y54.js +0 -70
  95. package/dist/shared/outfitter-dpj9erew.d.ts +0 -4
  96. package/dist/shared/outfitter-e9rrfekb.d.ts +0 -51
  97. package/dist/shared/outfitter-ehp18x1n.js +0 -1
  98. package/dist/shared/outfitter-f9znfhkn.d.ts +0 -5
  99. package/dist/shared/outfitter-fhnjpjwc.d.ts +0 -18
  100. package/dist/shared/outfitter-fn20r49x.d.ts +0 -5
  101. package/dist/shared/outfitter-h3q6ae6d.d.ts +0 -48
  102. package/dist/shared/outfitter-ha89qf8q.js +0 -132
  103. package/dist/shared/outfitter-hsp8vy5m.d.ts +0 -146
  104. package/dist/shared/outfitter-hvsaxgcp.js +0 -1
  105. package/dist/shared/outfitter-j833sxws.js +0 -61
  106. package/dist/shared/outfitter-ksyvwmb5.js +0 -191
  107. package/dist/shared/outfitter-m3ehh37q.d.ts +0 -22
  108. package/dist/shared/outfitter-m44n0qzw.js +0 -161
  109. package/dist/shared/outfitter-mdt37hqm.js +0 -4
  110. package/dist/shared/outfitter-mt7d1ek2.js +0 -698
  111. package/dist/shared/outfitter-mtbpabf3.js +0 -91
  112. package/dist/shared/outfitter-n9g1zk4x.d.ts +0 -66
  113. package/dist/shared/outfitter-p71qb0f0.js +0 -82
  114. package/dist/shared/outfitter-pcj9gg2g.js +0 -909
  115. package/dist/shared/outfitter-pj9vp00r.js +0 -601
  116. package/dist/shared/outfitter-qakwgrrh.d.ts +0 -4
  117. package/dist/shared/outfitter-r419zfgs.d.ts +0 -30
  118. package/dist/shared/outfitter-s7jetkge.d.ts +0 -18
  119. package/dist/shared/outfitter-ttjr95y9.js +0 -98
  120. package/dist/shared/outfitter-vh4xgb93.js +0 -35
  121. package/dist/shared/outfitter-w1j80j1r.js +0 -326
  122. package/dist/shared/outfitter-xe5mzgdc.js +0 -208
  123. package/dist/shared/outfitter-ybbazsxq.d.ts +0 -14
  124. package/dist/shared/outfitter-yraebrmw.d.ts +0 -5
  125. package/dist/shared/outfitter-yvksv5qb.js +0 -322
  126. package/dist/shared/outfitter-z0we32cp.d.ts +0 -63
  127. package/dist/shared/outfitter-z5sx06qe.d.ts +0 -25
  128. package/dist/shared/outfitter-zwyvewr1.js +0 -36
  129. package/dist/targets/index.d.ts +0 -4
  130. package/dist/targets/index.js +0 -29
  131. package/dist/targets/registry.d.ts +0 -3
  132. package/dist/targets/registry.js +0 -28
  133. package/dist/targets/types.d.ts +0 -2
  134. package/dist/targets/types.js +0 -1
  135. package/template-versions.json +0 -22
  136. package/templates/.gitkeep +0 -0
  137. package/templates/basic/.gitignore.template +0 -30
  138. package/templates/basic/.lefthook.yml.template +0 -26
  139. package/templates/basic/package.json.template +0 -46
  140. package/templates/basic/src/index.ts.template +0 -26
  141. package/templates/basic/tsconfig.json.template +0 -34
  142. package/templates/cli/.gitignore.template +0 -4
  143. package/templates/cli/.lefthook.yml.template +0 -26
  144. package/templates/cli/README.md.template +0 -35
  145. package/templates/cli/biome.json.template +0 -4
  146. package/templates/cli/package.json.template +0 -53
  147. package/templates/cli/src/cli.ts.template +0 -8
  148. package/templates/cli/src/index.ts.template +0 -7
  149. package/templates/cli/src/program.ts.template +0 -31
  150. package/templates/cli/tsconfig.json.template +0 -34
  151. package/templates/daemon/.gitignore.template +0 -4
  152. package/templates/daemon/.lefthook.yml.template +0 -26
  153. package/templates/daemon/README.md.template +0 -67
  154. package/templates/daemon/biome.json.template +0 -4
  155. package/templates/daemon/package.json.template +0 -56
  156. package/templates/daemon/src/cli.ts.template +0 -96
  157. package/templates/daemon/src/daemon-main.ts.template +0 -79
  158. package/templates/daemon/src/daemon.ts.template +0 -11
  159. package/templates/daemon/src/index.ts.template +0 -7
  160. package/templates/daemon/tsconfig.json.template +0 -23
  161. package/templates/full-stack/.gitignore.template +0 -30
  162. package/templates/full-stack/README.md.template +0 -30
  163. package/templates/full-stack/apps/cli/package.json.template +0 -39
  164. package/templates/full-stack/apps/cli/src/cli.ts.template +0 -24
  165. package/templates/full-stack/apps/cli/src/index.test.ts.template +0 -18
  166. package/templates/full-stack/apps/cli/src/index.ts.template +0 -5
  167. package/templates/full-stack/apps/cli/tsconfig.json.template +0 -37
  168. package/templates/full-stack/apps/mcp/package.json.template +0 -40
  169. package/templates/full-stack/apps/mcp/src/index.test.ts.template +0 -18
  170. package/templates/full-stack/apps/mcp/src/index.ts.template +0 -6
  171. package/templates/full-stack/apps/mcp/src/mcp.ts.template +0 -22
  172. package/templates/full-stack/apps/mcp/src/server.ts.template +0 -10
  173. package/templates/full-stack/apps/mcp/tsconfig.json.template +0 -37
  174. package/templates/full-stack/package.json.template +0 -16
  175. package/templates/full-stack/packages/core/package.json.template +0 -36
  176. package/templates/full-stack/packages/core/src/handlers.ts.template +0 -31
  177. package/templates/full-stack/packages/core/src/index.test.ts.template +0 -30
  178. package/templates/full-stack/packages/core/src/index.ts.template +0 -8
  179. package/templates/full-stack/packages/core/src/types.ts.template +0 -13
  180. package/templates/full-stack/packages/core/tsconfig.json.template +0 -34
  181. package/templates/library/.gitignore.template +0 -30
  182. package/templates/library/README.md.template +0 -29
  183. package/templates/library/bunup.config.ts.template +0 -20
  184. package/templates/library/package.json.template +0 -55
  185. package/templates/library/src/handlers.ts.template +0 -31
  186. package/templates/library/src/index.test.ts.template +0 -35
  187. package/templates/library/src/index.ts.template +0 -8
  188. package/templates/library/src/types.ts.template +0 -13
  189. package/templates/library/tsconfig.json.template +0 -34
  190. package/templates/mcp/.gitignore.template +0 -4
  191. package/templates/mcp/.lefthook.yml.template +0 -26
  192. package/templates/mcp/README.md.template +0 -54
  193. package/templates/mcp/biome.json.template +0 -4
  194. package/templates/mcp/package.json.template +0 -53
  195. package/templates/mcp/src/index.ts.template +0 -7
  196. package/templates/mcp/src/mcp.ts.template +0 -33
  197. package/templates/mcp/src/server.ts.template +0 -8
  198. package/templates/mcp/tsconfig.json.template +0 -23
  199. package/templates/minimal/.gitignore.template +0 -30
  200. package/templates/minimal/.lefthook.yml.template +0 -26
  201. package/templates/minimal/package.json.template +0 -53
  202. package/templates/minimal/src/index.ts.template +0 -26
  203. package/templates/minimal/tsconfig.json.template +0 -34
@@ -1,885 +0,0 @@
1
- // @bun
2
- import {
3
- printScaffoldResults,
4
- runScaffold
5
- } from "./outfitter-pj9vp00r.js";
6
- import {
7
- printInitResults,
8
- runInit
9
- } from "./outfitter-mt7d1ek2.js";
10
- import {
11
- runDemo
12
- } from "./outfitter-ksyvwmb5.js";
13
- import {
14
- printCheckResults,
15
- runCheck
16
- } from "./outfitter-w1j80j1r.js";
17
- import {
18
- printDoctorResults,
19
- runDoctor
20
- } from "./outfitter-5y646xzk.js";
21
- import {
22
- runCheckTsdoc
23
- } from "./outfitter-63gse8fv.js";
24
- import {
25
- printUpgradeResults,
26
- runUpgrade
27
- } from "./outfitter-pcj9gg2g.js";
28
- import {
29
- listBlocks,
30
- printAddResults,
31
- runAdd
32
- } from "./outfitter-79vfxt6y.js";
33
- import {
34
- resolveOutputModeFromContext,
35
- resolveStructuredOutputMode
36
- } from "./outfitter-7r12fj7f.js";
37
-
38
- // apps/outfitter/src/actions.ts
39
- import { resolve } from "path";
40
- import { output } from "@outfitter/cli";
41
- import { actionCliPresets } from "@outfitter/cli/actions";
42
- import {
43
- booleanFlagPreset,
44
- cwdPreset,
45
- dryRunPreset,
46
- forcePreset,
47
- interactionPreset,
48
- verbosePreset
49
- } from "@outfitter/cli/flags";
50
- import { jqPreset, outputModePreset } from "@outfitter/cli/query";
51
- import {
52
- createActionRegistry,
53
- defineAction,
54
- InternalError,
55
- Result,
56
- ValidationError
57
- } from "@outfitter/contracts";
58
- import { z } from "zod";
59
- var outputModeSchema = z.enum(["human", "json", "jsonl"]).default("human");
60
- var initPresetValues = [
61
- "minimal",
62
- "cli",
63
- "mcp",
64
- "daemon",
65
- "library",
66
- "full-stack",
67
- "lib"
68
- ];
69
- function normalizeInitPreset(preset) {
70
- if (preset === undefined) {
71
- return;
72
- }
73
- return preset === "lib" ? "library" : preset;
74
- }
75
- var initInputSchema = z.object({
76
- targetDir: z.string(),
77
- name: z.string().optional(),
78
- bin: z.string().optional(),
79
- preset: z.enum(initPresetValues).optional(),
80
- template: z.string().optional(),
81
- structure: z.enum(["single", "workspace"]).optional(),
82
- workspaceName: z.string().optional(),
83
- local: z.boolean().optional(),
84
- force: z.boolean(),
85
- with: z.string().optional(),
86
- noTooling: z.boolean().optional(),
87
- yes: z.boolean().optional(),
88
- dryRun: z.boolean().optional(),
89
- skipInstall: z.boolean().optional(),
90
- skipGit: z.boolean().optional(),
91
- skipCommit: z.boolean().optional(),
92
- installTimeout: z.number().optional(),
93
- outputMode: outputModeSchema
94
- });
95
- var scaffoldInputSchema = z.object({
96
- target: z.string(),
97
- name: z.string().optional(),
98
- force: z.boolean(),
99
- skipInstall: z.boolean(),
100
- dryRun: z.boolean(),
101
- with: z.string().optional(),
102
- noTooling: z.boolean().optional(),
103
- local: z.boolean().optional(),
104
- installTimeout: z.number().optional(),
105
- cwd: z.string(),
106
- outputMode: outputModeSchema
107
- });
108
- var doctorInputSchema = z.object({
109
- cwd: z.string(),
110
- outputMode: outputModeSchema
111
- });
112
- function resolveStringFlag(value) {
113
- return typeof value === "string" && value.length > 0 ? value : undefined;
114
- }
115
- function resolveNoToolingFlag(flags) {
116
- if (typeof flags.noTooling === "boolean") {
117
- return !flags.noTooling;
118
- }
119
- if (typeof flags.tooling === "boolean") {
120
- if (!flags.tooling) {
121
- return true;
122
- }
123
- return process.argv.includes("--tooling") ? false : undefined;
124
- }
125
- return;
126
- }
127
- function resolveLocalFlag(flags) {
128
- if (flags.local === true || flags.workspace === true) {
129
- return true;
130
- }
131
- return;
132
- }
133
- function resolveInitOptions(context, presetOverride) {
134
- const flags = context.flags;
135
- const { force, dryRun, yes } = initSharedFlags.resolve(context);
136
- const targetDir = context.args[0] ?? process.cwd();
137
- const name = resolveStringFlag(flags.name);
138
- const bin = resolveStringFlag(flags.bin);
139
- const preset = normalizeInitPreset(presetOverride ?? resolveStringFlag(flags.preset));
140
- const template = resolveStringFlag(flags.template);
141
- const structure = resolveStringFlag(flags.structure);
142
- const workspaceName = resolveStringFlag(flags.workspaceName);
143
- const local = resolveLocalFlag(flags);
144
- const withBlocks = resolveStringFlag(flags.with);
145
- const noTooling = resolveNoToolingFlag(flags);
146
- const skipInstall = Boolean(flags.skipInstall ?? context.flags["skip-install"]);
147
- const skipGit = Boolean(flags.skipGit ?? context.flags["skip-git"]);
148
- const skipCommit = Boolean(flags.skipCommit ?? context.flags["skip-commit"]);
149
- const installTimeoutValue = flags.installTimeout;
150
- let installTimeout;
151
- if (typeof installTimeoutValue === "string") {
152
- installTimeout = Number.parseInt(installTimeoutValue, 10);
153
- } else if (typeof installTimeoutValue === "number") {
154
- installTimeout = installTimeoutValue;
155
- }
156
- const outputMode = resolveOutputModeFromContext(context.flags);
157
- return {
158
- targetDir,
159
- name,
160
- ...preset ? { preset } : {},
161
- ...template ? { template } : {},
162
- ...structure ? { structure } : {},
163
- ...workspaceName ? { workspaceName } : {},
164
- force,
165
- ...local !== undefined ? { local } : {},
166
- ...withBlocks ? { with: withBlocks } : {},
167
- ...noTooling !== undefined ? { noTooling } : {},
168
- ...bin ? { bin } : {},
169
- ...yes ? { yes } : {},
170
- ...dryRun ? { dryRun } : {},
171
- ...skipInstall ? { skipInstall } : {},
172
- ...skipGit ? { skipGit } : {},
173
- ...skipCommit ? { skipCommit } : {},
174
- ...installTimeout !== undefined ? { installTimeout } : {},
175
- outputMode
176
- };
177
- }
178
- function resolveScaffoldOptions(context) {
179
- const flags = context.flags;
180
- const { force, dryRun } = scaffoldSharedFlags.resolve(context);
181
- const outputMode = resolveOutputModeFromContext(context.flags);
182
- const noTooling = resolveNoToolingFlag(flags);
183
- const local = resolveLocalFlag(flags);
184
- const installTimeoutValue = flags.installTimeout;
185
- let installTimeout;
186
- if (typeof installTimeoutValue === "string") {
187
- installTimeout = Number.parseInt(installTimeoutValue, 10);
188
- } else if (typeof installTimeoutValue === "number") {
189
- installTimeout = installTimeoutValue;
190
- }
191
- return {
192
- target: String(context.args[0] ?? ""),
193
- name: resolveStringFlag(context.args[1]),
194
- force,
195
- skipInstall: Boolean(flags.skipInstall ?? context.flags["skip-install"]),
196
- dryRun,
197
- ...local !== undefined ? { local } : {},
198
- with: resolveStringFlag(flags.with),
199
- ...noTooling !== undefined ? { noTooling } : {},
200
- ...installTimeout !== undefined ? { installTimeout } : {},
201
- cwd: process.cwd(),
202
- outputMode
203
- };
204
- }
205
- var commonInitOptions = [
206
- {
207
- flags: "-n, --name <name>",
208
- description: "Package name (defaults to directory name)"
209
- },
210
- {
211
- flags: "-b, --bin <name>",
212
- description: "Binary name (defaults to project name)"
213
- },
214
- {
215
- flags: "--local",
216
- description: "Use workspace:* for @outfitter dependencies"
217
- },
218
- {
219
- flags: "--workspace",
220
- description: "Alias for --local"
221
- },
222
- {
223
- flags: "--with <blocks>",
224
- description: "Tooling to add (comma-separated: scaffolding, claude, biome, lefthook, bootstrap)"
225
- },
226
- {
227
- flags: "--no-tooling",
228
- description: "Skip tooling setup"
229
- }
230
- ];
231
- var templateOption = {
232
- flags: "-t, --template <template>",
233
- description: "Template to use (deprecated, use --preset)"
234
- };
235
- var initSharedFlags = actionCliPresets(forcePreset(), dryRunPreset(), booleanFlagPreset({
236
- id: "initYes",
237
- key: "yes",
238
- flags: "-y, --yes",
239
- description: "Skip prompts and use defaults for missing values"
240
- }));
241
- function createInitAction(options) {
242
- const presetOption = {
243
- flags: "-p, --preset <preset>",
244
- description: "Preset to use (minimal, cli, mcp, daemon, library, full-stack, lib)"
245
- };
246
- const initOptions = [...commonInitOptions];
247
- initOptions.push(...initSharedFlags.options);
248
- initOptions.push({
249
- flags: "-s, --structure <mode>",
250
- description: "Project structure (single|workspace)"
251
- });
252
- initOptions.push({
253
- flags: "--workspace-name <name>",
254
- description: "Workspace root package name"
255
- });
256
- initOptions.push({
257
- flags: "--skip-install",
258
- description: "Skip bun install",
259
- defaultValue: false
260
- });
261
- initOptions.push({
262
- flags: "--skip-git",
263
- description: "Skip git init and initial commit",
264
- defaultValue: false
265
- });
266
- initOptions.push({
267
- flags: "--skip-commit",
268
- description: "Skip initial commit only",
269
- defaultValue: false
270
- });
271
- initOptions.push({
272
- flags: "--install-timeout <ms>",
273
- description: "bun install timeout in milliseconds"
274
- });
275
- if (options.includePresetOption) {
276
- initOptions.push(presetOption);
277
- }
278
- if (options.includeTemplateOption) {
279
- initOptions.push(templateOption);
280
- }
281
- return defineAction({
282
- id: options.id,
283
- description: options.description,
284
- surfaces: ["cli"],
285
- input: initInputSchema,
286
- cli: {
287
- group: "init",
288
- command: options.command,
289
- description: options.description,
290
- options: initOptions,
291
- mapInput: (context) => resolveInitOptions(context, options.presetOverride)
292
- },
293
- handler: async (input) => {
294
- const { outputMode, ...initInput } = input;
295
- const result = await runInit(initInput);
296
- if (result.isErr()) {
297
- return Result.err(new InternalError({
298
- message: result.error.message,
299
- context: { action: options.id }
300
- }));
301
- }
302
- await printInitResults(result.value, { mode: outputMode });
303
- return Result.ok(result.value);
304
- }
305
- });
306
- }
307
- var scaffoldSharedFlags = actionCliPresets(forcePreset(), dryRunPreset());
308
- var addSharedFlags = actionCliPresets(forcePreset(), dryRunPreset());
309
- var createAction = defineAction({
310
- id: "create",
311
- description: "Removed - use 'outfitter init' instead",
312
- surfaces: ["cli"],
313
- input: z.object({}).passthrough(),
314
- cli: {
315
- command: "create [directory]",
316
- description: "Removed - use 'outfitter init' instead",
317
- options: [],
318
- mapInput: () => ({})
319
- },
320
- handler: async () => Result.err(new InternalError({
321
- message: [
322
- "The 'create' command has been removed.",
323
- "",
324
- "Use 'outfitter init' instead. It supports everything 'create' did:",
325
- "",
326
- " Interactive mode: outfitter init my-project",
327
- " With preset: outfitter init my-project --preset cli",
328
- " Skip prompts: outfitter init my-project --preset cli --yes",
329
- " Workspace: outfitter init my-project --preset cli --structure workspace",
330
- "",
331
- "See 'outfitter init --help' for full options."
332
- ].join("\\n"),
333
- context: { action: "create" }
334
- }))
335
- });
336
- var scaffoldAction = defineAction({
337
- id: "scaffold",
338
- description: "Add a capability to an existing project",
339
- surfaces: ["cli"],
340
- input: scaffoldInputSchema,
341
- cli: {
342
- command: "scaffold <target> [name]",
343
- description: "Add a capability (cli, mcp, daemon, lib, ...) to an existing project",
344
- options: [
345
- ...scaffoldSharedFlags.options,
346
- {
347
- flags: "--skip-install",
348
- description: "Skip bun install",
349
- defaultValue: false
350
- },
351
- {
352
- flags: "--with <blocks>",
353
- description: "Comma-separated tooling blocks to add"
354
- },
355
- {
356
- flags: "--no-tooling",
357
- description: "Skip default tooling blocks"
358
- },
359
- {
360
- flags: "--local",
361
- description: "Use workspace:* for @outfitter dependencies"
362
- },
363
- {
364
- flags: "--install-timeout <ms>",
365
- description: "bun install timeout in milliseconds"
366
- }
367
- ],
368
- mapInput: resolveScaffoldOptions
369
- },
370
- handler: async (input) => {
371
- const { outputMode, ...scaffoldInput } = input;
372
- const result = await runScaffold(scaffoldInput);
373
- if (result.isErr()) {
374
- return Result.err(new InternalError({
375
- message: result.error.message,
376
- context: { action: "scaffold" }
377
- }));
378
- }
379
- await printScaffoldResults(result.value, { mode: outputMode });
380
- return Result.ok(result.value);
381
- }
382
- });
383
- var demoInputSchema = z.object({
384
- section: z.string().optional(),
385
- list: z.boolean().optional(),
386
- animate: z.boolean().optional(),
387
- outputMode: outputModeSchema
388
- });
389
- var demoAction = defineAction({
390
- id: "demo",
391
- description: "Run the CLI demo app",
392
- surfaces: ["cli"],
393
- input: demoInputSchema,
394
- cli: {
395
- command: "demo [section]",
396
- description: "Run the CLI demo app",
397
- options: [
398
- {
399
- flags: "-l, --list",
400
- description: "List available demo sections",
401
- defaultValue: false
402
- },
403
- {
404
- flags: "-a, --animate",
405
- description: "Run animated demo (spinners only)",
406
- defaultValue: false
407
- }
408
- ],
409
- mapInput: (context) => {
410
- const outputMode = resolveOutputModeFromContext(context.flags);
411
- return {
412
- section: context.args[0],
413
- list: Boolean(context.flags["list"]),
414
- animate: Boolean(context.flags["animate"]),
415
- outputMode
416
- };
417
- }
418
- },
419
- handler: async (input) => {
420
- const { outputMode, ...demoInput } = input;
421
- try {
422
- const result = await runDemo({ ...demoInput, outputMode });
423
- if (result.exitCode !== 0) {
424
- process.exit(result.exitCode);
425
- }
426
- return Result.ok(result);
427
- } catch (error) {
428
- return Result.err(new InternalError({
429
- message: error instanceof Error ? error.message : "Failed to run demo",
430
- context: { action: "demo" }
431
- }));
432
- }
433
- }
434
- });
435
- var doctorCwd = cwdPreset();
436
- var doctorAction = defineAction({
437
- id: "doctor",
438
- description: "Validate environment and dependencies",
439
- surfaces: ["cli"],
440
- input: doctorInputSchema,
441
- cli: {
442
- command: "doctor",
443
- description: "Validate environment and dependencies",
444
- options: [...doctorCwd.options],
445
- mapInput: (context) => {
446
- const outputMode = resolveOutputModeFromContext(context.flags);
447
- const { cwd: rawCwd } = doctorCwd.resolve(context.flags);
448
- const cwd = resolve(process.cwd(), rawCwd);
449
- return {
450
- cwd,
451
- outputMode
452
- };
453
- }
454
- },
455
- handler: async (input) => {
456
- const { outputMode, ...doctorInput } = input;
457
- const result = await runDoctor(doctorInput);
458
- await printDoctorResults(result, { mode: outputMode });
459
- if (result.exitCode !== 0) {
460
- process.exit(result.exitCode);
461
- }
462
- return Result.ok(result);
463
- }
464
- });
465
- var addInputSchema = z.object({
466
- block: z.string(),
467
- force: z.boolean(),
468
- dryRun: z.boolean(),
469
- cwd: z.string().optional(),
470
- outputMode: outputModeSchema
471
- });
472
- var addCwd = cwdPreset();
473
- var addAction = defineAction({
474
- id: "add",
475
- description: "Add a block from the registry to your project",
476
- surfaces: ["cli"],
477
- input: addInputSchema,
478
- cli: {
479
- group: "add",
480
- command: "<block>",
481
- description: "Add a block from the registry (claude, biome, lefthook, bootstrap, scaffolding)",
482
- options: [...addSharedFlags.options, ...addCwd.options],
483
- mapInput: (context) => {
484
- const outputMode = resolveOutputModeFromContext(context.flags);
485
- const { force, dryRun } = addSharedFlags.resolve(context);
486
- const { cwd: rawCwd } = addCwd.resolve(context.flags);
487
- const cwd = resolve(process.cwd(), rawCwd);
488
- return {
489
- block: context.args[0],
490
- force,
491
- dryRun,
492
- cwd,
493
- outputMode
494
- };
495
- }
496
- },
497
- handler: async (input) => {
498
- const { outputMode, ...addInput } = input;
499
- const result = await runAdd(addInput);
500
- if (result.isErr()) {
501
- return Result.err(new InternalError({
502
- message: result.error.message,
503
- context: { action: "add" }
504
- }));
505
- }
506
- await printAddResults(result.value, addInput.dryRun, { mode: outputMode });
507
- return Result.ok(result.value);
508
- }
509
- });
510
- var listBlocksAction = defineAction({
511
- id: "add.list",
512
- description: "List available blocks",
513
- surfaces: ["cli"],
514
- input: z.object({ outputMode: outputModeSchema }),
515
- cli: {
516
- group: "add",
517
- command: "list",
518
- description: "List available blocks",
519
- mapInput: (context) => {
520
- const outputMode = resolveOutputModeFromContext(context.flags);
521
- return {
522
- outputMode
523
- };
524
- }
525
- },
526
- handler: async (input) => {
527
- const result = listBlocks();
528
- if (result.isErr()) {
529
- return Result.err(new InternalError({
530
- message: result.error.message,
531
- context: { action: "add.list" }
532
- }));
533
- }
534
- const structuredMode = resolveStructuredOutputMode(input.outputMode);
535
- if (structuredMode) {
536
- await output({ blocks: result.value }, { mode: structuredMode });
537
- } else {
538
- const lines = [
539
- "Available blocks:",
540
- ...result.value.map((block) => ` - ${block}`)
541
- ];
542
- await output(lines, { mode: "human" });
543
- }
544
- return Result.ok({ blocks: result.value });
545
- }
546
- });
547
- var checkInputSchema = z.object({
548
- cwd: z.string(),
549
- verbose: z.boolean(),
550
- block: z.string().optional(),
551
- outputMode: outputModeSchema
552
- });
553
- var checkVerbose = verbosePreset();
554
- var checkCwd = cwdPreset();
555
- var checkOutputMode = outputModePreset();
556
- var checkVerboseOptions = checkVerbose.options.map((option) => option.flags === "-v, --verbose" ? { ...option, description: "Show diffs for drifted files" } : option);
557
- var checkAction = defineAction({
558
- id: "check",
559
- description: "Compare local config blocks against the registry for drift detection",
560
- surfaces: ["cli"],
561
- input: checkInputSchema,
562
- cli: {
563
- group: "check",
564
- description: "Compare local config blocks against the registry for drift detection",
565
- options: [
566
- ...checkVerboseOptions,
567
- {
568
- flags: "-b, --block <name>",
569
- description: "Check a specific block only"
570
- },
571
- {
572
- flags: "--ci",
573
- description: "Deprecated: use --output json instead",
574
- defaultValue: false
575
- },
576
- ...checkOutputMode.options,
577
- ...checkCwd.options
578
- ],
579
- mapInput: (context) => {
580
- const { outputMode: presetOutputMode } = checkOutputMode.resolve(context.flags);
581
- const explicitOutput = typeof context.flags["output"] === "string";
582
- let outputMode;
583
- if (explicitOutput) {
584
- outputMode = resolveStructuredOutputMode(presetOutputMode) ?? "human";
585
- } else if (context.flags["ci"]) {
586
- outputMode = "json";
587
- } else if (process.env["OUTFITTER_JSONL"] === "1") {
588
- outputMode = "jsonl";
589
- } else if (process.env["OUTFITTER_JSON"] === "1") {
590
- outputMode = "json";
591
- } else {
592
- outputMode = "human";
593
- }
594
- const { verbose } = checkVerbose.resolve(context.flags);
595
- const { cwd: rawCwd } = checkCwd.resolve(context.flags);
596
- const cwd = resolve(process.cwd(), rawCwd);
597
- const block = resolveStringFlag(context.flags["block"]);
598
- return {
599
- cwd,
600
- verbose,
601
- ...block !== undefined ? { block } : {},
602
- outputMode
603
- };
604
- }
605
- },
606
- handler: async (input) => {
607
- const { outputMode, ...checkInput } = input;
608
- const result = await runCheck(checkInput);
609
- if (result.isErr()) {
610
- return Result.err(new InternalError({
611
- message: result.error.message,
612
- context: { action: "check" }
613
- }));
614
- }
615
- await printCheckResults(result.value, {
616
- mode: outputMode,
617
- verbose: checkInput.verbose
618
- });
619
- if (result.value.driftedCount > 0 || result.value.missingCount > 0) {
620
- process.exit(1);
621
- }
622
- return Result.ok(result.value);
623
- }
624
- });
625
- var checkTsdocInputSchema = z.object({
626
- strict: z.boolean(),
627
- minCoverage: z.number(),
628
- cwd: z.string(),
629
- outputMode: outputModeSchema,
630
- jq: z.string().optional(),
631
- summary: z.boolean(),
632
- level: z.enum(["documented", "partial", "undocumented"]).optional(),
633
- packages: z.array(z.string())
634
- });
635
- var checkTsdocOutputSchema = z.object({
636
- ok: z.boolean(),
637
- packages: z.array(z.object({
638
- name: z.string(),
639
- path: z.string(),
640
- declarations: z.array(z.object({
641
- name: z.string(),
642
- kind: z.string(),
643
- level: z.enum(["documented", "partial", "undocumented"]),
644
- file: z.string(),
645
- line: z.number()
646
- })),
647
- documented: z.number(),
648
- partial: z.number(),
649
- undocumented: z.number(),
650
- total: z.number(),
651
- percentage: z.number()
652
- })),
653
- summary: z.object({
654
- documented: z.number(),
655
- partial: z.number(),
656
- undocumented: z.number(),
657
- total: z.number(),
658
- percentage: z.number()
659
- })
660
- });
661
- var checkTsdocOutputMode = outputModePreset({ includeJsonl: true });
662
- var checkTsdocJq = jqPreset();
663
- var checkTsdocAction = defineAction({
664
- id: "check.tsdoc",
665
- description: "Check TSDoc coverage on exported declarations",
666
- surfaces: ["cli"],
667
- input: checkTsdocInputSchema,
668
- output: checkTsdocOutputSchema,
669
- cli: {
670
- group: "check",
671
- command: "tsdoc",
672
- description: "Check TSDoc coverage on exported declarations",
673
- options: [
674
- {
675
- flags: "--strict",
676
- description: "Fail if coverage is below the minimum threshold",
677
- defaultValue: false
678
- },
679
- {
680
- flags: "--min-coverage <percent>",
681
- description: "Minimum coverage percentage (used with --strict)"
682
- },
683
- {
684
- flags: "--summary",
685
- description: "Omit per-declaration detail for compact output (~2KB vs ~64KB)",
686
- defaultValue: false
687
- },
688
- {
689
- flags: "--level <level>",
690
- description: "Filter declarations by coverage level (undocumented, partial, documented)"
691
- },
692
- {
693
- flags: "--package <name>",
694
- description: "Filter to specific package(s) by name (repeatable)"
695
- },
696
- ...checkTsdocOutputMode.options,
697
- ...checkTsdocJq.options
698
- ],
699
- mapInput: (context) => {
700
- const { outputMode: presetOutputMode } = checkTsdocOutputMode.resolve(context.flags);
701
- const { jq } = checkTsdocJq.resolve(context.flags);
702
- const explicitOutput = typeof context.flags["output"] === "string";
703
- let outputMode;
704
- if (explicitOutput) {
705
- outputMode = resolveStructuredOutputMode(presetOutputMode) ?? "human";
706
- } else if (process.env["OUTFITTER_JSONL"] === "1") {
707
- outputMode = "jsonl";
708
- } else if (process.env["OUTFITTER_JSON"] === "1") {
709
- outputMode = "json";
710
- } else {
711
- outputMode = "human";
712
- }
713
- const minCoverageRaw = context.flags["minCoverage"] ?? context.flags["min-coverage"];
714
- let minCoverage = 0;
715
- if (typeof minCoverageRaw === "string") {
716
- minCoverage = Number.parseInt(minCoverageRaw, 10);
717
- } else if (typeof minCoverageRaw === "number") {
718
- minCoverage = minCoverageRaw;
719
- }
720
- const levelRaw = context.flags["level"];
721
- const validLevels = new Set(["documented", "partial", "undocumented"]);
722
- const level = typeof levelRaw === "string" && validLevels.has(levelRaw) ? levelRaw : undefined;
723
- const pkgRaw = context.flags["package"];
724
- let packages = [];
725
- if (Array.isArray(pkgRaw)) {
726
- packages = pkgRaw.filter((v) => typeof v === "string");
727
- } else if (typeof pkgRaw === "string") {
728
- packages = [pkgRaw];
729
- }
730
- return {
731
- strict: Boolean(context.flags["strict"]),
732
- minCoverage,
733
- cwd: process.cwd(),
734
- outputMode,
735
- jq,
736
- summary: Boolean(context.flags["summary"]),
737
- level,
738
- packages
739
- };
740
- }
741
- },
742
- handler: async (input) => {
743
- const result = await runCheckTsdoc(input);
744
- if (result.isErr()) {
745
- if (result.error instanceof ValidationError) {
746
- return Result.err(result.error);
747
- }
748
- return Result.err(new InternalError({
749
- message: result.error.message,
750
- context: { action: "check.tsdoc" }
751
- }));
752
- }
753
- if (!result.value.ok) {
754
- process.exitCode = 1;
755
- }
756
- return Result.ok(result.value);
757
- }
758
- });
759
- var upgradeInputSchema = z.object({
760
- cwd: z.string(),
761
- guide: z.boolean(),
762
- guidePackages: z.array(z.string()).optional(),
763
- dryRun: z.boolean(),
764
- yes: z.boolean(),
765
- interactive: z.boolean(),
766
- all: z.boolean(),
767
- noCodemods: z.boolean(),
768
- outputMode: outputModeSchema
769
- });
770
- var upgradeCwd = cwdPreset();
771
- var upgradeDryRun = dryRunPreset();
772
- var upgradeInteraction = interactionPreset();
773
- var upgradeAll = booleanFlagPreset({
774
- id: "upgradeAll",
775
- key: "all",
776
- flags: "--all",
777
- description: "Include breaking changes in the upgrade"
778
- });
779
- var upgradeNoCodemods = booleanFlagPreset({
780
- id: "upgradeNoCodemods",
781
- key: "noCodemods",
782
- flags: "--no-codemods",
783
- description: "Skip automatic codemod execution during upgrade",
784
- sources: ["noCodemods", "no-codemods"],
785
- negatedSources: ["codemods"]
786
- });
787
- var upgradeGuide = booleanFlagPreset({
788
- id: "upgradeGuide",
789
- key: "guide",
790
- flags: "--guide",
791
- description: "Show migration instructions for available updates. Pass package names to filter."
792
- });
793
- var upgradeFlags = actionCliPresets(upgradeCwd, upgradeDryRun, upgradeInteraction, upgradeAll, upgradeNoCodemods, upgradeGuide);
794
- var upgradeAction = defineAction({
795
- id: "upgrade",
796
- description: "Check for @outfitter/* package updates and migration guidance",
797
- surfaces: ["cli"],
798
- input: upgradeInputSchema,
799
- cli: {
800
- command: "upgrade [packages...]",
801
- description: "Check for @outfitter/* package updates and migration guidance",
802
- options: [...upgradeFlags.options],
803
- mapInput: (context) => {
804
- const outputMode = resolveOutputModeFromContext(context.flags);
805
- const {
806
- cwd: rawCwd,
807
- dryRun,
808
- interactive,
809
- yes,
810
- all,
811
- noCodemods,
812
- guide
813
- } = upgradeFlags.resolve(context);
814
- const cwd = resolve(process.cwd(), rawCwd);
815
- const guidePackages = context.args.length > 0 ? context.args : undefined;
816
- return {
817
- cwd,
818
- guide,
819
- ...guidePackages !== undefined ? { guidePackages } : {},
820
- dryRun,
821
- yes,
822
- interactive,
823
- all,
824
- noCodemods,
825
- outputMode
826
- };
827
- }
828
- },
829
- handler: async (input) => {
830
- const { outputMode, guidePackages, ...upgradeInput } = input;
831
- const result = await runUpgrade({
832
- ...upgradeInput,
833
- outputMode,
834
- ...guidePackages !== undefined ? { guidePackages } : {}
835
- });
836
- if (result.isErr()) {
837
- return Result.err(new InternalError({
838
- message: result.error.message,
839
- context: { action: "upgrade" }
840
- }));
841
- }
842
- await printUpgradeResults(result.value, {
843
- mode: outputMode,
844
- guide: upgradeInput.guide,
845
- cwd: upgradeInput.cwd,
846
- dryRun: upgradeInput.dryRun,
847
- all: upgradeInput.all
848
- });
849
- return Result.ok(result.value);
850
- }
851
- });
852
- var outfitterActions = createActionRegistry().add(createAction).add(scaffoldAction).add(createInitAction({
853
- id: "init",
854
- description: "Create a new Outfitter project",
855
- command: "[directory]",
856
- includePresetOption: true,
857
- includeTemplateOption: true
858
- })).add(createInitAction({
859
- id: "init.cli",
860
- description: "Create a new CLI project",
861
- command: "cli [directory]",
862
- presetOverride: "cli"
863
- })).add(createInitAction({
864
- id: "init.mcp",
865
- description: "Create a new MCP server",
866
- command: "mcp [directory]",
867
- presetOverride: "mcp"
868
- })).add(createInitAction({
869
- id: "init.daemon",
870
- description: "Create a new daemon project",
871
- command: "daemon [directory]",
872
- presetOverride: "daemon"
873
- })).add(createInitAction({
874
- id: "init.library",
875
- description: "Create a new library project",
876
- command: "library [directory]",
877
- presetOverride: "library"
878
- })).add(createInitAction({
879
- id: "init.full-stack",
880
- description: "Create a full-stack workspace",
881
- command: "full-stack [directory]",
882
- presetOverride: "full-stack"
883
- })).add(demoAction).add(doctorAction).add(addAction).add(listBlocksAction).add(checkAction).add(checkTsdocAction).add(upgradeAction);
884
-
885
- export { outfitterActions };