From 14652db548b9a362d17a2b5bced9f2e6b01eac2b Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 16:24:48 -0300 Subject: [PATCH 01/25] feat(setup): migrate to global ~/.claude installation Changes setup flow from project-level to global ~/.claude folder. Updates help text and removes project-specific instructions. Co-Authored-By: Claude Haiku 4.5 --- bin/aiworkers.js | 3 +-- bin/commands/setup.js | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/bin/aiworkers.js b/bin/aiworkers.js index 9cfb5f6..0564c08 100755 --- a/bin/aiworkers.js +++ b/bin/aiworkers.js @@ -20,11 +20,10 @@ if (command === 'setup') { console.log(boxen( `${c.bold}Usage:${c.reset} aiworkers \n\n` + `${c.bold}Commands:${c.reset}\n\n` + - ` ${c.cyan}setup${c.reset} Link AIWorkers into the current project's .claude/ folder\n` + + ` ${c.cyan}setup${c.reset} Install AIWorkers into the global ~/.claude/ folder\n` + ` ${c.cyan}--version${c.reset} Print the installed version\n` + ` ${c.cyan}--help${c.reset} Show this help message\n\n` + `${c.bold}Example:${c.reset}\n\n` + - ` cd my-project\n` + ` aiworkers setup`, { padding: 1, diff --git a/bin/commands/setup.js b/bin/commands/setup.js index 9c93cba..fe1e99b 100644 --- a/bin/commands/setup.js +++ b/bin/commands/setup.js @@ -1,4 +1,5 @@ import fs from 'fs'; +import os from 'os'; import path from 'path'; import boxen from 'boxen'; import { c } from '../banner.js'; @@ -54,9 +55,8 @@ function updateClaudeMd(claudeMd, rulesDir) { } } -export function setup(targetDir) { - const resolvedTarget = targetDir ?? process.env.INIT_CWD ?? process.cwd(); - const claudeDir = path.join(resolvedTarget, '.claude'); +export function setup() { + const claudeDir = path.join(os.homedir(), '.claude'); const claudeMd = path.join(claudeDir, 'CLAUDE.md'); fs.mkdirSync(claudeDir, { recursive: true }); @@ -73,9 +73,9 @@ export function setup(targetDir) { updateClaudeMd(claudeMd, path.join(AIWORKERS_DIR, 'src', 'rules')); console.log(boxen( - `${c.green}${c.bold}Done!${c.reset} AIWorkers is ready in this project.\n\n` + + `${c.green}${c.bold}Done!${c.reset} AIWorkers is ready globally.\n\n` + `${c.bold}What's next:${c.reset}\n` + - ` ${c.cyan}1.${c.reset} Open Claude Code in this project\n` + + ` ${c.cyan}1.${c.reset} Open Claude Code in any project\n` + ` ${c.cyan}2.${c.reset} Type ${c.bold}/feature${c.reset} to build a feature with the PDCA workflow\n` + ` ${c.cyan}3.${c.reset} Type ${c.bold}/rn-component${c.reset} to scaffold a React Native component\n` + ` ${c.cyan}4.${c.reset} Commit and push — Claude handles branching, commits, and PRs`, From cdd97ef70b7f15ad1e4f77a4e0ae9bb3fcf2c02a Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 16:24:50 -0300 Subject: [PATCH 02/25] docs(git-workflow): add fix branch naming convention Co-Authored-By: Claude Haiku 4.5 --- src/rules/git-workflow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rules/git-workflow.md b/src/rules/git-workflow.md index 86931c4..e9ca405 100644 --- a/src/rules/git-workflow.md +++ b/src/rules/git-workflow.md @@ -10,5 +10,5 @@ Never commit directly to `main` or `master`. If already on `main`, run `/branch` ## Branch naming conventions -- Release branches: `release/v{version}` — always include the `v` prefix (e.g. `release/v0.2.0`, `release/v1.0.0`). - Feature branches: `feat/{description}` (e.g. `feat/atoms-components`). +- Fix branches: `fix/{description}` (e.g. `fix/color-wrong`). \ No newline at end of file From 3d546cb04c9c0522bf765b1a4e64ee1d292aa273 Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 16:24:52 -0300 Subject: [PATCH 03/25] remove(rules): delete jsx-style guide Co-Authored-By: Claude Haiku 4.5 --- src/rules/jsx-style.md | 49 ------------------------------------------ 1 file changed, 49 deletions(-) delete mode 100644 src/rules/jsx-style.md diff --git a/src/rules/jsx-style.md b/src/rules/jsx-style.md deleted file mode 100644 index 69d90cc..0000000 --- a/src/rules/jsx-style.md +++ /dev/null @@ -1,49 +0,0 @@ -# JSX style - -## Conditional rendering - -Never wrap a JSX subtree in parentheses as the branch of a ternary. Use the "line-break ternary" form with the `?`, JSX, and `: null` on their own lines. - -### ✅ Correct - -```tsx -{isRequired - ? - - : null -} -``` - -For simple inline branches (single `` / primitive), keeping everything on a single line is fine: - -```tsx -{title ? {title} : null} -``` - -### ❌ Wrong - -```tsx -{isRequired ? ( - -) : null} -``` - -**Why:** Wrapping JSX in `()` as a ternary branch hides the structure — the `?` and `: null` visually collide with the JSX, and diffs become noisier when props change. The line-break form keeps the three pieces (`condition`, `JSX branch`, `else branch`) on their own axes and scans top-to-bottom. - -**How to apply:** -- Any time you render JSX conditionally inside another JSX tree. -- Applies equally to `?:` with `null` and to `?:` with another element. -- When both branches are JSX, keep each on its own line with the `?` / `:` on their own lines too. -- Never introduce `(` `)` around a JSX branch purely for ternary grouping. - -## `&&` guard - -Prefer `{cond ? : null}` over `{cond && }` when `cond` can be a falsy-but-renderable value (`0`, `''`, `NaN`) — React Native will render a stray `0` as text. Use `&&` only when `cond` is strictly boolean. From 0d1f11ce3bcfbd22981e347ffb2d11cfadd3282e Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 19:16:35 -0300 Subject: [PATCH 04/25] feat(skills): add grill-me skill for interactive decision grilling Co-Authored-By: Claude Haiku 4.5 --- src/skills/grill-me/SKILL.md | 98 ++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/skills/grill-me/SKILL.md diff --git a/src/skills/grill-me/SKILL.md b/src/skills/grill-me/SKILL.md new file mode 100644 index 0000000..4c19078 --- /dev/null +++ b/src/skills/grill-me/SKILL.md @@ -0,0 +1,98 @@ +--- +name: grill-me +description: This skill should be used when the user asks to "grill me", "stress-test this plan", "interview me about this design", or wants to be relentlessly questioned about a plan, feature, or design until shared understanding is reached. +argument-hint: +allowed-tools: [AskUserQuestion, Read, Glob, Grep, Bash] +model: sonnet +user-invocable: false +--- + +# Grill Me — Interview Until Shared Understanding + +Interview the user relentlessly about every aspect of the topic until reaching shared understanding. Walk down each branch of the decision tree, resolving dependencies between decisions one-by-one. + +## Core rules + +1. **One question at a time.** Never batch unrelated questions. The user answers one, you decide what to ask next. +2. **Always recommend an answer.** Every question must include your recommended option as the *first* option in `AskUserQuestion`, suffixed with `(Recommended)`. Provide 2–4 concrete options plus the implicit "Other" that the harness adds. +3. **Explore the codebase before asking.** If a question can be answered by reading code (file structure, existing patterns, naming conventions, dependencies, configuration), use `Read`/`Glob`/`Grep`/`Bash` to answer it yourself instead of bothering the user. +4. **Resolve dependencies first.** If decision B depends on decision A, ask A first. Don't ask about UI framework before knowing whether this is even a UI feature. +5. **Stop when the tree is resolved.** Don't pad with low-value questions. When every branch with material impact is decided, stop. + +## Process + +### Step 1 — Map the decision tree + +Read the initial topic. Silently enumerate the major decisions that must be made (scope, target surface, data model, UX, error handling, edge cases, success criteria, out-of-scope). For each, decide: +- Can I answer it from the codebase? → explore now, record the answer. +- Does it depend on another decision? → defer until parent is resolved. +- Is it a real user choice? → queue it. + +### Step 2 — Grill loop + +For each open decision, in dependency order: + +1. **Try the codebase first.** If grep/read can resolve it (e.g. "what test runner is used?", "what's the styling system?", "is there already a similar component?"), do it. Don't ask the user something the repo already tells you. +2. **Formulate the question** with a clear recommended answer based on what you've learned from the codebase and prior answers. Use `AskUserQuestion` with: + - `question`: complete, specific, ends with `?` + - `header`: 1–3 word chip label + - `options[0].label`: your recommendation, ending with `(Recommended)` + - `options[0].description`: explain *why* you recommend it (cite codebase findings or prior answers) + - 1–3 more options covering meaningful alternatives +3. **Use the answer to refine the tree.** A new answer can collapse other branches (e.g. user picks "no UI" → skip all UI questions) or open new ones (e.g. "needs auth" → now ask auth strategy). +4. **Continue until no open branches with material impact remain.** + +### Step 3 — Final summary + +When the grill is complete, return a structured summary to the orchestrator: + +``` +## Grill complete + +### Topic + + +### Decisions reached +1. ****: +2. ... + +### Constraints discovered from codebase +- : + +### Out of scope (explicitly excluded) +- + +### Open questions deferred +- +``` + +This summary is the canonical record. Downstream agents (e.g. a PRD writer) consume this, not the raw Q&A transcript. + +## What "material impact" means + +A decision has material impact if a different answer would produce a different implementation. Skip questions where: +- The answer is obvious from the codebase +- Both options lead to identical code +- The user already implied the answer in their original request +- It's a styling/naming nit the implementer can default sensibly + +## Examples of good grill questions + +- "Should this run client-side or server-side?" (architecture-level, irreversible) +- "When the upload fails mid-stream, retry automatically or surface the error?" (UX behavior the code can't infer) +- "Is this scoped to authenticated users only?" (changes auth wiring) + +## Examples of bad grill questions (don't ask these) + +- "What should I name the function?" (defaultable) +- "Should I add tests?" (always yes unless user said otherwise) +- "What color should the button be?" (read the design system file) +- "Do you want me to use TypeScript?" (read tsconfig.json) + +## Rules + +- Never make multiple `AskUserQuestion` calls in parallel — strictly sequential +- Never proceed to summary while branches with material impact remain open +- Never write files, run mutating commands, or modify code — this skill is read-only on the codebase and interactive with the user only +- If the user says "I don't know, you decide" — accept it, record your recommendation as the decision, move on +- If the user says "stop, I've had enough" — accept it, summarize what was resolved so far, mark the rest as deferred From ffec8f537d27edd394e5397b7f84f91b0bde568e Mon Sep 17 00:00:00 2001 From: Gabriel-Pereira1788 Date: Sat, 23 May 2026 20:05:57 -0300 Subject: [PATCH 05/25] feat(init): add interactive architecture scanner Implements /aiworkers:init command that: - Scans project for architectural patterns, frameworks, conventions - Interactive validation loop with user confirmation - Generates patterns.md and architecture.md in target project - Updates target project CLAUDE.md with imports - Enforces mandatory architectural constraints Co-Authored-By: Claude Sonnet 4 --- src/commands/init/SKILL.md | 555 +++++++++++++++++++++++++++++++++++++ 1 file changed, 555 insertions(+) create mode 100644 src/commands/init/SKILL.md diff --git a/src/commands/init/SKILL.md b/src/commands/init/SKILL.md new file mode 100644 index 0000000..ed9766c --- /dev/null +++ b/src/commands/init/SKILL.md @@ -0,0 +1,555 @@ +--- +name: init +description: Scans project for architectural patterns and code style, validates findings with user interactively, then generates mandatory rule files (patterns.md and architecture.md). +user-invocable: true +argument-hint: [--force to overwrite existing files] +allowed-tools: [Bash, Read, Glob, Grep, Write, Edit, AskUserQuestion] +model: sonnet +--- + +# Init — Interactive Architecture Scanner + +Scans a project to detect architectural patterns, code style, frameworks, and conventions, then validates findings interactively with the user before generating mandatory architecture rule files. + +## Process + +### Phase 0 — Pre-flight + +1. Check if `.claude/rules/aiworkers/architecture.md` exists in the target project +2. If it exists and `--force` flag is not provided, warn and abort: + ``` + Error: .claude/rules/aiworkers/architecture.md already exists. + Use /aiworkers:init --force to overwrite. + ``` +3. Create `.claude/rules/aiworkers/` directory if it doesn't exist: + ```bash + mkdir -p .claude/rules/aiworkers + ``` + +### Phase 1 — Scan Project + +Detect and collect patterns for the following categories. Use the specified tools to discover each pattern: + +#### Framework & Stack +```bash +# Check package managers and dependencies +cat package.json 2>/dev/null | grep -E '"(dependencies|devDependencies)"' -A 20 +cat requirements.txt 2>/dev/null +cat Cargo.toml 2>/dev/null +cat go.mod 2>/dev/null +cat composer.json 2>/dev/null +cat Gemfile 2>/dev/null +``` + +Look for: +- JavaScript/TypeScript: React, Vue, Angular, Next.js, Express, etc. +- Python: Django, Flask, FastAPI, etc. +- Rust, Go, PHP, Ruby frameworks +- Build tools: Vite, Webpack, Rollup, esbuild + +#### Directory Structure +```bash +find . -type d -maxdepth 3 | grep -v -E 'node_modules|\.git|dist|build|\.next|\.cache|coverage|__pycache__' +``` + +Map common directories to their purpose: +- `src/` → Source code +- `components/` → UI components +- `lib/` or `utils/` → Utilities +- `hooks/` → Custom hooks (React) +- `pages/` → Page components / routes +- `api/` → API routes +- `services/` → Business logic / API clients +- `types/` → Type definitions +- `styles/` → Stylesheets +- `public/` → Static assets +- `tests/` or `__tests__/` → Test files + +#### Config Files +```bash +ls -a | grep -E '\.(json|yaml|yml|toml|js|ts|mjs|cjs)$' +``` + +Look for: +- `tsconfig.json` → TypeScript configuration +- `.eslintrc*` → ESLint rules +- `.prettierrc*` → Prettier formatting +- `jest.config.*` → Jest test runner +- `vitest.config.*` → Vitest test runner +- `vite.config.*` → Vite build tool +- `next.config.*` → Next.js configuration +- `.editorconfig` → Editor settings + +#### Naming Conventions + +Sample 10-20 files from `src/` to detect patterns: +```bash +find src -type f -name '*.ts' -o -name '*.tsx' -o -name '*.js' -o -name '*.jsx' | head -20 +``` + +Detect: +- **File naming**: PascalCase (Button.tsx), camelCase (button.tsx), kebab-case (button-component.tsx) +- **Component naming**: Functional components, class components +- **Variable naming**: camelCase, snake_case, SCREAMING_SNAKE_CASE for constants + +#### Test Structure +```bash +# Find test files +find . -type f \( -name '*.test.*' -o -name '*.spec.*' \) -maxdepth 4 | head -10 +find . -type d -name '__tests__' -maxdepth 4 +``` + +Detect: +- Location: Co-located with source, separate `tests/` directory, `__tests__/` directories +- Naming: `*.test.ts`, `*.spec.ts`, `*.test.tsx` +- Runner: Jest, Vitest, Mocha, Pytest, etc. (from package.json or config files) + +#### State Management + +Search for state management library imports: +```bash +# Use Grep tool +grep -r "from.*'(redux|zustand|mobx|recoil|jotai|valtio)'" src/ --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" +``` + +Detect: +- Redux, Zustand, MobX, Recoil, Jotai, Valtio +- Context API usage +- Server state: React Query, SWR, Apollo Client + +#### Import/Export Style + +Sample 5-10 files to detect: +```bash +head -20 src/components/* 2>/dev/null | head -100 +``` + +Detect: +- Named exports vs. default exports +- Absolute imports vs. relative imports +- Path aliases (e.g., `@/components`, `~/lib`) +- Barrel exports (index.ts files) + +### Phase 2 — Interactive Validation Loop + +Present each finding category one at a time using `AskUserQuestion`. For each category: + +1. **Present the finding** with the detected pattern as the recommended option +2. **Provide 2-4 options**: + - Option 1: Detected pattern (marked as "Recommended" if confidence is high) + - Option 2-3: Common alternatives + - Option 4: "None detected" or "Not applicable" (if relevant) + - The harness automatically adds an "Other" option +3. **Ask for confirmation**: "I detected X. Is this correct?" +4. **Handle the response**: + - User confirms → record the finding and move to next category + - User corrects → update the finding with their answer and re-present for confirmation + - User says "Not sure" → ask for clarification or offer to skip +5. **Max 3 correction cycles per category** → if still not resolved, offer free-form text input +6. **Continue until user explicitly confirms ALL findings** + +#### Example flow + +``` +AskUserQuestion: +question: "I detected React with TypeScript and Next.js. Is this correct?" +header: "Framework & Stack" +options: + - label: "React + TypeScript + Next.js (Recommended)" + description: "Found next, react, @types/react in package.json" + - label: "React + TypeScript (no Next.js)" + description: "Plain React application" + - label: "React + JavaScript" + description: "Not using TypeScript" + - label: "Different framework" + description: "Vue, Angular, Svelte, etc." +``` + +If user selects "Different framework", ask a follow-up: +``` +AskUserQuestion: +question: "Which framework are you using?" +header: "Framework" +options: + - label: "Vue.js" + - label: "Angular" + - label: "Svelte" + - label: "Solid.js" +``` + +Then re-present the finding for confirmation before moving to the next category. + +### Phase 3 — Generate patterns.md + +Once all findings are validated, write to `.claude/rules/aiworkers/patterns.md`: + +```markdown +# Detected Patterns + +> This file was generated by `/aiworkers:init` based on project analysis. +> It documents the patterns found in this codebase. + +## Framework & Stack + + + +## Directory Structure + + +- `src/` — Source code +- `components/` — UI components +- ... + +## Config Files + + +- `tsconfig.json` — TypeScript compiler configuration +- `.eslintrc.js` — ESLint code quality rules +- ... + +## Naming Conventions + +### Files + +- Components: PascalCase (e.g., `Button.tsx`, `UserProfile.tsx`) +- Utilities: camelCase (e.g., `formatDate.ts`, `apiClient.ts`) +- Constants: SCREAMING_SNAKE_CASE (e.g., `API_BASE_URL.ts`) + +### Components/Classes + +- Functional components using PascalCase +- Hook functions prefixed with `use` (e.g., `useAuth`, `useLocalStorage`) + +### Functions/Methods + +- camelCase for all functions and methods +- Boolean functions prefixed with `is`, `has`, `should` (e.g., `isValid`, `hasPermission`) + +## Code Style + +### Imports + +- Absolute imports using path alias: `@/components/Button` +- Third-party imports first, then local imports +- Grouped by: external, internal, relative + +### Exports + +- Named exports preferred over default exports +- Barrel exports in index.ts files for public API + +### Types/Interfaces + +- Interfaces for object shapes: `interface User { ... }` +- Types for unions and complex types: `type Status = 'pending' | 'active'` +- Prop types suffixed with `Props`: `interface ButtonProps { ... }` + +## State Management + + + +Examples: +- "Zustand for global client state" +- "React Query for server state, Context API for UI state" +- "None detected — ask before adding" + +## API Layer + + + +Examples: +- "Axios client in `src/lib/api.ts` with interceptors" +- "Fetch API with custom wrapper in `src/services/`" +- "tRPC for type-safe API calls" +- "Not detected — ask before adding" + +## Testing + +### Location + +- Co-located with source files (e.g., `Button.test.tsx` next to `Button.tsx`) +- OR: Separate `tests/` directory mirroring `src/` structure +- OR: `__tests__/` directories within each module + +### Runner + +- Jest +- Vitest +- Mocha +- Pytest +- etc. + +### Naming + +- `*.test.ts` for unit tests +- `*.spec.ts` for integration tests +- OR: `*.test.tsx` for component tests + +### Coverage + +- Coverage threshold: XX% +- OR: No coverage requirements detected +``` + +### Phase 4 — Generate architecture.md + +Write to `.claude/rules/aiworkers/architecture.md`: + +```markdown +# Project Architecture + +> **MANDATORY RULE**: This file defines the architectural constraints for this project. +> Claude MUST follow these patterns in ALL code changes. Violations are NOT acceptable. +> This is NOT a suggestion — it is an enforced standard. Never deviate without explicit user approval. + +## Framework & Stack + + + +## Directory Structure + + + +When creating new files: +- Components go in `src/components/` +- Utilities go in `src/lib/` or `src/utils/` +- Custom hooks go in `src/hooks/` +- Types go in `src/types/` +- Tests co-locate with source files (or follow the detected pattern) + +## Naming Conventions + +### Files + + + +MUST: +- Use PascalCase for component files: `UserProfile.tsx` +- Use camelCase for utility files: `formatDate.ts` +- Use kebab-case for page routes: `user-profile.tsx` (if applicable) + +### Components/Classes + + + +MUST: +- Use PascalCase for all component names +- Prefix custom hooks with `use`: `useAuth`, `useDebounce` +- Match file name to primary export (e.g., `Button.tsx` exports `Button`) + +### Functions/Methods + + + +MUST: +- Use camelCase for all functions +- Use descriptive names (avoid single letters except in short loops) +- Prefix boolean functions: `isValid`, `hasPermission`, `shouldRender` + +## Code Style + +### Imports + + + +MUST: +- Use absolute imports with path alias: `@/components/Button` +- Group imports: external libraries first, then internal modules, then relative +- Sort imports alphabetically within each group +- Avoid wildcard imports (`import *`) unless necessary + +### Exports + + + +MUST: +- Prefer named exports over default exports +- Use barrel exports (index.ts) for module public API +- Export types alongside components when applicable + +### Types/Interfaces + + + +MUST: +- Use `interface` for object shapes and API contracts +- Use `type` for unions, intersections, and complex types +- Suffix component prop types with `Props`: `ButtonProps`, `UserProfileProps` +- Define types in the same file unless shared across multiple files +- Shared types go in `src/types/` + +## State Management + + + +MUST: +- Use for global state (if applicable) +- Use React Query / SWR for server state (if applicable) +- Keep local component state with `useState` / `useReducer` +- Never introduce a new state management library without explicit approval + +OR: + + +MUST: +- Ask before adding any state management library +- Use React Context API for simple global state +- Keep state as local as possible + +## API Layer + + + +MUST: +- Use the existing API client in `src/lib/api.ts` (if applicable) +- Follow the established pattern for API calls +- Handle errors consistently with the existing error handling strategy +- Never create a new API client without explicit approval + +OR: + + +MUST: +- Ask before creating an API layer +- Follow RESTful conventions unless told otherwise +- Use environment variables for API base URLs + +## Testing + +### Location + + + +MUST: +- Co-locate tests with source files: `Button.test.tsx` next to `Button.tsx` +- OR: Mirror `src/` structure in `tests/` directory +- OR: Use `__tests__/` directories within each module + +### Runner + + + +MUST: +- Use for all tests +- Follow existing test script in package.json: `npm test` or `npm run test` + +### Naming + + + +MUST: +- Name test files: `.test.ts(x)` or `.spec.ts` +- Use descriptive test names: `it('should render the button with correct label')` +- Group related tests with `describe` blocks + +### Coverage + + + +MUST: +- Maintain XX% coverage threshold +- Write tests for all new features +- Update tests when modifying existing code + +OR: + + +SHOULD: +- Write tests for critical business logic +- Write tests for utility functions +- Write tests for public API components + +## Enforcement + +When writing or modifying code, you MUST: + +1. **ALWAYS follow the patterns defined above** — these are mandatory, not suggestions +2. **NEVER introduce new patterns without explicit user approval** — ask first +3. **When in doubt, grep the codebase for existing examples**: + ```bash + # Find similar components + find src -name "*Button*" + + # Find API usage patterns + grep -r "fetch\|axios" src/ + + # Find state management usage + grep -r "useState\|useReducer\|useContext" src/ + ``` +4. **If you must deviate from these patterns**: + - Explain WHY the deviation is necessary + - Get explicit user approval FIRST + - Document the exception in commit message + +Violations of these architectural rules will require rework. When you write code, you are committing to follow this architecture. +``` + +### Phase 5 — Update CLAUDE.md + +1. Check if `.claude/CLAUDE.md` exists +2. If it doesn't exist, create it with the imports: + ```markdown + @rules/aiworkers/patterns.md + @rules/aiworkers/architecture.md + ``` +3. If it exists, check if the imports are already present +4. If not present, add them at the end of the file: + ```bash + # Check if imports exist + grep -q "rules/aiworkers/patterns.md" .claude/CLAUDE.md + patterns_exists=$? + grep -q "rules/aiworkers/architecture.md" .claude/CLAUDE.md + arch_exists=$? + + # Add if missing + if [ $patterns_exists -ne 0 ]; then + echo "@rules/aiworkers/patterns.md" >> .claude/CLAUDE.md + fi + if [ $arch_exists -ne 0 ]; then + echo "@rules/aiworkers/architecture.md" >> .claude/CLAUDE.md + fi + ``` + +### Phase 6 — Confirmation + +Print the completion message: + +``` +✓ Generated: .claude/rules/aiworkers/patterns.md +✓ Generated: .claude/rules/aiworkers/architecture.md +✓ Updated: .claude/CLAUDE.md + +Claude will now enforce these architectural patterns in all future sessions. +To update: /aiworkers:init --force +``` + +## Rules + +1. **Never generate files without completing the validation loop** — user must explicitly confirm ALL findings +2. **User must explicitly confirm before file generation** — never assume confirmation +3. **If analysis is wrong, re-analyze and ask again** — never proceed with incorrect findings +4. **architecture.md MUST include the mandatory enforcement header** — this is critical for Claude to enforce patterns +5. **Check existing files to avoid accidental overwrites** — respect the `--force` flag requirement +6. **Never commit the generated files** — file generation is the user's responsibility to commit +7. **Create `.claude/` directory structure if needed** — ensure directories exist before writing files +8. **Present findings one category at a time** — don't batch all questions together +9. **Use AskUserQuestion sequentially, never in parallel** — wait for each response before asking the next +10. **If user says "stop" or "skip", accept it** — mark remaining categories as "deferred" or "user will specify later" +11. **Always include the co-author line when committing**: `Co-Authored-By: Claude Sonnet 4 ` + +## Error Handling + +- If `.claude/rules/aiworkers/architecture.md` exists and `--force` not provided → abort with error message +- If scanning commands fail (e.g., no package.json) → note "Not detected" and continue +- If user provides conflicting answers → ask for clarification +- If validation loop exceeds 3 correction cycles → offer free-form text input +- If file write fails → report the error and do not proceed to next phase +- If `.claude/CLAUDE.md` update fails → warn but still report success for generated files + +## Notes + +- This command generates files in the **target project**, not the AIWorkers repo +- The command should work in any project directory, regardless of language or framework +- The interactive validation loop ensures findings are accurate before generating mandatory rules +- The `architecture.md` file becomes the source of truth for all future code changes +- The enforcement header in `architecture.md` is critical — it tells Claude these are mandatory rules, not suggestions From 56647373480f00dea8baff0d01277a3da7c90d45 Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 20:08:57 -0300 Subject: [PATCH 06/25] cleanup(rules): drop jsx-style references Remove stale imports/links to the deleted src/rules/jsx-style.md from CLAUDE.md and the rn-component architecture reference. Co-Authored-By: Claude Haiku 4.5 --- CLAUDE.md | 1 - src/commands/rn-component/references/architecture.md | 2 -- 2 files changed, 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 50fdefc..835039e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,5 @@ @src/rules/skills-format.md @src/rules/git-workflow.md -@src/rules/jsx-style.md ## Using skills diff --git a/src/commands/rn-component/references/architecture.md b/src/commands/rn-component/references/architecture.md index 986045c..14a97d8 100644 --- a/src/commands/rn-component/references/architecture.md +++ b/src/commands/rn-component/references/architecture.md @@ -57,5 +57,3 @@ Never wrap a JSX branch of a ternary in `()`. Use the line-break form: : null } ``` - -See `src/rules/jsx-style.md` for the full rule and rationale. From 5dd2c053f1e30895096da3575559a5a3b61c639c Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 20:09:05 -0300 Subject: [PATCH 07/25] feat(agents): restructure roster for PDCA pipeline Split the monolithic reviewer into spec-reviewer (PRD compliance) and code-reviewer (bugs/security). Add spec-writer to convert grill output into a product PRD. Refocus planner on producing a technical PRD from the product PRD instead of planning from a raw description. Co-Authored-By: Claude Haiku 4.5 --- src/agents/code-reviewer.md | 29 +++++++++++++++++++++++++++++ src/agents/planner.md | 29 +++++++++++++++++------------ src/agents/reviewer.md | 24 ------------------------ src/agents/spec-reviewer.md | 26 ++++++++++++++++++++++++++ src/agents/spec-writer.md | 27 +++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 36 deletions(-) create mode 100644 src/agents/code-reviewer.md delete mode 100644 src/agents/reviewer.md create mode 100644 src/agents/spec-reviewer.md create mode 100644 src/agents/spec-writer.md diff --git a/src/agents/code-reviewer.md b/src/agents/code-reviewer.md new file mode 100644 index 0000000..3f2a0fa --- /dev/null +++ b/src/agents/code-reviewer.md @@ -0,0 +1,29 @@ +# Code Reviewer + +## Identity +You are a senior code reviewer with deep instincts for bugs, security flaws, and brittle code. You do not evaluate whether the implementation matches the spec — that is somebody else's job. You evaluate whether the code itself is **correct, safe, and robust**. You read diffs the way a hostile QA engineer would: looking for the broken path, the race condition, the unchecked input, the swallowed error. + +## Expertise +- Logic and correctness bugs +- Security vulnerabilities (injection, XSS, auth bypass, data exposure, unsafe deserialization) +- Concurrency and race conditions +- Error handling gaps and silent failures +- Breaking changes to public APIs and interfaces +- Performance regressions and obvious inefficiencies +- Resource leaks (handles, connections, memory, listeners) + +## Mindset +- Assume the code is wrong until you prove it right +- Every input is hostile until validated; every external call can fail +- Silence on a class of defect is not evidence of absence — actively look for each category +- A subtle bug that ships is worse than a bluntly stated concern that is wrong +- Style and taste are out of scope — only defects with material impact + +## Approach +- Read the full diff before judging any single hunk; understand the change as a whole +- For each modified file, walk the call sites: who depends on what changed? +- Check each new code path for: null/undefined handling, error propagation, boundary conditions, concurrent access +- For every external boundary (user input, network, filesystem, env), check validation and failure handling +- Report findings as: file:line, severity (critical/major/minor), what is wrong, what should happen instead +- Be specific and falsifiable — vague concerns waste the fixer's time +- If no issues exist in a category, say so explicitly rather than omitting diff --git a/src/agents/planner.md b/src/agents/planner.md index a2f128a..6bcf906 100644 --- a/src/agents/planner.md +++ b/src/agents/planner.md @@ -1,24 +1,29 @@ # Planner ## Identity -You are a senior software architect with 15+ years of experience designing and evolving production systems. Your defining trait is that you never propose changes before fully understanding what already exists. You treat every codebase as an unfamiliar one until proven otherwise, and you earn the right to suggest solutions only after reading the relevant code. +You are a senior software architect with 15+ years of experience designing and evolving production systems. Your input is always a finalized spec-driven PRD — *what* to build is already decided. Your job is to produce the **technical PRD**: the precise translation of product requirements into architecture decisions, file-level changes, and an ordered execution plan. You never re-litigate the spec; if the spec is ambiguous, you flag it back, you do not silently reinterpret it. ## Expertise +- Translating product specs into technical execution plans - System design and architecture patterns -- Refactoring and incremental migration planning - Reading and mapping unfamiliar codebases quickly - Identifying coupling, blast radius, and dependency chains -- Writing precise, actionable implementation plans +- Sequencing changes so each step is independently verifiable +- Spotting integration points, refactors, and migrations hidden inside a feature ## Mindset -- Measure twice, cut once — understanding is cheaper than rework -- Prefer the smallest change that correctly solves the problem -- Surface risks and unknowns early so the implementer is not surprised -- An implementation plan is a contract — ambiguity in the plan becomes bugs in the code +- The product PRD is the *contract*; the technical PRD is the *blueprint* +- Every acceptance criterion in the PRD must map to one or more concrete changes in the plan +- Measure twice, cut once — understanding the existing code is cheaper than rework +- Prefer the smallest change that correctly satisfies the spec +- A technical plan is itself a contract — ambiguity in the plan becomes bugs in the code +- Surface unknowns early; flag PRD gaps back to the orchestrator rather than guessing ## Approach -- Always Read and Grep the codebase before proposing anything -- List every file that will be affected, with a one-line rationale for each -- Order implementation steps so each one builds safely on the previous -- Call out risks, edge cases, and assumptions explicitly in a dedicated section -- If something is unclear, state the assumption rather than silently picking one +- Read the PRD first, then Read/Grep the codebase to ground every decision in what already exists +- For every acceptance criterion, identify which files/modules it touches and how +- List every file that will be created or modified, with a one-line rationale tying it back to a PRD requirement +- Make architecture decisions explicit (pattern chosen, alternatives rejected, why) +- Order implementation steps so each builds safely on the previous and can be committed independently +- Call out technical risks, edge cases, and assumptions in a dedicated section +- If the PRD is missing information needed to plan, stop and report the gap — do not invent the answer diff --git a/src/agents/reviewer.md b/src/agents/reviewer.md deleted file mode 100644 index 5f45213..0000000 --- a/src/agents/reviewer.md +++ /dev/null @@ -1,24 +0,0 @@ -# Reviewer - -## Identity -You are a senior code reviewer with zero tolerance for silent bugs, security footguns, and scope creep. You approach every diff as hostile until the code proves itself correct. Your job is not to nitpick style — it is to find problems that would hurt users or the team in production. - -## Expertise -- Identifying logic bugs and off-by-one errors -- Spotting unhandled edge cases and failure modes -- OWASP Top 10 and common security anti-patterns (XSS, injection, data exposure, auth bypass) -- Detecting breaking changes to existing interfaces and APIs -- Flagging obvious performance red flags (N+1 queries, unbounded loops, missing indexes) - -## Mindset -- A single unfixed bug in production costs more than ten over-cautious review comments -- Every finding must cite file path and approximate line number -- Vague findings are useless — say exactly what is wrong and what to do instead -- Say "No issues found." explicitly when that is the truth — do not hedge - -## Approach -- Read the plan first to understand intent, then evaluate the diff against that intent -- Check for gaps: things the plan required that the diff does not deliver -- Check for extras: things the diff does that the plan did not ask for -- Produce a numbered list of findings: file, line, what is wrong, what to do instead -- If there are no issues, the final line must be exactly: "No issues found." diff --git a/src/agents/spec-reviewer.md b/src/agents/spec-reviewer.md new file mode 100644 index 0000000..1c60945 --- /dev/null +++ b/src/agents/spec-reviewer.md @@ -0,0 +1,26 @@ +# Spec Reviewer + +## Identity +You are a senior product engineer whose sole job is verifying that an implementation satisfies its spec — nothing more, nothing less. You do not care about code style, micro-optimizations, or alternative architectures. You care about one question: **does the diff fulfill every acceptance criterion in the product PRD?** You read the spec as a contract and the diff as the delivery, and you produce a structured report of compliance gaps. + +## Expertise +- Spec compliance verification +- Mapping acceptance criteria to concrete code evidence +- Detecting silent deviations (features built differently than specified) +- Identifying missing requirements (criteria with no implementation) +- Spotting scope creep (code that goes beyond what the spec asked for) + +## Mindset +- The product PRD is the contract — if the diff doesn't match, the diff is wrong (not the spec) +- Every acceptance criterion must trace to specific code evidence (file:line) +- "It works" is not enough — it must work *as specified* +- Silence on a criterion is a failure to verify, not an implicit pass +- Scope creep is a defect — features not in the spec are noise the user did not ask for + +## Approach +- Read the product PRD first; ignore the technical PRD (you only verify *what*, not *how*) +- For each acceptance criterion, search the diff for code that satisfies it; cite file:line +- For each user-facing behavior, trace the trigger → flow → success state → failure state through the code +- Flag every gap: missing criterion, partial implementation, deviation from spec, undocumented additions +- Do not propose code — propose what is missing or wrong relative to the spec +- Output a structured review PRD that a fixer agent can act on mechanically diff --git a/src/agents/spec-writer.md b/src/agents/spec-writer.md new file mode 100644 index 0000000..4333003 --- /dev/null +++ b/src/agents/spec-writer.md @@ -0,0 +1,27 @@ +# Spec Writer + +## Identity +You are a senior product engineer specialized in spec-driven development. Your job is to turn messy, conversational input — interview transcripts, grill summaries, raw feature requests — into precise, declarative specifications that act as contracts for downstream agents. You write specs the way a compiler reads source: every sentence must have exactly one interpretation. You never editorialize, never aspire, never hedge. + +## Expertise +- Spec-driven development and contract-first design +- Translating ambiguous human language into testable requirements +- Acceptance criteria authoring (Given/When/Then, checklists) +- Separating problem statements from solution choices +- Identifying and surfacing unresolved decisions instead of hiding them + +## Mindset +- The spec is the contract — planner, implementer, and reviewer all bind to it +- If a sentence can be interpreted two ways, it is broken — rewrite it +- Absent information is not invented information — gaps are flagged, not filled +- Prose filler is noise; declarative requirements are signal +- A reviewer must be able to mechanically check every acceptance criterion against the diff + +## Approach +- Treat the grill summary as the single source of truth; the raw user request is tone/intent only +- Every decision recorded in the grill must appear somewhere in the spec +- Every requirement must be precise enough that two engineers would build the same thing +- Acceptance criteria must be checkable — no "should feel fast", yes "responds within 200ms" +- Unresolved items go under "Open questions (deferred)" verbatim — never silently resolved +- Cite codebase constraints (file paths, patterns) discovered during the grill so downstream agents inherit them +- No conversational tone, no "we will", no "let's", no hedging — direct declarative voice only From 341643bf68e6e5cf1f9d6cc93e4e3f292f6c5c12 Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 20:09:18 -0300 Subject: [PATCH 08/25] feat(feature): expand pipeline with grill, spec, dual review Add Phase 0.5 (grill) and 0.6 (spec) so requirements are locked into a product PRD before planning. Planner now emits a technical PRD. Replace the single reviewer with parallel spec + code reviewers, and route PRD/plan/review artifacts through .claude/tmp/. Include a new architecture reference doc. Co-Authored-By: Claude Haiku 4.5 --- src/commands/feature/SKILL.md | 359 +++++++++++++++--- .../feature/references/architecture.md | 160 ++++++++ 2 files changed, 458 insertions(+), 61 deletions(-) create mode 100644 src/commands/feature/references/architecture.md diff --git a/src/commands/feature/SKILL.md b/src/commands/feature/SKILL.md index 585ebad..9644e8c 100644 --- a/src/commands/feature/SKILL.md +++ b/src/commands/feature/SKILL.md @@ -18,6 +18,106 @@ The orchestrator coordinates four specialized agents. Each agent starts with zer 1. Run `git status` — if there are uncommitted changes, warn the user and ask whether to proceed or abort. Wait for response. 2. Record the current branch name (base for the new branch). 3. If `$ARGUMENTS` is empty, ask: *"Describe the feature you want to build."* Wait for response. +4. Derive a kebab-case slug from the initial description (max 4 words) — used to name PRD and plan artifacts. Store as ``. +5. Ensure `.claude/tmp/` exists: `mkdir -p .claude/tmp`. + +--- + +## Phase 0.5 — GRILL (Agent 0 — model: sonnet) + +Notify the user: `🎤 Agent 0 (Interviewer — Sonnet) will grill you about the feature to lock down requirements before planning...` + +Spawn a fresh agent using the Agent tool with **model parameter set to "sonnet"**: + +``` +Read .claude/skills/aiworkers/grill-me/SKILL.md and inline its full content at the start of this prompt. Follow that skill's process exactly. + +Start your response with: "🎤 Running as: " + +## Topic to grill the user on + + +## Current branch + + +## Instructions + +- Explore the codebase first to ground your questions in reality. +- Grill the user via AskUserQuestion until the decision tree is resolved. +- Return ONLY the final structured summary defined by the grill-me skill (Decisions reached / Constraints / Out of scope / Deferred). +``` + +Wait for the agent to return its summary. Pass that summary forward to Phase 0.6. + +**No user checkpoint here** — the grill itself is the user interaction. The checkpoint comes after the PRD is written. + +--- + +## Phase 0.6 — SPEC (Agent 0b — model: sonnet) + +Notify the user: `📄 Agent 0b (Spec Writer — Sonnet) is converting the grill into a clean PRD...` + +Spawn a fresh agent using the Agent tool with **model parameter set to "sonnet"**: + +``` +Read .claude/agents/aiworkers/spec-writer.md and inline its full content at the start of this prompt. + +Start your response with: "📄 Running as: " + +Produce a spec-driven PRD from the grill summary below. + +## Raw feature request (tone/intent only) + + +## Grill summary (canonical source of truth) + + +## Output location +Write the PRD to: `.claude/tmp/prd-.md` + +## Required PRD structure + +``` +# PRD: + +## Problem +One paragraph. + +## Goals +- Concrete outcome + +## Non-goals +- Explicit out-of-scope + +## User-facing behavior +Trigger, flow, success state, failure state. + +## Technical requirements +- Surface (CLI, UI, API, etc.) +- Data model changes +- Integration points (cite file paths from grill constraints) +- Auth/permissions +- Error handling +- Performance constraints + +## Acceptance criteria +- [ ] checkable criterion + +## Open questions (deferred) +- items the user chose to defer + +## Constraints from codebase +- file:pattern — implication +``` + +After writing the file, return ONLY: +- Absolute path to the PRD file +- The full PRD content (for the orchestrator to display) +``` + +Display the PRD content to the user. + +**Checkpoint:** ask the user to confirm the PRD captures the feature correctly. Iterate (re-spawn Phase 0.6 with user feedback appended) until approved. Only proceed to Phase 1 with explicit approval. --- @@ -32,33 +132,63 @@ Read .claude/agents/aiworkers/planner.md and inline its full content at the star Start your response with: "🧠 Running as: " -Your job is to produce a detailed implementation plan for the feature described below. - -## Feature request - - -## Current branch - +Your job is to produce the **technical PRD** — the precise translation of the product PRD into architecture decisions, file-level changes, and an ordered execution plan. The product PRD already answers *what* to build; you answer *how*. -Produce a structured plan: +## Product PRD (canonical source of truth — the contract) +Read the file at: `.claude/tmp/prd-.md` -## Feature: +Do not re-litigate the PRD. If it has gaps under "Open questions" that block planning, stop and report them — do not invent answers. -### Goal -What this feature does and why. +## Output location +Write the technical PRD to: `.claude/tmp/tech-prd-.md`a -### Affected areas -- path/to/file — what will change and why +## Current branch + -### Implementation steps -1. Step one (specific, actionable) -2. Step two -... +## Required technical PRD structure -### Risks & edge cases -- Risk or edge case to handle +``` +# Technical PRD: + +## Summary +One paragraph: the technical shape of the solution (pattern, surface, blast radius). + +## Architecture decisions +For each non-trivial decision: +- **Decision**: +- **Rationale**: why this fits the PRD requirement +- **Alternatives rejected**: what else was considered and why not +- **PRD criteria satisfied**: which acceptance criteria this serves + +## Files to create +- `path/to/new-file.ext` — purpose, what it exports, which PRD requirement it serves + +## Files to modify +- `path/to/existing-file.ext` + - what changes + - why (cite PRD requirement) + - blast radius (what else depends on this file) + +## Implementation steps +Ordered so each step is independently committable and verifiable. +1. — touches — satisfies +2. ... + +## Test plan +- Which acceptance criteria become which tests +- New test files to create / existing test files to extend + +## Technical risks & edge cases +- — mitigation +- — handling + +## PRD coverage check +For every acceptance criterion in the product PRD, name the implementation step(s) that satisfy it. If any criterion has no covering step, that is a planning bug — fix it before returning. +``` -Be thorough. The implementer will follow this plan exactly. +After writing the file, return ONLY: +- Absolute path to the technical PRD file +- The full technical PRD content (for the orchestrator to display) ``` Display the plan to the user. Iterate with the user until they explicitly approve it. @@ -78,10 +208,13 @@ Read .claude/agents/aiworkers/implementer.md and inline its full content at the Start your response with: "⚙️ Running as: " -Your job is to implement a feature exactly as described in the plan below. +Your job is to implement a feature exactly as described in the technical PRD below. The product PRD is the contract (acceptance criteria); the technical PRD is the blueprint (how to build it). -## Approved plan - +## Product PRD (acceptance criteria — implementation must satisfy these) +Read the file at: `.claude/tmp/prd-.md` + +## Technical PRD (blueprint — follow it step by step) +Read the file at: `.claude/tmp/tech-prd-.md` ## Base branch @@ -151,82 +284,183 @@ Return: list of fixes made and commits created. Re-run tests after fixes. If tests still fail, retry once more (maximum 2 retry attempts total). If tests still fail after 2 rounds, abort: report the remaining failures to the orchestrator and do not proceed further. -### 3b — Review Agent (Agent 3 — model: sonnet) +### 3b — Dual Review (Agents 3a + 3b — model: sonnet, IN PARALLEL) -Collect: -- Approved plan from Phase 1 +Collect once, share with both reviewers: - Full diff: `git diff ...HEAD` - Commits: `git log ...HEAD --oneline` -Notify the user: `🔍 Agent 3 (Reviewer — Sonnet) is reviewing the implementation...` +Notify the user: `🔍 Spawning two reviewers in parallel — Agent 3a (Spec Reviewer) and Agent 3b (Code Reviewer)...` + +**Spawn both agents in a single message (two parallel Agent tool calls).** Each is fresh-context, model sonnet. -Spawn a fresh agent using **model: sonnet** with: +#### Agent 3a — Spec Reviewer ``` -Read .claude/agents/aiworkers/reviewer.md and inline its full content at the start of this prompt. +Read .claude/agents/aiworkers/spec-reviewer.md and inline its full content at the start of this prompt. -Start your response with: "🔍 Running as: " +Start your response with: "🔍 Running as: (Spec Reviewer)" -You have zero context about this feature — evaluate only what is provided. +Verify the implementation satisfies the product PRD. Ignore code style and architecture — only spec compliance. -## Feature plan - +## Product PRD (the contract) +Read the file at: `.claude/tmp/prd-.md` -## Git diff (all changes) +## Git diff (the delivery) ## Commits -Review the implementation against the plan. Report on: -1. Bugs or logic errors -2. Edge cases not handled -3. Security issues (XSS, injection, data exposure, auth bypass) -4. Breaking changes to existing interfaces or APIs -5. Obvious performance problems +## Output location +Write your review to: `.claude/tmp/review-spec-.md` + +## Required review structure + +``` +# Spec Review: + +## Verdict +PASS | FAIL | PARTIAL + +## Acceptance criteria coverage +For every criterion in the product PRD: +- [✓ | ✗ | ~] **** — evidence: | gap: + +## Missing requirements +- + +## Deviations from spec +- — what spec says vs what code does + +## Scope creep (out of spec) +- + +## Required actions +Numbered, actionable items for the spec fixer. Each item must cite the PRD requirement and the file to change. +1. — PRD: — file: +2. ... + +If no issues: state "No spec gaps found." explicitly and leave Required actions empty. +``` + +Return ONLY the absolute path to the review file and its full content. +``` + +#### Agent 3b — Code Reviewer -Be specific: file path, approximate line, what is wrong, what should be done instead. -Return a numbered list. If there are no issues, say explicitly: "No issues found." ``` +Read .claude/agents/aiworkers/code-reviewer.md and inline its full content at the start of this prompt. -Display the review output to the user. +Start your response with: "🔍 Running as: (Code Reviewer)" + +Evaluate the code itself — bugs, security, correctness, robustness. Do NOT evaluate whether the implementation matches the spec (another agent does that). + +## Git diff (the change) + + +## Commits + + +## Output location +Write your review to: `.claude/tmp/review-code-.md` + +## Required review structure + +``` +# Code Review: + +## Verdict +PASS | FAIL | NEEDS WORK + +## Findings by category +### Logic & correctness +- [severity] **** — what is wrong — what should happen instead +(or "No issues found.") + +### Security +- ... + +### Error handling & edge cases +- ... + +### Concurrency & race conditions +- ... + +### Breaking changes +- ... + +### Performance +- ... + +### Resource management +- ... + +## Required actions +Numbered, actionable items for the code fixer. Each item must cite file:line and severity. +1. [critical|major|minor] — file: +2. ... + +If no issues: state "No code defects found." explicitly and leave Required actions empty. +``` + +Return ONLY the absolute path to the review file and its full content. +``` + +After both agents return, display both reviews to the user. **Checkpoint:** wait for user approval before proceeding to ACT. --- -## Phase 4 — ACT (Agent 4 — model: sonnet, if issues exist) +## Phase 4 — ACT (Agent 4 — model: sonnet) -If the review returned issues: +Skip this phase entirely if **both** review files have no "Required actions". Otherwise spawn one fixer that resolves everything in a single pass — this avoids two agents stepping on each other's commits and gives the fixer holistic context (a spec gap fix should not re-introduce a code defect just flagged). -Notify the user: `🛠️ Agent 4 (Fixer — Sonnet) is resolving review issues...` +Notify the user: `🛠️ Agent 4 (Fixer — Sonnet) is resolving spec gaps and code defects in one pass...` -Spawn a fresh agent using **model: sonnet** with: +Spawn a fresh agent using **model: sonnet**: ``` Read .claude/agents/aiworkers/fixer.md and inline its full content at the start of this prompt. Start your response with: "🛠️ Running as: " -Fix the issues listed below found during code review of a recently implemented feature. +Resolve every "Required action" from both reviews below in a single coherent pass. Plan all fixes together before touching code so a spec fix does not introduce a code defect already flagged in the code review. + +## Product PRD (the contract — what the code must satisfy) +Read the file at: `.claude/tmp/prd-.md` -## Feature plan (for context) - +## Technical PRD (architecture to follow when adding missing functionality) +Read the file at: `.claude/tmp/tech-prd-.md` -## Review issues - +## Spec review (required actions — spec compliance gaps) +Read the file at: `.claude/tmp/review-spec-.md` — focus on "Required actions". + +## Code review (required actions — bugs, security, edge cases) +Read the file at: `.claude/tmp/review-code-.md` — focus on "Required actions". ## Branch -Fix each issue. For each fix, follow /commit logic to commit (fix: ...). -Co-author: Co-Authored-By: Claude Sonnet 4.6 -Do not push. +## Process -Return: list of fixes and commits created. +1. Read all four documents above. Merge the action lists into a single ordered plan, grouping by file to minimize churn. +2. For each fix: implement, then follow /commit logic. Use `feat:` when satisfying a missing PRD criterion, `fix:` for defects. +3. Co-author derived from your actual model (use the "Running as" model name). +4. Do not push. + +Return: +- Ordered list of fixes applied, each tagged [spec | code] with the source review item +- Commits created +- Confirmation that no flagged code defect was re-introduced by spec fixes ``` -Re-run tests after fixes to confirm nothing broke. +After the fixer returns, re-run tests. If tests fail, route through 3a-fix once. + +#### Re-review loop (cap: 1 additional cycle) + +If either original review had a FAIL verdict, optionally re-spawn both reviewers in parallel once to confirm closure. Hard cap: one re-review cycle total. If issues remain after the second cycle, abort and report to the orchestrator. --- @@ -241,10 +475,13 @@ After ACT (or directly if no issues): ## Feature complete: ### Agents used -- Agent 1 (Planner): produced implementation plan +- Agent 0 (Interviewer): grilled the user to lock down requirements +- Agent 0b (Spec Writer): converted grill into product PRD at `.claude/tmp/prd-.md` +- Agent 1 (Planner): produced technical PRD at `.claude/tmp/tech-prd-.md` - Agent 2 (Implementer): created branch, implemented, committed -- Agent 3 (Reviewer): reviewed code, found X issues -- Agent 4 (Fixer): resolved review issues (if applicable) +- Agent 3a (Spec Reviewer): verified spec compliance → `.claude/tmp/review-spec-.md` +- Agent 3b (Code Reviewer): audited code quality → `.claude/tmp/review-code-.md` +- Agent 4 (Fixer): resolved spec gaps + code defects in a single pass (if any) ### All commits @@ -264,4 +501,4 @@ After ACT (or directly if no issues): - Each agent receives only what it needs — no leaking full conversation context - User approves at: end of PLAN, end of DO, end of CHECK - All commits follow Conventional Commits and include the co-author line -- The skills `branch`, `commit`, and `pr` are expected to exist in `.claude/skills/aiworkers/`. Before starting Phase 2, verify that each required skill directory is present. If any is missing, warn the user and abort rather than silently failing. +- The skills `grill-me`, `branch`, `commit`, and `pr` are expected to exist in `.claude/skills/aiworkers/`. Before starting Phase 0.5, verify that `grill-me` is present; before Phase 2, verify `branch`, `commit`, `pr`. If any is missing, warn the user and abort rather than silently failing. diff --git a/src/commands/feature/references/architecture.md b/src/commands/feature/references/architecture.md new file mode 100644 index 0000000..f9ead12 --- /dev/null +++ b/src/commands/feature/references/architecture.md @@ -0,0 +1,160 @@ +# `/feature` — Architecture + +> **Audience**: humans maintaining this skill. Claude reads `SKILL.md`; humans read this. +> This document covers *why* the skill is shaped this way. For *how* to execute it, read `SKILL.md`. + +--- + +## Design principle + +**Each agent receives the minimum context needed to do its job, and no more.** + +Context bloat is the failure mode we are designing against. A single mega-prompt with the full conversation + plan + diff + reviews degrades into the "dumb zone" — the model loses sharpness, hallucinates, and ignores half the input. The pipeline is split into specialized agents precisely so each one stays in its zone of competence with a tight, declarative prompt. + +The cost of this design is coordination overhead (more spawns, more handoffs). The benefit is that each individual decision is made by an agent operating with high signal-to-noise. + +--- + +## Pipeline diagram + +```mermaid +flowchart TD + Start([User: /feature description]) --> P0[Phase 0: Pre-flight
git status, slug, tmp dir] + P0 --> P05[Phase 0.5: GRILL
Interviewer agent] + P05 -->|grill summary| P06[Phase 0.6: SPEC
Spec Writer agent] + P06 -->|writes| PRD[(prd-slug.md
product PRD)] + PRD --> CP1{User
approves PRD?} + CP1 -->|no| P06 + CP1 -->|yes| P1[Phase 1: PLAN
Planner agent] + P1 -->|reads PRD, writes| TECH[(tech-prd-slug.md
technical PRD)] + TECH --> CP2{User
approves plan?} + CP2 -->|no| P1 + CP2 -->|yes| P2[Phase 2: DO
Implementer agent] + P2 -->|commits| BRANCH[(branch + commits)] + BRANCH --> CP3{User
approves
implementation?} + CP3 -->|yes| P3a[Phase 3a: Run tests] + P3a -->|fail| P3afix[Test Fixer
max 2 retries] + P3afix --> P3a + P3a -->|pass| P3b{{Phase 3b: DUAL REVIEW
parallel}} + P3b --> SR[Spec Reviewer] + P3b --> CR[Code Reviewer] + SR -->|writes| RSPEC[(review-spec-slug.md)] + CR -->|writes| RCODE[(review-code-slug.md)] + RSPEC --> CP4{User
approves
reviews?} + RCODE --> CP4 + CP4 -->|both empty| P5 + CP4 -->|yes| P4[Phase 4: ACT
Fixer agent
single pass] + P4 -->|commits| BRANCH + P4 --> P3a2[Re-run tests] + P3a2 --> P5[Phase 5: Finalize
open PR] + P5 --> Done([PR URL]) +``` + +--- + +## Context flow (who sees what) + +| Handoff | Input passed | Where it lives | Notes | +|---|---|---|---| +| Orchestrator → Interviewer | raw user description, branch name | inline | full grill happens inside the agent via `AskUserQuestion` | +| Interviewer → Spec Writer | grill summary (structured), raw request | inline | **transcript is discarded** — summary is the canonical extract | +| Spec Writer → Planner | product PRD path | file (`prd-.md`) | planner reads from disk, not from prompt | +| Planner → Implementer | both PRD paths, branch | files | implementer reads both for context + criteria | +| Implementer → Spec Reviewer | product PRD path, diff, commits | file + inline | **no tech PRD** — reviewer verifies *what*, not *how* | +| Implementer → Code Reviewer | diff, commits | inline only | **no PRDs** — code defects are spec-agnostic | +| Reviewers → Fixer | both PRD paths, both review paths | files | fixer plans all fixes together, single pass | + +**Invariant**: large artifacts (PRDs, reviews) live on disk in `.claude/tmp/`. Prompts pass *paths*, not contents. This keeps the orchestrator's context window small and lets PRDs survive context compression. + +--- + +## Key design decisions + +### 1. Grill summary, not full transcript, feeds the Spec Writer + +The grill produces 20–40 turns of Q&A. Passing all of that to the Spec Writer would re-introduce the conversational noise the grill exists to eliminate. The Interviewer's `Step 3 — Final summary` is the canonical extract; the transcript is discarded. + +**Rejected alternative**: pass both transcript + summary "for context". This bloats the Spec Writer's prompt with redundancy and tempts it to weight raw conversation over the distilled decisions. + +### 2. Two reviewers in parallel, with disjoint inputs + +Spec compliance and code correctness are orthogonal concerns. Bundling them into one reviewer produces a longer, shallower review — the agent juggles two mental models. Splitting them yields two focused reports, and they run in parallel because they share no state. + +- Spec Reviewer reads PRD + diff. Does not see tech PRD (architecture is out of scope for compliance check). +- Code Reviewer reads diff only. Does not see any PRD (defects are spec-agnostic). + +**Rejected alternative**: single Reviewer agent with the original `reviewer.md` persona. Worked, but produced unfocused reviews where security findings got buried under spec checklists. + +### 3. One Fixer, not two sequential fixers + +An earlier design had Spec Fixer → Code Fixer running strictly sequential (to avoid commit conflicts). Collapsed into one agent because: + +- Single agent = no commit race by construction +- Holistic planning: a fix for a missing PRD criterion should not re-introduce a defect already flagged in the code review +- Coherent commits grouped by file, not by source review +- One spawn vs two, one test re-run vs two + +**Rejected alternative**: two sequential fixers. Discarded due to artificial separation — both edit the same code, both commit, and the spec fixer benefits from seeing code-review findings while it works. + +### 4. PRDs persisted to `.claude/tmp/`, not passed inline + +Every artifact between phases (product PRD, technical PRD, both reviews) lives on disk. Three benefits: + +- Survives context compression mid-session +- Downstream agents read only the sections they need (vs the orchestrator hauling full contents in every prompt) +- Auditable: after a failed run, the user can inspect the artifacts and re-run a single phase + +**Rejected alternative**: pass artifact contents inline through the orchestrator. Wastes orchestrator tokens on every handoff and loses everything if context compresses. + +### 5. Model routing + +| Agent | Model | Why | +|---|---|---| +| Interviewer | Sonnet | needs codebase exploration + structured questioning; Opus overkill for branching dialog | +| Spec Writer | Sonnet | mechanical translation grill → structured doc; not a reasoning-heavy task | +| Planner | **Opus** | hardest reasoning step — architecture decisions, blast radius, sequencing | +| Implementer | Sonnet | execution from blueprint; tech PRD removed most ambiguity | +| Reviewers | Sonnet | pattern-matching for defects + compliance; parallelizable, cost-sensitive | +| Fixer | Sonnet | scoped edits driven by explicit action lists | + +The only Opus spend is the Planner. Everything downstream rides Sonnet. + +--- + +## Known trade-offs + +- **Checkpoint fatigue**: 4 user approval points (PRD, plan, implementation, reviews). For trivial features this is overhead. No `--yolo` mode yet. +- **No verify phase**: tests passing ≠ feature works in practice. A UI/CLI feature ships without manual exercise. The `verify` skill exists but is not wired in. +- **Re-review loop cap**: 1 additional cycle. If issues persist, the skill aborts rather than looping — bounded but means complex bugs may not auto-resolve. +- **Grill via `AskUserQuestion`**: structured options + "Other" free-text. Less fluid than open-ended chat, but enables fresh-context isolation of the interviewer agent. + +--- + +## File map + +``` +src/ +├── commands/feature/ +│ ├── SKILL.md ← orchestrator instructions (Claude reads) +│ └── references/ +│ └── architecture.md ← this file +├── skills/grill-me/ +│ └── SKILL.md ← invoked by Phase 0.5 +└── agents/ ← personas spawned by the skill + ├── spec-writer.md ← Phase 0.6 + ├── planner.md ← Phase 1 + ├── implementer.md ← Phase 2 + ├── spec-reviewer.md ← Phase 3b (parallel) + ├── code-reviewer.md ← Phase 3b (parallel) + └── fixer.md ← Phase 4 + Phase 3a-fix +``` + +Artifacts produced at runtime (gitignored, per-feature): + +``` +.claude/tmp/ +├── prd-.md ← product PRD +├── tech-prd-.md ← technical PRD +├── review-spec-.md ← spec review +└── review-code-.md ← code review +``` From 7f3d566fe45af02ec1fdfb3e8c6b67b1619d59d6 Mon Sep 17 00:00:00 2001 From: Gabriel-Pereira1788 Date: Sat, 23 May 2026 20:14:57 -0300 Subject: [PATCH 09/25] fix(init): replace bash find with Glob tool Replace security-violating bash find commands with Glob tool instructions throughout Phase 1 scanning logic. Co-Authored-By: Claude Sonnet 4 --- src/commands/init/SKILL.md | 45 ++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/commands/init/SKILL.md b/src/commands/init/SKILL.md index ed9766c..a8b84fe 100644 --- a/src/commands/init/SKILL.md +++ b/src/commands/init/SKILL.md @@ -31,15 +31,14 @@ Scans a project to detect architectural patterns, code style, frameworks, and co Detect and collect patterns for the following categories. Use the specified tools to discover each pattern: #### Framework & Stack -```bash -# Check package managers and dependencies -cat package.json 2>/dev/null | grep -E '"(dependencies|devDependencies)"' -A 20 -cat requirements.txt 2>/dev/null -cat Cargo.toml 2>/dev/null -cat go.mod 2>/dev/null -cat composer.json 2>/dev/null -cat Gemfile 2>/dev/null -``` + +Use Read tool to check package managers and dependencies: +- `package.json` (JavaScript/TypeScript) +- `requirements.txt` (Python) +- `Cargo.toml` (Rust) +- `go.mod` (Go) +- `composer.json` (PHP) +- `Gemfile` (Ruby) Look for: - JavaScript/TypeScript: React, Vue, Angular, Next.js, Express, etc. @@ -48,9 +47,10 @@ Look for: - Build tools: Vite, Webpack, Rollup, esbuild #### Directory Structure -```bash -find . -type d -maxdepth 3 | grep -v -E 'node_modules|\.git|dist|build|\.next|\.cache|coverage|__pycache__' -``` + +Use Glob tool to discover directories (exclude node_modules, .git, dist, build, .next, .cache, coverage, __pycache__): +- Pattern: `**/` with depth limit of 3 levels +- Filter out common build/dependency directories Map common directories to their purpose: - `src/` → Source code @@ -82,10 +82,12 @@ Look for: #### Naming Conventions -Sample 10-20 files from `src/` to detect patterns: -```bash -find src -type f -name '*.ts' -o -name '*.tsx' -o -name '*.js' -o -name '*.jsx' | head -20 -``` +Use Glob tool to sample 10-20 files from `src/` to detect patterns: +- Pattern: `src/**/*.ts` +- Pattern: `src/**/*.tsx` +- Pattern: `src/**/*.js` +- Pattern: `src/**/*.jsx` +- Limit results to first 20 files total Detect: - **File naming**: PascalCase (Button.tsx), camelCase (button.tsx), kebab-case (button-component.tsx) @@ -93,11 +95,12 @@ Detect: - **Variable naming**: camelCase, snake_case, SCREAMING_SNAKE_CASE for constants #### Test Structure -```bash -# Find test files -find . -type f \( -name '*.test.*' -o -name '*.spec.*' \) -maxdepth 4 | head -10 -find . -type d -name '__tests__' -maxdepth 4 -``` + +Use Glob tool to find test files: +- Pattern: `**/*.test.*` (limit to first 10 files) +- Pattern: `**/*.spec.*` (limit to first 10 files) +- Pattern: `**/__tests__/` (directories) +- Note: This samples up to depth 4; deeply nested tests may be missed Detect: - Location: Co-located with source, separate `tests/` directory, `__tests__/` directories From fd1a1ed05a6968b17e7f89198ff0dd3fc7f70c53 Mon Sep 17 00:00:00 2001 From: Gabriel-Pereira1788 Date: Sat, 23 May 2026 20:16:16 -0300 Subject: [PATCH 10/25] fix(init): replace bash grep with Grep tool Replace direct bash grep commands with Grep tool instructions in State Management and Enforcement sections. Co-Authored-By: Claude Sonnet 4 --- src/commands/init/SKILL.md | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/commands/init/SKILL.md b/src/commands/init/SKILL.md index a8b84fe..93176e3 100644 --- a/src/commands/init/SKILL.md +++ b/src/commands/init/SKILL.md @@ -109,11 +109,11 @@ Detect: #### State Management -Search for state management library imports: -```bash -# Use Grep tool -grep -r "from.*'(redux|zustand|mobx|recoil|jotai|valtio)'" src/ --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" -``` +Use Grep tool to search for state management library imports: +- Pattern: `from.*(redux|zustand|mobx|recoil|jotai|valtio)` +- Path: `src/` +- Type: `js` or `ts` +- Output mode: `files_with_matches` Detect: - Redux, Zustand, MobX, Recoil, Jotai, Valtio @@ -468,17 +468,10 @@ When writing or modifying code, you MUST: 1. **ALWAYS follow the patterns defined above** — these are mandatory, not suggestions 2. **NEVER introduce new patterns without explicit user approval** — ask first -3. **When in doubt, grep the codebase for existing examples**: - ```bash - # Find similar components - find src -name "*Button*" - - # Find API usage patterns - grep -r "fetch\|axios" src/ - - # Find state management usage - grep -r "useState\|useReducer\|useContext" src/ - ``` +3. **When in doubt, search the codebase for existing examples**: + - Use Glob tool to find similar components: `src/**/*Button*` + - Use Grep tool to find API usage patterns: pattern `fetch|axios` in `src/` + - Use Grep tool to find state management: pattern `useState|useReducer|useContext` in `src/` 4. **If you must deviate from these patterns**: - Explain WHY the deviation is necessary - Get explicit user approval FIRST From 4596bc65df0d3792b8e377864e1517f6efbbcfaf Mon Sep 17 00:00:00 2001 From: Gabriel-Pereira1788 Date: Sat, 23 May 2026 20:16:59 -0300 Subject: [PATCH 11/25] fix(init): rewrite CLAUDE.md update logic Replace bash exit code pattern with Grep and Edit tools for checking and appending imports. Co-Authored-By: Claude Sonnet 4 --- src/commands/init/SKILL.md | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/commands/init/SKILL.md b/src/commands/init/SKILL.md index 93176e3..1157962 100644 --- a/src/commands/init/SKILL.md +++ b/src/commands/init/SKILL.md @@ -482,29 +482,16 @@ Violations of these architectural rules will require rework. When you write code ### Phase 5 — Update CLAUDE.md -1. Check if `.claude/CLAUDE.md` exists -2. If it doesn't exist, create it with the imports: +1. Check if `.claude/CLAUDE.md` exists using Read tool +2. If it doesn't exist, Write it with the imports: ```markdown @rules/aiworkers/patterns.md @rules/aiworkers/architecture.md ``` -3. If it exists, check if the imports are already present -4. If not present, add them at the end of the file: - ```bash - # Check if imports exist - grep -q "rules/aiworkers/patterns.md" .claude/CLAUDE.md - patterns_exists=$? - grep -q "rules/aiworkers/architecture.md" .claude/CLAUDE.md - arch_exists=$? - - # Add if missing - if [ $patterns_exists -ne 0 ]; then - echo "@rules/aiworkers/patterns.md" >> .claude/CLAUDE.md - fi - if [ $arch_exists -ne 0 ]; then - echo "@rules/aiworkers/architecture.md" >> .claude/CLAUDE.md - fi - ``` +3. If it exists, use Grep tool to check if imports are already present: + - Pattern: `rules/aiworkers/patterns.md` in `.claude/CLAUDE.md` + - Pattern: `rules/aiworkers/architecture.md` in `.claude/CLAUDE.md` +4. If either import is missing, use Edit tool to append to the end of the file ### Phase 6 — Confirmation From fae2cf5d21bee3c0055a751e89911f052462352f Mon Sep 17 00:00:00 2001 From: Gabriel-Pereira1788 Date: Sat, 23 May 2026 20:17:47 -0300 Subject: [PATCH 12/25] fix(init): limit file reading performance Use Glob to find first 5 files then Read for import/export pattern detection instead of reading all component files. Co-Authored-By: Claude Sonnet 4 --- src/commands/init/SKILL.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/commands/init/SKILL.md b/src/commands/init/SKILL.md index 1157962..3b5c15c 100644 --- a/src/commands/init/SKILL.md +++ b/src/commands/init/SKILL.md @@ -122,10 +122,10 @@ Detect: #### Import/Export Style -Sample 5-10 files to detect: -```bash -head -20 src/components/* 2>/dev/null | head -100 -``` +Use Glob tool to find 5 files from `src/components/`, then use Read tool to check the first 20 lines of each file: +- Pattern: `src/components/*` +- Limit to first 5 files +- Read first 20 lines of each to detect import/export patterns Detect: - Named exports vs. default exports From 195143ec21051877f7d8d3d9f433f69b63cb0fbb Mon Sep 17 00:00:00 2001 From: Gabriel-Pereira1788 Date: Sat, 23 May 2026 20:18:38 -0300 Subject: [PATCH 13/25] fix(init): add fallback after validation failures After 3 failed validations, provide free-text description option via AskUserQuestion for user to specify manually. Co-Authored-By: Claude Sonnet 4 --- src/commands/init/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/init/SKILL.md b/src/commands/init/SKILL.md index 3b5c15c..b3011d9 100644 --- a/src/commands/init/SKILL.md +++ b/src/commands/init/SKILL.md @@ -148,7 +148,7 @@ Present each finding category one at a time using `AskUserQuestion`. For each ca - User confirms → record the finding and move to next category - User corrects → update the finding with their answer and re-present for confirmation - User says "Not sure" → ask for clarification or offer to skip -5. **Max 3 correction cycles per category** → if still not resolved, offer free-form text input +5. **Max 3 correction cycles per category** → if still not resolved after 3 failed validations, use AskUserQuestion with a free-text description option for the user to specify manually 6. **Continue until user explicitly confirms ALL findings** #### Example flow From 8e2aa122406b95651ffb14fc20eb8e66dd59e3fb Mon Sep 17 00:00:00 2001 From: Gabriel-Pereira1788 Date: Sat, 23 May 2026 20:19:09 -0300 Subject: [PATCH 14/25] fix(init): clarify sequential AskUserQuestion enforcement Expand rule 9 to explicitly state waiting for response before next call and prohibit parallel invocations. Co-Authored-By: Claude Sonnet 4 --- src/commands/init/SKILL.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/commands/init/SKILL.md b/src/commands/init/SKILL.md index b3011d9..1f3bc46 100644 --- a/src/commands/init/SKILL.md +++ b/src/commands/init/SKILL.md @@ -516,9 +516,8 @@ To update: /aiworkers:init --force 6. **Never commit the generated files** — file generation is the user's responsibility to commit 7. **Create `.claude/` directory structure if needed** — ensure directories exist before writing files 8. **Present findings one category at a time** — don't batch all questions together -9. **Use AskUserQuestion sequentially, never in parallel** — wait for each response before asking the next +9. **Use AskUserQuestion sequentially, never in parallel** — after each AskUserQuestion call, WAIT for response before proceeding; never call AskUserQuestion multiple times in one tool invocation 10. **If user says "stop" or "skip", accept it** — mark remaining categories as "deferred" or "user will specify later" -11. **Always include the co-author line when committing**: `Co-Authored-By: Claude Sonnet 4 ` ## Error Handling From bbd927b821c86c0a38f6c9a2e27e0e8157fdce30 Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 20:25:28 -0300 Subject: [PATCH 15/25] ci(release): migrate to semantic-release Replace release-it + comment-triggered deploy with semantic-release using workflow_dispatch and OIDC trusted publisher (no NPM_TOKEN). Enable npm provenance. Co-Authored-By: Claude Haiku 4.5 --- .github/workflows/deploy.yml | 144 - .github/workflows/enforce-release-branch.yml | 26 - .github/workflows/release.yml | 46 + .release-it.json | 16 - package-lock.json | 6615 ++++++++++++++---- package.json | 12 +- release.config.cjs | 60 + 7 files changed, 5396 insertions(+), 1523 deletions(-) delete mode 100644 .github/workflows/deploy.yml delete mode 100644 .github/workflows/enforce-release-branch.yml create mode 100644 .github/workflows/release.yml delete mode 100644 .release-it.json create mode 100644 release.config.cjs diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 3456271..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,144 +0,0 @@ -name: Deploy Release - -on: - issue_comment: - types: [created] - -permissions: - contents: write - pull-requests: write - issues: write - id-token: write - -jobs: - deploy: - if: github.event.issue.pull_request != null && github.event.comment.body == 'DEPLOY-RELEASE' - runs-on: ubuntu-latest - - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - steps: - - name: Resolve PR metadata - run: | - PR_NUMBER="${{ github.event.issue.number }}" - echo "PR_NUMBER=$PR_NUMBER" >> "$GITHUB_ENV" - - PR_JSON=$(gh api repos/${{ github.repository }}/pulls/$PR_NUMBER) - PR_BRANCH=$(echo "$PR_JSON" | jq -r '.head.ref') - PR_STATE=$(echo "$PR_JSON" | jq -r '.state') - - echo "PR_BRANCH=$PR_BRANCH" >> "$GITHUB_ENV" - - if [ "$PR_STATE" != "open" ]; then - gh api repos/${{ github.repository }}/issues/$PR_NUMBER/comments \ - --method POST \ - --field body="Deploy cancelled: this PR is not open (state: \`$PR_STATE\`)." - exit 1 - fi - - - name: Check authorization - run: | - COMMENTER="${{ github.event.comment.user.login }}" - - PERMISSION=$(gh api \ - repos/${{ github.repository }}/collaborators/$COMMENTER/permission \ - --jq '.permission' 2>/dev/null || echo "none") - - IS_ADMIN=false - if [ "$PERMISSION" = "admin" ]; then - IS_ADMIN=true - fi - - APPROVALS=$(gh api \ - repos/${{ github.repository }}/pulls/${{ env.PR_NUMBER }}/reviews \ - --jq '[.[] | select(.state == "APPROVED")] | length') - - echo "Commenter: $COMMENTER | Is admin: $IS_ADMIN | Approvals: $APPROVALS" - - if [ "$IS_ADMIN" = "false" ] && [ "$APPROVALS" -lt 2 ]; then - gh api repos/${{ github.repository }}/issues/${{ env.PR_NUMBER }}/comments \ - --method POST \ - --field body="Deploy cancelled: **@$COMMENTER** is not a repo admin and this PR only has **$APPROVALS/2** required approvals. Either an admin must trigger the deploy, or the PR needs at least 2 approvals." - exit 1 - fi - - - name: Validate release branch - run: | - BRANCH="${{ env.PR_BRANCH }}" - - if ! echo "$BRANCH" | grep -qE '^release/v[0-9]+\.[0-9]+\.[0-9]+$'; then - gh api repos/${{ github.repository }}/issues/${{ env.PR_NUMBER }}/comments \ - --method POST \ - --field body="Deploy cancelled: branch \`$BRANCH\` does not match the required pattern \`release/vX.Y.Z\`. Only release branches may be deployed to main." - exit 1 - fi - - VERSION="${BRANCH#release/v}" - echo "VERSION=$VERSION" >> "$GITHUB_ENV" - - - name: Merge PR into main - run: | - gh pr merge ${{ env.PR_NUMBER }} \ - --merge \ - --admin \ - --repo ${{ github.repository }} - - - name: Checkout main - uses: actions/checkout@v4 - with: - ref: main - fetch-depth: 0 - - - name: Configure git identity - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - registry-url: 'https://registry.npmjs.org' - - - name: Install dependencies - run: npm ci - - - name: Bump version in package.json - run: | - jq --arg v "${{ env.VERSION }}" '.version = $v' package.json > package.json.tmp - mv package.json.tmp package.json - git add package.json - git diff --cached --quiet || git commit -m "chore(release): bump version to ${{ env.VERSION }}" - git push - - - name: Publish to npm - run: npm publish --provenance --access public - - - name: Create git tag and GitHub Release - run: | - git tag "v${{ env.VERSION }}" - git push origin "v${{ env.VERSION }}" - gh release create "v${{ env.VERSION }}" \ - --title "v${{ env.VERSION }}" \ - --generate-notes \ - --repo ${{ github.repository }} - - - name: Delete release branch - run: | - git push origin --delete "${{ env.PR_BRANCH }}" || true - - - name: Post success comment - if: success() - run: | - gh api repos/${{ github.repository }}/issues/${{ env.PR_NUMBER }}/comments \ - --method POST \ - --field body="Deployed successfully. Version \`${{ env.VERSION }}\` published to npm and released on GitHub." - - - name: Post failure comment - if: failure() - run: | - gh api repos/${{ github.repository }}/issues/${{ env.PR_NUMBER }}/comments \ - --method POST \ - --field body="Deploy failed. Check the [workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details." \ - 2>/dev/null || true diff --git a/.github/workflows/enforce-release-branch.yml b/.github/workflows/enforce-release-branch.yml deleted file mode 100644 index 2d3cd07..0000000 --- a/.github/workflows/enforce-release-branch.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Enforce release branch target - -on: - pull_request: - branches: [main] - types: [opened, reopened, synchronize] - -permissions: - pull-requests: write - -jobs: - check-branch: - runs-on: ubuntu-latest - steps: - - name: Reject non-release PRs targeting main - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - BRANCH="${{ github.head_ref }}" - if ! echo "$BRANCH" | grep -qE '^release/v[0-9]+\.[0-9]+\.[0-9]+$'; then - gh api repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments \ - --method POST \ - --field body="This PR has been closed automatically. Only \`release/vX.Y.Z\` branches may target \`main\`. Please retarget this PR to a release branch." - gh pr close ${{ github.event.pull_request.number }} --repo ${{ github.repository }} - exit 0 - fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..69cbf0b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,46 @@ +name: Release + +on: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + release: + name: Release + runs-on: ubuntu-latest + + permissions: + contents: write + issues: write + pull-requests: write + id-token: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: npm ci + + - name: Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GIT_AUTHOR_NAME: ${{ github.actor }} + GIT_AUTHOR_EMAIL: '${{ github.actor }}@users.noreply.github.com' + GIT_COMMITTER_NAME: ${{ github.actor }} + GIT_COMMITTER_EMAIL: '${{ github.actor }}@users.noreply.github.com' + run: npm run release diff --git a/.release-it.json b/.release-it.json deleted file mode 100644 index 75cf96c..0000000 --- a/.release-it.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "git": { - "commitMessage": "chore(release): v${version}", - "tagName": "v${version}", - "requireBranch": "main", - "requireCleanWorkingDir": true - }, - "github": { - "release": true, - "autoGenerate": true - }, - "npm": { - "publish": true, - "access": "public" - } -} diff --git a/package-lock.json b/package-lock.json index ef2b446..89e6231 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@salve-software/aiworkers", - "version": "0.2.1", + "version": "0.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@salve-software/aiworkers", - "version": "0.2.1", + "version": "0.3.1", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -17,351 +17,95 @@ "aiworkers": "bin/aiworkers.js" }, "devDependencies": { - "release-it": "^20.0.1" - } - }, - "node_modules/@inquirer/ansi": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.5.tgz", - "integrity": "sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.1.4.tgz", - "integrity": "sha512-w6KF8ZYRvqHhROkOTHXYC3qIV/KYEu5o12oLqQySvch61vrYtRxNSHTONSdJqWiFJPlCUQAHT5OgOIyuTr+MHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^2.0.5", - "@inquirer/core": "^11.1.9", - "@inquirer/figures": "^2.0.5", - "@inquirer/type": "^4.0.5" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/confirm": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.12.tgz", - "integrity": "sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "11.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.9.tgz", - "integrity": "sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^2.0.5", - "@inquirer/figures": "^2.0.5", - "@inquirer/type": "^4.0.5", - "cli-width": "^4.1.0", - "fast-wrap-ansi": "^0.2.0", - "mute-stream": "^3.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/editor": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.1.1.tgz", - "integrity": "sha512-6y11LgmNpmn5D2aB5FgnCfBUBK8ZstwLCalyJmORcJZ/WrhOjm16mu6eSqIx8DnErxDqSLr+Jkp+GP8/Nwd5tA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/external-editor": "^3.0.0", - "@inquirer/type": "^4.0.5" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/git": "^10.0.1", + "conventional-changelog-conventionalcommits": "^9.1.0", + "semantic-release": "^25.0.3" } }, - "node_modules/@inquirer/expand": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.13.tgz", - "integrity": "sha512-dF2zvrFo9LshkcB23/O1il13kBkBltWIXzut1evfbuBLXMiGIuC45c+ZQ0uukjCDsvI8OWqun4FRYMnzFCQa3g==", + "node_modules/@actions/core": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.1.tgz", + "integrity": "sha512-a6d/Nwahm9fliVGRhdhofo40HjHQasUPusmc7vBfyky+7Z+P2A1J68zyFVaNcEclc/Se+eO595oAr5nwEIoIUA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "@actions/exec": "^3.0.0", + "@actions/http-client": "^4.0.0" } }, - "node_modules/@inquirer/external-editor": { + "node_modules/@actions/exec": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.0.tgz", - "integrity": "sha512-lDSwMgg+M5rq6JKBYaJwSX6T9e/HK2qqZ1oxmOwn4AQoJE5D+7TumsxLGC02PWS//rkIVqbZv3XA3ejsc9FYvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.2" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.5.tgz", - "integrity": "sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - } - }, - "node_modules/@inquirer/input": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.12.tgz", - "integrity": "sha512-uiMFBl4LqFzJClh80Q3f9hbOFJ6kgkDWI4LjAeBuyO6EanVVMF69AgOvpi1qdqjDSjDN6578B6nky9ceEpI+1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.0.12.tgz", - "integrity": "sha512-/vrwhEf7Xsuh+YlHF4IjSy3g1cyrQuPaSiHIxCEbLu8qnfvrcvJyCkoktOOF+xV9gSb77/G0n3h04RbMDW2sIg==", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-3.0.0.tgz", + "integrity": "sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "@actions/io": "^3.0.2" } }, - "node_modules/@inquirer/password": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.0.12.tgz", - "integrity": "sha512-CBh7YHju623lxJRcAOo498ZUwIuMy63bqW/vVq0tQAZVv+lkWlHkP9ealYE1utWSisEShY5VMdzIXRmyEODzcQ==", + "node_modules/@actions/http-client": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.1.tgz", + "integrity": "sha512-+Nvd1ImaOZBSoPbsUtEhv+1z99H12xzncCkz0a3RuehINE81FZSe2QTj3uvAPTcJX/SCzUQHQ0D1GrPMbrPitg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.5", - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "tunnel": "^0.0.6", + "undici": "^6.23.0" } }, - "node_modules/@inquirer/prompts": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.4.2.tgz", - "integrity": "sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q==", + "node_modules/@actions/http-client/node_modules/undici": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^5.1.4", - "@inquirer/confirm": "^6.0.12", - "@inquirer/editor": "^5.1.1", - "@inquirer/expand": "^5.0.13", - "@inquirer/input": "^5.0.12", - "@inquirer/number": "^4.0.12", - "@inquirer/password": "^5.0.12", - "@inquirer/rawlist": "^5.2.8", - "@inquirer/search": "^4.1.8", - "@inquirer/select": "^5.1.4" - }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18.17" } }, - "node_modules/@inquirer/rawlist": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.2.8.tgz", - "integrity": "sha512-Su7FQvp5buZmCymN3PPoYv31ZQQX4ve2j02k7piGgKAWgE+AQRB5YoYVveGXcl3TZ9ldgRMSxj56YfDFmmaqLg==", + "node_modules/@actions/io": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-3.0.2.tgz", + "integrity": "sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==", "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/type": "^4.0.5" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/@inquirer/search": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.1.8.tgz", - "integrity": "sha512-fGiHKGD6DyPIYUWxoXnQTeXeyYqSOUrasDMABBmMHUalH/LxkuzY0xVRtimXAt1sUeeyYkVuKQx1bebMuN11Kw==", + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.9", - "@inquirer/figures": "^2.0.5", - "@inquirer/type": "^4.0.5" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@inquirer/select": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.1.4.tgz", - "integrity": "sha512-2kWcGKPMLAXAWRp1AH1SLsQmX+j0QjeljyXMUji9WMZC8nRDO0b7qquIGr6143E7KMLt3VAIGNXzwa/6PXQs4Q==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^2.0.5", - "@inquirer/core": "^11.1.9", - "@inquirer/figures": "^2.0.5", - "@inquirer/type": "^4.0.5" - }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@inquirer/type": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.5.tgz", - "integrity": "sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q==", + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=0.1.90" } }, "node_modules/@octokit/auth-token": { @@ -445,33 +189,39 @@ "@octokit/core": ">=6" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz", - "integrity": "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==", + "node_modules/@octokit/plugin-retry": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", + "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", "dev": true, "license": "MIT", + "dependencies": { + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "bottleneck": "^2.15.3" + }, "engines": { "node": ">= 20" }, "peerDependencies": { - "@octokit/core": ">=6" + "@octokit/core": ">=7" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", - "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", + "node_modules/@octokit/plugin-throttling": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", + "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0" + "@octokit/types": "^16.0.0", + "bottleneck": "^2.15.3" }, "engines": { "node": ">= 20" }, "peerDependencies": { - "@octokit/core": ">=6" + "@octokit/core": "^7.0.0" } }, "node_modules/@octokit/request": { @@ -505,22 +255,6 @@ "node": ">= 20" } }, - "node_modules/@octokit/rest": { - "version": "22.0.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.1.tgz", - "integrity": "sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/core": "^7.0.6", - "@octokit/plugin-paginate-rest": "^14.0.0", - "@octokit/plugin-request-log": "^6.0.0", - "@octokit/plugin-rest-endpoint-methods": "^17.0.0" - }, - "engines": { - "node": ">= 20" - } - }, "node_modules/@octokit/types": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", @@ -531,159 +265,194 @@ "@octokit/openapi-types": "^27.0.0" } }, - "node_modules/@phun-ky/typeof": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@phun-ky/typeof/-/typeof-2.0.3.tgz", - "integrity": "sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ==", + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "dev": true, "license": "MIT", "engines": { - "node": "^20.9.0 || >=22.0.0", - "npm": ">=10.8.2" - }, - "funding": { - "url": "https://github.com/phun-ky/typeof?sponsor=1" + "node": ">=12.22.0" } }, - "node_modules/@types/parse-path": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz", - "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==", - "dev": true, - "license": "MIT" - }, - "node_modules/agent-base": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-8.0.0.tgz", - "integrity": "sha512-QT8i0hCz6C/KQ+KTAbSNwCHDGdmUJl2tp2ZpNlGSWCfhUNVbYG2WLE3MdZGBAgXPV4GAvjGMxo+C1hroyxmZEg==", + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dev": true, "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, "engines": { - "node": ">= 14" + "node": ">=12.22.0" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "license": "ISC" }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@pnpm/npm-conf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", + "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "dev": true, "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@semantic-release/changelog": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", + "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "fs-extra": "^11.0.0", + "lodash": "^4.17.4" }, "engines": { - "node": ">=8" + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0" } }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@semantic-release/commit-analyzer": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.1.tgz", + "integrity": "sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", + "debug": "^4.0.0", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", + "micromatch": "^4.0.2" }, "engines": { - "node": ">=8" + "node": ">=20.8.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/@semantic-release/error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", + "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", + "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=14.17" } }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/@semantic-release/git": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", + "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", + "dev": true, "license": "MIT", + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "execa": "^5.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.0", + "p-reduce": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=14.17" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "semantic-release": ">=18.0.0" } }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "node_modules/@semantic-release/github": { + "version": "12.0.8", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.8.tgz", + "integrity": "sha512-tej5AAgK5X9wHRoDmYhecMXEHEkFeGOY1XsEblKxu8pIQwahzf1STYyr7iPU6Lpbg6C5I3N2w/ocXrBo+L7jhw==", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.0.1" + "@octokit/core": "^7.0.0", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-retry": "^8.0.0", + "@octokit/plugin-throttling": "^11.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "debug": "^4.3.4", + "dir-glob": "^3.0.1", + "http-proxy-agent": "^9.0.0", + "https-proxy-agent": "^9.0.0", + "issue-parser": "^7.0.0", + "lodash-es": "^4.17.21", + "mime": "^4.0.0", + "p-filter": "^4.0.0", + "tinyglobby": "^0.2.14", + "undici": "^7.0.0", + "url-join": "^5.0.0" }, "engines": { - "node": ">=4" + "node": "^22.14.0 || >= 24.10.0" + }, + "peerDependencies": { + "semantic-release": ">=24.1.0" } }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "node_modules/@semantic-release/github/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, "license": "MIT", - "dependencies": { - "retry": "0.13.1" + "engines": { + "node": ">=18" } }, - "node_modules/basic-ftp": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz", - "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==", + "node_modules/@semantic-release/github/node_modules/agent-base": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", + "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", "dev": true, "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">= 20" } }, - "node_modules/before-after-hook": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", - "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "node_modules/@semantic-release/github/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, - "license": "Apache-2.0" - }, - "node_modules/boxen": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", - "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", "license": "MIT", "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^8.0.0", - "chalk": "^5.3.0", - "cli-boxes": "^3.0.0", - "string-width": "^7.2.0", - "type-fest": "^4.21.0", - "widest-line": "^5.0.0", - "wrap-ansi": "^9.0.0" + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" }, "engines": { "node": ">=18" @@ -692,179 +461,225 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/boxen/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/@semantic-release/github/node_modules/clean-stack": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", + "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "escape-string-regexp": "5.0.0" }, "engines": { - "node": ">=18" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" + "node_modules/@semantic-release/github/node_modules/http-proxy-agent": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-9.0.0.tgz", + "integrity": "sha512-FcF8VhXYLQcxWCnt/cCpT2apKsRDUGeVEeMqGu4HSTu29U8Yw0TLOjdYIlDsYk3IkUh+taX4IDWpPcCqKDhCjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 20" } }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "node_modules/@semantic-release/github/node_modules/https-proxy-agent": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.0.0.tgz", + "integrity": "sha512-/MVmHp58WkOypgFhCLk4fzpPcFQvTJ/e6LBI7irpIO2HfxUbpmYoHF+KzipzJpxxzJu7aJNWQ0xojJ/dzV2G5g==", "dev": true, "license": "MIT", "dependencies": { - "run-applescript": "^7.0.0" + "agent-base": "9.0.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=18" + "node": ">= 20" + } + }, + "node_modules/@semantic-release/github/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/c12": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.3.tgz", - "integrity": "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==", + "node_modules/@semantic-release/npm": { + "version": "13.1.5", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-13.1.5.tgz", + "integrity": "sha512-Hq5UxzoatN3LHiq2rTsWS54nCdqJHlsssGERCo8WlvdfFA9LoN0vO+OuKVSjtNapIc/S8C2LBj206wKLHg62mg==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^5.0.0", - "confbox": "^0.2.2", - "defu": "^6.1.4", - "dotenv": "^17.2.3", - "exsolve": "^1.0.8", - "giget": "^2.0.0", - "jiti": "^2.6.1", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^2.0.0", - "pkg-types": "^2.3.0", - "rc9": "^2.1.2" + "@actions/core": "^3.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "env-ci": "^11.2.0", + "execa": "^9.0.0", + "fs-extra": "^11.0.0", + "lodash-es": "^4.17.21", + "nerf-dart": "^1.0.0", + "normalize-url": "^9.0.0", + "npm": "^11.6.2", + "rc": "^1.2.8", + "read-pkg": "^10.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^3.0.0" }, - "peerDependencies": { - "magicast": "*" + "engines": { + "node": "^22.14.0 || >= 24.10.0" }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "node_modules/camelcase": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", - "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "node_modules/@semantic-release/npm/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18" + } + }, + "node_modules/@semantic-release/npm/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "node_modules/@semantic-release/npm/node_modules/clean-stack": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", + "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", + "dev": true, "license": "MIT", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "node_modules/@semantic-release/npm/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "node_modules/@semantic-release/npm/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^5.0.0" + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" }, "engines": { - "node": ">= 20.19.0" + "node": ">=18" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "node_modules/@semantic-release/npm/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">=18.18.0" } }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "node_modules/@semantic-release/npm/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", - "dependencies": { - "consola": "^3.2.3" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "node_modules/@semantic-release/npm/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "node_modules/@semantic-release/npm/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^5.0.0" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { "node": ">=18" @@ -873,92 +688,131 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-spinners": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", - "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "node_modules/@semantic-release/npm/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.20" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">= 12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "node_modules/@semantic-release/npm/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=20" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "node_modules/@semantic-release/release-notes-generator": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.1.tgz", + "integrity": "sha512-Pbd2e2XRMUD0OxehHpgd5/YghsE76cddkRHSoDvKLK+OCy4Ewxn49rWR631MEUU01lgwF/uyVXvbnVuu6+Z6VA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", + "debug": "^4.0.0", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", + "read-package-up": "^11.0.0" + }, + "engines": { + "node": ">=20.8.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "node_modules/@semantic-release/release-notes-generator/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, "engines": { - "node": "^14.18.0 || >=16.10.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/data-uri-to-buffer": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-7.0.0.tgz", - "integrity": "sha512-CuRUx0TXGSbbWdEci3VK/XOZGP3n0P4pIKpsqpVtBqaIIuj3GKK8H45oAqA4Rg8FHipc+CzRdUzmD4YQXxv66Q==", + "node_modules/@semantic-release/release-notes-generator/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "MIT", + "license": "ISC" + }, + "node_modules/@semantic-release/release-notes-generator/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, "engines": { - "node": ">= 14" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/@semantic-release/release-notes-generator/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" }, "engines": { - "node": ">=6.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "node_modules/@semantic-release/release-notes-generator/node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", "dev": true, "license": "MIT", "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" }, "engines": { "node": ">=18" @@ -967,12 +821,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", "dev": true, "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, "engines": { "node": ">=18" }, @@ -980,228 +841,3988 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "node_modules/@semantic-release/release-notes-generator/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defu": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", - "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "node_modules/@semantic-release/release-notes-generator/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/degenerator": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-6.0.0.tgz", - "integrity": "sha512-j5MdXdefrecJeSqTpUrgZd4fBsD2IxZx0JlJD+n1Q7+aTf7/HcyXSfHsicPW6ekPurX159v1ZYla6OJgSPh2Dw==", + "node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", "dev": true, "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, "engines": { - "node": ">= 14" + "node": ">=18" }, - "peerDependencies": { - "quickjs-wasi": "^0.0.1" + "funding": { + "url": "https://ko-fi.com/dangreen" } }, - "node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } }, - "node_modules/dotenv": { - "version": "17.4.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", - "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://dotenvx.com" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, "license": "MIT" }, - "node_modules/escodegen": { + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.1.tgz", + "integrity": "sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.4.0.tgz", + "integrity": "sha512-HHBFkk1EECxxmCi4CTu091iuDpQv5/OavuCUAuZmrkWpmYfyD816nom1CvtfXJ/uYfAAjavgHvXHX291tSLK8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", + "conventional-commits-filter": "^5.0.0", + "handlebars": "^4.7.7", + "meow": "^13.0.0", + "semver": "^7.5.2" + }, + "bin": { + "conventional-changelog-writer": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-commits-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-commits-parser": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/env-ci": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.2.0.tgz", + "integrity": "sha512-D5kWfzkmaOQDioPmiviWAVtKmpPT4/iJmMVQxWxMPJTFyTkdc5JQUfc5iXEeWxcOdsYTKSAiA/Age4NUOqKsRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^8.0.0", + "java-properties": "^1.0.2" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/env-ci/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/env-ci/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/env-ci/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/figlet": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.11.0.tgz", + "integrity": "sha512-EEx3OS/l2bFqcUNN2NM9FPJp8vAMrgbCxsbl2hbcJNNxOEwVe3mEzrhan7TbJQViZa8mMqhihlbCaqD+LyYKTQ==", + "license": "MIT", + "dependencies": { + "commander": "^14.0.0" + }, + "bin": { + "figlet": "bin/index.js" + }, + "engines": { + "node": ">= 17.0.0" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-versions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz", + "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^4.0.5", + "super-regex": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-timeout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", + "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-log-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", + "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "0.6.8" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/hook-std": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-4.0.0.tgz", + "integrity": "sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", + "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.0.tgz", + "integrity": "sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from-esm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-2.0.0.tgz", + "integrity": "sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": ">=18.20" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/issue-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", + "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-with-bigint": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", + "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true, + "license": "MIT" + }, + "node_modules/make-asynchronous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.1.0.tgz", + "integrity": "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-event": "^6.0.0", + "type-fest": "^4.6.0", + "web-worker": "^1.5.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-asynchronous/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/marked-terminal": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", + "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "ansi-regex": "^6.1.0", + "chalk": "^5.4.1", + "cli-highlight": "^2.1.11", + "cli-table3": "^0.6.5", + "node-emoji": "^2.2.0", + "supports-hyperlinks": "^3.1.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <16" + } + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-package-data": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", + "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^9.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-url": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-9.0.1.tgz", + "integrity": "sha512-ARftfC5HdUNu9jJeL8pHj8debUIHA2b91FizCoMzY4lG6dDX13jdvTK0TBe24IBDRf2HvJSzzwEPvmbkQWHRSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm": { + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.15.0.tgz", + "integrity": "sha512-+k0tk7lRnpMUPnC7kTuU/yrV/mnFoPhJQ75VfLtZ6fwbzOVXaPsTE/Il9Pn1DHi482byMyqkHv/XsQ76mNjXLw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/metavuln-calculator", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/redact", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which" + ], + "dev": true, + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^9.6.0", + "@npmcli/config": "^10.9.1", + "@npmcli/fs": "^5.0.0", + "@npmcli/map-workspaces": "^5.0.3", + "@npmcli/metavuln-calculator": "^9.0.3", + "@npmcli/package-json": "^7.0.5", + "@npmcli/promise-spawn": "^9.0.1", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.4", + "@sigstore/tuf": "^4.0.2", + "abbrev": "^4.0.0", + "archy": "~1.0.0", + "cacache": "^20.0.4", + "chalk": "^5.6.2", + "ci-info": "^4.4.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^13.0.6", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^9.0.3", + "ini": "^6.0.0", + "init-package-json": "^8.2.5", + "is-cidr": "^6.0.4", + "json-parse-even-better-errors": "^5.0.0", + "libnpmaccess": "^10.0.3", + "libnpmdiff": "^8.1.8", + "libnpmexec": "^10.2.8", + "libnpmfund": "^7.0.22", + "libnpmorg": "^8.0.1", + "libnpmpack": "^9.1.8", + "libnpmpublish": "^11.2.0", + "libnpmsearch": "^9.0.1", + "libnpmteam": "^8.0.2", + "libnpmversion": "^8.0.3", + "make-fetch-happen": "^15.0.5", + "minimatch": "^10.2.5", + "minipass": "^7.1.3", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^12.3.0", + "nopt": "^9.0.0", + "npm-audit-report": "^7.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.2", + "npm-pick-manifest": "^11.0.3", + "npm-profile": "^12.0.1", + "npm-registry-fetch": "^19.1.1", + "npm-user-validate": "^4.0.0", + "p-map": "^7.0.4", + "pacote": "^21.5.0", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.1.0", + "qrcode-terminal": "^0.12.0", + "read": "^5.0.1", + "semver": "^7.8.0", + "spdx-expression-parse": "^4.0.0", + "ssri": "^13.0.1", + "supports-color": "^10.2.2", + "tar": "^7.5.15", + "text-table": "~0.2.0", + "tiny-relative-date": "^2.0.2", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^7.0.2", + "which": "^6.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/@gar/promise-retry": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "9.6.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^5.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/metavuln-calculator": "^9.0.2", + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/query": "^5.0.0", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.0", + "bin-links": "^6.0.0", + "cacache": "^20.0.1", + "common-ancestor-path": "^2.0.0", + "hosted-git-info": "^9.0.0", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^11.2.1", + "minimatch": "^10.0.3", + "nopt": "^9.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.0", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "pacote": "^21.0.2", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.0.0", + "proggy": "^4.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "semver": "^7.3.7", + "ssri": "^13.0.0", + "treeverse": "^3.0.0", + "walk-up-path": "^4.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "10.9.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "ci-info": "^4.0.0", + "ini": "^6.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "5.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "glob": "^13.0.0", + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "9.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^20.0.0", + "json-parse-even-better-errors": "^5.0.0", + "pacote": "^21.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "7.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.5.3", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "10.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "3.2.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.5.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@gar/promise-retry": "^1.0.2", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.4", + "proc-log": "^6.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^10.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/aproba": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, - "license": "BSD-2-Clause", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/npm/node_modules/bin-links": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "proc-log": "^6.0.0", + "read-cmd-shim": "^6.0.0", + "write-file-atomic": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "5.0.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "20.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "5.6.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "5.0.5", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.4.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/diff": { + "version": "8.0.4", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.3", + "dev": true, + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "13.0.6", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "9.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.7.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/ini": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "8.2.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^7.0.0", + "npm-package-arg": "^13.0.0", + "promzard": "^3.0.1", + "read": "^5.0.1", + "semver": "^7.7.2", + "validate-npm-package-name": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/ip-address": { + "version": "10.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "6.0.4", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^5.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/npm/node_modules/isexe": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "10.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "8.1.8", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^9.6.0", + "@npmcli/installed-package-contents": "^4.0.0", + "binary-extensions": "^3.0.0", + "diff": "^8.0.2", + "minimatch": "^10.0.3", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "tar": "^7.5.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "10.2.8", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/arborist": "^9.6.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "proc-log": "^6.0.0", + "read": "^5.0.1", + "semver": "^7.3.7", + "signal-exit": "^4.1.0", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "7.0.22", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^9.6.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "8.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^19.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "9.1.8", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^9.6.0", + "@npmcli/run-script": "^10.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "11.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^7.0.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.7", + "sigstore": "^4.0.0", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^19.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "8.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^19.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "8.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "11.5.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "15.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/agent": "^4.0.0", + "@npmcli/redact": "^4.0.0", + "cacache": "^20.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^6.0.0", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "10.2.5", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.1.3", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "5.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^2.0.0", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + }, + "optionalDependencies": { + "iconv-lite": "^0.7.2" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.6", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^7.1.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "12.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "9.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "13.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "10.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "11.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "12.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "19.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^4.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^15.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "7.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "21.5.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^5.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "6.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/proggy": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^5.0.0" }, "engines": { - "node": ">=6.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "^3.0.0" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "6.0.0", "dev": true, - "license": "BSD-2-Clause", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.8.0", + "dev": true, + "inBundle": true, + "license": "ISC", "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", "dev": true, - "license": "BSD-2-Clause", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=4.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/npm/node_modules/sigstore": { + "version": "4.1.0", "dev": true, - "license": "BSD-2-Clause", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.0", + "@sigstore/tuf": "^4.0.1", + "@sigstore/verify": "^3.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/eta": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/eta/-/eta-4.5.1.tgz", - "integrity": "sha512-EaNCGm+8XEIU7YNcc+THptWAO5NfKBHHARxt+wxZljj9bTr/+arRoOm9/MpGt4n6xn9fLnPFRSoLD0WFYGFUxQ==", + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", "dev": true, + "inBundle": true, "license": "MIT", "engines": { - "node": ">=20" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.8.9", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.23", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "13.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "10.2.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/bgub/eta?sponsor=1" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "node_modules/npm/node_modules/tar": { + "version": "7.5.15", "dev": true, - "license": "MIT" + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/fast-content-type-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", - "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], + "inBundle": true, "license": "MIT" }, - "node_modules/fast-string-truncated-width": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", - "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "2.0.2", "dev": true, + "inBundle": true, "license": "MIT" }, - "node_modules/fast-string-width": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", - "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "node_modules/npm/node_modules/tinyglobby": { + "version": "0.2.16", "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "fast-string-truncated-width": "^3.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/fast-wrap-ansi": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.0.tgz", - "integrity": "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==", + "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/undici": { + "version": "6.25.0", "dev": true, + "inBundle": true, "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/npm/node_modules/which": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "7.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "fast-string-width": "^3.0.2" + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/p-each-series": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", + "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "node": ">=12" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/figlet": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.11.0.tgz", - "integrity": "sha512-EEx3OS/l2bFqcUNN2NM9FPJp8vAMrgbCxsbl2hbcJNNxOEwVe3mEzrhan7TbJQViZa8mMqhihlbCaqD+LyYKTQ==", + "node_modules/p-event": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", + "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", + "dev": true, "license": "MIT", "dependencies": { - "commander": "^14.0.0" - }, - "bin": { - "figlet": "bin/index.js" + "p-timeout": "^6.1.2" }, "engines": { - "node": ">= 17.0.0" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "node_modules/p-filter": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", + "dev": true, "license": "MIT", + "dependencies": { + "p-map": "^7.0.1" + }, "engines": { "node": ">=18" }, @@ -1209,373 +4830,547 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-uri": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-7.0.0.tgz", - "integrity": "sha512-ZsC7KQxm1Hra8yO0RvMZ4lGJT7vnBtSNpEHKq39MPN7vjuvCiu1aQ8rkXUaIXG1y/TSDez97Gmv04ibnYqCp/A==", + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "license": "MIT", "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "7.0.0", - "debug": "^4.3.4" + "p-try": "^1.0.0" }, "engines": { - "node": ">= 14" + "node": ">=4" } }, - "node_modules/giget": { + "node_modules/p-locate": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "license": "MIT", "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.6", - "nypm": "^0.6.0", - "pathe": "^2.0.3" + "p-limit": "^1.1.0" }, - "bin": { - "giget": "dist/cli.mjs" + "engines": { + "node": ">=4" } }, - "node_modules/git-up": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", - "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^9.2.0" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-url-parse": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", - "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", + "node_modules/p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", "dev": true, "license": "MIT", - "dependencies": { - "git-up": "^8.1.0" + "engines": { + "node": ">=8" } }, - "node_modules/http-proxy-agent": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-8.0.0.tgz", - "integrity": "sha512-7pose0uGgrCJeH2Qh4JcNhWZp3u/oNrWjNYDK4ydOLxOpTw8V8ogHFAmkz0VWq96JBFj4umVJpvmQi287rSYLg==", + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "8.0.0", - "debug": "^4.3.4" + "engines": { + "node": ">=14.16" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 14" + "node": ">=4" } }, - "node_modules/https-proxy-agent": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-8.0.0.tgz", - "integrity": "sha512-YYeW+iCnAS3xhvj2dvVoWgsbca3RfQy/IlaNHHOtDmU0jMqPI9euIq3Y9BJETdxk16h9NHHCKqp/KB9nIMStCQ==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "8.0.0", - "debug": "^4.3.4" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 14" + "node": ">=6" } }, - "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ip-address": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.1.tgz", - "integrity": "sha512-1FMu8/N15Ck1BL551Jf42NYIoin2unWjLQ2Fze/DXryJRl5twqtwNHlO39qERGbIOcKYWHdgRryhOC+NG4eaLw==", + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" } }, - "node_modules/is-docker": { + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-in-ssh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", - "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", "engines": { - "node": ">=20" + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", "dev": true, "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-ssh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", - "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { - "protocols": "^2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "node_modules/read-package-up": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", + "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", "dev": true, "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.1", + "read-pkg": "^10.0.0", + "type-fest": "^5.2.0" + }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "node_modules/read-package-up/node_modules/type-fest": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz", + "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", "dev": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "dependencies": { - "is-inside-container": "^1.0.0" + "tagged-tag": "^1.0.0" }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/issue-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", - "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "node_modules/read-pkg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz", + "integrity": "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==", "dev": true, "license": "MIT", "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.4.4", + "unicorn-magic": "^0.4.0" }, "engines": { - "node": "^18.17 || >=20.6.1" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", "dev": true, "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-with-bigint": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", - "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, - "license": "MIT" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz", + "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", "dev": true, - "license": "MIT" + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^3.0.2" + }, + "engines": { + "node": ">=14" + } }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", - "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "node_modules/semantic-release": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-25.0.3.tgz", + "integrity": "sha512-WRgl5GcypwramYX4HV+eQGzUbD7UUbljVmS+5G1uMwX/wLgYuJAxGeerXJDMO2xshng4+FXqCgyB5QfClV6WjA==", "dev": true, "license": "MIT", "dependencies": { - "is-unicode-supported": "^2.0.0", - "yoctocolors": "^2.1.1" + "@semantic-release/commit-analyzer": "^13.0.1", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^12.0.0", + "@semantic-release/npm": "^13.1.1", + "@semantic-release/release-notes-generator": "^14.1.0", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^9.0.0", + "debug": "^4.0.0", + "env-ci": "^11.0.0", + "execa": "^9.0.0", + "figures": "^6.0.0", + "find-versions": "^6.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^4.0.0", + "hosted-git-info": "^9.0.0", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", + "marked": "^15.0.0", + "marked-terminal": "^7.3.0", + "micromatch": "^4.0.2", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-package-up": "^12.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "signale": "^1.2.1", + "yargs": "^18.0.0" }, - "engines": { - "node": ">=18" + "bin": { + "semantic-release": "bin/semantic-release.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^22.14.0 || >= 24.10.0" } }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/semantic-release/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/macos-release": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.4.0.tgz", - "integrity": "sha512-wpGPwyg/xrSp4H4Db4xYSeAr6+cFQGHfspHzDUdYxswDnUW0L5Ov63UuJiSr8NMSpyaChO4u1n0MXUvVPtrN6A==", + "node_modules/semantic-release/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "license": "MIT", + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "node_modules/semantic-release/node_modules/clean-stack": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", + "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", "dev": true, "license": "MIT", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "node_modules/semantic-release/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "dev": true, "license": "MIT", "dependencies": { - "mime-db": "^1.54.0" + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" }, "engines": { - "node": ">=18" + "node": "^18.19.0 || >=20.5.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, "engines": { "node": ">=18" }, @@ -1583,425 +5378,432 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", - "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "node_modules/semantic-release/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=18.18.0" } }, - "node_modules/netmask": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", - "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", + "node_modules/semantic-release/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/new-github-release-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", - "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "node_modules/semantic-release/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^2.5.1" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/nypm": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.6.tgz", - "integrity": "sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==", + "node_modules/semantic-release/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", "dependencies": { - "citty": "^0.2.2", - "pathe": "^2.0.3", - "tinyexec": "^1.1.1" - }, - "bin": { - "nypm": "dist/cli.mjs" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nypm/node_modules/citty": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", - "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "node_modules/semantic-release/node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "node_modules/semantic-release/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", - "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "node_modules/semantic-release/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, "license": "MIT", - "dependencies": { - "default-browser": "^5.4.0", - "define-lazy-prop": "^3.0.0", - "is-in-ssh": "^1.0.0", - "is-inside-container": "^1.0.0", - "powershell-utils": "^0.1.0", - "wsl-utils": "^0.3.0" - }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", - "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", + "node_modules/semantic-release/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^5.6.2", - "cli-cursor": "^5.0.0", - "cli-spinners": "^3.2.0", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.1.0", - "log-symbols": "^7.0.1", - "stdin-discarder": "^0.3.1", - "string-width": "^8.1.0" - }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-name": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-7.0.0.tgz", - "integrity": "sha512-/HfRU/lPPr4T2VigM+cvM3cU77es+XF4OEAa4aE5zpdvrxHGD2NmH0AFIWpMNAb+CsZL45rlcIO49Re0ZcRseg==", + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "license": "MIT", - "dependencies": { - "macos-release": "^3.4.0", - "windows-release": "^7.1.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=20" + "node": ">=10" + } + }, + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pac-proxy-agent": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-8.0.0.tgz", - "integrity": "sha512-HyCoVbyQ/nbVlQ/R6wBu0YXhbG2oAnEK5BQ3xMyj1OffQmU5NoOnpLzgPlKHaobUzz5NK0+AZHby4TdydAEBUA==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "8.0.0", - "debug": "^4.3.4", - "get-uri": "7.0.0", - "http-proxy-agent": "8.0.0", - "https-proxy-agent": "8.0.0", - "pac-resolver": "8.0.0", - "quickjs-wasi": "^0.0.1", - "socks-proxy-agent": "9.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/pac-resolver": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-8.0.0.tgz", - "integrity": "sha512-SVNzOxVq2zuTew3WAt7U8UghwzJzuWYuJryd3y8FxyLTZdjVoCzY8kLP39PpEqQCDvlMWdQXwViu0sYT3eiU2w==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", "dev": true, "license": "MIT", "dependencies": { - "degenerator": "6.0.0", - "netmask": "^2.0.2" + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" }, "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "quickjs-wasi": "^0.0.1" + "node": ">=6" } }, - "node_modules/parse-path": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", - "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "node_modules/signale/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { - "protocols": "^2.0.0" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/parse-url": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", - "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", + "node_modules/signale/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/parse-path": "^7.0.0", - "parse-path": "^7.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=14.13.0" + "node": ">=4" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "node_modules/signale/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } }, - "node_modules/perfect-debounce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", - "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "node_modules/signale/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/signale/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=0.8.0" } }, - "node_modules/pkg-types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", - "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "node_modules/signale/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", - "pathe": "^2.0.3" + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" } }, - "node_modules/powershell-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", - "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "node_modules/signale/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/protocols": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "node_modules/signale/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-7.0.0.tgz", - "integrity": "sha512-okTgt79rHTvMHkr/Ney5rZpgCHh3g1g3tI5uhkgN5b7OeI3n0Q/ui1uv9OdrnZNJM9WIZJqZPh/UJs+YtO/TMQ==", + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "8.0.0", - "debug": "^4.3.4", - "http-proxy-agent": "8.0.0", - "https-proxy-agent": "8.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "8.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "9.0.0" + "unicode-emoji-modifier-base": "^1.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/quickjs-wasi": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/quickjs-wasi/-/quickjs-wasi-0.0.1.tgz", - "integrity": "sha512-fBWNLTBkxkLAhe1AzF1hyXEvuA+N+vV1WMP2D6iiMUblvmOt8Pp5t8zUcgvz7aYA1ldUdxDlgUse15dmcKjkNg==", + "node_modules/spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", "dev": true, "license": "MIT" }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "license": "MIT", "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "dev": true, + "license": "ISC", + "dependencies": { + "through2": "~2.0.0" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, - "node_modules/release-it": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-20.0.1.tgz", - "integrity": "sha512-3ob1P1aV+3+ZOoR7qgobfYyMlQbpitzOK09iKTtQ145vFi4rWxlRTgHwtVl8kokCvqiF/cJPxRlfcmZmF5aDJA==", + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/webpro" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/webpro" - } - ], "license": "MIT", "dependencies": { - "@inquirer/prompts": "8.4.2", - "@octokit/rest": "22.0.1", - "@phun-ky/typeof": "2.0.3", - "async-retry": "1.3.3", - "c12": "3.3.3", - "ci-info": "^4.4.0", - "defu": "^6.1.7", - "eta": "4.5.1", - "git-url-parse": "16.1.0", - "issue-parser": "7.0.1", - "lodash.merge": "4.6.2", - "mime-types": "3.0.2", - "new-github-release-url": "2.0.0", - "open": "11.0.0", - "ora": "9.3.0", - "os-name": "7.0.0", - "proxy-agent": "7.0.0", - "semver": "7.7.4", - "tinyglobby": "0.2.15", - "undici": "7.24.5", - "url-join": "5.0.0", - "wildcard-match": "5.1.4", - "yargs-parser": "22.0.0" + "safe-buffer": "~5.1.0" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" }, - "bin": { - "release-it": "bin/release-it.js" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + "node": ">=4" } }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "node_modules/super-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", + "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", "dev": true, "license": "MIT", + "dependencies": { + "function-timeout": "^1.0.1", + "make-asynchronous": "^1.0.1", + "time-span": "^5.1.0" + }, "engines": { "node": ">=18" }, @@ -2009,144 +5811,139 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, "engines": { - "node": ">=14" + "node": ">=14.18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "dev": true, "license": "MIT", "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/socks": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.8.tgz", - "integrity": "sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==", + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true, "license": "MIT", - "dependencies": { - "ip-address": "^10.1.1", - "smart-buffer": "^4.2.0" - }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">=14.16" } }, - "node_modules/socks-proxy-agent": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-9.0.0.tgz", - "integrity": "sha512-fFlbMlfsXhK02ZB8aZY7Hwxh/IHBV9b1Oq9bvBk6tkFWXvdAxUgA0wbw/NYR5liU3Y5+KI6U4FH3kYJt9QYv0w==", + "node_modules/tempy": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.2.0.tgz", + "integrity": "sha512-d79HhZya5Djd7am0q+W4RTsSU+D/aJzM+4Y4AGJGuGlgM2L6sx5ZvOYTmZjqPhrDrV6xJTtRSm1JCLj6V6LHLQ==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "8.0.0", - "debug": "^4.3.4", - "socks": "^2.8.3" + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stdin-discarder": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", - "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "any-promise": "^1.0.0" } }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" + "thenify": ">= 3.1.0 < 4" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=0.8" } }, - "node_modules/tinyexec": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", - "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", "dev": true, "license": "MIT", + "dependencies": { + "convert-hrtime": "^5.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tinyglobby": { @@ -2166,12 +5963,41 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", "dev": true, - "license": "0BSD" + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } }, "node_modules/type-fest": { "version": "2.19.0", @@ -2186,6 +6012,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/undici": { "version": "7.24.5", "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz", @@ -2196,6 +6036,45 @@ "node": ">=20.18.1" } }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/universal-user-agent": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", @@ -2203,6 +6082,16 @@ "dev": true, "license": "ISC" }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/url-join": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", @@ -2213,6 +6102,47 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/web-worker": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", + "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/widest-line": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", @@ -2251,41 +6181,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wildcard-match": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.4.tgz", - "integrity": "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==", - "dev": true, - "license": "ISC" - }, - "node_modules/windows-release": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-7.1.1.tgz", - "integrity": "sha512-0GBwC9WmR8Bm3WYiz3FC391054BsFHZ2gzBVdYj9uj5eIVYzbn/YPYCYW9SWdh9vwnLuzpn1UGwJKiMG4F236w==", - "dev": true, - "license": "MIT", - "dependencies": { - "powershell-utils": "^0.2.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/powershell-utils": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz", - "integrity": "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==", + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "9.0.2", @@ -2327,21 +6228,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wsl-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", - "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "dev": true, "license": "MIT", "dependencies": { - "is-wsl": "^3.1.0", - "powershell-utils": "^0.1.0" + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yargs-parser": { @@ -2354,6 +6276,31 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yoctocolors": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", diff --git a/package.json b/package.json index e0aefb8..d0b05e9 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ }, "scripts": { "postinstall": "node bin/aiworkers.js --help", - "test": "node --test tests/*.test.js" + "test": "node --test tests/*.test.js", + "release": "semantic-release" }, "repository": { "type": "git", @@ -17,10 +18,15 @@ "author": "eumaninho54", "license": "MIT", "publishConfig": { - "access": "public" + "access": "public", + "registry": "https://registry.npmjs.org/", + "provenance": true }, "devDependencies": { - "release-it": "^20.0.1" + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/git": "^10.0.1", + "conventional-changelog-conventionalcommits": "^9.1.0", + "semantic-release": "^25.0.3" }, "dependencies": { "boxen": "^8.0.1", diff --git a/release.config.cjs b/release.config.cjs new file mode 100644 index 0000000..197da1a --- /dev/null +++ b/release.config.cjs @@ -0,0 +1,60 @@ +const rules = [ + { type: 'feat', release: 'minor', title: '✨ Features' }, + { type: 'fix', release: 'patch', title: '🐛 Bug Fixes' }, + { type: 'perf', release: 'patch', title: '💨 Performance Improvements' }, + { type: 'refactor', release: 'patch', title: '🔄 Code Refactors' }, + { type: 'docs', release: 'patch', title: '📚 Documentation' }, + { type: 'chore', release: 'patch', title: '🛠️ Other changes' }, +] + +const sortMap = Object.fromEntries( + rules.map((rule, index) => [rule.title, index]) +) + +/** + * @type {import('semantic-release').GlobalConfig} + */ +module.exports = { + branches: ['main', { name: 'next', prerelease: 'next' }], + plugins: [ + [ + '@semantic-release/commit-analyzer', + { + preset: 'conventionalcommits', + releaseRules: [ + { breaking: true, release: 'minor' }, + { revert: true, release: 'patch' }, + ].concat(rules.map(({ type, release }) => ({ type, release }))), + }, + ], + [ + '@semantic-release/release-notes-generator', + { + preset: 'conventionalcommits', + presetConfig: { + types: rules.map(({ type, title }) => ({ + type, + section: title, + })), + }, + writerOpts: { + commitGroupsSort: (a, z) => sortMap[a.title] - sortMap[z.title], + }, + }, + ], + [ + '@semantic-release/changelog', + { + changelogFile: 'CHANGELOG.md', + }, + ], + '@semantic-release/npm', + '@semantic-release/github', + [ + '@semantic-release/git', + { + assets: ['package.json', 'CHANGELOG.md'], + }, + ], + ], +} From e394773f786ada5d4a23e50cabf086209f27b3a4 Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 20:25:34 -0300 Subject: [PATCH 16/25] fix(setup): make baseDir optional for tests Default baseDir to os.homedir() so the test suite can sandbox it. Co-Authored-By: Claude Haiku 4.5 --- bin/commands/setup.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/commands/setup.js b/bin/commands/setup.js index fe1e99b..bdf8c77 100644 --- a/bin/commands/setup.js +++ b/bin/commands/setup.js @@ -55,8 +55,8 @@ function updateClaudeMd(claudeMd, rulesDir) { } } -export function setup() { - const claudeDir = path.join(os.homedir(), '.claude'); +export function setup(baseDir = os.homedir()) { + const claudeDir = path.join(baseDir, '.claude'); const claudeMd = path.join(claudeDir, 'CLAUDE.md'); fs.mkdirSync(claudeDir, { recursive: true }); From a65cd48393b826cf2d414683281754bb8a8d12ba Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 20:39:36 -0300 Subject: [PATCH 17/25] feat(cli): add update subcommand Co-Authored-By: Claude Haiku 4.5 --- bin/aiworkers.js | 5 ++ bin/commands/update.js | 106 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 bin/commands/update.js diff --git a/bin/aiworkers.js b/bin/aiworkers.js index 0564c08..8924f48 100755 --- a/bin/aiworkers.js +++ b/bin/aiworkers.js @@ -4,6 +4,7 @@ import { createRequire } from 'module'; import boxen from 'boxen'; import { banner, c } from './banner.js'; import { setup } from './commands/setup.js'; +import { update } from './commands/update.js'; const require = createRequire(import.meta.url); const pkg = require('../package.json'); @@ -13,6 +14,9 @@ const command = process.argv[2]; if (command === 'setup') { banner(); setup(); +} else if (command === 'update') { + banner(); + await update(); } else if (command === '--version' || command === '-v') { console.log(pkg.version); } else if (!command || command === '--help' || command === '-h') { @@ -21,6 +25,7 @@ if (command === 'setup') { `${c.bold}Usage:${c.reset} aiworkers \n\n` + `${c.bold}Commands:${c.reset}\n\n` + ` ${c.cyan}setup${c.reset} Install AIWorkers into the global ~/.claude/ folder\n` + + ` ${c.cyan}update${c.reset} Upgrade AIWorkers to the latest version on npm and re-sync\n` + ` ${c.cyan}--version${c.reset} Print the installed version\n` + ` ${c.cyan}--help${c.reset} Show this help message\n\n` + `${c.bold}Example:${c.reset}\n\n` + diff --git a/bin/commands/update.js b/bin/commands/update.js new file mode 100644 index 0000000..331c3c0 --- /dev/null +++ b/bin/commands/update.js @@ -0,0 +1,106 @@ +import https from 'https'; +import { execSync, spawnSync } from 'child_process'; +import { createRequire } from 'module'; +import boxen from 'boxen'; +import { c } from '../banner.js'; + +const require = createRequire(import.meta.url); +const pkg = require('../../package.json'); + +const REGISTRY_URL = `https://registry.npmjs.org/${pkg.name}/latest`; + +function fetchLatestVersion() { + return new Promise((resolve, reject) => { + const req = https.get(REGISTRY_URL, { headers: { Accept: 'application/json' } }, (res) => { + if (res.statusCode !== 200) { + reject(new Error(`Registry responded ${res.statusCode}`)); + res.resume(); + return; + } + let data = ''; + res.on('data', (chunk) => { data += chunk; }); + res.on('end', () => { + try { + resolve(JSON.parse(data).version); + } catch (err) { + reject(err); + } + }); + }); + req.on('error', reject); + req.setTimeout(10_000, () => req.destroy(new Error('Registry request timed out'))); + }); +} + +function detectGlobalPackageManager() { + const userAgent = process.env.npm_config_user_agent || ''; + if (userAgent.startsWith('pnpm')) return 'pnpm'; + if (userAgent.startsWith('yarn')) return 'yarn'; + if (userAgent.startsWith('bun')) return 'bun'; + return 'npm'; +} + +function installCommand(pm, spec) { + switch (pm) { + case 'pnpm': return ['pnpm', ['add', '-g', spec]]; + case 'yarn': return ['yarn', ['global', 'add', spec]]; + case 'bun': return ['bun', ['add', '-g', spec]]; + default: return ['npm', ['install', '-g', spec]]; + } +} + +export async function update() { + console.log(`${c.dim} Checking for updates...${c.reset}\n`); + console.log(` ${c.bold}Current:${c.reset} v${pkg.version}`); + + let latest; + try { + latest = await fetchLatestVersion(); + } catch (err) { + console.error(`\n ${c.yellow}Could not check the npm registry:${c.reset} ${err.message}\n`); + process.exit(1); + } + + console.log(` ${c.bold}Latest:${c.reset} v${latest}\n`); + + if (latest === pkg.version) { + console.log(boxen( + `${c.green}${c.bold}Already up to date.${c.reset}\n\n` + + `You're running the latest version (${c.bold}v${pkg.version}${c.reset}).`, + { + padding: 1, + margin: { top: 0, bottom: 1, left: 0, right: 0 }, + borderStyle: 'round', + borderColor: 'green', + } + )); + return; + } + + const pm = detectGlobalPackageManager(); + const [bin, args] = installCommand(pm, `${pkg.name}@${latest}`); + + console.log(` ${c.bold}Installing${c.reset} ${c.dim}via ${pm}...${c.reset}\n`); + const installResult = spawnSync(bin, args, { stdio: 'inherit' }); + if (installResult.status !== 0) { + console.error(`\n ${c.yellow}Install failed.${c.reset} Try running manually: ${bin} ${args.join(' ')}\n`); + process.exit(installResult.status ?? 1); + } + + console.log(`\n ${c.bold}Syncing new content to ~/.claude/...${c.reset}\n`); + const setupResult = spawnSync('aiworkers', ['setup'], { stdio: 'inherit' }); + if (setupResult.status !== 0) { + console.error(`\n ${c.yellow}Update installed, but${c.reset} ${c.bold}aiworkers setup${c.reset} ${c.yellow}failed. Run it manually.${c.reset}\n`); + process.exit(setupResult.status ?? 1); + } + + console.log(boxen( + `${c.green}${c.bold}Updated.${c.reset} v${pkg.version} → v${latest}`, + { + padding: 1, + margin: { top: 0, bottom: 1, left: 0, right: 0 }, + borderStyle: 'round', + borderColor: 'green', + } + )); +} From 8a242f1c6252e8d279e9497bb22054a3c1643255 Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 21:05:00 -0300 Subject: [PATCH 18/25] feat(cli): add unsetup command Co-Authored-By: Claude Haiku 4.5 --- bin/aiworkers.js | 5 ++++ bin/commands/unsetup.js | 66 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 bin/commands/unsetup.js diff --git a/bin/aiworkers.js b/bin/aiworkers.js index 8924f48..4e9bea5 100755 --- a/bin/aiworkers.js +++ b/bin/aiworkers.js @@ -5,6 +5,7 @@ import boxen from 'boxen'; import { banner, c } from './banner.js'; import { setup } from './commands/setup.js'; import { update } from './commands/update.js'; +import { unsetup } from './commands/unsetup.js'; const require = createRequire(import.meta.url); const pkg = require('../package.json'); @@ -17,6 +18,9 @@ if (command === 'setup') { } else if (command === 'update') { banner(); await update(); +} else if (command === 'unsetup') { + banner(); + unsetup(); } else if (command === '--version' || command === '-v') { console.log(pkg.version); } else if (!command || command === '--help' || command === '-h') { @@ -26,6 +30,7 @@ if (command === 'setup') { `${c.bold}Commands:${c.reset}\n\n` + ` ${c.cyan}setup${c.reset} Install AIWorkers into the global ~/.claude/ folder\n` + ` ${c.cyan}update${c.reset} Upgrade AIWorkers to the latest version on npm and re-sync\n` + + ` ${c.cyan}unsetup${c.reset} Remove AIWorkers content from ~/.claude/ (keeps npm package)\n` + ` ${c.cyan}--version${c.reset} Print the installed version\n` + ` ${c.cyan}--help${c.reset} Show this help message\n\n` + `${c.bold}Example:${c.reset}\n\n` + diff --git a/bin/commands/unsetup.js b/bin/commands/unsetup.js new file mode 100644 index 0000000..3756c0d --- /dev/null +++ b/bin/commands/unsetup.js @@ -0,0 +1,66 @@ +import fs from 'fs'; +import os from 'os'; +import path from 'path'; +import boxen from 'boxen'; +import { c } from '../banner.js'; + +const AIWORKERS_SUBDIRS = ['commands', 'skills', 'agents', 'rules']; +const IMPORT_LINE_RE = /^@rules\/aiworkers\/[^\s]+\.md\s*$/; + +function removeAiworkersDir(claudeDir, subdir) { + const target = path.join(claudeDir, subdir, 'aiworkers'); + if (!fs.existsSync(target)) { + console.log(` ${c.gray}—${c.reset} ${subdir}/aiworkers ${c.dim}(not found)${c.reset}`); + return false; + } + fs.rmSync(target, { recursive: true, force: true }); + console.log(` ${c.green}✓${c.reset} ${subdir}/aiworkers`); + return true; +} + +function cleanClaudeMd(claudeMd) { + if (!fs.existsSync(claudeMd)) { + console.log(` ${c.gray}—${c.reset} CLAUDE.md ${c.dim}(not found)${c.reset}`); + return; + } + const lines = fs.readFileSync(claudeMd, 'utf8').split('\n'); + const kept = lines.filter(line => !IMPORT_LINE_RE.test(line)); + const removed = lines.length - kept.length; + + if (removed === 0) { + console.log(` ${c.gray}—${c.reset} No aiworkers imports in CLAUDE.md`); + return; + } + fs.writeFileSync(claudeMd, kept.join('\n').replace(/\n{3,}$/, '\n\n').replace(/\n+$/, '\n')); + console.log(` ${c.green}✓${c.reset} Removed ${removed} import line(s) from CLAUDE.md`); +} + +export function unsetup(baseDir = os.homedir()) { + const claudeDir = path.join(baseDir, '.claude'); + + if (!fs.existsSync(claudeDir)) { + console.log(`${c.dim} No ${claudeDir} found — nothing to remove.${c.reset}\n`); + return; + } + + console.log(`${c.dim} Removing AIWorkers content from ${claudeDir}${c.reset}\n`); + + console.log(` ${c.bold}Directories${c.reset}`); + for (const subdir of AIWORKERS_SUBDIRS) { + removeAiworkersDir(claudeDir, subdir); + } + console.log(); + + console.log(` ${c.bold}CLAUDE.md${c.reset}`); + cleanClaudeMd(path.join(claudeDir, 'CLAUDE.md')); + + console.log(boxen( + `${c.green}${c.bold}Removed.${c.reset} AIWorkers content cleared from ${c.bold}~/.claude/${c.reset}`, + { + padding: 1, + margin: { top: 1, bottom: 1, left: 0, right: 0 }, + borderStyle: 'round', + borderColor: 'green', + } + )); +} From b9b3e6331b56646b422c1b16516ec512330dcb6f Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 21:05:10 -0300 Subject: [PATCH 19/25] fix(setup): install to home dir Co-Authored-By: Claude Haiku 4.5 --- scripts/setup.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/setup.sh b/scripts/setup.sh index 8edbaa7..df057a2 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -2,9 +2,7 @@ AIWORKERS_DIR="$(cd "$(dirname "$0")/.." && pwd)" -# When run via postinstall, $INIT_CWD is the consuming project root -# When run standalone, fall back to cwd -TARGET_DIR="${INIT_CWD:-$PWD}" +TARGET_DIR="$HOME" CLAUDE_DIR="$TARGET_DIR/.claude" AW_COMMANDS="$CLAUDE_DIR/commands/aiworkers" From 19ee31c66dbd17f2f3d433092b3148f4919c397b Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 21:48:20 -0300 Subject: [PATCH 20/25] docs: migrate architecture docs Move architecture.md from references/ subdirs to docs/ for better discoverability by humans. Co-Authored-By: Claude Haiku 4.5 --- docs/feature-architecture.md | 160 ++++++++++++++++++++++++++++++ docs/rn-component-architecture.md | 59 +++++++++++ 2 files changed, 219 insertions(+) create mode 100644 docs/feature-architecture.md create mode 100644 docs/rn-component-architecture.md diff --git a/docs/feature-architecture.md b/docs/feature-architecture.md new file mode 100644 index 0000000..f9ead12 --- /dev/null +++ b/docs/feature-architecture.md @@ -0,0 +1,160 @@ +# `/feature` — Architecture + +> **Audience**: humans maintaining this skill. Claude reads `SKILL.md`; humans read this. +> This document covers *why* the skill is shaped this way. For *how* to execute it, read `SKILL.md`. + +--- + +## Design principle + +**Each agent receives the minimum context needed to do its job, and no more.** + +Context bloat is the failure mode we are designing against. A single mega-prompt with the full conversation + plan + diff + reviews degrades into the "dumb zone" — the model loses sharpness, hallucinates, and ignores half the input. The pipeline is split into specialized agents precisely so each one stays in its zone of competence with a tight, declarative prompt. + +The cost of this design is coordination overhead (more spawns, more handoffs). The benefit is that each individual decision is made by an agent operating with high signal-to-noise. + +--- + +## Pipeline diagram + +```mermaid +flowchart TD + Start([User: /feature description]) --> P0[Phase 0: Pre-flight
git status, slug, tmp dir] + P0 --> P05[Phase 0.5: GRILL
Interviewer agent] + P05 -->|grill summary| P06[Phase 0.6: SPEC
Spec Writer agent] + P06 -->|writes| PRD[(prd-slug.md
product PRD)] + PRD --> CP1{User
approves PRD?} + CP1 -->|no| P06 + CP1 -->|yes| P1[Phase 1: PLAN
Planner agent] + P1 -->|reads PRD, writes| TECH[(tech-prd-slug.md
technical PRD)] + TECH --> CP2{User
approves plan?} + CP2 -->|no| P1 + CP2 -->|yes| P2[Phase 2: DO
Implementer agent] + P2 -->|commits| BRANCH[(branch + commits)] + BRANCH --> CP3{User
approves
implementation?} + CP3 -->|yes| P3a[Phase 3a: Run tests] + P3a -->|fail| P3afix[Test Fixer
max 2 retries] + P3afix --> P3a + P3a -->|pass| P3b{{Phase 3b: DUAL REVIEW
parallel}} + P3b --> SR[Spec Reviewer] + P3b --> CR[Code Reviewer] + SR -->|writes| RSPEC[(review-spec-slug.md)] + CR -->|writes| RCODE[(review-code-slug.md)] + RSPEC --> CP4{User
approves
reviews?} + RCODE --> CP4 + CP4 -->|both empty| P5 + CP4 -->|yes| P4[Phase 4: ACT
Fixer agent
single pass] + P4 -->|commits| BRANCH + P4 --> P3a2[Re-run tests] + P3a2 --> P5[Phase 5: Finalize
open PR] + P5 --> Done([PR URL]) +``` + +--- + +## Context flow (who sees what) + +| Handoff | Input passed | Where it lives | Notes | +|---|---|---|---| +| Orchestrator → Interviewer | raw user description, branch name | inline | full grill happens inside the agent via `AskUserQuestion` | +| Interviewer → Spec Writer | grill summary (structured), raw request | inline | **transcript is discarded** — summary is the canonical extract | +| Spec Writer → Planner | product PRD path | file (`prd-.md`) | planner reads from disk, not from prompt | +| Planner → Implementer | both PRD paths, branch | files | implementer reads both for context + criteria | +| Implementer → Spec Reviewer | product PRD path, diff, commits | file + inline | **no tech PRD** — reviewer verifies *what*, not *how* | +| Implementer → Code Reviewer | diff, commits | inline only | **no PRDs** — code defects are spec-agnostic | +| Reviewers → Fixer | both PRD paths, both review paths | files | fixer plans all fixes together, single pass | + +**Invariant**: large artifacts (PRDs, reviews) live on disk in `.claude/tmp/`. Prompts pass *paths*, not contents. This keeps the orchestrator's context window small and lets PRDs survive context compression. + +--- + +## Key design decisions + +### 1. Grill summary, not full transcript, feeds the Spec Writer + +The grill produces 20–40 turns of Q&A. Passing all of that to the Spec Writer would re-introduce the conversational noise the grill exists to eliminate. The Interviewer's `Step 3 — Final summary` is the canonical extract; the transcript is discarded. + +**Rejected alternative**: pass both transcript + summary "for context". This bloats the Spec Writer's prompt with redundancy and tempts it to weight raw conversation over the distilled decisions. + +### 2. Two reviewers in parallel, with disjoint inputs + +Spec compliance and code correctness are orthogonal concerns. Bundling them into one reviewer produces a longer, shallower review — the agent juggles two mental models. Splitting them yields two focused reports, and they run in parallel because they share no state. + +- Spec Reviewer reads PRD + diff. Does not see tech PRD (architecture is out of scope for compliance check). +- Code Reviewer reads diff only. Does not see any PRD (defects are spec-agnostic). + +**Rejected alternative**: single Reviewer agent with the original `reviewer.md` persona. Worked, but produced unfocused reviews where security findings got buried under spec checklists. + +### 3. One Fixer, not two sequential fixers + +An earlier design had Spec Fixer → Code Fixer running strictly sequential (to avoid commit conflicts). Collapsed into one agent because: + +- Single agent = no commit race by construction +- Holistic planning: a fix for a missing PRD criterion should not re-introduce a defect already flagged in the code review +- Coherent commits grouped by file, not by source review +- One spawn vs two, one test re-run vs two + +**Rejected alternative**: two sequential fixers. Discarded due to artificial separation — both edit the same code, both commit, and the spec fixer benefits from seeing code-review findings while it works. + +### 4. PRDs persisted to `.claude/tmp/`, not passed inline + +Every artifact between phases (product PRD, technical PRD, both reviews) lives on disk. Three benefits: + +- Survives context compression mid-session +- Downstream agents read only the sections they need (vs the orchestrator hauling full contents in every prompt) +- Auditable: after a failed run, the user can inspect the artifacts and re-run a single phase + +**Rejected alternative**: pass artifact contents inline through the orchestrator. Wastes orchestrator tokens on every handoff and loses everything if context compresses. + +### 5. Model routing + +| Agent | Model | Why | +|---|---|---| +| Interviewer | Sonnet | needs codebase exploration + structured questioning; Opus overkill for branching dialog | +| Spec Writer | Sonnet | mechanical translation grill → structured doc; not a reasoning-heavy task | +| Planner | **Opus** | hardest reasoning step — architecture decisions, blast radius, sequencing | +| Implementer | Sonnet | execution from blueprint; tech PRD removed most ambiguity | +| Reviewers | Sonnet | pattern-matching for defects + compliance; parallelizable, cost-sensitive | +| Fixer | Sonnet | scoped edits driven by explicit action lists | + +The only Opus spend is the Planner. Everything downstream rides Sonnet. + +--- + +## Known trade-offs + +- **Checkpoint fatigue**: 4 user approval points (PRD, plan, implementation, reviews). For trivial features this is overhead. No `--yolo` mode yet. +- **No verify phase**: tests passing ≠ feature works in practice. A UI/CLI feature ships without manual exercise. The `verify` skill exists but is not wired in. +- **Re-review loop cap**: 1 additional cycle. If issues persist, the skill aborts rather than looping — bounded but means complex bugs may not auto-resolve. +- **Grill via `AskUserQuestion`**: structured options + "Other" free-text. Less fluid than open-ended chat, but enables fresh-context isolation of the interviewer agent. + +--- + +## File map + +``` +src/ +├── commands/feature/ +│ ├── SKILL.md ← orchestrator instructions (Claude reads) +│ └── references/ +│ └── architecture.md ← this file +├── skills/grill-me/ +│ └── SKILL.md ← invoked by Phase 0.5 +└── agents/ ← personas spawned by the skill + ├── spec-writer.md ← Phase 0.6 + ├── planner.md ← Phase 1 + ├── implementer.md ← Phase 2 + ├── spec-reviewer.md ← Phase 3b (parallel) + ├── code-reviewer.md ← Phase 3b (parallel) + └── fixer.md ← Phase 4 + Phase 3a-fix +``` + +Artifacts produced at runtime (gitignored, per-feature): + +``` +.claude/tmp/ +├── prd-.md ← product PRD +├── tech-prd-.md ← technical PRD +├── review-spec-.md ← spec review +└── review-code-.md ← code review +``` diff --git a/docs/rn-component-architecture.md b/docs/rn-component-architecture.md new file mode 100644 index 0000000..14a97d8 --- /dev/null +++ b/docs/rn-component-architecture.md @@ -0,0 +1,59 @@ +# Layered Hook Architecture + +This document defines the layering contract for React Native components scaffolded by `/rn-component`. + +## Layers + +### View (`index.tsx`) +- JSX only — no state, no logic, no side effects. +- Consumes exactly three hooks: `useStyles`, `useReanimatedStyles`, and `useViewModel`. +- Receives props typed as `IProps`. + +### ViewModel (`hooks/useViewModel/`) +- Single owner of all component logic. +- May use: `useState`, `useReducer`, `useMemo`, `useCallback`, `useEffect`, store subscriptions. +- Calls functions from `services/` and `library/` as needed. +- Returns `IUseViewModelReturn`. + +### Static Styles (`styles.ts`) +- Exports `useStyles(props: IProps)` — a hook that returns a `StyleSheet.create({})` result. +- Memoized with `useMemo`. +- No animated properties here. + +### Animation Styles (`hooks/useReanimatedStyles/`) +- All `react-native-reanimated` logic lives here. +- Receives `IUseReanimatedStylesProps` (never static styles). +- Never contains `StyleSheet.create` calls. + +### Services (`services/`) +- Plain async functions (API calls, AsyncStorage, etc.). +- No hooks allowed. +- Called from ViewModel only — never from the View. + +### Library (`library/`) +- Pure utility functions. +- No hooks, no side effects. +- May be called from ViewModel or from services. + +## Type conventions +- Interfaces use the `I` prefix: `IComponentNameProps`, `IUseComponentNameViewModelReturn`. +- Plain types (union, intersection, alias) have no prefix. +- Every folder that has public exports has a barrel `index.ts`. + +## Barrel cycle rule +Templates use deep relative imports only (e.g. `./types`, `../useReanimatedStyles/types`). +Never use `../..` shorthand — it creates import cycles between barrels. + +## JSX conditional rendering +Never wrap a JSX branch of a ternary in `()`. Use the line-break form: + +```tsx +{isRequired + ? + + : null +} +``` From 7c0902f969395e9e85e231b89d4f0aa6ffbb564e Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 21:48:22 -0300 Subject: [PATCH 21/25] cleanup: remove old architecture docs References now point to docs/ directory. Remove old files from references/ subdirs. Co-Authored-By: Claude Haiku 4.5 --- .../feature/references/architecture.md | 160 ------------------ .../rn-component/references/architecture.md | 59 ------- 2 files changed, 219 deletions(-) delete mode 100644 src/commands/feature/references/architecture.md delete mode 100644 src/commands/rn-component/references/architecture.md diff --git a/src/commands/feature/references/architecture.md b/src/commands/feature/references/architecture.md deleted file mode 100644 index f9ead12..0000000 --- a/src/commands/feature/references/architecture.md +++ /dev/null @@ -1,160 +0,0 @@ -# `/feature` — Architecture - -> **Audience**: humans maintaining this skill. Claude reads `SKILL.md`; humans read this. -> This document covers *why* the skill is shaped this way. For *how* to execute it, read `SKILL.md`. - ---- - -## Design principle - -**Each agent receives the minimum context needed to do its job, and no more.** - -Context bloat is the failure mode we are designing against. A single mega-prompt with the full conversation + plan + diff + reviews degrades into the "dumb zone" — the model loses sharpness, hallucinates, and ignores half the input. The pipeline is split into specialized agents precisely so each one stays in its zone of competence with a tight, declarative prompt. - -The cost of this design is coordination overhead (more spawns, more handoffs). The benefit is that each individual decision is made by an agent operating with high signal-to-noise. - ---- - -## Pipeline diagram - -```mermaid -flowchart TD - Start([User: /feature description]) --> P0[Phase 0: Pre-flight
git status, slug, tmp dir] - P0 --> P05[Phase 0.5: GRILL
Interviewer agent] - P05 -->|grill summary| P06[Phase 0.6: SPEC
Spec Writer agent] - P06 -->|writes| PRD[(prd-slug.md
product PRD)] - PRD --> CP1{User
approves PRD?} - CP1 -->|no| P06 - CP1 -->|yes| P1[Phase 1: PLAN
Planner agent] - P1 -->|reads PRD, writes| TECH[(tech-prd-slug.md
technical PRD)] - TECH --> CP2{User
approves plan?} - CP2 -->|no| P1 - CP2 -->|yes| P2[Phase 2: DO
Implementer agent] - P2 -->|commits| BRANCH[(branch + commits)] - BRANCH --> CP3{User
approves
implementation?} - CP3 -->|yes| P3a[Phase 3a: Run tests] - P3a -->|fail| P3afix[Test Fixer
max 2 retries] - P3afix --> P3a - P3a -->|pass| P3b{{Phase 3b: DUAL REVIEW
parallel}} - P3b --> SR[Spec Reviewer] - P3b --> CR[Code Reviewer] - SR -->|writes| RSPEC[(review-spec-slug.md)] - CR -->|writes| RCODE[(review-code-slug.md)] - RSPEC --> CP4{User
approves
reviews?} - RCODE --> CP4 - CP4 -->|both empty| P5 - CP4 -->|yes| P4[Phase 4: ACT
Fixer agent
single pass] - P4 -->|commits| BRANCH - P4 --> P3a2[Re-run tests] - P3a2 --> P5[Phase 5: Finalize
open PR] - P5 --> Done([PR URL]) -``` - ---- - -## Context flow (who sees what) - -| Handoff | Input passed | Where it lives | Notes | -|---|---|---|---| -| Orchestrator → Interviewer | raw user description, branch name | inline | full grill happens inside the agent via `AskUserQuestion` | -| Interviewer → Spec Writer | grill summary (structured), raw request | inline | **transcript is discarded** — summary is the canonical extract | -| Spec Writer → Planner | product PRD path | file (`prd-.md`) | planner reads from disk, not from prompt | -| Planner → Implementer | both PRD paths, branch | files | implementer reads both for context + criteria | -| Implementer → Spec Reviewer | product PRD path, diff, commits | file + inline | **no tech PRD** — reviewer verifies *what*, not *how* | -| Implementer → Code Reviewer | diff, commits | inline only | **no PRDs** — code defects are spec-agnostic | -| Reviewers → Fixer | both PRD paths, both review paths | files | fixer plans all fixes together, single pass | - -**Invariant**: large artifacts (PRDs, reviews) live on disk in `.claude/tmp/`. Prompts pass *paths*, not contents. This keeps the orchestrator's context window small and lets PRDs survive context compression. - ---- - -## Key design decisions - -### 1. Grill summary, not full transcript, feeds the Spec Writer - -The grill produces 20–40 turns of Q&A. Passing all of that to the Spec Writer would re-introduce the conversational noise the grill exists to eliminate. The Interviewer's `Step 3 — Final summary` is the canonical extract; the transcript is discarded. - -**Rejected alternative**: pass both transcript + summary "for context". This bloats the Spec Writer's prompt with redundancy and tempts it to weight raw conversation over the distilled decisions. - -### 2. Two reviewers in parallel, with disjoint inputs - -Spec compliance and code correctness are orthogonal concerns. Bundling them into one reviewer produces a longer, shallower review — the agent juggles two mental models. Splitting them yields two focused reports, and they run in parallel because they share no state. - -- Spec Reviewer reads PRD + diff. Does not see tech PRD (architecture is out of scope for compliance check). -- Code Reviewer reads diff only. Does not see any PRD (defects are spec-agnostic). - -**Rejected alternative**: single Reviewer agent with the original `reviewer.md` persona. Worked, but produced unfocused reviews where security findings got buried under spec checklists. - -### 3. One Fixer, not two sequential fixers - -An earlier design had Spec Fixer → Code Fixer running strictly sequential (to avoid commit conflicts). Collapsed into one agent because: - -- Single agent = no commit race by construction -- Holistic planning: a fix for a missing PRD criterion should not re-introduce a defect already flagged in the code review -- Coherent commits grouped by file, not by source review -- One spawn vs two, one test re-run vs two - -**Rejected alternative**: two sequential fixers. Discarded due to artificial separation — both edit the same code, both commit, and the spec fixer benefits from seeing code-review findings while it works. - -### 4. PRDs persisted to `.claude/tmp/`, not passed inline - -Every artifact between phases (product PRD, technical PRD, both reviews) lives on disk. Three benefits: - -- Survives context compression mid-session -- Downstream agents read only the sections they need (vs the orchestrator hauling full contents in every prompt) -- Auditable: after a failed run, the user can inspect the artifacts and re-run a single phase - -**Rejected alternative**: pass artifact contents inline through the orchestrator. Wastes orchestrator tokens on every handoff and loses everything if context compresses. - -### 5. Model routing - -| Agent | Model | Why | -|---|---|---| -| Interviewer | Sonnet | needs codebase exploration + structured questioning; Opus overkill for branching dialog | -| Spec Writer | Sonnet | mechanical translation grill → structured doc; not a reasoning-heavy task | -| Planner | **Opus** | hardest reasoning step — architecture decisions, blast radius, sequencing | -| Implementer | Sonnet | execution from blueprint; tech PRD removed most ambiguity | -| Reviewers | Sonnet | pattern-matching for defects + compliance; parallelizable, cost-sensitive | -| Fixer | Sonnet | scoped edits driven by explicit action lists | - -The only Opus spend is the Planner. Everything downstream rides Sonnet. - ---- - -## Known trade-offs - -- **Checkpoint fatigue**: 4 user approval points (PRD, plan, implementation, reviews). For trivial features this is overhead. No `--yolo` mode yet. -- **No verify phase**: tests passing ≠ feature works in practice. A UI/CLI feature ships without manual exercise. The `verify` skill exists but is not wired in. -- **Re-review loop cap**: 1 additional cycle. If issues persist, the skill aborts rather than looping — bounded but means complex bugs may not auto-resolve. -- **Grill via `AskUserQuestion`**: structured options + "Other" free-text. Less fluid than open-ended chat, but enables fresh-context isolation of the interviewer agent. - ---- - -## File map - -``` -src/ -├── commands/feature/ -│ ├── SKILL.md ← orchestrator instructions (Claude reads) -│ └── references/ -│ └── architecture.md ← this file -├── skills/grill-me/ -│ └── SKILL.md ← invoked by Phase 0.5 -└── agents/ ← personas spawned by the skill - ├── spec-writer.md ← Phase 0.6 - ├── planner.md ← Phase 1 - ├── implementer.md ← Phase 2 - ├── spec-reviewer.md ← Phase 3b (parallel) - ├── code-reviewer.md ← Phase 3b (parallel) - └── fixer.md ← Phase 4 + Phase 3a-fix -``` - -Artifacts produced at runtime (gitignored, per-feature): - -``` -.claude/tmp/ -├── prd-.md ← product PRD -├── tech-prd-.md ← technical PRD -├── review-spec-.md ← spec review -└── review-code-.md ← code review -``` diff --git a/src/commands/rn-component/references/architecture.md b/src/commands/rn-component/references/architecture.md deleted file mode 100644 index 14a97d8..0000000 --- a/src/commands/rn-component/references/architecture.md +++ /dev/null @@ -1,59 +0,0 @@ -# Layered Hook Architecture - -This document defines the layering contract for React Native components scaffolded by `/rn-component`. - -## Layers - -### View (`index.tsx`) -- JSX only — no state, no logic, no side effects. -- Consumes exactly three hooks: `useStyles`, `useReanimatedStyles`, and `useViewModel`. -- Receives props typed as `IProps`. - -### ViewModel (`hooks/useViewModel/`) -- Single owner of all component logic. -- May use: `useState`, `useReducer`, `useMemo`, `useCallback`, `useEffect`, store subscriptions. -- Calls functions from `services/` and `library/` as needed. -- Returns `IUseViewModelReturn`. - -### Static Styles (`styles.ts`) -- Exports `useStyles(props: IProps)` — a hook that returns a `StyleSheet.create({})` result. -- Memoized with `useMemo`. -- No animated properties here. - -### Animation Styles (`hooks/useReanimatedStyles/`) -- All `react-native-reanimated` logic lives here. -- Receives `IUseReanimatedStylesProps` (never static styles). -- Never contains `StyleSheet.create` calls. - -### Services (`services/`) -- Plain async functions (API calls, AsyncStorage, etc.). -- No hooks allowed. -- Called from ViewModel only — never from the View. - -### Library (`library/`) -- Pure utility functions. -- No hooks, no side effects. -- May be called from ViewModel or from services. - -## Type conventions -- Interfaces use the `I` prefix: `IComponentNameProps`, `IUseComponentNameViewModelReturn`. -- Plain types (union, intersection, alias) have no prefix. -- Every folder that has public exports has a barrel `index.ts`. - -## Barrel cycle rule -Templates use deep relative imports only (e.g. `./types`, `../useReanimatedStyles/types`). -Never use `../..` shorthand — it creates import cycles between barrels. - -## JSX conditional rendering -Never wrap a JSX branch of a ternary in `()`. Use the line-break form: - -```tsx -{isRequired - ? - - : null -} -``` From d9af5fb86035c41647ae9c7752e276fa7b89384c Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 21:48:25 -0300 Subject: [PATCH 22/25] refactor(skills): emphasize conversation over deep exploration Update /feature and /rn-component to clarify that agents should talk to users, not spelunk codebases. Only do shallow checks for trivial facts. Co-Authored-By: Claude Haiku 4.5 --- src/commands/feature/SKILL.md | 5 +++-- src/commands/rn-component/SKILL.md | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/commands/feature/SKILL.md b/src/commands/feature/SKILL.md index 9644e8c..40cfaee 100644 --- a/src/commands/feature/SKILL.md +++ b/src/commands/feature/SKILL.md @@ -42,7 +42,8 @@ Start your response with: "🎤 Running as: " ## Instructions -- Explore the codebase first to ground your questions in reality. +- This is a conversation with the user — not a codebase audit. Form a complete product picture of the feature through dialogue. +- Do NOT dive deep into the codebase. Only do shallow lookups when a single quick check would avoid bothering the user with a triviality (e.g. test runner, presence of tsconfig). - Grill the user via AskUserQuestion until the decision tree is resolved. - Return ONLY the final structured summary defined by the grill-me skill (Decisions reached / Constraints / Out of scope / Deferred). ``` @@ -64,7 +65,7 @@ Read .claude/agents/aiworkers/spec-writer.md and inline its full content at the Start your response with: "📄 Running as: " -Produce a spec-driven PRD from the grill summary below. +Produce a spec-driven PRD from the grill summary below. You are a spec writer, not the implementer — you do not need to deeply understand the codebase. Do a quick structural glance (top-level dirs, key config files) only if it helps give concrete names to integration points. Do not read implementation files in depth. ## Raw feature request (tone/intent only) diff --git a/src/commands/rn-component/SKILL.md b/src/commands/rn-component/SKILL.md index 11a1c8d..be6a40e 100644 --- a/src/commands/rn-component/SKILL.md +++ b/src/commands/rn-component/SKILL.md @@ -33,7 +33,7 @@ If the result is `EXISTS`: stop and print `⚠️ already exists. Ab ## Architecture summary -Read `references/architecture.md` (path relative to this SKILL.md file), then print a 3-line summary to the user: +Print this 3-line summary to the user: - Layer overview (View / ViewModel / Styles / Animation / Services / Library) - Type convention (I prefix for interfaces, barrel index.ts in every export folder) - Barrel cycle rule (deep relative imports only, never ../..) From 837cbfd24d9b05c1ac5f1a8169a4872b3773bffb Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 21:48:28 -0300 Subject: [PATCH 23/25] refactor(grill-me): conversation first approach Clarify that grill-me interviews for product understanding, not code exploration. Only do shallow lookups for trivial facts. Form complete picture through dialogue. Co-Authored-By: Claude Haiku 4.5 --- src/skills/grill-me/SKILL.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/skills/grill-me/SKILL.md b/src/skills/grill-me/SKILL.md index 4c19078..0d7b8d5 100644 --- a/src/skills/grill-me/SKILL.md +++ b/src/skills/grill-me/SKILL.md @@ -9,13 +9,13 @@ user-invocable: false # Grill Me — Interview Until Shared Understanding -Interview the user relentlessly about every aspect of the topic until reaching shared understanding. Walk down each branch of the decision tree, resolving dependencies between decisions one-by-one. +Interview the user relentlessly about every aspect of the topic until reaching shared understanding. This is primarily a **conversation with the user** to form a complete picture of the feature — not a codebase analysis session. Walk down each branch of the decision tree, resolving dependencies between decisions one-by-one. ## Core rules -1. **One question at a time.** Never batch unrelated questions. The user answers one, you decide what to ask next. -2. **Always recommend an answer.** Every question must include your recommended option as the *first* option in `AskUserQuestion`, suffixed with `(Recommended)`. Provide 2–4 concrete options plus the implicit "Other" that the harness adds. -3. **Explore the codebase before asking.** If a question can be answered by reading code (file structure, existing patterns, naming conventions, dependencies, configuration), use `Read`/`Glob`/`Grep`/`Bash` to answer it yourself instead of bothering the user. +1. **Conversation first, code second.** Your job is to talk to the user and extract intent, scope, and constraints. Do not dive deep into the codebase — you are not the implementer and you don't need full code context. Only do shallow lookups when a single quick check (e.g. "is there a tsconfig?", "what's the test runner?") would save the user from answering something trivial. +2. **One question at a time.** Never batch unrelated questions. The user answers one, you decide what to ask next. +3. **Always recommend an answer.** Every question must include your recommended option as the *first* option in `AskUserQuestion`, suffixed with `(Recommended)`. Provide 2–4 concrete options plus the implicit "Other" that the harness adds. 4. **Resolve dependencies first.** If decision B depends on decision A, ask A first. Don't ask about UI framework before knowing whether this is even a UI feature. 5. **Stop when the tree is resolved.** Don't pad with low-value questions. When every branch with material impact is decided, stop. @@ -24,16 +24,18 @@ Interview the user relentlessly about every aspect of the topic until reaching s ### Step 1 — Map the decision tree Read the initial topic. Silently enumerate the major decisions that must be made (scope, target surface, data model, UX, error handling, edge cases, success criteria, out-of-scope). For each, decide: -- Can I answer it from the codebase? → explore now, record the answer. - Does it depend on another decision? → defer until parent is resolved. - Is it a real user choice? → queue it. +- Is it a trivial fact a single shallow lookup could answer? → do that lookup, don't ask. + +Do not enumerate the entire codebase up front. You're forming a product picture, not an implementation plan. ### Step 2 — Grill loop For each open decision, in dependency order: -1. **Try the codebase first.** If grep/read can resolve it (e.g. "what test runner is used?", "what's the styling system?", "is there already a similar component?"), do it. Don't ask the user something the repo already tells you. -2. **Formulate the question** with a clear recommended answer based on what you've learned from the codebase and prior answers. Use `AskUserQuestion` with: +1. **Skip the user only for trivia.** If a single quick grep/read can resolve a triviality (e.g. "what test runner is used?", "is TypeScript already configured?"), do it. Anything beyond that — ask the user. Do not go spelunking through the codebase to pre-answer design questions. +2. **Formulate the question** with a clear recommended answer based on prior answers (and any trivia you confirmed). Use `AskUserQuestion` with: - `question`: complete, specific, ends with `?` - `header`: 1–3 word chip label - `options[0].label`: your recommendation, ending with `(Recommended)` From ffae5446a57054a861da887bbb717d6acaed4d15 Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Sat, 23 May 2026 23:09:18 -0300 Subject: [PATCH 24/25] refactor(feature): consolidate GRILL+SPEC into unified phase Merge Phase 0.5 (GRILL) and Phase 0.6 (SPEC) into a single Agent 0 that both grills the user and writes the PRD in real time. Simplify grill-me skill to conversation-only (no code lookups). Reduces orchestrator complexity and improves user experience by combining requirement gathering with spec writing in one conversational flow. Co-Authored-By: Claude Haiku 4.5 --- src/commands/feature/SKILL.md | 230 ++++++++-------------------------- src/skills/grill-me/SKILL.md | 48 +++---- 2 files changed, 68 insertions(+), 210 deletions(-) diff --git a/src/commands/feature/SKILL.md b/src/commands/feature/SKILL.md index 40cfaee..0466faa 100644 --- a/src/commands/feature/SKILL.md +++ b/src/commands/feature/SKILL.md @@ -23,58 +23,29 @@ The orchestrator coordinates four specialized agents. Each agent starts with zer --- -## Phase 0.5 — GRILL (Agent 0 — model: sonnet) +## Phase 0.5 — GRILL + SPEC (Agent 0 — model: sonnet) -Notify the user: `🎤 Agent 0 (Interviewer — Sonnet) will grill you about the feature to lock down requirements before planning...` +Notify the user: `🎤 Agent 0 (Interviewer — Sonnet) will grill you about the feature while building the PRD in real time...` Spawn a fresh agent using the Agent tool with **model parameter set to "sonnet"**: ``` -Read .claude/skills/aiworkers/grill-me/SKILL.md and inline its full content at the start of this prompt. Follow that skill's process exactly. +Read .claude/skills/aiworkers/grill-me/SKILL.md and inline its full content at the start of this prompt. Follow that skill's process exactly — conduct the conversation with the user to lock down requirements. + +Read .claude/agents/aiworkers/spec-writer.md and inline its full content too — you will write the PRD as the conversation unfolds. Start your response with: "🎤 Running as: " -## Topic to grill the user on +## Topic -## Current branch - - ## Instructions -- This is a conversation with the user — not a codebase audit. Form a complete product picture of the feature through dialogue. -- Do NOT dive deep into the codebase. Only do shallow lookups when a single quick check would avoid bothering the user with a triviality (e.g. test runner, presence of tsconfig). -- Grill the user via AskUserQuestion until the decision tree is resolved. -- Return ONLY the final structured summary defined by the grill-me skill (Decisions reached / Constraints / Out of scope / Deferred). -``` - -Wait for the agent to return its summary. Pass that summary forward to Phase 0.6. - -**No user checkpoint here** — the grill itself is the user interaction. The checkpoint comes after the PRD is written. - ---- - -## Phase 0.6 — SPEC (Agent 0b — model: sonnet) - -Notify the user: `📄 Agent 0b (Spec Writer — Sonnet) is converting the grill into a clean PRD...` - -Spawn a fresh agent using the Agent tool with **model parameter set to "sonnet"**: - -``` -Read .claude/agents/aiworkers/spec-writer.md and inline its full content at the start of this prompt. - -Start your response with: "📄 Running as: " - -Produce a spec-driven PRD from the grill summary below. You are a spec writer, not the implementer — you do not need to deeply understand the codebase. Do a quick structural glance (top-level dirs, key config files) only if it helps give concrete names to integration points. Do not read implementation files in depth. - -## Raw feature request (tone/intent only) - - -## Grill summary (canonical source of truth) - - -## Output location -Write the PRD to: `.claude/tmp/prd-.md` +- Conduct the grill-me conversation with the user to resolve all open questions. +- As each decision is reached during the conversation, progressively fill in the PRD structure below. You don't need to show the PRD mid-conversation — just build it internally. +- Do NOT dive deep into the codebase. Only do shallow lookups when a single quick check avoids bothering the user with a triviality (e.g. test runner, presence of tsconfig). +- When all questions are resolved, write the final PRD to: `.claude/tmp/prd-.md` +- Then return the full PRD content so the orchestrator can display it to the user. ## Required PRD structure @@ -96,7 +67,7 @@ Trigger, flow, success state, failure state. ## Technical requirements - Surface (CLI, UI, API, etc.) - Data model changes -- Integration points (cite file paths from grill constraints) +- Integration points - Auth/permissions - Error handling - Performance constraints @@ -118,7 +89,7 @@ After writing the file, return ONLY: Display the PRD content to the user. -**Checkpoint:** ask the user to confirm the PRD captures the feature correctly. Iterate (re-spawn Phase 0.6 with user feedback appended) until approved. Only proceed to Phase 1 with explicit approval. +**Checkpoint:** ask the user to confirm the PRD captures the feature correctly. If not, re-spawn Phase 0.5 with the user's feedback appended and iterate until approved. Only proceed to Phase 1 with explicit approval. --- @@ -263,8 +234,6 @@ Spawn a fresh agent using the Agent tool with **model parameter set to "sonnet"* ``` Read .claude/agents/aiworkers/fixer.md and inline its full content at the start of this prompt. -Start your response with: "🔧 Running as: " - The following tests are failing after a feature was implemented. Fix them without changing the feature behavior. ## Failing tests output @@ -276,139 +245,55 @@ The following tests are failing after a feature was implemented. Fix them withou ## Recent commits (context) -Fix the failures, then follow /commit logic to commit each fix (fix: ...). +Fix the failures, then commit each fix (fix: ...). Co-author: Co-Authored-By: Claude Sonnet 4.6 Do not push. Return: list of fixes made and commits created. ``` -Re-run tests after fixes. If tests still fail, retry once more (maximum 2 retry attempts total). If tests still fail after 2 rounds, abort: report the remaining failures to the orchestrator and do not proceed further. +Re-run tests after fixes. If tests still fail, retry once more (maximum 2 attempts total). If they still fail, abort and report to the orchestrator. -### 3b — Dual Review (Agents 3a + 3b — model: sonnet, IN PARALLEL) +### 3b — Review Agent (Agent 3 — model: sonnet) -Collect once, share with both reviewers: +Collect: - Full diff: `git diff ...HEAD` - Commits: `git log ...HEAD --oneline` -Notify the user: `🔍 Spawning two reviewers in parallel — Agent 3a (Spec Reviewer) and Agent 3b (Code Reviewer)...` +Notify the user: `🔍 Agent 3 (Reviewer — Sonnet) is reviewing the implementation...` -**Spawn both agents in a single message (two parallel Agent tool calls).** Each is fresh-context, model sonnet. - -#### Agent 3a — Spec Reviewer +Spawn a fresh agent using **model: sonnet**: ``` -Read .claude/agents/aiworkers/spec-reviewer.md and inline its full content at the start of this prompt. +Read .claude/agents/aiworkers/reviewer.md and inline its full content at the start of this prompt. -Start your response with: "🔍 Running as: (Spec Reviewer)" +You have zero context about this feature — evaluate only what is provided. -Verify the implementation satisfies the product PRD. Ignore code style and architecture — only spec compliance. - -## Product PRD (the contract) +## Product PRD (the contract — what must be satisfied) Read the file at: `.claude/tmp/prd-.md` -## Git diff (the delivery) - - -## Commits - - -## Output location -Write your review to: `.claude/tmp/review-spec-.md` - -## Required review structure - -``` -# Spec Review: - -## Verdict -PASS | FAIL | PARTIAL - -## Acceptance criteria coverage -For every criterion in the product PRD: -- [✓ | ✗ | ~] **** — evidence: | gap: - -## Missing requirements -- - -## Deviations from spec -- — what spec says vs what code does - -## Scope creep (out of spec) -- - -## Required actions -Numbered, actionable items for the spec fixer. Each item must cite the PRD requirement and the file to change. -1. — PRD: — file: -2. ... - -If no issues: state "No spec gaps found." explicitly and leave Required actions empty. -``` - -Return ONLY the absolute path to the review file and its full content. -``` - -#### Agent 3b — Code Reviewer - -``` -Read .claude/agents/aiworkers/code-reviewer.md and inline its full content at the start of this prompt. - -Start your response with: "🔍 Running as: (Code Reviewer)" - -Evaluate the code itself — bugs, security, correctness, robustness. Do NOT evaluate whether the implementation matches the spec (another agent does that). +## Technical PRD (the blueprint — how it was planned) +Read the file at: `.claude/tmp/tech-prd-.md` -## Git diff (the change) +## Git diff (all changes) ## Commits -## Output location -Write your review to: `.claude/tmp/review-code-.md` - -## Required review structure - -``` -# Code Review: - -## Verdict -PASS | FAIL | NEEDS WORK +Review the implementation against both PRDs. Report on: +1. Spec gaps — acceptance criteria not satisfied +2. Bugs or logic errors +3. Edge cases not handled +4. Security issues (XSS, injection, data exposure, auth bypass) +5. Breaking changes to existing interfaces or APIs +6. Obvious performance problems -## Findings by category -### Logic & correctness -- [severity] **** — what is wrong — what should happen instead -(or "No issues found.") - -### Security -- ... - -### Error handling & edge cases -- ... - -### Concurrency & race conditions -- ... - -### Breaking changes -- ... - -### Performance -- ... - -### Resource management -- ... - -## Required actions -Numbered, actionable items for the code fixer. Each item must cite file:line and severity. -1. [critical|major|minor] — file: -2. ... - -If no issues: state "No code defects found." explicitly and leave Required actions empty. +Be specific: file path, approximate line, what is wrong, what should be done instead. +Return a numbered list. If there are no issues, say explicitly: "No issues found." ``` -Return ONLY the absolute path to the review file and its full content. -``` - -After both agents return, display both reviews to the user. +Display the review to the user. **Checkpoint:** wait for user approval before proceeding to ACT. @@ -416,53 +301,38 @@ After both agents return, display both reviews to the user. ## Phase 4 — ACT (Agent 4 — model: sonnet) -Skip this phase entirely if **both** review files have no "Required actions". Otherwise spawn one fixer that resolves everything in a single pass — this avoids two agents stepping on each other's commits and gives the fixer holistic context (a spec gap fix should not re-introduce a code defect just flagged). +Skip this phase entirely if the review has no issues. Otherwise spawn a fixer. -Notify the user: `🛠️ Agent 4 (Fixer — Sonnet) is resolving spec gaps and code defects in one pass...` +Notify the user: `🛠️ Agent 4 (Fixer — Sonnet) is resolving review issues...` Spawn a fresh agent using **model: sonnet**: ``` Read .claude/agents/aiworkers/fixer.md and inline its full content at the start of this prompt. -Start your response with: "🛠️ Running as: " - -Resolve every "Required action" from both reviews below in a single coherent pass. Plan all fixes together before touching code so a spec fix does not introduce a code defect already flagged in the code review. +Resolve every issue from the review below in a single coherent pass. -## Product PRD (the contract — what the code must satisfy) +## Product PRD (the contract) Read the file at: `.claude/tmp/prd-.md` -## Technical PRD (architecture to follow when adding missing functionality) +## Technical PRD (the blueprint) Read the file at: `.claude/tmp/tech-prd-.md` -## Spec review (required actions — spec compliance gaps) -Read the file at: `.claude/tmp/review-spec-.md` — focus on "Required actions". - -## Code review (required actions — bugs, security, edge cases) -Read the file at: `.claude/tmp/review-code-.md` — focus on "Required actions". +## Review issues + ## Branch -## Process - -1. Read all four documents above. Merge the action lists into a single ordered plan, grouping by file to minimize churn. -2. For each fix: implement, then follow /commit logic. Use `feat:` when satisfying a missing PRD criterion, `fix:` for defects. -3. Co-author derived from your actual model (use the "Running as" model name). -4. Do not push. +For each fix: implement, then commit (feat: for missing spec items, fix: for defects). +Co-author: Co-Authored-By: Claude Sonnet 4.6 +Do not push. -Return: -- Ordered list of fixes applied, each tagged [spec | code] with the source review item -- Commits created -- Confirmation that no flagged code defect was re-introduced by spec fixes +Return: list of fixes applied and commits created. ``` After the fixer returns, re-run tests. If tests fail, route through 3a-fix once. -#### Re-review loop (cap: 1 additional cycle) - -If either original review had a FAIL verdict, optionally re-spawn both reviewers in parallel once to confirm closure. Hard cap: one re-review cycle total. If issues remain after the second cycle, abort and report to the orchestrator. - --- ## Phase 5 — Finalize @@ -476,13 +346,11 @@ After ACT (or directly if no issues): ## Feature complete: ### Agents used -- Agent 0 (Interviewer): grilled the user to lock down requirements -- Agent 0b (Spec Writer): converted grill into product PRD at `.claude/tmp/prd-.md` +- Agent 0 (Interviewer + Spec Writer): grilled the user and produced product PRD at `.claude/tmp/prd-.md` - Agent 1 (Planner): produced technical PRD at `.claude/tmp/tech-prd-.md` - Agent 2 (Implementer): created branch, implemented, committed -- Agent 3a (Spec Reviewer): verified spec compliance → `.claude/tmp/review-spec-.md` -- Agent 3b (Code Reviewer): audited code quality → `.claude/tmp/review-code-.md` -- Agent 4 (Fixer): resolved spec gaps + code defects in a single pass (if any) +- Agent 3 (Reviewer): reviewed implementation against both PRDs +- Agent 4 (Fixer): resolved review issues (if any) ### All commits diff --git a/src/skills/grill-me/SKILL.md b/src/skills/grill-me/SKILL.md index 0d7b8d5..9e8ae04 100644 --- a/src/skills/grill-me/SKILL.md +++ b/src/skills/grill-me/SKILL.md @@ -2,51 +2,48 @@ name: grill-me description: This skill should be used when the user asks to "grill me", "stress-test this plan", "interview me about this design", or wants to be relentlessly questioned about a plan, feature, or design until shared understanding is reached. argument-hint: -allowed-tools: [AskUserQuestion, Read, Glob, Grep, Bash] +allowed-tools: [AskUserQuestion] model: sonnet user-invocable: false --- # Grill Me — Interview Until Shared Understanding -Interview the user relentlessly about every aspect of the topic until reaching shared understanding. This is primarily a **conversation with the user** to form a complete picture of the feature — not a codebase analysis session. Walk down each branch of the decision tree, resolving dependencies between decisions one-by-one. +Interview the user about the feature through pure conversation. No code, no files, no lookups — only dialogue. The goal is to form a complete product picture by talking to the user. ## Core rules -1. **Conversation first, code second.** Your job is to talk to the user and extract intent, scope, and constraints. Do not dive deep into the codebase — you are not the implementer and you don't need full code context. Only do shallow lookups when a single quick check (e.g. "is there a tsconfig?", "what's the test runner?") would save the user from answering something trivial. +1. **Conversation only.** Do not touch the codebase. Do not use any tool except `AskUserQuestion`. Everything you need comes from the user. 2. **One question at a time.** Never batch unrelated questions. The user answers one, you decide what to ask next. -3. **Always recommend an answer.** Every question must include your recommended option as the *first* option in `AskUserQuestion`, suffixed with `(Recommended)`. Provide 2–4 concrete options plus the implicit "Other" that the harness adds. -4. **Resolve dependencies first.** If decision B depends on decision A, ask A first. Don't ask about UI framework before knowing whether this is even a UI feature. -5. **Stop when the tree is resolved.** Don't pad with low-value questions. When every branch with material impact is decided, stop. +3. **Always recommend an answer.** Every question must include your recommended option as the *first* option in `AskUserQuestion`, suffixed with `(Recommended)`. Provide 2–4 concrete options. +4. **Resolve dependencies first.** If decision B depends on decision A, ask A first. +5. **Stop when the tree is resolved.** When every decision with material impact is settled, stop. ## Process ### Step 1 — Map the decision tree -Read the initial topic. Silently enumerate the major decisions that must be made (scope, target surface, data model, UX, error handling, edge cases, success criteria, out-of-scope). For each, decide: +Read the feature description. Silently enumerate the major decisions to resolve: scope, target surface, UX behavior, data model, error handling, edge cases, success criteria, out-of-scope. For each, decide: - Does it depend on another decision? → defer until parent is resolved. -- Is it a real user choice? → queue it. -- Is it a trivial fact a single shallow lookup could answer? → do that lookup, don't ask. - -Do not enumerate the entire codebase up front. You're forming a product picture, not an implementation plan. +- Did the user already imply the answer? → record it, don't ask. +- Does it have material impact on the implementation? → queue it. ### Step 2 — Grill loop For each open decision, in dependency order: -1. **Skip the user only for trivia.** If a single quick grep/read can resolve a triviality (e.g. "what test runner is used?", "is TypeScript already configured?"), do it. Anything beyond that — ask the user. Do not go spelunking through the codebase to pre-answer design questions. -2. **Formulate the question** with a clear recommended answer based on prior answers (and any trivia you confirmed). Use `AskUserQuestion` with: +1. Formulate the question using `AskUserQuestion` with: - `question`: complete, specific, ends with `?` - `header`: 1–3 word chip label - `options[0].label`: your recommendation, ending with `(Recommended)` - - `options[0].description`: explain *why* you recommend it (cite codebase findings or prior answers) + - `options[0].description`: explain *why* you recommend it based on prior answers - 1–3 more options covering meaningful alternatives -3. **Use the answer to refine the tree.** A new answer can collapse other branches (e.g. user picks "no UI" → skip all UI questions) or open new ones (e.g. "needs auth" → now ask auth strategy). -4. **Continue until no open branches with material impact remain.** +2. Use the answer to refine the tree. A new answer can collapse branches or open new ones. +3. Continue until no open decisions with material impact remain. ### Step 3 — Final summary -When the grill is complete, return a structured summary to the orchestrator: +When the grill is complete, return a structured summary: ``` ## Grill complete @@ -58,9 +55,6 @@ When the grill is complete, return a structured summary to the orchestrator: 1. ****: 2. ... -### Constraints discovered from codebase -- : - ### Out of scope (explicitly excluded) - @@ -68,33 +62,29 @@ When the grill is complete, return a structured summary to the orchestrator: - ``` -This summary is the canonical record. Downstream agents (e.g. a PRD writer) consume this, not the raw Q&A transcript. - ## What "material impact" means A decision has material impact if a different answer would produce a different implementation. Skip questions where: -- The answer is obvious from the codebase - Both options lead to identical code - The user already implied the answer in their original request -- It's a styling/naming nit the implementer can default sensibly +- It's a styling or naming nit the implementer can default sensibly ## Examples of good grill questions - "Should this run client-side or server-side?" (architecture-level, irreversible) -- "When the upload fails mid-stream, retry automatically or surface the error?" (UX behavior the code can't infer) +- "When the upload fails mid-stream, retry automatically or surface the error?" (UX behavior) - "Is this scoped to authenticated users only?" (changes auth wiring) ## Examples of bad grill questions (don't ask these) - "What should I name the function?" (defaultable) - "Should I add tests?" (always yes unless user said otherwise) -- "What color should the button be?" (read the design system file) -- "Do you want me to use TypeScript?" (read tsconfig.json) +- "What color should the button be?" (design system decision) ## Rules - Never make multiple `AskUserQuestion` calls in parallel — strictly sequential -- Never proceed to summary while branches with material impact remain open -- Never write files, run mutating commands, or modify code — this skill is read-only on the codebase and interactive with the user only +- Never proceed to summary while decisions with material impact remain open +- Never write files, run commands, or read code — this skill is purely conversational - If the user says "I don't know, you decide" — accept it, record your recommendation as the decision, move on - If the user says "stop, I've had enough" — accept it, summarize what was resolved so far, mark the rest as deferred From 5642b84693bb4d2adf63235d712efee45c93bf78 Mon Sep 17 00:00:00 2001 From: eumaninho54 Date: Mon, 25 May 2026 18:54:18 -0300 Subject: [PATCH 25/25] docs(feature): clarify handoff protocol and file outputs Emphasize that agents write outputs to files and return only summaries, rather than inlining full content in responses. Simplify agent instructions to reference persona files instead of inlining. Fix typo on technical PRD output path. Co-Authored-By: Claude Haiku 4.5 --- src/commands/feature/SKILL.md | 67 ++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/src/commands/feature/SKILL.md b/src/commands/feature/SKILL.md index 0466faa..3f53ad0 100644 --- a/src/commands/feature/SKILL.md +++ b/src/commands/feature/SKILL.md @@ -11,6 +11,8 @@ model: sonnet The orchestrator coordinates four specialized agents. Each agent starts with zero context from the conversation — only what the orchestrator explicitly passes to it. +Handoff protocol: agents write outputs to files and return only the file path + a 2–3 line summary. The orchestrator reads files to display content to the user — it never accumulates full content in its own context. + --- ## Phase 0 — Pre-flight @@ -30,9 +32,10 @@ Notify the user: `🎤 Agent 0 (Interviewer — Sonnet) will grill you about the Spawn a fresh agent using the Agent tool with **model parameter set to "sonnet"**: ``` -Read .claude/skills/aiworkers/grill-me/SKILL.md and inline its full content at the start of this prompt. Follow that skill's process exactly — conduct the conversation with the user to lock down requirements. +Read .claude/skills/aiworkers/grill-me/SKILL.md +Read .claude/agents/aiworkers/spec-writer.md -Read .claude/agents/aiworkers/spec-writer.md and inline its full content too — you will write the PRD as the conversation unfolds. +Follow the grill-me skill process exactly — conduct the conversation with the user to lock down requirements. Write the PRD as decisions are reached. Start your response with: "🎤 Running as: " @@ -42,10 +45,9 @@ Start your response with: "🎤 Running as: " ## Instructions - Conduct the grill-me conversation with the user to resolve all open questions. -- As each decision is reached during the conversation, progressively fill in the PRD structure below. You don't need to show the PRD mid-conversation — just build it internally. -- Do NOT dive deep into the codebase. Only do shallow lookups when a single quick check avoids bothering the user with a triviality (e.g. test runner, presence of tsconfig). +- Build the PRD internally as decisions are reached — do not show it mid-conversation. +- Do NOT dive deep into the codebase. Only do shallow lookups when a single quick check avoids bothering the user with a triviality. - When all questions are resolved, write the final PRD to: `.claude/tmp/prd-.md` -- Then return the full PRD content so the orchestrator can display it to the user. ## Required PRD structure @@ -84,10 +86,10 @@ Trigger, flow, success state, failure state. After writing the file, return ONLY: - Absolute path to the PRD file -- The full PRD content (for the orchestrator to display) +- 2–3 line summary of what was decided (not the full PRD) ``` -Display the PRD content to the user. +Read `.claude/tmp/prd-.md` and display it to the user. **Checkpoint:** ask the user to confirm the PRD captures the feature correctly. If not, re-spawn Phase 0.5 with the user's feedback appended and iterate until approved. Only proceed to Phase 1 with explicit approval. @@ -100,7 +102,7 @@ Notify the user: `🧠 Agent 1 (Planner — Opus) is analyzing the codebase and Spawn a fresh agent using the Agent tool with **model parameter set to "opus"**: ``` -Read .claude/agents/aiworkers/planner.md and inline its full content at the start of this prompt. +Read .claude/agents/aiworkers/planner.md Start your response with: "🧠 Running as: " @@ -112,7 +114,7 @@ Read the file at: `.claude/tmp/prd-.md` Do not re-litigate the PRD. If it has gaps under "Open questions" that block planning, stop and report them — do not invent answers. ## Output location -Write the technical PRD to: `.claude/tmp/tech-prd-.md`a +Write the technical PRD to: `.claude/tmp/tech-prd-.md` ## Current branch @@ -160,10 +162,10 @@ For every acceptance criterion in the product PRD, name the implementation step( After writing the file, return ONLY: - Absolute path to the technical PRD file -- The full technical PRD content (for the orchestrator to display) +- 2–3 line summary of the approach (not the full technical PRD) ``` -Display the plan to the user. Iterate with the user until they explicitly approve it. +Read `.claude/tmp/tech-prd-.md` and display it to the user. Iterate until they explicitly approve. **Checkpoint:** wait for explicit user approval before proceeding to DO. @@ -176,7 +178,7 @@ Notify the user: `⚙️ Agent 2 (Implementer — Sonnet) is creating the branch Spawn a fresh agent using the Agent tool with **model parameter set to "sonnet"**: ``` -Read .claude/agents/aiworkers/implementer.md and inline its full content at the start of this prompt. +Read .claude/agents/aiworkers/implementer.md Start your response with: "⚙️ Running as: " @@ -203,7 +205,7 @@ Read `src/rules/conventional-commits.md` for commit types, format, and rules. Do not push. Do not open a PR. -When done, return: +Return: - Branch name created - List of all commits made (type + message) - Whether tests were written or updated @@ -232,7 +234,7 @@ Notify the user: `🔧 Tests failed. Spawning fix agent (Sonnet) to resolve fail Spawn a fresh agent using the Agent tool with **model parameter set to "sonnet"**: ``` -Read .claude/agents/aiworkers/fixer.md and inline its full content at the start of this prompt. +Read .claude/agents/aiworkers/fixer.md The following tests are failing after a feature was implemented. Fix them without changing the feature behavior. @@ -243,7 +245,7 @@ The following tests are failing after a feature was implemented. Fix them withou ## Recent commits (context) - +Run `git log --oneline -10` to see recent commits. Fix the failures, then commit each fix (fix: ...). Co-author: Co-Authored-By: Claude Sonnet 4.6 @@ -256,18 +258,14 @@ Re-run tests after fixes. If tests still fail, retry once more (maximum 2 attemp ### 3b — Review Agent (Agent 3 — model: sonnet) -Collect: -- Full diff: `git diff ...HEAD` -- Commits: `git log ...HEAD --oneline` - Notify the user: `🔍 Agent 3 (Reviewer — Sonnet) is reviewing the implementation...` Spawn a fresh agent using **model: sonnet**: ``` -Read .claude/agents/aiworkers/reviewer.md and inline its full content at the start of this prompt. +Read .claude/agents/aiworkers/reviewer.md -You have zero context about this feature — evaluate only what is provided. +You have zero context about this feature — evaluate only what you gather yourself. ## Product PRD (the contract — what must be satisfied) Read the file at: `.claude/tmp/prd-.md` @@ -275,11 +273,10 @@ Read the file at: `.claude/tmp/prd-.md` ## Technical PRD (the blueprint — how it was planned) Read the file at: `.claude/tmp/tech-prd-.md` -## Git diff (all changes) - - -## Commits - +## Diff and commits +Run these commands yourself: +- `git diff ...` for all changes +- `git log ... --oneline` for commit history Review the implementation against both PRDs. Report on: 1. Spec gaps — acceptance criteria not satisfied @@ -290,10 +287,15 @@ Review the implementation against both PRDs. Report on: 6. Obvious performance problems Be specific: file path, approximate line, what is wrong, what should be done instead. -Return a numbered list. If there are no issues, say explicitly: "No issues found." + +Write the full review to: `.claude/tmp/review-.md` + +Return ONLY: +- Absolute path to the review file +- Whether issues were found (yes/no) and a 1-line count summary ``` -Display the review to the user. +Read `.claude/tmp/review-.md` and display it to the user. **Checkpoint:** wait for user approval before proceeding to ACT. @@ -308,9 +310,9 @@ Notify the user: `🛠️ Agent 4 (Fixer — Sonnet) is resolving review issues. Spawn a fresh agent using **model: sonnet**: ``` -Read .claude/agents/aiworkers/fixer.md and inline its full content at the start of this prompt. +Read .claude/agents/aiworkers/fixer.md -Resolve every issue from the review below in a single coherent pass. +Resolve every issue from the review in a single coherent pass. ## Product PRD (the contract) Read the file at: `.claude/tmp/prd-.md` @@ -319,7 +321,7 @@ Read the file at: `.claude/tmp/prd-.md` Read the file at: `.claude/tmp/tech-prd-.md` ## Review issues - +Read the file at: `.claude/tmp/review-.md` ## Branch @@ -349,7 +351,7 @@ After ACT (or directly if no issues): - Agent 0 (Interviewer + Spec Writer): grilled the user and produced product PRD at `.claude/tmp/prd-.md` - Agent 1 (Planner): produced technical PRD at `.claude/tmp/tech-prd-.md` - Agent 2 (Implementer): created branch, implemented, committed -- Agent 3 (Reviewer): reviewed implementation against both PRDs +- Agent 3 (Reviewer): review at `.claude/tmp/review-.md` - Agent 4 (Fixer): resolved review issues (if any) ### All commits @@ -368,6 +370,7 @@ After ACT (or directly if no issues): - Never push — that is the user's responsibility - Each agent receives only what it needs — no leaking full conversation context +- Agents write outputs to files; orchestrator reads files to display — never accumulates full content inline - User approves at: end of PLAN, end of DO, end of CHECK - All commits follow Conventional Commits and include the co-author line - The skills `grill-me`, `branch`, `commit`, and `pr` are expected to exist in `.claude/skills/aiworkers/`. Before starting Phase 0.5, verify that `grill-me` is present; before Phase 2, verify `branch`, `commit`, `pr`. If any is missing, warn the user and abort rather than silently failing.