From 50a6203507d7359c4f02f42014a40a3373e5f183 Mon Sep 17 00:00:00 2001 From: Daniel Wise Date: Sat, 7 Mar 2026 20:53:00 -0800 Subject: [PATCH 1/3] feat(docs): create docs website foundation and turborepo structure --- .claude/agents/code-reviewer.md | 83 + .claude/agents/test-writer.md | 64 + .claude/settings.json | 11 + .github/workflows/ci.yml | 20 +- .github/workflows/merge-order.yml | 2 +- .github/workflows/release.yml | 10 +- .gitignore | 10 + AGENTS.md | 44 +- apps/docs/.gitignore | 26 + apps/docs/README.md | 45 + apps/docs/content/docs/commands/checkout.mdx | 30 + apps/docs/content/docs/commands/create.mdx | 30 + apps/docs/content/docs/commands/doctor.mdx | 30 + apps/docs/content/docs/commands/log.mdx | 25 + .../docs/content/docs/commands/merge-next.mdx | 34 + apps/docs/content/docs/commands/meta.json | 18 + apps/docs/content/docs/commands/modify.mdx | 26 + apps/docs/content/docs/commands/navigate.mdx | 39 + .../docs/content/docs/commands/post-merge.mdx | 30 + apps/docs/content/docs/commands/restack.mdx | 30 + apps/docs/content/docs/commands/skills.mdx | 32 + apps/docs/content/docs/commands/submit.mdx | 36 + apps/docs/content/docs/commands/sync.mdx | 27 + apps/docs/content/docs/commands/undo.mdx | 25 + apps/docs/content/docs/concepts/meta.json | 4 + .../content/docs/concepts/stack-graph.mdx | 20 + .../content/docs/concepts/stacked-diffs.mdx | 17 + .../docs/concepts/state-management.mdx | 20 + .../docs/contributing/agent-skills.mdx | 22 + .../content/docs/contributing/development.mdx | 35 + apps/docs/content/docs/contributing/meta.json | 4 + .../content/docs/contributing/testing.mdx | 24 + .../docs/getting-started/installation.mdx | 38 + .../content/docs/getting-started/meta.json | 4 + .../docs/getting-started/quickstart.mdx | 43 + .../docs/content/docs/guides/ai-assistant.mdx | 22 + .../docs/guides/conflict-resolution.mdx | 28 + apps/docs/content/docs/guides/meta.json | 9 + .../docs/guides/migration-from-graphite.mdx | 22 + .../content/docs/guides/stacking-workflow.mdx | 22 + apps/docs/content/docs/index.mdx | 8 + apps/docs/content/docs/meta.json | 16 + apps/docs/next.config.mjs | 19 + apps/docs/package.json | 36 + apps/docs/postcss.config.mjs | 7 + apps/docs/source.config.ts | 23 + apps/docs/src/app/(home)/layout.tsx | 6 + apps/docs/src/app/(home)/page.tsx | 16 + apps/docs/src/app/api/search/route.ts | 7 + apps/docs/src/app/docs/[[...slug]]/page.tsx | 65 + apps/docs/src/app/docs/layout.tsx | 11 + apps/docs/src/app/global.css | 3 + apps/docs/src/app/layout.tsx | 17 + apps/docs/src/app/llms-full.txt/route.ts | 10 + .../app/llms.mdx/docs/[[...slug]]/route.ts | 23 + apps/docs/src/app/llms.txt/route.ts | 8 + apps/docs/src/app/og/docs/[...slug]/route.tsx | 35 + apps/docs/src/components/ai/page-actions.tsx | 256 + apps/docs/src/lib/cn.ts | 1 + apps/docs/src/lib/layout.shared.tsx | 17 + apps/docs/src/lib/source.ts | 27 + apps/docs/src/mdx-components.tsx | 9 + apps/docs/tsconfig.json | 36 + biome.json | 6 + .../2026-02-21-dogfood-cli-ux-improvements.md | 140 - .../2026-02-21-dub-sync-parity-design.md | 229 - ...26-02-21-dub-sync-parity-implementation.md | 492 -- ...2026-02-21-dub-ux-command-parity-design.md | 252 - ...21-dub-ux-command-parity-implementation.md | 232 - .../2026-02-21-merge-workflow-guardrails.md | 130 - package.json | 62 +- packages/cli/package.json | 55 + .../cli/src}/commands/abort.test.ts | 0 {src => packages/cli/src}/commands/abort.ts | 0 .../cli/src}/commands/ai-env.test.ts | 0 {src => packages/cli/src}/commands/ai-env.ts | 0 .../cli/src}/commands/ai-resolve.test.ts | 0 .../cli/src}/commands/ai-resolve.ts | 0 {src => packages/cli/src}/commands/ai.test.ts | 0 {src => packages/cli/src}/commands/ai.ts | 0 .../cli/src}/commands/branch.test.ts | 0 {src => packages/cli/src}/commands/branch.ts | 0 .../cli/src}/commands/checkout.test.ts | 0 .../cli/src}/commands/checkout.ts | 0 .../cli/src}/commands/children.test.ts | 0 .../cli/src}/commands/children.ts | 0 .../cli/src}/commands/config.test.ts | 0 {src => packages/cli/src}/commands/config.ts | 0 .../cli/src}/commands/continue.test.ts | 0 .../cli/src}/commands/continue.ts | 0 .../cli/src}/commands/create.test.ts | 0 {src => packages/cli/src}/commands/create.ts | 0 .../cli/src}/commands/delete.test.ts | 0 {src => packages/cli/src}/commands/delete.ts | 0 .../cli/src}/commands/doctor.test.ts | 0 {src => packages/cli/src}/commands/doctor.ts | 0 .../cli/src}/commands/history.test.ts | 0 {src => packages/cli/src}/commands/history.ts | 0 .../cli/src}/commands/init.test.ts | 0 {src => packages/cli/src}/commands/init.ts | 0 .../cli/src}/commands/log.test.ts | 0 {src => packages/cli/src}/commands/log.ts | 0 .../cli/src}/commands/merge-check.test.ts | 0 .../cli/src}/commands/merge-check.ts | 0 .../cli/src}/commands/merge-next.test.ts | 0 .../cli/src}/commands/merge-next.ts | 0 .../cli/src}/commands/modify.test.ts | 0 {src => packages/cli/src}/commands/modify.ts | 0 .../cli/src}/commands/navigate.test.ts | 0 .../cli/src}/commands/navigate.ts | 0 .../cli/src}/commands/parent.test.ts | 0 {src => packages/cli/src}/commands/parent.ts | 0 .../cli/src}/commands/post-merge.test.ts | 0 .../cli/src}/commands/post-merge.ts | 0 {src => packages/cli/src}/commands/pr.test.ts | 0 {src => packages/cli/src}/commands/pr.ts | 0 .../cli/src}/commands/prune.test.ts | 0 {src => packages/cli/src}/commands/prune.ts | 0 .../cli/src}/commands/ready.test.ts | 0 {src => packages/cli/src}/commands/ready.ts | 0 .../cli/src}/commands/restack.test.ts | 0 {src => packages/cli/src}/commands/restack.ts | 0 {src => packages/cli/src}/commands/skills.ts | 0 .../cli/src}/commands/submit.test.ts | 0 {src => packages/cli/src}/commands/submit.ts | 0 .../cli/src}/commands/sync.test.ts | 0 {src => packages/cli/src}/commands/sync.ts | 0 .../cli/src}/commands/track.test.ts | 0 {src => packages/cli/src}/commands/track.ts | 0 .../cli/src}/commands/trunk.test.ts | 0 {src => packages/cli/src}/commands/trunk.ts | 0 .../cli/src}/commands/undo.test.ts | 0 {src => packages/cli/src}/commands/undo.ts | 0 .../cli/src}/commands/untrack.test.ts | 0 {src => packages/cli/src}/commands/untrack.ts | 0 {src => packages/cli/src}/index.ts | 0 .../cli/src}/lib/ai-bash-sandbox.test.ts | 0 .../cli/src}/lib/ai-bash-sandbox.ts | 0 .../cli/src}/lib/ai-context.test.ts | 0 {src => packages/cli/src}/lib/ai-context.ts | 0 .../cli/src}/lib/ai-shortcut.test.ts | 0 {src => packages/cli/src}/lib/ai-shortcut.ts | 0 {src => packages/cli/src}/lib/config.test.ts | 0 {src => packages/cli/src}/lib/config.ts | 0 .../cli/src}/lib/conflict-context.test.ts | 0 .../cli/src}/lib/conflict-context.ts | 0 .../cli/src}/lib/conflict-ui.test.ts | 0 {src => packages/cli/src}/lib/conflict-ui.ts | 0 {src => packages/cli/src}/lib/delete.test.ts | 0 {src => packages/cli/src}/lib/delete.ts | 0 {src => packages/cli/src}/lib/errors.ts | 0 {src => packages/cli/src}/lib/git.test.ts | 0 {src => packages/cli/src}/lib/git.ts | 0 {src => packages/cli/src}/lib/github.test.ts | 0 {src => packages/cli/src}/lib/github.ts | 0 {src => packages/cli/src}/lib/graph.test.ts | 0 {src => packages/cli/src}/lib/graph.ts | 0 {src => packages/cli/src}/lib/history.test.ts | 0 {src => packages/cli/src}/lib/history.ts | 0 {src => packages/cli/src}/lib/invariants.ts | 0 .../cli/src}/lib/operation-state.test.ts | 0 .../cli/src}/lib/operation-state.ts | 0 {src => packages/cli/src}/lib/pr-body.test.ts | 0 {src => packages/cli/src}/lib/pr-body.ts | 0 .../cli/src}/lib/shell-history.test.ts | 0 .../cli/src}/lib/shell-history.ts | 0 {src => packages/cli/src}/lib/skills.ts | 0 {src => packages/cli/src}/lib/state.test.ts | 0 {src => packages/cli/src}/lib/state.ts | 0 .../cli/src}/lib/sync/branch-status.test.ts | 0 .../cli/src}/lib/sync/branch-status.ts | 0 .../cli/src}/lib/sync/cleanup.test.ts | 0 {src => packages/cli/src}/lib/sync/cleanup.ts | 0 .../cli/src}/lib/sync/reconcile.test.ts | 0 .../cli/src}/lib/sync/reconcile.ts | 0 {src => packages/cli/src}/lib/sync/report.ts | 0 {src => packages/cli/src}/lib/sync/types.ts | 0 {src => packages/cli/src}/lib/track.test.ts | 0 {src => packages/cli/src}/lib/track.ts | 0 .../cli/src}/lib/undo-log.test.ts | 0 {src => packages/cli/src}/lib/undo-log.ts | 0 {src => packages/cli/src}/lib/untrack.test.ts | 0 {src => packages/cli/src}/lib/untrack.ts | 0 .../cli/test}/commands/skills.test.ts | 0 {test => packages/cli/test}/helpers.ts | 0 packages/cli/tsconfig.json | 9 + tsup.config.ts => packages/cli/tsup.config.ts | 0 .../cli/vitest.config.ts | 0 pnpm-lock.yaml | 6060 ++++++++++++++--- pnpm-workspace.yaml | 3 +- tsconfig.json | 6 +- turbo.json | 25 + 192 files changed, 6807 insertions(+), 2611 deletions(-) create mode 100644 .claude/agents/code-reviewer.md create mode 100644 .claude/agents/test-writer.md create mode 100644 apps/docs/.gitignore create mode 100644 apps/docs/README.md create mode 100644 apps/docs/content/docs/commands/checkout.mdx create mode 100644 apps/docs/content/docs/commands/create.mdx create mode 100644 apps/docs/content/docs/commands/doctor.mdx create mode 100644 apps/docs/content/docs/commands/log.mdx create mode 100644 apps/docs/content/docs/commands/merge-next.mdx create mode 100644 apps/docs/content/docs/commands/meta.json create mode 100644 apps/docs/content/docs/commands/modify.mdx create mode 100644 apps/docs/content/docs/commands/navigate.mdx create mode 100644 apps/docs/content/docs/commands/post-merge.mdx create mode 100644 apps/docs/content/docs/commands/restack.mdx create mode 100644 apps/docs/content/docs/commands/skills.mdx create mode 100644 apps/docs/content/docs/commands/submit.mdx create mode 100644 apps/docs/content/docs/commands/sync.mdx create mode 100644 apps/docs/content/docs/commands/undo.mdx create mode 100644 apps/docs/content/docs/concepts/meta.json create mode 100644 apps/docs/content/docs/concepts/stack-graph.mdx create mode 100644 apps/docs/content/docs/concepts/stacked-diffs.mdx create mode 100644 apps/docs/content/docs/concepts/state-management.mdx create mode 100644 apps/docs/content/docs/contributing/agent-skills.mdx create mode 100644 apps/docs/content/docs/contributing/development.mdx create mode 100644 apps/docs/content/docs/contributing/meta.json create mode 100644 apps/docs/content/docs/contributing/testing.mdx create mode 100644 apps/docs/content/docs/getting-started/installation.mdx create mode 100644 apps/docs/content/docs/getting-started/meta.json create mode 100644 apps/docs/content/docs/getting-started/quickstart.mdx create mode 100644 apps/docs/content/docs/guides/ai-assistant.mdx create mode 100644 apps/docs/content/docs/guides/conflict-resolution.mdx create mode 100644 apps/docs/content/docs/guides/meta.json create mode 100644 apps/docs/content/docs/guides/migration-from-graphite.mdx create mode 100644 apps/docs/content/docs/guides/stacking-workflow.mdx create mode 100644 apps/docs/content/docs/index.mdx create mode 100644 apps/docs/content/docs/meta.json create mode 100644 apps/docs/next.config.mjs create mode 100644 apps/docs/package.json create mode 100644 apps/docs/postcss.config.mjs create mode 100644 apps/docs/source.config.ts create mode 100644 apps/docs/src/app/(home)/layout.tsx create mode 100644 apps/docs/src/app/(home)/page.tsx create mode 100644 apps/docs/src/app/api/search/route.ts create mode 100644 apps/docs/src/app/docs/[[...slug]]/page.tsx create mode 100644 apps/docs/src/app/docs/layout.tsx create mode 100644 apps/docs/src/app/global.css create mode 100644 apps/docs/src/app/layout.tsx create mode 100644 apps/docs/src/app/llms-full.txt/route.ts create mode 100644 apps/docs/src/app/llms.mdx/docs/[[...slug]]/route.ts create mode 100644 apps/docs/src/app/llms.txt/route.ts create mode 100644 apps/docs/src/app/og/docs/[...slug]/route.tsx create mode 100644 apps/docs/src/components/ai/page-actions.tsx create mode 100644 apps/docs/src/lib/cn.ts create mode 100644 apps/docs/src/lib/layout.shared.tsx create mode 100644 apps/docs/src/lib/source.ts create mode 100644 apps/docs/src/mdx-components.tsx create mode 100644 apps/docs/tsconfig.json delete mode 100644 docs/plans/2026-02-21-dogfood-cli-ux-improvements.md delete mode 100644 docs/plans/2026-02-21-dub-sync-parity-design.md delete mode 100644 docs/plans/2026-02-21-dub-sync-parity-implementation.md delete mode 100644 docs/plans/2026-02-21-dub-ux-command-parity-design.md delete mode 100644 docs/plans/2026-02-21-dub-ux-command-parity-implementation.md delete mode 100644 docs/plans/2026-02-21-merge-workflow-guardrails.md create mode 100644 packages/cli/package.json rename {src => packages/cli/src}/commands/abort.test.ts (100%) rename {src => packages/cli/src}/commands/abort.ts (100%) rename {src => packages/cli/src}/commands/ai-env.test.ts (100%) rename {src => packages/cli/src}/commands/ai-env.ts (100%) rename {src => packages/cli/src}/commands/ai-resolve.test.ts (100%) rename {src => packages/cli/src}/commands/ai-resolve.ts (100%) rename {src => packages/cli/src}/commands/ai.test.ts (100%) rename {src => packages/cli/src}/commands/ai.ts (100%) rename {src => packages/cli/src}/commands/branch.test.ts (100%) rename {src => packages/cli/src}/commands/branch.ts (100%) rename {src => packages/cli/src}/commands/checkout.test.ts (100%) rename {src => packages/cli/src}/commands/checkout.ts (100%) rename {src => packages/cli/src}/commands/children.test.ts (100%) rename {src => packages/cli/src}/commands/children.ts (100%) rename {src => packages/cli/src}/commands/config.test.ts (100%) rename {src => packages/cli/src}/commands/config.ts (100%) rename {src => packages/cli/src}/commands/continue.test.ts (100%) rename {src => packages/cli/src}/commands/continue.ts (100%) rename {src => packages/cli/src}/commands/create.test.ts (100%) rename {src => packages/cli/src}/commands/create.ts (100%) rename {src => packages/cli/src}/commands/delete.test.ts (100%) rename {src => packages/cli/src}/commands/delete.ts (100%) rename {src => packages/cli/src}/commands/doctor.test.ts (100%) rename {src => packages/cli/src}/commands/doctor.ts (100%) rename {src => packages/cli/src}/commands/history.test.ts (100%) rename {src => packages/cli/src}/commands/history.ts (100%) rename {src => packages/cli/src}/commands/init.test.ts (100%) rename {src => packages/cli/src}/commands/init.ts (100%) rename {src => packages/cli/src}/commands/log.test.ts (100%) rename {src => packages/cli/src}/commands/log.ts (100%) rename {src => packages/cli/src}/commands/merge-check.test.ts (100%) rename {src => packages/cli/src}/commands/merge-check.ts (100%) rename {src => packages/cli/src}/commands/merge-next.test.ts (100%) rename {src => packages/cli/src}/commands/merge-next.ts (100%) rename {src => packages/cli/src}/commands/modify.test.ts (100%) rename {src => packages/cli/src}/commands/modify.ts (100%) rename {src => packages/cli/src}/commands/navigate.test.ts (100%) rename {src => packages/cli/src}/commands/navigate.ts (100%) rename {src => packages/cli/src}/commands/parent.test.ts (100%) rename {src => packages/cli/src}/commands/parent.ts (100%) rename {src => packages/cli/src}/commands/post-merge.test.ts (100%) rename {src => packages/cli/src}/commands/post-merge.ts (100%) rename {src => packages/cli/src}/commands/pr.test.ts (100%) rename {src => packages/cli/src}/commands/pr.ts (100%) rename {src => packages/cli/src}/commands/prune.test.ts (100%) rename {src => packages/cli/src}/commands/prune.ts (100%) rename {src => packages/cli/src}/commands/ready.test.ts (100%) rename {src => packages/cli/src}/commands/ready.ts (100%) rename {src => packages/cli/src}/commands/restack.test.ts (100%) rename {src => packages/cli/src}/commands/restack.ts (100%) rename {src => packages/cli/src}/commands/skills.ts (100%) rename {src => packages/cli/src}/commands/submit.test.ts (100%) rename {src => packages/cli/src}/commands/submit.ts (100%) rename {src => packages/cli/src}/commands/sync.test.ts (100%) rename {src => packages/cli/src}/commands/sync.ts (100%) rename {src => packages/cli/src}/commands/track.test.ts (100%) rename {src => packages/cli/src}/commands/track.ts (100%) rename {src => packages/cli/src}/commands/trunk.test.ts (100%) rename {src => packages/cli/src}/commands/trunk.ts (100%) rename {src => packages/cli/src}/commands/undo.test.ts (100%) rename {src => packages/cli/src}/commands/undo.ts (100%) rename {src => packages/cli/src}/commands/untrack.test.ts (100%) rename {src => packages/cli/src}/commands/untrack.ts (100%) rename {src => packages/cli/src}/index.ts (100%) rename {src => packages/cli/src}/lib/ai-bash-sandbox.test.ts (100%) rename {src => packages/cli/src}/lib/ai-bash-sandbox.ts (100%) rename {src => packages/cli/src}/lib/ai-context.test.ts (100%) rename {src => packages/cli/src}/lib/ai-context.ts (100%) rename {src => packages/cli/src}/lib/ai-shortcut.test.ts (100%) rename {src => packages/cli/src}/lib/ai-shortcut.ts (100%) rename {src => packages/cli/src}/lib/config.test.ts (100%) rename {src => packages/cli/src}/lib/config.ts (100%) rename {src => packages/cli/src}/lib/conflict-context.test.ts (100%) rename {src => packages/cli/src}/lib/conflict-context.ts (100%) rename {src => packages/cli/src}/lib/conflict-ui.test.ts (100%) rename {src => packages/cli/src}/lib/conflict-ui.ts (100%) rename {src => packages/cli/src}/lib/delete.test.ts (100%) rename {src => packages/cli/src}/lib/delete.ts (100%) rename {src => packages/cli/src}/lib/errors.ts (100%) rename {src => packages/cli/src}/lib/git.test.ts (100%) rename {src => packages/cli/src}/lib/git.ts (100%) rename {src => packages/cli/src}/lib/github.test.ts (100%) rename {src => packages/cli/src}/lib/github.ts (100%) rename {src => packages/cli/src}/lib/graph.test.ts (100%) rename {src => packages/cli/src}/lib/graph.ts (100%) rename {src => packages/cli/src}/lib/history.test.ts (100%) rename {src => packages/cli/src}/lib/history.ts (100%) rename {src => packages/cli/src}/lib/invariants.ts (100%) rename {src => packages/cli/src}/lib/operation-state.test.ts (100%) rename {src => packages/cli/src}/lib/operation-state.ts (100%) rename {src => packages/cli/src}/lib/pr-body.test.ts (100%) rename {src => packages/cli/src}/lib/pr-body.ts (100%) rename {src => packages/cli/src}/lib/shell-history.test.ts (100%) rename {src => packages/cli/src}/lib/shell-history.ts (100%) rename {src => packages/cli/src}/lib/skills.ts (100%) rename {src => packages/cli/src}/lib/state.test.ts (100%) rename {src => packages/cli/src}/lib/state.ts (100%) rename {src => packages/cli/src}/lib/sync/branch-status.test.ts (100%) rename {src => packages/cli/src}/lib/sync/branch-status.ts (100%) rename {src => packages/cli/src}/lib/sync/cleanup.test.ts (100%) rename {src => packages/cli/src}/lib/sync/cleanup.ts (100%) rename {src => packages/cli/src}/lib/sync/reconcile.test.ts (100%) rename {src => packages/cli/src}/lib/sync/reconcile.ts (100%) rename {src => packages/cli/src}/lib/sync/report.ts (100%) rename {src => packages/cli/src}/lib/sync/types.ts (100%) rename {src => packages/cli/src}/lib/track.test.ts (100%) rename {src => packages/cli/src}/lib/track.ts (100%) rename {src => packages/cli/src}/lib/undo-log.test.ts (100%) rename {src => packages/cli/src}/lib/undo-log.ts (100%) rename {src => packages/cli/src}/lib/untrack.test.ts (100%) rename {src => packages/cli/src}/lib/untrack.ts (100%) rename {test => packages/cli/test}/commands/skills.test.ts (100%) rename {test => packages/cli/test}/helpers.ts (100%) create mode 100644 packages/cli/tsconfig.json rename tsup.config.ts => packages/cli/tsup.config.ts (100%) rename vitest.config.ts => packages/cli/vitest.config.ts (100%) create mode 100644 turbo.json diff --git a/.claude/agents/code-reviewer.md b/.claude/agents/code-reviewer.md new file mode 100644 index 0000000..0d5c738 --- /dev/null +++ b/.claude/agents/code-reviewer.md @@ -0,0 +1,83 @@ +# Code Reviewer — Staff Engineer Persona + +You are a senior staff engineer with 15+ years of experience reviewing production CLI tooling and git internals. You are thorough, opinionated, and direct. You do not sugarcoat. You praise good work sparingly and only when it's genuinely well-done. You treat every review as if this code ships to thousands of developers tomorrow. + +Your reviews are concise and blunt. No filler. Flag real problems, skip nitpicks unless they compound. + +## Review Priorities (ordered by severity) + +1. **Correctness** — Does the code do what it claims? Are edge cases handled? +2. **Git safety** — Any risky git operations (force push, ref manipulation, state corruption)? +3. **Stack state integrity** — `.git/dubstack/*` state invariants preserved? State reads/writes atomic? +4. **Conflict/recovery paths** — What happens when things go wrong mid-operation? +5. **Error UX** — `DubError` messages actionable? Error text is part of UX and asserted in tests. +6. **Submit/restack flow** — Current-path vs stack submission correctness? Linear stack validation? +7. **Test coverage** — Changed behavior covered? Regression risk? + +## Code Principles Checklist + +Apply these principles from the code-principles skill. Read the reference files in `~/.claude/skills/code-principles/references/` for full context on each. + +### Always Check (every review) + +| Principle | Question | +|-----------|----------| +| **SRP** | Does each module/function have exactly one reason to change? | +| **DRY** | Is logic duplicated that should be extracted? (But respect AHA — don't abstract prematurely) | +| **YAGNI** | Is there speculative code that serves no current use case? | +| **Fail Fast** | Are invalid states caught early with clear errors? | +| **POLA** | Would another developer be surprised by this behavior? | +| **Locality of Behavior** | Can you understand this code without jumping to 5 other files? | +| **Test Behavior** | Do tests assert what the code does, not how it does it? | + +### Check When Relevant + +| Principle | When | Question | +|-----------|------|----------| +| **CQS** | Functions that both mutate and return | Does this function do one thing — command or query? | +| **Law of Demeter** | Deep property chains | Is this reaching through too many layers? | +| **Composition > Inheritance** | New abstractions | Could this be composed from smaller pieces instead? | +| **Robustness Principle** | Input handling | Liberal in what it accepts, strict in what it produces? | +| **Backwards Compat** | CLI output/flag changes | Does this break existing users or scripts? | +| **Hyrum's Law** | Any observable behavior change | Will someone depend on the old behavior? | +| **Idempotency** | Commands that modify state | Is this safe to run twice? | + +## DubStack-Specific Review Rules + +- `create` must auto-initialize state via `ensureState(...)` — never assume state exists +- `restack` and `submit` must fail clearly when stack context is invalid +- `submit --path stack` requires linear stack validation (one child per parent) +- `undo` is single-level only — don't silently extend it +- Error messages are UX and tested — change them deliberately, update tests +- Keep command files thin, push logic to `src/lib/*` +- ESM imports, 2-space indent, single quotes, kebab-case files + +## Output Format + +Structure your review as: + +``` +## Verdict: [APPROVE | REQUEST_CHANGES | NEEDS_DISCUSSION] + +### Critical (must fix) +- [file:line] Issue description. Why it matters. + +### Warnings (should fix) +- [file:line] Issue description. Risk if ignored. + +### Observations (take or leave) +- [file:line] Note. + +### What's Good +- Brief note on anything well-done (only if genuine). +``` + +Use confidence levels when unsure: `[HIGH]`, `[MEDIUM]`, `[LOW]`. Only flag issues at `[MEDIUM]` or above — skip low-confidence noise. + +## How to Run a Review + +1. Read the changed files (use `git diff` or read files directly) +2. Read relevant reference files from `~/.claude/skills/code-principles/references/` for the applicable principle groups (solid, simplicity, design, resilience, testing) +3. Check each changed file against the priorities and principles above +4. Produce the structured review output +5. Be honest. If the code is good, say so briefly and move on. diff --git a/.claude/agents/test-writer.md b/.claude/agents/test-writer.md new file mode 100644 index 0000000..ff65ced --- /dev/null +++ b/.claude/agents/test-writer.md @@ -0,0 +1,64 @@ +# Test Writer + +Generate tests matching dubstack's existing conventions. Tests should cover changed behavior, edge cases, and regression risks. + +## Test Conventions + +- Framework: Vitest (`describe`, `it`, `expect`, `vi`, `beforeEach`, `afterEach`) +- Test locations: + - Command logic: `src/commands/.test.ts` + - Library logic: `src/lib/.test.ts` + - Cross-command scenarios: `test/**/*.test.ts` +- Helper: `createTestRepo()` and `gitInRepo(dir, args)` from `test/helpers` +- Pattern: create temp repo → `init(dir)` → commit → exercise command → assert state +- Cleanup: `afterEach` calls `cleanup()` and restores `process.env` + +## Test Structure + +```typescript +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { createTestRepo, gitInRepo } from '../../test/helpers' +import { init } from './init' + +let dir: string +let cleanup: () => Promise + +beforeEach(async () => { + const repo = await createTestRepo() + dir = repo.dir + cleanup = repo.cleanup + await init(dir) + await gitInRepo(dir, ['add', '.']) + await gitInRepo(dir, ['commit', '-m', 'init dubstack']) +}) + +afterEach(async () => { + await cleanup() +}) +``` + +## What to Test (priority order) + +1. **Happy path** — Does the command work with valid input? +2. **State mutations** — Is `.git/dubstack/*` state correct after the operation? +3. **Error cases** — Does it throw `DubError` with the right message? +4. **Edge cases** — Empty stacks, missing branches, dirty working tree +5. **Conflict/recovery** — What happens when git operations fail mid-way? +6. **Idempotency** — Is the command safe to run twice? + +## Rules + +- Test behavior, not implementation details +- Assert on user-visible output and state, not internal function calls +- Use real git repos (via `createTestRepo`), not mocks, for command tests +- Keep tests independent — no shared mutable state between `it` blocks +- Match existing style: 2-space indent, single quotes, ESM imports +- Error messages are part of UX — assert on them when testing error paths + +## Workflow + +1. Read the source file being tested +2. Read existing tests for that file (if any) to understand patterns +3. Identify untested paths and changed behavior +4. Write tests following the conventions above +5. Run `pnpm test` to verify they pass diff --git a/.claude/settings.json b/.claude/settings.json index ba0b2f0..5514e3a 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,5 +1,16 @@ { "hooks": { + "PostToolUse": [ + { + "matcher": "Edit|Write", + "hooks": [ + { + "type": "command", + "command": "cd /Users/wise/dev/dubstack && pnpm biome check --write --changed --no-errors-on-unmatched 2>/dev/null || true" + } + ] + } + ], "PreCompact": [ { "hooks": [ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 70e795c..746b49d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,18 +10,30 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + fetch-depth: 2 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 with: node-version-file: .nvmrc cache: pnpm + - run: pnpm install --frozen-lockfile - - run: pnpm checks - - run: pnpm typecheck - - run: pnpm test:coverage + + - name: Lint and format + run: pnpm checks + + - name: Typecheck affected + run: pnpm turbo run typecheck --affected + + - name: Test affected + run: pnpm turbo run test:coverage --affected + - uses: actions/upload-artifact@v4 if: always() with: name: coverage-report - path: coverage/ + path: packages/cli/coverage/ retention-days: 30 diff --git a/.github/workflows/merge-order.yml b/.github/workflows/merge-order.yml index 816896e..85f47c8 100644 --- a/.github/workflows/merge-order.yml +++ b/.github/workflows/merge-order.yml @@ -21,4 +21,4 @@ jobs: - name: Validate DubStack merge order env: GH_TOKEN: ${{ github.token }} - run: pnpm dev merge-check --pr ${{ github.event.pull_request.number }} + run: pnpm --filter=dubstack run dev merge-check --pr ${{ github.event.pull_request.number }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 757eae7..ca3e089 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,19 +24,20 @@ jobs: id: version run: | TAG_VERSION="${GITHUB_REF#refs/tags/v}" - PKG_VERSION=$(node -p "require('./package.json').version") + PKG_VERSION=$(node -p "require('./packages/cli/package.json').version") if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then - echo "::error::Tag v${TAG_VERSION} does not match package.json version ${PKG_VERSION}" + echo "::error::Tag v${TAG_VERSION} does not match packages/cli/package.json version ${PKG_VERSION}" exit 1 fi echo "version=$TAG_VERSION" >> "$GITHUB_OUTPUT" - run: pnpm checks - - run: pnpm typecheck - - run: pnpm test + - run: pnpm turbo run typecheck --filter=dubstack + - run: pnpm turbo run test --filter=dubstack - name: Pack and compute SHA id: sha + working-directory: packages/cli run: | TARBALL=$(pnpm pack | tail -1) SHA=$(shasum -a 256 "$TARBALL" | cut -d ' ' -f 1) @@ -44,6 +45,7 @@ jobs: echo "sha256=$SHA" >> "$GITHUB_OUTPUT" - name: Publish to npm + working-directory: packages/cli run: pnpm publish ${{ steps.sha.outputs.tarball }} --no-git-checks --provenance env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore index fc765ea..04b62ca 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,13 @@ coverage # Dolt database files (added by bd init) .dolt/ *.db + +# Turborepo +.turbo + +# Fumadocs generated +.source + +# Next.js +.next +out diff --git a/AGENTS.md b/AGENTS.md index d22b6e2..6158630 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -5,8 +5,8 @@ Guidance for AI coding agents working in this repository. ## 1) Project Overview - Project: `dubstack` -- Type: TypeScript CLI (ESM) for stacked git branch workflows -- Main entrypoint: `src/index.ts` +- Type: Turborepo monorepo — TypeScript CLI (ESM) for stacked git branch workflows + docs app +- Main entrypoint: `packages/cli/src/index.ts` - Core commands: `create`, `restack`, `submit`/`ss`, `merge-next`/`land`, `post-merge`, `undo`, `co`, `modify`, `skills` - State storage: `.git/dubstack/*` inside the target git repository @@ -14,9 +14,10 @@ Guidance for AI coding agents working in this repository. - Node: `>=22` (required) - Package manager: `pnpm` (`pnpm@10.29.1` in `package.json`) +- Monorepo orchestrator: `turbo` (root scripts delegate via turbo) - Test runner: `vitest` -- Lint/format: `biome` -- Build tool: `tsup` +- Lint/format: `biome` (runs repo-wide from root via `pnpm checks`) +- Build tool: `tsup` (CLI package) Use these commands from the repo root: @@ -29,13 +30,14 @@ Use these commands from the repo root: ## 3) Repository Structure -- CLI wiring: `src/index.ts` -- Command implementations: `src/commands/*.ts` -- Shared logic: `src/lib/*.ts` +- Root configs: `turbo.json`, `tsconfig.json` (base), `biome.json`, `pnpm-workspace.yaml` +- CLI package (`packages/cli/`): + - CLI wiring: `packages/cli/src/index.ts` + - Command implementations: `packages/cli/src/commands/*.ts` + - Shared logic: `packages/cli/src/lib/*.ts` + - Unit tests: `packages/cli/src/**/*.test.ts` and `packages/cli/test/**/*.test.ts` +- Docs app: `apps/docs/` (Next.js App Router with Fumadocs) - Agent contributor docs: `.agents/README.md`, `.agents/styleguide.md`, `.agents/patterns/*.md` -- Unit tests: - - `src/**/*.test.ts` - - `test/**/*.test.ts` - Agent skills shipped by this repo: - `skills/dubstack` - `skills/dub-flow` @@ -49,9 +51,9 @@ Use these commands from the repo root: - ESM imports - Read `.agents/styleguide.md` and relevant `.agents/patterns/*.md` before making structural changes. - Keep command behavior user-facing and explicit via `DubError` messages. -- Prefer small pure helpers in `src/lib/*` over large command files. +- Prefer small pure helpers in `packages/cli/src/lib/*` over large command files. - Avoid adding new dependencies unless necessary. -- Keep all changes source-first in `src/`; do not hand-edit generated output. +- Keep all changes source-first in `packages/cli/src/`; do not hand-edit generated output. ## 5) Behavioral Expectations To Preserve @@ -63,19 +65,19 @@ Use these commands from the repo root: ## 6) Testing Expectations -For non-trivial changes, run at least: +**ALWAYS** run these before considering any task complete — no exceptions: -1. `pnpm test` -2. `pnpm typecheck` -3. `pnpm checks` +1. `pnpm checks` — lint + format (auto-fix with `pnpm checks:fix`) +2. `pnpm typecheck` — type checking +3. `pnpm test` — unit tests -Core rule: do not consider work complete unless tests, typecheck, and lint/format checks are all passing. +All three must pass. Do not skip any. Do not consider work done until all pass. If behavior/output changed, add or update tests near the changed code: -- command logic: `src/commands/*.test.ts` -- library logic: `src/lib/*.test.ts` -- cross-command scenarios: `test/**/*.test.ts` +- command logic: `packages/cli/src/commands/*.test.ts` +- library logic: `packages/cli/src/lib/*.test.ts` +- cross-command scenarios: `packages/cli/test/**/*.test.ts` ## 7) Git And PR Guidance @@ -92,7 +94,7 @@ If behavior/output changed, add or update tests near the changed code: When implementing a task: -1. Read relevant command + lib files first. +1. Read relevant command + lib files in `packages/cli/src/` first. 2. Make minimal focused edits. 3. Add/update tests for changed behavior. 4. Run verification commands. diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore new file mode 100644 index 0000000..9e429e4 --- /dev/null +++ b/apps/docs/.gitignore @@ -0,0 +1,26 @@ +# deps +/node_modules + +# generated content +.source + +# test & build +/coverage +/.next/ +/out/ +/build +*.tsbuildinfo + +# misc +.DS_Store +*.pem +/.pnp +.pnp.js +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# others +.env*.local +.vercel +next-env.d.ts \ No newline at end of file diff --git a/apps/docs/README.md b/apps/docs/README.md new file mode 100644 index 0000000..9b7bba9 --- /dev/null +++ b/apps/docs/README.md @@ -0,0 +1,45 @@ +# docs + +This is a Next.js application generated with +[Create Fumadocs](https://github.com/fuma-nama/fumadocs). + +Run development server: + +```bash +npm run dev +# or +pnpm dev +# or +yarn dev +``` + +Open http://localhost:3000 with your browser to see the result. + +## Explore + +In the project, you can see: + +- `lib/source.ts`: Code for content source adapter, [`loader()`](https://fumadocs.dev/docs/headless/source-api) provides the interface to access your content. +- `lib/layout.shared.tsx`: Shared options for layouts, optional but preferred to keep. + +| Route | Description | +| ------------------------- | ------------------------------------------------------ | +| `app/(home)` | The route group for your landing page and other pages. | +| `app/docs` | The documentation layout and pages. | +| `app/api/search/route.ts` | The Route Handler for search. | + +### Fumadocs MDX + +A `source.config.ts` config file has been included, you can customise different options like frontmatter schema. + +Read the [Introduction](https://fumadocs.dev/docs/mdx) for further details. + +## Learn More + +To learn more about Next.js and Fumadocs, take a look at the following +resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js + features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +- [Fumadocs](https://fumadocs.dev) - learn about Fumadocs diff --git a/apps/docs/content/docs/commands/checkout.mdx b/apps/docs/content/docs/commands/checkout.mdx new file mode 100644 index 0000000..cd9ecb7 --- /dev/null +++ b/apps/docs/content/docs/commands/checkout.mdx @@ -0,0 +1,30 @@ +--- +title: checkout +description: Interactive branch checkout within your stack. +--- + +## Usage + +```bash +dub co +``` + +## Description + +Opens an interactive branch picker showing all branches in your stack. Select a branch to check it out. + +## Options + +| Flag | Description | +|---|---| +| `` | Directly check out a named branch in the stack | + +## Examples + +```bash +# Interactive checkout +dub co + +# Direct checkout +dub co feature-auth +``` diff --git a/apps/docs/content/docs/commands/create.mdx b/apps/docs/content/docs/commands/create.mdx new file mode 100644 index 0000000..cb2288d --- /dev/null +++ b/apps/docs/content/docs/commands/create.mdx @@ -0,0 +1,30 @@ +--- +title: create +description: Create a new branch that tracks the current branch as its parent. +--- + +## Usage + +```bash +dub create +``` + +## Description + +Creates a new branch off the current branch and registers the parent-child relationship in DubStack's state. The new branch becomes the current working branch. + +## Options + +| Flag | Description | +|---|---| +| `--no-track` | Create the branch without adding it to the stack | + +## Examples + +```bash +# Create a new stacked branch +dub create feature-auth + +# Create another branch on top +dub create feature-auth-tests +``` diff --git a/apps/docs/content/docs/commands/doctor.mdx b/apps/docs/content/docs/commands/doctor.mdx new file mode 100644 index 0000000..15af3ab --- /dev/null +++ b/apps/docs/content/docs/commands/doctor.mdx @@ -0,0 +1,30 @@ +--- +title: doctor +description: Diagnose and repair DubStack state. +--- + +## Usage + +```bash +dub doctor +``` + +## Description + +Checks DubStack's state for inconsistencies and offers to repair them. Useful when state gets out of sync with the actual git branch structure. + +## Options + +| Flag | Description | +|---|---| +| `--fix` | Automatically apply suggested repairs | + +## Examples + +```bash +# Diagnose issues +dub doctor + +# Auto-fix issues +dub doctor --fix +``` diff --git a/apps/docs/content/docs/commands/log.mdx b/apps/docs/content/docs/commands/log.mdx new file mode 100644 index 0000000..4e93466 --- /dev/null +++ b/apps/docs/content/docs/commands/log.mdx @@ -0,0 +1,25 @@ +--- +title: log +description: Visualize the stack as a tree with branch status. +--- + +## Usage + +```bash +dub log +``` + +## Description + +Displays a tree visualization of your stack, showing branch relationships, commit counts, and PR status. + +## Options + +No additional options. + +## Examples + +```bash +# View the stack tree +dub log +``` diff --git a/apps/docs/content/docs/commands/merge-next.mdx b/apps/docs/content/docs/commands/merge-next.mdx new file mode 100644 index 0000000..52c98bd --- /dev/null +++ b/apps/docs/content/docs/commands/merge-next.mdx @@ -0,0 +1,34 @@ +--- +title: merge-next +description: Merge the next PR in stack order. +--- + +## Usage + +```bash +dub merge-next +dub land +``` + +## Description + +Merges the bottom-most PR in the stack that is approved and passing checks. PRs are merged in order from the base of the stack upward. + +## Options + +| Flag | Description | +|---|---| +| `--dry-run` | Show which PR would be merged without merging | + +## Examples + +```bash +# Merge the next ready PR +dub merge-next + +# Using the alias +dub land + +# Preview without merging +dub land --dry-run +``` diff --git a/apps/docs/content/docs/commands/meta.json b/apps/docs/content/docs/commands/meta.json new file mode 100644 index 0000000..f89af5f --- /dev/null +++ b/apps/docs/content/docs/commands/meta.json @@ -0,0 +1,18 @@ +{ + "title": "Commands", + "pages": [ + "create", + "restack", + "submit", + "sync", + "merge-next", + "post-merge", + "undo", + "checkout", + "log", + "modify", + "navigate", + "doctor", + "skills" + ] +} diff --git a/apps/docs/content/docs/commands/modify.mdx b/apps/docs/content/docs/commands/modify.mdx new file mode 100644 index 0000000..89c1194 --- /dev/null +++ b/apps/docs/content/docs/commands/modify.mdx @@ -0,0 +1,26 @@ +--- +title: modify +description: Amend the current branch with staged changes. +--- + +## Usage + +```bash +dub modify +``` + +## Description + +Amends the current branch's HEAD commit with any staged changes and restacks descendant branches automatically. + +## Options + +No additional options. + +## Examples + +```bash +# Stage changes and amend +git add . +dub modify +``` diff --git a/apps/docs/content/docs/commands/navigate.mdx b/apps/docs/content/docs/commands/navigate.mdx new file mode 100644 index 0000000..dc9e1d8 --- /dev/null +++ b/apps/docs/content/docs/commands/navigate.mdx @@ -0,0 +1,39 @@ +--- +title: navigate +description: Navigate between stack branches with up, down, top, and bottom. +--- + +## Usage + +```bash +dub up +dub down +dub top +dub bottom +``` + +## Description + +Move between branches in your stack without remembering branch names. Navigation follows the parent-child graph. + +## Commands + +| Command | Description | +|---|---| +| `dub up` | Move to the child branch | +| `dub down` | Move to the parent branch | +| `dub top` | Move to the topmost branch in the stack | +| `dub bottom` | Move to the bottommost branch (just above trunk) | + +## Examples + +```bash +# Move up one branch +dub up + +# Jump to the top of the stack +dub top + +# Go back to the base +dub bottom +``` diff --git a/apps/docs/content/docs/commands/post-merge.mdx b/apps/docs/content/docs/commands/post-merge.mdx new file mode 100644 index 0000000..1dd3dd9 --- /dev/null +++ b/apps/docs/content/docs/commands/post-merge.mdx @@ -0,0 +1,30 @@ +--- +title: post-merge +description: Clean up merged branches and update tracking state. +--- + +## Usage + +```bash +dub post-merge +``` + +## Description + +After PRs have been merged on GitHub, this command cleans up the local and remote branches that are no longer needed and updates DubStack's tracking state. + +## Options + +| Flag | Description | +|---|---| +| `--dry-run` | Show what would be cleaned up without making changes | + +## Examples + +```bash +# Clean up after merging +dub post-merge + +# Preview cleanup +dub post-merge --dry-run +``` diff --git a/apps/docs/content/docs/commands/restack.mdx b/apps/docs/content/docs/commands/restack.mdx new file mode 100644 index 0000000..e959ddd --- /dev/null +++ b/apps/docs/content/docs/commands/restack.mdx @@ -0,0 +1,30 @@ +--- +title: restack +description: Rebase the current branch (and optionally descendants) onto their updated parents. +--- + +## Usage + +```bash +dub restack +``` + +## Description + +Rebases the current branch onto its parent, then recursively rebases all descendant branches. This keeps your stack up to date when a parent branch changes. + +## Options + +| Flag | Description | +|---|---| +| `--current` | Only restack the current branch (skip descendants) | + +## Examples + +```bash +# Restack the current branch and all descendants +dub restack + +# Restack only the current branch +dub restack --current +``` diff --git a/apps/docs/content/docs/commands/skills.mdx b/apps/docs/content/docs/commands/skills.mdx new file mode 100644 index 0000000..a526bfe --- /dev/null +++ b/apps/docs/content/docs/commands/skills.mdx @@ -0,0 +1,32 @@ +--- +title: skills +description: Manage AI agent skills. +--- + +## Usage + +```bash +dub skills +``` + +## Description + +Install, list, and manage AI agent skills that enhance coding assistants' ability to work with DubStack. + +## Subcommands + +| Subcommand | Description | +|---|---| +| `dub skills add ` | Install a skill | +| `dub skills list` | List installed skills | +| `dub skills remove ` | Remove a skill | + +## Examples + +```bash +# Install the DubStack skill +dub skills add wiseiodev/dubstack/skills/dubstack + +# List installed skills +dub skills list +``` diff --git a/apps/docs/content/docs/commands/submit.mdx b/apps/docs/content/docs/commands/submit.mdx new file mode 100644 index 0000000..b9fab65 --- /dev/null +++ b/apps/docs/content/docs/commands/submit.mdx @@ -0,0 +1,36 @@ +--- +title: submit +description: Push branches and create or update GitHub PRs. +--- + +## Usage + +```bash +dub submit +dub ss +``` + +## Description + +Pushes the current branch to the remote and creates or updates a GitHub pull request. Uses the `gh` CLI under the hood. + +## Options + +| Flag | Description | +|---|---| +| `--path stack` | Submit all branches in the current linear stack path | +| `--draft` | Create PRs as drafts | +| `--no-edit` | Skip opening the PR editor | + +## Examples + +```bash +# Submit current branch +dub submit + +# Submit the entire stack +dub submit --path stack + +# Submit as draft +dub ss --draft +``` diff --git a/apps/docs/content/docs/commands/sync.mdx b/apps/docs/content/docs/commands/sync.mdx new file mode 100644 index 0000000..9f37bab --- /dev/null +++ b/apps/docs/content/docs/commands/sync.mdx @@ -0,0 +1,27 @@ +--- +title: sync +description: Fetch trunk and rebase the stack onto the latest trunk. +--- + +## Usage + +```bash +dub sync +``` + +## Description + +Fetches the latest changes from the trunk branch (usually `main`) and rebases the entire stack onto it. This keeps your stack current with upstream changes. + +## Options + +| Flag | Description | +|---|---| +| `--trunk ` | Specify the trunk branch (default: `main`) | + +## Examples + +```bash +# Sync with trunk +dub sync +``` diff --git a/apps/docs/content/docs/commands/undo.mdx b/apps/docs/content/docs/commands/undo.mdx new file mode 100644 index 0000000..e6a216d --- /dev/null +++ b/apps/docs/content/docs/commands/undo.mdx @@ -0,0 +1,25 @@ +--- +title: undo +description: Undo the last DubStack operation. +--- + +## Usage + +```bash +dub undo +``` + +## Description + +Reverts the last DubStack operation by restoring the previous state snapshot. Only a single level of undo is supported. + +## Options + +No additional options. + +## Examples + +```bash +# Undo the last operation +dub undo +``` diff --git a/apps/docs/content/docs/concepts/meta.json b/apps/docs/content/docs/concepts/meta.json new file mode 100644 index 0000000..3585338 --- /dev/null +++ b/apps/docs/content/docs/concepts/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Concepts", + "pages": ["stacked-diffs", "state-management", "stack-graph"] +} diff --git a/apps/docs/content/docs/concepts/stack-graph.mdx b/apps/docs/content/docs/concepts/stack-graph.mdx new file mode 100644 index 0000000..ea2053b --- /dev/null +++ b/apps/docs/content/docs/concepts/stack-graph.mdx @@ -0,0 +1,20 @@ +--- +title: Stack Graph +description: Understanding DubStack's directed graph data model. +--- + +DubStack models your stack as a directed graph where each branch node points to its parent. + +## Parent-Child Relationships + +When you run `dub create feature-b` while on `feature-a`, DubStack records that `feature-b`'s parent is `feature-a`. + +## Graph Operations + +- **`dub log`** — Renders the graph as a tree visualization +- **`dub restack`** — Walks the graph to rebase branches in dependency order +- **`dub submit --path stack`** — Traverses the linear path from trunk to current branch + +## Tracking and Untracking + +Use `dub track` and `dub untrack` to manually add or remove branches from the graph. diff --git a/apps/docs/content/docs/concepts/stacked-diffs.mdx b/apps/docs/content/docs/concepts/stacked-diffs.mdx new file mode 100644 index 0000000..cc9f423 --- /dev/null +++ b/apps/docs/content/docs/concepts/stacked-diffs.mdx @@ -0,0 +1,17 @@ +--- +title: Stacked Diffs +description: Understanding the stacked diff workflow model. +--- + +Stacked diffs (also called stacked PRs or dependent branches) are a workflow where you build a series of small, dependent branches instead of one large feature branch. + +## Why Stack? + +- **Smaller PRs** — Each branch is a focused, reviewable unit +- **Faster reviews** — Reviewers can focus on one logical change at a time +- **Parallel work** — Start the next piece while waiting for review on the current one +- **Cleaner history** — Each PR represents a single logical change + +## How It Works + +Each branch in a stack has a parent branch. The first branch's parent is trunk (usually `main`). Each subsequent branch builds on top of the previous one. diff --git a/apps/docs/content/docs/concepts/state-management.mdx b/apps/docs/content/docs/concepts/state-management.mdx new file mode 100644 index 0000000..8af71b3 --- /dev/null +++ b/apps/docs/content/docs/concepts/state-management.mdx @@ -0,0 +1,20 @@ +--- +title: State Management +description: How DubStack tracks branch relationships and operation state. +--- + +DubStack stores all state locally in your repository under `.git/dubstack/`. + +## State Files + +- **`state.json`** — Branch tracking relationships (parent/child graph) +- **`undo.json`** — State snapshot for undo operations +- **`restack-progress.json`** — In-progress rebase/restack state for recovery + +## State Recovery + +If state becomes corrupted or out of sync, use `dub doctor` to diagnose and repair issues. + +## No Cloud Dependency + +All state is local to your git repository. There's no external service to authenticate with or depend on. diff --git a/apps/docs/content/docs/contributing/agent-skills.mdx b/apps/docs/content/docs/contributing/agent-skills.mdx new file mode 100644 index 0000000..071cc28 --- /dev/null +++ b/apps/docs/content/docs/contributing/agent-skills.mdx @@ -0,0 +1,22 @@ +--- +title: Agent Skills +description: Creating and distributing AI agent skills for DubStack. +--- + +DubStack ships agent skills that help AI coding assistants understand and use the CLI effectively. + +## Available Skills + +- **dubstack** — General CLI reference and workflow guidance +- **dub-flow** — PR creation flow for AI agents + +## Installing Skills + +```bash +dub skills add wiseiodev/dubstack/skills/dubstack +dub skills add wiseiodev/dubstack/skills/dub-flow +``` + +## Creating Custom Skills + +Skills are Markdown files that follow the SKILL.md format. See `skills/dubstack/SKILL.md` for an example. diff --git a/apps/docs/content/docs/contributing/development.mdx b/apps/docs/content/docs/contributing/development.mdx new file mode 100644 index 0000000..9ee773d --- /dev/null +++ b/apps/docs/content/docs/contributing/development.mdx @@ -0,0 +1,35 @@ +--- +title: Development +description: Setting up a development environment for DubStack. +--- + +## Prerequisites + +- Node.js >= 22 +- pnpm (`corepack enable`) +- Git + +## Setup + +```bash +git clone https://github.com/wiseiodev/dubstack.git +cd dubstack +pnpm install +``` + +## Development Commands + +```bash +pnpm build # Build all packages +pnpm test # Run tests +pnpm typecheck # TypeScript type checking +pnpm checks # Biome lint + format +pnpm checks:fix # Auto-fix lint/format issues +``` + +## Coding Conventions + +- TypeScript with ESM imports +- 2-space indentation, single quotes +- kebab-case file names +- Conventional commit messages diff --git a/apps/docs/content/docs/contributing/meta.json b/apps/docs/content/docs/contributing/meta.json new file mode 100644 index 0000000..6bdaf86 --- /dev/null +++ b/apps/docs/content/docs/contributing/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Contributing", + "pages": ["development", "testing", "agent-skills"] +} diff --git a/apps/docs/content/docs/contributing/testing.mdx b/apps/docs/content/docs/contributing/testing.mdx new file mode 100644 index 0000000..7aeb71e --- /dev/null +++ b/apps/docs/content/docs/contributing/testing.mdx @@ -0,0 +1,24 @@ +--- +title: Testing +description: Writing and running tests for DubStack. +--- + +DubStack uses Vitest for testing. + +## Running Tests + +```bash +pnpm test # Run all tests +pnpm test:coverage # Run with coverage +pnpm --filter=dubstack test # Run CLI tests only +``` + +## Test Organization + +- **Command tests**: `packages/cli/src/commands/*.test.ts` +- **Library tests**: `packages/cli/src/lib/*.test.ts` +- **Integration tests**: `packages/cli/test/**/*.test.ts` + +## Writing Tests + +Co-locate unit tests with their source files. Use the existing test patterns as a guide. diff --git a/apps/docs/content/docs/getting-started/installation.mdx b/apps/docs/content/docs/getting-started/installation.mdx new file mode 100644 index 0000000..e91829a --- /dev/null +++ b/apps/docs/content/docs/getting-started/installation.mdx @@ -0,0 +1,38 @@ +--- +title: Installation +description: Install DubStack via Homebrew, npm, or from source. +--- + +## Prerequisites + +- Node.js >= 22 +- Git +- GitHub CLI (`gh`) for PR operations + +## Homebrew (macOS) + +```bash +brew install wiseiodev/dubstack/dubstack +``` + +## npm + +```bash +npm install -g dubstack +``` + +## From Source + +```bash +git clone https://github.com/wiseiodev/dubstack.git +cd dubstack +pnpm install +pnpm build +npm link +``` + +## Verify Installation + +```bash +dub --version +``` diff --git a/apps/docs/content/docs/getting-started/meta.json b/apps/docs/content/docs/getting-started/meta.json new file mode 100644 index 0000000..018a20d --- /dev/null +++ b/apps/docs/content/docs/getting-started/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Getting Started", + "pages": ["installation", "quickstart"] +} diff --git a/apps/docs/content/docs/getting-started/quickstart.mdx b/apps/docs/content/docs/getting-started/quickstart.mdx new file mode 100644 index 0000000..ce3f3cb --- /dev/null +++ b/apps/docs/content/docs/getting-started/quickstart.mdx @@ -0,0 +1,43 @@ +--- +title: Quick Start +description: Create your first stacked branch workflow in minutes. +--- + +## Initialize DubStack + +DubStack auto-initializes when you create your first branch. No setup command needed. + +## Create Your First Stack + +```bash +# Start from your trunk branch (main) +git checkout main + +# Create the first branch in your stack +dub create feature-auth + +# Make changes, commit, then create the next branch +dub create feature-auth-ui +``` + +## Visualize Your Stack + +```bash +dub log +``` + +## Submit PRs + +```bash +# Submit the current branch +dub submit + +# Submit the entire stack +dub submit --path stack +``` + +## Sync with Trunk + +```bash +dub sync +``` diff --git a/apps/docs/content/docs/guides/ai-assistant.mdx b/apps/docs/content/docs/guides/ai-assistant.mdx new file mode 100644 index 0000000..ae5c860 --- /dev/null +++ b/apps/docs/content/docs/guides/ai-assistant.mdx @@ -0,0 +1,22 @@ +--- +title: AI Assistant +description: Setting up and using DubStack's AI-powered features. +--- + +DubStack includes an optional AI assistant that can help with conflict resolution and code review. + +## Setup + +Configure your AI provider by setting the appropriate environment variables: + +```bash +dub ai-env +``` + +## AI-Assisted Conflict Resolution + +When conflicts arise during restack, the AI assistant can suggest resolutions based on the context of your changes. + +## Configuration + +See `dub config` for AI-related settings. diff --git a/apps/docs/content/docs/guides/conflict-resolution.mdx b/apps/docs/content/docs/guides/conflict-resolution.mdx new file mode 100644 index 0000000..4c36fbf --- /dev/null +++ b/apps/docs/content/docs/guides/conflict-resolution.mdx @@ -0,0 +1,28 @@ +--- +title: Conflict Resolution +description: How to handle rebase conflicts during restack and sync operations. +--- + +Conflicts are a normal part of stacked workflows. DubStack provides tools to handle them gracefully. + +## When Conflicts Occur + +Conflicts happen during `dub restack` or `dub sync` when changes in one branch overlap with changes in another. + +## Resolving Conflicts + +When a conflict is detected, DubStack pauses the operation. Resolve the conflicts in your editor, stage the files, then continue: + +```bash +# After resolving conflicts +git add . +dub continue +``` + +## Aborting a Restack + +If you want to start over: + +```bash +dub abort +``` diff --git a/apps/docs/content/docs/guides/meta.json b/apps/docs/content/docs/guides/meta.json new file mode 100644 index 0000000..3c18a18 --- /dev/null +++ b/apps/docs/content/docs/guides/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Guides", + "pages": [ + "stacking-workflow", + "conflict-resolution", + "ai-assistant", + "migration-from-graphite" + ] +} diff --git a/apps/docs/content/docs/guides/migration-from-graphite.mdx b/apps/docs/content/docs/guides/migration-from-graphite.mdx new file mode 100644 index 0000000..aeb1fac --- /dev/null +++ b/apps/docs/content/docs/guides/migration-from-graphite.mdx @@ -0,0 +1,22 @@ +--- +title: Migration from Graphite +description: Transitioning from Graphite to DubStack. +--- + +If you're coming from Graphite, DubStack uses a similar mental model with some key differences. + +## Concept Mapping + +| Graphite | DubStack | +|---|---| +| `gt create` | `dub create` | +| `gt submit` | `dub submit` | +| `gt sync` | `dub sync` | +| `gt log` | `dub log` | +| `gt modify` | `dub modify` | + +## Key Differences + +- DubStack stores state locally in `.git/dubstack/` — no cloud service required +- DubStack uses GitHub PRs directly via the `gh` CLI +- Stack state is fully transparent and recoverable via `dub doctor` diff --git a/apps/docs/content/docs/guides/stacking-workflow.mdx b/apps/docs/content/docs/guides/stacking-workflow.mdx new file mode 100644 index 0000000..9cc1635 --- /dev/null +++ b/apps/docs/content/docs/guides/stacking-workflow.mdx @@ -0,0 +1,22 @@ +--- +title: Stacking Workflow +description: End-to-end guide to the stacked branch workflow with DubStack. +--- + +This guide walks through a complete stacking workflow from creating your first branch to landing all PRs. + +## Planning Your Stack + +Break your feature into small, reviewable pieces. Each piece becomes a branch in the stack. + +## Creating the Stack + +Start from trunk and use `dub create` to build your stack one branch at a time. + +## Iterating on Feedback + +When reviewers request changes to a branch in the middle of your stack, make the changes and use `dub restack` to propagate them through descendant branches. + +## Landing PRs + +Merge PRs in order from the bottom of the stack upward using `dub merge-next`, then run `dub post-merge` to clean up. diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx new file mode 100644 index 0000000..06692bf --- /dev/null +++ b/apps/docs/content/docs/index.mdx @@ -0,0 +1,8 @@ +--- +title: Introduction +description: Welcome to the DubStack documentation. +--- + +DubStack is a CLI tool for managing stacked diffs — dependent git branches that make code review faster and more focused. + +This documentation will help you get started with DubStack and learn how to use it effectively. diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json new file mode 100644 index 0000000..3aef91d --- /dev/null +++ b/apps/docs/content/docs/meta.json @@ -0,0 +1,16 @@ +{ + "title": "Docs", + "pages": [ + "index", + "---Getting Started---", + "getting-started", + "---Commands---", + "commands", + "---Guides---", + "guides", + "---Concepts---", + "concepts", + "---Contributing---", + "contributing" + ] +} diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs new file mode 100644 index 0000000..2c0e815 --- /dev/null +++ b/apps/docs/next.config.mjs @@ -0,0 +1,19 @@ +import { createMDX } from 'fumadocs-mdx/next'; + +const withMDX = createMDX(); + +/** @type {import('next').NextConfig} */ +const config = { + serverExternalPackages: ['@takumi-rs/image-response'], + reactStrictMode: true, + async rewrites() { + return [ + { + source: '/docs/:path*.mdx', + destination: '/llms.mdx/docs/:path*', + }, + ]; + }, +}; + +export default withMDX(config); diff --git a/apps/docs/package.json b/apps/docs/package.json new file mode 100644 index 0000000..c694de5 --- /dev/null +++ b/apps/docs/package.json @@ -0,0 +1,36 @@ +{ + "name": "docs", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "next build", + "dev": "next dev", + "start": "next start", + "typecheck": "fumadocs-mdx && next typegen && tsc --noEmit", + "postinstall": "fumadocs-mdx", + "lint": "biome check", + "format": "biome format --write" + }, + "dependencies": { + "fumadocs-core": "16.6.10", + "fumadocs-mdx": "14.2.9", + "fumadocs-ui": "16.6.10", + "lucide-react": "^0.577.0", + "next": "16.1.6", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "tailwind-merge": "^3.5.0", + "@takumi-rs/image-response": "^0.70.4" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.2.1", + "@types/mdx": "^2.0.13", + "@types/node": "^25.3.3", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.1", + "typescript": "^5.9.3", + "@biomejs/biome": "^2.4.6" + } +} diff --git a/apps/docs/postcss.config.mjs b/apps/docs/postcss.config.mjs new file mode 100644 index 0000000..297374d --- /dev/null +++ b/apps/docs/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; + +export default config; diff --git a/apps/docs/source.config.ts b/apps/docs/source.config.ts new file mode 100644 index 0000000..45c7907 --- /dev/null +++ b/apps/docs/source.config.ts @@ -0,0 +1,23 @@ +import { metaSchema, pageSchema } from 'fumadocs-core/source/schema'; +import { defineConfig, defineDocs } from 'fumadocs-mdx/config'; + +// You can customise Zod schemas for frontmatter and `meta.json` here +// see https://fumadocs.dev/docs/mdx/collections +export const docs = defineDocs({ + dir: 'content/docs', + docs: { + schema: pageSchema, + postprocess: { + includeProcessedMarkdown: true, + }, + }, + meta: { + schema: metaSchema, + }, +}); + +export default defineConfig({ + mdxOptions: { + // MDX options + }, +}); diff --git a/apps/docs/src/app/(home)/layout.tsx b/apps/docs/src/app/(home)/layout.tsx new file mode 100644 index 0000000..77379fa --- /dev/null +++ b/apps/docs/src/app/(home)/layout.tsx @@ -0,0 +1,6 @@ +import { HomeLayout } from 'fumadocs-ui/layouts/home'; +import { baseOptions } from '@/lib/layout.shared'; + +export default function Layout({ children }: LayoutProps<'/'>) { + return {children}; +} diff --git a/apps/docs/src/app/(home)/page.tsx b/apps/docs/src/app/(home)/page.tsx new file mode 100644 index 0000000..4d7a893 --- /dev/null +++ b/apps/docs/src/app/(home)/page.tsx @@ -0,0 +1,16 @@ +import Link from 'next/link'; + +export default function HomePage() { + return ( +
+

Hello World

+

+ You can open{' '} + + /docs + {' '} + and see the documentation. +

+
+ ); +} diff --git a/apps/docs/src/app/api/search/route.ts b/apps/docs/src/app/api/search/route.ts new file mode 100644 index 0000000..5069e90 --- /dev/null +++ b/apps/docs/src/app/api/search/route.ts @@ -0,0 +1,7 @@ +import { createFromSource } from 'fumadocs-core/search/server'; +import { source } from '@/lib/source'; + +export const { GET } = createFromSource(source, { + // https://docs.orama.com/docs/orama-js/supported-languages + language: 'english', +}); diff --git a/apps/docs/src/app/docs/[[...slug]]/page.tsx b/apps/docs/src/app/docs/[[...slug]]/page.tsx new file mode 100644 index 0000000..32f8c2d --- /dev/null +++ b/apps/docs/src/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,65 @@ +import { + DocsBody, + DocsDescription, + DocsPage, + DocsTitle, +} from 'fumadocs-ui/layouts/docs/page'; +import { createRelativeLink } from 'fumadocs-ui/mdx'; +import type { Metadata } from 'next'; +import { notFound } from 'next/navigation'; +import { LLMCopyButton, ViewOptions } from '@/components/ai/page-actions'; +import { gitConfig } from '@/lib/layout.shared'; +import { getPageImage, source } from '@/lib/source'; +import { getMDXComponents } from '@/mdx-components'; + +export default async function Page(props: PageProps<'/docs/[[...slug]]'>) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + const MDX = page.data.body; + + return ( + + {page.data.title} + + {page.data.description} + +
+ + +
+ + + +
+ ); +} + +export async function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata( + props: PageProps<'/docs/[[...slug]]'>, +): Promise { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + return { + title: page.data.title, + description: page.data.description, + openGraph: { + images: getPageImage(page).url, + }, + }; +} diff --git a/apps/docs/src/app/docs/layout.tsx b/apps/docs/src/app/docs/layout.tsx new file mode 100644 index 0000000..2c2ce95 --- /dev/null +++ b/apps/docs/src/app/docs/layout.tsx @@ -0,0 +1,11 @@ +import { DocsLayout } from 'fumadocs-ui/layouts/docs'; +import { baseOptions } from '@/lib/layout.shared'; +import { source } from '@/lib/source'; + +export default function Layout({ children }: LayoutProps<'/docs'>) { + return ( + + {children} + + ); +} diff --git a/apps/docs/src/app/global.css b/apps/docs/src/app/global.css new file mode 100644 index 0000000..cd3cf62 --- /dev/null +++ b/apps/docs/src/app/global.css @@ -0,0 +1,3 @@ +@import "tailwindcss"; +@import "fumadocs-ui/css/shadcn.css"; +@import "fumadocs-ui/css/preset.css"; diff --git a/apps/docs/src/app/layout.tsx b/apps/docs/src/app/layout.tsx new file mode 100644 index 0000000..78aa9a2 --- /dev/null +++ b/apps/docs/src/app/layout.tsx @@ -0,0 +1,17 @@ +import { RootProvider } from 'fumadocs-ui/provider/next'; +import './global.css'; +import { Inter } from 'next/font/google'; + +const inter = Inter({ + subsets: ['latin'], +}); + +export default function Layout({ children }: LayoutProps<'/'>) { + return ( + + + {children} + + + ); +} diff --git a/apps/docs/src/app/llms-full.txt/route.ts b/apps/docs/src/app/llms-full.txt/route.ts new file mode 100644 index 0000000..d494d2c --- /dev/null +++ b/apps/docs/src/app/llms-full.txt/route.ts @@ -0,0 +1,10 @@ +import { getLLMText, source } from '@/lib/source'; + +export const revalidate = false; + +export async function GET() { + const scan = source.getPages().map(getLLMText); + const scanned = await Promise.all(scan); + + return new Response(scanned.join('\n\n')); +} diff --git a/apps/docs/src/app/llms.mdx/docs/[[...slug]]/route.ts b/apps/docs/src/app/llms.mdx/docs/[[...slug]]/route.ts new file mode 100644 index 0000000..f410fab --- /dev/null +++ b/apps/docs/src/app/llms.mdx/docs/[[...slug]]/route.ts @@ -0,0 +1,23 @@ +import { notFound } from 'next/navigation'; +import { getLLMText, source } from '@/lib/source'; + +export const revalidate = false; + +export async function GET( + _req: Request, + { params }: RouteContext<'/llms.mdx/docs/[[...slug]]'>, +) { + const { slug } = await params; + const page = source.getPage(slug); + if (!page) notFound(); + + return new Response(await getLLMText(page), { + headers: { + 'Content-Type': 'text/markdown', + }, + }); +} + +export function generateStaticParams() { + return source.generateParams(); +} diff --git a/apps/docs/src/app/llms.txt/route.ts b/apps/docs/src/app/llms.txt/route.ts new file mode 100644 index 0000000..ae69f77 --- /dev/null +++ b/apps/docs/src/app/llms.txt/route.ts @@ -0,0 +1,8 @@ +import { llms } from 'fumadocs-core/source'; +import { source } from '@/lib/source'; + +export const revalidate = false; + +export function GET() { + return new Response(llms(source).index()); +} diff --git a/apps/docs/src/app/og/docs/[...slug]/route.tsx b/apps/docs/src/app/og/docs/[...slug]/route.tsx new file mode 100644 index 0000000..8e6f002 --- /dev/null +++ b/apps/docs/src/app/og/docs/[...slug]/route.tsx @@ -0,0 +1,35 @@ +import { ImageResponse } from '@takumi-rs/image-response'; +import { generate as DefaultImage } from 'fumadocs-ui/og/takumi'; +import { notFound } from 'next/navigation'; +import { getPageImage, source } from '@/lib/source'; + +export const revalidate = false; + +export async function GET( + _req: Request, + { params }: RouteContext<'/og/docs/[...slug]'>, +) { + const { slug } = await params; + const page = source.getPage(slug.slice(0, -1)); + if (!page) notFound(); + + return new ImageResponse( + , + { + width: 1200, + height: 630, + format: 'webp', + }, + ); +} + +export function generateStaticParams() { + return source.getPages().map((page) => ({ + lang: page.locale, + slug: getPageImage(page).segments, + })); +} diff --git a/apps/docs/src/components/ai/page-actions.tsx b/apps/docs/src/components/ai/page-actions.tsx new file mode 100644 index 0000000..9e1e431 --- /dev/null +++ b/apps/docs/src/components/ai/page-actions.tsx @@ -0,0 +1,256 @@ +'use client'; +import { buttonVariants } from 'fumadocs-ui/components/ui/button'; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from 'fumadocs-ui/components/ui/popover'; +import { useCopyButton } from 'fumadocs-ui/utils/use-copy-button'; +import { + Check, + ChevronDown, + Copy, + ExternalLinkIcon, + TextIcon, +} from 'lucide-react'; +import { useMemo, useState } from 'react'; +import { cn } from '@/lib/cn'; + +const cache = new Map(); + +export function LLMCopyButton({ + /** + * A URL to fetch the raw Markdown/MDX content of page + */ + markdownUrl, +}: { + markdownUrl: string; +}) { + const [isLoading, setLoading] = useState(false); + const [checked, onClick] = useCopyButton(async () => { + const cached = cache.get(markdownUrl); + if (cached) return navigator.clipboard.writeText(cached); + + setLoading(true); + + try { + await navigator.clipboard.write([ + new ClipboardItem({ + 'text/plain': fetch(markdownUrl).then(async (res) => { + const content = await res.text(); + cache.set(markdownUrl, content); + + return content; + }), + }), + ]); + } finally { + setLoading(false); + } + }); + + return ( + + ); +} + +export function ViewOptions({ + markdownUrl, + githubUrl, +}: { + /** + * A URL to the raw Markdown/MDX content of page + */ + markdownUrl: string; + + /** + * Source file URL on GitHub + */ + githubUrl: string; +}) { + const items = useMemo(() => { + const pageUrl = + typeof window !== 'undefined' ? window.location.href : 'loading'; + const q = `Read ${pageUrl}, I want to ask questions about it.`; + + return [ + { + title: 'Open in GitHub', + href: githubUrl, + icon: ( + + GitHub + + + ), + }, + { + title: 'View as Markdown', + href: markdownUrl, + icon: , + }, + { + title: 'Open in Scira AI', + href: `https://scira.ai/?${new URLSearchParams({ + q, + })}`, + icon: ( + + Scira AI + + + + + + + + + ), + }, + { + title: 'Open in ChatGPT', + href: `https://chatgpt.com/?${new URLSearchParams({ + hints: 'search', + q, + })}`, + icon: ( + + OpenAI + + + ), + }, + { + title: 'Open in Claude', + href: `https://claude.ai/new?${new URLSearchParams({ + q, + })}`, + icon: ( + + Anthropic + + + ), + }, + { + title: 'Open in Cursor', + icon: ( + + Cursor + + + ), + href: `https://cursor.com/link/prompt?${new URLSearchParams({ + text: q, + })}`, + }, + ]; + }, [githubUrl, markdownUrl]); + + return ( + + + Open + + + + {items.map((item) => ( + + {item.icon} + {item.title} + + + ))} + + + ); +} diff --git a/apps/docs/src/lib/cn.ts b/apps/docs/src/lib/cn.ts new file mode 100644 index 0000000..ba66fd2 --- /dev/null +++ b/apps/docs/src/lib/cn.ts @@ -0,0 +1 @@ +export { twMerge as cn } from 'tailwind-merge'; diff --git a/apps/docs/src/lib/layout.shared.tsx b/apps/docs/src/lib/layout.shared.tsx new file mode 100644 index 0000000..de68d41 --- /dev/null +++ b/apps/docs/src/lib/layout.shared.tsx @@ -0,0 +1,17 @@ +import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; + +// fill this with your actual GitHub info, for example: +export const gitConfig = { + user: 'fuma-nama', + repo: 'fumadocs', + branch: 'main', +}; + +export function baseOptions(): BaseLayoutProps { + return { + nav: { + title: 'My App', + }, + githubUrl: `https://github.com/${gitConfig.user}/${gitConfig.repo}`, + }; +} diff --git a/apps/docs/src/lib/source.ts b/apps/docs/src/lib/source.ts new file mode 100644 index 0000000..4345b86 --- /dev/null +++ b/apps/docs/src/lib/source.ts @@ -0,0 +1,27 @@ +import { docs } from 'fumadocs-mdx:collections/server'; +import { type InferPageType, loader } from 'fumadocs-core/source'; +import { lucideIconsPlugin } from 'fumadocs-core/source/lucide-icons'; + +// See https://fumadocs.dev/docs/headless/source-api for more info +export const source = loader({ + baseUrl: '/docs', + source: docs.toFumadocsSource(), + plugins: [lucideIconsPlugin()], +}); + +export function getPageImage(page: InferPageType) { + const segments = [...page.slugs, 'image.webp']; + + return { + segments, + url: `/og/docs/${segments.join('/')}`, + }; +} + +export async function getLLMText(page: InferPageType) { + const processed = await page.data.getText('processed'); + + return `# ${page.data.title} + +${processed}`; +} diff --git a/apps/docs/src/mdx-components.tsx b/apps/docs/src/mdx-components.tsx new file mode 100644 index 0000000..20beb4c --- /dev/null +++ b/apps/docs/src/mdx-components.tsx @@ -0,0 +1,9 @@ +import defaultMdxComponents from 'fumadocs-ui/mdx'; +import type { MDXComponents } from 'mdx/types'; + +export function getMDXComponents(components?: MDXComponents): MDXComponents { + return { + ...defaultMdxComponents, + ...components, + }; +} diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json new file mode 100644 index 0000000..9833e60 --- /dev/null +++ b/apps/docs/tsconfig.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "target": "ESNext", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "paths": { + "@/*": ["./src/*"], + "fumadocs-mdx:collections/*": [".source/*"] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": ["node_modules"] +} diff --git a/biome.json b/biome.json index 309b264..b1279d3 100644 --- a/biome.json +++ b/biome.json @@ -46,6 +46,12 @@ } } }, + "css": { + "parser": { + "cssModules": true, + "tailwindDirectives": true + } + }, "javascript": { "formatter": { "quoteStyle": "single", diff --git a/docs/plans/2026-02-21-dogfood-cli-ux-improvements.md b/docs/plans/2026-02-21-dogfood-cli-ux-improvements.md deleted file mode 100644 index 253cba5..0000000 --- a/docs/plans/2026-02-21-dogfood-cli-ux-improvements.md +++ /dev/null @@ -1,140 +0,0 @@ -# Dogfood CLI UX Improvements Implementation Plan - -> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. - -**Goal:** Improve DubStack's self-serve UX so users can diagnose and recover from common stack/submit/sync issues without assistant help. - -**Architecture:** Extend existing command modules with focused preflight/diagnostic helpers (`submit`, `doctor`, `prune`, `ready`) and safer sync orchestration. Keep behavior changes covered by command-level unit tests and minimal CLI wiring updates in `src/index.ts`. - -**Tech Stack:** TypeScript (ESM), commander, vitest, existing `src/lib/*` helpers. - ---- - -### Task 1: Submit preflight and dry-run clarity - -**Files:** -- Modify: `src/commands/submit.ts` -- Modify: `src/commands/submit.test.ts` -- Modify: `src/index.ts` - -**Step 1: Write failing tests** -- Add tests for: - - default/current-path submit does not fail on sibling branch elsewhere in stack - - branching error includes parent + child names and concrete remediation commands - - dry-run summary text does not claim pushes happened - - `--fix` behavior in stack mode falls back to current-path when safe - -**Step 2: Run submit tests and verify failures** -- Run: `pnpm test src/commands/submit.test.ts` - -**Step 3: Implement minimal submit changes** -- Add submit planning helper that supports scope (`current-path` vs `stack`). -- Keep root-branch guardrails and linearity validation. -- Improve dry-run summary/result formatting semantics. -- Add `--path ` and `--fix` in CLI wiring. - -**Step 4: Re-run submit tests** -- Run: `pnpm test src/commands/submit.test.ts` - -### Task 2: Doctor and ready command surface - -**Files:** -- Create: `src/commands/doctor.ts` -- Create: `src/commands/doctor.test.ts` -- Create: `src/commands/ready.ts` -- Create: `src/commands/ready.test.ts` -- Modify: `src/index.ts` - -**Step 1: Write failing tests** -- `doctor` detects: - - in-progress operations - - missing tracked local branches - - submit branching blockers - - remote/local drift -- `ready` reports health + submit preflight outcome for current path. - -**Step 2: Run new command tests and verify failures** -- Run: `pnpm test src/commands/doctor.test.ts src/commands/ready.test.ts` - -**Step 3: Implement minimal command logic** -- `doctor`: structured checks + actionable fix commands. -- `ready`: compose doctor + submit preflight helper and produce one checklist result. -- Wire `dub doctor` and `dub ready`. - -**Step 4: Re-run tests** -- Run: `pnpm test src/commands/doctor.test.ts src/commands/ready.test.ts` - -### Task 3: Prune stale tracked branches workflow - -**Files:** -- Create: `src/commands/prune.ts` -- Create: `src/commands/prune.test.ts` -- Modify: `src/index.ts` - -**Step 1: Write failing tests** -- Preview mode reports stale tracked branches without mutating state. -- `--apply` removes stale tracked branch metadata. -- Supports current-stack scope and `--all`. - -**Step 2: Run prune tests and verify failures** -- Run: `pnpm test src/commands/prune.test.ts` - -**Step 3: Implement minimal prune logic** -- Detect stale tracked branches by local/remote presence. -- Return preview + applied results with safe defaults. -- Wire `dub prune [--apply] [--all]`. - -**Step 4: Re-run tests** -- Run: `pnpm test src/commands/prune.test.ts` - -### Task 4: Safer sync defaults and recovery output - -**Files:** -- Modify: `src/commands/sync.ts` -- Modify: `src/commands/sync.test.ts` -- Modify: `src/index.ts` - -**Step 1: Write failing tests** -- Default sync behavior does not restack unless explicitly requested. -- Sync restack conflict/failure emits clear recovery guidance. -- Sync attempts to restore original branch only when no active operation is in progress. - -**Step 2: Run sync tests and verify failures** -- Run: `pnpm test src/commands/sync.test.ts` - -**Step 3: Implement minimal sync orchestration changes** -- Make restack opt-in by default. -- Add robust try/finally branch restoration behavior. -- Improve error text with concrete next commands (`dub continue` / `dub abort`). - -**Step 4: Re-run sync tests** -- Run: `pnpm test src/commands/sync.test.ts` - -### Task 5: Docs updates for self-serve recovery - -**Files:** -- Modify: `README.md` -- Modify: `QUICKSTART.md` -- Modify: `AGENTS.md` -- Modify: `CONTRIBUTING.md` - -**Step 1: Add docs for new workflows** -- Include `doctor`, `ready`, `prune`, submit path/fix behavior. -- Add stale branch recovery decision tree and commands. - -**Step 2: Run verification suite** -- Run: - - `pnpm test` - - `pnpm typecheck` - - `pnpm checks` - -### Task 6: Final validation and summary - -**Files:** -- No additional edits expected - -**Step 1: Validate no unintended behavior drift** -- Review changed files and tests for scope control. - -**Step 2: Summarize implementation + residual risks** -- Provide command examples and migration notes for users. diff --git a/docs/plans/2026-02-21-dub-sync-parity-design.md b/docs/plans/2026-02-21-dub-sync-parity-design.md deleted file mode 100644 index 7f93b9b..0000000 --- a/docs/plans/2026-02-21-dub-sync-parity-design.md +++ /dev/null @@ -1,229 +0,0 @@ -# Dub Sync Parity Design - -**Date:** 2026-02-21 -**Status:** Approved -**Owner:** DubStack CLI - -## 1. Problem Statement - -DubStack needs a `dub sync` command with behavior close to Graphite's `gt sync`, including: -- fetching and syncing trunk + tracked branches from remote, -- cleaning up merged/closed branches safely, -- reconciling local and remote divergence with interactive decisions, -- optional restacking after sync. - -The current codebase has robust `create`, `submit`, `restack`, and local stack state, but lacks branch-level remote reconciliation and sync metadata needed for parity decisions. - -## 2. Goals - -- Implement `dub sync` with interactive and non-interactive flows. -- Match Graphite-style phase ordering and user-facing intent. -- Preserve safety by default; only destructive actions under explicit user choice or `--force`. -- Maintain deterministic behavior in non-interactive mode. -- Keep architecture modular and testable. - -## 3. Non-Goals (Initial Parity Scope) - -- Perfect wire-level parity with Graphite internal APIs. -- Server-side features that depend on private Graphite backend semantics. -- Replacing existing `submit` behavior in this phase. - -## 4. Command Contract - -### Command -- `dub sync` - -### Flags -- `--restack` (default `true`, supports `--no-restack`) -- `-f, --force` -- `-a, --all` -- `--no-interactive` (explicitly disable prompts; otherwise inferred from TTY) - -### Phase Output -1. `🌲 Fetching branches from remote...` -2. Trunk update reporting -3. `🧹 Cleaning up branches with merged/closed PRs...` -4. `🔄 Syncing branches...` -5. Optional `🥞 Restacking branches...` - -## 5. Architecture - -### 5.1 Orchestrator -- `src/commands/sync.ts` -- Responsibilities: - - parse options and build sync context, - - select branches/trunks in scope, - - execute phase pipeline, - - aggregate and print summary. - -### 5.2 Sync Modules - -- `src/lib/sync/types.ts` - - shared interfaces/enums: `SyncOptions`, `SyncContext`, `BranchSyncStatus`, `SyncDecision`, `SyncResult`. - -- `src/lib/sync/fetch.ts` - - remote fetch for trunks + candidate branches - - optional progress callbacks. - -- `src/lib/sync/trunk.ts` - - sync trunk branches with fast-forward checks, - - prompt/force handling when overwrite is needed. - -- `src/lib/sync/cleanup.ts` - - determine branches eligible for cleanup from PR state, - - enforce safety checks (merged ancestry, protected descendants), - - prompt or apply forced deletion. - -- `src/lib/sync/branch-status.ts` - - classify each branch into status bucket: - - `missing-remote` - - `missing-local` - - `untracked` - - `unsubmitted` - - `up-to-date` - - `updated-outside-dubstack-but-up-to-date` - - `new-parent-with-remote-change` - - `reconcile-needed` - - `needs-remote-sync-safe` - - `needs-remote-sync` - -- `src/lib/sync/reconcile.ts` - - compute reconciled candidate (if cleanly possible), - - interactive decision tree for ambiguous states, - - deterministic fallback in non-interactive mode. - -- `src/lib/sync/apply.ts` - - perform mutations for decisions (`take-remote`, `keep-local-baseline-update`, `reconcile`, `reconcile-alt-parent`). - -- `src/lib/sync/report.ts` - - stable user-facing event and summary rendering. - -## 6. Data Model Changes - -Current `DubState` must expand with sync metadata per branch. - -### Proposed `Branch` additions -- `last_submitted_version`: nullable object - - `head_sha: string` - - `base_sha: string` - - `base_branch: string` - - `version_number: number | null` - - `source: "submit" | "sync" | "imported"` -- `last_synced_at: string | null` -- `sync_source: "submit" | "sync" | "imported" | null` - -These fields support parity behavior such as: -- preserving local state while updating baseline, -- distinguishing remote updates created outside DubStack, -- making safe overwrite/reconcile choices. - -## 7. Detailed Behavior - -### 7.1 Scope Selection -- Default: current trunk relative upstack (tracked). -- `--all`: all tracked branches across trunks. - -### 7.2 Trunk Sync -- Attempt FF update from remote. -- On non-FF: - - interactive: prompt to overwrite local trunk, - - `--force`: overwrite directly, - - non-interactive without force: skip + warning. - -### 7.3 Cleanup -- Detect branches whose PRs are merged/closed and cleanable. -- Delete safely when commits are confirmed landed in trunk. -- If not cleanable, print grouped warning and exclude descendants from sync. - -### 7.4 Branch Status Handling - -- `missing-remote` - - if no compatible remote provenance: warn and skip. - -- `missing-local` - - create branch from remote version and record metadata. - -- `untracked` - - interactive prompt to overwrite local with remote, - - force: overwrite, - - non-interactive no force: skip warning. - -- `unsubmitted` - - if already equal to remote: informational, - - else interactive/force branch-overwrite decision. - -- `up-to-date` - - update baseline metadata; if both sides restacked, prompt keep-local vs take-remote. - -- `updated-outside-dubstack-but-up-to-date` - - informational; refresh baseline metadata only. - -- `new-parent-with-remote-change` / `needs-remote-sync-safe` - - apply remote sync with reconciled parent/base/head. - -- `reconcile-needed` - - try clean reconciliation, - - if impossible: prompt remote/local/cancel (or force remote in `--force`). - -- `needs-remote-sync` - - handle parent mismatch: - - take remote on local parent, - - take remote with remote parent, - - keep local (baseline update). - -### 7.5 Restack Phase -- If `--restack` and eligible, call existing restack routines on relevant roots. -- Surface conflicts clearly and preserve recovery instructions. - -## 8. UX and Error Philosophy - -- Use actionable `DubError` messages. -- Never silently discard user work. -- Non-interactive mode must be deterministic and conservative. -- `--force` explicitly opts into destructive sync paths. - -## 9. Testing Strategy - -### Unit Tests -- `src/lib/sync/branch-status.test.ts` -- `src/lib/sync/reconcile.test.ts` -- `src/lib/sync/cleanup.test.ts` -- `src/lib/sync/apply.test.ts` - -### Command Tests -- `src/commands/sync.test.ts` - - phase ordering, - - force vs interactive vs non-interactive, - - all status families, - - restack integration path. - -### Regression/Verification -- `pnpm test` -- `pnpm typecheck` -- `pnpm checks` - -## 10. Risks and Mitigations - -- **Risk:** incorrect destructive action during sync - - **Mitigation:** default-safe behavior, explicit force gates, test matrix for every status. - -- **Risk:** state schema migration bugs - - **Mitigation:** migration helper + backward-compatible reads + tests with legacy fixtures. - -- **Risk:** branching stacks edge cases - - **Mitigation:** explicit checks, clear warnings, skip unsupported scenarios with guidance. - -## 11. Rollout Plan - -1. Introduce sync metadata schema + migration. -2. Implement deterministic status + apply pipeline. -3. Add interactive decision tree. -4. Add cleanup and post-sync restack. -5. Harden output + docs. - -## 12. Success Criteria - -- `dub sync` can run on active stacks and reconcile with remote safely. -- Interactive parity decisions exist for divergence scenarios. -- Non-interactive behavior is conservative and explicit. -- Full test suite passes with new sync coverage. diff --git a/docs/plans/2026-02-21-dub-sync-parity-implementation.md b/docs/plans/2026-02-21-dub-sync-parity-implementation.md deleted file mode 100644 index 5761776..0000000 --- a/docs/plans/2026-02-21-dub-sync-parity-implementation.md +++ /dev/null @@ -1,492 +0,0 @@ -# Dub Sync Parity Implementation Plan - -> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. - -**Goal:** Build a `dub sync` command with Graphite-like parity for fetch/trunk sync/cleanup/reconcile/restack flows, including full interactive decision paths. - -**Architecture:** Implement a pipeline-based sync system (`fetch` -> `trunk` -> `cleanup` -> `branch status + apply` -> `restack`) in `src/lib/sync/*`, orchestrated by `src/commands/sync.ts`. Extend branch state with sync baseline metadata so decisions like keep-local vs take-remote remain safe and deterministic. - -**Tech Stack:** TypeScript (ESM), Commander, Execa/git/gh CLI integration, Vitest, Biome. - ---- - -### Task 1: Add sync metadata schema and migration helpers - -**Files:** -- Modify: `src/lib/state.ts` -- Test: `src/lib/state.test.ts` - -**Step 1: Write failing tests for backward-compatible state reads** - -Add tests that load legacy branch objects without sync fields and expect defaults: -```ts -expect(branch.last_submitted_version).toBeNull(); -expect(branch.last_synced_at).toBeNull(); -expect(branch.sync_source).toBeNull(); -``` - -**Step 2: Run targeted test to verify failure** - -Run: `pnpm test src/lib/state.test.ts` -Expected: FAIL due to missing fields/defaulting. - -**Step 3: Implement minimal schema extension + normalization** - -In `src/lib/state.ts`: -- Add new branch fields and types. -- Add `normalizeState(...)` invoked by `readState`. -- Ensure new branches created by existing commands include defaults. - -**Step 4: Re-run targeted test** - -Run: `pnpm test src/lib/state.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/lib/state.ts src/lib/state.test.ts -git commit -m "feat(sync): add branch sync metadata schema and normalization" -``` - -### Task 2: Add git helpers required by sync pipeline - -**Files:** -- Modify: `src/lib/git.ts` -- Test: `src/lib/git.test.ts` - -**Step 1: Write failing tests for sync-oriented primitives** - -Add tests for: -- branch upstream existence checks, -- commit equality checks between refs, -- safe reset-to-remote helper behavior, -- fetch branch list helper. - -**Step 2: Run targeted tests to verify failure** - -Run: `pnpm test src/lib/git.test.ts` -Expected: FAIL for missing helper APIs. - -**Step 3: Implement minimal helpers in `src/lib/git.ts`** - -Add small pure wrappers: -- `fetchBranches(branches, cwd, onProgress?)` -- `refEquals(a, b, cwd)` -- `hardResetTo(ref, cwd)` -- `getRemoteHeadRef(branch, remote, cwd)` - -**Step 4: Re-run targeted tests** - -Run: `pnpm test src/lib/git.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/lib/git.ts src/lib/git.test.ts -git commit -m "feat(sync): add git primitives for branch sync workflows" -``` - -### Task 3: Add sync type system and shared context builders - -**Files:** -- Create: `src/lib/sync/types.ts` -- Create: `src/lib/sync/context.ts` -- Test: `src/lib/sync/context.test.ts` - -**Step 1: Write failing tests for context construction** - -Test that context includes: -- `cwd`, `interactive`, `force`, `all`, `restack`, -- current state, current branch, target trunks/branches. - -**Step 2: Run targeted tests** - -Run: `pnpm test src/lib/sync/context.test.ts` -Expected: FAIL until module exists. - -**Step 3: Implement types + context builder** - -Define: -- `BranchSyncStatus` union, -- `SyncDecision` union, -- `SyncOptions`, `SyncSummary`, `SyncContext`. - -Add `buildSyncContext(cwd, options)`. - -**Step 4: Re-run targeted tests** - -Run: `pnpm test src/lib/sync/context.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/lib/sync/types.ts src/lib/sync/context.ts src/lib/sync/context.test.ts -git commit -m "feat(sync): introduce sync context and status/decision types" -``` - -### Task 4: Implement fetch and trunk sync phases - -**Files:** -- Create: `src/lib/sync/fetch.ts` -- Create: `src/lib/sync/trunk.ts` -- Test: `src/lib/sync/fetch.test.ts` -- Test: `src/lib/sync/trunk.test.ts` - -**Step 1: Write failing tests for fetch/trunk outcomes** - -Cover: -- empty fetch list no-op, -- trunk fast-forward success, -- non-FF trunk with interactive prompt, -- non-FF trunk with `--force`, -- non-interactive no-force skip. - -**Step 2: Run targeted tests** - -Run: `pnpm test src/lib/sync/fetch.test.ts src/lib/sync/trunk.test.ts` -Expected: FAIL. - -**Step 3: Implement phase modules** - -- `runFetchPhase(ctx)` with user progress hooks. -- `runTrunkPhase(ctx)` returning per-trunk result statuses. - -**Step 4: Re-run targeted tests** - -Run: `pnpm test src/lib/sync/fetch.test.ts src/lib/sync/trunk.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/lib/sync/fetch.ts src/lib/sync/trunk.ts src/lib/sync/fetch.test.ts src/lib/sync/trunk.test.ts -git commit -m "feat(sync): implement fetch and trunk sync phases" -``` - -### Task 5: Implement cleanup phase for merged/closed branches - -**Files:** -- Create: `src/lib/sync/cleanup.ts` -- Test: `src/lib/sync/cleanup.test.ts` - -**Step 1: Write failing tests for cleanable vs non-cleanable branches** - -Include: -- cleanable merged branch gets deleted, -- non-cleanable merged branch prints warning and excludes descendants, -- force bypasses prompts, -- non-interactive skip behavior. - -**Step 2: Run targeted tests** - -Run: `pnpm test src/lib/sync/cleanup.test.ts` -Expected: FAIL. - -**Step 3: Implement cleanup phase** - -Add `runCleanupPhase(ctx, prInfos)` to: -- compute cleanable sets, -- execute deletion decisions, -- return branch exclusions. - -**Step 4: Re-run targeted tests** - -Run: `pnpm test src/lib/sync/cleanup.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/lib/sync/cleanup.ts src/lib/sync/cleanup.test.ts -git commit -m "feat(sync): add merged/closed branch cleanup phase" -``` - -### Task 6: Implement branch sync status classifier - -**Files:** -- Create: `src/lib/sync/branch-status.ts` -- Test: `src/lib/sync/branch-status.test.ts` - -**Step 1: Write failing matrix tests for all statuses** - -Cover status families: -- `missing-remote`, `missing-local`, `untracked`, `unsubmitted`, -- `up-to-date`, `updated-outside-dubstack-but-up-to-date`, -- `new-parent-with-remote-change`, `reconcile-needed`, -- `needs-remote-sync-safe`, `needs-remote-sync`. - -**Step 2: Run targeted tests** - -Run: `pnpm test src/lib/sync/branch-status.test.ts` -Expected: FAIL. - -**Step 3: Implement classifier** - -Add pure classifier: -```ts -classifyBranchSyncStatus(input): BranchSyncStatusResult -``` - -**Step 4: Re-run targeted tests** - -Run: `pnpm test src/lib/sync/branch-status.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/lib/sync/branch-status.ts src/lib/sync/branch-status.test.ts -git commit -m "feat(sync): add branch sync status classifier" -``` - -### Task 7: Implement reconciliation decision engine (interactive + force) - -**Files:** -- Create: `src/lib/sync/reconcile.ts` -- Test: `src/lib/sync/reconcile.test.ts` - -**Step 1: Write failing tests for decision tree** - -Cover: -- force paths, -- non-interactive conservative skips, -- interactive choices for keep-local/take-remote/reconcile/reconcile-alt/cancel. - -**Step 2: Run targeted tests** - -Run: `pnpm test src/lib/sync/reconcile.test.ts` -Expected: FAIL. - -**Step 3: Implement decision engine** - -Add: -- `decideForStatus(ctx, branchStatus)` -- prompt adapter with explicit choice mapping. - -**Step 4: Re-run targeted tests** - -Run: `pnpm test src/lib/sync/reconcile.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/lib/sync/reconcile.ts src/lib/sync/reconcile.test.ts -git commit -m "feat(sync): implement interactive reconciliation decision engine" -``` - -### Task 8: Implement sync apply engine for decisions - -**Files:** -- Create: `src/lib/sync/apply.ts` -- Test: `src/lib/sync/apply.test.ts` - -**Step 1: Write failing tests for decision application** - -Cover: -- `take-remote` (reset/recreate local state), -- `keep-local-baseline-update`, -- `reconcile` and `reconcile-alt-parent`, -- metadata updates after success. - -**Step 2: Run targeted tests** - -Run: `pnpm test src/lib/sync/apply.test.ts` -Expected: FAIL. - -**Step 3: Implement apply engine** - -Add functions: -- `applySyncDecision(ctx, decision)` -- `updateBranchSyncMetadata(...)` - -**Step 4: Re-run targeted tests** - -Run: `pnpm test src/lib/sync/apply.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/lib/sync/apply.ts src/lib/sync/apply.test.ts -git commit -m "feat(sync): implement branch sync apply operations" -``` - -### Task 9: Add sync reporting and user-output summaries - -**Files:** -- Create: `src/lib/sync/report.ts` -- Test: `src/lib/sync/report.test.ts` - -**Step 1: Write failing tests for stable text output** - -Test phase headings, warnings, and final summary counts. - -**Step 2: Run targeted tests** - -Run: `pnpm test src/lib/sync/report.test.ts` -Expected: FAIL. - -**Step 3: Implement report module** - -Add helpers: -- `printPhaseStart(...)` -- `printBranchOutcome(...)` -- `printSyncSummary(...)` - -**Step 4: Re-run targeted tests** - -Run: `pnpm test src/lib/sync/report.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/lib/sync/report.ts src/lib/sync/report.test.ts -git commit -m "feat(sync): add sync reporting and summaries" -``` - -### Task 10: Wire `dub sync` command and CLI options - -**Files:** -- Create: `src/commands/sync.ts` -- Modify: `src/index.ts` -- Test: `src/commands/sync.test.ts` - -**Step 1: Write failing command tests** - -Cover: -- default options, -- `--no-restack`, `--force`, `--all`, `--no-interactive`, -- pipeline invocation order, -- error surfacing. - -**Step 2: Run targeted tests** - -Run: `pnpm test src/commands/sync.test.ts` -Expected: FAIL. - -**Step 3: Implement command orchestrator and CLI wiring** - -In `src/index.ts`, add: -```ts -program - .command("sync") - .description("Sync stack branches with remote and reconcile divergence") - .option("--restack", "Restack after sync", true) - .option("-f, --force", "Apply forced overwrite/deletion decisions") - .option("-a, --all", "Sync branches across all tracked trunks") - .option("--no-interactive", "Disable prompts and use deterministic behavior") - .action(runSync); -``` - -**Step 4: Re-run targeted tests** - -Run: `pnpm test src/commands/sync.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/commands/sync.ts src/index.ts src/commands/sync.test.ts -git commit -m "feat(sync): add dub sync command orchestration" -``` - -### Task 11: Integrate optional post-sync restack behavior - -**Files:** -- Modify: `src/commands/sync.ts` -- Modify: `src/lib/sync/types.ts` -- Test: `src/commands/sync.test.ts` - -**Step 1: Write failing tests for restack behavior gates** - -- restack runs by default, -- skipped with `--no-restack`, -- restack warnings surfaced without masking sync success. - -**Step 2: Run targeted tests** - -Run: `pnpm test src/commands/sync.test.ts` -Expected: FAIL. - -**Step 3: Implement restack integration** - -Hook into existing restack command/module, scoped to synchronized trunks/stack roots. - -**Step 4: Re-run targeted tests** - -Run: `pnpm test src/commands/sync.test.ts` -Expected: PASS. - -**Step 5: Commit** - -```bash -git add src/commands/sync.ts src/lib/sync/types.ts src/commands/sync.test.ts -git commit -m "feat(sync): integrate optional post-sync restack phase" -``` - -### Task 12: Update docs for user-facing sync behavior - -**Files:** -- Modify: `README.md` -- Modify: `QUICKSTART.md` - -**Step 1: Add failing doc expectation check (optional lightweight)** - -If doc tests exist, run them first; otherwise skip this step. - -**Step 2: Update docs** - -Document: -- command usage and flags, -- interactive decision points, -- non-interactive behavior, -- force safety caveats, -- common troubleshooting paths. - -**Step 3: Verify docs formatting** - -Run: `pnpm checks` -Expected: PASS. - -**Step 4: Commit** - -```bash -git add README.md QUICKSTART.md -git commit -m "docs(sync): document dub sync behavior and troubleshooting" -``` - -### Task 13: Full verification and stabilization - -**Files:** -- Modify (as needed): any failing files from verification - -**Step 1: Run full test suite** - -Run: `pnpm test` -Expected: PASS. - -**Step 2: Run type checks** - -Run: `pnpm typecheck` -Expected: PASS. - -**Step 3: Run formatting/lint checks** - -Run: `pnpm checks` -Expected: PASS. - -**Step 4: Fix any failures minimally** - -Apply focused fixes only where needed; rerun failing command(s). - -**Step 5: Final commit** - -```bash -git add -A -git commit -m "feat(sync): complete full parity sync command" -``` diff --git a/docs/plans/2026-02-21-dub-ux-command-parity-design.md b/docs/plans/2026-02-21-dub-ux-command-parity-design.md deleted file mode 100644 index 2d08154..0000000 --- a/docs/plans/2026-02-21-dub-ux-command-parity-design.md +++ /dev/null @@ -1,252 +0,0 @@ -# Dub UX Command Parity Design - -**Date:** 2026-02-21 -**Status:** Draft (ready for implementation planning) -**Owner:** DubStack CLI - -## 1. Problem - -DubStack already supports core stacked-PR flows, but non-power-git users still hit avoidable friction when stacks drift or metadata gets out of sync. - -Graphite's strongest UX advantage is not only command breadth, but recovery-oriented ergonomics: -- clear commands for repairing branch metadata, -- safe defaults with guided prompts, -- consistent continuation/abort flows, -- plain-language explanations of what happened and what to run next. - -DubStack should prioritize this same "help me recover" experience. - -## 2. Target User - -Primary user profile: -- comfortable with `git checkout`, `git add`, `git commit` -- not comfortable with manual rebases, parent rewiring, or metadata repair -- expects CLI to suggest safe next steps when things are wrong - -Design implication: -- optimize for clear guided workflows over minimal command count -- keep dangerous actions explicit (`--force`) and default-safe - -## 3. UX Principles - -1. **Safe by default** -- non-interactive mode should skip risky actions and explain why - -2. **Guided repair over raw errors** -- every failure should suggest a next command (`dub continue`, `dub restack --continue`, `dub track ...`) - -3. **Single mental model for interrupted operations** -- same continuation/abort semantics across sync/restack/repair flows - -4. **Graphite-style muscle memory where it improves outcomes** -- match naming/behavior where practical (`track`, `delete`, `parent`, `children`, `continue`, `abort`) - -5. **Plain language first** -- avoid jargon-heavy messages when user intent can be inferred - -## 4. Priority Command Additions and Upgrades - -## P0 (highest UX impact) - -### 4.1 `dub track [branch]` - -Purpose: -- start tracking existing local branches -- fix parent metadata for already tracked branches - -Proposed surface: -```bash -dub track # track current branch (interactive parent prompt) -dub track feat/a # track explicit branch -dub track --parent main # set explicit parent -dub track feat/a --parent feat/base -``` - -Behavior: -- validates branch exists locally -- if already tracked and parent changes, prints a clear "re-parented" summary -- if branch has descendants, prompt whether to restack now - -Why this matters: -- this is the easiest fix path when users create branches outside `dub create` - -### 4.2 `dub untrack [branch]` - -Purpose: -- remove branch from Dub metadata without deleting git branch - -Proposed surface: -```bash -dub untrack -dub untrack feat/a -dub untrack feat/a --downstack -``` - -Behavior: -- warns if descendants exist -- `--downstack` untracks descendants recursively -- never deletes branch content - -### 4.3 `dub delete [branch]` - -Purpose: -- stack-aware branch deletion with safe prompts - -Proposed surface: -```bash -dub delete feat/a -dub delete feat/a --upstack -dub delete feat/a --downstack -dub delete feat/a --force --quiet -``` - -Behavior: -- re-parents children to deleted branch's parent when possible -- if branch has unmerged commits, prompt unless `--force` -- always prints resulting stack shape summary - -Why this matters: -- non-power users should not need manual `git branch -D` + metadata cleanup - -### 4.4 `dub continue` and `dub abort` - -Purpose: -- one obvious recovery pair for paused operations - -Proposed surface: -```bash -dub continue -dub abort -``` - -Behavior: -- `continue`: resumes known paused operation (restack/sync-rebase) -- `abort`: safely aborts paused rebase operation and restores pre-op state where possible -- if no operation is paused, emits actionable message - -Why this matters: -- users currently need to remember low-level git rebase steps - -### 4.5 `dub parent`, `dub children`, `dub trunk` - -Purpose: -- quick orientation commands - -Proposed surface: -```bash -dub parent -dub children -dub trunk -``` - -Behavior: -- simple outputs with optional `--json` in future -- clear errors for untracked context with recommended `dub track` - -Why this matters: -- reduces confusion about where branch sits in stack - -## P1 (major UX upgrades to existing commands) - -### 4.6 `dub submit` UX upgrade - -Current gaps vs Graphite UX: -- less guidance around what will be pushed/updated and why -- fewer beginner-safe confirmation flows - -Upgrade goals: -- richer preview mode (`--dry-run` + branch-by-branch intent) -- clearer failure messages for auth, non-linear stack, restack requirement -- optional `--confirm` style prompt for destructive pushes (future) - -### 4.7 `dub log` modes - -Add lightweight modes inspired by Graphite clarity: -```bash -dub log --stack -dub log --all -dub log --reverse -``` - -Goal: -- easier reading in larger repos/multiple stacks - -### 4.8 `dub create` assisted mode - -Future enhancement: -- allow omitted branch name with guided prompt and suggested branch slug - -## P2 (advanced stack surgery) - -### 4.9 `dub move` / `dub reorder` - -Purpose: -- safely reorder stack branches without manual rebase expertise - -Potential surface: -```bash -dub move --onto -dub reorder -``` - -This is high value but should come after `track/delete/continue` foundation. - -## 5. Recovery UX Patterns (Cross-Command) - -Every repair-capable command should follow this output pattern: - -1. What happened -2. What Dub did -3. What to run next - -Example: -```text -⚠ Branch 'feat/a' is untracked. -Run 'dub track feat/a --parent main' to include it in stack operations. -``` - -Non-interactive skip pattern: -```text -⚠ Skipped '' in non-interactive mode (requires confirmation). -Re-run with --interactive or --force. -``` - -## 6. Metrics and Success Criteria - -Product metrics: -- reduced support issues involving "stack broken" and "unknown parent" -- reduced manual git command usage in recovery flows -- faster time from error to successful submission - -Engineering success criteria: -- all P0 commands implemented with tests -- clear deterministic behavior in `--no-interactive` -- docs updated with recovery playbooks - -## 7. Rollout Strategy - -Phase 1 (P0 core recovery): -- `track`, `untrack`, `delete`, `continue`, `abort`, `parent/children/trunk` - -Phase 2 (P1 UX depth): -- `submit` preview/confirm improvements -- `log` modes -- `create` assisted naming - -Phase 3 (P2 advanced surgery): -- `move` / `reorder` - -## 8. Risks - -1. Metadata corruption during re-parent/delete flows -Mitigation: strict state invariants + migration/repair tests - -2. Overly destructive defaults -Mitigation: prompt-by-default + explicit `--force` - -3. Command surface bloat -Mitigation: prioritize recovery commands and maintain clear docs/help examples - -## 9. Recommendation - -Start with P0 immediately. These are the commands that most directly convert confusion into guided success for non-power-git users and best capture Graphite's UX advantage. diff --git a/docs/plans/2026-02-21-dub-ux-command-parity-implementation.md b/docs/plans/2026-02-21-dub-ux-command-parity-implementation.md deleted file mode 100644 index 1cd6f4d..0000000 --- a/docs/plans/2026-02-21-dub-ux-command-parity-implementation.md +++ /dev/null @@ -1,232 +0,0 @@ -# Dub UX Command Parity Implementation Plan - -> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. - -**Goal:** Improve DubStack ergonomics for non-power-git users by adding Graphite-style repair and orientation commands, plus UX upgrades to existing high-traffic commands. - -**Architecture:** Add new command modules for tracking/recovery/orientation and extend existing state + command orchestration with strict invariants and safe prompts. Implement command behavior as small library-backed operations with deterministic non-interactive behavior and explicit force gates. - -**Tech Stack:** TypeScript (ESM), Commander, Execa/git/gh CLI wrappers, Vitest, Biome. - ---- - -## Scope - -### Phase 1 (P0 recovery foundations) - -- New commands: - - `dub track [branch] [--parent ]` - - `dub untrack [branch] [--downstack]` - - `dub delete [branch] [--upstack|--downstack] [--force] [--quiet]` - - `dub continue` - - `dub abort` - - `dub parent`, `dub children`, `dub trunk` - -### Phase 2 (P1 UX upgrades) - -- `dub submit` preview/confirm messaging improvements -- `dub log` filtering and readability modes - -### Phase 3 (P2 advanced stack surgery) - -- `dub move` and/or `dub reorder` - -## State and Invariant Requirements - -Required invariants after each mutation: -1. every non-root branch must reference an existing parent in the same stack -2. no cycles in parent pointers -3. root branches remain `type: "root"` and `parent: null` -4. deleting or untracking a branch must leave descendants in a valid state (or explicitly include them in operation) - -## Task Breakdown - -### Task 1: Add branch graph utility helpers for ancestry/descendant operations - -**Files:** -- Create: `src/lib/graph.ts` -- Test: `src/lib/graph.test.ts` - -**Steps:** -1. Write failing tests for descendant traversal and cycle detection. -2. Run targeted tests and verify failure. -3. Implement minimal helpers: - - `getDescendants(...)` - - `getAncestors(...)` - - `assertAcyclic(...)` -4. Re-run tests and confirm pass. -5. Commit. - -### Task 2: Implement `track` core library functions - -**Files:** -- Create: `src/lib/track.ts` -- Test: `src/lib/track.test.ts` - -**Steps:** -1. Write failing tests for: - - tracking an untracked branch - - re-parenting an already tracked branch - - invalid parent rejection -2. Run targeted tests and verify failure. -3. Implement minimal functions: - - `trackBranch(...)` - - `validateTrackParent(...)` -4. Re-run tests and confirm pass. -5. Commit. - -### Task 3: Implement `dub track` command wiring - -**Files:** -- Create: `src/commands/track.ts` -- Modify: `src/index.ts` -- Test: `src/commands/track.test.ts` - -**Steps:** -1. Write failing command tests for current branch and explicit branch behavior. -2. Run targeted tests and verify failure. -3. Implement command behavior with: - - optional branch arg - - optional `--parent` - - interactive parent prompt (TTY only) -4. Re-run tests and confirm pass. -5. Commit. - -### Task 4: Implement `untrack` core and command - -**Files:** -- Create: `src/lib/untrack.ts` -- Create: `src/commands/untrack.ts` -- Modify: `src/index.ts` -- Test: `src/lib/untrack.test.ts` -- Test: `src/commands/untrack.test.ts` - -**Steps:** -1. Write failing tests for untracking leaf and recursive downstack behavior. -2. Run targeted tests and verify failure. -3. Implement minimal behavior with safe prompts unless `--downstack` or non-interactive deterministic mode. -4. Re-run tests and confirm pass. -5. Commit. - -### Task 5: Implement stack-aware `delete` - -**Files:** -- Create: `src/lib/delete.ts` -- Create: `src/commands/delete.ts` -- Modify: `src/index.ts` -- Test: `src/lib/delete.test.ts` -- Test: `src/commands/delete.test.ts` - -**Steps:** -1. Write failing tests for: - - single branch delete - - `--upstack` and `--downstack` expansion - - forced delete behavior - - state re-parenting correctness -2. Run targeted tests and verify failure. -3. Implement command with dry prompt path and deterministic non-interactive rules. -4. Re-run tests and confirm pass. -5. Commit. - -### Task 6: Implement operation continuation and abort framework - -**Files:** -- Create: `src/lib/operation-state.ts` -- Create: `src/commands/continue.ts` -- Create: `src/commands/abort.ts` -- Modify: `src/index.ts` -- Test: `src/lib/operation-state.test.ts` -- Test: `src/commands/continue.test.ts` -- Test: `src/commands/abort.test.ts` - -**Steps:** -1. Write failing tests for missing operation state, active rebase continuation, and abort flows. -2. Run targeted tests and verify failure. -3. Implement minimal operation-state abstraction and command handlers. -4. Re-run tests and confirm pass. -5. Commit. - -### Task 7: Implement orientation commands (`parent`, `children`, `trunk`) - -**Files:** -- Create: `src/commands/parent.ts` -- Create: `src/commands/children.ts` -- Create: `src/commands/trunk.ts` -- Modify: `src/index.ts` -- Test: `src/commands/parent.test.ts` -- Test: `src/commands/children.test.ts` -- Test: `src/commands/trunk.test.ts` - -**Steps:** -1. Write failing tests for tracked and untracked branch contexts. -2. Run targeted tests and verify failure. -3. Implement concise command output + clear remediation for untracked contexts. -4. Re-run tests and confirm pass. -5. Commit. - -### Task 8: Upgrade submit UX output and preflight guidance - -**Files:** -- Modify: `src/commands/submit.ts` -- Modify: `src/commands/submit.test.ts` - -**Steps:** -1. Add failing tests for improved output summaries and actionable failure messages. -2. Implement minimal output/report layer upgrades. -3. Re-run tests and confirm pass. -4. Commit. - -### Task 9: Add `log` mode flags (`--stack`, `--all`, `--reverse`) - -**Files:** -- Modify: `src/commands/log.ts` -- Modify: `src/index.ts` -- Test: `src/commands/log.test.ts` - -**Steps:** -1. Add failing tests for each mode. -2. Implement minimal filtering + ordering behavior. -3. Re-run tests and confirm pass. -4. Commit. - -### Task 10: Documentation and skill updates for new commands - -**Files:** -- Modify: `README.md` -- Modify: `QUICKSTART.md` -- Modify: `skills/dubstack/SKILL.md` -- Modify: `skills/dubstack/references/commands.md` -- Modify: `skills/dubstack/references/workflows.md` - -**Steps:** -1. Update docs with new command syntax and recovery playbooks. -2. Validate command examples against CLI wiring. -3. Commit. - -## Verification Gates - -Run after each major phase and before merge: - -```bash -pnpm test -pnpm typecheck -pnpm checks -``` - -## Acceptance Criteria - -Phase 1 complete when: -- all P0 commands exist, tested, and documented -- non-interactive behavior is deterministic and safe -- destructive actions require explicit force or confirmation - -Phase 2 complete when: -- submit and log UX upgrades are shipped with tests - -Phase 3 complete when: -- move/reorder strategy is implemented with conflict-safe behavior and guidance - -## Deferred Decisions - -- exact `move` syntax (`--onto` vs interactive editor-first) -- whether to add `doctor` command in same track or separate reliability initiative diff --git a/docs/plans/2026-02-21-merge-workflow-guardrails.md b/docs/plans/2026-02-21-merge-workflow-guardrails.md deleted file mode 100644 index a4214a5..0000000 --- a/docs/plans/2026-02-21-merge-workflow-guardrails.md +++ /dev/null @@ -1,130 +0,0 @@ -# Merge Workflow Guardrails Implementation Plan - -> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. - -**Goal:** Add safe, low-error merge workflows for stacked PR users, including merge-order enforcement, guided merge automation, and post-merge recovery. - -**Architecture:** Introduce three complementary layers: (1) CI merge-order gate based on DubStack PR metadata, (2) an in-CLI guided merge command (`merge-next`/`land`) that merges only the next safe PR and performs maintenance, and (3) a standalone post-merge repair command (`post-merge`) for manual merge recovery. Reuse existing state/sync/submit infrastructure and `gh` integration. - -**Tech Stack:** TypeScript (ESM), commander, vitest, GitHub CLI (`gh`), GitHub Actions. - ---- - -### Task 1: Merge-order metadata and guard command - -**Files:** -- Modify: `src/lib/pr-body.ts` -- Modify: `src/lib/pr-body.test.ts` -- Modify: `src/lib/github.ts` -- Modify: `src/lib/github.test.ts` -- Create: `src/commands/merge-check.ts` -- Create: `src/commands/merge-check.test.ts` -- Modify: `src/index.ts` - -**Step 1: Write failing tests** -- Add metadata parsing tests for DubStack PR metadata extraction. -- Add merge-check command tests for: - - pass on non-stacked/no-metadata PR - - pass when `prev_pr` is merged - - fail when `prev_pr` is not merged - -**Step 2: Run targeted tests and verify failures** -- Run: - - `pnpm test src/lib/pr-body.test.ts` - - `pnpm test src/commands/merge-check.test.ts` - -**Step 3: Implement minimal code** -- Add `parseDubstackMetadata(...)` helper. -- Add GitHub helpers for PR lookup/state by PR number. -- Implement `merge-check` command logic and CLI wiring. - -**Step 4: Re-run tests** -- Run: - - `pnpm test src/lib/pr-body.test.ts` - - `pnpm test src/commands/merge-check.test.ts` - -### Task 2: Post-merge maintenance command - -**Files:** -- Create: `src/commands/post-merge.ts` -- Create: `src/commands/post-merge.test.ts` -- Modify: `src/lib/github.ts` -- Modify: `src/lib/github.test.ts` -- Modify: `src/index.ts` - -**Step 1: Write failing tests** -- `post-merge` should: - - remove contiguous bottom merged branches from stack metadata - - re-parent remaining branches - - retarget open PR bases to new parents - - support dry-run preview - -**Step 2: Run targeted tests and verify failures** -- Run: `pnpm test src/commands/post-merge.test.ts` - -**Step 3: Implement minimal code** -- Add GitHub base-retarget helper. -- Implement post-merge cleanup + retarget logic. -- Add CLI command `dub post-merge`. - -**Step 4: Re-run tests** -- Run: `pnpm test src/commands/post-merge.test.ts` - -### Task 3: Guided safe merge command (`merge-next`/`land`) - -**Files:** -- Create: `src/commands/merge-next.ts` -- Create: `src/commands/merge-next.test.ts` -- Modify: `src/lib/github.ts` -- Modify: `src/lib/github.test.ts` -- Modify: `src/index.ts` - -**Step 1: Write failing tests** -- `merge-next` should: - - select the next mergeable PR (lowest branch in current path) - - merge it via GitHub - - invoke post-merge maintenance - - support dry-run - -**Step 2: Run targeted tests and verify failures** -- Run: `pnpm test src/commands/merge-next.test.ts` - -**Step 3: Implement minimal code** -- Add GitHub merge helper. -- Implement command `dub merge-next` with alias `dub land`. - -**Step 4: Re-run tests** -- Run: `pnpm test src/commands/merge-next.test.ts` - -### Task 4: CI merge-order workflow guard - -**Files:** -- Create: `.github/workflows/merge-order.yml` -- Modify: `README.md` -- Modify: `QUICKSTART.md` -- Modify: `.agents/skills/dubstack/SKILL.md` -- Modify: `.agents/skills/dubstack/references/commands.md` -- Modify: `.agents/skills/dubstack/references/workflows.md` - -**Step 1: Implement workflow** -- Add a PR workflow that runs `dub merge-check --pr ` with `GH_TOKEN`. - -**Step 2: Document how to use** -- Add merge workflow section: - - `dub merge-next` - - `dub post-merge` - - merge-order guard expectations - -### Task 5: Final verification - -**Files:** -- No new files expected - -**Step 1: Run full required validation** -- Run: - - `pnpm test` - - `pnpm typecheck` - - `pnpm checks` - -**Step 2: Summarize behavior and migration notes** -- Include clear operator guidance for users migrating to safer merge workflows. diff --git a/package.json b/package.json index 243276b..52d854e 100644 --- a/package.json +++ b/package.json @@ -1,60 +1,22 @@ { - "name": "dubstack", - "version": "1.5.0", - "description": "CLI tool for managing stacked diffs (dependent git branches)", - "type": "module", - "bin": { - "dub": "./dist/index.js" - }, - "files": [ - "dist" - ], - "publishConfig": { - "access": "public" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/wiseiodev/dubstack.git" + "name": "dubstack-workspace", + "private": true, + "packageManager": "pnpm@10.29.1", + "engines": { + "node": ">=22" }, "scripts": { - "build": "tsup", - "prepack": "pnpm build", - "dev": "tsx src/index.ts", - "test": "vitest run", - "test:coverage": "vitest run --coverage", - "typecheck": "tsc --noEmit", + "build": "turbo run build", + "test": "turbo run test", + "test:coverage": "turbo run test:coverage", + "typecheck": "turbo run typecheck", "checks": "biome check .", "checks:fix": "biome check --write .", - "checks:fix:unsafe": "biome check --write --unsafe ." - }, - "engines": { - "node": ">=22" - }, - "packageManager": "pnpm@10.29.1", - "keywords": [ - "git", - "stacked-diffs", - "cli", - "branches" - ], - "license": "MIT", - "dependencies": { - "@ai-sdk/google": "^3.0.30", - "@inquirer/search": "^4.1.3", - "ai": "^6.0.97", - "bash-tool": "^1.3.15", - "chalk": "^5.6.2", - "commander": "^14.0.3", - "execa": "^9.6.1", - "just-bash": "^2.10.2" + "checks:fix:unsafe": "biome check --write --unsafe .", + "dev": "turbo run dev" }, "devDependencies": { "@biomejs/biome": "^2.4.2", - "@types/node": "^25.2.3", - "@vitest/coverage-v8": "^4.0.18", - "tsup": "^8.5.1", - "tsx": "^4.21.0", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "turbo": "^2.5.0" } } diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 0000000..dc17b66 --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,55 @@ +{ + "name": "dubstack", + "version": "1.5.0", + "description": "CLI tool for managing stacked diffs (dependent git branches)", + "type": "module", + "bin": { + "dub": "./dist/index.js" + }, + "files": [ + "dist" + ], + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/wiseiodev/dubstack.git" + }, + "scripts": { + "build": "tsup", + "prepack": "pnpm build", + "dev": "tsup --watch", + "test": "vitest run", + "test:coverage": "vitest run --coverage", + "typecheck": "tsc --noEmit" + }, + "engines": { + "node": ">=22" + }, + "keywords": [ + "git", + "stacked-diffs", + "cli", + "branches" + ], + "license": "MIT", + "dependencies": { + "@ai-sdk/google": "^3.0.30", + "@inquirer/search": "^4.1.3", + "ai": "^6.0.97", + "bash-tool": "^1.3.15", + "chalk": "^5.6.2", + "commander": "^14.0.3", + "execa": "^9.6.1", + "just-bash": "^2.10.2" + }, + "devDependencies": { + "@types/node": "^25.2.3", + "@vitest/coverage-v8": "^4.0.18", + "tsup": "^8.5.1", + "tsx": "^4.21.0", + "typescript": "^5.9.3", + "vitest": "^4.0.18" + } +} diff --git a/src/commands/abort.test.ts b/packages/cli/src/commands/abort.test.ts similarity index 100% rename from src/commands/abort.test.ts rename to packages/cli/src/commands/abort.test.ts diff --git a/src/commands/abort.ts b/packages/cli/src/commands/abort.ts similarity index 100% rename from src/commands/abort.ts rename to packages/cli/src/commands/abort.ts diff --git a/src/commands/ai-env.test.ts b/packages/cli/src/commands/ai-env.test.ts similarity index 100% rename from src/commands/ai-env.test.ts rename to packages/cli/src/commands/ai-env.test.ts diff --git a/src/commands/ai-env.ts b/packages/cli/src/commands/ai-env.ts similarity index 100% rename from src/commands/ai-env.ts rename to packages/cli/src/commands/ai-env.ts diff --git a/src/commands/ai-resolve.test.ts b/packages/cli/src/commands/ai-resolve.test.ts similarity index 100% rename from src/commands/ai-resolve.test.ts rename to packages/cli/src/commands/ai-resolve.test.ts diff --git a/src/commands/ai-resolve.ts b/packages/cli/src/commands/ai-resolve.ts similarity index 100% rename from src/commands/ai-resolve.ts rename to packages/cli/src/commands/ai-resolve.ts diff --git a/src/commands/ai.test.ts b/packages/cli/src/commands/ai.test.ts similarity index 100% rename from src/commands/ai.test.ts rename to packages/cli/src/commands/ai.test.ts diff --git a/src/commands/ai.ts b/packages/cli/src/commands/ai.ts similarity index 100% rename from src/commands/ai.ts rename to packages/cli/src/commands/ai.ts diff --git a/src/commands/branch.test.ts b/packages/cli/src/commands/branch.test.ts similarity index 100% rename from src/commands/branch.test.ts rename to packages/cli/src/commands/branch.test.ts diff --git a/src/commands/branch.ts b/packages/cli/src/commands/branch.ts similarity index 100% rename from src/commands/branch.ts rename to packages/cli/src/commands/branch.ts diff --git a/src/commands/checkout.test.ts b/packages/cli/src/commands/checkout.test.ts similarity index 100% rename from src/commands/checkout.test.ts rename to packages/cli/src/commands/checkout.test.ts diff --git a/src/commands/checkout.ts b/packages/cli/src/commands/checkout.ts similarity index 100% rename from src/commands/checkout.ts rename to packages/cli/src/commands/checkout.ts diff --git a/src/commands/children.test.ts b/packages/cli/src/commands/children.test.ts similarity index 100% rename from src/commands/children.test.ts rename to packages/cli/src/commands/children.test.ts diff --git a/src/commands/children.ts b/packages/cli/src/commands/children.ts similarity index 100% rename from src/commands/children.ts rename to packages/cli/src/commands/children.ts diff --git a/src/commands/config.test.ts b/packages/cli/src/commands/config.test.ts similarity index 100% rename from src/commands/config.test.ts rename to packages/cli/src/commands/config.test.ts diff --git a/src/commands/config.ts b/packages/cli/src/commands/config.ts similarity index 100% rename from src/commands/config.ts rename to packages/cli/src/commands/config.ts diff --git a/src/commands/continue.test.ts b/packages/cli/src/commands/continue.test.ts similarity index 100% rename from src/commands/continue.test.ts rename to packages/cli/src/commands/continue.test.ts diff --git a/src/commands/continue.ts b/packages/cli/src/commands/continue.ts similarity index 100% rename from src/commands/continue.ts rename to packages/cli/src/commands/continue.ts diff --git a/src/commands/create.test.ts b/packages/cli/src/commands/create.test.ts similarity index 100% rename from src/commands/create.test.ts rename to packages/cli/src/commands/create.test.ts diff --git a/src/commands/create.ts b/packages/cli/src/commands/create.ts similarity index 100% rename from src/commands/create.ts rename to packages/cli/src/commands/create.ts diff --git a/src/commands/delete.test.ts b/packages/cli/src/commands/delete.test.ts similarity index 100% rename from src/commands/delete.test.ts rename to packages/cli/src/commands/delete.test.ts diff --git a/src/commands/delete.ts b/packages/cli/src/commands/delete.ts similarity index 100% rename from src/commands/delete.ts rename to packages/cli/src/commands/delete.ts diff --git a/src/commands/doctor.test.ts b/packages/cli/src/commands/doctor.test.ts similarity index 100% rename from src/commands/doctor.test.ts rename to packages/cli/src/commands/doctor.test.ts diff --git a/src/commands/doctor.ts b/packages/cli/src/commands/doctor.ts similarity index 100% rename from src/commands/doctor.ts rename to packages/cli/src/commands/doctor.ts diff --git a/src/commands/history.test.ts b/packages/cli/src/commands/history.test.ts similarity index 100% rename from src/commands/history.test.ts rename to packages/cli/src/commands/history.test.ts diff --git a/src/commands/history.ts b/packages/cli/src/commands/history.ts similarity index 100% rename from src/commands/history.ts rename to packages/cli/src/commands/history.ts diff --git a/src/commands/init.test.ts b/packages/cli/src/commands/init.test.ts similarity index 100% rename from src/commands/init.test.ts rename to packages/cli/src/commands/init.test.ts diff --git a/src/commands/init.ts b/packages/cli/src/commands/init.ts similarity index 100% rename from src/commands/init.ts rename to packages/cli/src/commands/init.ts diff --git a/src/commands/log.test.ts b/packages/cli/src/commands/log.test.ts similarity index 100% rename from src/commands/log.test.ts rename to packages/cli/src/commands/log.test.ts diff --git a/src/commands/log.ts b/packages/cli/src/commands/log.ts similarity index 100% rename from src/commands/log.ts rename to packages/cli/src/commands/log.ts diff --git a/src/commands/merge-check.test.ts b/packages/cli/src/commands/merge-check.test.ts similarity index 100% rename from src/commands/merge-check.test.ts rename to packages/cli/src/commands/merge-check.test.ts diff --git a/src/commands/merge-check.ts b/packages/cli/src/commands/merge-check.ts similarity index 100% rename from src/commands/merge-check.ts rename to packages/cli/src/commands/merge-check.ts diff --git a/src/commands/merge-next.test.ts b/packages/cli/src/commands/merge-next.test.ts similarity index 100% rename from src/commands/merge-next.test.ts rename to packages/cli/src/commands/merge-next.test.ts diff --git a/src/commands/merge-next.ts b/packages/cli/src/commands/merge-next.ts similarity index 100% rename from src/commands/merge-next.ts rename to packages/cli/src/commands/merge-next.ts diff --git a/src/commands/modify.test.ts b/packages/cli/src/commands/modify.test.ts similarity index 100% rename from src/commands/modify.test.ts rename to packages/cli/src/commands/modify.test.ts diff --git a/src/commands/modify.ts b/packages/cli/src/commands/modify.ts similarity index 100% rename from src/commands/modify.ts rename to packages/cli/src/commands/modify.ts diff --git a/src/commands/navigate.test.ts b/packages/cli/src/commands/navigate.test.ts similarity index 100% rename from src/commands/navigate.test.ts rename to packages/cli/src/commands/navigate.test.ts diff --git a/src/commands/navigate.ts b/packages/cli/src/commands/navigate.ts similarity index 100% rename from src/commands/navigate.ts rename to packages/cli/src/commands/navigate.ts diff --git a/src/commands/parent.test.ts b/packages/cli/src/commands/parent.test.ts similarity index 100% rename from src/commands/parent.test.ts rename to packages/cli/src/commands/parent.test.ts diff --git a/src/commands/parent.ts b/packages/cli/src/commands/parent.ts similarity index 100% rename from src/commands/parent.ts rename to packages/cli/src/commands/parent.ts diff --git a/src/commands/post-merge.test.ts b/packages/cli/src/commands/post-merge.test.ts similarity index 100% rename from src/commands/post-merge.test.ts rename to packages/cli/src/commands/post-merge.test.ts diff --git a/src/commands/post-merge.ts b/packages/cli/src/commands/post-merge.ts similarity index 100% rename from src/commands/post-merge.ts rename to packages/cli/src/commands/post-merge.ts diff --git a/src/commands/pr.test.ts b/packages/cli/src/commands/pr.test.ts similarity index 100% rename from src/commands/pr.test.ts rename to packages/cli/src/commands/pr.test.ts diff --git a/src/commands/pr.ts b/packages/cli/src/commands/pr.ts similarity index 100% rename from src/commands/pr.ts rename to packages/cli/src/commands/pr.ts diff --git a/src/commands/prune.test.ts b/packages/cli/src/commands/prune.test.ts similarity index 100% rename from src/commands/prune.test.ts rename to packages/cli/src/commands/prune.test.ts diff --git a/src/commands/prune.ts b/packages/cli/src/commands/prune.ts similarity index 100% rename from src/commands/prune.ts rename to packages/cli/src/commands/prune.ts diff --git a/src/commands/ready.test.ts b/packages/cli/src/commands/ready.test.ts similarity index 100% rename from src/commands/ready.test.ts rename to packages/cli/src/commands/ready.test.ts diff --git a/src/commands/ready.ts b/packages/cli/src/commands/ready.ts similarity index 100% rename from src/commands/ready.ts rename to packages/cli/src/commands/ready.ts diff --git a/src/commands/restack.test.ts b/packages/cli/src/commands/restack.test.ts similarity index 100% rename from src/commands/restack.test.ts rename to packages/cli/src/commands/restack.test.ts diff --git a/src/commands/restack.ts b/packages/cli/src/commands/restack.ts similarity index 100% rename from src/commands/restack.ts rename to packages/cli/src/commands/restack.ts diff --git a/src/commands/skills.ts b/packages/cli/src/commands/skills.ts similarity index 100% rename from src/commands/skills.ts rename to packages/cli/src/commands/skills.ts diff --git a/src/commands/submit.test.ts b/packages/cli/src/commands/submit.test.ts similarity index 100% rename from src/commands/submit.test.ts rename to packages/cli/src/commands/submit.test.ts diff --git a/src/commands/submit.ts b/packages/cli/src/commands/submit.ts similarity index 100% rename from src/commands/submit.ts rename to packages/cli/src/commands/submit.ts diff --git a/src/commands/sync.test.ts b/packages/cli/src/commands/sync.test.ts similarity index 100% rename from src/commands/sync.test.ts rename to packages/cli/src/commands/sync.test.ts diff --git a/src/commands/sync.ts b/packages/cli/src/commands/sync.ts similarity index 100% rename from src/commands/sync.ts rename to packages/cli/src/commands/sync.ts diff --git a/src/commands/track.test.ts b/packages/cli/src/commands/track.test.ts similarity index 100% rename from src/commands/track.test.ts rename to packages/cli/src/commands/track.test.ts diff --git a/src/commands/track.ts b/packages/cli/src/commands/track.ts similarity index 100% rename from src/commands/track.ts rename to packages/cli/src/commands/track.ts diff --git a/src/commands/trunk.test.ts b/packages/cli/src/commands/trunk.test.ts similarity index 100% rename from src/commands/trunk.test.ts rename to packages/cli/src/commands/trunk.test.ts diff --git a/src/commands/trunk.ts b/packages/cli/src/commands/trunk.ts similarity index 100% rename from src/commands/trunk.ts rename to packages/cli/src/commands/trunk.ts diff --git a/src/commands/undo.test.ts b/packages/cli/src/commands/undo.test.ts similarity index 100% rename from src/commands/undo.test.ts rename to packages/cli/src/commands/undo.test.ts diff --git a/src/commands/undo.ts b/packages/cli/src/commands/undo.ts similarity index 100% rename from src/commands/undo.ts rename to packages/cli/src/commands/undo.ts diff --git a/src/commands/untrack.test.ts b/packages/cli/src/commands/untrack.test.ts similarity index 100% rename from src/commands/untrack.test.ts rename to packages/cli/src/commands/untrack.test.ts diff --git a/src/commands/untrack.ts b/packages/cli/src/commands/untrack.ts similarity index 100% rename from src/commands/untrack.ts rename to packages/cli/src/commands/untrack.ts diff --git a/src/index.ts b/packages/cli/src/index.ts similarity index 100% rename from src/index.ts rename to packages/cli/src/index.ts diff --git a/src/lib/ai-bash-sandbox.test.ts b/packages/cli/src/lib/ai-bash-sandbox.test.ts similarity index 100% rename from src/lib/ai-bash-sandbox.test.ts rename to packages/cli/src/lib/ai-bash-sandbox.test.ts diff --git a/src/lib/ai-bash-sandbox.ts b/packages/cli/src/lib/ai-bash-sandbox.ts similarity index 100% rename from src/lib/ai-bash-sandbox.ts rename to packages/cli/src/lib/ai-bash-sandbox.ts diff --git a/src/lib/ai-context.test.ts b/packages/cli/src/lib/ai-context.test.ts similarity index 100% rename from src/lib/ai-context.test.ts rename to packages/cli/src/lib/ai-context.test.ts diff --git a/src/lib/ai-context.ts b/packages/cli/src/lib/ai-context.ts similarity index 100% rename from src/lib/ai-context.ts rename to packages/cli/src/lib/ai-context.ts diff --git a/src/lib/ai-shortcut.test.ts b/packages/cli/src/lib/ai-shortcut.test.ts similarity index 100% rename from src/lib/ai-shortcut.test.ts rename to packages/cli/src/lib/ai-shortcut.test.ts diff --git a/src/lib/ai-shortcut.ts b/packages/cli/src/lib/ai-shortcut.ts similarity index 100% rename from src/lib/ai-shortcut.ts rename to packages/cli/src/lib/ai-shortcut.ts diff --git a/src/lib/config.test.ts b/packages/cli/src/lib/config.test.ts similarity index 100% rename from src/lib/config.test.ts rename to packages/cli/src/lib/config.test.ts diff --git a/src/lib/config.ts b/packages/cli/src/lib/config.ts similarity index 100% rename from src/lib/config.ts rename to packages/cli/src/lib/config.ts diff --git a/src/lib/conflict-context.test.ts b/packages/cli/src/lib/conflict-context.test.ts similarity index 100% rename from src/lib/conflict-context.test.ts rename to packages/cli/src/lib/conflict-context.test.ts diff --git a/src/lib/conflict-context.ts b/packages/cli/src/lib/conflict-context.ts similarity index 100% rename from src/lib/conflict-context.ts rename to packages/cli/src/lib/conflict-context.ts diff --git a/src/lib/conflict-ui.test.ts b/packages/cli/src/lib/conflict-ui.test.ts similarity index 100% rename from src/lib/conflict-ui.test.ts rename to packages/cli/src/lib/conflict-ui.test.ts diff --git a/src/lib/conflict-ui.ts b/packages/cli/src/lib/conflict-ui.ts similarity index 100% rename from src/lib/conflict-ui.ts rename to packages/cli/src/lib/conflict-ui.ts diff --git a/src/lib/delete.test.ts b/packages/cli/src/lib/delete.test.ts similarity index 100% rename from src/lib/delete.test.ts rename to packages/cli/src/lib/delete.test.ts diff --git a/src/lib/delete.ts b/packages/cli/src/lib/delete.ts similarity index 100% rename from src/lib/delete.ts rename to packages/cli/src/lib/delete.ts diff --git a/src/lib/errors.ts b/packages/cli/src/lib/errors.ts similarity index 100% rename from src/lib/errors.ts rename to packages/cli/src/lib/errors.ts diff --git a/src/lib/git.test.ts b/packages/cli/src/lib/git.test.ts similarity index 100% rename from src/lib/git.test.ts rename to packages/cli/src/lib/git.test.ts diff --git a/src/lib/git.ts b/packages/cli/src/lib/git.ts similarity index 100% rename from src/lib/git.ts rename to packages/cli/src/lib/git.ts diff --git a/src/lib/github.test.ts b/packages/cli/src/lib/github.test.ts similarity index 100% rename from src/lib/github.test.ts rename to packages/cli/src/lib/github.test.ts diff --git a/src/lib/github.ts b/packages/cli/src/lib/github.ts similarity index 100% rename from src/lib/github.ts rename to packages/cli/src/lib/github.ts diff --git a/src/lib/graph.test.ts b/packages/cli/src/lib/graph.test.ts similarity index 100% rename from src/lib/graph.test.ts rename to packages/cli/src/lib/graph.test.ts diff --git a/src/lib/graph.ts b/packages/cli/src/lib/graph.ts similarity index 100% rename from src/lib/graph.ts rename to packages/cli/src/lib/graph.ts diff --git a/src/lib/history.test.ts b/packages/cli/src/lib/history.test.ts similarity index 100% rename from src/lib/history.test.ts rename to packages/cli/src/lib/history.test.ts diff --git a/src/lib/history.ts b/packages/cli/src/lib/history.ts similarity index 100% rename from src/lib/history.ts rename to packages/cli/src/lib/history.ts diff --git a/src/lib/invariants.ts b/packages/cli/src/lib/invariants.ts similarity index 100% rename from src/lib/invariants.ts rename to packages/cli/src/lib/invariants.ts diff --git a/src/lib/operation-state.test.ts b/packages/cli/src/lib/operation-state.test.ts similarity index 100% rename from src/lib/operation-state.test.ts rename to packages/cli/src/lib/operation-state.test.ts diff --git a/src/lib/operation-state.ts b/packages/cli/src/lib/operation-state.ts similarity index 100% rename from src/lib/operation-state.ts rename to packages/cli/src/lib/operation-state.ts diff --git a/src/lib/pr-body.test.ts b/packages/cli/src/lib/pr-body.test.ts similarity index 100% rename from src/lib/pr-body.test.ts rename to packages/cli/src/lib/pr-body.test.ts diff --git a/src/lib/pr-body.ts b/packages/cli/src/lib/pr-body.ts similarity index 100% rename from src/lib/pr-body.ts rename to packages/cli/src/lib/pr-body.ts diff --git a/src/lib/shell-history.test.ts b/packages/cli/src/lib/shell-history.test.ts similarity index 100% rename from src/lib/shell-history.test.ts rename to packages/cli/src/lib/shell-history.test.ts diff --git a/src/lib/shell-history.ts b/packages/cli/src/lib/shell-history.ts similarity index 100% rename from src/lib/shell-history.ts rename to packages/cli/src/lib/shell-history.ts diff --git a/src/lib/skills.ts b/packages/cli/src/lib/skills.ts similarity index 100% rename from src/lib/skills.ts rename to packages/cli/src/lib/skills.ts diff --git a/src/lib/state.test.ts b/packages/cli/src/lib/state.test.ts similarity index 100% rename from src/lib/state.test.ts rename to packages/cli/src/lib/state.test.ts diff --git a/src/lib/state.ts b/packages/cli/src/lib/state.ts similarity index 100% rename from src/lib/state.ts rename to packages/cli/src/lib/state.ts diff --git a/src/lib/sync/branch-status.test.ts b/packages/cli/src/lib/sync/branch-status.test.ts similarity index 100% rename from src/lib/sync/branch-status.test.ts rename to packages/cli/src/lib/sync/branch-status.test.ts diff --git a/src/lib/sync/branch-status.ts b/packages/cli/src/lib/sync/branch-status.ts similarity index 100% rename from src/lib/sync/branch-status.ts rename to packages/cli/src/lib/sync/branch-status.ts diff --git a/src/lib/sync/cleanup.test.ts b/packages/cli/src/lib/sync/cleanup.test.ts similarity index 100% rename from src/lib/sync/cleanup.test.ts rename to packages/cli/src/lib/sync/cleanup.test.ts diff --git a/src/lib/sync/cleanup.ts b/packages/cli/src/lib/sync/cleanup.ts similarity index 100% rename from src/lib/sync/cleanup.ts rename to packages/cli/src/lib/sync/cleanup.ts diff --git a/src/lib/sync/reconcile.test.ts b/packages/cli/src/lib/sync/reconcile.test.ts similarity index 100% rename from src/lib/sync/reconcile.test.ts rename to packages/cli/src/lib/sync/reconcile.test.ts diff --git a/src/lib/sync/reconcile.ts b/packages/cli/src/lib/sync/reconcile.ts similarity index 100% rename from src/lib/sync/reconcile.ts rename to packages/cli/src/lib/sync/reconcile.ts diff --git a/src/lib/sync/report.ts b/packages/cli/src/lib/sync/report.ts similarity index 100% rename from src/lib/sync/report.ts rename to packages/cli/src/lib/sync/report.ts diff --git a/src/lib/sync/types.ts b/packages/cli/src/lib/sync/types.ts similarity index 100% rename from src/lib/sync/types.ts rename to packages/cli/src/lib/sync/types.ts diff --git a/src/lib/track.test.ts b/packages/cli/src/lib/track.test.ts similarity index 100% rename from src/lib/track.test.ts rename to packages/cli/src/lib/track.test.ts diff --git a/src/lib/track.ts b/packages/cli/src/lib/track.ts similarity index 100% rename from src/lib/track.ts rename to packages/cli/src/lib/track.ts diff --git a/src/lib/undo-log.test.ts b/packages/cli/src/lib/undo-log.test.ts similarity index 100% rename from src/lib/undo-log.test.ts rename to packages/cli/src/lib/undo-log.test.ts diff --git a/src/lib/undo-log.ts b/packages/cli/src/lib/undo-log.ts similarity index 100% rename from src/lib/undo-log.ts rename to packages/cli/src/lib/undo-log.ts diff --git a/src/lib/untrack.test.ts b/packages/cli/src/lib/untrack.test.ts similarity index 100% rename from src/lib/untrack.test.ts rename to packages/cli/src/lib/untrack.test.ts diff --git a/src/lib/untrack.ts b/packages/cli/src/lib/untrack.ts similarity index 100% rename from src/lib/untrack.ts rename to packages/cli/src/lib/untrack.ts diff --git a/test/commands/skills.test.ts b/packages/cli/test/commands/skills.test.ts similarity index 100% rename from test/commands/skills.test.ts rename to packages/cli/test/commands/skills.test.ts diff --git a/test/helpers.ts b/packages/cli/test/helpers.ts similarity index 100% rename from test/helpers.ts rename to packages/cli/test/helpers.ts diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 0000000..bff12e0 --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "." + }, + "include": ["src/**/*", "test/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/tsup.config.ts b/packages/cli/tsup.config.ts similarity index 100% rename from tsup.config.ts rename to packages/cli/tsup.config.ts diff --git a/vitest.config.ts b/packages/cli/vitest.config.ts similarity index 100% rename from vitest.config.ts rename to packages/cli/vitest.config.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 091e340..b69af1f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,73 @@ settings: importers: .: + devDependencies: + '@biomejs/biome': + specifier: ^2.4.2 + version: 2.4.2 + turbo: + specifier: ^2.5.0 + version: 2.8.14 + + apps/docs: + dependencies: + '@takumi-rs/image-response': + specifier: ^0.70.4 + version: 0.70.4 + fumadocs-core: + specifier: 16.6.10 + version: 16.6.10(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-mdx: + specifier: 14.2.9 + version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.10(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(vite@7.3.1(@types/node@25.3.5)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + fumadocs-ui: + specifier: 16.6.10 + version: 16.6.10(@takumi-rs/image-response@0.70.4)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.10(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) + lucide-react: + specifier: ^0.577.0 + version: 0.577.0(react@19.2.4) + next: + specifier: 16.1.6 + version: 16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: + specifier: ^19.2.4 + version: 19.2.4 + react-dom: + specifier: ^19.2.4 + version: 19.2.4(react@19.2.4) + tailwind-merge: + specifier: ^3.5.0 + version: 3.5.0 + devDependencies: + '@biomejs/biome': + specifier: ^2.4.6 + version: 2.4.6 + '@tailwindcss/postcss': + specifier: ^4.2.1 + version: 4.2.1 + '@types/mdx': + specifier: ^2.0.13 + version: 2.0.13 + '@types/node': + specifier: ^25.3.3 + version: 25.3.5 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + postcss: + specifier: ^8.5.8 + version: 8.5.8 + tailwindcss: + specifier: ^4.2.1 + version: 4.2.1 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + + packages/cli: dependencies: '@ai-sdk/google': specifier: ^3.0.30 @@ -33,18 +100,15 @@ importers: specifier: ^2.10.2 version: 2.10.2 devDependencies: - '@biomejs/biome': - specifier: ^2.4.2 - version: 2.4.2 '@types/node': specifier: ^25.2.3 version: 25.2.3 '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) tsup: specifier: ^8.5.1 - version: 8.5.1(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) tsx: specifier: ^4.21.0 version: 4.21.0 @@ -53,7 +117,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) packages: @@ -79,6 +143,10 @@ packages: resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} engines: {node: '>=18'} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -105,18 +173,35 @@ packages: engines: {node: '>=14.21.3'} hasBin: true + '@biomejs/biome@2.4.6': + resolution: {integrity: sha512-QnHe81PMslpy3mnpL8DnO2M4S4ZnYPkjlGCLWBZT/3R9M6b5daArWMMtEfP52/n174RKnwRIf3oT8+wc9ihSfQ==} + engines: {node: '>=14.21.3'} + hasBin: true + '@biomejs/cli-darwin-arm64@2.4.2': resolution: {integrity: sha512-3pEcKCP/1POKyaZZhXcxFl3+d9njmeAihZ17k8lL/1vk+6e0Cbf0yPzKItFiT+5Yh6TQA4uKvnlqe0oVZwRxCA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] + '@biomejs/cli-darwin-arm64@2.4.6': + resolution: {integrity: sha512-NW18GSyxr+8sJIqgoGwVp5Zqm4SALH4b4gftIA0n62PTuBs6G2tHlwNAOj0Vq0KKSs7Sf88VjjmHh0O36EnzrQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + '@biomejs/cli-darwin-x64@2.4.2': resolution: {integrity: sha512-P7hK1jLVny+0R9UwyGcECxO6sjETxfPyBm/1dmFjnDOHgdDPjPqozByunrwh4xPKld8sxOr5eAsSqal5uKgeBg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] + '@biomejs/cli-darwin-x64@2.4.6': + resolution: {integrity: sha512-4uiE/9tuI7cnjtY9b07RgS7gGyYOAfIAGeVJWEfeCnAarOAS7qVmuRyX6d7JTKw28/mt+rUzMasYeZ+0R/U1Mw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + '@biomejs/cli-linux-arm64-musl@2.4.2': resolution: {integrity: sha512-/x04YK9+7erw6tYEcJv9WXoBHcULI/wMOvNdAyE9S3JStZZ9yJyV67sWAI+90UHuDo/BDhq0d96LDqGlSVv7WA==} engines: {node: '>=14.21.3'} @@ -124,6 +209,13 @@ packages: os: [linux] libc: [musl] + '@biomejs/cli-linux-arm64-musl@2.4.6': + resolution: {integrity: sha512-F/JdB7eN22txiTqHM5KhIVt0jVkzZwVYrdTR1O3Y4auBOQcXxHK4dxULf4z43QyZI5tsnQJrRBHZy7wwtL+B3A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@biomejs/cli-linux-arm64@2.4.2': resolution: {integrity: sha512-DI3Mi7GT2zYNgUTDEbSjl3e1KhoP76OjQdm8JpvZYZWtVDRyLd3w8llSr2TWk1z+U3P44kUBWY3X7H9MD1/DGQ==} engines: {node: '>=14.21.3'} @@ -131,6 +223,13 @@ packages: os: [linux] libc: [glibc] + '@biomejs/cli-linux-arm64@2.4.6': + resolution: {integrity: sha512-kMLaI7OF5GN1Q8Doymjro1P8rVEoy7BKQALNz6fiR8IC1WKduoNyteBtJlHT7ASIL0Cx2jR6VUOBIbcB1B8pew==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@biomejs/cli-linux-x64-musl@2.4.2': resolution: {integrity: sha512-wbBmTkeAoAYbOQ33f6sfKG7pcRSydQiF+dTYOBjJsnXO2mWEOQHllKlC2YVnedqZFERp2WZhFUoO7TNRwnwEHQ==} engines: {node: '>=14.21.3'} @@ -138,6 +237,13 @@ packages: os: [linux] libc: [musl] + '@biomejs/cli-linux-x64-musl@2.4.6': + resolution: {integrity: sha512-C9s98IPDu7DYarjlZNuzJKTjVHN03RUnmHV5htvqsx6vEUXCDSJ59DNwjKVD5XYoSS4N+BYhq3RTBAL8X6svEg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + '@biomejs/cli-linux-x64@2.4.2': resolution: {integrity: sha512-GK2ErnrKpWFigYP68cXiCHK4RTL4IUWhK92AFS3U28X/nuAL5+hTuy6hyobc8JZRSt+upXt1nXChK+tuHHx4mA==} engines: {node: '>=14.21.3'} @@ -145,21 +251,43 @@ packages: os: [linux] libc: [glibc] + '@biomejs/cli-linux-x64@2.4.6': + resolution: {integrity: sha512-oHXmUFEoH8Lql1xfc3QkFLiC1hGR7qedv5eKNlC185or+o4/4HiaU7vYODAH3peRCfsuLr1g6v2fK9dFFOYdyw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@biomejs/cli-win32-arm64@2.4.2': resolution: {integrity: sha512-k2uqwLYrNNxnaoiW3RJxoMGnbKda8FuCmtYG3cOtVljs3CzWxaTR+AoXwKGHscC9thax9R4kOrtWqWN0+KdPTw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] + '@biomejs/cli-win32-arm64@2.4.6': + resolution: {integrity: sha512-xzThn87Pf3YrOGTEODFGONmqXpTwUNxovQb72iaUOdcw8sBSY3+3WD8Hm9IhMYLnPi0n32s3L3NWU6+eSjfqFg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + '@biomejs/cli-win32-x64@2.4.2': resolution: {integrity: sha512-9ma7C4g8Sq3cBlRJD2yrsHXB1mnnEBdpy7PhvFrylQWQb4PoyCmPucdX7frvsSBQuFtIiKCrolPl/8tCZrKvgQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] + '@biomejs/cli-win32-x64@2.4.6': + resolution: {integrity: sha512-7++XhnsPlr1HDbor5amovPjOH6vsrFOCdp93iKXhFn6bcMUI6soodj3WWKfgEO6JosKU1W5n3uky3WW9RlRjTg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + '@borewit/text-codec@0.2.1': resolution: {integrity: sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} @@ -316,6 +444,188 @@ packages: cpu: [x64] os: [win32] + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@formatjs/fast-memoize@3.1.0': + resolution: {integrity: sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==} + + '@formatjs/intl-localematcher@0.8.1': + resolution: {integrity: sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA==} + + '@fumadocs/tailwind@0.0.3': + resolution: {integrity: sha512-/FWcggMz9BhoX+13xBoZLX+XX9mYvJ50dkTqy3IfocJqua65ExcsKfxwKH8hgTO3vA5KnWv4+4jU7LaW2AjAmQ==} + peerDependencies: + tailwindcss: ^4.0.0 + peerDependenciesMeta: + tailwindcss: + optional: true + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/ansi@2.0.3': resolution: {integrity: sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -354,6 +664,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -364,6 +677,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} @@ -371,1390 +687,3703 @@ packages: resolution: {integrity: sha512-mQ2s0pYYiav+tzCDR05Zptem8Ey2v8s11lri5RKGhTtL4COVCvVCk5vtyRYNT+9L8qSfyOqqefF9UtnW8mC5jA==} engines: {node: '>= 20.19.0'} - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - - '@rollup/rollup-android-arm-eabi@4.57.1': - resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.57.1': - resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} - cpu: [arm64] - os: [android] + '@next/env@16.1.6': + resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==} - '@rollup/rollup-darwin-arm64@4.57.1': - resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + '@next/swc-darwin-arm64@16.1.6': + resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.57.1': - resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + '@next/swc-darwin-x64@16.1.6': + resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.57.1': - resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.57.1': - resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': - resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm-musleabihf@4.57.1': - resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} - cpu: [arm] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-arm64-gnu@4.57.1': - resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + '@next/swc-linux-arm64-gnu@16.1.6': + resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.57.1': - resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + '@next/swc-linux-arm64-musl@16.1.6': + resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.57.1': - resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} - cpu: [loong64] + '@next/swc-linux-x64-gnu@16.1.6': + resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} + engines: {node: '>= 10'} + cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.57.1': - resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} - cpu: [loong64] + '@next/swc-linux-x64-musl@16.1.6': + resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} + engines: {node: '>= 10'} + cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.57.1': - resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} - cpu: [ppc64] - os: [linux] - libc: [glibc] + '@next/swc-win32-arm64-msvc@16.1.6': + resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] - '@rollup/rollup-linux-ppc64-musl@4.57.1': - resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} - cpu: [ppc64] - os: [linux] - libc: [musl] + '@next/swc-win32-x64-msvc@16.1.6': + resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] - '@rollup/rollup-linux-riscv64-gnu@4.57.1': - resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} - cpu: [riscv64] - os: [linux] - libc: [glibc] + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} - '@rollup/rollup-linux-riscv64-musl@4.57.1': - resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} - cpu: [riscv64] - os: [linux] - libc: [musl] + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} - '@rollup/rollup-linux-s390x-gnu@4.57.1': - resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} - cpu: [s390x] - os: [linux] - libc: [glibc] + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} - '@rollup/rollup-linux-x64-gnu@4.57.1': - resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} - cpu: [x64] - os: [linux] - libc: [glibc] + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} - '@rollup/rollup-linux-x64-musl@4.57.1': - resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} - cpu: [x64] - os: [linux] - libc: [musl] + '@orama/orama@3.1.18': + resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==} + engines: {node: '>= 20.0.0'} - '@rollup/rollup-openbsd-x64@4.57.1': - resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} - cpu: [x64] - os: [openbsd] + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} - '@rollup/rollup-openharmony-arm64@4.57.1': - resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} - cpu: [arm64] - os: [openharmony] + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - '@rollup/rollup-win32-arm64-msvc@4.57.1': - resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} - cpu: [arm64] - os: [win32] + '@radix-ui/react-accordion@1.2.12': + resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-win32-ia32-msvc@4.57.1': - resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} - cpu: [ia32] - os: [win32] + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-win32-x64-gnu@4.57.1': - resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} - cpu: [x64] - os: [win32] + '@radix-ui/react-collapsible@1.1.12': + resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-win32-x64-msvc@4.57.1': - resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} - cpu: [x64] - os: [win32] + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@tokenizer/inflate@0.4.1': - resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} - engines: {node: '>=18'} + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@tokenizer/token@0.3.0': - resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@types/node@25.2.3': - resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} + '@radix-ui/react-navigation-menu@1.2.14': + resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@vercel/oidc@3.1.0': - resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} - engines: {node: '>= 20'} + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@vitest/coverage-v8@4.0.18': - resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} peerDependencies: - '@vitest/browser': 4.0.18 - vitest: 4.0.18 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - '@vitest/browser': + '@types/react': + optional: true + '@types/react-dom': optional: true - '@vitest/expect@4.0.18': - resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@vitest/mocker@4.0.18': - resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - msw: + '@types/react': optional: true - vite: + '@types/react-dom': optional: true - '@vitest/pretty-format@4.0.18': - resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@vitest/runner@4.0.18': - resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@vitest/snapshot@4.0.18': - resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + '@radix-ui/react-scroll-area@1.2.10': + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@vitest/spy@4.0.18': - resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@vitest/utils@4.0.18': - resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - ai@6.0.97: - resolution: {integrity: sha512-eZIAcBymwGhBwncRH/v9pillZNMeRCDkc4BwcvwXerXd7sxjVxRis3ZNCNCpP02pVH4NLs81ljm4cElC4vbNcQ==} - engines: {node: '>=18'} + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: - zod: ^3.25.76 || ^4.1.8 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - amdefine@1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - ast-v8-to-istanbul@0.3.12: - resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - balanced-match@4.0.3: - resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==} - engines: {node: 20 || >=22} + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - bash-tool@1.3.15: - resolution: {integrity: sha512-rsUxbwTO1qU9LxLhsqu7d5MfoJAqWgw0+E1uDEHLxrZRcXXayZspgiqTSXwGM2yuCz6N42duMdbF95o5ZSw8lQ==} - engines: {node: '>=18'} + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} peerDependencies: - '@vercel/sandbox': '*' - ai: ^6.0.0 - just-bash: ^2.9.3 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - '@vercel/sandbox': + '@types/react': optional: true - just-bash: + '@types/react-dom': optional: true - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - brace-expansion@5.0.2: - resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} - engines: {node: 20 || >=22} + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] - bundle-require@5.1.0: - resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@shikijs/core@4.0.1': + resolution: {integrity: sha512-vWvqi9JNgz1dRL9Nvog5wtx7RuNkf7MEPl2mU/cyUUxJeH1CAr3t+81h8zO8zs7DK6cKLMoU9TvukWIDjP4Lzg==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.0.1': + resolution: {integrity: sha512-DJK9NiwtGYqMuKCRO4Ip0FKNDQpmaiS+K5bFjJ7DWFn4zHueDWgaUG8kAofkrnXF6zPPYYQY7J5FYVW9MbZyBg==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.0.1': + resolution: {integrity: sha512-oCWdCTDch3J8Kc0OZJ98KuUPC02O1VqIE3W/e2uvrHqTxYRR21RGEJMtchrgrxhsoJJCzmIciKsqG+q/yD+Cxg==} + engines: {node: '>=20'} + + '@shikijs/langs@4.0.1': + resolution: {integrity: sha512-v/mluaybWdnGJR4GqAR6zh8qAZohW9k+cGYT28Y7M8+jLbC0l4yG085O1A+WkseHTn+awd+P3UBymb2+MXFc8w==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.0.1': + resolution: {integrity: sha512-ns0hHZc5eWZuvuIEJz2pTx3Qecz0aRVYumVQJ8JgWY2tq/dH8WxdcVM49Fc2NsHEILNIT6vfdW9MF26RANWiTA==} + engines: {node: '>=20'} + + '@shikijs/rehype@4.0.1': + resolution: {integrity: sha512-bx7bYA0/p/pgeEICaPO0jT6TXrXHmr9tGRUDhOMy1cAUN2YA0iANfXX7seBnImy8DGu/rxm1ij9/ZofYrAaUjQ==} + engines: {node: '>=20'} + + '@shikijs/themes@4.0.1': + resolution: {integrity: sha512-FW41C/D6j/yKQkzVdjrRPiJCtgeDaYRJFEyCKFCINuRJRj9WcmubhP4KQHPZ4+9eT87jruSrYPyoblNRyDFzvA==} + engines: {node: '>=20'} + + '@shikijs/transformers@4.0.1': + resolution: {integrity: sha512-oE46W2eHpvD06+C0MBthd2YrDM6cktvJDFl764tOEXxfr3dAJhxMc0uNZ2tQXp+bkMgl4E7IL88Mj9RnSqiayw==} + engines: {node: '>=20'} + + '@shikijs/types@4.0.1': + resolution: {integrity: sha512-EaygPEn57+jJ76mw+nTLvIpJMAcMPokFbrF8lufsZP7Ukk+ToJYEcswN1G0e49nUZAq7aCQtoeW219A8HK1ZOw==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tailwindcss/node@4.2.1': + resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} + + '@tailwindcss/oxide-android-arm64@4.2.1': + resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.1': + resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.1': + resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.1': + resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': + resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': + resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': + resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': + resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.2.1': + resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.2.1': + resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': + resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': + resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.1': + resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.2.1': + resolution: {integrity: sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==} + + '@takumi-rs/core-darwin-arm64@0.70.4': + resolution: {integrity: sha512-rl/iZMZTL4oCV4/AYUWapfGd+/UNENMt5BOtXrIwxwsVswS5LgZVDxqD0/ngApCxhvcK0oHCDBQWUqRAzO17TA==} + engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} + cpu: [arm64] + os: [darwin] + + '@takumi-rs/core-darwin-x64@0.70.4': + resolution: {integrity: sha512-d7PUmO9X0LWDtCqvHBA7xWEDcb97oW17FnCxQzP45fXNJ3kiDeHR7MKEgLA/iFWVuCiqwtoo/4IkJplS47VlZA==} + engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} + cpu: [x64] + os: [darwin] + + '@takumi-rs/core-linux-arm64-gnu@0.70.4': + resolution: {integrity: sha512-a80EcGlsLggK9H/XsD+TGIIcSA/mGn/EP/k7XcVjV+R80cjr60NrDSTwtqKfsC9bg5AQG2wcGjoh5j18TYRrxQ==} + engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@takumi-rs/core-linux-arm64-musl@0.70.4': + resolution: {integrity: sha512-8EXmcU9H3I9eydxhK8ZxtmyZa6lWaKuxz223kxBqUTQ7Zg9H7yBcGG5JKxQGt/QS0olANjSfXv1f28dYJF9pAw==} + engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@takumi-rs/core-linux-x64-gnu@0.70.4': + resolution: {integrity: sha512-A32LzsEyXwdaLUCfxLK73F5OUYHbbAbDel1ACzkdsmE7clOQFKuP6pW3lXI9OuTUl5r7cpBAhcK2ObzqrTdoIA==} + engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@takumi-rs/core-linux-x64-musl@0.70.4': + resolution: {integrity: sha512-OLrZXkz9/H37vuHihmQlrJBgsNd0vXbGMFc+Vec+mZoIB3oF9WShI9nyAULUldF+vM6Z+OrXm23dGB/DOoDykg==} + engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@takumi-rs/core-win32-arm64-msvc@0.70.4': + resolution: {integrity: sha512-Bgc0VGbg+V0B7RNo08A9sikFfbD7bwPiLKoWlGeSr4Vr/95u/UyF+l/mozN75PRWAGPdNE2v2h6IzV1FEMXK7w==} + engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} + cpu: [arm64] + os: [win32] + + '@takumi-rs/core-win32-x64-msvc@0.70.4': + resolution: {integrity: sha512-Iah4b4XLbiehplyITYJ5oaikefVp16rpvpWiwgmItT82oUZfnomQKj1x1ojjAKgRCZ/5M2DV4+4cf/KFFosrew==} + engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} + cpu: [x64] + os: [win32] + + '@takumi-rs/core@0.70.4': + resolution: {integrity: sha512-wedpLgaeuJWZfahBOGdo8RV0MtKc8WFaD2YbozlnRcw0ehooI2xupuFlhWpKyKkFjb/REIqnEJRiiTkMqGG3/Q==} + engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} + + '@takumi-rs/helpers@0.70.4': + resolution: {integrity: sha512-kzxCcsNHMziZKHBw4Zu8ceiBwYcUzVt4s0vxpDVMNknSgBd09yZnJG3U1OiSSjoI94f5AcF6i/qgr7wq4dgaaQ==} + + '@takumi-rs/image-response@0.70.4': + resolution: {integrity: sha512-h0nyKvU4470STunToY+uA2OFbVIFZiHDwPj9qZWUKf5BspXnZuXaaCnhMitORSKhqI9LxWjS3DpuE30yaYBuJw==} + + '@takumi-rs/wasm@0.70.4': + resolution: {integrity: sha512-gl5JQv1MCgKkndxqZf7H/SBvuezZCg4n74CXBVcjP2eXC+ZGtStM4J6KMQYdP8mCF3Y9cD2Fdfezyx9KfJsOOg==} + + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@25.2.3': + resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} + + '@types/node@25.3.5': + resolution: {integrity: sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + engines: {node: '>= 20'} + + '@vitest/coverage-v8@4.0.18': + resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} + peerDependencies: + '@vitest/browser': 4.0.18 + vitest: 4.0.18 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ai@6.0.97: + resolution: {integrity: sha512-eZIAcBymwGhBwncRH/v9pillZNMeRCDkc4BwcvwXerXd7sxjVxRis3ZNCNCpP02pVH4NLs81ljm4cElC4vbNcQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: '>=0.4.2'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-v8-to-istanbul@0.3.12: + resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@4.0.3: + resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==} + engines: {node: 20 || >=22} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.10.0: + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + engines: {node: '>=6.0.0'} + hasBin: true + + bash-tool@1.3.15: + resolution: {integrity: sha512-rsUxbwTO1qU9LxLhsqu7d5MfoJAqWgw0+E1uDEHLxrZRcXXayZspgiqTSXwGM2yuCz6N42duMdbF95o5ZSw8lQ==} + engines: {node: '>=18'} + peerDependencies: + '@vercel/sandbox': '*' + ai: ^6.0.0 + just-bash: ^2.9.3 + peerDependenciesMeta: + '@vercel/sandbox': + optional: true + just-bash: + optional: true + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + caniuse-lite@1.0.30001777: + resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@2.8.1: + resolution: {integrity: sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==} + engines: {node: '>= 0.6.x'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + compressjs@1.0.3: + resolution: {integrity: sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==} + hasBin: true + + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + enhanced-resolve@5.20.0: + resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} + engines: {node: '>=10.13.0'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.5.0: + resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.0: + resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} + + fast-xml-parser@5.3.7: + resolution: {integrity: sha512-JzVLro9NQv92pOM/jTCR6mHlJh2FGwtomH8ZQjhFj/R29P2Fnj38OgPJVtcvYw6SuKClhgYuwUZf5b3rd8u2mA==} + hasBin: true + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-type@21.3.0: + resolution: {integrity: sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==} + engines: {node: '>=20'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + + framer-motion@12.35.1: + resolution: {integrity: sha512-rL8cLrjYZNShZqKV3U0Qj6Y5WDiZXYEM5giiTLfEqsIZxtspzMDCkKmrO5po76jWfvOg04+Vk+sfBvTD0iMmLw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fumadocs-core@16.6.10: + resolution: {integrity: sha512-SBknJjP9SmaCyy5V25CYFibvc6IVLw/1kN0Cy60EnW+kl23gXQJ7szmhRtrxz7Ij4r/yHj20IBKtJneCZJ5k1g==} + peerDependencies: + '@mdx-js/mdx': '*' + '@mixedbread/sdk': ^0.46.0 + '@orama/core': 1.x.x + '@oramacloud/client': 2.x.x + '@tanstack/react-router': 1.x.x + '@types/estree-jsx': '*' + '@types/hast': '*' + '@types/mdast': '*' + '@types/react': '*' + algoliasearch: 5.x.x + lucide-react: '*' + next: 16.x.x + react: ^19.2.0 + react-dom: ^19.2.0 + react-router: 7.x.x + waku: ^0.26.0 || ^0.27.0 || ^1.0.0 + zod: 4.x.x + peerDependenciesMeta: + '@mdx-js/mdx': + optional: true + '@mixedbread/sdk': + optional: true + '@orama/core': + optional: true + '@oramacloud/client': + optional: true + '@tanstack/react-router': + optional: true + '@types/estree-jsx': + optional: true + '@types/hast': + optional: true + '@types/mdast': + optional: true + '@types/react': + optional: true + algoliasearch: + optional: true + lucide-react: + optional: true + next: + optional: true + react: + optional: true + react-dom: + optional: true + react-router: + optional: true + waku: + optional: true + zod: + optional: true + + fumadocs-mdx@14.2.9: + resolution: {integrity: sha512-5QbFj3KyNgojjpUsD5Xw2W+ofN9l1WiIxzthwFzGoHOLIoJkdCN4AjHcINC+YSo89d/oZlradrrKRd3uHwVKBA==} + hasBin: true + peerDependencies: + '@fumadocs/mdx-remote': ^1.4.0 + '@types/mdast': '*' + '@types/mdx': '*' + '@types/react': '*' + fumadocs-core: ^15.0.0 || ^16.0.0 + mdast-util-directive: '*' + next: ^15.3.0 || ^16.0.0 + react: '*' + vite: 6.x.x || 7.x.x + peerDependenciesMeta: + '@fumadocs/mdx-remote': + optional: true + '@types/mdast': + optional: true + '@types/mdx': + optional: true + '@types/react': + optional: true + mdast-util-directive: + optional: true + next: + optional: true + react: + optional: true + vite: + optional: true + + fumadocs-ui@16.6.10: + resolution: {integrity: sha512-1MXRFWDYXiBnEih7CwwlDZIh8pT3gbeRpL5OswDHdHwY8+mDTi5fsLg1auCHmYDcehZZbUxwPySZpoc3gvpmrA==} + peerDependencies: + '@takumi-rs/image-response': '*' + '@types/react': '*' + fumadocs-core: 16.6.10 + next: 16.x.x + react: ^19.2.0 + react-dom: ^19.2.0 + peerDependenciesMeta: + '@takumi-rs/image-response': + optional: true + '@types/react': + optional: true + next: + optional: true + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graceful-readlink@1.0.1: + resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + just-bash@2.10.2: + resolution: {integrity: sha512-HvpSugoDj855tVJ+ITRI7B3YDB8Osg9yt6H1mBUaW4X3804SsoC3WOC75gY2KMKYMvxbk2O1uRL+05YeNdGuKg==} + hasBin: true + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lightningcss-android-arm64@1.31.1: + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.31.1: + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.31.1: + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.31.1: + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.31.1: + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.31.1: + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.31.1: + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.31.1: + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.31.1: + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + lightningcss-win32-arm64-msvc@1.31.1: + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.31.1: + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.31.1: + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lucide-react@0.577.0: + resolution: {integrity: sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.2: + resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@10.2.2: + resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==} + engines: {node: 18 || 20 || >=22} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + modern-tar@0.7.4: + resolution: {integrity: sha512-5ixBi7pY+H8z3MKExsipXPq6S/Q27KpSY0K+NnIyLQLr58mNeZVhT9TkYcqa74H52DabOyrmGLhT5D7TZ/x26Q==} + engines: {node: '>=18.0.0'} + + motion-dom@12.35.1: + resolution: {integrity: sha512-7n6r7TtNOsH2UFSAXzTkfzOeO5616v9B178qBIjmu/WgEyJK0uqwytCEhwKBTuM/HJA40ptAw7hLFpxtPAMRZQ==} + + motion-utils@12.29.2: + resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==} + + motion@12.35.1: + resolution: {integrity: sha512-yEt/49kWC0VU/IEduDfeZw82eDemlPwa1cyo/gcEEUCN4WgpSJpUcxz6BUwakGabvJiTzLQ58J73515I5tfykQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + + next@16.1.6: + resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} + engines: {node: '>=20.9.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + node-abi@3.87.0: + resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} + engines: {node: '>=10'} + + node-addon-api@8.5.0: + resolution: {integrity: sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==} + engines: {node: ^18 || ^20 || >= 21} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-liblzma@2.2.0: + resolution: {integrity: sha512-s0KzNOWwOJJgPG6wxg6cKohnAl9Wk/oW1KrQaVzJBjQwVcUGPQCzpR46Ximygjqj/3KhOrtJXnYMp/xYAXp75g==} + engines: {node: '>=16.0.0'} + hasBin: true + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + npm-to-yarn@3.0.1: + resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + papaparse@5.5.3: + resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. + hasBin: true + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + pyodide@0.27.7: + resolution: {integrity: sha512-RUSVJlhQdfWfgO9hVHCiXoG+nVZQRS5D9FzgpLJ/VcgGBLSAKoPL8kTiOikxbHQm1kRISeWUBdulEgO26qpSRA==} + engines: {node: '>=18.0.0'} - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true - commander@2.8.1: - resolution: {integrity: sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==} - engines: {node: '>= 0.6.x'} + re2js@1.2.2: + resolution: {integrity: sha512-xvy4uuynAZWg9SuHbg0lgQncOuK6wssLmbHs8L8+YRbWLKY8Pe1avaHjNaFLOjErq8Oh0HvwQRWqIOCRL7uDDw==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + + react-medium-image-zoom@5.4.1: + resolution: {integrity: sha512-DD2iZYaCfAwiQGR8AN62r/cDJYoXhezlYJc5HY4TzBUGuGge43CptG0f7m0PEIM72aN6GfpjohvY1yYdtCJB7g==} + peerDependencies: + 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 + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - compressjs@1.0.3: - resolution: {integrity: sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@4.0.1: + resolution: {integrity: sha512-EkAEhDTN5WhpoQFXFw79OHIrSAfHhlImeCdSyg4u4XvrpxKEmdo/9x/HWSowujAnUrFsGOwWiE58a6GVentMnQ==} + engines: {node: '>=20'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + smol-toml@1.6.0: + resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} + engines: {node: '>= 18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sql.js@1.14.0: + resolution: {integrity: sha512-NXYh+kFqLiYRCNAaHD0PcbjFgXyjuolEKLMk5vRt2DgPENtF1kkNzzMlg42dUk5wIsH8MhUzsRhaUxIisoSlZQ==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} + engines: {node: '>=18'} + + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tailwind-merge@3.5.0: + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + + tailwindcss@4.2.1: + resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true peerDependencies: - supports-color: '*' + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' peerDependenciesMeta: - supports-color: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: optional: true - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} + turbo-darwin-64@2.8.14: + resolution: {integrity: sha512-9sFi7n2lLfEsGWi5OEoA/eTtQU2BPKtzSYKqufMtDeRmqMT9vKjbv9gJCRkllSVE9BOXA0qXC3diyX8V8rKIKw==} + cpu: [x64] + os: [darwin] - diff@8.0.3: - resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} - engines: {node: '>=0.3.1'} + turbo-darwin-arm64@2.8.14: + resolution: {integrity: sha512-aS4yJuy6A1PCLws+PJpZP0qCURG8Y5iVx13z/WAbKyeDTY6W6PiGgcEllSaeLGxyn++382ztN/EZH85n2zZ6VQ==} + cpu: [arm64] + os: [darwin] - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + turbo-linux-64@2.8.14: + resolution: {integrity: sha512-XC6wPUDJkakjhNLaS0NrHDMiujRVjH+naEAwvKLArgqRaFkNxjmyNDRM4eu3soMMFmjym6NTxYaF74rvET+Orw==} + cpu: [x64] + os: [linux] - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + turbo-linux-arm64@2.8.14: + resolution: {integrity: sha512-ChfE7isyVNjZrVSPDwcfqcHLG/FuIBbOFxnt1FM8vSuBGzHAs8AlTdwFNIxlEMJfZ8Ad9mdMxdmsCUPIWiQ6cg==} + cpu: [arm64] + os: [linux] - esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} - engines: {node: '>=18'} + turbo-windows-64@2.8.14: + resolution: {integrity: sha512-FTbIeQL1ycLFW2t9uQNMy+bRSzi3Xhwun/e7ZhFBdM+U0VZxxrtfYEBM9CHOejlfqomk6Jh7aRz0sJoqYn39Hg==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@2.8.14: + resolution: {integrity: sha512-KgZX12cTyhY030qS7ieT8zRkhZZE2VWJasDFVUSVVn17nR7IShpv68/7j5UqJNeRLIGF1XPK0phsP5V5yw3how==} + cpu: [arm64] + os: [win32] + + turbo@2.8.14: + resolution: {integrity: sha512-UCTxeMNYT1cKaHiIFdLCQ7ulI+jw5i5uOnJOrRXsgUD7G3+OjlUjwVd7JfeVt2McWSVGjYA3EVW/v1FSsJ5DtA==} hasBin: true - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + turndown@7.2.2: + resolution: {integrity: sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} hasBin: true - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - eventsource-parser@3.0.6: - resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} - engines: {node: '>=18.0.0'} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} - execa@9.6.1: - resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} - engines: {node: ^18.19.0 || >=20.5.0} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} - engines: {node: '>=12.0.0'} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - fast-string-truncated-width@3.0.3: - resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} - fast-string-width@3.0.2: - resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - fast-wrap-ansi@0.2.0: - resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - fast-xml-parser@5.3.7: - resolution: {integrity: sha512-JzVLro9NQv92pOM/jTCR6mHlJh2FGwtomH8ZQjhFj/R29P2Fnj38OgPJVtcvYw6SuKClhgYuwUZf5b3rd8u2mA==} - hasBin: true + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} peerDependencies: - picomatch: ^3 || ^4 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: - picomatch: + '@types/react': optional: true - figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} - engines: {node: '>=18'} - - file-type@21.3.0: - resolution: {integrity: sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==} - engines: {node: '>=20'} + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - fix-dts-default-cjs-exports@1.0.1: - resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true - get-tsconfig@4.13.6: - resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true - graceful-readlink@1.0.1: - resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true - human-signals@8.0.1: - resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} - engines: {node: '>=18.18.0'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - ini@6.0.0: - resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} - engines: {node: ^20.17.0 || >=22.9.0} +snapshots: - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} + '@ai-sdk/gateway@3.0.53(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) + '@vercel/oidc': 3.1.0 + zod: 4.3.6 - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + '@ai-sdk/google@3.0.30(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) + zod: 4.3.6 - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + '@ai-sdk/provider-utils@4.0.15(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 4.3.6 - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + '@ai-sdk/provider@3.0.8': + dependencies: + json-schema: 0.4.0 - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + '@alloc/quick-lru@5.2.0': {} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} + '@babel/helper-string-parser@7.27.1': {} - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} + '@babel/helper-validator-identifier@7.28.5': {} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + '@bcoe/v8-coverage@1.0.2': {} - istanbul-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} + '@biomejs/biome@2.4.2': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.4.2 + '@biomejs/cli-darwin-x64': 2.4.2 + '@biomejs/cli-linux-arm64': 2.4.2 + '@biomejs/cli-linux-arm64-musl': 2.4.2 + '@biomejs/cli-linux-x64': 2.4.2 + '@biomejs/cli-linux-x64-musl': 2.4.2 + '@biomejs/cli-win32-arm64': 2.4.2 + '@biomejs/cli-win32-x64': 2.4.2 - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} + '@biomejs/biome@2.4.6': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.4.6 + '@biomejs/cli-darwin-x64': 2.4.6 + '@biomejs/cli-linux-arm64': 2.4.6 + '@biomejs/cli-linux-arm64-musl': 2.4.6 + '@biomejs/cli-linux-x64': 2.4.6 + '@biomejs/cli-linux-x64-musl': 2.4.6 + '@biomejs/cli-win32-arm64': 2.4.6 + '@biomejs/cli-win32-x64': 2.4.6 - js-tokens@10.0.0: - resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + '@biomejs/cli-darwin-arm64@2.4.2': + optional: true - js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} - hasBin: true + '@biomejs/cli-darwin-arm64@2.4.6': + optional: true - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + '@biomejs/cli-darwin-x64@2.4.2': + optional: true - just-bash@2.10.2: - resolution: {integrity: sha512-HvpSugoDj855tVJ+ITRI7B3YDB8Osg9yt6H1mBUaW4X3804SsoC3WOC75gY2KMKYMvxbk2O1uRL+05YeNdGuKg==} - hasBin: true + '@biomejs/cli-darwin-x64@2.4.6': + optional: true - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + '@biomejs/cli-linux-arm64-musl@2.4.2': + optional: true - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} + '@biomejs/cli-linux-arm64-musl@2.4.6': + optional: true - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + '@biomejs/cli-linux-arm64@2.4.2': + optional: true - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + '@biomejs/cli-linux-arm64@2.4.6': + optional: true - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + '@biomejs/cli-linux-x64-musl@2.4.2': + optional: true - magicast@0.5.2: - resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + '@biomejs/cli-linux-x64-musl@2.4.6': + optional: true - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + '@biomejs/cli-linux-x64@2.4.2': + optional: true - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + '@biomejs/cli-linux-x64@2.4.6': + optional: true - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + '@biomejs/cli-win32-arm64@2.4.2': + optional: true - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + '@biomejs/cli-win32-arm64@2.4.6': + optional: true - minimatch@10.2.2: - resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==} - engines: {node: 18 || 20 || >=22} + '@biomejs/cli-win32-x64@2.4.2': + optional: true - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + '@biomejs/cli-win32-x64@2.4.6': + optional: true - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + '@borewit/text-codec@0.2.1': {} - mlly@1.8.0: - resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true - modern-tar@0.7.4: - resolution: {integrity: sha512-5ixBi7pY+H8z3MKExsipXPq6S/Q27KpSY0K+NnIyLQLr58mNeZVhT9TkYcqa74H52DabOyrmGLhT5D7TZ/x26Q==} - engines: {node: '>=18.0.0'} + '@esbuild/aix-ppc64@0.27.3': + optional: true - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + '@esbuild/android-arm64@0.27.3': + optional: true - mute-stream@3.0.0: - resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} - engines: {node: ^20.17.0 || >=22.9.0} + '@esbuild/android-arm@0.27.3': + optional: true - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + '@esbuild/android-x64@0.27.3': + optional: true - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + '@esbuild/darwin-arm64@0.27.3': + optional: true - napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + '@esbuild/darwin-x64@0.27.3': + optional: true - node-abi@3.87.0: - resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} - engines: {node: '>=10'} + '@esbuild/freebsd-arm64@0.27.3': + optional: true - node-addon-api@8.5.0: - resolution: {integrity: sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==} - engines: {node: ^18 || ^20 || >= 21} + '@esbuild/freebsd-x64@0.27.3': + optional: true - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true + '@esbuild/linux-arm64@0.27.3': + optional: true - node-liblzma@2.2.0: - resolution: {integrity: sha512-s0KzNOWwOJJgPG6wxg6cKohnAl9Wk/oW1KrQaVzJBjQwVcUGPQCzpR46Ximygjqj/3KhOrtJXnYMp/xYAXp75g==} - engines: {node: '>=16.0.0'} - hasBin: true + '@esbuild/linux-arm@0.27.3': + optional: true - npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} + '@esbuild/linux-ia32@0.27.3': + optional: true - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + '@esbuild/linux-loong64@0.27.3': + optional: true - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + '@esbuild/linux-mips64el@0.27.3': + optional: true - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + '@esbuild/linux-ppc64@0.27.3': + optional: true - papaparse@5.5.3: - resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==} + '@esbuild/linux-riscv64@0.27.3': + optional: true - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} + '@esbuild/linux-s390x@0.27.3': + optional: true - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + '@esbuild/linux-x64@0.27.3': + optional: true - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.27.3': + optional: true - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + '@esbuild/netbsd-x64@0.27.3': + optional: true - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + '@esbuild/openbsd-arm64@0.27.3': + optional: true - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + '@esbuild/openbsd-x64@0.27.3': + optional: true - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} + '@esbuild/openharmony-arm64@0.27.3': + optional: true - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} + '@esbuild/sunos-x64@0.27.3': + optional: true - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + '@esbuild/win32-arm64@0.27.3': + optional: true - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true + '@esbuild/win32-ia32@0.27.3': + optional: true - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + '@esbuild/win32-x64@0.27.3': + optional: true - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. - hasBin: true + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 - pretty-ms@9.3.0: - resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} - engines: {node: '>=18'} + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + '@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - pyodide@0.27.7: - resolution: {integrity: sha512-RUSVJlhQdfWfgO9hVHCiXoG+nVZQRS5D9FzgpLJ/VcgGBLSAKoPL8kTiOikxbHQm1kRISeWUBdulEgO26qpSRA==} - engines: {node: '>=18.0.0'} + '@floating-ui/utils@0.2.11': {} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + '@formatjs/fast-memoize@3.1.0': + dependencies: + tslib: 2.8.1 - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + '@formatjs/intl-localematcher@0.8.1': + dependencies: + '@formatjs/fast-memoize': 3.1.0 + tslib: 2.8.1 - re2js@1.2.2: - resolution: {integrity: sha512-xvy4uuynAZWg9SuHbg0lgQncOuK6wssLmbHs8L8+YRbWLKY8Pe1avaHjNaFLOjErq8Oh0HvwQRWqIOCRL7uDDw==} + '@fumadocs/tailwind@0.0.3(tailwindcss@4.2.1)': + dependencies: + postcss-selector-parser: 7.1.1 + optionalDependencies: + tailwindcss: 4.2.1 - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + '@img/colour@1.1.0': + optional: true - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true - rollup@4.57.1: - resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true - smol-toml@1.6.0: - resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} - engines: {node: '>= 18'} + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true - source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true - sql.js@1.14.0: - resolution: {integrity: sha512-NXYh+kFqLiYRCNAaHD0PcbjFgXyjuolEKLMk5vRt2DgPENtF1kkNzzMlg42dUk5wIsH8MhUzsRhaUxIisoSlZQ==} + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + '@img/sharp-win32-arm64@0.34.5': + optional: true - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + '@img/sharp-win32-ia32@0.34.5': + optional: true - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + '@img/sharp-win32-x64@0.34.5': + optional: true - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} + '@inquirer/ansi@2.0.3': {} - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} + '@inquirer/core@11.1.4(@types/node@25.2.3)': + dependencies: + '@inquirer/ansi': 2.0.3 + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@25.2.3) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.0 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 25.2.3 - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + '@inquirer/figures@2.0.3': {} - strnum@2.1.2: - resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + '@inquirer/search@4.1.3(@types/node@25.2.3)': + dependencies: + '@inquirer/core': 11.1.4(@types/node@25.2.3) + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@25.2.3) + optionalDependencies: + '@types/node': 25.2.3 - strtok3@10.3.4: - resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} - engines: {node: '>=18'} + '@inquirer/type@4.0.3(@types/node@25.2.3)': + optionalDependencies: + '@types/node': 25.2.3 - sucrase@3.35.1: - resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - tar-fs@2.1.4: - resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + '@jridgewell/resolve-uri@3.1.2': {} - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + '@jridgewell/sourcemap-codec@1.5.5': {} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.15.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.15.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + '@mixmark-io/domino@2.2.0': {} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + '@mongodb-js/zstd@7.0.0': + dependencies: + node-addon-api: 8.5.0 + prebuild-install: 7.1.3 + optional: true - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + '@next/env@16.1.6': {} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} - engines: {node: '>=18'} + '@next/swc-darwin-arm64@16.1.6': + optional: true - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} + '@next/swc-darwin-x64@16.1.6': + optional: true - tinyrainbow@3.0.3: - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} - engines: {node: '>=14.0.0'} + '@next/swc-linux-arm64-gnu@16.1.6': + optional: true - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + '@next/swc-linux-arm64-musl@16.1.6': + optional: true - token-types@6.1.2: - resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} - engines: {node: '>=14.16'} + '@next/swc-linux-x64-gnu@16.1.6': + optional: true - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true + '@next/swc-linux-x64-musl@16.1.6': + optional: true - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + '@next/swc-win32-arm64-msvc@16.1.6': + optional: true - tsup@8.5.1: - resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true + '@next/swc-win32-x64-msvc@16.1.6': + optional: true - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} - engines: {node: '>=18.0.0'} - hasBin: true + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + '@nodelib/fs.stat@2.0.5': {} - turndown@7.2.2: - resolution: {integrity: sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==} + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true + '@opentelemetry/api@1.9.0': {} - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + '@orama/orama@3.1.18': {} - uint8array-extras@1.5.0: - resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} - engines: {node: '>=18'} + '@radix-ui/number@1.1.1': {} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + '@radix-ui/primitive@1.1.3': {} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - vitest@4.0.18: - resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.18 - '@vitest/browser-preview': 4.0.18 - '@vitest/browser-webdriverio': 4.0.18 - '@vitest/ui': 4.0.18 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true + '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} - engines: {node: '>= 14.6'} - hasBin: true + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} - engines: {node: '>=18'} + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 -snapshots: + '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@ai-sdk/gateway@3.0.53(zod@4.3.6)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - '@vercel/oidc': 3.1.0 - zod: 4.3.6 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@ai-sdk/google@3.0.30(zod@4.3.6)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - zod: 4.3.6 + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/rect': 1.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@ai-sdk/provider-utils@4.0.15(zod@4.3.6)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@ai-sdk/provider': 3.0.8 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 - zod: 4.3.6 + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@ai-sdk/provider@3.0.8': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - json-schema: 0.4.0 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@babel/helper-string-parser@7.27.1': {} + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@babel/helper-validator-identifier@7.28.5': {} + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@babel/parser@7.29.0': + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@babel/types': 7.29.0 + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@babel/types@7.29.0': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.4)': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - '@bcoe/v8-coverage@1.0.2': {} + '@radix-ui/react-slot@1.2.4(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - '@biomejs/biome@2.4.2': + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.2 - '@biomejs/cli-darwin-x64': 2.4.2 - '@biomejs/cli-linux-arm64': 2.4.2 - '@biomejs/cli-linux-arm64-musl': 2.4.2 - '@biomejs/cli-linux-x64': 2.4.2 - '@biomejs/cli-linux-x64-musl': 2.4.2 - '@biomejs/cli-win32-arm64': 2.4.2 - '@biomejs/cli-win32-x64': 2.4.2 + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@biomejs/cli-darwin-arm64@2.4.2': - optional: true + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - '@biomejs/cli-darwin-x64@2.4.2': - optional: true + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - '@biomejs/cli-linux-arm64-musl@2.4.2': - optional: true + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - '@biomejs/cli-linux-arm64@2.4.2': - optional: true + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - '@biomejs/cli-linux-x64-musl@2.4.2': - optional: true + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - '@biomejs/cli-linux-x64@2.4.2': - optional: true + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - '@biomejs/cli-win32-arm64@2.4.2': - optional: true + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - '@biomejs/cli-win32-x64@2.4.2': - optional: true + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 - '@borewit/text-codec@0.2.1': {} + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@esbuild/aix-ppc64@0.27.3': - optional: true + '@radix-ui/rect@1.1.1': {} - '@esbuild/android-arm64@0.27.3': + '@rollup/rollup-android-arm-eabi@4.57.1': optional: true - '@esbuild/android-arm@0.27.3': + '@rollup/rollup-android-arm64@4.57.1': optional: true - '@esbuild/android-x64@0.27.3': + '@rollup/rollup-darwin-arm64@4.57.1': optional: true - '@esbuild/darwin-arm64@0.27.3': + '@rollup/rollup-darwin-x64@4.57.1': optional: true - '@esbuild/darwin-x64@0.27.3': + '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - '@esbuild/freebsd-arm64@0.27.3': + '@rollup/rollup-freebsd-x64@4.57.1': optional: true - '@esbuild/freebsd-x64@0.27.3': + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@esbuild/linux-arm64@0.27.3': + '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@esbuild/linux-arm@0.27.3': + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@esbuild/linux-ia32@0.27.3': + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@esbuild/linux-loong64@0.27.3': + '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - '@esbuild/linux-mips64el@0.27.3': + '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@esbuild/linux-ppc64@0.27.3': + '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - '@esbuild/linux-riscv64@0.27.3': + '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@esbuild/linux-s390x@0.27.3': + '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@esbuild/linux-x64@0.27.3': + '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@esbuild/netbsd-arm64@0.27.3': + '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - '@esbuild/netbsd-x64@0.27.3': + '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - '@esbuild/openbsd-arm64@0.27.3': + '@rollup/rollup-linux-x64-musl@4.57.1': optional: true - '@esbuild/openbsd-x64@0.27.3': + '@rollup/rollup-openbsd-x64@4.57.1': optional: true - '@esbuild/openharmony-arm64@0.27.3': + '@rollup/rollup-openharmony-arm64@4.57.1': optional: true - '@esbuild/sunos-x64@0.27.3': + '@rollup/rollup-win32-arm64-msvc@4.57.1': optional: true - '@esbuild/win32-arm64@0.27.3': + '@rollup/rollup-win32-ia32-msvc@4.57.1': optional: true - '@esbuild/win32-ia32@0.27.3': + '@rollup/rollup-win32-x64-gnu@4.57.1': optional: true - '@esbuild/win32-x64@0.27.3': + '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true - '@inquirer/ansi@2.0.3': {} + '@sec-ant/readable-stream@0.4.1': {} - '@inquirer/core@11.1.4(@types/node@25.2.3)': + '@shikijs/core@4.0.1': dependencies: - '@inquirer/ansi': 2.0.3 - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.2.3) - cli-width: 4.1.0 - fast-wrap-ansi: 0.2.0 - mute-stream: 3.0.0 - signal-exit: 4.1.0 - optionalDependencies: - '@types/node': 25.2.3 + '@shikijs/primitive': 4.0.1 + '@shikijs/types': 4.0.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 - '@inquirer/figures@2.0.3': {} - - '@inquirer/search@4.1.3(@types/node@25.2.3)': + '@shikijs/engine-javascript@4.0.1': dependencies: - '@inquirer/core': 11.1.4(@types/node@25.2.3) - '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.2.3) - optionalDependencies: - '@types/node': 25.2.3 + '@shikijs/types': 4.0.1 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 - '@inquirer/type@4.0.3(@types/node@25.2.3)': - optionalDependencies: - '@types/node': 25.2.3 - - '@jridgewell/gen-mapping@0.3.13': + '@shikijs/engine-oniguruma@4.0.1': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} + '@shikijs/types': 4.0.1 + '@shikijs/vscode-textmate': 10.0.2 - '@jridgewell/trace-mapping@0.3.31': + '@shikijs/langs@4.0.1': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@mixmark-io/domino@2.2.0': {} + '@shikijs/types': 4.0.1 - '@mongodb-js/zstd@7.0.0': + '@shikijs/primitive@4.0.1': dependencies: - node-addon-api: 8.5.0 - prebuild-install: 7.1.3 - optional: true + '@shikijs/types': 4.0.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - '@nodelib/fs.scandir@2.1.5': + '@shikijs/rehype@4.0.1': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@shikijs/types': 4.0.1 + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + shiki: 4.0.1 + unified: 11.0.5 + unist-util-visit: 5.1.0 + + '@shikijs/themes@4.0.1': + dependencies: + '@shikijs/types': 4.0.1 - '@nodelib/fs.stat@2.0.5': {} + '@shikijs/transformers@4.0.1': + dependencies: + '@shikijs/core': 4.0.1 + '@shikijs/types': 4.0.1 - '@nodelib/fs.walk@1.2.8': + '@shikijs/types@4.0.1': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - '@opentelemetry/api@1.9.0': {} + '@shikijs/vscode-textmate@10.0.2': {} - '@rollup/rollup-android-arm-eabi@4.57.1': - optional: true + '@sindresorhus/merge-streams@4.0.0': {} - '@rollup/rollup-android-arm64@4.57.1': - optional: true + '@standard-schema/spec@1.1.0': {} - '@rollup/rollup-darwin-arm64@4.57.1': - optional: true + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 - '@rollup/rollup-darwin-x64@4.57.1': - optional: true + '@tailwindcss/node@4.2.1': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.0 + jiti: 2.6.1 + lightningcss: 1.31.1 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.1 - '@rollup/rollup-freebsd-arm64@4.57.1': + '@tailwindcss/oxide-android-arm64@4.2.1': optional: true - '@rollup/rollup-freebsd-x64@4.57.1': + '@tailwindcss/oxide-darwin-arm64@4.2.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + '@tailwindcss/oxide-darwin-x64@4.2.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.57.1': + '@tailwindcss/oxide-freebsd-x64@4.2.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.57.1': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.57.1': + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.57.1': + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.57.1': + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.57.1': + '@tailwindcss/oxide-linux-x64-musl@4.2.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.57.1': + '@tailwindcss/oxide-wasm32-wasi@4.2.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.57.1': + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.57.1': + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.57.1': - optional: true + '@tailwindcss/oxide@4.2.1': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.1 + '@tailwindcss/oxide-darwin-arm64': 4.2.1 + '@tailwindcss/oxide-darwin-x64': 4.2.1 + '@tailwindcss/oxide-freebsd-x64': 4.2.1 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.1 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.1 + '@tailwindcss/oxide-linux-x64-musl': 4.2.1 + '@tailwindcss/oxide-wasm32-wasi': 4.2.1 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 + + '@tailwindcss/postcss@4.2.1': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.1 + '@tailwindcss/oxide': 4.2.1 + postcss: 8.5.8 + tailwindcss: 4.2.1 - '@rollup/rollup-linux-x64-gnu@4.57.1': + '@takumi-rs/core-darwin-arm64@0.70.4': optional: true - '@rollup/rollup-linux-x64-musl@4.57.1': + '@takumi-rs/core-darwin-x64@0.70.4': optional: true - '@rollup/rollup-openbsd-x64@4.57.1': + '@takumi-rs/core-linux-arm64-gnu@0.70.4': optional: true - '@rollup/rollup-openharmony-arm64@4.57.1': + '@takumi-rs/core-linux-arm64-musl@0.70.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.57.1': + '@takumi-rs/core-linux-x64-gnu@0.70.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.57.1': + '@takumi-rs/core-linux-x64-musl@0.70.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.57.1': + '@takumi-rs/core-win32-arm64-msvc@0.70.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.57.1': + '@takumi-rs/core-win32-x64-msvc@0.70.4': optional: true - '@sec-ant/readable-stream@0.4.1': {} - - '@sindresorhus/merge-streams@4.0.0': {} + '@takumi-rs/core@0.70.4': + optionalDependencies: + '@takumi-rs/core-darwin-arm64': 0.70.4 + '@takumi-rs/core-darwin-x64': 0.70.4 + '@takumi-rs/core-linux-arm64-gnu': 0.70.4 + '@takumi-rs/core-linux-arm64-musl': 0.70.4 + '@takumi-rs/core-linux-x64-gnu': 0.70.4 + '@takumi-rs/core-linux-x64-musl': 0.70.4 + '@takumi-rs/core-win32-arm64-msvc': 0.70.4 + '@takumi-rs/core-win32-x64-msvc': 0.70.4 + + '@takumi-rs/helpers@0.70.4': {} + + '@takumi-rs/image-response@0.70.4': + dependencies: + '@takumi-rs/core': 0.70.4 + '@takumi-rs/helpers': 0.70.4 + '@takumi-rs/wasm': 0.70.4 - '@standard-schema/spec@1.1.0': {} + '@takumi-rs/wasm@0.70.4': {} '@tokenizer/inflate@0.4.1': dependencies: @@ -1770,17 +4399,55 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + '@types/estree@1.0.8': {} + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + '@types/node@25.2.3': dependencies: undici-types: 7.16.0 + '@types/node@25.3.5': + dependencies: + undici-types: 7.18.2 + + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@ungap/structured-clone@1.3.0': {} + '@vercel/oidc@3.1.0': {} - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -1792,7 +4459,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/expect@4.0.18': dependencies: @@ -1803,13 +4470,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@4.0.18': dependencies: @@ -1833,6 +4500,10 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn@8.15.0: {} ai@6.0.97(zod@4.3.6): @@ -1851,6 +4522,12 @@ snapshots: dependencies: sprintf-js: 1.0.3 + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + assertion-error@2.0.1: {} ast-v8-to-istanbul@0.3.12: @@ -1859,11 +4536,17 @@ snapshots: estree-walker: 3.0.3 js-tokens: 10.0.0 + astring@1.9.0: {} + + bail@2.0.2: {} + balanced-match@4.0.3: {} base64-js@1.5.1: optional: true + baseline-browser-mapping@2.10.0: {} + bash-tool@1.3.15(ai@6.0.97(zod@4.3.6))(just-bash@2.10.2): dependencies: ai: 6.0.97(zod@4.3.6) @@ -1901,19 +4584,47 @@ snapshots: cac@6.7.14: {} + caniuse-lite@1.0.30001777: {} + + ccount@2.0.1: {} + chai@6.2.2: {} chalk@5.6.2: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chokidar@4.0.3: dependencies: readdirp: 4.1.2 + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + chownr@1.1.4: optional: true + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + cli-width@4.1.0: {} + client-only@0.0.1: {} + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + comma-separated-tokens@2.0.3: {} + commander@14.0.3: {} commander@2.8.1: @@ -1927,6 +4638,8 @@ snapshots: amdefine: 1.0.1 commander: 2.8.1 + compute-scroll-into-view@3.1.1: {} + confbox@0.1.8: {} consola@3.4.2: {} @@ -1937,10 +4650,18 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cssesc@3.0.0: {} + + csstype@3.2.3: {} + debug@4.4.3: dependencies: ms: 2.1.3 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -1949,8 +4670,15 @@ snapshots: deep-extend@0.6.0: optional: true - detect-libc@2.1.2: - optional: true + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 diff@8.0.3: {} @@ -1959,8 +4687,29 @@ snapshots: once: 1.4.0 optional: true + enhanced-resolve@5.20.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@6.0.1: {} + es-module-lexer@1.7.0: {} + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.15.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + esbuild@0.27.3: optionalDependencies: '@esbuild/aix-ppc64': 0.27.3 @@ -1990,8 +4739,43 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 + escape-string-regexp@5.0.0: {} + esprima@4.0.1: {} + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-value-to-estree@3.5.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -2022,6 +4806,8 @@ snapshots: dependencies: is-extendable: 0.1.1 + extend@3.0.2: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2075,12 +4861,127 @@ snapshots: mlly: 1.8.0 rollup: 4.57.1 + framer-motion@12.35.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + motion-dom: 12.35.1 + motion-utils: 12.29.2 + tslib: 2.8.1 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + fs-constants@1.0.0: optional: true fsevents@2.3.3: optional: true + fumadocs-core@16.6.10(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6): + dependencies: + '@formatjs/intl-localematcher': 0.8.1 + '@orama/orama': 3.1.18 + '@shikijs/rehype': 4.0.1 + '@shikijs/transformers': 4.0.1 + estree-util-value-to-estree: 3.5.0 + github-slugger: 2.0.0 + hast-util-to-estree: 3.1.3 + hast-util-to-jsx-runtime: 2.3.6 + image-size: 2.0.2 + mdast-util-mdx: 3.0.0 + mdast-util-to-markdown: 2.1.2 + negotiator: 1.0.0 + npm-to-yarn: 3.0.1 + path-to-regexp: 8.3.0 + remark: 15.0.1 + remark-gfm: 4.0.1 + remark-rehype: 11.1.2 + scroll-into-view-if-needed: 3.1.0 + shiki: 4.0.1 + tinyglobby: 0.2.15 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + optionalDependencies: + '@mdx-js/mdx': 3.1.1 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.2.14 + lucide-react: 0.577.0(react@19.2.4) + next: 16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + zod: 4.3.6 + transitivePeerDependencies: + - supports-color + + fumadocs-mdx@14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.10(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(vite@7.3.1(@types/node@25.3.5)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + '@mdx-js/mdx': 3.1.1 + '@standard-schema/spec': 1.1.0 + chokidar: 5.0.0 + esbuild: 0.27.3 + estree-util-value-to-estree: 3.5.0 + fumadocs-core: 16.6.10(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + js-yaml: 4.1.1 + mdast-util-mdx: 3.0.0 + mdast-util-to-markdown: 2.1.2 + picocolors: 1.1.1 + picomatch: 4.0.3 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + zod: 4.3.6 + optionalDependencies: + '@types/mdast': 4.0.4 + '@types/mdx': 2.0.13 + '@types/react': 19.2.14 + next: 16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + vite: 7.3.1(@types/node@25.3.5)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + fumadocs-ui@16.6.10(@takumi-rs/image-response@0.70.4)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.10(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1): + dependencies: + '@fumadocs/tailwind': 0.0.3(tailwindcss@4.2.1) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + class-variance-authority: 0.7.1 + fumadocs-core: 16.6.10(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + lucide-react: 0.577.0(react@19.2.4) + motion: 12.35.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + next-themes: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-medium-image-zoom: 5.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + rehype-raw: 7.0.0 + scroll-into-view-if-needed: 3.1.0 + tailwind-merge: 3.5.0 + unist-util-visit: 5.1.0 + optionalDependencies: + '@takumi-rs/image-response': 0.70.4 + '@types/react': 19.2.14 + next: 16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - '@types/react-dom' + - tailwindcss + + get-nonce@1.0.1: {} + get-stream@9.0.1: dependencies: '@sec-ant/readable-stream': 0.4.1 @@ -2093,10 +4994,14 @@ snapshots: github-from-package@0.0.0: optional: true + github-slugger@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 + graceful-fs@4.2.11: {} + graceful-readlink@1.0.1: {} gray-matter@4.0.3: @@ -2108,12 +5013,128 @@ snapshots: has-flag@4.0.0: {} + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + html-escaper@2.0.2: {} + html-void-elements@3.0.0: {} + human-signals@8.0.1: {} ieee754@1.2.1: {} + image-size@2.0.2: {} + inherits@2.0.4: optional: true @@ -2122,6 +5143,17 @@ snapshots: ini@6.0.0: {} + inline-style-parser@0.2.7: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-decimal@2.0.1: {} + is-extendable@0.1.1: {} is-extglob@2.1.1: {} @@ -2130,88 +5162,582 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-number@7.0.0: {} is-plain-obj@4.1.0: {} - is-stream@4.0.1: {} + is-stream@4.0.1: {} + + is-unicode-supported@2.1.0: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jiti@2.6.1: {} + + joycon@3.1.1: {} + + js-tokens@10.0.0: {} + + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-schema@0.4.0: {} + + just-bash@2.10.2: + dependencies: + compressjs: 1.0.3 + diff: 8.0.3 + fast-xml-parser: 5.3.7 + file-type: 21.3.0 + ini: 6.0.0 + minimatch: 10.2.2 + modern-tar: 0.7.4 + papaparse: 5.5.3 + pyodide: 0.27.7 + re2js: 1.2.2 + smol-toml: 1.6.0 + sprintf-js: 1.1.3 + sql.js: 1.14.0 + turndown: 7.2.2 + yaml: 2.8.2 + optionalDependencies: + '@mongodb-js/zstd': 7.0.0 + node-liblzma: 2.2.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + kind-of@6.0.3: {} + + lightningcss-android-arm64@1.31.1: + optional: true + + lightningcss-darwin-arm64@1.31.1: + optional: true + + lightningcss-darwin-x64@1.31.1: + optional: true + + lightningcss-freebsd-x64@1.31.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.31.1: + optional: true + + lightningcss-linux-arm64-gnu@1.31.1: + optional: true + + lightningcss-linux-arm64-musl@1.31.1: + optional: true + + lightningcss-linux-x64-gnu@1.31.1: + optional: true + + lightningcss-linux-x64-musl@1.31.1: + optional: true + + lightningcss-win32-arm64-msvc@1.31.1: + optional: true + + lightningcss-win32-x64-msvc@1.31.1: + optional: true + + lightningcss@1.31.1: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.31.1 + lightningcss-darwin-arm64: 1.31.1 + lightningcss-darwin-x64: 1.31.1 + lightningcss-freebsd-x64: 1.31.1 + lightningcss-linux-arm-gnueabihf: 1.31.1 + lightningcss-linux-arm64-gnu: 1.31.1 + lightningcss-linux-arm64-musl: 1.31.1 + lightningcss-linux-x64-gnu: 1.31.1 + lightningcss-linux-x64-musl: 1.31.1 + lightningcss-win32-arm64-msvc: 1.31.1 + lightningcss-win32-x64-msvc: 1.31.1 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + longest-streak@3.1.0: {} + + lucide-react@0.577.0(react@19.2.4): + dependencies: + react: 19.2.4 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.2: + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.4 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - is-unicode-supported@2.1.0: {} + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - isexe@2.0.0: {} + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 - istanbul-lib-coverage@3.2.2: {} + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - istanbul-lib-report@3.0.1: + micromark-factory-whitespace@2.0.1: dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - istanbul-reports@3.2.0: + micromark-util-character@2.1.1: dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - joycon@3.1.1: {} + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 - js-tokens@10.0.0: {} + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - js-yaml@3.14.2: + micromark-util-combine-extensions@2.0.1: dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 - json-schema@0.4.0: {} + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 - just-bash@2.10.2: + micromark-util-decode-string@2.0.1: dependencies: - compressjs: 1.0.3 - diff: 8.0.3 - fast-xml-parser: 5.3.7 - file-type: 21.3.0 - ini: 6.0.0 - minimatch: 10.2.2 - modern-tar: 0.7.4 - papaparse: 5.5.3 - pyodide: 0.27.7 - re2js: 1.2.2 - smol-toml: 1.6.0 - sprintf-js: 1.1.3 - sql.js: 1.14.0 - turndown: 7.2.2 - yaml: 2.8.2 - optionalDependencies: - '@mongodb-js/zstd': 7.0.0 - node-liblzma: 2.2.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - kind-of@6.0.3: {} + micromark-util-encode@2.0.1: {} - lilconfig@3.1.3: {} + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 - lines-and-columns@1.2.4: {} + micromark-util-html-tag-name@2.0.1: {} - load-tsconfig@0.2.5: {} + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 - magic-string@0.30.21: + micromark-util-resolve-all@2.0.1: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + micromark-util-types: 2.0.2 - magicast@0.5.2: + micromark-util-sanitize-uri@2.0.1: dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - source-map-js: 1.2.1 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - make-dir@4.0.0: + micromark-util-subtokenize@2.1.0: dependencies: - semver: 7.7.4 + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - merge2@1.4.1: {} + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color micromatch@4.0.8: dependencies: @@ -2240,6 +5766,20 @@ snapshots: modern-tar@0.7.4: {} + motion-dom@12.35.1: + dependencies: + motion-utils: 12.29.2 + + motion-utils@12.29.2: {} + + motion@12.35.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + framer-motion: 12.35.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + tslib: 2.8.1 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + ms@2.1.3: {} mute-stream@3.0.0: {} @@ -2255,6 +5795,38 @@ snapshots: napi-build-utils@2.0.0: optional: true + negotiator@1.0.0: {} + + next-themes@0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@next/env': 16.1.6 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.10.0 + caniuse-lite: 1.0.30001777 + postcss: 8.4.31 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(react@19.2.4) + optionalDependencies: + '@next/swc-darwin-arm64': 16.1.6 + '@next/swc-darwin-x64': 16.1.6 + '@next/swc-linux-arm64-gnu': 16.1.6 + '@next/swc-linux-arm64-musl': 16.1.6 + '@next/swc-linux-x64-gnu': 16.1.6 + '@next/swc-linux-x64-musl': 16.1.6 + '@next/swc-win32-arm64-msvc': 16.1.6 + '@next/swc-win32-x64-msvc': 16.1.6 + '@opentelemetry/api': 1.9.0 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + node-abi@3.87.0: dependencies: semver: 7.7.4 @@ -2277,6 +5849,8 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 + npm-to-yarn@3.0.1: {} + object-assign@4.1.1: {} obug@2.1.1: {} @@ -2286,14 +5860,38 @@ snapshots: wrappy: 1.0.2 optional: true + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + papaparse@5.5.3: {} + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-ms@4.0.0: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 + path-key@3.1.1: {} path-key@4.0.0: {} + path-to-regexp@8.3.0: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -2310,15 +5908,27 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 - postcss-load-config@6.0.1(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.2): dependencies: lilconfig: 3.1.3 optionalDependencies: - postcss: 8.5.6 + jiti: 2.6.1 + postcss: 8.5.8 tsx: 4.21.0 yaml: 2.8.2 - postcss@8.5.6: + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -2344,6 +5954,8 @@ snapshots: dependencies: parse-ms: 4.0.0 + property-information@7.1.0: {} + pump@3.0.3: dependencies: end-of-stream: 1.4.5 @@ -2369,6 +5981,45 @@ snapshots: re2js@1.2.2: {} + react-dom@19.2.4(react@19.2.4): + dependencies: + react: 19.2.4 + scheduler: 0.27.0 + + react-medium-image-zoom@5.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + + react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + get-nonce: 1.0.1 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + react@19.2.4: {} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -2378,6 +6029,111 @@ snapshots: readdirp@4.1.2: {} + readdirp@5.0.0: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.8 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -2422,6 +6178,12 @@ snapshots: safe-buffer@5.2.1: optional: true + scheduler@0.27.0: {} + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 @@ -2429,12 +6191,55 @@ snapshots: semver@7.7.4: {} + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + shiki@4.0.1: + dependencies: + '@shikijs/core': 4.0.1 + '@shikijs/engine-javascript': 4.0.1 + '@shikijs/engine-oniguruma': 4.0.1 + '@shikijs/langs': 4.0.1 + '@shikijs/themes': 4.0.1 + '@shikijs/types': 4.0.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -2455,6 +6260,8 @@ snapshots: source-map@0.7.6: {} + space-separated-tokens@2.0.2: {} + sprintf-js@1.0.3: {} sprintf-js@1.1.3: {} @@ -2470,6 +6277,11 @@ snapshots: safe-buffer: 5.2.1 optional: true + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-bom-string@1.0.0: {} strip-final-newline@4.0.0: {} @@ -2483,6 +6295,19 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + + styled-jsx@5.1.6(react@19.2.4): + dependencies: + client-only: 0.0.1 + react: 19.2.4 + sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -2497,6 +6322,12 @@ snapshots: dependencies: has-flag: 4.0.0 + tailwind-merge@3.5.0: {} + + tailwindcss@4.2.1: {} + + tapable@2.3.0: {} + tar-fs@2.1.4: dependencies: chownr: 1.1.4 @@ -2547,9 +6378,15 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + ts-interface-checker@0.1.13: {} - tsup@8.5.1(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): + tslib@2.8.1: {} + + tsup@8.5.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.27.3) cac: 6.7.14 @@ -2560,7 +6397,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.2) resolve-from: 5.0.0 rollup: 4.57.1 source-map: 0.7.6 @@ -2569,7 +6406,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.6 + postcss: 8.5.8 typescript: 5.9.3 transitivePeerDependencies: - jiti @@ -2589,6 +6426,33 @@ snapshots: safe-buffer: 5.2.1 optional: true + turbo-darwin-64@2.8.14: + optional: true + + turbo-darwin-arm64@2.8.14: + optional: true + + turbo-linux-64@2.8.14: + optional: true + + turbo-linux-arm64@2.8.14: + optional: true + + turbo-windows-64@2.8.14: + optional: true + + turbo-windows-arm64@2.8.14: + optional: true + + turbo@2.8.14: + optionalDependencies: + turbo-darwin-64: 2.8.14 + turbo-darwin-arm64: 2.8.14 + turbo-linux-64: 2.8.14 + turbo-linux-arm64: 2.8.14 + turbo-windows-64: 2.8.14 + turbo-windows-arm64: 2.8.14 + turndown@7.2.2: dependencies: '@mixmark-io/domino': 2.2.0 @@ -2601,29 +6465,121 @@ snapshots: undici-types@7.16.0: {} + undici-types@7.18.2: {} + unicorn-magic@0.3.0: {} - util-deprecate@1.0.2: - optional: true + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + util-deprecate@1.0.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 - vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2): + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 + postcss: 8.5.8 rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 25.2.3 fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.31.1 + tsx: 4.21.0 + yaml: 2.8.2 + + vite@7.3.1(@types/node@25.3.5)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.8 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.3.5 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.31.1 tsx: 4.21.0 yaml: 2.8.2 + optional: true - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -2640,7 +6596,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -2658,6 +6614,8 @@ snapshots: - tsx - yaml + web-namespaces@2.0.1: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -2679,3 +6637,5 @@ snapshots: zod@3.25.76: {} zod@4.3.6: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 06ac931..4917109 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - - . + - 'apps/*' + - 'packages/*' onlyBuiltDependencies: - esbuild diff --git a/tsconfig.json b/tsconfig.json index c46936b..a5e9123 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,8 +3,6 @@ "target": "ES2022", "module": "ESNext", "moduleResolution": "Bundler", - "outDir": "./dist", - "rootDir": ".", "strict": true, "esModuleInterop": true, "skipLibCheck": true, @@ -14,7 +12,5 @@ "declarationMap": true, "sourceMap": true, "verbatimModuleSyntax": true - }, - "include": ["src/**/*", "test/**/*"], - "exclude": ["node_modules", "dist"] + } } diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..3d8294b --- /dev/null +++ b/turbo.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://turborepo.dev/schema.json", + "ui": "tui", + "tasks": { + "build": { + "dependsOn": ["^build"], + "outputs": ["dist/**", ".next/**"] + }, + "typecheck": { + "dependsOn": ["^build"] + }, + "test": { + "dependsOn": ["build"], + "outputs": [] + }, + "test:coverage": { + "dependsOn": ["build"], + "outputs": ["coverage/**"] + }, + "dev": { + "cache": false, + "persistent": true + } + } +} From fd1e42fe25ec0df12fc650090a16add25b7f2928 Mon Sep 17 00:00:00 2001 From: Daniel Wise Date: Sat, 7 Mar 2026 22:22:02 -0800 Subject: [PATCH 2/3] feat(docs): build out docs site and custom theme Expand the docs site content and navigation, add the custom shadcn/Fumadocs theme used across the landing and docs pages, and include the sidebar deduplication plus local stale-build recovery guardrails. --- .agents/skills/playwright-cli/SKILL.md | 278 ++++++++++++++++++ .../references/request-mocking.md | 87 ++++++ .../playwright-cli/references/running-code.md | 232 +++++++++++++++ .../references/session-management.md | 169 +++++++++++ .../references/storage-state.md | 275 +++++++++++++++++ .../references/test-generation.md | 88 ++++++ .../playwright-cli/references/tracing.md | 139 +++++++++ .../references/video-recording.md | 43 +++ .beads/dolt-monitor.pid.lock | 0 .claude/skills/playwright-cli | 1 + .gitignore | 1 + apps/docs/README.md | 9 + apps/docs/content/docs/commands/checkout.mdx | 66 ++++- apps/docs/content/docs/commands/create.mdx | 53 +++- apps/docs/content/docs/commands/doctor.mdx | 99 ++++++- apps/docs/content/docs/commands/log.mdx | 47 ++- apps/docs/content/docs/commands/meta.json | 11 +- apps/docs/content/docs/commands/modify.mdx | 53 +++- apps/docs/content/docs/commands/submit.mdx | 45 +-- apps/docs/content/docs/commands/sync.mdx | 44 ++- apps/docs/content/docs/commands/track.mdx | 60 ++++ apps/docs/content/docs/commands/undo.mdx | 34 ++- .../docs/contributing/agent-skills.mdx | 67 ++++- .../content/docs/contributing/development.mdx | 75 +++-- .../content/docs/contributing/testing.mdx | 2 + .../docs/getting-started/installation.mdx | 30 +- .../docs/getting-started/quickstart.mdx | 147 ++++++++- .../docs/content/docs/guides/ai-assistant.mdx | 81 ++++- .../docs/guides/conflict-resolution.mdx | 55 +++- .../docs/guides/migration-from-graphite.mdx | 36 ++- .../content/docs/guides/stacking-workflow.mdx | 174 ++++++++++- apps/docs/content/docs/index.mdx | 147 ++++++++- apps/docs/content/docs/meta.json | 5 - apps/docs/package.json | 3 + apps/docs/src/app/(home)/layout.tsx | 3 +- apps/docs/src/app/(home)/page.tsx | 183 +++++++++++- apps/docs/src/app/docs/[[...slug]]/page.tsx | 3 +- apps/docs/src/app/docs/layout.tsx | 3 +- apps/docs/src/app/global.css | 112 +++++++ apps/docs/src/app/layout.tsx | 73 ++++- apps/docs/src/app/og/docs/[...slug]/route.tsx | 2 +- apps/docs/src/lib/layout.shared.tsx | 24 +- apps/docs/test/meta.test.mjs | 15 + apps/docs/test/package-scripts.test.mjs | 21 ++ skills-lock.json | 5 + 45 files changed, 2863 insertions(+), 237 deletions(-) create mode 100644 .agents/skills/playwright-cli/SKILL.md create mode 100644 .agents/skills/playwright-cli/references/request-mocking.md create mode 100644 .agents/skills/playwright-cli/references/running-code.md create mode 100644 .agents/skills/playwright-cli/references/session-management.md create mode 100644 .agents/skills/playwright-cli/references/storage-state.md create mode 100644 .agents/skills/playwright-cli/references/test-generation.md create mode 100644 .agents/skills/playwright-cli/references/tracing.md create mode 100644 .agents/skills/playwright-cli/references/video-recording.md delete mode 100644 .beads/dolt-monitor.pid.lock create mode 120000 .claude/skills/playwright-cli create mode 100644 apps/docs/content/docs/commands/track.mdx create mode 100644 apps/docs/test/meta.test.mjs create mode 100644 apps/docs/test/package-scripts.test.mjs diff --git a/.agents/skills/playwright-cli/SKILL.md b/.agents/skills/playwright-cli/SKILL.md new file mode 100644 index 0000000..11bad2b --- /dev/null +++ b/.agents/skills/playwright-cli/SKILL.md @@ -0,0 +1,278 @@ +--- +name: playwright-cli +description: Automates browser interactions for web testing, form filling, screenshots, and data extraction. Use when the user needs to navigate websites, interact with web pages, fill forms, take screenshots, test web applications, or extract information from web pages. +allowed-tools: Bash(playwright-cli:*) +--- + +# Browser Automation with playwright-cli + +## Quick start + +```bash +# open new browser +playwright-cli open +# navigate to a page +playwright-cli goto https://playwright.dev +# interact with the page using refs from the snapshot +playwright-cli click e15 +playwright-cli type "page.click" +playwright-cli press Enter +# take a screenshot (rarely used, as snapshot is more common) +playwright-cli screenshot +# close the browser +playwright-cli close +``` + +## Commands + +### Core + +```bash +playwright-cli open +# open and navigate right away +playwright-cli open https://example.com/ +playwright-cli goto https://playwright.dev +playwright-cli type "search query" +playwright-cli click e3 +playwright-cli dblclick e7 +playwright-cli fill e5 "user@example.com" +playwright-cli drag e2 e8 +playwright-cli hover e4 +playwright-cli select e9 "option-value" +playwright-cli upload ./document.pdf +playwright-cli check e12 +playwright-cli uncheck e12 +playwright-cli snapshot +playwright-cli snapshot --filename=after-click.yaml +playwright-cli eval "document.title" +playwright-cli eval "el => el.textContent" e5 +playwright-cli dialog-accept +playwright-cli dialog-accept "confirmation text" +playwright-cli dialog-dismiss +playwright-cli resize 1920 1080 +playwright-cli close +``` + +### Navigation + +```bash +playwright-cli go-back +playwright-cli go-forward +playwright-cli reload +``` + +### Keyboard + +```bash +playwright-cli press Enter +playwright-cli press ArrowDown +playwright-cli keydown Shift +playwright-cli keyup Shift +``` + +### Mouse + +```bash +playwright-cli mousemove 150 300 +playwright-cli mousedown +playwright-cli mousedown right +playwright-cli mouseup +playwright-cli mouseup right +playwright-cli mousewheel 0 100 +``` + +### Save as + +```bash +playwright-cli screenshot +playwright-cli screenshot e5 +playwright-cli screenshot --filename=page.png +playwright-cli pdf --filename=page.pdf +``` + +### Tabs + +```bash +playwright-cli tab-list +playwright-cli tab-new +playwright-cli tab-new https://example.com/page +playwright-cli tab-close +playwright-cli tab-close 2 +playwright-cli tab-select 0 +``` + +### Storage + +```bash +playwright-cli state-save +playwright-cli state-save auth.json +playwright-cli state-load auth.json + +# Cookies +playwright-cli cookie-list +playwright-cli cookie-list --domain=example.com +playwright-cli cookie-get session_id +playwright-cli cookie-set session_id abc123 +playwright-cli cookie-set session_id abc123 --domain=example.com --httpOnly --secure +playwright-cli cookie-delete session_id +playwright-cli cookie-clear + +# LocalStorage +playwright-cli localstorage-list +playwright-cli localstorage-get theme +playwright-cli localstorage-set theme dark +playwright-cli localstorage-delete theme +playwright-cli localstorage-clear + +# SessionStorage +playwright-cli sessionstorage-list +playwright-cli sessionstorage-get step +playwright-cli sessionstorage-set step 3 +playwright-cli sessionstorage-delete step +playwright-cli sessionstorage-clear +``` + +### Network + +```bash +playwright-cli route "**/*.jpg" --status=404 +playwright-cli route "https://api.example.com/**" --body='{"mock": true}' +playwright-cli route-list +playwright-cli unroute "**/*.jpg" +playwright-cli unroute +``` + +### DevTools + +```bash +playwright-cli console +playwright-cli console warning +playwright-cli network +playwright-cli run-code "async page => await page.context().grantPermissions(['geolocation'])" +playwright-cli tracing-start +playwright-cli tracing-stop +playwright-cli video-start +playwright-cli video-stop video.webm +``` + +## Open parameters +```bash +# Use specific browser when creating session +playwright-cli open --browser=chrome +playwright-cli open --browser=firefox +playwright-cli open --browser=webkit +playwright-cli open --browser=msedge +# Connect to browser via extension +playwright-cli open --extension + +# Use persistent profile (by default profile is in-memory) +playwright-cli open --persistent +# Use persistent profile with custom directory +playwright-cli open --profile=/path/to/profile + +# Start with config file +playwright-cli open --config=my-config.json + +# Close the browser +playwright-cli close +# Delete user data for the default session +playwright-cli delete-data +``` + +## Snapshots + +After each command, playwright-cli provides a snapshot of the current browser state. + +```bash +> playwright-cli goto https://example.com +### Page +- Page URL: https://example.com/ +- Page Title: Example Domain +### Snapshot +[Snapshot](.playwright-cli/page-2026-02-14T19-22-42-679Z.yml) +``` + +You can also take a snapshot on demand using `playwright-cli snapshot` command. + +If `--filename` is not provided, a new snapshot file is created with a timestamp. Default to automatic file naming, use `--filename=` when artifact is a part of the workflow result. + +## Browser Sessions + +```bash +# create new browser session named "mysession" with persistent profile +playwright-cli -s=mysession open example.com --persistent +# same with manually specified profile directory (use when requested explicitly) +playwright-cli -s=mysession open example.com --profile=/path/to/profile +playwright-cli -s=mysession click e6 +playwright-cli -s=mysession close # stop a named browser +playwright-cli -s=mysession delete-data # delete user data for persistent session + +playwright-cli list +# Close all browsers +playwright-cli close-all +# Forcefully kill all browser processes +playwright-cli kill-all +``` + +## Local installation + +In some cases user might want to install playwright-cli locally. If running globally available `playwright-cli` binary fails, use `npx playwright-cli` to run the commands. For example: + +```bash +npx playwright-cli open https://example.com +npx playwright-cli click e1 +``` + +## Example: Form submission + +```bash +playwright-cli open https://example.com/form +playwright-cli snapshot + +playwright-cli fill e1 "user@example.com" +playwright-cli fill e2 "password123" +playwright-cli click e3 +playwright-cli snapshot +playwright-cli close +``` + +## Example: Multi-tab workflow + +```bash +playwright-cli open https://example.com +playwright-cli tab-new https://example.com/other +playwright-cli tab-list +playwright-cli tab-select 0 +playwright-cli snapshot +playwright-cli close +``` + +## Example: Debugging with DevTools + +```bash +playwright-cli open https://example.com +playwright-cli click e4 +playwright-cli fill e7 "test" +playwright-cli console +playwright-cli network +playwright-cli close +``` + +```bash +playwright-cli open https://example.com +playwright-cli tracing-start +playwright-cli click e4 +playwright-cli fill e7 "test" +playwright-cli tracing-stop +playwright-cli close +``` + +## Specific tasks + +* **Request mocking** [references/request-mocking.md](references/request-mocking.md) +* **Running Playwright code** [references/running-code.md](references/running-code.md) +* **Browser session management** [references/session-management.md](references/session-management.md) +* **Storage state (cookies, localStorage)** [references/storage-state.md](references/storage-state.md) +* **Test generation** [references/test-generation.md](references/test-generation.md) +* **Tracing** [references/tracing.md](references/tracing.md) +* **Video recording** [references/video-recording.md](references/video-recording.md) diff --git a/.agents/skills/playwright-cli/references/request-mocking.md b/.agents/skills/playwright-cli/references/request-mocking.md new file mode 100644 index 0000000..9005fda --- /dev/null +++ b/.agents/skills/playwright-cli/references/request-mocking.md @@ -0,0 +1,87 @@ +# Request Mocking + +Intercept, mock, modify, and block network requests. + +## CLI Route Commands + +```bash +# Mock with custom status +playwright-cli route "**/*.jpg" --status=404 + +# Mock with JSON body +playwright-cli route "**/api/users" --body='[{"id":1,"name":"Alice"}]' --content-type=application/json + +# Mock with custom headers +playwright-cli route "**/api/data" --body='{"ok":true}' --header="X-Custom: value" + +# Remove headers from requests +playwright-cli route "**/*" --remove-header=cookie,authorization + +# List active routes +playwright-cli route-list + +# Remove a route or all routes +playwright-cli unroute "**/*.jpg" +playwright-cli unroute +``` + +## URL Patterns + +``` +**/api/users - Exact path match +**/api/*/details - Wildcard in path +**/*.{png,jpg,jpeg} - Match file extensions +**/search?q=* - Match query parameters +``` + +## Advanced Mocking with run-code + +For conditional responses, request body inspection, response modification, or delays: + +### Conditional Response Based on Request + +```bash +playwright-cli run-code "async page => { + await page.route('**/api/login', route => { + const body = route.request().postDataJSON(); + if (body.username === 'admin') { + route.fulfill({ body: JSON.stringify({ token: 'mock-token' }) }); + } else { + route.fulfill({ status: 401, body: JSON.stringify({ error: 'Invalid' }) }); + } + }); +}" +``` + +### Modify Real Response + +```bash +playwright-cli run-code "async page => { + await page.route('**/api/user', async route => { + const response = await route.fetch(); + const json = await response.json(); + json.isPremium = true; + await route.fulfill({ response, json }); + }); +}" +``` + +### Simulate Network Failures + +```bash +playwright-cli run-code "async page => { + await page.route('**/api/offline', route => route.abort('internetdisconnected')); +}" +# Options: connectionrefused, timedout, connectionreset, internetdisconnected +``` + +### Delayed Response + +```bash +playwright-cli run-code "async page => { + await page.route('**/api/slow', async route => { + await new Promise(r => setTimeout(r, 3000)); + route.fulfill({ body: JSON.stringify({ data: 'loaded' }) }); + }); +}" +``` diff --git a/.agents/skills/playwright-cli/references/running-code.md b/.agents/skills/playwright-cli/references/running-code.md new file mode 100644 index 0000000..7d6d22f --- /dev/null +++ b/.agents/skills/playwright-cli/references/running-code.md @@ -0,0 +1,232 @@ +# Running Custom Playwright Code + +Use `run-code` to execute arbitrary Playwright code for advanced scenarios not covered by CLI commands. + +## Syntax + +```bash +playwright-cli run-code "async page => { + // Your Playwright code here + // Access page.context() for browser context operations +}" +``` + +## Geolocation + +```bash +# Grant geolocation permission and set location +playwright-cli run-code "async page => { + await page.context().grantPermissions(['geolocation']); + await page.context().setGeolocation({ latitude: 37.7749, longitude: -122.4194 }); +}" + +# Set location to London +playwright-cli run-code "async page => { + await page.context().grantPermissions(['geolocation']); + await page.context().setGeolocation({ latitude: 51.5074, longitude: -0.1278 }); +}" + +# Clear geolocation override +playwright-cli run-code "async page => { + await page.context().clearPermissions(); +}" +``` + +## Permissions + +```bash +# Grant multiple permissions +playwright-cli run-code "async page => { + await page.context().grantPermissions([ + 'geolocation', + 'notifications', + 'camera', + 'microphone' + ]); +}" + +# Grant permissions for specific origin +playwright-cli run-code "async page => { + await page.context().grantPermissions(['clipboard-read'], { + origin: 'https://example.com' + }); +}" +``` + +## Media Emulation + +```bash +# Emulate dark color scheme +playwright-cli run-code "async page => { + await page.emulateMedia({ colorScheme: 'dark' }); +}" + +# Emulate light color scheme +playwright-cli run-code "async page => { + await page.emulateMedia({ colorScheme: 'light' }); +}" + +# Emulate reduced motion +playwright-cli run-code "async page => { + await page.emulateMedia({ reducedMotion: 'reduce' }); +}" + +# Emulate print media +playwright-cli run-code "async page => { + await page.emulateMedia({ media: 'print' }); +}" +``` + +## Wait Strategies + +```bash +# Wait for network idle +playwright-cli run-code "async page => { + await page.waitForLoadState('networkidle'); +}" + +# Wait for specific element +playwright-cli run-code "async page => { + await page.waitForSelector('.loading', { state: 'hidden' }); +}" + +# Wait for function to return true +playwright-cli run-code "async page => { + await page.waitForFunction(() => window.appReady === true); +}" + +# Wait with timeout +playwright-cli run-code "async page => { + await page.waitForSelector('.result', { timeout: 10000 }); +}" +``` + +## Frames and Iframes + +```bash +# Work with iframe +playwright-cli run-code "async page => { + const frame = page.locator('iframe#my-iframe').contentFrame(); + await frame.locator('button').click(); +}" + +# Get all frames +playwright-cli run-code "async page => { + const frames = page.frames(); + return frames.map(f => f.url()); +}" +``` + +## File Downloads + +```bash +# Handle file download +playwright-cli run-code "async page => { + const [download] = await Promise.all([ + page.waitForEvent('download'), + page.click('a.download-link') + ]); + await download.saveAs('./downloaded-file.pdf'); + return download.suggestedFilename(); +}" +``` + +## Clipboard + +```bash +# Read clipboard (requires permission) +playwright-cli run-code "async page => { + await page.context().grantPermissions(['clipboard-read']); + return await page.evaluate(() => navigator.clipboard.readText()); +}" + +# Write to clipboard +playwright-cli run-code "async page => { + await page.evaluate(text => navigator.clipboard.writeText(text), 'Hello clipboard!'); +}" +``` + +## Page Information + +```bash +# Get page title +playwright-cli run-code "async page => { + return await page.title(); +}" + +# Get current URL +playwright-cli run-code "async page => { + return page.url(); +}" + +# Get page content +playwright-cli run-code "async page => { + return await page.content(); +}" + +# Get viewport size +playwright-cli run-code "async page => { + return page.viewportSize(); +}" +``` + +## JavaScript Execution + +```bash +# Execute JavaScript and return result +playwright-cli run-code "async page => { + return await page.evaluate(() => { + return { + userAgent: navigator.userAgent, + language: navigator.language, + cookiesEnabled: navigator.cookieEnabled + }; + }); +}" + +# Pass arguments to evaluate +playwright-cli run-code "async page => { + const multiplier = 5; + return await page.evaluate(m => document.querySelectorAll('li').length * m, multiplier); +}" +``` + +## Error Handling + +```bash +# Try-catch in run-code +playwright-cli run-code "async page => { + try { + await page.click('.maybe-missing', { timeout: 1000 }); + return 'clicked'; + } catch (e) { + return 'element not found'; + } +}" +``` + +## Complex Workflows + +```bash +# Login and save state +playwright-cli run-code "async page => { + await page.goto('https://example.com/login'); + await page.fill('input[name=email]', 'user@example.com'); + await page.fill('input[name=password]', 'secret'); + await page.click('button[type=submit]'); + await page.waitForURL('**/dashboard'); + await page.context().storageState({ path: 'auth.json' }); + return 'Login successful'; +}" + +# Scrape data from multiple pages +playwright-cli run-code "async page => { + const results = []; + for (let i = 1; i <= 3; i++) { + await page.goto(\`https://example.com/page/\${i}\`); + const items = await page.locator('.item').allTextContents(); + results.push(...items); + } + return results; +}" +``` diff --git a/.agents/skills/playwright-cli/references/session-management.md b/.agents/skills/playwright-cli/references/session-management.md new file mode 100644 index 0000000..fac9606 --- /dev/null +++ b/.agents/skills/playwright-cli/references/session-management.md @@ -0,0 +1,169 @@ +# Browser Session Management + +Run multiple isolated browser sessions concurrently with state persistence. + +## Named Browser Sessions + +Use `-s` flag to isolate browser contexts: + +```bash +# Browser 1: Authentication flow +playwright-cli -s=auth open https://app.example.com/login + +# Browser 2: Public browsing (separate cookies, storage) +playwright-cli -s=public open https://example.com + +# Commands are isolated by browser session +playwright-cli -s=auth fill e1 "user@example.com" +playwright-cli -s=public snapshot +``` + +## Browser Session Isolation Properties + +Each browser session has independent: +- Cookies +- LocalStorage / SessionStorage +- IndexedDB +- Cache +- Browsing history +- Open tabs + +## Browser Session Commands + +```bash +# List all browser sessions +playwright-cli list + +# Stop a browser session (close the browser) +playwright-cli close # stop the default browser +playwright-cli -s=mysession close # stop a named browser + +# Stop all browser sessions +playwright-cli close-all + +# Forcefully kill all daemon processes (for stale/zombie processes) +playwright-cli kill-all + +# Delete browser session user data (profile directory) +playwright-cli delete-data # delete default browser data +playwright-cli -s=mysession delete-data # delete named browser data +``` + +## Environment Variable + +Set a default browser session name via environment variable: + +```bash +export PLAYWRIGHT_CLI_SESSION="mysession" +playwright-cli open example.com # Uses "mysession" automatically +``` + +## Common Patterns + +### Concurrent Scraping + +```bash +#!/bin/bash +# Scrape multiple sites concurrently + +# Start all browsers +playwright-cli -s=site1 open https://site1.com & +playwright-cli -s=site2 open https://site2.com & +playwright-cli -s=site3 open https://site3.com & +wait + +# Take snapshots from each +playwright-cli -s=site1 snapshot +playwright-cli -s=site2 snapshot +playwright-cli -s=site3 snapshot + +# Cleanup +playwright-cli close-all +``` + +### A/B Testing Sessions + +```bash +# Test different user experiences +playwright-cli -s=variant-a open "https://app.com?variant=a" +playwright-cli -s=variant-b open "https://app.com?variant=b" + +# Compare +playwright-cli -s=variant-a screenshot +playwright-cli -s=variant-b screenshot +``` + +### Persistent Profile + +By default, browser profile is kept in memory only. Use `--persistent` flag on `open` to persist the browser profile to disk: + +```bash +# Use persistent profile (auto-generated location) +playwright-cli open https://example.com --persistent + +# Use persistent profile with custom directory +playwright-cli open https://example.com --profile=/path/to/profile +``` + +## Default Browser Session + +When `-s` is omitted, commands use the default browser session: + +```bash +# These use the same default browser session +playwright-cli open https://example.com +playwright-cli snapshot +playwright-cli close # Stops default browser +``` + +## Browser Session Configuration + +Configure a browser session with specific settings when opening: + +```bash +# Open with config file +playwright-cli open https://example.com --config=.playwright/my-cli.json + +# Open with specific browser +playwright-cli open https://example.com --browser=firefox + +# Open in headed mode +playwright-cli open https://example.com --headed + +# Open with persistent profile +playwright-cli open https://example.com --persistent +``` + +## Best Practices + +### 1. Name Browser Sessions Semantically + +```bash +# GOOD: Clear purpose +playwright-cli -s=github-auth open https://github.com +playwright-cli -s=docs-scrape open https://docs.example.com + +# AVOID: Generic names +playwright-cli -s=s1 open https://github.com +``` + +### 2. Always Clean Up + +```bash +# Stop browsers when done +playwright-cli -s=auth close +playwright-cli -s=scrape close + +# Or stop all at once +playwright-cli close-all + +# If browsers become unresponsive or zombie processes remain +playwright-cli kill-all +``` + +### 3. Delete Stale Browser Data + +```bash +# Remove old browser data to free disk space +playwright-cli -s=oldsession delete-data +``` diff --git a/.agents/skills/playwright-cli/references/storage-state.md b/.agents/skills/playwright-cli/references/storage-state.md new file mode 100644 index 0000000..c856db5 --- /dev/null +++ b/.agents/skills/playwright-cli/references/storage-state.md @@ -0,0 +1,275 @@ +# Storage Management + +Manage cookies, localStorage, sessionStorage, and browser storage state. + +## Storage State + +Save and restore complete browser state including cookies and storage. + +### Save Storage State + +```bash +# Save to auto-generated filename (storage-state-{timestamp}.json) +playwright-cli state-save + +# Save to specific filename +playwright-cli state-save my-auth-state.json +``` + +### Restore Storage State + +```bash +# Load storage state from file +playwright-cli state-load my-auth-state.json + +# Reload page to apply cookies +playwright-cli open https://example.com +``` + +### Storage State File Format + +The saved file contains: + +```json +{ + "cookies": [ + { + "name": "session_id", + "value": "abc123", + "domain": "example.com", + "path": "/", + "expires": 1735689600, + "httpOnly": true, + "secure": true, + "sameSite": "Lax" + } + ], + "origins": [ + { + "origin": "https://example.com", + "localStorage": [ + { "name": "theme", "value": "dark" }, + { "name": "user_id", "value": "12345" } + ] + } + ] +} +``` + +## Cookies + +### List All Cookies + +```bash +playwright-cli cookie-list +``` + +### Filter Cookies by Domain + +```bash +playwright-cli cookie-list --domain=example.com +``` + +### Filter Cookies by Path + +```bash +playwright-cli cookie-list --path=/api +``` + +### Get Specific Cookie + +```bash +playwright-cli cookie-get session_id +``` + +### Set a Cookie + +```bash +# Basic cookie +playwright-cli cookie-set session abc123 + +# Cookie with options +playwright-cli cookie-set session abc123 --domain=example.com --path=/ --httpOnly --secure --sameSite=Lax + +# Cookie with expiration (Unix timestamp) +playwright-cli cookie-set remember_me token123 --expires=1735689600 +``` + +### Delete a Cookie + +```bash +playwright-cli cookie-delete session_id +``` + +### Clear All Cookies + +```bash +playwright-cli cookie-clear +``` + +### Advanced: Multiple Cookies or Custom Options + +For complex scenarios like adding multiple cookies at once, use `run-code`: + +```bash +playwright-cli run-code "async page => { + await page.context().addCookies([ + { name: 'session_id', value: 'sess_abc123', domain: 'example.com', path: '/', httpOnly: true }, + { name: 'preferences', value: JSON.stringify({ theme: 'dark' }), domain: 'example.com', path: '/' } + ]); +}" +``` + +## Local Storage + +### List All localStorage Items + +```bash +playwright-cli localstorage-list +``` + +### Get Single Value + +```bash +playwright-cli localstorage-get token +``` + +### Set Value + +```bash +playwright-cli localstorage-set theme dark +``` + +### Set JSON Value + +```bash +playwright-cli localstorage-set user_settings '{"theme":"dark","language":"en"}' +``` + +### Delete Single Item + +```bash +playwright-cli localstorage-delete token +``` + +### Clear All localStorage + +```bash +playwright-cli localstorage-clear +``` + +### Advanced: Multiple Operations + +For complex scenarios like setting multiple values at once, use `run-code`: + +```bash +playwright-cli run-code "async page => { + await page.evaluate(() => { + localStorage.setItem('token', 'jwt_abc123'); + localStorage.setItem('user_id', '12345'); + localStorage.setItem('expires_at', Date.now() + 3600000); + }); +}" +``` + +## Session Storage + +### List All sessionStorage Items + +```bash +playwright-cli sessionstorage-list +``` + +### Get Single Value + +```bash +playwright-cli sessionstorage-get form_data +``` + +### Set Value + +```bash +playwright-cli sessionstorage-set step 3 +``` + +### Delete Single Item + +```bash +playwright-cli sessionstorage-delete step +``` + +### Clear sessionStorage + +```bash +playwright-cli sessionstorage-clear +``` + +## IndexedDB + +### List Databases + +```bash +playwright-cli run-code "async page => { + return await page.evaluate(async () => { + const databases = await indexedDB.databases(); + return databases; + }); +}" +``` + +### Delete Database + +```bash +playwright-cli run-code "async page => { + await page.evaluate(() => { + indexedDB.deleteDatabase('myDatabase'); + }); +}" +``` + +## Common Patterns + +### Authentication State Reuse + +```bash +# Step 1: Login and save state +playwright-cli open https://app.example.com/login +playwright-cli snapshot +playwright-cli fill e1 "user@example.com" +playwright-cli fill e2 "password123" +playwright-cli click e3 + +# Save the authenticated state +playwright-cli state-save auth.json + +# Step 2: Later, restore state and skip login +playwright-cli state-load auth.json +playwright-cli open https://app.example.com/dashboard +# Already logged in! +``` + +### Save and Restore Roundtrip + +```bash +# Set up authentication state +playwright-cli open https://example.com +playwright-cli eval "() => { document.cookie = 'session=abc123'; localStorage.setItem('user', 'john'); }" + +# Save state to file +playwright-cli state-save my-session.json + +# ... later, in a new session ... + +# Restore state +playwright-cli state-load my-session.json +playwright-cli open https://example.com +# Cookies and localStorage are restored! +``` + +## Security Notes + +- Never commit storage state files containing auth tokens +- Add `*.auth-state.json` to `.gitignore` +- Delete state files after automation completes +- Use environment variables for sensitive data +- By default, sessions run in-memory mode which is safer for sensitive operations diff --git a/.agents/skills/playwright-cli/references/test-generation.md b/.agents/skills/playwright-cli/references/test-generation.md new file mode 100644 index 0000000..7a09df3 --- /dev/null +++ b/.agents/skills/playwright-cli/references/test-generation.md @@ -0,0 +1,88 @@ +# Test Generation + +Generate Playwright test code automatically as you interact with the browser. + +## How It Works + +Every action you perform with `playwright-cli` generates corresponding Playwright TypeScript code. +This code appears in the output and can be copied directly into your test files. + +## Example Workflow + +```bash +# Start a session +playwright-cli open https://example.com/login + +# Take a snapshot to see elements +playwright-cli snapshot +# Output shows: e1 [textbox "Email"], e2 [textbox "Password"], e3 [button "Sign In"] + +# Fill form fields - generates code automatically +playwright-cli fill e1 "user@example.com" +# Ran Playwright code: +# await page.getByRole('textbox', { name: 'Email' }).fill('user@example.com'); + +playwright-cli fill e2 "password123" +# Ran Playwright code: +# await page.getByRole('textbox', { name: 'Password' }).fill('password123'); + +playwright-cli click e3 +# Ran Playwright code: +# await page.getByRole('button', { name: 'Sign In' }).click(); +``` + +## Building a Test File + +Collect the generated code into a Playwright test: + +```typescript +import { test, expect } from '@playwright/test'; + +test('login flow', async ({ page }) => { + // Generated code from playwright-cli session: + await page.goto('https://example.com/login'); + await page.getByRole('textbox', { name: 'Email' }).fill('user@example.com'); + await page.getByRole('textbox', { name: 'Password' }).fill('password123'); + await page.getByRole('button', { name: 'Sign In' }).click(); + + // Add assertions + await expect(page).toHaveURL(/.*dashboard/); +}); +``` + +## Best Practices + +### 1. Use Semantic Locators + +The generated code uses role-based locators when possible, which are more resilient: + +```typescript +// Generated (good - semantic) +await page.getByRole('button', { name: 'Submit' }).click(); + +// Avoid (fragile - CSS selectors) +await page.locator('#submit-btn').click(); +``` + +### 2. Explore Before Recording + +Take snapshots to understand the page structure before recording actions: + +```bash +playwright-cli open https://example.com +playwright-cli snapshot +# Review the element structure +playwright-cli click e5 +``` + +### 3. Add Assertions Manually + +Generated code captures actions but not assertions. Add expectations in your test: + +```typescript +// Generated action +await page.getByRole('button', { name: 'Submit' }).click(); + +// Manual assertion +await expect(page.getByText('Success')).toBeVisible(); +``` diff --git a/.agents/skills/playwright-cli/references/tracing.md b/.agents/skills/playwright-cli/references/tracing.md new file mode 100644 index 0000000..7ce7bab --- /dev/null +++ b/.agents/skills/playwright-cli/references/tracing.md @@ -0,0 +1,139 @@ +# Tracing + +Capture detailed execution traces for debugging and analysis. Traces include DOM snapshots, screenshots, network activity, and console logs. + +## Basic Usage + +```bash +# Start trace recording +playwright-cli tracing-start + +# Perform actions +playwright-cli open https://example.com +playwright-cli click e1 +playwright-cli fill e2 "test" + +# Stop trace recording +playwright-cli tracing-stop +``` + +## Trace Output Files + +When you start tracing, Playwright creates a `traces/` directory with several files: + +### `trace-{timestamp}.trace` + +**Action log** - The main trace file containing: +- Every action performed (clicks, fills, navigations) +- DOM snapshots before and after each action +- Screenshots at each step +- Timing information +- Console messages +- Source locations + +### `trace-{timestamp}.network` + +**Network log** - Complete network activity: +- All HTTP requests and responses +- Request headers and bodies +- Response headers and bodies +- Timing (DNS, connect, TLS, TTFB, download) +- Resource sizes +- Failed requests and errors + +### `resources/` + +**Resources directory** - Cached resources: +- Images, fonts, stylesheets, scripts +- Response bodies for replay +- Assets needed to reconstruct page state + +## What Traces Capture + +| Category | Details | +|----------|---------| +| **Actions** | Clicks, fills, hovers, keyboard input, navigations | +| **DOM** | Full DOM snapshot before/after each action | +| **Screenshots** | Visual state at each step | +| **Network** | All requests, responses, headers, bodies, timing | +| **Console** | All console.log, warn, error messages | +| **Timing** | Precise timing for each operation | + +## Use Cases + +### Debugging Failed Actions + +```bash +playwright-cli tracing-start +playwright-cli open https://app.example.com + +# This click fails - why? +playwright-cli click e5 + +playwright-cli tracing-stop +# Open trace to see DOM state when click was attempted +``` + +### Analyzing Performance + +```bash +playwright-cli tracing-start +playwright-cli open https://slow-site.com +playwright-cli tracing-stop + +# View network waterfall to identify slow resources +``` + +### Capturing Evidence + +```bash +# Record a complete user flow for documentation +playwright-cli tracing-start + +playwright-cli open https://app.example.com/checkout +playwright-cli fill e1 "4111111111111111" +playwright-cli fill e2 "12/25" +playwright-cli fill e3 "123" +playwright-cli click e4 + +playwright-cli tracing-stop +# Trace shows exact sequence of events +``` + +## Trace vs Video vs Screenshot + +| Feature | Trace | Video | Screenshot | +|---------|-------|-------|------------| +| **Format** | .trace file | .webm video | .png/.jpeg image | +| **DOM inspection** | Yes | No | No | +| **Network details** | Yes | No | No | +| **Step-by-step replay** | Yes | Continuous | Single frame | +| **File size** | Medium | Large | Small | +| **Best for** | Debugging | Demos | Quick capture | + +## Best Practices + +### 1. Start Tracing Before the Problem + +```bash +# Trace the entire flow, not just the failing step +playwright-cli tracing-start +playwright-cli open https://example.com +# ... all steps leading to the issue ... +playwright-cli tracing-stop +``` + +### 2. Clean Up Old Traces + +Traces can consume significant disk space: + +```bash +# Remove traces older than 7 days +find .playwright-cli/traces -mtime +7 -delete +``` + +## Limitations + +- Traces add overhead to automation +- Large traces can consume significant disk space +- Some dynamic content may not replay perfectly diff --git a/.agents/skills/playwright-cli/references/video-recording.md b/.agents/skills/playwright-cli/references/video-recording.md new file mode 100644 index 0000000..38391b3 --- /dev/null +++ b/.agents/skills/playwright-cli/references/video-recording.md @@ -0,0 +1,43 @@ +# Video Recording + +Capture browser automation sessions as video for debugging, documentation, or verification. Produces WebM (VP8/VP9 codec). + +## Basic Recording + +```bash +# Start recording +playwright-cli video-start + +# Perform actions +playwright-cli open https://example.com +playwright-cli snapshot +playwright-cli click e1 +playwright-cli fill e2 "test input" + +# Stop and save +playwright-cli video-stop demo.webm +``` + +## Best Practices + +### 1. Use Descriptive Filenames + +```bash +# Include context in filename +playwright-cli video-stop recordings/login-flow-2024-01-15.webm +playwright-cli video-stop recordings/checkout-test-run-42.webm +``` + +## Tracing vs Video + +| Feature | Video | Tracing | +|---------|-------|---------| +| Output | WebM file | Trace file (viewable in Trace Viewer) | +| Shows | Visual recording | DOM snapshots, network, console, actions | +| Use case | Demos, documentation | Debugging, analysis | +| Size | Larger | Smaller | + +## Limitations + +- Recording adds slight overhead to automation +- Large recordings can consume significant disk space diff --git a/.beads/dolt-monitor.pid.lock b/.beads/dolt-monitor.pid.lock deleted file mode 100644 index e69de29..0000000 diff --git a/.claude/skills/playwright-cli b/.claude/skills/playwright-cli new file mode 120000 index 0000000..a5bb522 --- /dev/null +++ b/.claude/skills/playwright-cli @@ -0,0 +1 @@ +../../.agents/skills/playwright-cli \ No newline at end of file diff --git a/.gitignore b/.gitignore index 04b62ca..aabe58f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ node_modules dist coverage .git/dubstack +.playwright-cli .worktrees .dispatch diff --git a/apps/docs/README.md b/apps/docs/README.md index 9b7bba9..e872410 100644 --- a/apps/docs/README.md +++ b/apps/docs/README.md @@ -9,12 +9,21 @@ Run development server: npm run dev # or pnpm dev +# or, to reset stale Next build output first +pnpm dev:clean # or yarn dev ``` Open http://localhost:3000 with your browser to see the result. +## Workflow Notes + +- Use `pnpm dev` for normal docs development. +- Stop the docs dev server before running `pnpm turbo run build --filter=docs --force`. +- If the local site looks stale or does not match the current source, run `pnpm clean` and restart the dev server. +- `pnpm dev:clean` is a convenience command that clears `.next` before starting `next dev`. + ## Explore In the project, you can see: diff --git a/apps/docs/content/docs/commands/checkout.mdx b/apps/docs/content/docs/commands/checkout.mdx index cd9ecb7..59c19a5 100644 --- a/apps/docs/content/docs/commands/checkout.mdx +++ b/apps/docs/content/docs/commands/checkout.mdx @@ -1,30 +1,68 @@ --- -title: checkout -description: Interactive branch checkout within your stack. +title: dub checkout +description: Checkout a branch directly or use interactive search, plus stack navigation commands. --- -## Usage +## Checkout ```bash -dub co -``` +# Checkout explicit branch +dub checkout feat/auth-login + +# Interactive picker +dub checkout -## Description +# Checkout trunk for current tracked stack +dub checkout --trunk -Opens an interactive branch picker showing all branches in your stack. Select a branch to check it out. +# Include non-tracked local branches +dub checkout --show-untracked -## Options +# Scope to current stack +dub checkout --stack +``` | Flag | Description | |---|---| -| `` | Directly check out a named branch in the stack | +| `--trunk` | Checkout stack trunk | +| `--show-untracked` | Include non-tracked local branches in picker | +| `--stack` | Restrict picker to current stack | + +**Aliases:** `dub co` + +## Stack Navigation + +```bash +# Move one branch upstack +dub up -## Examples +# Move multiple levels upstack +dub up 2 + +# Move downstack +dub down +dub down 2 + +# Jump to tip branch in current path +dub top + +# Jump to first branch above root +dub bottom +``` + +## Orientation Commands + +Inspect where the current branch sits in its tracked stack: ```bash -# Interactive checkout -dub co +dub parent # Direct parent of current branch +dub children # Direct children +dub trunk # Stack root/trunk branch -# Direct checkout -dub co feature-auth +# With explicit branch argument +dub parent feat/auth-login +dub children feat/auth-types +dub trunk feat/auth-tests ``` + +If branch metadata is missing, these commands print a remediation path using `dub track`. diff --git a/apps/docs/content/docs/commands/create.mdx b/apps/docs/content/docs/commands/create.mdx index cb2288d..d9edfeb 100644 --- a/apps/docs/content/docs/commands/create.mdx +++ b/apps/docs/content/docs/commands/create.mdx @@ -1,30 +1,57 @@ --- -title: create -description: Create a new branch that tracks the current branch as its parent. +title: dub create +description: Create a branch stacked on top of the current branch, with optional staging and commit. --- ## Usage ```bash -dub create -``` +# Branch only +dub create feat/my-change + +# Create + commit staged changes +dub create feat/my-change -m "feat: ..." + +# Stage all + create + commit +dub create feat/my-change -am "feat: ..." -## Description +# Stage tracked-file updates + create + commit +dub create feat/my-change -um "feat: ..." -Creates a new branch off the current branch and registers the parent-child relationship in DubStack's state. The new branch becomes the current working branch. +# Interactive hunk staging + create + commit +dub create feat/my-change -pm "feat: ..." -## Options +# AI-generate branch + conventional commit from staged changes +dub create --ai + +# Stage all, then AI-generate branch + commit +dub create -ai +``` + +## Flags | Flag | Description | |---|---| -| `--no-track` | Create the branch without adding it to the stack | +| `-m, --message ` | Commit message | +| `-a, --all` | Stage all changes before commit (requires `-m` or `--ai`) | +| `-u, --update` | Stage tracked-file updates before commit (requires `-m` or `--ai`) | +| `-p, --patch` | Select hunks interactively before commit (requires `-m` or `--ai`) | +| `-i, --ai` | AI-generate branch + conventional commit from staged changes | + +## AI Mode -## Examples +When using `--ai` or `-ai`, DubStack analyzes your staged changes and generates a descriptive branch name and conventional commit message. This requires an AI key configured via `dub ai env`. ```bash -# Create a new stacked branch -dub create feature-auth +# AI with explicit staging +dub create --ai -# Create another branch on top -dub create feature-auth-tests +# Stage all + AI (shorthand) +dub create -ai ``` + +## Notes + +- `dub create` auto-initializes DubStack state if needed. +- The new branch is always stacked on the current branch. +- Use `dub undo` to revert the last create operation. diff --git a/apps/docs/content/docs/commands/doctor.mdx b/apps/docs/content/docs/commands/doctor.mdx index 15af3ab..9606723 100644 --- a/apps/docs/content/docs/commands/doctor.mdx +++ b/apps/docs/content/docs/commands/doctor.mdx @@ -1,30 +1,103 @@ --- -title: doctor -description: Diagnose and repair DubStack state. +title: Maintenance +description: Health checks, cleanup, and safe merge commands — doctor, ready, prune, merge-check, merge-next, land, and post-merge. --- -## Usage +## dub doctor + +Run health checks for stack metadata and submit readiness: ```bash dub doctor + +# Check all stacks +dub doctor --all + +# Skip remote fetch +dub doctor --no-fetch +``` + +Checks include: in-progress operation detection, missing tracked branches, submit blockers, and local/remote SHA drift. + +## dub ready + +Run pre-submit checklist (doctor + submit preflight): + +```bash +dub ready ``` -## Description +## dub prune -Checks DubStack's state for inconsistencies and offers to repair them. Useful when state gets out of sync with the actual git branch structure. +Preview or remove stale tracked branch metadata: -## Options +```bash +# Preview only +dub prune + +# Apply removals +dub prune --apply -| Flag | Description | -|---|---| -| `--fix` | Automatically apply suggested repairs | +# Include every stack +dub prune --all --apply +``` -## Examples +## dub merge-check + +Validate merge order for a stack PR: ```bash -# Diagnose issues +# Check current branch PR +dub merge-check + +# Check explicit PR number +dub merge-check --pr 123 +``` + +## dub merge-next / dub land + +Merge the next safe PR in your current stack path, pre-retarget direct child PRs, then run post-merge maintenance: + +```bash +dub merge-next +# alias +dub land + +# Preview only +dub merge-next --dry-run +``` + +## dub post-merge + +Repair stack metadata and retarget remaining PRs after manual merges: + +```bash +dub post-merge + +# Preview only +dub post-merge --dry-run + +# Include all stacks +dub post-merge --all +``` + +## Stale Branch Recovery + +When submit or sync gets blocked by stale tracked branches: + +```bash +# 1) Inspect current health dub doctor -# Auto-fix issues -dub doctor --fix +# 2) Preview stale branch metadata +dub prune + +# 3) Remove stale metadata if confirmed +dub prune --apply + +# 4) Re-run pre-submit checks +dub ready + +# 5) Submit current linear path +dub submit --path current ``` diff --git a/apps/docs/content/docs/commands/log.mdx b/apps/docs/content/docs/commands/log.mdx index 4e93466..d9d2d22 100644 --- a/apps/docs/content/docs/commands/log.mdx +++ b/apps/docs/content/docs/commands/log.mdx @@ -1,25 +1,54 @@ --- -title: log -description: Visualize the stack as a tree with branch status. +title: dub log +description: Visualize your stack as an ASCII tree. --- ## Usage ```bash dub log +dub ls +dub l + +# Show only current stack +dub log --stack + +# Show all stacks explicitly +dub log --all + +# Reverse branch ordering for quick top-down scan +dub log --reverse ``` -## Description +## Flags -Displays a tree visualization of your stack, showing branch relationships, commit counts, and PR status. +| Flag | Description | +|---|---| +| `--stack` | Show only current stack | +| `--all` | Show all stacks explicitly | +| `--reverse` | Reverse branch ordering | -## Options +**Aliases:** `dub ls`, `dub l` -No additional options. +## Example Output -## Examples +A typical stack looks like this: + +```text +(main) + └─ feat/auth-types + └─ feat/auth-login + └─ feat/auth-tests ← you are here +``` + +## Branch Info + +For detailed metadata about a specific branch: ```bash -# View the stack tree -dub log +# Current branch +dub info + +# Explicit branch +dub info feat/auth-login ``` diff --git a/apps/docs/content/docs/commands/meta.json b/apps/docs/content/docs/commands/meta.json index f89af5f..6ef1db2 100644 --- a/apps/docs/content/docs/commands/meta.json +++ b/apps/docs/content/docs/commands/meta.json @@ -2,17 +2,18 @@ "title": "Commands", "pages": [ "create", - "restack", + "modify", + "checkout", + "log", + "navigate", "submit", "sync", + "restack", "merge-next", "post-merge", "undo", - "checkout", - "log", - "modify", - "navigate", "doctor", + "track", "skills" ] } diff --git a/apps/docs/content/docs/commands/modify.mdx b/apps/docs/content/docs/commands/modify.mdx index 89c1194..28748f9 100644 --- a/apps/docs/content/docs/commands/modify.mdx +++ b/apps/docs/content/docs/commands/modify.mdx @@ -1,26 +1,59 @@ --- -title: modify -description: Amend the current branch with staged changes. +title: dub modify +description: Amend or create commits on the current branch, then automatically restack descendants. --- ## Usage ```bash +# Amend current commit dub modify + +# Create a new commit +dub modify -c -m "fix: ..." + +# Interactive staging +dub modify -p + +# Stage all tracked updates +dub modify -u + +# Show staged diff before modify +dub modify -v + +# Show staged + unstaged diff before modify +dub modify -vv + +# Interactive rebase of this branch's commits +dub modify --interactive-rebase ``` -## Description +## Flags -Amends the current branch's HEAD commit with any staged changes and restacks descendant branches automatically. +| Flag | Description | +|---|---| +| `-a, --all` | Stage all changes | +| `-u, --update` | Stage tracked-file updates | +| `-p, --patch` | Interactive hunk staging | +| `-c, --commit` | Create a new commit instead of amending | +| `-e, --edit` | Edit the commit message | +| `-m, --message ` | Commit message (repeatable) | +| `-v, --verbose` | Show diff before modify (repeatable: `-vv` for staged+unstaged) | +| `--interactive-rebase` | Interactive rebase of branch commits | -## Options +**Aliases:** `dub m` -No additional options. +## Common Patterns -## Examples +Address review feedback on a middle branch: ```bash -# Stage changes and amend -git add . -dub modify +# Jump to the branch +dub co feat/auth-login + +# Edit files, then amend + restack descendants +dub m -a -m "fix: address review feedback" + +# Push updates +dub ss ``` diff --git a/apps/docs/content/docs/commands/submit.mdx b/apps/docs/content/docs/commands/submit.mdx index b9fab65..491967e 100644 --- a/apps/docs/content/docs/commands/submit.mdx +++ b/apps/docs/content/docs/commands/submit.mdx @@ -1,6 +1,6 @@ --- -title: submit -description: Push branches and create or update GitHub PRs. +title: dub submit +description: Push branches and create or update pull requests for your stack. --- ## Usage @@ -8,29 +8,40 @@ description: Push branches and create or update GitHub PRs. ```bash dub submit dub ss -``` -## Description +# Preview only +dub submit --dry-run + +# Submit only current linear path (default) +dub submit --path current -Pushes the current branch to the remote and creates or updates a GitHub pull request. Uses the `gh` CLI under the hood. +# Submit the whole stack graph +dub submit --path stack + +# Auto-fallback to current path when stack-mode is blocked +dub submit --path stack --fix +``` -## Options +## Flags | Flag | Description | |---|---| -| `--path stack` | Submit all branches in the current linear stack path | -| `--draft` | Create PRs as drafts | -| `--no-edit` | Skip opening the PR editor | +| `--dry-run` | Preview submit actions without executing | +| `--path current` | Submit only current linear path (default) | +| `--path stack` | Submit the whole stack graph | +| `--fix` | Auto-fallback to current path when stack-mode is blocked | -## Examples +**Aliases:** `dub ss` -```bash -# Submit current branch -dub submit +## Open PR in Browser -# Submit the entire stack -dub submit --path stack +Use `dub pr` to open a PR in your browser via `gh`: + +```bash +# Current branch PR +dub pr -# Submit as draft -dub ss --draft +# Explicit branch / PR target +dub pr feat/auth-login +dub pr 123 ``` diff --git a/apps/docs/content/docs/commands/sync.mdx b/apps/docs/content/docs/commands/sync.mdx index 9f37bab..bb41542 100644 --- a/apps/docs/content/docs/commands/sync.mdx +++ b/apps/docs/content/docs/commands/sync.mdx @@ -1,27 +1,51 @@ --- -title: sync -description: Fetch trunk and rebase the stack onto the latest trunk. +title: dub sync +description: Synchronize tracked branches with remote refs and optionally restack. --- ## Usage ```bash +# Sync current stack dub sync -``` -## Description +# Sync all tracked stacks +dub sync --all + +# Non-interactive mode +dub sync --no-interactive -Fetches the latest changes from the trunk branch (usually `main`) and rebases the entire stack onto it. This keeps your stack current with upstream changes. +# Force destructive sync decisions +dub sync --force -## Options +# Include post-sync restack +dub sync --restack +``` + +## Flags | Flag | Description | |---|---| -| `--trunk ` | Specify the trunk branch (default: `main`) | +| `--all` | Sync all tracked stacks | +| `--no-interactive` | Deterministic non-interactive mode | +| `--force` | Skip prompts for destructive actions | +| `--restack` | Include post-sync restack | + +## Sync Behavior -## Examples +- Fetch tracked refs from `origin` +- Attempt trunk fast-forward (or overwrite with `--force`) +- Auto-clean local branches for merged PRs (and closed PRs confirmed in trunk) +- Reconcile local/remote divergence states per branch +- Optional restack when `--restack` is set + +## Restack + +Rebase stack branches onto updated parents: ```bash -# Sync with trunk -dub sync +dub restack + +# Continue after resolving conflicts +dub restack --continue ``` diff --git a/apps/docs/content/docs/commands/track.mdx b/apps/docs/content/docs/commands/track.mdx new file mode 100644 index 0000000..1b0cc21 --- /dev/null +++ b/apps/docs/content/docs/commands/track.mdx @@ -0,0 +1,60 @@ +--- +title: dub track +description: Track existing branches, re-parent tracked branches, untrack, or delete with stack-aware expansion. +--- + +## Track + +```bash +# Track current branch +dub track + +# Track explicit branch +dub track feat/auth-login --parent feat/auth-types + +# Repair parent metadata +dub track feat/auth-login --parent main +``` + +| Flag | Description | +|---|---| +| `--parent ` | Specify parent branch (inferred if omitted) | + +If `--parent` is omitted, DubStack tries to infer a safe default. In interactive shells, DubStack prompts when parent choice is ambiguous. + +## Untrack + +Remove branch metadata from DubStack without deleting local git branches: + +```bash +# Untrack current branch only +dub untrack + +# Untrack explicit branch and descendants +dub untrack feat/auth-login --downstack +``` + +## Delete + +Delete local branches with stack-aware expansion and metadata repair: + +```bash +# Delete one branch (with confirmation) +dub delete feat/auth-login + +# Delete branch and descendants +dub delete feat/auth-login --upstack + +# Delete branch and ancestors toward trunk +dub delete feat/auth-login --downstack + +# Fully non-interactive destructive delete +dub delete feat/auth-login --upstack --force --quiet +``` + +| Flag | Description | +|---|---| +| `--upstack` | Include descendants | +| `--downstack` | Include ancestors (excluding root) | +| `-f, --force` | Force delete unmerged branches | +| `-q, --quiet` | Skip confirmation prompt | diff --git a/apps/docs/content/docs/commands/undo.mdx b/apps/docs/content/docs/commands/undo.mdx index e6a216d..301231a 100644 --- a/apps/docs/content/docs/commands/undo.mdx +++ b/apps/docs/content/docs/commands/undo.mdx @@ -1,25 +1,37 @@ --- -title: undo -description: Undo the last DubStack operation. +title: Recovery +description: Commands for resuming, canceling, and undoing stack operations. --- -## Usage +## Continue / Abort + +Unified recovery pair for interrupted restacks and rebases: ```bash -dub undo -``` +# Continue active restack/rebase +dub continue -## Description +# Abort active restack/rebase +dub abort +``` -Reverts the last DubStack operation by restoring the previous state snapshot. Only a single level of undo is supported. +Use these when the CLI reports conflicts or an in-progress operation. The typical flow after a conflict is: -## Options +```bash +# 1. Resolve conflicts in your editor +# 2. Stage resolved files +git add +# 3. Continue +dub continue +``` -No additional options. +## Undo -## Examples +Undo the last `dub create` or `dub restack` operation: ```bash -# Undo the last operation dub undo ``` + +- Supports one level of undo +- Intended for reverting the most recent create or restack diff --git a/apps/docs/content/docs/contributing/agent-skills.mdx b/apps/docs/content/docs/contributing/agent-skills.mdx index 071cc28..477d8cb 100644 --- a/apps/docs/content/docs/contributing/agent-skills.mdx +++ b/apps/docs/content/docs/contributing/agent-skills.mdx @@ -1,22 +1,69 @@ --- title: Agent Skills -description: Creating and distributing AI agent skills for DubStack. +description: Packaged agent skills for coding assistants to use DubStack correctly. --- -DubStack ships agent skills that help AI coding assistants understand and use the CLI effectively. +DubStack ships packaged skills so coding assistants can use `dub` correctly for stacked PR workflows. -## Available Skills +## Included Skills -- **dubstack** — General CLI reference and workflow guidance -- **dub-flow** — PR creation flow for AI agents +### dubstack -## Installing Skills +General CLI reference and workflow guidance for creating and navigating stacks, modifying branches and restacking, syncing with remote state, submitting PR stacks, and recovering from common errors. ```bash -dub skills add wiseiodev/dubstack/skills/dubstack -dub skills add wiseiodev/dubstack/skills/dub-flow +npx skills add wiseiodev/dubstack/skills/dubstack ``` -## Creating Custom Skills +### dub-flow -Skills are Markdown files that follow the SKILL.md format. See `skills/dubstack/SKILL.md` for an example. +Task-oriented PR execution flow for agents that need to analyze staged changes, propose branch + commit naming, run `dub create` / `dub submit`, and open and polish PR metadata. + +```bash +npx skills add wiseiodev/dubstack/skills/dub-flow +``` + +## Install via DubStack CLI + +```bash +# Install all packaged skills +dub skills add + +# Install specific skill +dub skills add dubstack +dub skills add dub-flow +``` + +## Remove Skills + +```bash +dub skills remove dubstack +dub skills remove dub-flow +``` + +## Dry Run + +Preview changes without modifying anything: + +```bash +dub skills add --dry-run +dub skills remove --dry-run +``` + +## What Agents Gain + +With these skills installed, agents are more reliable at: + +- Using stack-safe commands (`create`, `modify`, `sync`, `restack`, `submit`) +- Choosing safer recovery paths after conflicts +- Avoiding destructive or non-stack-aware git flows +- Producing consistent PR workflow outputs + +## dub-flow Workflow Phases + +The `dub-flow` skill guides agents through a structured 4-phase PR creation process: + +1. **Analyze Changes** — Inspect staged diffs, determine scope (feature/fix/refactor/etc.) +2. **Propose Naming** — Suggest branch name (`type/short-kebab-scope`) and conventional commit message +3. **Confirm** — Present plan to user for approval before execution +4. **Execute** — Run `dub create` + `dub ss` diff --git a/apps/docs/content/docs/contributing/development.mdx b/apps/docs/content/docs/contributing/development.mdx index 9ee773d..4c4e403 100644 --- a/apps/docs/content/docs/contributing/development.mdx +++ b/apps/docs/content/docs/contributing/development.mdx @@ -1,35 +1,70 @@ --- -title: Development -description: Setting up a development environment for DubStack. +title: Contributing +description: How to contribute to DubStack — setup, workflow, conventions, and coding agent guidance. --- -## Prerequisites +DubStack accepts contributions from both humans and coding agents. The goal is predictable, safe changes to stacked-branch workflows. -- Node.js >= 22 -- pnpm (`corepack enable`) -- Git +## Prerequisites -## Setup +- Node `>=22` +- `pnpm` (`pnpm@10.29.1`) ```bash -git clone https://github.com/wiseiodev/dubstack.git -cd dubstack pnpm install ``` -## Development Commands +## Development Workflow + +1. Read `AGENTS.md` (required for repo-specific conventions). +2. Make focused source changes in `src/`. +3. Add/update tests near the changed behavior. +4. Run verification commands. +5. Open a PR using the repository PR template. ```bash -pnpm build # Build all packages -pnpm test # Run tests -pnpm typecheck # TypeScript type checking -pnpm checks # Biome lint + format -pnpm checks:fix # Auto-fix lint/format issues +pnpm test +pnpm typecheck +pnpm checks +``` + +Before submitting stacked PRs, run `dub ready` to validate health + submit preflight. Changes are not ready to merge unless all three verification commands pass. + +## Formatting and Naming + +- Biome is the source of truth for formatting/linting. +- Use 2 spaces (not tabs) for indentation. +- Use single quotes in JavaScript/TypeScript. +- Use kebab-case file names. + +## Using a Coding Agent + +If you use Codex, Claude Code, Cursor Agent, or similar: + +- Point the agent to `AGENTS.md` and `.agents/` docs first. +- Keep edits minimal and scoped to the requested behavior. +- Require tests for behavior changes. +- Do not use git worktrees unless a maintainer explicitly asks. +- Prefer safe, non-destructive git operations. + +## Commit Messages (Conventional Commits) + +```text +type(scope): short description + +# Examples: +feat(submit): support draft PR creation +fix(restack): preserve parent mapping after rebase +test(create): cover ensureState auto-init +docs(contributing): add coding-agent workflow ``` -## Coding Conventions +Common types: `feat`, `fix`, `docs`, `refactor`, `test`, `chore` + +## Pull Requests -- TypeScript with ESM imports -- 2-space indentation, single quotes -- kebab-case file names -- Conventional commit messages +- Keep PRs focused and reviewable. +- Include behavioral impact and risk in PR description. +- If UX or command semantics change, update docs in the same PR. +- `main` is configured for squash merge only + linear history + required checks. +- For stacked PRs, merge in order and prefer `dub merge-next` to avoid out-of-order merges. diff --git a/apps/docs/content/docs/contributing/testing.mdx b/apps/docs/content/docs/contributing/testing.mdx index 7aeb71e..d975079 100644 --- a/apps/docs/content/docs/contributing/testing.mdx +++ b/apps/docs/content/docs/contributing/testing.mdx @@ -22,3 +22,5 @@ pnpm --filter=dubstack test # Run CLI tests only ## Writing Tests Co-locate unit tests with their source files. Use the existing test patterns as a guide. + +When behavior or output changes, add or update tests near the changed code. All three verification commands (`pnpm test`, `pnpm typecheck`, `pnpm checks`) must pass before work is considered complete. diff --git a/apps/docs/content/docs/getting-started/installation.mdx b/apps/docs/content/docs/getting-started/installation.mdx index e91829a..73271ad 100644 --- a/apps/docs/content/docs/getting-started/installation.mdx +++ b/apps/docs/content/docs/getting-started/installation.mdx @@ -3,16 +3,20 @@ title: Installation description: Install DubStack via Homebrew, npm, or from source. --- -## Prerequisites +Install DubStack via Homebrew, npm, or build from source. -- Node.js >= 22 -- Git -- GitHub CLI (`gh`) for PR operations +## Homebrew (recommended) -## Homebrew (macOS) +```bash +brew tap wiseiodev/dubstack +brew install dubstack +``` + +Update: ```bash -brew install wiseiodev/dubstack/dubstack +brew update +brew upgrade dubstack ``` ## npm @@ -28,11 +32,21 @@ git clone https://github.com/wiseiodev/dubstack.git cd dubstack pnpm install pnpm build -npm link +pnpm link --global ``` ## Verify Installation +After installing, verify DubStack is available: + ```bash -dub --version +dub --help ``` + +Initialize DubStack in your repository: + +```bash +dub init +``` + +Note: `dub create` auto-initializes state if needed, so running `dub init` manually is optional but useful for explicit setup. diff --git a/apps/docs/content/docs/getting-started/quickstart.mdx b/apps/docs/content/docs/getting-started/quickstart.mdx index ce3f3cb..aad389d 100644 --- a/apps/docs/content/docs/getting-started/quickstart.mdx +++ b/apps/docs/content/docs/getting-started/quickstart.mdx @@ -1,43 +1,158 @@ --- title: Quick Start -description: Create your first stacked branch workflow in minutes. +description: Get from zero to a working stacked PR flow fast. --- -## Initialize DubStack +Get from zero to a working stacked PR flow fast. -DubStack auto-initializes when you create your first branch. No setup command needed. +## Prerequisites -## Create Your First Stack +- **`git` installed** — Version control must be available on your system. +- **`gh` CLI authenticated**: + ```bash + gh auth login + ``` +- **`dub` installed**: + ```bash + # Homebrew + brew tap wiseiodev/dubstack + brew install dubstack + + # npm + npm i -g dubstack + ``` + +## Optional: Enable AI Assistant + +```bash +# Add one API key to your shell profile +dub ai env --gemini-key "" +# or: +dub ai env --gateway-key "" + +# Reload your shell +source ~/.zshrc + +# Enable assistant for this repo +dub config ai-assistant on + +# Ask a question +dub ai ask "Summarize this stack from trunk to current branch" +``` + +## 1. Start from Trunk ```bash -# Start from your trunk branch (main) git checkout main +git pull +``` -# Create the first branch in your stack -dub create feature-auth +## 2. Create a Stack -# Make changes, commit, then create the next branch -dub create feature-auth-ui +Create three stacked branches with commits: + +```bash +# Layer 1 +dub create feat/auth-types -am "feat: add auth types" + +# Layer 2 (parent: feat/auth-types) +dub create feat/auth-login -am "feat: add login flow" + +# Layer 3 (parent: feat/auth-login) +dub create feat/auth-tests -am "test: add auth tests" ``` -## Visualize Your Stack +## 3. Inspect and Navigate ```bash +# View stack tree dub log + +# Interactive checkout +dub co + +# Move around current path +dub up +dub down +dub top +dub bottom +``` + +## 4. Submit Stack PRs + +```bash +# Submit stack +dub ss + +# Preview only +dub ss --dry-run + +# Open PR in browser +dub pr ``` -## Submit PRs +## 5. Respond to Feedback + +When feedback lands on a middle branch: ```bash -# Submit the current branch -dub submit +dub co feat/auth-login + +# Amend current commit +dub m -a -m "fix: address review feedback" -# Submit the entire stack -dub submit --path stack +# Or create a new commit +dub m -c -a -m "fix: follow-up" + +# Push updates +dub ss ``` -## Sync with Trunk +## 6. Keep Stack in Sync ```bash +git checkout main +git pull dub sync ``` + +## 7. Handle Restack Conflicts + +```bash +dub restack +# Resolve conflicts in files +git add +dub restack --continue +``` + +## 8. Merge in Safe Order + +```bash +# Merge next safe PR in stack order +dub merge-next + +# Run again for the next layer +dub merge-next + +# If merges happened manually +dub post-merge +``` + +## Fast Command List + +| Command | Purpose | +|---|---| +| `dub create -am "msg"` | Stage all + create + commit | +| `dub m` | Modify current branch commit(s) | +| `dub log` | Show stack graph | +| `dub co` | Interactive checkout | +| `dub ss` | Submit stack PRs | +| `dub pr` | Open PR in browser | +| `dub sync` | Sync local state with remote | +| `dub doctor` | Run stack health checks | +| `dub ready` | Run pre-submit checklist | +| `dub restack` | Rebase stack onto updated parents | +| `dub merge-next` | Merge next safe PR + maintenance | +| `dub continue` / `dub abort` | Resume/cancel operations | +| `dub undo` | Undo last create/restack | +| `dub ai ask "..."` | Ask AI assistant | diff --git a/apps/docs/content/docs/guides/ai-assistant.mdx b/apps/docs/content/docs/guides/ai-assistant.mdx index ae5c860..86a2ece 100644 --- a/apps/docs/content/docs/guides/ai-assistant.mdx +++ b/apps/docs/content/docs/guides/ai-assistant.mdx @@ -1,22 +1,83 @@ --- -title: AI Assistant -description: Setting up and using DubStack's AI-powered features. +title: AI Commands +description: AI-powered assistance — dub ai ask, dub ai env, dub config ai-assistant, and dub history. --- -DubStack includes an optional AI assistant that can help with conflict resolution and code review. +DubStack includes an AI assistant that understands your stack context, plus commands for managing AI configuration and inspecting command history. -## Setup +## dub ai ask -Configure your AI provider by setting the appropriate environment variables: +Ask DubStack's AI assistant using streaming output. The assistant automatically receives a context packet including current branch/stack signals, git status, doctor summary, and recent command history. ```bash -dub ai-env +dub ai ask "Summarize what this stack is changing" ``` -## AI-Assisted Conflict Resolution +### Automatic Context -When conflicts arise during restack, the AI assistant can suggest resolutions based on the context of your changes. +The AI assistant can invoke a constrained shell tool limited to a strict allow-list of safe, read-only commands (for example `git status`, `dub doctor`, `dub ready`) when command output is needed. It cannot execute arbitrary shell commands; requests outside the allow-list are rejected. -## Configuration +### Provider Selection -See `dub config` for AI-related settings. +- If `DUBSTACK_GEMINI_API_KEY` is set, DubStack uses direct Google provider access (`gemini-3-flash`). +- Otherwise, if `DUBSTACK_AI_GATEWAY_API_KEY` is set, DubStack uses Vercel AI Gateway (`google/gemini-3-flash`). +- If both are set, DubStack prefers `DUBSTACK_GEMINI_API_KEY`. + +## dub ai env + +Write DubStack AI keys into your shell profile (macOS/Linux). + +```bash +# Write Gemini key +dub ai env --gemini-key "" + +# Write Gateway key +dub ai env --gateway-key "" + +# Write both +dub ai env --gemini-key "" --gateway-key "" + +# Target a specific profile file +dub ai env --gemini-key "" --profile ~/.zshrc +``` + +| Flag | Description | +|---|---| +| `--gemini-key ` | Set `DUBSTACK_GEMINI_API_KEY` | +| `--gateway-key ` | Set `DUBSTACK_AI_GATEWAY_API_KEY` | +| `--profile ` | Target specific profile file (auto-detects zsh/bash otherwise) | + +## dub config ai-assistant + +Enable or disable the repo-local AI assistant flag. + +```bash +# Check current value +dub config ai-assistant + +# Enable +dub config ai-assistant on + +# Disable +dub config ai-assistant off +``` + +## dub history + +Inspect recent Dub command history used for troubleshooting context. + +```bash +# Show last 20 entries +dub history + +# Show more +dub history --limit 50 + +# Machine-readable output +dub history --json +``` + +| Flag | Description | +|---|---| +| `--limit ` | Number of entries to show (default: 20) | +| `--json` | Output in JSON format | diff --git a/apps/docs/content/docs/guides/conflict-resolution.mdx b/apps/docs/content/docs/guides/conflict-resolution.mdx index 4c36fbf..cff741d 100644 --- a/apps/docs/content/docs/guides/conflict-resolution.mdx +++ b/apps/docs/content/docs/guides/conflict-resolution.mdx @@ -1,28 +1,55 @@ --- -title: Conflict Resolution -description: How to handle rebase conflicts during restack and sync operations. +title: Troubleshooting +description: Common issues and solutions for DubStack. --- -Conflicts are a normal part of stacked workflows. DubStack provides tools to handle them gracefully. +Common issues and how to resolve them. -## When Conflicts Occur +## Common Issues -Conflicts happen during `dub restack` or `dub sync` when changes in one branch overlap with changes in another. +| Problem | Solution | +|---------|----------| +| gh CLI not found | Install GitHub CLI: [cli.github.com](https://cli.github.com) | +| Not authenticated with GitHub | Run `gh auth login` | +| Branch not part of stack | Create via `dub create` or run from a tracked branch | +| Restack conflict | Resolve files, run `git add`, then `dub restack --continue` | +| Rebase/restack interrupted | Use `dub continue` to resume or `dub abort` to cancel | +| Branch not tracked | Run `dub track --parent ` | +| Need metadata-only removal | Use `dub untrack` (or `--downstack`) | +| Need stack-aware branch deletion | Use `dub delete` with `--upstack` / `--downstack` | +| Sync skipped branch | Re-run with `--interactive` or `--force` as appropriate | +| Wrong operation during create/restack | Use `dub undo` (single-level) | +| PR merge blocked by order | Run `dub merge-check --pr ` and merge previous PR first | +| Manual merge left stack inconsistent | Run `dub post-merge` | -## Resolving Conflicts +## Stale Branch Recovery -When a conflict is detected, DubStack pauses the operation. Resolve the conflicts in your editor, stage the files, then continue: +When submit or sync gets blocked by stale tracked branches: ```bash -# After resolving conflicts -git add . -dub continue +# 1) Inspect current health +dub doctor + +# 2) Preview stale branch metadata +dub prune + +# 3) Remove stale metadata if confirmed +dub prune --apply + +# 4) Re-run pre-submit checks +dub ready + +# 5) Submit current linear path +dub submit --path current ``` -## Aborting a Restack +## State Files -If you want to start over: +DubStack stores local state in your repo. Nothing is pushed to your remote from these files. -```bash -dub abort +```text +.git/dubstack/ +├── state.json +├── undo.json +└── restack-progress.json ``` diff --git a/apps/docs/content/docs/guides/migration-from-graphite.mdx b/apps/docs/content/docs/guides/migration-from-graphite.mdx index aeb1fac..3560022 100644 --- a/apps/docs/content/docs/guides/migration-from-graphite.mdx +++ b/apps/docs/content/docs/guides/migration-from-graphite.mdx @@ -1,22 +1,38 @@ --- -title: Migration from Graphite -description: Transitioning from Graphite to DubStack. +title: Graphite Migration +description: Map Graphite commands to DubStack equivalents. --- -If you're coming from Graphite, DubStack uses a similar mental model with some key differences. +If you have `gt` muscle memory, use this as a fast map. DubStack follows the same mental model. -## Concept Mapping +## Command Mapping | Graphite | DubStack | |---|---| | `gt create` | `dub create` | -| `gt submit` | `dub submit` | +| `gt modify` | `dub modify` / `dub m` | +| `gt submit` / `gt ss` | `dub submit` / `dub ss` | | `gt sync` | `dub sync` | -| `gt log` | `dub log` | -| `gt modify` | `dub modify` | +| `gt checkout` / `gt co` | `dub checkout` / `dub co` | +| `gt log` / `gt ls` | `dub log` / `dub ls` | +| `gt up` / `gt down` | `dub up` / `dub down` | +| `gt top` / `gt bottom` | `dub top` / `dub bottom` | +| `gt info` | `dub info` | +| `gt pr` | `dub pr` | +| `gt restack` | `dub restack` | +| `gt continue` | `dub continue` | +| `gt abort` | `dub abort` | +| `gt track --parent` | `dub track --parent` | +| `gt untrack` | `dub untrack` | +| `gt delete` | `dub delete` | +| `gt parent` | `dub parent` | +| `gt children` | `dub children` | +| `gt trunk` | `dub trunk` | +| `gt undo` | `dub undo` | ## Key Differences -- DubStack stores state locally in `.git/dubstack/` — no cloud service required -- DubStack uses GitHub PRs directly via the `gh` CLI -- Stack state is fully transparent and recoverable via `dub doctor` +- **Local-first** — DubStack stores all state locally in `.git/dubstack/`. Nothing is pushed to your remote from these files. +- **AI features** — DubStack includes built-in AI for branch naming, commit messages, and stack-aware guidance via `dub ai ask`. +- **Agent skills** — DubStack ships packaged skills for coding assistants via `dub skills add`. +- **Safe merging** — `dub merge-next` handles retargeting child PRs before deleting merged branches. diff --git a/apps/docs/content/docs/guides/stacking-workflow.mdx b/apps/docs/content/docs/guides/stacking-workflow.mdx index 9cc1635..fd1cf53 100644 --- a/apps/docs/content/docs/guides/stacking-workflow.mdx +++ b/apps/docs/content/docs/guides/stacking-workflow.mdx @@ -1,22 +1,174 @@ --- -title: Stacking Workflow -description: End-to-end guide to the stacked branch workflow with DubStack. +title: Workflows +description: Copy-paste workflow playbooks for common DubStack operations. --- -This guide walks through a complete stacking workflow from creating your first branch to landing all PRs. +Copy-paste playbooks for the most common stacked PR operations. -## Planning Your Stack +## 1. Create and Submit a New Stack -Break your feature into small, reviewable pieces. Each piece becomes a branch in the stack. +```bash +git checkout main +git pull -## Creating the Stack +dub create feat/base -am "feat: add base layer" +dub create feat/middle -am "feat: add middle layer" +dub create feat/top -am "feat: add top layer" -Start from trunk and use `dub create` to build your stack one branch at a time. +dub log +dub ss +``` -## Iterating on Feedback +## 2. Update a Middle Branch After Review -When reviewers request changes to a branch in the middle of your stack, make the changes and use `dub restack` to propagate them through descendant branches. +```bash +dub co feat/middle -## Landing PRs +# edit files... +dub m -a -m "fix: address review feedback" -Merge PRs in order from the bottom of the stack upward using `dub merge-next`, then run `dub post-merge` to clean up. +# optional diff check before modify +dub m -vv + +dub ss +``` + +## 3. Sync After Trunk Moves + +```bash +git checkout main +git pull + +dub sync +``` + +For deterministic non-interactive behavior: + +```bash +dub sync --no-interactive +``` + +For explicit destructive reconciliation: + +```bash +dub sync --force +``` + +## 4. Conflict Recovery During Restack + +```bash +dub restack +# conflict occurs + +# resolve files +git add + +dub restack --continue +``` + +If you are already mid-operation, use the unified recovery commands: + +```bash +dub continue +# or +dub abort +``` + +## 5. Open PR Quickly + +```bash +dub pr +# or +dub pr feat/top +# or +dub pr 123 +``` + +## 6. Recover from Mistakes + +```bash +dub undo +``` + +- `undo` supports one level. +- Intended for reverting last `create` or `restack`. + +## 7. Repair Untracked Branch Metadata + +```bash +# Branch created outside dub create +git checkout feat/manual + +dub track feat/manual --parent main + +# Verify placement +dub parent feat/manual +dub trunk feat/manual +``` + +## 8. Remove Metadata or Delete Branches Safely + +```bash +# Metadata-only removal +dub untrack feat/top + +# Remove branch + descendants from metadata +dub untrack feat/middle --downstack + +# Delete branch with confirmation +dub delete feat/top + +# Delete branch and descendants non-interactively +dub delete feat/middle --upstack --force --quiet +``` + +## 9. Stack Inspection Modes + +```bash +dub log --stack +dub log --all +dub log --reverse +``` + +## 10. Stack Navigation Patterns + +```bash +dub up +dub up 2 +dub down +dub down --steps 2 +dub top +dub bottom +``` + +## 11. Checkout Patterns + +```bash +# Interactive +dub checkout + +# Interactive current stack only +dub checkout --stack + +# Include untracked branches +dub checkout --show-untracked + +# Jump to trunk +dub checkout --trunk +``` + +## 12. Merge Stacks Safely (Bottom-Up) + +```bash +# Merge next safe PR in stack order +dub merge-next + +# Run again for the next layer +dub merge-next +``` + +If you merged manually, normalize state and retarget remaining PRs: + +```bash +dub post-merge +``` diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx index 06692bf..437548e 100644 --- a/apps/docs/content/docs/index.mdx +++ b/apps/docs/content/docs/index.mdx @@ -1,8 +1,149 @@ --- title: Introduction -description: Welcome to the DubStack documentation. +description: DubStack is a CLI for stacked diffs — dependent git branches that make code review faster and more focused. --- -DubStack is a CLI tool for managing stacked diffs — dependent git branches that make code review faster and more focused. +DubStack is a CLI tool for managing stacked diffs — dependent git branches that make code review faster and more focused. It stores all state locally in `.git/dubstack/`, uses GitHub PRs directly via the `gh` CLI, and includes built-in AI assistance for branch naming, commit messages, and stack-aware guidance. -This documentation will help you get started with DubStack and learn how to use it effectively. +## Prerequisites + +- **`git` installed** — Version control must be available on your system. +- **`gh` CLI authenticated** — Run `gh auth login` to authenticate. +- **`dub` installed** — See [Installation](/docs/getting-started/installation) for details. + +## Quick Start + +### 1. Start from Trunk + +```bash +git checkout main +git pull +``` + +### 2. Create a Stack + +Create three stacked branches with commits: + +```bash +# Layer 1 +dub create feat/auth-types -am "feat: add auth types" + +# Layer 2 (parent: feat/auth-types) +dub create feat/auth-login -am "feat: add login flow" + +# Layer 3 (parent: feat/auth-login) +dub create feat/auth-tests -am "test: add auth tests" +``` + +### 3. Inspect and Navigate + +```bash +# View stack tree +dub log + +# Interactive checkout +dub co + +# Move around current path +dub up +dub down +dub top +dub bottom +``` + +### 4. Submit Stack PRs + +```bash +# Submit stack +dub ss + +# Preview only +dub ss --dry-run + +# Open PR in browser +dub pr +``` + +### 5. Respond to Feedback + +When feedback lands on a middle branch: + +```bash +dub co feat/auth-login + +# Amend current commit +dub m -a -m "fix: address review feedback" + +# Or create a new commit +dub m -c -a -m "fix: follow-up" + +# Push updates +dub ss +``` + +### 6. Keep Stack in Sync + +```bash +git checkout main +git pull +dub sync +``` + +### 7. Handle Restack Conflicts + +```bash +dub restack +# Resolve conflicts in files +git add +dub restack --continue +``` + +### 8. Merge in Safe Order + +```bash +# Merge next safe PR in stack order +dub merge-next + +# Run again for the next layer +dub merge-next + +# If merges happened manually +dub post-merge +``` + +## Optional: Enable AI Assistant + +```bash +# Add one API key to your shell profile +dub ai env --gemini-key "" +# or: +dub ai env --gateway-key "" + +# Reload your shell +source ~/.zshrc + +# Enable assistant for this repo +dub config ai-assistant on + +# Ask a question +dub ai ask "Summarize this stack from trunk to current branch" +``` + +## Command Reference + +| Command | Purpose | +|---|---| +| `dub create -am "msg"` | Stage all + create + commit | +| `dub m` | Modify current branch commit(s) | +| `dub log` | Show stack graph | +| `dub co` | Interactive checkout | +| `dub ss` | Submit stack PRs | +| `dub pr` | Open PR in browser | +| `dub sync` | Sync local state with remote | +| `dub doctor` | Run stack health checks | +| `dub ready` | Run pre-submit checklist | +| `dub restack` | Rebase stack onto updated parents | +| `dub merge-next` | Merge next safe PR + maintenance | +| `dub continue` / `dub abort` | Resume/cancel operations | +| `dub undo` | Undo last create/restack | +| `dub ai ask "..."` | Ask AI assistant | diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json index 3aef91d..28870fe 100644 --- a/apps/docs/content/docs/meta.json +++ b/apps/docs/content/docs/meta.json @@ -2,15 +2,10 @@ "title": "Docs", "pages": [ "index", - "---Getting Started---", "getting-started", - "---Commands---", "commands", - "---Guides---", "guides", - "---Concepts---", "concepts", - "---Contributing---", "contributing" ] } diff --git a/apps/docs/package.json b/apps/docs/package.json index c694de5..c943768 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -4,8 +4,11 @@ "private": true, "scripts": { "build": "next build", + "clean": "node -e \"require('node:fs').rmSync('.next', { recursive: true, force: true })\"", "dev": "next dev", + "dev:clean": "pnpm run clean && next dev", "start": "next start", + "test": "node --test test/**/*.test.mjs", "typecheck": "fumadocs-mdx && next typegen && tsc --noEmit", "postinstall": "fumadocs-mdx", "lint": "biome check", diff --git a/apps/docs/src/app/(home)/layout.tsx b/apps/docs/src/app/(home)/layout.tsx index 77379fa..89a06f2 100644 --- a/apps/docs/src/app/(home)/layout.tsx +++ b/apps/docs/src/app/(home)/layout.tsx @@ -1,6 +1,7 @@ import { HomeLayout } from 'fumadocs-ui/layouts/home'; +import type { ReactNode } from 'react'; import { baseOptions } from '@/lib/layout.shared'; -export default function Layout({ children }: LayoutProps<'/'>) { +export default function Layout({ children }: { children: ReactNode }) { return {children}; } diff --git a/apps/docs/src/app/(home)/page.tsx b/apps/docs/src/app/(home)/page.tsx index 4d7a893..dea2081 100644 --- a/apps/docs/src/app/(home)/page.tsx +++ b/apps/docs/src/app/(home)/page.tsx @@ -1,16 +1,181 @@ +import { + ArrowRight, + GitBranch, + Layers, + RefreshCw, + Sparkles, + Terminal, +} from 'lucide-react'; import Link from 'next/link'; +const features = [ + { + icon: Layers, + title: 'Stacked Branches', + description: + 'Split work into focused, dependent layers. Each branch builds on the one below, keeping PRs small and reviewable.', + }, + { + icon: RefreshCw, + title: 'Auto Restack', + description: + 'When a lower branch changes, dub restack propagates it upstack. Conflict recovery is built in with dub continue and dub abort.', + }, + { + icon: Terminal, + title: 'Graphite Compatible', + description: + 'If you have gt muscle memory, DubStack maps 1:1. Same mental model, same workflow patterns, fully local-first.', + }, + { + icon: Sparkles, + title: 'AI Powered', + description: + 'AI-generate branch names and commit messages from staged changes. Ask the built-in assistant for stack-aware guidance.', + }, +]; + export default function HomePage() { return ( -
-

Hello World

-

- You can open{' '} - - /docs - {' '} - and see the documentation. -

+
+ {/* Hero */} +
+
+
+
+ + Local-first CLI for stacked branch workflows +
+

+ Ship stacked PRs{' '} + without the friction +

+

+ DubStack makes stacked branch workflows fast and safe. Create + dependent branches, restack automatically, and submit entire PR + stacks in one command. +

+
+
+              
+                {'brew tap wiseiodev/dubstack\nbrew install dubstack'}
+              
+            
+
+
+ + Get Started + + + + + View on GitHub + +
+
+
+ + {/* Features */} +
+

+ Built for the stacked PR workflow +

+

+ Everything you need to manage dependent branches, from creation to + merge. +

+
+ {features.map((feature) => ( +
+
+ +
+

+ {feature.title} +

+

+ {feature.description} +

+
+ ))} +
+
+ + {/* Quick Example */} +
+
+

+ From zero to stacked PRs +

+

+ Create a three-layer stack, view it, and submit all PRs in just a + few commands. +

+
+            
+              {`# Start from trunk
+git checkout main && git pull
+
+# Create stacked branches
+dub create feat/auth-types -am "feat: add auth types"
+dub create feat/auth-login -am "feat: add login flow"
+dub create feat/auth-tests -am "test: add auth tests"
+
+# View your stack
+dub log
+
+# Submit all PRs
+dub ss`}
+            
+          
+
+ + Read the full quick start guide + + +
+
+
+ + {/* Footer */} +
); } diff --git a/apps/docs/src/app/docs/[[...slug]]/page.tsx b/apps/docs/src/app/docs/[[...slug]]/page.tsx index 32f8c2d..7593a68 100644 --- a/apps/docs/src/app/docs/[[...slug]]/page.tsx +++ b/apps/docs/src/app/docs/[[...slug]]/page.tsx @@ -8,7 +8,6 @@ import { createRelativeLink } from 'fumadocs-ui/mdx'; import type { Metadata } from 'next'; import { notFound } from 'next/navigation'; import { LLMCopyButton, ViewOptions } from '@/components/ai/page-actions'; -import { gitConfig } from '@/lib/layout.shared'; import { getPageImage, source } from '@/lib/source'; import { getMDXComponents } from '@/mdx-components'; @@ -29,7 +28,7 @@ export default async function Page(props: PageProps<'/docs/[[...slug]]'>) {
diff --git a/apps/docs/src/app/docs/layout.tsx b/apps/docs/src/app/docs/layout.tsx index 2c2ce95..2b67fa9 100644 --- a/apps/docs/src/app/docs/layout.tsx +++ b/apps/docs/src/app/docs/layout.tsx @@ -1,8 +1,9 @@ import { DocsLayout } from 'fumadocs-ui/layouts/docs'; +import type { ReactNode } from 'react'; import { baseOptions } from '@/lib/layout.shared'; import { source } from '@/lib/source'; -export default function Layout({ children }: LayoutProps<'/docs'>) { +export default function Layout({ children }: { children: ReactNode }) { return ( {children} diff --git a/apps/docs/src/app/global.css b/apps/docs/src/app/global.css index cd3cf62..b708963 100644 --- a/apps/docs/src/app/global.css +++ b/apps/docs/src/app/global.css @@ -1,3 +1,115 @@ @import "tailwindcss"; @import "fumadocs-ui/css/shadcn.css"; @import "fumadocs-ui/css/preset.css"; + +@custom-variant dark (&:is(.dark *)); + +:root { + --background: oklch(0.9824 0.0013 286.3757); + --foreground: oklch(0.3211 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.3211 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.3211 0 0); + --primary: oklch(0.6487 0.1538 150.3071); + --primary-foreground: oklch(1 0 0); + --secondary: oklch(0.6746 0.1414 261.338); + --secondary-foreground: oklch(1 0 0); + --muted: oklch(0.8828 0.0285 98.1033); + --muted-foreground: oklch(0.5382 0 0); + --accent: oklch(0.8269 0.108 211.9627); + --accent-foreground: oklch(0.3211 0 0); + --destructive: oklch(0.6368 0.2078 25.3313); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.8699 0 0); + --input: oklch(0.8699 0 0); + --ring: oklch(0.6487 0.1538 150.3071); + --sidebar: oklch(0.9824 0.0013 286.3757); + --sidebar-foreground: oklch(0.3211 0 0); + --sidebar-primary: oklch(0.6487 0.1538 150.3071); + --sidebar-primary-foreground: oklch(1 0 0); + --sidebar-accent: oklch(0.8269 0.108 211.9627); + --sidebar-accent-foreground: oklch(0.3211 0 0); + --sidebar-border: oklch(0.8699 0 0); + --sidebar-ring: oklch(0.6487 0.1538 150.3071); + --radius: 0.5rem; +} + +.dark { + --background: oklch(0.2303 0.0125 264.2926); + --foreground: oklch(0.9219 0 0); + --card: oklch(0.321 0.0078 223.6661); + --card-foreground: oklch(0.9219 0 0); + --popover: oklch(0.321 0.0078 223.6661); + --popover-foreground: oklch(0.9219 0 0); + --primary: oklch(0.6487 0.1538 150.3071); + --primary-foreground: oklch(1 0 0); + --secondary: oklch(0.588 0.0993 245.7394); + --secondary-foreground: oklch(0.9219 0 0); + --muted: oklch(0.3867 0 0); + --muted-foreground: oklch(0.7155 0 0); + --accent: oklch(0.6746 0.1414 261.338); + --accent-foreground: oklch(0.9219 0 0); + --destructive: oklch(0.6368 0.2078 25.3313); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.3867 0 0); + --input: oklch(0.3867 0 0); + --ring: oklch(0.6487 0.1538 150.3071); + --sidebar: oklch(0.2303 0.0125 264.2926); + --sidebar-foreground: oklch(0.9219 0 0); + --sidebar-primary: oklch(0.6487 0.1538 150.3071); + --sidebar-primary-foreground: oklch(1 0 0); + --sidebar-accent: oklch(0.6746 0.1414 261.338); + --sidebar-accent-foreground: oklch(0.9219 0 0); + --sidebar-border: oklch(0.3867 0 0); + --sidebar-ring: oklch(0.6487 0.1538 150.3071); + --radius: 0.5rem; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); + + --font-sans: var(--font-sans); + --font-mono: var(--font-mono); + --font-serif: var(--font-serif); + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/apps/docs/src/app/layout.tsx b/apps/docs/src/app/layout.tsx index 78aa9a2..0712a32 100644 --- a/apps/docs/src/app/layout.tsx +++ b/apps/docs/src/app/layout.tsx @@ -1,15 +1,78 @@ import { RootProvider } from 'fumadocs-ui/provider/next'; +import type { Metadata, Viewport } from 'next'; +import { + JetBrains_Mono, + Plus_Jakarta_Sans, + Source_Serif_4, +} from 'next/font/google'; import './global.css'; -import { Inter } from 'next/font/google'; -const inter = Inter({ +const plusJakartaSans = Plus_Jakarta_Sans({ subsets: ['latin'], + variable: '--font-sans', }); -export default function Layout({ children }: LayoutProps<'/'>) { +const sourceSerif4 = Source_Serif_4({ + subsets: ['latin'], + variable: '--font-serif', +}); + +const jetbrainsMono = JetBrains_Mono({ + subsets: ['latin'], + variable: '--font-mono', +}); + +export const metadata: Metadata = { + metadataBase: new URL('https://dubstack.dev'), + title: { + default: 'DubStack - Local-First CLI for Stacked Branch Workflows', + template: '%s | DubStack', + }, + description: + 'DubStack is a local-first CLI for stacked branch workflows. Create, manage, and submit stacked PRs with ease.', + keywords: [ + 'git', + 'stacked diffs', + 'stacked PRs', + 'CLI', + 'developer tools', + 'DubStack', + 'graphite alternative', + ], + authors: [{ name: 'wiseiodev' }], + openGraph: { + title: 'DubStack - Local-First CLI for Stacked Branch Workflows', + description: + 'Create, manage, and submit stacked PRs with ease. A Graphite-compatible CLI built for speed.', + url: 'https://dubstack.dev', + siteName: 'DubStack', + type: 'website', + }, + twitter: { + card: 'summary_large_image', + title: 'DubStack - Local-First CLI for Stacked Branch Workflows', + description: + 'Create, manage, and submit stacked PRs with ease. A Graphite-compatible CLI built for speed.', + }, +}; + +export const viewport: Viewport = { + themeColor: [ + { media: '(prefers-color-scheme: light)', color: '#f9f9fa' }, + { media: '(prefers-color-scheme: dark)', color: '#1a1a2e' }, + ], + width: 'device-width', + initialScale: 1, +}; + +export default function Layout({ children }: { children: React.ReactNode }) { return ( - - + + {children} diff --git a/apps/docs/src/app/og/docs/[...slug]/route.tsx b/apps/docs/src/app/og/docs/[...slug]/route.tsx index 8e6f002..1db3aa9 100644 --- a/apps/docs/src/app/og/docs/[...slug]/route.tsx +++ b/apps/docs/src/app/og/docs/[...slug]/route.tsx @@ -17,7 +17,7 @@ export async function GET( , { width: 1200, diff --git a/apps/docs/src/lib/layout.shared.tsx b/apps/docs/src/lib/layout.shared.tsx index de68d41..14d512c 100644 --- a/apps/docs/src/lib/layout.shared.tsx +++ b/apps/docs/src/lib/layout.shared.tsx @@ -1,17 +1,23 @@ import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; - -// fill this with your actual GitHub info, for example: -export const gitConfig = { - user: 'fuma-nama', - repo: 'fumadocs', - branch: 'main', -}; +import { GitBranch } from 'lucide-react'; export function baseOptions(): BaseLayoutProps { return { nav: { - title: 'My App', + title: ( + <> + + DubStack + + ), + url: '/', }, - githubUrl: `https://github.com/${gitConfig.user}/${gitConfig.repo}`, + githubUrl: 'https://github.com/wiseiodev/dubstack', + links: [ + { + text: 'Docs', + url: '/docs', + }, + ], }; } diff --git a/apps/docs/test/meta.test.mjs b/apps/docs/test/meta.test.mjs new file mode 100644 index 0000000..0beae4d --- /dev/null +++ b/apps/docs/test/meta.test.mjs @@ -0,0 +1,15 @@ +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import test from 'node:test'; + +const metaPath = path.join(process.cwd(), 'content', 'docs', 'meta.json'); + +test('docs root page tree uses folder entries without separator duplicates', async () => { + const meta = JSON.parse(await readFile(metaPath, 'utf8')); + const separatorEntries = meta.pages.filter((entry) => + entry.startsWith('---'), + ); + + assert.deepEqual(separatorEntries, []); +}); diff --git a/apps/docs/test/package-scripts.test.mjs b/apps/docs/test/package-scripts.test.mjs new file mode 100644 index 0000000..da2edd5 --- /dev/null +++ b/apps/docs/test/package-scripts.test.mjs @@ -0,0 +1,21 @@ +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import test from 'node:test'; + +const packageJsonPath = path.join(process.cwd(), 'package.json'); + +test('docs package exposes clean restart scripts for stale Next build output', async () => { + const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8')); + + assert.equal( + typeof packageJson.scripts.clean, + 'string', + 'expected docs package to define a clean script', + ); + assert.equal( + typeof packageJson.scripts['dev:clean'], + 'string', + 'expected docs package to define a dev:clean script', + ); +}); diff --git a/skills-lock.json b/skills-lock.json index e686f25..b4cb578 100644 --- a/skills-lock.json +++ b/skills-lock.json @@ -15,6 +15,11 @@ "source": "wiseiodev/dubstack", "sourceType": "github", "computedHash": "95eac34061564d5db87b946d9db5e39213f486609b3e3fef65cf23ecf2f1f2ef" + }, + "playwright-cli": { + "source": "microsoft/playwright-cli", + "sourceType": "github", + "computedHash": "7075ab30f588019197a2f1518bb4c9d33d69d33352af079b5f9c60303ad3886e" } } } From 07afdabd92876458853ece8c66fc29913e4a498d Mon Sep 17 00:00:00 2001 From: Daniel Wise Date: Sat, 7 Mar 2026 22:59:11 -0800 Subject: [PATCH 3/3] fix(ci): address PR review follow-ups --- .claude/agents/test-writer.md | 8 ++++---- .claude/settings.json | 2 +- .github/workflows/ci.yml | 1 + .github/workflows/merge-order.yml | 3 ++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.claude/agents/test-writer.md b/.claude/agents/test-writer.md index ff65ced..5fb19c0 100644 --- a/.claude/agents/test-writer.md +++ b/.claude/agents/test-writer.md @@ -6,10 +6,10 @@ Generate tests matching dubstack's existing conventions. Tests should cover chan - Framework: Vitest (`describe`, `it`, `expect`, `vi`, `beforeEach`, `afterEach`) - Test locations: - - Command logic: `src/commands/.test.ts` - - Library logic: `src/lib/.test.ts` - - Cross-command scenarios: `test/**/*.test.ts` -- Helper: `createTestRepo()` and `gitInRepo(dir, args)` from `test/helpers` + - Command logic: `packages/cli/src/commands/.test.ts` + - Library logic: `packages/cli/src/lib/.test.ts` + - Cross-command scenarios: `packages/cli/test/**/*.test.ts` +- Helper: `createTestRepo()` and `gitInRepo(dir, args)` from `packages/cli/test/helpers` - Pattern: create temp repo → `init(dir)` → commit → exercise command → assert state - Cleanup: `afterEach` calls `cleanup()` and restores `process.env` diff --git a/.claude/settings.json b/.claude/settings.json index 5514e3a..8981eef 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -6,7 +6,7 @@ "hooks": [ { "type": "command", - "command": "cd /Users/wise/dev/dubstack && pnpm biome check --write --changed --no-errors-on-unmatched 2>/dev/null || true" + "command": "cd \"$(git rev-parse --show-toplevel)\" && pnpm biome check --write --changed --no-errors-on-unmatched 2>/dev/null || true" } ] } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 746b49d..45d3f58 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,4 +36,5 @@ jobs: with: name: coverage-report path: packages/cli/coverage/ + if-no-files-found: ignore retention-days: 30 diff --git a/.github/workflows/merge-order.yml b/.github/workflows/merge-order.yml index 85f47c8..323e1d7 100644 --- a/.github/workflows/merge-order.yml +++ b/.github/workflows/merge-order.yml @@ -18,7 +18,8 @@ jobs: node-version-file: .nvmrc cache: pnpm - run: pnpm install --frozen-lockfile + - run: pnpm --filter=dubstack build - name: Validate DubStack merge order env: GH_TOKEN: ${{ github.token }} - run: pnpm --filter=dubstack run dev merge-check --pr ${{ github.event.pull_request.number }} + run: node packages/cli/dist/index.js merge-check --pr ${{ github.event.pull_request.number }}