{"_id":"@boydatsmartshore/create-scaffold","_rev":"2-33cf6976c2c6269b31b3839d00623eb4","name":"@boydatsmartshore/create-scaffold","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@boydatsmartshore/create-scaffold","version":"0.1.0","keywords":["scaffold","starter","template","monorepo","generator","create"],"license":"MIT","_id":"@boydatsmartshore/create-scaffold@0.1.0","maintainers":[{"name":"boydatsmartshore","email":"boyden@smartshore.nl"}],"homepage":"https://github.com/boyd999/create-scaffold#readme","bugs":{"url":"https://github.com/boyd999/create-scaffold/issues"},"bin":{"create-scaffold":"bin/cli.js"},"dist":{"shasum":"1345320cc80894b37f483b2f56f4c3c73e4d529e","tarball":"https://registry.npmjs.org/@boydatsmartshore/create-scaffold/-/create-scaffold-0.1.0.tgz","fileCount":3,"integrity":"sha512-m43dXx+8P6G3vEyqeFReKOfMGEEhKKJ67i5GVernWVPTpbuQvqI2C0QrX/3W+4GIZ888IRuOZZnkRznMaRZP2A==","signatures":[{"sig":"MEUCIQCB0+bqxlEbs0sUBKgbVz9jtQ5zrwM47/jwo1oWGjTxcAIgZ35AtEXYQ1J+YgBYy/qwn1ePKqH56iLrOCgKW9OvAKo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15373},"type":"module","engines":{"node":">=22"},"gitHead":"e3af737d87fb5537daac2be13b6c45c648eb0fc9","_npmUser":{"name":"boydatsmartshore","email":"boyden@smartshore.nl"},"repository":{"url":"git+https://github.com/boyd999/create-scaffold.git","type":"git"},"_npmVersion":"10.9.2","description":"Start a new project from a known-good template — pick a stack, get a working monorepo","directories":{},"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/create-scaffold_0.1.0_1785493599682_0.7395463956983752","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@boydatsmartshore/create-scaffold","version":"0.2.0","description":"Start a new project from a known-good template — pick a stack, get a working monorepo","license":"MIT","type":"module","bin":{"create-scaffold":"bin/cli.js"},"engines":{"node":">=22"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/boyd999/create-scaffold.git"},"homepage":"https://github.com/boyd999/create-scaffold#readme","bugs":{"url":"https://github.com/boyd999/create-scaffold/issues"},"keywords":["scaffold","starter","template","monorepo","generator","create"],"_id":"@boydatsmartshore/create-scaffold@0.2.0","gitHead":"7f14a60aaffc107d88c68253172c84a0bb077f42","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-iB9F2qB5FtmENivt8gC2v0F/zbRJxi4GR2pB4JmRdloYck/HALaWRW+Q4lX7yN6wm9NqHFkbaCEDWC1ZLXthVg==","shasum":"07b6ea6181beaaffacd314469a316837e881dd91","tarball":"https://registry.npmjs.org/@boydatsmartshore/create-scaffold/-/create-scaffold-0.2.0.tgz","fileCount":3,"unpackedSize":18456,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDb0VxMxoun/WAn+F/YTuQfnkfZqmVGFXXa9mFKD6agRAiEAwv2Q6BqUT8QQQ6Yxo9vxlUEK5yP/vh0wNvMFzWsu9DA="}]},"_npmUser":{"name":"boydatsmartshore","email":"boyden@smartshore.nl"},"directories":{},"maintainers":[{"name":"boydatsmartshore","email":"boyden@smartshore.nl"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/create-scaffold_0.2.0_1785567340417_0.13467308641821552"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-31T10:26:39.509Z","modified":"2026-08-01T06:55:40.708Z","0.1.0":"2026-07-31T10:26:39.830Z","0.2.0":"2026-08-01T06:55:40.562Z"},"bugs":{"url":"https://github.com/boyd999/create-scaffold/issues"},"license":"MIT","homepage":"https://github.com/boyd999/create-scaffold#readme","keywords":["scaffold","starter","template","monorepo","generator","create"],"repository":{"type":"git","url":"git+https://github.com/boyd999/create-scaffold.git"},"description":"Start a new project from a known-good template — pick a stack, get a working monorepo","maintainers":[{"name":"boydatsmartshore","email":"boyden@smartshore.nl"}],"readme":"# create-scaffold\n\nStart a new project from a known-good template. Pick a stack, get a working project.\n\n```bash\nnpm create @boydatsmartshore/scaffold my-app\n# or\nnpx @boydatsmartshore/create-scaffold my-app\n```\n\n```\nSelect a stack:\n\n  1) React + NestJS\n     Vite/React + NestJS API, Yarn workspaces, Turborepo, Docker\n  2) Nuxt + Storyblok\n     Nuxt 4 + Storyblok CMS, Tailwind 4, Yarn 4, Docker\n\nStack [1]:\n```\n\nThen:\n\n```bash\ncd my-app\nyarn install && yarn dev\n```\n\nOpen http://localhost:3000. Every stack's landing page is a status indicator, so the dot\ntells you whether the thing it depends on answered.\n\n## Stacks\n\n| id | Stack | npm scope | Template |\n|---|---|---|---|\n| `react-nest` | React + NestJS | yes | [boyd999/starter-react-nest](https://github.com/boyd999/starter-react-nest) |\n| `nuxt-storyblok` | Nuxt + Storyblok | no | [boyd999/starter-nuxt-storyblok](https://github.com/boyd999/starter-nuxt-storyblok) |\n\nSkip the prompt with `--stack <id>`, or see them with `--list`.\n\n`nuxt-storyblok` is a single package with no workspaces, so there's no npm scope in it and\n`--scope` does nothing — the CLI warns rather than silently ignoring the flag. Its landing\npage starts **amber**: copy `.env.example` to `.env` and add a Storyblok delivery token to\nturn it green.\n\n## What it does\n\n1. Clones the stack's template at `--ref` (default `main`) and strips its git history\n2. Renames the stack's placeholders across every text file, including `yarn.lock`:\n   `@acme` → `@<scope>` (only for stacks that have a scope) and `acme` → `<project-name>`\n3. `git init` + a single \"Initial commit\"\n4. Prints what to run next\n\nIt deliberately does **not** install dependencies — that's slow and fails for reasons\nunrelated to scaffolding.\n\n## Options\n\n| Flag | Default | Notes |\n|---|---|---|\n| `--stack <id>` | prompt | skip the stack prompt |\n| `--list` | — | list available stacks and exit |\n| `--scope <name>` | the project name | npm scope, without the `@`. Only used by stacks that have one — see `--list` |\n| `--template <src>` | the stack's template | `owner/repo`, a git URL, or a **local path** |\n| `--ref <ref>` | the stack's ref | branch or tag |\n| `--skip-git` | off | skip init/commit (`--no-git` also accepted) |\n\n```bash\n# scope differing from the project name\nnpx @boydatsmartshore/create-scaffold clientproj --scope boydatsmartshore\n#   → root project \"clientproj\", packages \"@boydatsmartshore/api\" etc.\n\n# test template changes before pushing them\nnpx @boydatsmartshore/create-scaffold my-app --template ../starter-react-nest\n\n# pin a known-good template version\nnpx @boydatsmartshore/create-scaffold my-app --ref v1.0.0\n```\n\nThe prompt is skipped when `--stack` or `--template` is given, and when stdin isn't a\nterminal — so CI and piped input pick the first stack rather than hanging.\n\n`--template` on its own falls back to the **first** stack's tokens and outro, which is\nrarely what you want once there's more than one stack. Pass `--stack` alongside it; the CLI\nprints which stack it picked either way.\n\n## Notes\n\n**On `react-nest`, the first `yarn install` re-sorts `yarn.lock`.** Renaming the workspace\npackages changes where their entries sort alphabetically, so a freshly generated project\nfails `yarn install --immutable` until you've run a plain `yarn install` once. Verified\nharmless: every `version` and `resolution` line is byte-identical, it's purely a reordering,\nand `--immutable` passes from then on. Worth knowing if CI runs against the very first commit.\n\nThis does **not** affect `nuxt-storyblok` — one workspace entry can't be re-sorted relative\nto anything, and `--immutable` passes on a fresh scaffold (verified).\n\n**`main` is production.** The CLI clones each stack's `main` by default, so a broken commit\nin a template breaks scaffolding immediately. Use `--ref` to pin a tag, or change the stack's\n`ref` in `bin/cli.js` once a template stabilises.\n\n**Docker names derive from the project name**, so generated projects never collide:\n`my-app-dev` image, `my-app_node_modules` volumes, `my-app` compose project.\n\n## Adding a stack\n\nAppend an entry to `STACKS` in `bin/cli.js`:\n\n```js\n{\n  id: \"next-fastify\",\n  label: \"Next.js + Fastify\",\n  hint: \"…\",\n  template: \"owner/repo\",\n  ref: \"main\",\n  tokenScope: \"@acme\",   // optional — omit for a template with no npm scope\n  tokenName: \"acme\",     // whatever bare placeholder that template uses\n  outro: \"Then open {url} — …\",   // {url} is substituted\n}\n```\n\nTokens are per-stack, so a new template doesn't have to adopt `@acme`/`acme`. Nothing else\nchanges — the prompt, `--list`, `--stack` validation, the rename and the closing message all\nread from the registry.\n\n## Development\n\nNo dependencies and no build step — Node 22's `util.parseArgs` and `node:readline/promises`\ncover everything, so `bin/cli.js` runs directly.\n\n```bash\nnode bin/cli.js my-test --template ../starter-react-nest\nnpm pack --dry-run\n```\n\nPublishing (scoped packages are private by default; `publishConfig.access` handles that):\n\n```bash\nnpm login\nnpm whoami        # must match the package scope\nnpm publish       # add --otp=<code> if 2FA is on for writes\n```\n\n## Requirements\n\nNode >= 22, and `git` unless you pass a local `--template` path.\n","readmeFilename":"README.md"}