diff --git a/.changeset/api-category-and-launch-polish.md b/.changeset/api-category-and-launch-polish.md index 396d4c3..47b5fbf 100644 --- a/.changeset/api-category-and-launch-polish.md +++ b/.changeset/api-category-and-launch-polish.md @@ -1,12 +1,8 @@ --- "stanza-cli": minor -"create-stanza": patch +"create-stanza": minor --- Add the **`api`** category to the taxonomy (single-choice, `home: package` → `packages/api/`), matching the documented roadmap for a typed RPC layer between the framework and your services. No first-party modules ship for it yet, so it's inert until a `trpc`/`orpc` module lands — the wizard skips it and the web builder hides it while empty. This is purely additive: `stanza.json`'s schema is unchanged (the `modules` record already keys on arbitrary categories). -`stanza add` now reports a mid-apply failure with recovery guidance instead of a raw stack trace: a region conflict states plainly that nothing was written, while a failure after files were touched points at `stanza remove …` (to sweep what Stanza tracked) and `git restore . && git clean -fd` (to reset a clean worktree) — the latter only suggested when a clean baseline was enforced. - -A `STANZA_REGISTRY` pointed at a local directory now loads a **built** JSON registry (`index.json` + `modules/-.json`) when one is present, so a self-hosted on-disk mirror, an air-gapped install, or a CI fixture works under the published binary — previously a filesystem path only resolved raw `module.ts` sources, which the bundled CLI can't import. - -Both published packages (`stanza-cli`, `create-stanza`) now ship npm READMEs. +Both published packages (`stanza-cli`, `create-stanza`) now ship npm READMEs. `stanza-cli` also exposes a `stanza-cli` binary alongside the primary `stanza` command, so `npx stanza-cli …` (and `bunx` / `pnpm dlx` / `yarn dlx`) resolve predictably regardless of how each runner handles a single differently-named bin. diff --git a/.changeset/config.json b/.changeset/config.json index 5dc5ade..ee82c9d 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,11 +1,19 @@ { "$schema": "https://unpkg.com/@changesets/config@3.1.4/schema.json", - "changelog": ["@changesets/changelog-github", { "repo": "jakejarvis/stanza" }], + "changelog": [ + "@changesets/changelog-github", + { "repo": "jakejarvis/stanza", "disableThanks": true } + ], "commit": false, + "prettier": false, "fixed": [], "linked": [], "access": "public", + "privatePackages": { "version": false, "tag": false }, "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": [] + "ignore": [], + "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": { + "updateInternalDependents": "always" + } } diff --git a/.changeset/registry-main-file-rollback-doctor.md b/.changeset/registry-main-file-rollback-doctor.md index dc30191..23fa8d0 100644 --- a/.changeset/registry-main-file-rollback-doctor.md +++ b/.changeset/registry-main-file-rollback-doctor.md @@ -2,26 +2,10 @@ "stanza-cli": minor --- -Unify registry loading behind a single **main file**, add transactional apply -rollback, and add `stanza doctor`. +Unify registry loading behind a single **main file**, add transactional apply rollback, and add `stanza doctor`. -- **Registry main file.** A registry is now addressed by the full URL/path to - its main JSON file (the index), which carries a required `path` on every - module entry; the loader resolves each module relative to the main file over - `file://` and `http(s)://` identically. The `modules/-.json` - naming convention, the `.ts` source-tree loader, the in-repo auto-detect, and - the inline-template disk fallback are all gone — one loader, no conventions. - `STANZA_REGISTRY` must be the full path/URL to a main JSON file (not a - directory). **Breaking** (pre-release, clean break): the registry index is - now `schemaVersion: 2`, and a third-party `registries` object entry is - `{ url, headers?, params? }` where `url` is the full main-file URL — - `indexUrl` and `{category}`/`{id}` URL templating are removed. +- **Registry main file.** A registry is now addressed by the full URL/path to its main JSON file (the index), which carries a required `path` on every module entry; the loader resolves each module relative to the main file over `file://` and `http(s)://` identically. The `modules/-.json` naming convention, the `.ts` source-tree loader, the in-repo auto-detect, and the inline-template disk fallback are all gone — one loader, no conventions. `STANZA_REGISTRY` must be the full path/URL to a main JSON file (not a directory). **Breaking** (pre-release, clean break): the registry index is now `schemaVersion: 2`, and a third-party `registries` object entry is `{ url, headers?, params? }` where `url` is the full main-file URL — `indexUrl` and `{category}`/`{id}` URL templating are removed. -- **Auto-rollback.** `stanza add` (and each module in `stanza init`) now wraps - its file writes in a transaction: if any step throws — including mid-codemod — - the touched files and `stanza.json` are restored to their pre-apply state - instead of leaving a partial change. +- **Auto-rollback.** `stanza add` (and each module in `stanza init`) now wraps its file writes in a transaction: if any step throws — including mid-codemod — the touched files and `stanza.json` are restored to their pre-apply state instead of leaving a partial change. -- **`stanza doctor`.** New read-only command that checks `stanza.json` against - the filesystem (claimed files/deps/scripts/env vars still present, internal - packages wired) and reports drift, exiting non-zero when found. +- **`stanza doctor`.** New read-only command that checks `stanza.json` against the filesystem (claimed files/deps/scripts/env vars still present, internal packages wired) and reports drift, exiting non-zero when found. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 43aa205..6f8bb22 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,7 +11,7 @@ permissions: {} jobs: release: - name: Version + publish + name: Version & publish runs-on: ubuntu-latest timeout-minutes: 15 permissions: @@ -45,12 +45,9 @@ jobs: id: changesets uses: changesets/action@v1 with: - version: vp exec changeset version + version: vp run version publish: vp run release title: "chore: release" commit: "chore: release" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - # Enable provenance — requires `id-token: write` above. - NPM_CONFIG_PROVENANCE: "true" diff --git a/apps/cli/package.json b/apps/cli/package.json index edc2036..6927809 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "stanza-cli", - "version": "0.1.0", + "version": "0.0.0", "description": "Modular monorepo template CLI — shadcn for stacks.", "keywords": [ "boilerplate", @@ -30,7 +30,8 @@ }, "publishConfig": { "bin": { - "stanza": "./dist/bin.mjs" + "stanza": "./dist/bin.mjs", + "stanza-cli": "./dist/bin.mjs" }, "main": "./dist/index.mjs", "types": "./dist/index.d.mts", @@ -46,7 +47,7 @@ "build": "vp pack" }, "dependencies": { - "@clack/prompts": "^1.4.0", + "@clack/prompts": "^1.5.0", "citty": "^0.2.2", "handlebars": "^4.7.9", "jsonc-parser": "^3.3.1", diff --git a/apps/web/content/docs/agents.mdx b/apps/web/content/docs/agents.mdx index 6be69c0..02efca8 100644 --- a/apps/web/content/docs/agents.mdx +++ b/apps/web/content/docs/agents.mdx @@ -32,6 +32,7 @@ A few rules on top of the [CLI surface](/docs/cli) keep agent runs predictable: - **Pass [`--app=`](/docs/cli#add)** to `add`/`remove` in multi-app projects. Single-app projects auto-target, but if `stanza.json`'s `apps` array has more than one entry, scripts should pass the flag explicitly rather than relying on cwd inference. - **`stanza.json` is generated state.** Don't hand-edit it; use the verbs that maintain it (`add`, `remove`). - **Generated files are user-owned source.** Once Stanza writes a template, edit it like any other file in the repo. +- **Verify with [`stanza doctor`](/docs/cli#doctor).** It reports drift between `stanza.json` and the filesystem and exits non-zero, so a script can gate on it after a run or after hand-edits. ## Common errors @@ -67,8 +68,9 @@ npx -y stanza-cli@latest add auth better-auth --dry-run npx -y stanza-cli@latest add auth better-auth pnpm install -# 4. Inspect. +# 4. Inspect + verify. npx -y stanza-cli@latest list +npx -y stanza-cli@latest doctor # confirm the project matches its manifest ``` When reporting results back to the user, include the exact command run, whether it wrote files, and any follow-up install needed. diff --git a/apps/web/content/docs/authoring.mdx b/apps/web/content/docs/authoring.mdx index 2ed9593..7080fe8 100644 --- a/apps/web/content/docs/authoring.mdx +++ b/apps/web/content/docs/authoring.mdx @@ -297,7 +297,7 @@ Module authors don't run a separate validation step — the same Zod schemas the - `vp test` runs the whole repo's schema + resolver tests; add a fixture under `registry/modules//` and the existing suite picks it up. - `vp check` does a type-aware lint pass that catches most authoring mistakes statically. -For a third-party registry, the same `ModuleSchema` ships from `@stanza/registry`. The simplest test loop is to point the consumer's `STANZA_REGISTRY` at a local directory (`STANZA_REGISTRY=./path/to/your/registry stanza search`) and watch for parse errors. +For a third-party registry, the same `ModuleSchema` ships from `@stanza/registry`. The simplest test loop is to build your registry and point the consumer's `STANZA_REGISTRY` at the built main file (`STANZA_REGISTRY=./out/registry/index.json stanza search`) and watch for parse errors. ## Building a registry @@ -306,7 +306,7 @@ The build script ([`packages/registry/src/build.ts`](https://github.com/jakejarv ``` / ├── registry/ -│ ├── index.json # categories + per-module summaries +│ ├── index.json # main file: categories + per-module summaries (each with a `path`) │ └── modules/ │ ├── -.json # one file per module, templates inlined │ └── … @@ -329,32 +329,31 @@ For a third-party registry, fork the build script (or call it as a library) agai ## Hosting a registry -A registry is plain static JSON — host it anywhere that serves files: a CDN, Vercel/Netlify/Cloudflare Pages, GitHub Pages, S3 + CloudFront, your own Nginx, etc. No runtime, no DB, no SSR. The two URL shapes Stanza understands: +A registry is plain static JSON — host it anywhere that serves files: a CDN, Vercel/Netlify/Cloudflare Pages, GitHub Pages, S3 + CloudFront, your own Nginx, etc. No runtime, no DB, no SSR. -**Canonical layout** (string shorthand in `stanza.json`): +A registry is addressed by the **full URL to its main JSON file** (the index). Every module entry in that file carries a relative `path`, which the CLI resolves against the main file's URL — so the directory layout is a convention, not a requirement: ``` -https://reg.acme.dev/ -├── index.json +https://reg.acme.example/ +├── index.json # the main file — each module entry carries a `path` └── modules/ ├── testing-cosmos.json └── auth-something.json ``` -Declared as: +Declared as the full URL to that main file: ```jsonc -{ "registries": { "@acme": "https://reg.acme.dev" } } +{ "registries": { "@acme": "https://reg.acme.example/index.json" } } ``` -**Custom layout** (object form with URL template): +The build names the main file `index.json`, but the loader resolves whatever URL you give it — the filename isn't special. For auth headers or query params, use the object form: ```jsonc { "registries": { "@acme": { - "url": "https://api.acme.dev/r/{category}/{id}.json", - "indexUrl": "https://api.acme.dev/r/index.json", + "url": "https://reg.acme.example/index.json", "headers": { "Authorization": "Bearer ${ACME_TOKEN}" }, "params": { "version": "stable" }, }, @@ -362,7 +361,7 @@ Declared as: } ``` -`{category}` and `{id}` are both required placeholders; `indexUrl` is optional (without it the registry is fetch-by-name only — modules still install, but `stanza search` skips that namespace). Headers and params support `${ENV_VAR}` expansion against `process.env`; a header whose template references an unset variable is silently dropped, while an unset variable in `params` is a hard error. +`url` is the full URL to the main file — there's no filename convention and no `{category}`/`{id}` templating, since each module's location comes from its `path` in the main file. Headers and params support `${ENV_VAR}` expansion against `process.env`; a header whose template references an unset variable is silently dropped, while an unset variable in `params` is a hard error. ## Publishing under your own namespace @@ -372,7 +371,7 @@ There's no central registry to list with. Pick an `@scope` (the naming rule is t // users add to their stanza.json { "registries": { - "@acme": "https://reg.acme.dev", + "@acme": "https://reg.acme.example/index.json", }, } ``` @@ -384,7 +383,7 @@ stanza add testing @acme/cosmos Unknown namespaces fail fast — there's no implicit fallback to `@stanza`, so a typo can't leak a private module name to the public registry. The chosen namespace is recorded on the manifest module record (`stanza remove` knows where to refetch from). -`@stanza` is reserved. Declaring it under `registries` is a schema error; to override its URL (for a fully-mirrored self-hosted registry or to pin a fixture in CI), set the `STANZA_REGISTRY` env var. +`@stanza` is reserved. Declaring it under `registries` is a schema error; to override its source (for a fully-mirrored self-hosted registry or to pin a fixture in CI), set the `STANZA_REGISTRY` env var to the full URL or filesystem path of a main JSON file. ## What third-party modules can do @@ -430,14 +429,14 @@ out/registry/ └── testing-cosmos.json ``` -**3. Host it.** Push `out/registry/` (or its parent) to wherever you serve static files. Say it ends up at `https://reg.acme.dev/`. +**3. Host it.** Push `out/registry/` (or its parent) to wherever you serve static files. Say the main file ends up at `https://reg.acme.example/index.json`. **4. Tell users how to install.** Their `stanza.json`: ```jsonc { "registries": { - "@acme": "https://reg.acme.dev", + "@acme": "https://reg.acme.example/index.json", }, } ``` diff --git a/apps/web/content/docs/cli.mdx b/apps/web/content/docs/cli.mdx index 86b57d3..d84b43a 100644 --- a/apps/web/content/docs/cli.mdx +++ b/apps/web/content/docs/cli.mdx @@ -3,7 +3,7 @@ title: CLI description: The Stanza command-line verbs, flags, and environment variables. --- -Stanza ships five verbs against the category taxonomy. Run any verb with `--help` for its full flag list: +Stanza ships six verbs against the category taxonomy. Run any verb with `--help` for its full flag list: ```sh npx stanza-cli add --help @@ -32,7 +32,7 @@ Add one module to an existing project. npx stanza-cli add [--app=] ``` -Resolves peers, selects the matching adapter, and writes the module's templates, deps, env, and scripts to the right home. Adding a module to a single-choice category that's already filled fails until you remove the existing one — and that limit is **per app** for `home: "app"` categories (so picking a framework for one app doesn't block a different framework for another). +Resolves peers, selects the matching adapter, and writes the module's templates, deps, env, and scripts to the right home. If an apply step fails partway through — including inside a codemod — Stanza rolls the changes back, so a failed `add` leaves your tree as it was. Adding a module to a single-choice category that's already filled fails until you remove the existing one — and that limit is **per app** for `home: "app"` categories (so picking a framework for one app doesn't block a different framework for another). - `--app=` — pick which app the install targets. Required for app-relevant modules when the project has multiple apps and you're not running inside one of them. Single-app projects auto-target; multi-app projects also auto-pick when `cwd` is inside one app's directory. Interactive runs (TTY, no `--yes`) fall back to a prompt; non-interactive runs error out asking for the flag. - The flag is meaningless for `home: "repo"` modules like `tooling`. @@ -67,6 +67,16 @@ npx stanza-cli search [query] Use the printed **id** (not the display label) when passing a module to `add`. +## `doctor` + +Check `stanza.json` against the filesystem and report drift, without changing anything. + +```sh +npx stanza-cli doctor +``` + +Walks every [region](/docs/concepts#regions) claim in the manifest and verifies it still holds on disk — claimed files exist, claimed dependencies/scripts/env vars are still present, and each internal package with claims is wired into its consuming apps. Read-only; exits non-zero when it finds drift, so it slots into CI or a pre-commit check. It doesn't repair anything — use `add` / `remove` for that. + **Planned:** `swap` (replace a module with another in the same category) and `update` (re-pull a module at a newer version) are on the roadmap. The manifest already reserves the fields they need; @@ -83,7 +93,7 @@ These apply to the mutating verbs (`init`, `add`, `remove`): ## Environment variables -- `STANZA_REGISTRY=` — override the `@stanza` default namespace's URL (or filesystem path). For per-namespace third-party registries, use the `registries` field in `stanza.json` instead — see [Third-party registries](/docs/registry#third-party-registries). +- `STANZA_REGISTRY=` — override the `@stanza` default namespace's source: the full URL or filesystem path to a registry's **main JSON file** (not a directory). For per-namespace third-party registries, use the `registries` field in `stanza.json` instead — see [Third-party registries](/docs/registry#third-party-registries). - `STANZA_NO_NPM_LOOKUP=1` — skip npm version lookups and write dependency ranges verbatim. - `STANZA_NPM_REGISTRY=` — override the npm registry used for version lookups. - `STANZA_TELEMETRY=0` / `DO_NOT_TRACK=1` — disable telemetry persistently. Telemetry is also auto-skipped in CI. @@ -95,7 +105,7 @@ Stanza captures a small set of anonymous events to help us see which modules peo **What's sent** -- The command name (`init`, `add`, `remove`, `list`, `search`), its duration in milliseconds, and whether it succeeded. +- The command name (`init`, `add`, `remove`, `list`, `search`, `doctor`), its duration in milliseconds, and whether it succeeded. - CLI version, Node version, OS, and architecture. - For installs and removes: the module id, its category, and the namespace it came from (e.g. `@stanza` or `@acme`). - An ephemeral UUID generated per process so events from the same run can be grouped. It's regenerated next time and never persisted. diff --git a/apps/web/content/docs/concepts.mdx b/apps/web/content/docs/concepts.mdx index 79feedb..842ada1 100644 --- a/apps/web/content/docs/concepts.mdx +++ b/apps/web/content/docs/concepts.mdx @@ -52,10 +52,10 @@ A `one` category holds at most one module — adding a second fails until you re - **Planned:** more categories are on the roadmap — `api`, `ai`, `payments`, `email` (single-choice) - and `deploy` (coexisting). They aren't shipping yet, but the taxonomy is designed to absorb them - without breaking existing projects. See the [module registry](/docs/registry) for the full - roadmap. + The table above is a representative subset. The full taxonomy also includes `ai`, `payments`, + `email`, and `monorepo` (single-choice) and `deploy` (coexisting) — most with modules available + today — plus `api` (single-choice), defined with its modules on the roadmap. See the [module + registry](/docs/registry) for the complete list and per-module status. ## Vendoring diff --git a/apps/web/content/docs/getting-started.mdx b/apps/web/content/docs/getting-started.mdx index bae3dca..797f756 100644 --- a/apps/web/content/docs/getting-started.mdx +++ b/apps/web/content/docs/getting-started.mdx @@ -7,7 +7,7 @@ Scaffold a new monorepo, then layer in modules as you go. ## Prerequisites -- **Node.js** 20 or newer. +- **Node.js** 22 or newer. - A package manager — **pnpm** (recommended), **npm**, or **bun**. Stanza writes a workspace-based monorepo, so a workspace-aware package manager is required. ## Create a project @@ -57,6 +57,7 @@ pnpm install ```sh npx stanza-cli list # show installed modules, grouped by category +npx stanza-cli doctor # check the project still matches its manifest npx stanza-cli search drizzle # find modules in the registry by query npx stanza-cli remove auth # remove a module and sweep the files it owns ``` diff --git a/apps/web/content/docs/registry.mdx b/apps/web/content/docs/registry.mdx index 969eb37..a2e406e 100644 --- a/apps/web/content/docs/registry.mdx +++ b/apps/web/content/docs/registry.mdx @@ -171,10 +171,10 @@ Not a category — a top-level field in `stanza.json` (`packageManager: "pnpm" | The categories above are first-party — Stanza ships them under the default `@stanza` namespace. Anyone can publish additional modules under their own `@scope` and have users install them with `stanza add @scope/`. The category taxonomy itself stays first-party (third-party registries can't redefine it). -For consumers, declaring a registry is a few lines in `stanza.json`: +For consumers, declaring a registry is the full URL of its main JSON file in `stanza.json`: ```jsonc -{ "registries": { "@acme": "https://reg.acme.dev" } } +{ "registries": { "@acme": "https://reg.acme.example/index.json" } } ``` For authors, the full module surface — `defineModule`, templates, codemods, the build pipeline, hosting, namespace conventions, and a worked example — lives in the [Authoring manual](/docs/authoring). diff --git a/apps/web/package.json b/apps/web/package.json index ed17553..fbf3315 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@stanza/web", - "version": "0.1.0", + "version": "0.0.0", "private": true, "license": "MIT", "type": "module", @@ -23,9 +23,9 @@ "@tanstack/react-devtools": "^0.10.5", "@tanstack/react-hotkeys": "^0.10.0", "@tanstack/react-pacer": "^0.22.1", - "@tanstack/react-router": "^1.170.9", + "@tanstack/react-router": "^1.170.10", "@tanstack/react-router-devtools": "^1.167.0", - "@tanstack/react-start": "^1.168.16", + "@tanstack/react-start": "^1.168.18", "@vercel/analytics": "^2.0.1", "@vercel/functions": "^3.6.1", "class-variance-authority": "^0.7.1", diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 46dc4b3..4c9b538 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -7,11 +7,12 @@ import mdx from "fumadocs-mdx/vite"; import { nitro } from "nitro/vite"; import { defineConfig, lazyPlugins } from "vite-plus"; +import { version as cliVersion } from "../cli/package.json" with { type: "json" }; import { listPrerenderPages } from "./src/lib/prerender.ts"; export default defineConfig({ define: { - __APP_VERSION__: JSON.stringify(process.env.npm_package_version), + __APP_VERSION__: JSON.stringify(cliVersion), }, plugins: lazyPlugins(async () => [ mdx(await import("./source.config.ts")), diff --git a/package.json b/package.json index 09eab78..d9801f1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "stanza", - "version": "0.1.0", + "version": "0.0.0", "private": true, "description": "Modular monorepo template CLI — shadcn for stacks.", "license": "MIT", @@ -17,7 +17,8 @@ "fmt": "vp fmt", "fmt:check": "vp fmt --check", "changeset": "vp exec changeset", - "release": "vp run build:cli && changeset publish", + "version": "vp exec changeset version", + "release": "vp run build:cli && vp exec changeset publish", "prepare": "vp config" }, "devDependencies": { diff --git a/packages/codemods/package.json b/packages/codemods/package.json index ca3951b..d4308c7 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,6 +1,6 @@ { "name": "@stanza/codemods", - "version": "0.1.0", + "version": "0.0.0", "private": true, "license": "MIT", "type": "module", diff --git a/packages/create-stanza/package.json b/packages/create-stanza/package.json index 79968c3..bcfa3fb 100644 --- a/packages/create-stanza/package.json +++ b/packages/create-stanza/package.json @@ -1,6 +1,6 @@ { "name": "create-stanza", - "version": "0.1.0", + "version": "0.0.0", "description": "`npm init stanza` — the canonical entry point to the stanza wizard.", "keywords": [ "cli", diff --git a/packages/registry/package.json b/packages/registry/package.json index 86a1164..89c2ad9 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -1,6 +1,6 @@ { "name": "@stanza/registry", - "version": "0.1.0", + "version": "0.0.0", "private": true, "license": "MIT", "type": "module", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9db6b80..06a55a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,8 +40,8 @@ importers: apps/cli: dependencies: '@clack/prompts': - specifier: ^1.4.0 - version: 1.4.0 + specifier: ^1.5.0 + version: 1.5.0 citty: specifier: ^0.2.2 version: 0.2.2 @@ -128,14 +128,14 @@ importers: specifier: ^0.22.1 version: 0.22.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-router': - specifier: ^1.170.9 - version: 1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: ^1.170.10 + version: 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-router-devtools': specifier: ^1.167.0 - version: 1.167.0(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.7)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: 1.167.0(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.8)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-start': - specifier: ^1.168.16 - version: 1.168.16(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: ^1.168.18 + version: 1.168.18(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@vercel/analytics': specifier: ^2.0.1 version: 2.0.1(react@19.2.6) @@ -150,13 +150,13 @@ importers: version: 2.1.1 fumadocs-core: specifier: ^16.9.3 - version: 16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + version: 16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) fumadocs-mdx: specifier: ^15.0.10 - version: 15.0.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.15)(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react@19.2.6)(rolldown@1.0.3) + version: 15.0.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.15)(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react@19.2.6)(rolldown@1.0.3) fumadocs-ui: specifier: npm:@fumadocs/base-ui@^16.9.3 - version: '@fumadocs/base-ui@16.9.3(@tailwindcss/oxide@4.3.0)(@takumi-rs/image-response@1.6.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/mdx@2.0.13)(@types/react@19.2.15)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0)' + version: '@fumadocs/base-ui@16.9.3(@tailwindcss/oxide@4.3.0)(@takumi-rs/image-response@1.6.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/mdx@2.0.13)(@types/react@19.2.15)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0)' lru-cache: specifier: ^11.5.1 version: 11.5.1 @@ -757,12 +757,12 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@clack/core@1.3.1': - resolution: {integrity: sha512-fT1qHVGAag4IEkrupZ6lRRbNCs1vS9P01KB/sG8zKgvUztbYtFBtQpjSITNwooDZ83tpsPzP0mRNs1/KVszCRA==} + '@clack/core@1.4.0': + resolution: {integrity: sha512-7Wctjq6f7c1CPz8sPpkwUnz8yRgVANkpNupb81q432FjcJg4l+Sw7XANdNSdWfAKq0IHI0JTcUeK5dxs/HrGPw==} engines: {node: '>= 20.12.0'} - '@clack/prompts@1.4.0': - resolution: {integrity: sha512-S0My7XPGIgpRWMDG8uRqalbgT+a6FmCUdOW+HaIOVVpUPHOb7RrpvjTjiODadKp06fsrVDJZlIzc6yCTp4AnxA==} + '@clack/prompts@1.5.0': + resolution: {integrity: sha512-wKh+wTjmrUoUdkZg8KpJO5X+p9PWV+KE9mePseq9UYWkukgTKsGS47RRL2HstwVcvDQH+PenrPJWII8+MfiiyA==} engines: {node: '>= 20.12.0'} '@csstools/color-helpers@6.0.2': @@ -801,8 +801,8 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} - '@dotenvx/dotenvx@1.69.1': - resolution: {integrity: sha512-kwQB5KcAegxw/+NGUgXAo5ovyOSjlMhoXSSnSEpDhoHJwzMcMO0HE1U0VCYZ7jbAeCMGamed9XdWzOA5ixtTNg==} + '@dotenvx/dotenvx@1.69.2': + resolution: {integrity: sha512-60Vh31k5bAAPq57Isx+Iopl2FrZQzZyUc4kh/OESgXiwhrKXqdxEn3JGTGSawng1DkkeC4jofFq1VpPJqNQx4w==} hasBin: true '@ecies/ciphers@0.2.6': @@ -1043,22 +1043,22 @@ packages: peerDependencies: hono: ^4 - '@inquirer/ansi@2.0.6': - resolution: {integrity: sha512-I/INw4sHGlVZ/afZOckpLiDP9SmbMl1g/GCqeHjLw1Afw/0PlRs2tRFgTGWmdI0hoNuWZn3y2iHNmG1vyECyQQ==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/confirm@6.1.0': - resolution: {integrity: sha512-USpeB76eqK7yGricDlGAupxWlp4a59qpeZOoNWaxO/nJln7agpJveyNkQ1d5u8YXG6TOqxZtQpKPORQQDrdVsA==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/confirm@6.1.1': + resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/core@11.2.0': - resolution: {integrity: sha512-joR1YS2sI0us+9d0I8ViqFbrRLONO8CFTuyvBX4ZVBSch+VsZiugUABdrhBXXJR1VyEzvpz5SQCix3keETQ58g==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/core@11.2.1': + resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1074,13 +1074,13 @@ packages: '@types/node': optional: true - '@inquirer/figures@2.0.6': - resolution: {integrity: sha512-dsZgQtH2t5Q6ah3aPbZbeEZAxsD9qQu0DXf01AltuEfRTm+NoLN6+rLVbr+4edeEbNCp/wBNM6mALRWtsQpfkw==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/figures@2.0.7': + resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/type@4.0.6': - resolution: {integrity: sha512-J+9tdxOskuYuGjsvGaq00AamhDgjR7anhEW2dP4QdQpFCMPngCeC/bCYWQ5NsMWZRdsy53is7kAHb/+7cwDk2g==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/type@4.0.7': + resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -2168,22 +2168,22 @@ packages: '@tanstack/router-core': optional: true - '@tanstack/react-router@1.170.9': - resolution: {integrity: sha512-rXXztp6GyXFwResQR0jdvkf52wy/sAQqze3OR08+8uNM7nHir1P46qBrwg2TL5EEtX+0WUho4BZ/nMpAgQVB6A==} + '@tanstack/react-router@1.170.10': + resolution: {integrity: sha512-gVmWYq0ucWr+OB97Nud0YhKa9NOipB7/QrWI7wRZJJWEL0qUS8WPqAs0vA1f3IBXZpXmf8xxzf/tl5cmo4tlmA==} engines: {node: '>=20.19'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.168.6': - resolution: {integrity: sha512-6G/ef89hx3yWfoHLKpDxDpgMsje889bh8tpy6SMeELrCW6ob8x0G+peoFpB5zhNVE03wCFXhImM6KkZFRwSyaQ==} + '@tanstack/react-start-client@1.168.7': + resolution: {integrity: sha512-ldvWrNvXb/EXAY+8uj0XbkVlP0Uh6Ddm63NNNKWf5V2BcQ6KRxiZgANXLWlKRczmnklZiwN2eWFexEJFEzetLQ==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-rsc@0.1.15': - resolution: {integrity: sha512-AdO+3OQicxFibsXEOIG2u2aRIAc1KIWMC98iiwaIUw/1ObP7uilZcYQynwdDeqsGKd0Ulr+tXZXebLdQwV4OeA==} + '@tanstack/react-start-rsc@0.1.17': + resolution: {integrity: sha512-qOgOccz24i7mRnTzARSB6sWJa4kSon3AVyQ7NowJ1/o2VquHpblu7OY2sdxSbOqU0e3t6fSgqu08RTym47H1Fw==} engines: {node: '>=22.12.0'} peerDependencies: '@rspack/core': '>=2.0.0-0' @@ -2199,15 +2199,15 @@ packages: react-server-dom-rspack: optional: true - '@tanstack/react-start-server@1.167.11': - resolution: {integrity: sha512-7IOSbMJ7mvNbcI6/LAHsYbhR+oIxDfZlWSBau1E/l2tY2HSnKdtu+tj1yTY7zgwqEdn14IyGFSxpHe/eTFNB5g==} + '@tanstack/react-start-server@1.167.13': + resolution: {integrity: sha512-u/nfkW9M79HRx45uJipEi6txjfTJhYTFUirBSm7jqZfId7RRDfV+j38fipGhbIbCjCkHd6hPbUzJAnQFoM0uqg==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.168.16': - resolution: {integrity: sha512-ZkrGThxJG0SPg5V+VB4C+7KKx8kl1vo1lQY9FR2t6EqNKfZhl5N9qpkPOeyJNhse1pqe8Ihbv8LNL9c1/SohkQ==} + '@tanstack/react-start@1.168.18': + resolution: {integrity: sha512-IRYbUPgUToyt1W9KJJB3oG/OUmqYOfHW521cPe5pZhJe3LkaTdtu7KpHsW4p6z+su8CfN7n9oofb0vY36lXRkg==} engines: {node: '>=22.12.0'} peerDependencies: '@rsbuild/core': ^2.0.0 @@ -2235,8 +2235,8 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.171.7': - resolution: {integrity: sha512-AboyQD0OPIu0adJi6HeCupTU9Wx7zr4q4ceJYQdBL3mLH18m4M57XXdzJdtzOg/twl8DtWej0RGJ12ma8CV1iQ==} + '@tanstack/router-core@1.171.8': + resolution: {integrity: sha512-PbrTBbofFcacrH3RLgHYILRqTFnAGq+gXrXoA/vo7qUSkJpSO4GWfLtrtCahD4VayzRm19IPwcjPPLEugag6pw==} engines: {node: '>=20.19'} '@tanstack/router-devtools-core@1.168.0': @@ -2249,16 +2249,16 @@ packages: csstype: optional: true - '@tanstack/router-generator@1.167.11': - resolution: {integrity: sha512-Wnom12QTx0lreBQEL3zE2N88SDIT6xferScd46dnPCEYR8u+AkBBGRzlzZEpniIm+eF3byvIKBjYQgemdadoFg==} + '@tanstack/router-generator@1.167.12': + resolution: {integrity: sha512-FGr7nn6VhjL53TUCTyDgApSkAYRxhId+v0HVQdSu0ADkNuHY+sUnYEMqiF6aN82jYWuXzrSL1xazg6/rfEP82g==} engines: {node: '>=20.19'} - '@tanstack/router-plugin@1.168.12': - resolution: {integrity: sha512-DqeJs+/LinTsTc6gIsloauHdCjePk6pmhpmcqrNWbNi8dS+QMj2UZ4HgU9JgOiYGznkd49i8BeQJFUxzASmr7Q==} + '@tanstack/router-plugin@1.168.13': + resolution: {integrity: sha512-LnepwDai+TaC4K3aZeXrrKpnGoP8xGGilVGFfa5flGgC3+jCSBysb8SktidRE8eF2/iOzCQC0LIGirtMyZepSA==} engines: {node: '>=20.19'} peerDependencies: '@rsbuild/core': '>=1.0.2 || ^2.0.0' - '@tanstack/react-router': ^1.170.9 + '@tanstack/react-router': ^1.170.10 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' vite-plugin-solid: ^2.11.10 || ^3.0.0-0 webpack: '>=5.92.0' @@ -2278,16 +2278,16 @@ packages: resolution: {integrity: sha512-62layyTGmclHDQS/eidwKRfN1hhCKwViG7iEBcVmL0MXgcAB3OOucWCEcDDGd9Cu11H6b4QQ5oOo47MWIqwz0A==} engines: {node: '>=20.19'} - '@tanstack/start-client-core@1.170.5': - resolution: {integrity: sha512-rtL6JyEB7/zeylgOjwtFEtmTIwRUm4Mf4bEhp2yUVk8kB4zLlmYcpSAFbb/aIrLp/Yl9XS2dx3OxB7oIPUuplg==} + '@tanstack/start-client-core@1.170.6': + resolution: {integrity: sha512-Zh4JY3bWiM8K807CnyRE/+53YiUx/R6nRhQr1BSxaXM3iFh9/FxoN4peK+yhkG7Hq/O2AGBWHt9yscxrsFD5+g==} engines: {node: '>=22.12.0'} '@tanstack/start-fn-stubs@1.162.0': resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.171.8': - resolution: {integrity: sha512-Eoe83LD3N7AQgsjb+uRq+DjUE82+e8liYqzfIVoZ03t4+XfHtTbMBB+f6XK2kUzTv4QBG7ZmZU959jWwQHfVTQ==} + '@tanstack/start-plugin-core@1.171.10': + resolution: {integrity: sha512-HYYcgwjnuGIMn7wgASM6AryKktyQ06FwziFDP3d93APFmC8dLPadSzvwV/AUWvPQYCQq2Dp9SAX3byXEMvjO7g==} engines: {node: '>=22.12.0'} peerDependencies: '@rsbuild/core': ^2.0.0 @@ -2298,12 +2298,12 @@ packages: vite: optional: true - '@tanstack/start-server-core@1.169.6': - resolution: {integrity: sha512-Qf+Uinnc5Ak79QGD6pJsiK0IfUlWkyJNy+h9vTwOtVLBvmq/fR7GjBuf5ymidI/7jK/YQWVuw2aaEE6MHBC+iw==} + '@tanstack/start-server-core@1.169.8': + resolution: {integrity: sha512-yVhdg9QLNUrXdXDn5kN76u0YFKraR7bgb6ZFqHCbX63sTPabD4Z1fBr68PnzqKWB2gXfJmP9JN1puvcdChKeYA==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.167.9': - resolution: {integrity: sha512-RKxJA95HgZXu2lgTCzGi7pShtgz7vyvDTEPOJfJBBMHM2S7SX/WLYTHqfHcYvbOzREXOxEbDQ8Hvtt0Klq8VKg==} + '@tanstack/start-storage-context@1.167.10': + resolution: {integrity: sha512-geCsFpgCt+S2gQjzXILdPZ9obIxtzuN8C0Esc1fcyWZhwYyqo4C8G2o/dIck8xGixCMSvOsxL5NkCXDdOm2KOQ==} engines: {node: '>=22.12.0'} '@tanstack/store@0.11.0': @@ -2739,8 +2739,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.10.32: - resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==} + baseline-browser-mapping@2.10.33: + resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==} engines: {node: '>=6.0.0'} hasBin: true @@ -4252,9 +4252,9 @@ packages: typescript: optional: true - mute-stream@4.0.0: - resolution: {integrity: sha512-gSrprq0fJ3EiOErzjdIZrjysVVmJ4uu1QWfCDss5LypA5OXvrMje5Ym5z6V6RLyJ2eF87lasX7t6a0AnFvZblg==} - engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} @@ -5060,11 +5060,11 @@ packages: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} - tldts-core@7.4.1: - resolution: {integrity: sha512-sc2nGvGbixlJRHwTh/qQdPXTxJU1UDJboGPQm4d/01YUJ9r/u6aeIulQvEaxUlvKDN7hb1qCLjax+jhVAPLa/g==} + tldts-core@7.4.2: + resolution: {integrity: sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==} - tldts@7.4.0: - resolution: {integrity: sha512-yHBe+zVfzNZ3QfTPW/Z6KK1G2t340gFjMHqI/4KKSt/abzYydzuCnpqdaF5gCCABby+9Yfbj59oR5F2Fd5CBzg==} + tldts@7.4.2: + resolution: {integrity: sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==} hasBin: true to-regex-range@5.0.1: @@ -5898,14 +5898,14 @@ snapshots: human-id: 4.1.3 prettier: 2.8.8 - '@clack/core@1.3.1': + '@clack/core@1.4.0': dependencies: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@clack/prompts@1.4.0': + '@clack/prompts@1.5.0': dependencies: - '@clack/core': 1.3.1 + '@clack/core': 1.4.0 fast-string-width: 3.0.2 fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 @@ -5934,7 +5934,7 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} - '@dotenvx/dotenvx@1.69.1': + '@dotenvx/dotenvx@1.69.2': dependencies: commander: 11.1.0 dotenv: 17.4.2 @@ -6071,12 +6071,12 @@ snapshots: '@fontsource-variable/geist@5.2.9': {} - '@fumadocs/base-ui@16.9.3(@tailwindcss/oxide@4.3.0)(@takumi-rs/image-response@1.6.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/mdx@2.0.13)(@types/react@19.2.15)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0)': + '@fumadocs/base-ui@16.9.3(@tailwindcss/oxide@4.3.0)(@takumi-rs/image-response@1.6.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/mdx@2.0.13)(@types/react@19.2.15)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0)': dependencies: '@base-ui/react': 1.5.0(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@fumadocs/tailwind': 0.0.5(@tailwindcss/oxide@4.3.0)(tailwindcss@4.3.0) class-variance-authority: 0.7.1 - fumadocs-core: 16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + fumadocs-core: 16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) lucide-react: 1.17.0(react@19.2.6) motion: 12.40.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) next-themes: 0.4.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -6108,23 +6108,23 @@ snapshots: dependencies: hono: 4.12.23 - '@inquirer/ansi@2.0.6': {} + '@inquirer/ansi@2.0.7': {} - '@inquirer/confirm@6.1.0(@types/node@25.9.1)': + '@inquirer/confirm@6.1.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 11.2.0(@types/node@25.9.1) - '@inquirer/type': 4.0.6(@types/node@25.9.1) + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: '@types/node': 25.9.1 - '@inquirer/core@11.2.0(@types/node@25.9.1)': + '@inquirer/core@11.2.1(@types/node@25.9.1)': dependencies: - '@inquirer/ansi': 2.0.6 - '@inquirer/figures': 2.0.6 - '@inquirer/type': 4.0.6(@types/node@25.9.1) + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) cli-width: 4.1.0 fast-wrap-ansi: 0.2.2 - mute-stream: 4.0.0 + mute-stream: 3.0.0 signal-exit: 4.1.0 optionalDependencies: '@types/node': 25.9.1 @@ -6136,9 +6136,9 @@ snapshots: optionalDependencies: '@types/node': 25.9.1 - '@inquirer/figures@2.0.6': {} + '@inquirer/figures@2.0.7': {} - '@inquirer/type@4.0.6(@types/node@25.9.1)': + '@inquirer/type@4.0.7(@types/node@25.9.1)': optionalDependencies: '@types/node': 25.9.1 @@ -6951,45 +6951,45 @@ snapshots: react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - '@tanstack/react-router-devtools@1.167.0(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.7)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-router-devtools@1.167.0(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.8)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/react-router': 1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-devtools-core': 1.168.0(@tanstack/router-core@1.171.7)(csstype@3.2.3) + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-devtools-core': 1.168.0(@tanstack/router-core@1.171.8)(csstype@3.2.3) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@tanstack/router-core': 1.171.7 + '@tanstack/router-core': 1.171.8 transitivePeerDependencies: - csstype - '@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@tanstack/history': 1.162.0 '@tanstack/react-store': 0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-core': 1.171.7 + '@tanstack/router-core': 1.171.8 isbot: 5.1.40 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - '@tanstack/react-start-client@1.168.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-start-client@1.168.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/react-router': 1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-core': 1.171.7 - '@tanstack/start-client-core': 1.170.5 + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.171.8 + '@tanstack/start-client-core': 1.170.6 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - '@tanstack/react-start-rsc@0.1.15(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-start-rsc@0.1.17(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/react-router': 1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/react-start-server': 1.167.11(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-core': 1.171.7 + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-start-server': 1.167.13(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.171.8 '@tanstack/router-utils': 1.162.1 - '@tanstack/start-client-core': 1.170.5 + '@tanstack/start-client-core': 1.170.6 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.8(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16)) - '@tanstack/start-server-core': 1.169.6(crossws@0.4.5(srvx@0.11.16)) - '@tanstack/start-storage-context': 1.167.9 + '@tanstack/start-plugin-core': 1.171.10(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/start-server-core': 1.169.8(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/start-storage-context': 1.167.10 pathe: 2.0.3 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) @@ -7003,28 +7003,28 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start-server@1.167.11(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-start-server@1.167.13(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@tanstack/history': 1.162.0 - '@tanstack/react-router': 1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/router-core': 1.171.7 - '@tanstack/start-client-core': 1.170.5 - '@tanstack/start-server-core': 1.169.6(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.171.8 + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-server-core': 1.169.8(crossws@0.4.5(srvx@0.11.16)) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.168.16(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-start@1.168.18(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/react-router': 1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/react-start-client': 1.168.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/react-start-rsc': 0.1.15(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@tanstack/react-start-server': 1.167.11(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-start-client': 1.168.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-start-rsc': 0.1.17(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-start-server': 1.167.13(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/router-utils': 1.162.1 - '@tanstack/start-client-core': 1.170.5 - '@tanstack/start-plugin-core': 1.171.8(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16)) - '@tanstack/start-server-core': 1.169.6(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-plugin-core': 1.171.10(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/start-server-core': 1.169.8(crossws@0.4.5(srvx@0.11.16)) pathe: 2.0.3 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) @@ -7053,25 +7053,25 @@ snapshots: react-dom: 19.2.6(react@19.2.6) use-sync-external-store: 1.6.0(react@19.2.6) - '@tanstack/router-core@1.171.7': + '@tanstack/router-core@1.171.8': dependencies: '@tanstack/history': 1.162.0 cookie-es: 3.1.1 seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - '@tanstack/router-devtools-core@1.168.0(@tanstack/router-core@1.171.7)(csstype@3.2.3)': + '@tanstack/router-devtools-core@1.168.0(@tanstack/router-core@1.171.8)(csstype@3.2.3)': dependencies: - '@tanstack/router-core': 1.171.7 + '@tanstack/router-core': 1.171.8 clsx: 2.1.1 goober: 2.1.19(csstype@3.2.3) optionalDependencies: csstype: 3.2.3 - '@tanstack/router-generator@1.167.11': + '@tanstack/router-generator@1.167.12': dependencies: '@babel/types': 7.29.7 - '@tanstack/router-core': 1.171.7 + '@tanstack/router-core': 1.171.8 '@tanstack/router-utils': 1.162.1 '@tanstack/virtual-file-routes': 1.162.0 jiti: 2.7.0 @@ -7081,7 +7081,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.12(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))': + '@tanstack/router-plugin@1.168.13(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) @@ -7089,15 +7089,15 @@ snapshots: '@babel/template': 7.29.7 '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 - '@tanstack/router-core': 1.171.7 - '@tanstack/router-generator': 1.167.11 + '@tanstack/router-core': 1.171.8 + '@tanstack/router-generator': 1.167.12 '@tanstack/router-utils': 1.162.1 '@tanstack/virtual-file-routes': 1.162.0 chokidar: 5.0.0 unplugin: 3.0.0 zod: 4.4.3 optionalDependencies: - '@tanstack/react-router': 1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) vite: '@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)' transitivePeerDependencies: - supports-color @@ -7116,27 +7116,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/start-client-core@1.170.5': + '@tanstack/start-client-core@1.170.6': dependencies: - '@tanstack/router-core': 1.171.7 + '@tanstack/router-core': 1.171.8 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-storage-context': 1.167.9 + '@tanstack/start-storage-context': 1.167.10 seroval: 1.5.4 '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.8(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))': + '@tanstack/start-plugin-core@1.171.10(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.7 '@babel/types': 7.29.7 '@rolldown/pluginutils': 1.0.1 - '@tanstack/router-core': 1.171.7 - '@tanstack/router-generator': 1.167.11 - '@tanstack/router-plugin': 1.168.12(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)) + '@tanstack/router-core': 1.171.8 + '@tanstack/router-generator': 1.167.12 + '@tanstack/router-plugin': 1.168.13(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3)) '@tanstack/router-utils': 1.162.1 - '@tanstack/start-client-core': 1.170.5 - '@tanstack/start-server-core': 1.169.6(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-server-core': 1.169.8(crossws@0.4.5(srvx@0.11.16)) exsolve: 1.0.8 lightningcss: 1.32.0 pathe: 2.0.3 @@ -7158,21 +7158,21 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.169.6(crossws@0.4.5(srvx@0.11.16))': + '@tanstack/start-server-core@1.169.8(crossws@0.4.5(srvx@0.11.16))': dependencies: '@tanstack/history': 1.162.0 - '@tanstack/router-core': 1.171.7 - '@tanstack/start-client-core': 1.170.5 - '@tanstack/start-storage-context': 1.167.9 + '@tanstack/router-core': 1.171.8 + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-storage-context': 1.167.10 fetchdts: 0.1.7 h3-v2: h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.16)) seroval: 1.5.4 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.167.9': + '@tanstack/start-storage-context@1.167.10': dependencies: - '@tanstack/router-core': 1.171.7 + '@tanstack/router-core': 1.171.8 '@tanstack/store@0.11.0': {} @@ -7524,7 +7524,7 @@ snapshots: balanced-match@4.0.4: {} - baseline-browser-mapping@2.10.32: {} + baseline-browser-mapping@2.10.33: {} better-path-resolve@1.0.0: dependencies: @@ -7560,7 +7560,7 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.32 + baseline-browser-mapping: 2.10.33 caniuse-lite: 1.0.30001793 electron-to-chromium: 1.5.364 node-releases: 2.0.46 @@ -8172,7 +8172,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3): + fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3): dependencies: '@orama/orama': 3.1.18 estree-util-value-to-estree: 3.5.0 @@ -8193,7 +8193,7 @@ snapshots: vfile: 6.0.3 optionalDependencies: '@mdx-js/mdx': 3.1.1 - '@tanstack/react-router': 1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -8205,14 +8205,14 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-mdx@15.0.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.15)(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react@19.2.6)(rolldown@1.0.3): + fumadocs-mdx@15.0.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.15)(@voidzero-dev/vite-plus-core@0.1.23(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(react@19.2.6)(rolldown@1.0.3): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 esbuild: 0.28.0 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + fumadocs-core: 16.9.3(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@1.17.0(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) js-yaml: 4.1.1 mdast-util-mdx: 3.0.0 picocolors: 1.1.1 @@ -9211,7 +9211,7 @@ snapshots: msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3): dependencies: - '@inquirer/confirm': 6.1.0(@types/node@25.9.1) + '@inquirer/confirm': 6.1.1(@types/node@25.9.1) '@mswjs/interceptors': 0.41.9 '@open-draft/deferred-promise': 3.0.0 '@types/statuses': 2.0.6 @@ -9234,7 +9234,7 @@ snapshots: transitivePeerDependencies: - '@types/node' - mute-stream@4.0.0: {} + mute-stream@3.0.0: {} nanoid@3.3.12: {} @@ -10025,7 +10025,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) - '@dotenvx/dotenvx': 1.69.1 + '@dotenvx/dotenvx': 1.69.2 '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) '@types/validate-npm-package-name': 4.0.2 browserslist: 4.28.2 @@ -10252,11 +10252,11 @@ snapshots: tinypool@2.1.0: {} - tldts-core@7.4.1: {} + tldts-core@7.4.2: {} - tldts@7.4.0: + tldts@7.4.2: dependencies: - tldts-core: 7.4.1 + tldts-core: 7.4.2 to-regex-range@5.0.1: dependencies: @@ -10268,7 +10268,7 @@ snapshots: tough-cookie@6.0.1: dependencies: - tldts: 7.4.0 + tldts: 7.4.2 tr46@0.0.3: {} diff --git a/skills/stanza-cli/SKILL.md b/skills/stanza-cli/SKILL.md index fff2b0a..50c0cee 100644 --- a/skills/stanza-cli/SKILL.md +++ b/skills/stanza-cli/SKILL.md @@ -7,6 +7,8 @@ description: Use the npm-distributed Stanza CLI non-interactively to scaffold or Use only the published CLI surface. Do not assume the Stanza source repo, local `registry/modules`, maintainer scripts, or workspace packages are available unless the user explicitly provides them. +For depth this skill doesn't cover (the concept/region model, the full registry roadmap, and module authoring) fetch the complete docs at when you have network access. For the current set of installable modules, `stanza search` is authoritative; the roadmap doc lags it. + ## Runtime Contract - The CLI package is `stanza-cli`; the binary is `stanza`. @@ -73,7 +75,7 @@ Run `add`, `remove`, `list`, and `doctor` from the project root or any child dir Every module belongs to exactly one **category**, and each category is either single-choice or multi-choice: -- **Single-choice** categories: `framework`, `ui`, `db`, `orm`, `auth`, `payments`, `email`, `ai`, `tooling`, `monorepo`. Adding a module to a filled single-choice category fails until the existing one is removed. +- **Single-choice** categories: `framework`, `api`, `ui`, `db`, `orm`, `auth`, `payments`, `email`, `ai`, `tooling`, `monorepo`. Adding a module to a filled single-choice category fails until the existing one is removed. - **Multi-choice** categories: `testing`, `deploy`. Multiple modules coexist in one category. For `init --yes`, pass each category's module ids as a comma-separated value; single-choice categories take exactly one, multi-choice take several — for example `--framework=next` and `--testing=vitest,playwright`. @@ -89,17 +91,18 @@ For `init --yes`, pass each category's module ids as a comma-separated value; si - Use `--dry-run` before a mutating command when the user wants a preview. It writes nothing. - Mutating commands refuse to run in a dirty git worktree. Ask the user before using `--dangerously-allow-dirty`; it intentionally allows Stanza edits to mix with existing changes. +- A failed `add` rolls back automatically — if any step throws (including a codemod), Stanza restores the worktree to its pre-`add` state. ## Registries -Stanza ships modules from the first-party `@stanza` namespace by default. To install modules from another publisher, declare the registry in `stanza.json#registries` and address modules with `@/` syntax: +Stanza ships modules from the first-party `@stanza` namespace by default. To install modules from another publisher, declare the registry in `stanza.json#registries` and address its modules with `@/` syntax. -A registry is addressed by the **full URL to its main JSON file** — the index, which lists every module and the relative `path` to its full JSON. The string form is that URL: +Point a registry at the **full URL of its main JSON file** — the index, which lists every module and the relative `path` to its full JSON. The string form is that URL: ```json { "registries": { - "@acme": "https://reg.acme.dev/registry.json" + "@acme": "https://reg.acme.example/index.json" } } ``` @@ -114,7 +117,7 @@ Editing `stanza.json#registries` is an expected user-driven edit (the rest of th { "registries": { "@acme": { - "url": "https://api.acme.dev/r/registry.json", + "url": "https://api.acme.example/r/registry.json", "headers": { "Authorization": "Bearer ${ACME_TOKEN}" }, "params": { "channel": "stable" } } @@ -143,4 +146,5 @@ Editing `stanza.json#registries` is an expected user-driven edit (the rest of th - Treat generated files as user-owned project code after Stanza writes them. - Don't synthesize `modules`, `regions`, or `readmeChecksum` in `stanza.json` — those are runner-managed. `registries`, `apps`, and `packageManager` are user config and may be edited. - Prefer CLI commands over reconstructing Stanza's template output yourself. +- After mutating a project (or editing generated files), run `stanza doctor` to confirm `stanza.json` still matches the filesystem; it exits non-zero on drift. - When reporting results, include the exact command run, whether it wrote files, and any follow-up package-manager command needed.