jake 1fc133c7dc fix: harden module-id validation, parallelize registry loading, and redact third-party ids in telemetry
- Add `isLikelyNamespaceTypo` and `isValidModuleId` to `@stanza/registry` and gate both `add` and `remove` on them before any registry fetch or disk write — bare `@ns` specs and path-traversal-style ids now fail fast with a targeted hint instead of an opaque 404
- Add `captureModule` to the telemetry client: mirrors `capture("cli_module", ...)` but redacts the module id when the namespace is not `@stanza` so proprietary ids never leave the user's machine; replace all `capture("cli_module", ...)` call sites in `add`, `remove`, and `init`
- Parallelize `loadRegistries` via `Promise.all` so custom-namespace index fetches happen concurrently; split `tryFetchIndex` into three discrete try/catch blocks that differentiate URL-build errors (surfaced as warnings), network failures (silent), 404s (legitimate no-index), and schema-invalid 200s (warned)
- Re-stamp `version` to `CURRENT_MANIFEST_VERSION` in `readManifest` so older manifests are transparently upgraded in memory and the next `writeManifest` persists the new version; export `CURRENT_MANIFEST_VERSION` and `SUPPORTED_MANIFEST_VERSIONS` from `@stanza/registry`
- Move codemod-catalog id validation before `ensureSlotPackage` in `applyModule` so an unknown codemod id can't bootstrap a slot package and leave it orphaned on a mid-flight throw; validation still runs on `--dry-run`
- Add a dedicated empty-state branch in `search` for namespaces that are configured but expose no browsable index, directing users to `stanza add <category> <ns>/<id>` instead of a generic "No modules found"
2026-05-26 21:03:53 -04:00
2026-05-22 18:37:24 -04:00
2026-05-22 18:37:24 -04:00
2026-05-20 11:52:53 -04:00

Stanza

Modular monorepo template CLI — aka shadcn for full-stack TypeScript projects.

npm init stanza my-revolutionary-app

Pick a framework, ORM, database, auth provider, and UI — get a clean monorepo with idiomatic code, vendored into your repo. Layer in more modules later with stanza-cli add.

Warning

Major work in progress! See the module registry for the roadmap.

Why Stanza?

  • add works after init. Run stanza add on an existing project — it's manifest-driven and peer-aware, so it picks the right adapter for your stack and wires deps, env, and templates into the correct workspace package.
  • Your code, vendored. Generated files land in your repo verbatim. There's no Stanza runtime to install or carry around.
  • Open registry. Modules are static JSON. Point the CLI at your own host and serve custom modules.

Quick start

npm init stanza my-app
cd my-app
npm install
npm run dev

Add a module to an existing project at any time:

npx stanza-cli add auth better-auth

auth, db, and orm install into their own internal workspace packages (packages/auth/, packages/db/, named @<your-app>/auth, @<your-app>/db); your app consumes them via workspace:*. Swapping an auth provider replaces the contents of packages/auth/ without touching your app's imports.

Docs

Full guides and the CLI reference live at stanza.tools/docs. Assemble a stack visually with the builder at stanza.tools.

What's inside

apps/
  cli/            # stanza-cli — the CLI binary
  web/            # https://stanza.tools (TanStack Start)
packages/
  registry/       # shared schema, slot/peer/capability resolver
  codemods/       # ts-morph helpers for region-aware patching
  create-stanza/  # `npm init stanza` template shim
registry/
  modules/        # first-party modules (framework, orm, db, auth, ui, tooling, testing)

License

MIT

S
Description
🥁 shadcn for infrastructure.
https://stanza.tools
Readme MIT
3.7 MiB
Languages
TypeScript 91.5%
MDX 6.1%
CSS 2.2%
JavaScript 0.2%