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