outfitter 0.3.3 → 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.
- package/dist/actions/add.d.ts +1 -1
- package/dist/actions/add.js +6 -5
- package/dist/actions/check-automation.d.ts +4 -2
- package/dist/actions/check-automation.js +13 -9
- package/dist/actions/check.d.ts +2 -2
- package/dist/actions/check.js +6 -6
- package/dist/actions/demo.d.ts +1 -1
- package/dist/actions/demo.js +3 -4
- package/dist/actions/docs.d.ts +7 -7
- package/dist/actions/docs.js +12 -13
- package/dist/actions/doctor.d.ts +1 -1
- package/dist/actions/doctor.js +8 -7
- package/dist/actions/init.d.ts +9 -7
- package/dist/actions/init.js +12 -10
- package/dist/actions/scaffold.d.ts +1 -1
- package/dist/actions/scaffold.js +14 -12
- package/dist/actions/shared.d.ts +1 -20
- package/dist/actions/shared.js +1 -5
- package/dist/actions/upgrade.d.ts +10 -2
- package/dist/actions/upgrade.js +15 -8
- package/dist/actions.js +51 -48
- package/dist/cli.js +51 -48
- package/dist/commands/add.js +4 -3
- package/dist/commands/check-action-ceremony.d.ts +1 -1
- package/dist/commands/check-action-ceremony.js +2 -2
- package/dist/commands/check-action-registry.d.ts +52 -0
- package/dist/commands/check-action-registry.js +13 -0
- package/dist/commands/check-docs-sentinel.d.ts +1 -1
- package/dist/commands/check-docs-sentinel.js +2 -2
- package/dist/commands/check-orchestrator.d.ts +1 -1
- package/dist/commands/check-orchestrator.js +2 -2
- package/dist/commands/check-preset-versions.d.ts +4 -2
- package/dist/commands/check-preset-versions.js +8 -3
- package/dist/commands/check-publish-guardrails.d.ts +1 -1
- package/dist/commands/check-publish-guardrails.js +2 -2
- package/dist/commands/check-surface-map-format.d.ts +1 -1
- package/dist/commands/check-surface-map-format.js +2 -2
- package/dist/commands/check-surface-map.d.ts +1 -1
- package/dist/commands/check-surface-map.js +2 -2
- package/dist/commands/check-tsdoc.d.ts +2 -2
- package/dist/commands/check.js +3 -3
- package/dist/commands/demo.d.ts +1 -1
- package/dist/commands/demo.js +1 -1
- package/dist/commands/docs-api.d.ts +3 -3
- package/dist/commands/docs-api.js +2 -2
- package/dist/commands/docs-export.d.ts +2 -2
- package/dist/commands/docs-export.js +2 -2
- package/dist/commands/docs-list.d.ts +2 -2
- package/dist/commands/docs-list.js +2 -2
- package/dist/commands/docs-search.d.ts +2 -2
- package/dist/commands/docs-search.js +2 -2
- package/dist/commands/docs-show.d.ts +2 -2
- package/dist/commands/docs-show.js +2 -2
- package/dist/commands/doctor.js +6 -5
- package/dist/commands/init-execution.d.ts +5 -5
- package/dist/commands/init-execution.js +6 -4
- package/dist/commands/init-option-resolution.d.ts +3 -3
- package/dist/commands/init-option-resolution.js +1 -1
- package/dist/commands/init-output.d.ts +5 -5
- package/dist/commands/init-output.js +3 -3
- package/dist/commands/init.d.ts +5 -5
- package/dist/commands/init.js +9 -9
- package/dist/commands/scaffold-output.js +3 -3
- package/dist/commands/scaffold-planning.d.ts +9 -10
- package/dist/commands/scaffold-planning.js +6 -4
- package/dist/commands/scaffold.js +12 -10
- package/dist/commands/shared-deps.js +2 -2
- package/dist/commands/upgrade-codemod-builder.d.ts +45 -0
- package/dist/commands/upgrade-codemod-builder.js +14 -0
- package/dist/commands/upgrade-output.js +2 -2
- package/dist/commands/upgrade-workspace.js +5 -1
- package/dist/commands/upgrade.js +9 -5
- package/dist/create/index.d.ts +1 -1
- package/dist/create/planner.js +1 -1
- package/dist/engine/blocks.d.ts +2 -2
- package/dist/engine/blocks.js +5 -4
- package/dist/engine/config.d.ts +2 -2
- package/dist/engine/config.js +6 -5
- package/dist/engine/dependency-versions.d.ts +11 -3
- package/dist/engine/dependency-versions.js +6 -2
- package/dist/engine/executor.d.ts +2 -2
- package/dist/engine/executor.js +23 -10
- package/dist/engine/index.d.ts +8 -9
- package/dist/engine/index.js +1 -5
- package/dist/engine/package-json.d.ts +3 -0
- package/dist/engine/package-json.js +10 -0
- package/dist/engine/post-scaffold.js +1 -1
- package/dist/engine/preset.d.ts +3 -3
- package/dist/engine/preset.js +4 -2
- package/dist/engine/render-plan.js +2 -2
- package/dist/engine/types.d.ts +1 -1
- package/dist/engine/workspace.d.ts +2 -2
- package/dist/engine/workspace.js +3 -2
- package/dist/index.d.ts +7 -7
- package/dist/manifest.js +1 -1
- package/dist/output-mode.d.ts +2 -2
- package/dist/output-mode.js +2 -4
- package/dist/scaffold-e2e/cli.d.ts +19 -0
- package/dist/scaffold-e2e/cli.js +14 -0
- package/dist/scaffold-e2e/config.d.ts +6 -0
- package/dist/scaffold-e2e/config.js +14 -0
- package/dist/scaffold-e2e/runner.d.ts +29 -0
- package/dist/scaffold-e2e/runner.js +17 -0
- package/dist/scaffold-e2e/template-guardrails.d.ts +25 -0
- package/dist/scaffold-e2e/template-guardrails.js +183 -0
- package/dist/scaffold-e2e/workspace.d.ts +27 -0
- package/dist/scaffold-e2e/workspace.js +18 -0
- package/dist/scripts/scaffold-e2e.js +78 -0
- package/dist/shared/{outfitter-qsrx7m4w.js → outfitter-00wxeg2g.js} +8 -8
- package/dist/shared/{outfitter-ex8gn945.js → outfitter-0cspz333.js} +4 -6
- package/dist/shared/{outfitter-rp89dafm.js → outfitter-0xp447gf.js} +55 -8
- package/dist/shared/outfitter-0zs8makw.js +94 -0
- package/dist/shared/{outfitter-5d9wbzhh.d.ts → outfitter-11r5ny73.d.ts} +2 -2
- package/dist/shared/{outfitter-gyayfx5r.js → outfitter-18s82np1.js} +1 -1
- package/dist/shared/{outfitter-954y4mzx.d.ts → outfitter-1dekqnaw.d.ts} +1 -1
- package/dist/shared/{outfitter-6t7xeyg1.js → outfitter-1t8gjzw6.js} +91 -3
- package/dist/shared/{outfitter-tqznjgbm.js → outfitter-23159bef.js} +6 -3
- package/dist/shared/{outfitter-y6ee0k45.d.ts → outfitter-232ean4v.d.ts} +1 -1
- package/dist/shared/{outfitter-3rcrvva8.js → outfitter-247et71q.js} +8 -8
- package/dist/shared/{outfitter-xs94pkfe.js → outfitter-3f261xh0.js} +5 -7
- package/dist/shared/outfitter-4bs5a2n4.js +31 -0
- package/dist/shared/{outfitter-76k25svs.js → outfitter-4c4q091c.js} +6 -28
- package/dist/shared/{outfitter-738z4c37.js → outfitter-4t818mq5.js} +21 -9
- package/dist/shared/{outfitter-4s9meh3j.js → outfitter-4w9sc6bw.js} +24 -0
- package/dist/shared/outfitter-5gaptj9b.js +83 -0
- package/dist/shared/{outfitter-2ysjerp6.d.ts → outfitter-5rc4hxdn.d.ts} +2 -2
- package/dist/shared/{outfitter-ttjr95y9.js → outfitter-7krhbg3b.js} +3 -3
- package/dist/shared/{outfitter-7n7vsz95.js → outfitter-7t7ces1x.js} +1 -42
- package/dist/shared/{outfitter-gdc7b7de.d.ts → outfitter-8231g70k.d.ts} +1 -1
- package/dist/shared/{outfitter-yhb23pjc.js → outfitter-8jd1sak0.js} +4 -4
- package/dist/shared/{outfitter-wkt0a0ra.js → outfitter-93e1shd4.js} +4 -6
- package/dist/shared/{outfitter-wyg1tpp5.d.ts → outfitter-a93yanw6.d.ts} +1 -1
- package/dist/shared/{outfitter-mstr60zz.js → outfitter-aa5nzw14.js} +47 -22
- package/dist/shared/{outfitter-fxry5n58.js → outfitter-b05mvbmx.js} +4 -4
- package/dist/shared/{outfitter-1fy7byz5.js → outfitter-bsjq8gkk.js} +6 -4
- package/dist/shared/{outfitter-ssrtakh3.js → outfitter-c50y6yr3.js} +4 -4
- package/dist/shared/{outfitter-cyvr4r8d.d.ts → outfitter-crxe5gth.d.ts} +4 -0
- package/dist/shared/{outfitter-fj2v5ffz.js → outfitter-d5kz9x7g.js} +1 -1
- package/dist/shared/{outfitter-k6zyvg2n.js → outfitter-dna8exj2.js} +19 -10
- package/dist/shared/{outfitter-940h0x7b.js → outfitter-e44qcs0w.js} +3 -3
- package/dist/shared/{outfitter-r2awqszh.d.ts → outfitter-e5x0ybqt.d.ts} +12 -3
- package/dist/shared/{outfitter-3tx3adgj.js → outfitter-ez7qffv5.js} +8 -6
- package/dist/shared/outfitter-fgrqt6aq.js +179 -0
- package/dist/shared/outfitter-fhahf9f3.d.ts +14 -0
- package/dist/shared/{outfitter-c7sbs7es.js → outfitter-g6r9avgz.js} +3 -3
- package/dist/shared/{outfitter-ssynegbs.js → outfitter-ga59fa45.js} +1 -1
- package/dist/shared/{outfitter-tavatb5p.js → outfitter-gna739c3.js} +86 -31
- package/dist/shared/{outfitter-nxvjxrmw.d.ts → outfitter-grt5ngqq.d.ts} +1 -1
- package/dist/shared/{outfitter-58rn1sj1.d.ts → outfitter-gsjbcta2.d.ts} +1 -1
- package/dist/shared/{outfitter-q1g58t85.js → outfitter-gvpwpqnc.js} +0 -1
- package/dist/shared/{outfitter-x39awx8g.js → outfitter-hr4cvmjy.js} +47 -25
- package/dist/shared/{outfitter-84chvazx.js → outfitter-hw9f0zq9.js} +75 -31
- package/dist/shared/{outfitter-ksyvwmb5.js → outfitter-jhpcjeg1.js} +5 -5
- package/dist/shared/outfitter-kc46jq69.d.ts +12 -0
- package/dist/shared/{outfitter-px5sv5gn.js → outfitter-ksg34wka.js} +5 -5
- package/dist/shared/{outfitter-wrcqq29p.js → outfitter-n63ygpv3.js} +30 -23
- package/dist/shared/{outfitter-qsd5638j.js → outfitter-n9jp1abt.js} +16 -40
- package/dist/shared/{outfitter-d0kqashd.d.ts → outfitter-nhft74pe.d.ts} +4 -2
- package/dist/shared/{outfitter-8kmak0wc.d.ts → outfitter-nx1sywpb.d.ts} +1 -1
- package/dist/shared/{outfitter-5r6q2749.d.ts → outfitter-pw74st5t.d.ts} +1 -1
- package/dist/shared/{outfitter-h0wmtxw8.d.ts → outfitter-qka1skyw.d.ts} +1 -1
- package/dist/shared/{outfitter-6mpkh3zn.js → outfitter-qps83547.js} +30 -23
- package/dist/shared/outfitter-qzd5djgx.js +88 -0
- package/dist/shared/{outfitter-hf5bj2gq.js → outfitter-sh015v8k.js} +4 -4
- package/dist/shared/{outfitter-ypcvwg1s.js → outfitter-srznx3hj.js} +1 -1
- package/dist/shared/{outfitter-n0ed012k.js → outfitter-ssq33ym3.js} +8 -8
- package/dist/shared/outfitter-sxf8jjjn.js +7 -0
- package/dist/shared/{outfitter-p2wn07b7.js → outfitter-t535h0mw.js} +1 -1
- package/dist/shared/{outfitter-znbqe5zy.d.ts → outfitter-t8dg4tg5.d.ts} +1 -1
- package/dist/shared/{outfitter-ydw7x6bh.js → outfitter-t8mvabed.js} +1 -1
- package/dist/shared/{outfitter-6ddf91vh.js → outfitter-t9xkn37g.js} +11 -12
- package/dist/shared/{outfitter-x4cc5xsq.js → outfitter-wmgzyymq.js} +4 -4
- package/dist/shared/outfitter-wna6gp2t.js +56 -0
- package/dist/shared/outfitter-x0r7mfvy.js +142 -0
- package/dist/shared/{outfitter-b9cpnr7e.js → outfitter-x4f8v5vf.js} +1 -1
- package/dist/shared/{outfitter-x8w5sjnd.d.ts → outfitter-x6322tjp.d.ts} +1 -1
- package/dist/shared/{outfitter-6rtcemk7.d.ts → outfitter-xa4915yp.d.ts} +3 -2
- package/dist/shared/{outfitter-2z61gp5w.js → outfitter-xg5yryp2.js} +1 -1
- package/dist/shared/{outfitter-rdpw2sbp.d.ts → outfitter-xn5km042.d.ts} +6 -0
- package/dist/shared/{outfitter-cyhzstz0.js → outfitter-xqr4fp1n.js} +4 -4
- package/dist/shared/outfitter-z6tg0swx.js +87 -0
- package/dist/shared/{outfitter-dx4hn4ta.js → outfitter-zmzrsvcn.js} +17 -21
- package/dist/shared/{outfitter-8ggmja91.js → outfitter-zqj1nte1.js} +66 -67
- package/dist/targets/index.d.ts +2 -2
- package/dist/targets/registry.d.ts +2 -2
- package/dist/targets/registry.js +13 -1
- package/dist/targets/types.d.ts +1 -1
- package/package.json +85 -39
- package/dist/actions/docs-output-mode.d.ts +0 -4
- package/dist/actions/docs-output-mode.js +0 -8
- package/dist/engine/template.d.ts +0 -4
- package/dist/engine/template.js +0 -34
- package/dist/shared/outfitter-7r12fj7f.js +0 -30
- package/dist/shared/outfitter-a79xrm12.d.ts +0 -17
- package/dist/shared/outfitter-ec83h4v2.js +0 -17
- package/dist/shared/outfitter-fbvfd5zq.d.ts +0 -13
- package/dist/shared/outfitter-jkct38dh.js +0 -53
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
resolveStructuredOutputMode
|
|
4
|
-
} from "./outfitter-
|
|
4
|
+
} from "./outfitter-sxf8jjjn.js";
|
|
5
5
|
|
|
6
6
|
// apps/outfitter/src/commands/check-orchestrator.ts
|
|
7
7
|
import { resolve } from "path";
|
|
@@ -27,12 +27,12 @@ function normalizePaths(paths) {
|
|
|
27
27
|
}
|
|
28
28
|
return paths.map((path) => path.trim()).filter((path) => path.length > 0).toSorted();
|
|
29
29
|
}
|
|
30
|
-
function shouldSyncAgentScaffolding(paths) {
|
|
31
|
-
return paths.some((path) => path === ".claude/settings.json" || path.startsWith(".claude/hooks/"));
|
|
32
|
-
}
|
|
33
30
|
function buildCheckOrchestratorPlan(options) {
|
|
34
31
|
const stagedFiles = normalizePaths(options.stagedFiles);
|
|
32
|
+
const commandProfile = options.commandProfile ?? "default";
|
|
35
33
|
if (options.mode === "all" || options.mode === "ci") {
|
|
34
|
+
const typecheckCommand = commandProfile === "hook" ? ["bun", "run", "typecheck:hook"] : ["bun", "run", "typecheck", "--", "--only"];
|
|
35
|
+
const lintAndFormatCommand = commandProfile === "hook" ? ["bun", "run", "check:hook"] : ["bun", "run", "check"];
|
|
36
36
|
const steps = [
|
|
37
37
|
{
|
|
38
38
|
id: "block-drift",
|
|
@@ -50,12 +50,12 @@ function buildCheckOrchestratorPlan(options) {
|
|
|
50
50
|
{
|
|
51
51
|
id: "typecheck",
|
|
52
52
|
label: "Typecheck",
|
|
53
|
-
command:
|
|
53
|
+
command: typecheckCommand
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
id: "lint-and-format",
|
|
57
57
|
label: "Lint/Format checks",
|
|
58
|
-
command:
|
|
58
|
+
command: lintAndFormatCommand
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
id: "publish-guardrails",
|
|
@@ -280,18 +280,26 @@ function buildCheckOrchestratorPlan(options) {
|
|
|
280
280
|
}
|
|
281
281
|
const hasStagedFiles = stagedFiles.length > 0;
|
|
282
282
|
const tsFiles = stagedFiles.filter((f) => /\.(ts|tsx)$/.test(f));
|
|
283
|
-
const
|
|
284
|
-
|
|
283
|
+
const ultraciteFiles = stagedFiles.filter((f) => /\.(js|jsx|mjs|cjs|ts|tsx|mts|cts)$/.test(f));
|
|
284
|
+
const preCommitSteps = [];
|
|
285
|
+
if (ultraciteFiles.length > 0) {
|
|
286
|
+
preCommitSteps.push({
|
|
285
287
|
id: "ultracite-fix",
|
|
286
288
|
label: "Ultracite fix",
|
|
287
|
-
command:
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
289
|
+
command: ["bun", "x", "ultracite", "fix", ...ultraciteFiles]
|
|
290
|
+
});
|
|
291
|
+
} else if (!hasStagedFiles) {
|
|
292
|
+
preCommitSteps.push({
|
|
293
|
+
id: "ultracite-fix",
|
|
294
|
+
label: "Ultracite fix",
|
|
295
|
+
command: ["bun", "x", "ultracite", "fix", "."]
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
preCommitSteps.push({
|
|
299
|
+
id: "exports",
|
|
300
|
+
label: "Exports",
|
|
301
|
+
command: ["bun", "run", "check-exports"]
|
|
302
|
+
});
|
|
295
303
|
if (tsFiles.length > 0) {
|
|
296
304
|
preCommitSteps.splice(1, 0, {
|
|
297
305
|
id: "typecheck",
|
|
@@ -305,13 +313,6 @@ function buildCheckOrchestratorPlan(options) {
|
|
|
305
313
|
command: ["bun", "run", "typecheck", "--", "--only"]
|
|
306
314
|
});
|
|
307
315
|
}
|
|
308
|
-
if (shouldSyncAgentScaffolding(stagedFiles)) {
|
|
309
|
-
preCommitSteps.push({
|
|
310
|
-
id: "sync-agent-scaffolding",
|
|
311
|
-
label: "Sync agent scaffolding",
|
|
312
|
-
command: ["./scripts/sync-agent-scaffolding.sh"]
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
316
|
return preCommitSteps;
|
|
316
317
|
}
|
|
317
318
|
function parseTreePaths(statusOutput) {
|
|
@@ -336,17 +337,19 @@ function diffTreePaths(before, after) {
|
|
|
336
337
|
const beforeSet = new Set(before);
|
|
337
338
|
return after.filter((path) => !beforeSet.has(path));
|
|
338
339
|
}
|
|
339
|
-
async function runStep(cwd, step) {
|
|
340
|
+
async function runStep(cwd, step, options = {}) {
|
|
340
341
|
const startedAt = Date.now();
|
|
341
342
|
const processHandle = Bun.spawn([...step.command], {
|
|
342
343
|
cwd,
|
|
343
344
|
stdout: "pipe",
|
|
344
345
|
stderr: "pipe"
|
|
345
346
|
});
|
|
347
|
+
const stdoutTarget = options.streamOutput ? process.stdout : undefined;
|
|
348
|
+
const stderrTarget = options.streamOutput ? process.stderr : undefined;
|
|
346
349
|
const [exitCode, stdout, stderr] = await Promise.all([
|
|
347
350
|
processHandle.exited,
|
|
348
|
-
|
|
349
|
-
|
|
351
|
+
readOutputStream(processHandle.stdout, stdoutTarget),
|
|
352
|
+
readOutputStream(processHandle.stderr, stderrTarget)
|
|
350
353
|
]);
|
|
351
354
|
return {
|
|
352
355
|
id: step.id,
|
|
@@ -358,6 +361,36 @@ async function runStep(cwd, step) {
|
|
|
358
361
|
durationMs: Date.now() - startedAt
|
|
359
362
|
};
|
|
360
363
|
}
|
|
364
|
+
async function readOutputStream(stream, target) {
|
|
365
|
+
if (!stream) {
|
|
366
|
+
return "";
|
|
367
|
+
}
|
|
368
|
+
const reader = stream.getReader();
|
|
369
|
+
const decoder = new TextDecoder;
|
|
370
|
+
const chunks = [];
|
|
371
|
+
try {
|
|
372
|
+
while (true) {
|
|
373
|
+
const { done, value } = await reader.read();
|
|
374
|
+
if (done) {
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
378
|
+
if (chunk.length === 0) {
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
chunks.push(chunk);
|
|
382
|
+
target?.write(chunk);
|
|
383
|
+
}
|
|
384
|
+
const trailingChunk = decoder.decode();
|
|
385
|
+
if (trailingChunk.length > 0) {
|
|
386
|
+
chunks.push(trailingChunk);
|
|
387
|
+
target?.write(trailingChunk);
|
|
388
|
+
}
|
|
389
|
+
return chunks.join("");
|
|
390
|
+
} finally {
|
|
391
|
+
reader.releaseLock();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
361
394
|
function extractSuccessAdvisory(stderr) {
|
|
362
395
|
const lines = stderr.split(`
|
|
363
396
|
`).map((line) => line.trim()).filter((line) => line.length > 0);
|
|
@@ -385,8 +418,14 @@ async function runCheckOrchestrator(options) {
|
|
|
385
418
|
}
|
|
386
419
|
const treeBefore = readTreePaths(cwd);
|
|
387
420
|
const stepResults = [];
|
|
388
|
-
for (const step of plan) {
|
|
389
|
-
|
|
421
|
+
for (const [index, step] of plan.entries()) {
|
|
422
|
+
if (options.streamOutput) {
|
|
423
|
+
process.stdout.write(`[check ${index + 1}/${plan.length}] ${step.label}
|
|
424
|
+
`);
|
|
425
|
+
}
|
|
426
|
+
const result = await runStep(cwd, step, {
|
|
427
|
+
streamOutput: options.streamOutput
|
|
428
|
+
});
|
|
390
429
|
stepResults.push(result);
|
|
391
430
|
if (result.exitCode !== 0) {
|
|
392
431
|
break;
|
|
@@ -443,11 +482,16 @@ async function printCheckOrchestratorResults(result, options = {}) {
|
|
|
443
482
|
process.stdout.write(` ${icon} ${step.label} ${theme.muted(`(${duration})`)}
|
|
444
483
|
`);
|
|
445
484
|
if (step.exitCode !== 0) {
|
|
446
|
-
|
|
485
|
+
if (options.liveOutput) {
|
|
486
|
+
process.stdout.write(` ${theme.muted("Live step output shown above.")}
|
|
487
|
+
`);
|
|
488
|
+
} else {
|
|
489
|
+
const snippet = `${step.stdout}
|
|
447
490
|
${step.stderr}`.trim();
|
|
448
|
-
|
|
449
|
-
|
|
491
|
+
if (snippet.length > 0) {
|
|
492
|
+
process.stdout.write(`${theme.muted(snippet)}
|
|
450
493
|
`);
|
|
494
|
+
}
|
|
451
495
|
}
|
|
452
496
|
} else {
|
|
453
497
|
const advisory = extractSuccessAdvisory(step.stderr);
|
|
@@ -127,22 +127,22 @@ function parseEmbeddedOptions(argv) {
|
|
|
127
127
|
async function runEmbeddedDemo(options) {
|
|
128
128
|
const mode = toOutputMode(options.outputMode);
|
|
129
129
|
if (options.list) {
|
|
130
|
-
await output(renderListSections(),
|
|
130
|
+
await output(renderListSections(), mode);
|
|
131
131
|
return 0;
|
|
132
132
|
}
|
|
133
133
|
if (options.animate) {
|
|
134
|
-
await output(renderDemo("spinner"),
|
|
134
|
+
await output(renderDemo("spinner"), mode);
|
|
135
135
|
return 0;
|
|
136
136
|
}
|
|
137
137
|
if (options.section === undefined || options.section === "all") {
|
|
138
|
-
await output(renderAllDemos(),
|
|
138
|
+
await output(renderAllDemos(), mode);
|
|
139
139
|
return 0;
|
|
140
140
|
}
|
|
141
141
|
if (!isPrimitiveId(options.section)) {
|
|
142
|
-
await output(renderUnknownSection(options.section),
|
|
142
|
+
await output(renderUnknownSection(options.section), mode);
|
|
143
143
|
return 1;
|
|
144
144
|
}
|
|
145
|
-
await output(renderDemo(options.section),
|
|
145
|
+
await output(renderDemo(options.section), mode);
|
|
146
146
|
return 0;
|
|
147
147
|
}
|
|
148
148
|
async function runEmbeddedFromArgv() {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { InitPresetId } from "./outfitter-11r5ny73.js";
|
|
2
|
+
type ScaffoldE2EProfileId = "default" | "ci";
|
|
3
|
+
interface ScaffoldE2EProfile {
|
|
4
|
+
readonly commandTimeoutMs: number;
|
|
5
|
+
readonly id: ScaffoldE2EProfileId;
|
|
6
|
+
readonly presets: readonly InitPresetId[];
|
|
7
|
+
}
|
|
8
|
+
declare const DEFAULT_SCAFFOLD_E2E_PRESETS: readonly InitPresetId[];
|
|
9
|
+
declare const SCAFFOLD_E2E_STEPS_PER_PRESET = 3;
|
|
10
|
+
declare function resolveScaffoldE2EProfile(id?: ScaffoldE2EProfileId): ScaffoldE2EProfile;
|
|
11
|
+
declare function getScaffoldE2ESuiteTimeoutBudgetMs(profile: ScaffoldE2EProfile): number;
|
|
12
|
+
export { ScaffoldE2EProfileId, ScaffoldE2EProfile, DEFAULT_SCAFFOLD_E2E_PRESETS, SCAFFOLD_E2E_STEPS_PER_PRESET, resolveScaffoldE2EProfile, getScaffoldE2ESuiteTimeoutBudgetMs };
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
validatePackageName
|
|
4
|
-
} from "./outfitter-
|
|
4
|
+
} from "./outfitter-gvpwpqnc.js";
|
|
5
5
|
import {
|
|
6
6
|
resolveStructuredOutputMode
|
|
7
|
-
} from "./outfitter-
|
|
7
|
+
} from "./outfitter-sxf8jjjn.js";
|
|
8
8
|
import {
|
|
9
9
|
getWorkspacePatterns,
|
|
10
10
|
hasWorkspacesField
|
|
11
|
-
} from "./outfitter-
|
|
11
|
+
} from "./outfitter-bsjq8gkk.js";
|
|
12
12
|
|
|
13
13
|
// apps/outfitter/src/commands/doctor.ts
|
|
14
14
|
import { existsSync, readFileSync } from "fs";
|
|
@@ -255,7 +255,7 @@ function runDoctor(options) {
|
|
|
255
255
|
async function printDoctorResults(result, options) {
|
|
256
256
|
const structuredMode = resolveStructuredOutputMode(options?.mode);
|
|
257
257
|
if (structuredMode) {
|
|
258
|
-
await output(result,
|
|
258
|
+
await output(result, structuredMode);
|
|
259
259
|
return;
|
|
260
260
|
}
|
|
261
261
|
const theme = createTheme();
|
|
@@ -306,7 +306,7 @@ async function printDoctorResults(result, options) {
|
|
|
306
306
|
if (result.exitCode !== 0) {
|
|
307
307
|
lines.push("", theme.muted("Run 'outfitter doctor' after fixing issues to verify."));
|
|
308
308
|
}
|
|
309
|
-
await output(lines,
|
|
309
|
+
await output(lines, "human");
|
|
310
310
|
}
|
|
311
311
|
function doctorCommand(program) {
|
|
312
312
|
program.command("doctor").description("Validate environment and dependencies").action(async (_flags, command) => {
|
|
@@ -2,28 +2,29 @@
|
|
|
2
2
|
import {
|
|
3
3
|
SHARED_DEV_DEPS,
|
|
4
4
|
SHARED_SCRIPTS
|
|
5
|
-
} from "./outfitter-
|
|
6
|
-
import {
|
|
7
|
-
applyResolvedDependencyVersions,
|
|
8
|
-
resolvePresetDependencyVersions
|
|
9
|
-
} from "./outfitter-x39awx8g.js";
|
|
5
|
+
} from "./outfitter-23159bef.js";
|
|
10
6
|
import {
|
|
11
7
|
getWorkspacePatterns
|
|
12
|
-
} from "./outfitter-
|
|
8
|
+
} from "./outfitter-bsjq8gkk.js";
|
|
9
|
+
import {
|
|
10
|
+
serializePackageJson
|
|
11
|
+
} from "./outfitter-5gaptj9b.js";
|
|
13
12
|
import {
|
|
14
13
|
ScaffoldError
|
|
15
14
|
} from "./outfitter-8y2dfx6n.js";
|
|
15
|
+
import {
|
|
16
|
+
DEPENDENCY_SECTIONS,
|
|
17
|
+
applyResolvedDependencyVersions,
|
|
18
|
+
resolvePresetDependencyVersions
|
|
19
|
+
} from "./outfitter-hr4cvmjy.js";
|
|
16
20
|
|
|
17
21
|
// apps/outfitter/src/engine/config.ts
|
|
18
22
|
import { existsSync, readdirSync, readFileSync, writeFileSync } from "fs";
|
|
19
23
|
import { join } from "path";
|
|
20
24
|
import { Result } from "@outfitter/contracts";
|
|
21
|
-
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
"peerDependencies",
|
|
25
|
-
"optionalDependencies"
|
|
26
|
-
];
|
|
25
|
+
function formatUnresolvedCatalogMessage(packageJsonPath, unresolvedNames) {
|
|
26
|
+
return `Unresolved catalog placeholder(s) in ${packageJsonPath}: ` + unresolvedNames.join(", ");
|
|
27
|
+
}
|
|
27
28
|
function getWorkspaceMemberPackageJsonPaths(rootDir, rootPackageJson) {
|
|
28
29
|
const patterns = getWorkspacePatterns(rootPackageJson["workspaces"]);
|
|
29
30
|
const packageJsonPaths = new Set;
|
|
@@ -76,23 +77,31 @@ function injectSharedConfig(targetDir) {
|
|
|
76
77
|
try {
|
|
77
78
|
const content = readFileSync(packageJsonPath, "utf-8");
|
|
78
79
|
const parsed = JSON.parse(content);
|
|
79
|
-
const
|
|
80
|
-
|
|
80
|
+
const versionsResult = resolvePresetDependencyVersions();
|
|
81
|
+
if (versionsResult.isErr()) {
|
|
82
|
+
return Result.err(new ScaffoldError(`Failed to resolve dependency versions: ${versionsResult.error.message}`));
|
|
83
|
+
}
|
|
84
|
+
const dependencyVersions = versionsResult.value;
|
|
85
|
+
const unresolvedRootDeps = applyResolvedDependencyVersions(parsed, dependencyVersions);
|
|
86
|
+
if (unresolvedRootDeps.length > 0) {
|
|
87
|
+
return Result.err(new ScaffoldError(formatUnresolvedCatalogMessage(packageJsonPath, unresolvedRootDeps)));
|
|
88
|
+
}
|
|
81
89
|
const existingDevDeps = parsed["devDependencies"] ?? {};
|
|
82
90
|
parsed["devDependencies"] = { ...SHARED_DEV_DEPS, ...existingDevDeps };
|
|
83
91
|
const existingScripts = parsed["scripts"] ?? {};
|
|
84
92
|
parsed["scripts"] = { ...SHARED_SCRIPTS, ...existingScripts };
|
|
85
|
-
writeFileSync(packageJsonPath,
|
|
86
|
-
`, "utf-8");
|
|
93
|
+
writeFileSync(packageJsonPath, serializePackageJson(parsed), "utf-8");
|
|
87
94
|
const workspaceMembers = getWorkspaceMemberPackageJsonPaths(targetDir, parsed);
|
|
88
95
|
for (const memberPackageJsonPath of workspaceMembers) {
|
|
89
96
|
const memberContent = readFileSync(memberPackageJsonPath, "utf-8");
|
|
90
97
|
const memberParsed = JSON.parse(memberContent);
|
|
91
98
|
const before = JSON.stringify(memberParsed);
|
|
92
|
-
applyResolvedDependencyVersions(memberParsed, dependencyVersions);
|
|
99
|
+
const unresolvedMemberDeps = applyResolvedDependencyVersions(memberParsed, dependencyVersions);
|
|
100
|
+
if (unresolvedMemberDeps.length > 0) {
|
|
101
|
+
return Result.err(new ScaffoldError(formatUnresolvedCatalogMessage(memberPackageJsonPath, unresolvedMemberDeps)));
|
|
102
|
+
}
|
|
93
103
|
if (JSON.stringify(memberParsed) !== before) {
|
|
94
|
-
writeFileSync(memberPackageJsonPath,
|
|
95
|
-
`, "utf-8");
|
|
104
|
+
writeFileSync(memberPackageJsonPath, serializePackageJson(memberParsed), "utf-8");
|
|
96
105
|
}
|
|
97
106
|
}
|
|
98
107
|
return Result.ok(undefined);
|
|
@@ -110,16 +119,14 @@ function rewriteLocalDependencies(targetDir) {
|
|
|
110
119
|
const content = readFileSync(packageJsonPath, "utf-8");
|
|
111
120
|
const parsed = JSON.parse(content);
|
|
112
121
|
if (rewriteOutfitterDepsToWorkspace(parsed)) {
|
|
113
|
-
writeFileSync(packageJsonPath,
|
|
114
|
-
`, "utf-8");
|
|
122
|
+
writeFileSync(packageJsonPath, serializePackageJson(parsed), "utf-8");
|
|
115
123
|
}
|
|
116
124
|
const workspaceMembers = getWorkspaceMemberPackageJsonPaths(targetDir, parsed);
|
|
117
125
|
for (const memberPackageJsonPath of workspaceMembers) {
|
|
118
126
|
const memberContent = readFileSync(memberPackageJsonPath, "utf-8");
|
|
119
127
|
const memberParsed = JSON.parse(memberContent);
|
|
120
128
|
if (rewriteOutfitterDepsToWorkspace(memberParsed)) {
|
|
121
|
-
writeFileSync(memberPackageJsonPath,
|
|
122
|
-
`, "utf-8");
|
|
129
|
+
writeFileSync(memberPackageJsonPath, serializePackageJson(memberParsed), "utf-8");
|
|
123
130
|
}
|
|
124
131
|
}
|
|
125
132
|
return Result.ok(undefined);
|
|
@@ -9,10 +9,18 @@ import {
|
|
|
9
9
|
sanitizePackageName,
|
|
10
10
|
validatePackageName,
|
|
11
11
|
validateProjectDirectoryName
|
|
12
|
-
} from "./outfitter-
|
|
12
|
+
} from "./outfitter-gvpwpqnc.js";
|
|
13
13
|
import {
|
|
14
|
-
|
|
15
|
-
} from "./outfitter-
|
|
14
|
+
parseBlocks
|
|
15
|
+
} from "./outfitter-xg5yryp2.js";
|
|
16
|
+
import {
|
|
17
|
+
detectWorkspaceRoot,
|
|
18
|
+
getWorkspacePatterns,
|
|
19
|
+
hasWorkspacesField
|
|
20
|
+
} from "./outfitter-bsjq8gkk.js";
|
|
21
|
+
import {
|
|
22
|
+
serializePackageJson
|
|
23
|
+
} from "./outfitter-5gaptj9b.js";
|
|
16
24
|
|
|
17
25
|
// apps/outfitter/src/commands/scaffold-planning.ts
|
|
18
26
|
import {
|
|
@@ -38,30 +46,6 @@ function readPackageJson(path) {
|
|
|
38
46
|
return null;
|
|
39
47
|
}
|
|
40
48
|
}
|
|
41
|
-
function hasWorkspacesField(pkg) {
|
|
42
|
-
const workspaces = pkg.workspaces;
|
|
43
|
-
if (Array.isArray(workspaces) && workspaces.length > 0) {
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
if (workspaces && typeof workspaces === "object" && !Array.isArray(workspaces)) {
|
|
47
|
-
const packages = workspaces.packages;
|
|
48
|
-
return Array.isArray(packages) && packages.length > 0;
|
|
49
|
-
}
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
function extractWorkspacePatterns(pkg) {
|
|
53
|
-
const workspaces = pkg.workspaces;
|
|
54
|
-
if (Array.isArray(workspaces)) {
|
|
55
|
-
return workspaces.filter((entry) => typeof entry === "string");
|
|
56
|
-
}
|
|
57
|
-
if (workspaces && typeof workspaces === "object" && !Array.isArray(workspaces)) {
|
|
58
|
-
const packages = workspaces.packages;
|
|
59
|
-
if (Array.isArray(packages)) {
|
|
60
|
-
return packages.filter((entry) => typeof entry === "string");
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return [];
|
|
64
|
-
}
|
|
65
49
|
function detectProjectStructure(cwd) {
|
|
66
50
|
const resolvedCwd = resolve(cwd);
|
|
67
51
|
const cwdPackageJsonPath = join(resolvedCwd, "package.json");
|
|
@@ -71,7 +55,7 @@ function detectProjectStructure(cwd) {
|
|
|
71
55
|
return Result.ok({
|
|
72
56
|
kind: "workspace",
|
|
73
57
|
rootDir: resolvedCwd,
|
|
74
|
-
workspacePatterns:
|
|
58
|
+
workspacePatterns: getWorkspacePatterns(cwdPkg.workspaces)
|
|
75
59
|
});
|
|
76
60
|
}
|
|
77
61
|
const wsResult2 = detectWorkspaceRoot(resolvedCwd);
|
|
@@ -84,7 +68,7 @@ function detectProjectStructure(cwd) {
|
|
|
84
68
|
return Result.ok({
|
|
85
69
|
kind: "workspace",
|
|
86
70
|
rootDir: wsResult2.value,
|
|
87
|
-
workspacePatterns:
|
|
71
|
+
workspacePatterns: getWorkspacePatterns(rootPkg.workspaces)
|
|
88
72
|
});
|
|
89
73
|
}
|
|
90
74
|
}
|
|
@@ -104,7 +88,7 @@ function detectProjectStructure(cwd) {
|
|
|
104
88
|
return Result.ok({
|
|
105
89
|
kind: "workspace",
|
|
106
90
|
rootDir: wsResult.value,
|
|
107
|
-
workspacePatterns:
|
|
91
|
+
workspacePatterns: getWorkspacePatterns(rootPkg.workspaces)
|
|
108
92
|
});
|
|
109
93
|
}
|
|
110
94
|
}
|
|
@@ -186,7 +170,7 @@ function ensureWorkspacePattern(rootDir, placement, dryRun, collector) {
|
|
|
186
170
|
return Result.err("Failed to read workspace package.json");
|
|
187
171
|
}
|
|
188
172
|
const pattern = `${placement}/*`;
|
|
189
|
-
const patterns = [...
|
|
173
|
+
const patterns = [...getWorkspacePatterns(pkg.workspaces)];
|
|
190
174
|
if (patterns.includes(pattern)) {
|
|
191
175
|
return Result.ok(false);
|
|
192
176
|
}
|
|
@@ -211,8 +195,7 @@ function ensureWorkspacePattern(rootDir, placement, dryRun, collector) {
|
|
|
211
195
|
} else {
|
|
212
196
|
nextPkg["workspaces"] = nextPatterns;
|
|
213
197
|
}
|
|
214
|
-
writeFileSync(packageJsonPath,
|
|
215
|
-
`, "utf-8");
|
|
198
|
+
writeFileSync(packageJsonPath, serializePackageJson(nextPkg), "utf-8");
|
|
216
199
|
return Result.ok(true);
|
|
217
200
|
}
|
|
218
201
|
function movePath(source, destination) {
|
|
@@ -324,13 +307,6 @@ function convertToWorkspace(rootDir, existingPkg, dryRun, collector) {
|
|
|
324
307
|
}
|
|
325
308
|
});
|
|
326
309
|
}
|
|
327
|
-
function parseBlocks(withFlag) {
|
|
328
|
-
if (!withFlag) {
|
|
329
|
-
return;
|
|
330
|
-
}
|
|
331
|
-
const blocks = withFlag.split(",").map((value) => value.trim()).filter((value) => value.length > 0);
|
|
332
|
-
return blocks.length > 0 ? blocks : undefined;
|
|
333
|
-
}
|
|
334
310
|
function buildScaffoldPlan(target, rootDir, targetName, options) {
|
|
335
311
|
const targetDir = join(rootDir, target.placement, targetName);
|
|
336
312
|
const packageName = targetName;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { InitStructure } from "./outfitter-
|
|
2
|
-
import { InitPresetId } from "./outfitter-
|
|
1
|
+
import { InitStructure } from "./outfitter-e5x0ybqt.js";
|
|
2
|
+
import { InitPresetId } from "./outfitter-11r5ny73.js";
|
|
3
3
|
import { PostScaffoldResult } from "./outfitter-hcexcvxe.js";
|
|
4
4
|
import { OutputMode } from "@outfitter/cli/types";
|
|
5
5
|
import { Result } from "@outfitter/contracts";
|
|
@@ -13,6 +13,8 @@ interface InitOptions {
|
|
|
13
13
|
readonly bin?: string | undefined;
|
|
14
14
|
/** Preview changes without writing to disk. */
|
|
15
15
|
readonly dryRun?: boolean | undefined;
|
|
16
|
+
/** Example name to overlay pattern-rich scaffold files (e.g., "todo" for cli, "files" for mcp). */
|
|
17
|
+
readonly example?: string | undefined;
|
|
16
18
|
/** Overwrite existing files without prompting. */
|
|
17
19
|
readonly force: boolean;
|
|
18
20
|
/** Timeout in milliseconds for `bun install`. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EngineOptions, ScaffoldError, ScaffoldPlan, ScaffoldResult } from "./outfitter-
|
|
1
|
+
import { EngineOptions, ScaffoldError, ScaffoldPlan, ScaffoldResult } from "./outfitter-crxe5gth.js";
|
|
2
2
|
import { Result } from "@outfitter/contracts";
|
|
3
3
|
declare function executePlan(plan: ScaffoldPlan, options: EngineOptions): Promise<Result<ScaffoldResult, ScaffoldError>>;
|
|
4
4
|
export { executePlan };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TargetCategory, TargetDefinition, TargetId, TargetScope, TargetStatus } from "./outfitter-
|
|
1
|
+
import { TargetCategory, TargetDefinition, TargetId, TargetScope, TargetStatus } from "./outfitter-gsjbcta2.js";
|
|
2
2
|
import { NotFoundError, Result, ValidationError } from "@outfitter/contracts";
|
|
3
3
|
declare const TARGET_REGISTRY: ReadonlyMap<TargetId, TargetDefinition>;
|
|
4
4
|
declare const TARGET_IDS: readonly TargetId[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CliOutputMode } from "./outfitter-
|
|
1
|
+
import { CliOutputMode } from "./outfitter-fhahf9f3.js";
|
|
2
2
|
import { Result } from "@outfitter/contracts";
|
|
3
3
|
import { CoverageLevel, TsDocCheckResult } from "@outfitter/tooling";
|
|
4
4
|
/** Validated input for the check-tsdoc action handler. */
|