diff --git a/.claude/commands/workflow/review-fix.md b/.claude/commands/workflow/review-fix.md index cf4cd4fe..f4d2edb2 100644 --- a/.claude/commands/workflow/review-fix.md +++ b/.claude/commands/workflow/review-fix.md @@ -46,8 +46,7 @@ Automated fix orchestrator with **two-phase architecture**: AI-powered planning 1. **Intelligent Planning**: AI-powered analysis identifies optimal grouping and execution strategy 2. **Multi-stage Coordination**: Supports complex parallel + serial execution with dependency management 3. **Conservative Safety**: Mandatory test verification with automatic rollback on failure -4. **Real-time Visibility**: Dashboard shows planning progress, stage timeline, and active agents -5. **Resume Support**: Checkpoint-based recovery for interrupted sessions +4. **Resume Support**: Checkpoint-based recovery for interrupted sessions ### Orchestrator Boundary (CRITICAL) - **ONLY command** for automated review finding fixes @@ -59,14 +58,14 @@ Automated fix orchestrator with **two-phase architecture**: AI-powered planning ``` Phase 1: Discovery & Initialization - └─ Validate export file, create fix session structure, initialize state files → Generate fix-dashboard.html + └─ Validate export file, create fix session structure, initialize state files Phase 2: Planning Coordination (@cli-planning-agent) ├─ Analyze findings for patterns and dependencies ├─ Group by file + dimension + root cause similarity ├─ Determine execution strategy (parallel/serial/hybrid) ├─ Generate fix timeline with stages - └─ Output: fix-plan.json (dashboard auto-polls for status) + └─ Output: fix-plan.json Phase 3: Execution Orchestration (Stage-based) For each timeline stage: @@ -198,12 +197,10 @@ if (result.passRate < 100%) { - Session creation: Generate fix-session-id (`fix-{timestamp}`) - Directory structure: Create `{review-dir}/fixes/{fix-session-id}/` with subdirectories - State files: Initialize active-fix-session.json (session marker) -- Dashboard generation: Create fix-dashboard.html from template (see Dashboard Generation below) - TodoWrite initialization: Set up 4-phase tracking **Phase 2: Planning Coordination** - Launch @cli-planning-agent with findings data and project context -- Monitor planning progress (dashboard shows "Planning fixes..." indicator) - Validate fix-plan.json output (schema conformance, includes metadata with session status) - Load plan into memory for execution phase - TodoWrite update: Mark planning complete, start execution @@ -216,7 +213,6 @@ if (result.passRate < 100%) { - Assign agent IDs (agents update their fix-progress-{N}.json) - Handle agent failures gracefully (mark group as failed, continue) - Advance to next stage only when current stage complete -- Dashboard polls and aggregates fix-progress-{N}.json files for display **Phase 4: Completion & Aggregation** - Collect final status from all fix-progress-{N}.json files @@ -224,7 +220,7 @@ if (result.passRate < 100%) { - Update fix-history.json with new session entry - Remove active-fix-session.json - TodoWrite completion: Mark all phases done -- Output summary to user with dashboard link +- Output summary to user **Phase 5: Session Completion (Optional)** - If all findings fixed successfully (no failures): @@ -234,53 +230,12 @@ if (result.passRate < 100%) { - Output: "Some findings failed. Review fix-summary.md before completing session." - Do NOT auto-complete session -### Dashboard Generation - -**MANDATORY**: Dashboard MUST be generated from template during Phase 1 initialization - -**Template Location**: `~/.claude/templates/fix-dashboard.html` - -**⚠️ POST-GENERATION**: Orchestrator and agents MUST NOT read/write/modify fix-dashboard.html after creation - -**Generation Steps**: - -```bash -# 1. Copy template to fix session directory -cp ~/.claude/templates/fix-dashboard.html ${sessionDir}/fixes/${fixSessionId}/fix-dashboard.html - -# 2. Replace SESSION_ID placeholder -sed -i "s|{{SESSION_ID}}|${sessionId}|g" ${sessionDir}/fixes/${fixSessionId}/fix-dashboard.html - -# 3. Replace REVIEW_DIR placeholder -sed -i "s|{{REVIEW_DIR}}|${reviewDir}|g" ${sessionDir}/fixes/${fixSessionId}/fix-dashboard.html - -# 4. Start local server and output dashboard URL -cd ${sessionDir}/fixes/${fixSessionId} && python -m http.server 8766 --bind 127.0.0.1 & -echo "🔧 Fix Dashboard: http://127.0.0.1:8766/fix-dashboard.html" -echo " (Press Ctrl+C to stop server when done)" -``` - -**Dashboard Features**: -- Real-time progress tracking via JSON polling (3-second interval) -- Stage timeline visualization with parallel/serial execution modes -- Active groups and agents monitoring -- Flow control steps tracking for each agent -- Fix history drawer with session summaries -- Consumes new JSON structure (fix-plan.json with metadata + fix-progress-{N}.json) - -**JSON Consumption**: -- `fix-plan.json`: Reads metadata field for session info, timeline stages, groups configuration -- `fix-progress-{N}.json`: Polls all progress files to aggregate real-time status -- `active-fix-session.json`: Detects active session on load -- `fix-history.json`: Loads historical fix sessions - ### Output File Structure ``` .workflow/active/WFS-{session-id}/.review/ ├── fix-export-{timestamp}.json # Exported findings (input) └── fixes/{fix-session-id}/ - ├── fix-dashboard.html # Interactive dashboard (generated once, auto-polls JSON) ├── fix-plan.json # Planning agent output (execution plan with metadata) ├── fix-progress-1.json # Group 1 progress (planning agent init → agent updates) ├── fix-progress-2.json # Group 2 progress (planning agent init → agent updates) @@ -291,10 +246,8 @@ echo " (Press Ctrl+C to stop server when done)" ``` **File Producers**: -- **Orchestrator**: `fix-dashboard.html` (generated once from template during Phase 1) - **Planning Agent**: `fix-plan.json` (with metadata), all `fix-progress-*.json` (initial state) - **Execution Agents**: Update assigned `fix-progress-{N}.json` in real-time -- **Dashboard (Browser)**: Reads `fix-plan.json` + all `fix-progress-*.json`, aggregates in-memory every 3 seconds via JavaScript polling ### Agent Invocation Template @@ -347,7 +300,7 @@ For each group (G1, G2, G3, ...), generate fix-progress-{N}.json following templ - Flow control: Empty implementation_approach array - Errors: Empty array -**CRITICAL**: Ensure complete template structure for Dashboard consumption - all fields must be present. +**CRITICAL**: Ensure complete template structure - all fields must be present. ## Analysis Requirements @@ -419,7 +372,7 @@ Task({ description: `Fix ${group.findings.length} issues: ${group.group_name}`, prompt: ` ## Task Objective -Execute fixes for code review findings in group ${group.group_id}. Update progress file in real-time with flow control tracking for dashboard visibility. +Execute fixes for code review findings in group ${group.group_id}. Update progress file in real-time with flow control tracking. ## Assignment - Group ID: ${group.group_id} @@ -549,7 +502,6 @@ When all findings processed: ### Progress File Updates - **MUST update after every significant action** (before/after each step) -- **Dashboard polls every 3 seconds** - ensure writes are atomic - **Always maintain complete structure** - never write partial updates - **Use ISO 8601 timestamps** - e.g., "2025-01-25T14:36:00Z" @@ -638,9 +590,17 @@ TodoWrite({ 1. **Trust AI Planning**: Planning agent's grouping and execution strategy are based on dependency analysis 2. **Conservative Approach**: Test verification is mandatory - no fixes kept without passing tests 3. **Parallel Efficiency**: Default 3 concurrent agents balances speed and resource usage -4. **Monitor Dashboard**: Real-time stage timeline and agent status provide execution visibility -5. **Resume Support**: Fix sessions can resume from checkpoints after interruption -6. **Manual Review**: Always review failed fixes manually - may require architectural changes -7. **Incremental Fixing**: Start with small batches (5-10 findings) before large-scale fixes +4. **Resume Support**: Fix sessions can resume from checkpoints after interruption +5. **Manual Review**: Always review failed fixes manually - may require architectural changes +6. **Incremental Fixing**: Start with small batches (5-10 findings) before large-scale fixes + +## Related Commands + +### View Fix Progress +Use `ccw view` to open the workflow dashboard in browser: + +```bash +ccw view +``` diff --git a/.claude/commands/workflow/review-module-cycle.md b/.claude/commands/workflow/review-module-cycle.md index faf91ab2..66b7ac55 100644 --- a/.claude/commands/workflow/review-module-cycle.md +++ b/.claude/commands/workflow/review-module-cycle.md @@ -51,14 +51,12 @@ Independent multi-dimensional code review orchestrator with **hybrid parallel-it 2. **Session-Integrated**: Review results tracked within workflow session for unified management 3. **Comprehensive Coverage**: Same 7 specialized dimensions as session review 4. **Intelligent Prioritization**: Automatic identification of critical issues and cross-cutting concerns -5. **Real-time Visibility**: JSON-based progress tracking with interactive HTML dashboard -6. **Unified Archive**: Review results archived with session for historical reference +5. **Unified Archive**: Review results archived with session for historical reference ### Orchestrator Boundary (CRITICAL) - **ONLY command** for independent multi-dimensional module review - Manages: dimension coordination, aggregation, iteration control, progress tracking - Delegates: Code exploration and analysis to @cli-explore-agent, dimension-specific reviews via Deep Scan mode -- **⚠️ DASHBOARD CONSTRAINT**: Dashboard is generated ONCE during Phase 1 initialization. After initialization, orchestrator and agents MUST NOT read, write, or modify dashboard.html - it remains static for user interaction only. ## How It Works @@ -66,7 +64,7 @@ Independent multi-dimensional code review orchestrator with **hybrid parallel-it ``` Phase 1: Discovery & Initialization - └─ Resolve file patterns, validate paths, initialize state, create output structure → Generate dashboard.html + └─ Resolve file patterns, validate paths, initialize state, create output structure Phase 2: Parallel Reviews (for each dimension) ├─ Launch 7 review agents simultaneously @@ -90,7 +88,7 @@ Phase 4: Iterative Deep-Dive (optional) └─ Loop until no critical findings OR max iterations Phase 5: Completion - └─ Finalize review-progress.json → Output dashboard path + └─ Finalize review-progress.json ``` ### Agent Roles @@ -219,37 +217,9 @@ done **Step 4: Initialize Review State** - State initialization: Create `review-state.json` with metadata, dimensions, max_iterations, resolved_files (merged metadata + state) -- Progress tracking: Create `review-progress.json` for dashboard polling +- Progress tracking: Create `review-progress.json` for progress tracking -**Step 5: Dashboard Generation** - -**Constraints**: -- **MANDATORY**: Dashboard MUST be generated from template: `~/.claude/templates/review-cycle-dashboard.html` -- **PROHIBITED**: Direct creation or custom generation without template -- **POST-GENERATION**: Orchestrator and agents MUST NOT read/write/modify dashboard.html after creation - -**Generation Commands** (3 independent steps): -```bash -# Step 1: Copy template to output location -cp ~/.claude/templates/review-cycle-dashboard.html ${sessionDir}/.review/dashboard.html - -# Step 2: Replace SESSION_ID placeholder -sed -i "s|{{SESSION_ID}}|${sessionId}|g" ${sessionDir}/.review/dashboard.html - -# Step 3: Replace REVIEW_TYPE placeholder -sed -i "s|{{REVIEW_TYPE}}|module|g" ${sessionDir}/.review/dashboard.html - -# Step 4: Replace REVIEW_DIR placeholder -sed -i "s|{{REVIEW_DIR}}|${reviewDir}|g" ${sessionDir}/.review/dashboard.html - -# Output: Start local server and output dashboard URL -# Use Python HTTP server (available on most systems) -cd ${sessionDir}/.review && python -m http.server 8765 --bind 127.0.0.1 & -echo "📊 Dashboard: http://127.0.0.1:8765/dashboard.html" -echo " (Press Ctrl+C to stop server when done)" -``` - -**Step 6: TodoWrite Initialization** +**Step 5: TodoWrite Initialization** - Set up progress tracking with hierarchical structure - Mark Phase 1 completed, Phase 2 in_progress @@ -280,7 +250,6 @@ echo " (Press Ctrl+C to stop server when done)" - Finalize review-progress.json with completion statistics - Update review-state.json with completion_time and phase=complete - TodoWrite completion: Mark all tasks done -- Output: Dashboard path to user @@ -301,12 +270,11 @@ echo " (Press Ctrl+C to stop server when done)" ├── iterations/ # Deep-dive results │ ├── iteration-1-finding-{uuid}.json │ └── iteration-2-finding-{uuid}.json -├── reports/ # Human-readable reports -│ ├── security-analysis.md -│ ├── security-cli-output.txt -│ ├── deep-dive-1-{uuid}.md -│ └── ... -└── dashboard.html # Interactive dashboard (primary output) +└── reports/ # Human-readable reports + ├── security-analysis.md + ├── security-cli-output.txt + ├── deep-dive-1-{uuid}.md + └── ... ``` **Session Context**: @@ -772,23 +740,25 @@ TodoWrite({ 3. **Use Glob Wisely**: `src/auth/**` is more efficient than `src/**` with lots of irrelevant files 4. **Trust Aggregation Logic**: Auto-selection based on proven heuristics 5. **Monitor Logs**: Check reports/ directory for CLI analysis insights -6. **Dashboard Polling**: Refresh every 5 seconds for real-time updates -7. **Export Results**: Use dashboard export for external tracking tools ## Related Commands +### View Review Progress +Use `ccw view` to open the review dashboard in browser: + +```bash +ccw view +``` + ### Automated Fix Workflow -After completing a module review, use the dashboard to select findings and export them for automated fixing: +After completing a module review, use the generated findings JSON for automated fixing: ```bash # Step 1: Complete review (this command) /workflow:review-module-cycle src/auth/** -# Step 2: Open dashboard, select findings, and export -# Dashboard generates: fix-export-{timestamp}.json - -# Step 3: Run automated fixes -/workflow:review-fix .workflow/active/WFS-{session-id}/.review/fix-export-{timestamp}.json +# Step 2: Run automated fixes using dimension findings +/workflow:review-fix .workflow/active/WFS-{session-id}/.review/ ``` See `/workflow:review-fix` for automated fixing with smart grouping, parallel execution, and test verification. diff --git a/.claude/commands/workflow/review-session-cycle.md b/.claude/commands/workflow/review-session-cycle.md index eb7be844..b18292b9 100644 --- a/.claude/commands/workflow/review-session-cycle.md +++ b/.claude/commands/workflow/review-session-cycle.md @@ -45,13 +45,11 @@ Session-based multi-dimensional code review orchestrator with **hybrid parallel- 1. **Comprehensive Coverage**: 7 specialized dimensions analyze all quality aspects simultaneously 2. **Intelligent Prioritization**: Automatic identification of critical issues and cross-cutting concerns 3. **Actionable Insights**: Deep-dive iterations provide step-by-step remediation plans -4. **Real-time Visibility**: JSON-based progress tracking with interactive HTML dashboard ### Orchestrator Boundary (CRITICAL) - **ONLY command** for comprehensive multi-dimensional review - Manages: dimension coordination, aggregation, iteration control, progress tracking - Delegates: Code exploration and analysis to @cli-explore-agent, dimension-specific reviews via Deep Scan mode -- **⚠️ DASHBOARD CONSTRAINT**: Dashboard is generated ONCE during Phase 1 initialization. After initialization, orchestrator and agents MUST NOT read, write, or modify dashboard.html - it remains static for user interaction only. ## How It Works @@ -59,7 +57,7 @@ Session-based multi-dimensional code review orchestrator with **hybrid parallel- ``` Phase 1: Discovery & Initialization - └─ Validate session, initialize state, create output structure → Generate dashboard.html + └─ Validate session, initialize state, create output structure Phase 2: Parallel Reviews (for each dimension) ├─ Launch 7 review agents simultaneously @@ -83,7 +81,7 @@ Phase 4: Iterative Deep-Dive (optional) └─ Loop until no critical findings OR max iterations Phase 5: Completion - └─ Finalize review-progress.json → Output dashboard path + └─ Finalize review-progress.json ``` ### Agent Roles @@ -199,36 +197,9 @@ git log --since="${sessionCreatedAt}" --name-only --pretty=format: | sort -u **Step 5: Initialize Review State** - State initialization: Create `review-state.json` with metadata, dimensions, max_iterations (merged metadata + state) -- Progress tracking: Create `review-progress.json` for dashboard polling +- Progress tracking: Create `review-progress.json` for progress tracking -**Step 6: Dashboard Generation** - -**Constraints**: -- **MANDATORY**: Dashboard MUST be generated from template: `~/.claude/templates/review-cycle-dashboard.html` -- **PROHIBITED**: Direct creation or custom generation without template -- **POST-GENERATION**: Orchestrator and agents MUST NOT read/write/modify dashboard.html after creation - -**Generation Commands** (3 independent steps): -```bash -# Step 1: Copy template to output location -cp ~/.claude/templates/review-cycle-dashboard.html ${sessionDir}/.review/dashboard.html - -# Step 2: Replace SESSION_ID placeholder -sed -i "s|{{SESSION_ID}}|${sessionId}|g" ${sessionDir}/.review/dashboard.html - -# Step 3: Replace REVIEW_TYPE placeholder -sed -i "s|{{REVIEW_TYPE}}|session|g" ${sessionDir}/.review/dashboard.html - -# Step 4: Replace REVIEW_DIR placeholder -sed -i "s|{{REVIEW_DIR}}|${reviewDir}|g" ${sessionDir}/.review/dashboard.html - -# Output: Start local server and output dashboard URL -cd ${sessionDir}/.review && python -m http.server 8765 --bind 127.0.0.1 & -echo "📊 Dashboard: http://127.0.0.1:8765/dashboard.html" -echo " (Press Ctrl+C to stop server when done)" -``` - -**Step 7: TodoWrite Initialization** +**Step 6: TodoWrite Initialization** - Set up progress tracking with hierarchical structure - Mark Phase 1 completed, Phase 2 in_progress @@ -259,7 +230,6 @@ echo " (Press Ctrl+C to stop server when done)" - Finalize review-progress.json with completion statistics - Update review-state.json with completion_time and phase=complete - TodoWrite completion: Mark all tasks done -- Output: Dashboard path to user @@ -280,12 +250,11 @@ echo " (Press Ctrl+C to stop server when done)" ├── iterations/ # Deep-dive results │ ├── iteration-1-finding-{uuid}.json │ └── iteration-2-finding-{uuid}.json -├── reports/ # Human-readable reports -│ ├── security-analysis.md -│ ├── security-cli-output.txt -│ ├── deep-dive-1-{uuid}.md -│ └── ... -└── dashboard.html # Interactive dashboard (primary output) +└── reports/ # Human-readable reports + ├── security-analysis.md + ├── security-cli-output.txt + ├── deep-dive-1-{uuid}.md + └── ... ``` **Session Context**: @@ -782,23 +751,25 @@ TodoWrite({ 2. **Parallel Execution**: ~60 minutes for full initial review (7 dimensions) 3. **Trust Aggregation Logic**: Auto-selection based on proven heuristics 4. **Monitor Logs**: Check reports/ directory for CLI analysis insights -5. **Dashboard Polling**: Refresh every 5 seconds for real-time updates -6. **Export Results**: Use dashboard export for external tracking tools ## Related Commands +### View Review Progress +Use `ccw view` to open the review dashboard in browser: + +```bash +ccw view +``` + ### Automated Fix Workflow -After completing a review, use the dashboard to select findings and export them for automated fixing: +After completing a review, use the generated findings JSON for automated fixing: ```bash # Step 1: Complete review (this command) /workflow:review-session-cycle -# Step 2: Open dashboard, select findings, and export -# Dashboard generates: fix-export-{timestamp}.json - -# Step 3: Run automated fixes -/workflow:review-fix .workflow/active/WFS-{session-id}/.review/fix-export-{timestamp}.json +# Step 2: Run automated fixes using dimension findings +/workflow:review-fix .workflow/active/WFS-{session-id}/.review/ ``` See `/workflow:review-fix` for automated fixing with smart grouping, parallel execution, and test verification. diff --git a/.claude/commands/workflow/status.md b/.claude/commands/workflow/status.md deleted file mode 100644 index c5adec27..00000000 --- a/.claude/commands/workflow/status.md +++ /dev/null @@ -1,352 +0,0 @@ ---- -name: workflow:status -description: Generate on-demand views for project overview and workflow tasks with optional task-id filtering for detailed view -argument-hint: "[optional: --project|task-id|--validate|--dashboard]" ---- - -# Workflow Status Command (/workflow:status) - -## Overview -Generates on-demand views from project and session data. Supports multiple modes: -1. **Project Overview** (`--project`): Shows completed features and project statistics -2. **Workflow Tasks** (default): Shows current session task progress -3. **HTML Dashboard** (`--dashboard`): Generates interactive HTML task board with active and archived sessions - -No synchronization needed - all views are calculated from current JSON state. - -## Usage -```bash -/workflow:status # Show current workflow session overview -/workflow:status --project # Show project-level feature registry -/workflow:status impl-1 # Show specific task details -/workflow:status --validate # Validate workflow integrity -/workflow:status --dashboard # Generate HTML dashboard board -``` - -## Execution Process - -``` -Input Parsing: - └─ Decision (mode detection): - ├─ --project flag → Project Overview Mode - ├─ --dashboard flag → Dashboard Mode - ├─ task-id argument → Task Details Mode - └─ No flags → Workflow Session Mode (default) - -Project Overview Mode: - ├─ Check project.json exists - ├─ Read project data - ├─ Parse and display overview + features - └─ Show recent archived sessions - -Workflow Session Mode (default): - ├─ Find active session - ├─ Load session data - ├─ Scan task files - └─ Display task progress - -Dashboard Mode: - ├─ Collect active sessions - ├─ Collect archived sessions - ├─ Generate HTML from template - └─ Write dashboard.html -``` - -## Implementation Flow - -### Mode Selection - -**Check for --project flag**: -- If `--project` flag present → Execute **Project Overview Mode** -- Otherwise → Execute **Workflow Session Mode** (default) - -## Project Overview Mode - -### Step 1: Check Project State -```bash -bash(test -f .workflow/project.json && echo "EXISTS" || echo "NOT_FOUND") -``` - -**If NOT_FOUND**: -``` -No project state found. -Run /workflow:session:start to initialize project. -``` - -### Step 2: Read Project Data -```bash -bash(cat .workflow/project.json) -``` - -### Step 3: Parse and Display - -**Data Processing**: -```javascript -const projectData = JSON.parse(Read('.workflow/project.json')); -const features = projectData.features || []; -const stats = projectData.statistics || {}; -const overview = projectData.overview || null; - -// Sort features by implementation date (newest first) -const sortedFeatures = features.sort((a, b) => - new Date(b.implemented_at) - new Date(a.implemented_at) -); -``` - -**Output Format** (with extended overview): -``` -## Project: ${projectData.project_name} -Initialized: ${projectData.initialized_at} - -${overview ? ` -### Overview -${overview.description} - -**Technology Stack**: -${overview.technology_stack.languages.map(l => `- ${l.name}${l.primary ? ' (primary)' : ''}: ${l.file_count} files`).join('\n')} -Frameworks: ${overview.technology_stack.frameworks.join(', ')} - -**Architecture**: -Style: ${overview.architecture.style} -Patterns: ${overview.architecture.patterns.join(', ')} - -**Key Components** (${overview.key_components.length}): -${overview.key_components.map(c => `- ${c.name} (${c.path})\n ${c.description}`).join('\n')} - ---- -` : ''} - -### Completed Features (${stats.total_features}) - -${sortedFeatures.map(f => ` -- ${f.title} (${f.timeline?.implemented_at || f.implemented_at}) - ${f.description} - Tags: ${f.tags?.join(', ') || 'none'} - Session: ${f.traceability?.session_id || f.session_id} - Archive: ${f.traceability?.archive_path || 'unknown'} - ${f.traceability?.commit_hash ? `Commit: ${f.traceability.commit_hash}` : ''} -`).join('\n')} - -### Project Statistics -- Total Features: ${stats.total_features} -- Total Sessions: ${stats.total_sessions} -- Last Updated: ${stats.last_updated} - -### Quick Access -- View session details: /workflow:status -- Archive query: jq '.archives[] | select(.session_id == "SESSION_ID")' .workflow/archives/manifest.json -- Documentation: .workflow/docs/${projectData.project_name}/ - -### Query Commands -# Find by tag -cat .workflow/project.json | jq '.features[] | select(.tags[] == "auth")' - -# View archive -cat ${feature.traceability.archive_path}/IMPL_PLAN.md - -# List all tags -cat .workflow/project.json | jq -r '.features[].tags[]' | sort -u -``` - -**Empty State**: -``` -## Project: ${projectData.project_name} -Initialized: ${projectData.initialized_at} - -No features completed yet. - -Complete your first workflow session to add features: -1. /workflow:plan "feature description" -2. /workflow:execute -3. /workflow:session:complete -``` - -### Step 4: Show Recent Sessions (Optional) - -```bash -# List 5 most recent archived sessions -bash(ls -1t .workflow/archives/WFS-* 2>/dev/null | head -5 | xargs -I {} basename {}) -``` - -**Output**: -``` -### Recent Sessions -- WFS-auth-system (archived) -- WFS-payment-flow (archived) -- WFS-user-dashboard (archived) - -Use /workflow:session:complete to archive current session. -``` - -## Workflow Session Mode (Default) - -### Step 1: Find Active Session -```bash -find .workflow/active/ -name "WFS-*" -type d 2>/dev/null | head -1 -``` - -### Step 2: Load Session Data -```bash -cat .workflow/active/WFS-session/workflow-session.json -``` - -### Step 3: Scan Task Files -```bash -find .workflow/active/WFS-session/.task/ -name "*.json" -type f 2>/dev/null -``` - -### Step 4: Generate Task Status -```bash -cat .workflow/active/WFS-session/.task/impl-1.json | jq -r '.status' -``` - -### Step 5: Count Task Progress -```bash -find .workflow/active/WFS-session/.task/ -name "*.json" -type f | wc -l -find .workflow/active/WFS-session/.summaries/ -name "*.md" -type f 2>/dev/null | wc -l -``` - -### Step 6: Display Overview -```markdown -# Workflow Overview -**Session**: WFS-session-name -**Progress**: 3/8 tasks completed - -## Active Tasks -- [IN PROGRESS] impl-1: Current task in progress -- [ ] impl-2: Next pending task - -## Completed Tasks -- [COMPLETED] impl-0: Setup completed -``` - -## Dashboard Mode (HTML Board) - -### Step 1: Check for --dashboard flag -```bash -# If --dashboard flag present → Execute Dashboard Mode -``` - -### Step 2: Collect Workflow Data - -**Collect Active Sessions**: -```bash -# Find all active sessions -find .workflow/active/ -name "WFS-*" -type d 2>/dev/null - -# For each active session, read metadata and tasks -for session in $(find .workflow/active/ -name "WFS-*" -type d 2>/dev/null); do - cat "$session/workflow-session.json" - find "$session/.task/" -name "*.json" -type f 2>/dev/null -done -``` - -**Collect Archived Sessions**: -```bash -# Find all archived sessions -find .workflow/archives/ -name "WFS-*" -type d 2>/dev/null - -# Read manifest if exists -cat .workflow/archives/manifest.json 2>/dev/null - -# For each archived session, read metadata -for archive in $(find .workflow/archives/ -name "WFS-*" -type d 2>/dev/null); do - cat "$archive/workflow-session.json" 2>/dev/null - # Count completed tasks - find "$archive/.task/" -name "*.json" -type f 2>/dev/null | wc -l -done -``` - -### Step 3: Process and Structure Data - -**Build data structure for dashboard**: -```javascript -const dashboardData = { - activeSessions: [], - archivedSessions: [], - generatedAt: new Date().toISOString() -}; - -// Process active sessions -for each active_session in active_sessions: - const sessionData = JSON.parse(Read(active_session/workflow-session.json)); - const tasks = []; - - // Load all tasks for this session - for each task_file in find(active_session/.task/*.json): - const taskData = JSON.parse(Read(task_file)); - tasks.push({ - task_id: taskData.task_id, - title: taskData.title, - status: taskData.status, - type: taskData.type - }); - - dashboardData.activeSessions.push({ - session_id: sessionData.session_id, - project: sessionData.project, - status: sessionData.status, - created_at: sessionData.created_at || sessionData.initialized_at, - tasks: tasks - }); - -// Process archived sessions -for each archived_session in archived_sessions: - const sessionData = JSON.parse(Read(archived_session/workflow-session.json)); - const taskCount = bash(find archived_session/.task/*.json | wc -l); - - dashboardData.archivedSessions.push({ - session_id: sessionData.session_id, - project: sessionData.project, - archived_at: sessionData.completed_at || sessionData.archived_at, - taskCount: parseInt(taskCount), - archive_path: archived_session - }); -``` - -### Step 4: Generate HTML from Template - -**Load template and inject data**: -```javascript -// Read the HTML template -const template = Read("~/.claude/templates/workflow-dashboard.html"); - -// Prepare data for injection -const dataJson = JSON.stringify(dashboardData, null, 2); - -// Replace placeholder with actual data -const htmlContent = template.replace('{{WORKFLOW_DATA}}', dataJson); - -// Ensure .workflow directory exists -bash(mkdir -p .workflow); -``` - -### Step 5: Write HTML File - -```bash -# Write the generated HTML to .workflow/dashboard.html -Write({ - file_path: ".workflow/dashboard.html", - content: htmlContent -}) -``` - -### Step 6: Display Success Message - -```markdown -Dashboard generated successfully! - -Location: .workflow/dashboard.html - -Open in browser: - file://$(pwd)/.workflow/dashboard.html - -Features: -- 📊 Active sessions overview -- 📦 Archived sessions history -- 🔍 Search and filter -- 📈 Progress tracking -- 🎨 Dark/light theme - -Refresh data: Re-run /workflow:status --dashboard -``` \ No newline at end of file diff --git a/.claude/templates/review-cycle-dashboard.html b/.claude/templates/review-cycle-dashboard.html deleted file mode 100644 index b308a748..00000000 --- a/.claude/templates/review-cycle-dashboard.html +++ /dev/null @@ -1,2816 +0,0 @@ - - - - - - Code Review Dashboard - {{SESSION_ID}} - - - -
-
-

🔍 Code Review Dashboard

-
- 📋 Session: Loading... - 🆔 Review ID: Loading... - 🕒 Last Updated: Loading... -
- -
- - -
- 0 findings selected - - -
- - - -
-
- - -
-
-

Fix Progress

- PLANNING -
- - -
-
- - - - - - - - - -
- - -
-
-

Review Progress

- LOADING -
-
-
-
-
- Initializing... -
-
- - -
-
-
🔴
-
0
-
Critical
-
-
-
🟠
-
0
-
High
-
-
-
🟡
-
0
-
Medium
-
-
-
🟢
-
0
-
Low
-
-
- - -
-
Findings by Dimension
- - - - - - - - - - - - - - - -
DimensionCriticalHighMediumLowTotalStatus
-
- - -
- - - - - - - - -
- - -
-
-
🎯 Advanced Filters & Sort
- -
-
- -
- Severity: -
- - - - -
-
- - -
- Sort: - - -
- - -
- Select: - - - -
-
-
- - -
-
-

Findings (0)

-
-
-
-
-

Loading findings...

-
-
-
-
- - -
-
-
-
Finding Details
- -
-
- -
-
- - -
-
-
-
📜 Fix History
- -
-
- -
-
- - - - - - diff --git a/.claude/templates/workflow-dashboard.html b/.claude/templates/workflow-dashboard.html deleted file mode 100644 index 96744194..00000000 --- a/.claude/templates/workflow-dashboard.html +++ /dev/null @@ -1,664 +0,0 @@ - - - - - - Workflow Dashboard - Task Board - - - -
-
-

🚀 Workflow Dashboard

-

Task Board - Active and Archived Sessions

- -
- - -
- - - -
-
-
- -
-
-
0
-
Total Sessions
-
-
-
0
-
Active Sessions
-
-
-
0
-
Total Tasks
-
-
-
0
-
Completed Tasks
-
-
- -
-
-

📋 Active Sessions

-
-
-
- -
-
-

📦 Archived Sessions

-
-
-
-
- - - - - - \ No newline at end of file diff --git a/ccw/src/core/server.js b/ccw/src/core/server.js index 1da4c0b6..4a5f5f27 100644 --- a/ccw/src/core/server.js +++ b/ccw/src/core/server.js @@ -1,6 +1,6 @@ import http from 'http'; import { URL } from 'url'; -import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'fs'; +import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync, promises as fsPromises } from 'fs'; import { join, dirname } from 'path'; import { homedir } from 'os'; import { createHash } from 'crypto'; @@ -139,6 +139,27 @@ export async function startServer(options = {}) { return; } + // API: Read a JSON file (for fix progress tracking) + if (pathname === '/api/file') { + const filePath = url.searchParams.get('path'); + if (!filePath) { + res.writeHead(400, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: 'File path is required' })); + return; + } + + try { + const content = await fsPromises.readFile(filePath, 'utf-8'); + const json = JSON.parse(content); + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify(json)); + } catch (err) { + res.writeHead(404, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: 'File not found or invalid JSON' })); + } + return; + } + // API: Get session detail data (context, summaries, impl-plan, review) if (pathname === '/api/session-detail') { const sessionPath = url.searchParams.get('path'); diff --git a/ccw/src/templates/dashboard-js/views/review-session.js b/ccw/src/templates/dashboard-js/views/review-session.js index 7eafc282..35e8114f 100644 --- a/ccw/src/templates/dashboard-js/views/review-session.js +++ b/ccw/src/templates/dashboard-js/views/review-session.js @@ -121,6 +121,9 @@ function renderReviewSessionDetailPage(session) { + +
+
@@ -697,6 +700,11 @@ function initReviewSessionPage(session) { // Reset state when page loads reviewSessionState.session = session; // Event handlers are inline onclick - no additional setup needed + + // Start fix progress polling if in server mode + if (window.SERVER_MODE && session?.session_id) { + startFixProgressPolling(session.session_id); + } } // Legacy filter function for compatibility @@ -709,3 +717,314 @@ function filterReviewFindings(severity) { } applyReviewSessionFilters(); } + +// ========================================== +// FIX PROGRESS TRACKING +// ========================================== + +// Fix progress state +let fixProgressState = { + fixPlan: null, + progressData: null, + pollInterval: null, + currentSlide: 0 +}; + +/** + * Discover and load fix-plan.json for the current review session + * Searches in: .review/fixes/{fix-session-id}/fix-plan.json + */ +async function loadFixProgress(sessionId) { + if (!window.SERVER_MODE) { + return null; + } + + try { + // First, discover active fix session + const activeFixResponse = await fetch(`/api/file?path=${encodeURIComponent(projectPath + '/.review/fixes/active-fix-session.json')}`); + if (!activeFixResponse.ok) { + return null; + } + const activeFixSession = await activeFixResponse.json(); + const fixSessionId = activeFixSession.fix_session_id; + + // Load fix-plan.json + const planPath = `${projectPath}/.review/fixes/${fixSessionId}/fix-plan.json`; + const planResponse = await fetch(`/api/file?path=${encodeURIComponent(planPath)}`); + if (!planResponse.ok) { + return null; + } + const fixPlan = await planResponse.json(); + + // Load progress files for each group + const progressPromises = (fixPlan.groups || []).map(async (group) => { + const progressPath = `${projectPath}/.review/fixes/${fixSessionId}/${group.progress_file}`; + try { + const response = await fetch(`/api/file?path=${encodeURIComponent(progressPath)}`); + return response.ok ? await response.json() : null; + } catch { + return null; + } + }); + const progressDataArray = await Promise.all(progressPromises); + + // Aggregate progress data + const aggregated = aggregateFixProgress(fixPlan, progressDataArray.filter(d => d !== null)); + + fixProgressState.fixPlan = fixPlan; + fixProgressState.progressData = aggregated; + + return aggregated; + } catch (err) { + console.error('Failed to load fix progress:', err); + return null; + } +} + +/** + * Aggregate progress from multiple group progress files + */ +function aggregateFixProgress(fixPlan, progressDataArray) { + let totalFindings = 0; + let fixedCount = 0; + let failedCount = 0; + let inProgressCount = 0; + let pendingCount = 0; + const activeAgents = []; + + progressDataArray.forEach(progress => { + if (progress.findings) { + progress.findings.forEach(f => { + totalFindings++; + if (f.result === 'fixed') fixedCount++; + else if (f.result === 'failed') failedCount++; + else if (f.status === 'in-progress') inProgressCount++; + else pendingCount++; + }); + } + if (progress.assigned_agent && progress.status === 'in-progress') { + activeAgents.push({ + agent_id: progress.assigned_agent, + group_id: progress.group_id, + current_finding: progress.current_finding + }); + } + }); + + // Determine phase + let phase = 'planning'; + if (fixPlan.metadata?.status === 'executing' || inProgressCount > 0 || fixedCount > 0 || failedCount > 0) { + phase = 'execution'; + } + if (totalFindings > 0 && pendingCount === 0 && inProgressCount === 0) { + phase = 'completion'; + } + + // Calculate stage progress + const stages = (fixPlan.timeline?.stages || []).map(stage => { + const groupStatuses = stage.groups.map(groupId => { + const progress = progressDataArray.find(p => p.group_id === groupId); + return progress ? progress.status : 'pending'; + }); + let status = 'pending'; + if (groupStatuses.every(s => s === 'completed' || s === 'failed')) status = 'completed'; + else if (groupStatuses.some(s => s === 'in-progress')) status = 'in-progress'; + return { stage: stage.stage, status, groups: stage.groups }; + }); + + const currentStage = stages.findIndex(s => s.status === 'in-progress' || s.status === 'pending') + 1 || stages.length; + const percentComplete = totalFindings > 0 ? ((fixedCount + failedCount) / totalFindings) * 100 : 0; + + return { + fix_session_id: fixPlan.metadata?.fix_session_id, + phase, + total_findings: totalFindings, + fixed_count: fixedCount, + failed_count: failedCount, + in_progress_count: inProgressCount, + pending_count: pendingCount, + percent_complete: percentComplete, + current_stage: currentStage, + total_stages: stages.length, + stages, + active_agents: activeAgents + }; +} + +/** + * Render fix progress tracking card (carousel style) + */ +function renderFixProgressCard(progressData) { + if (!progressData) { + return ''; + } + + const { phase, total_findings, fixed_count, failed_count, in_progress_count, pending_count, percent_complete, current_stage, total_stages, stages, active_agents, fix_session_id } = progressData; + + // Phase badge class + const phaseClass = phase === 'planning' ? 'phase-planning' : phase === 'execution' ? 'phase-execution' : 'phase-completion'; + const phaseIcon = phase === 'planning' ? '📝' : phase === 'execution' ? '⚡' : '✅'; + + // Build stage dots + const stageDots = stages.map((s, i) => { + const dotClass = s.status === 'completed' ? 'completed' : s.status === 'in-progress' ? 'active' : ''; + return ``; + }).join(''); + + // Build carousel slides + const slides = []; + + // Slide 1: Overview + slides.push(` + + `); + + // Slide 2: Stats + slides.push(` + + `); + + // Slide 3: Active agents (if any) + if (active_agents.length > 0) { + const agentItems = active_agents.slice(0, 2).map(a => ` +
+ 🤖 + ${a.current_finding?.finding_title || 'Working...'} +
+ `).join(''); + slides.push(` + + `); + } + + // Build carousel navigation + const navDots = slides.map((_, i) => ` + + `).join(''); + + return ` +
+
+ 🔧 Fix Progress +
${stageDots}
+
+ + +
+ `; +} + +/** + * Navigate fix progress carousel + */ +function navigateFixCarousel(direction) { + const track = document.getElementById('fixCarouselTrack'); + if (!track) return; + + const slides = track.querySelectorAll('.fix-carousel-slide'); + const totalSlides = slides.length; + + if (typeof direction === 'number') { + fixProgressState.currentSlide = direction; + } else if (direction === 'next') { + fixProgressState.currentSlide = (fixProgressState.currentSlide + 1) % totalSlides; + } else if (direction === 'prev') { + fixProgressState.currentSlide = (fixProgressState.currentSlide - 1 + totalSlides) % totalSlides; + } + + track.style.transform = `translateX(-${fixProgressState.currentSlide * 100}%)`; + + // Update nav dots + document.querySelectorAll('.fix-nav-dot').forEach((dot, i) => { + dot.classList.toggle('active', i === fixProgressState.currentSlide); + }); +} + +/** + * Start polling for fix progress updates + */ +function startFixProgressPolling(sessionId) { + if (fixProgressState.pollInterval) { + clearInterval(fixProgressState.pollInterval); + } + + // Initial load + loadFixProgress(sessionId).then(data => { + if (data) { + updateFixProgressUI(data); + } + }); + + // Poll every 5 seconds + fixProgressState.pollInterval = setInterval(async () => { + const data = await loadFixProgress(sessionId); + if (data) { + updateFixProgressUI(data); + // Stop polling if completed + if (data.phase === 'completion') { + clearInterval(fixProgressState.pollInterval); + fixProgressState.pollInterval = null; + } + } + }, 5000); +} + +/** + * Update fix progress UI + */ +function updateFixProgressUI(progressData) { + const container = document.getElementById('fixProgressSection'); + if (!container) return; + + container.innerHTML = renderFixProgressCard(progressData); + fixProgressState.currentSlide = 0; +} + +/** + * Stop fix progress polling + */ +function stopFixProgressPolling() { + if (fixProgressState.pollInterval) { + clearInterval(fixProgressState.pollInterval); + fixProgressState.pollInterval = null; + } +} diff --git a/ccw/src/templates/dashboard.css b/ccw/src/templates/dashboard.css index bb2226db..3b3c7197 100644 --- a/ccw/src/templates/dashboard.css +++ b/ccw/src/templates/dashboard.css @@ -7658,3 +7658,274 @@ code.ctx-meta-chip-value { font-size: 0.7rem; color: hsl(var(--muted-foreground)); } + +/* =================================== + Fix Progress Tracking Card (Carousel) + =================================== */ + +.fix-progress-section-container { + margin-bottom: 1rem; +} + +.fix-progress-card { + background: hsl(var(--card)); + border: 1px solid hsl(var(--border)); + border-radius: 0.5rem; + padding: 1rem; + overflow: hidden; +} + +.fix-card-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.75rem; +} + +.fix-card-title { + font-weight: 600; + font-size: 0.9rem; + color: hsl(var(--foreground)); +} + +.fix-stage-dots { + display: flex; + gap: 0.375rem; + align-items: center; +} + +.fix-stage-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: hsl(var(--muted)); + transition: all 0.2s ease; +} + +.fix-stage-dot.active { + background: hsl(var(--primary)); + animation: pulse-dot 1.5s infinite; +} + +.fix-stage-dot.completed { + background: hsl(var(--success)); +} + +@keyframes pulse-dot { + 0%, 100% { opacity: 1; transform: scale(1); } + 50% { opacity: 0.6; transform: scale(1.2); } +} + +/* Carousel Container */ +.fix-carousel-container { + overflow: hidden; + margin-bottom: 0.75rem; +} + +.fix-carousel-track { + display: flex; + transition: transform 0.3s ease; +} + +.fix-carousel-slide { + min-width: 100%; + padding: 0.5rem; +} + +/* Slide Header */ +.fix-slide-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.75rem; +} + +.fix-phase-badge { + display: inline-flex; + align-items: center; + gap: 0.25rem; + padding: 0.25rem 0.75rem; + border-radius: 9999px; + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; +} + +.fix-phase-badge.phase-planning { + background: hsl(270 60% 90%); + color: hsl(270 60% 40%); +} + +.fix-phase-badge.phase-execution { + background: hsl(220 80% 90%); + color: hsl(220 80% 40%); + animation: pulse-badge 2s infinite; +} + +.fix-phase-badge.phase-completion { + background: hsl(var(--success-light)); + color: hsl(var(--success)); +} + +@keyframes pulse-badge { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.7; } +} + +.fix-session-id { + font-size: 0.7rem; + color: hsl(var(--muted-foreground)); + font-family: var(--font-mono); +} + +/* Progress Bar Mini */ +.fix-progress-bar-mini { + height: 6px; + background: hsl(var(--muted)); + border-radius: 3px; + overflow: hidden; + margin-bottom: 0.5rem; +} + +.fix-progress-fill { + height: 100%; + background: linear-gradient(90deg, hsl(var(--primary)), hsl(var(--success))); + border-radius: 3px; + transition: width 0.3s ease; +} + +.fix-progress-text { + font-size: 0.75rem; + color: hsl(var(--muted-foreground)); + text-align: center; +} + +/* Stats Row (Slide 2) */ +.fix-stats-row { + display: flex; + justify-content: space-around; + padding: 0.5rem 0; +} + +.fix-stat { + text-align: center; +} + +.fix-stat-value { + display: block; + font-size: 1.25rem; + font-weight: 700; + color: hsl(var(--foreground)); +} + +.fix-stat-label { + display: block; + font-size: 0.65rem; + color: hsl(var(--muted-foreground)); + text-transform: uppercase; +} + +.fix-stat.fixed .fix-stat-value { + color: hsl(var(--success)); +} + +.fix-stat.failed .fix-stat-value { + color: hsl(var(--destructive)); +} + +.fix-stat.pending .fix-stat-value { + color: hsl(var(--warning)); +} + +/* Active Agents (Slide 3) */ +.fix-agents-header { + font-size: 0.8rem; + font-weight: 600; + color: hsl(var(--foreground)); + margin-bottom: 0.5rem; +} + +.fix-agent-item { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.375rem 0.5rem; + background: hsl(var(--muted)); + border-radius: 0.25rem; + margin-bottom: 0.375rem; +} + +.fix-agent-item:last-child { + margin-bottom: 0; +} + +.fix-agent-icon { + font-size: 0.875rem; + animation: spin-agent 2s linear infinite; +} + +@keyframes spin-agent { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.fix-agent-info { + font-size: 0.75rem; + color: hsl(var(--foreground)); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* Carousel Navigation */ +.fix-carousel-nav { + display: flex; + justify-content: center; + align-items: center; + gap: 0.75rem; +} + +.fix-nav-btn { + width: 24px; + height: 24px; + border: none; + background: hsl(var(--muted)); + color: hsl(var(--muted-foreground)); + border-radius: 50%; + cursor: pointer; + font-size: 1rem; + font-weight: bold; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.15s; +} + +.fix-nav-btn:hover { + background: hsl(var(--hover)); + color: hsl(var(--foreground)); +} + +.fix-nav-dots { + display: flex; + gap: 0.375rem; +} + +.fix-nav-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: hsl(var(--muted)); + cursor: pointer; + transition: all 0.2s; +} + +.fix-nav-dot:hover { + background: hsl(var(--muted-foreground)); +} + +.fix-nav-dot.active { + background: hsl(var(--primary)); + width: 16px; + border-radius: 3px; +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..efa76b99 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1947 @@ +{ + "name": "claude-code-workflow", + "version": "6.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "claude-code-workflow", + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "boxen": "^7.1.0", + "chalk": "^5.3.0", + "claude-code-workflow": "^6.0.0", + "commander": "^11.0.0", + "figlet": "^1.7.0", + "glob": "^10.3.0", + "gradient-string": "^2.0.2", + "inquirer": "^9.2.0", + "open": "^9.1.0", + "ora": "^7.0.0" + }, + "bin": { + "ccw": "ccw/bin/ccw.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/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/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/tinycolor2": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", + "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", + "license": "MIT" + }, + "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/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/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-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "license": "MIT", + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.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/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "license": "MIT" + }, + "node_modules/claude-code-workflow": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/claude-code-workflow/-/claude-code-workflow-6.0.0.tgz", + "integrity": "sha512-YcYOplsnHqB/IcHIQgCrXPR1TK/Cbb5zFaFwrMNFzTEPU6oHRcGUc4RK9xtd/3LhfOGitZXSvANVooYPnNScVA==", + "license": "MIT", + "dependencies": { + "boxen": "^7.1.0", + "chalk": "^5.3.0", + "commander": "^11.0.0", + "figlet": "^1.7.0", + "glob": "^10.3.0", + "gradient-string": "^2.0.2", + "inquirer": "^9.2.0", + "open": "^9.1.0", + "ora": "^7.0.0" + }, + "bin": { + "ccw": "ccw/bin/ccw.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "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==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "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==", + "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==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "license": "MIT", + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "license": "MIT", + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/figlet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.9.4.tgz", + "integrity": "sha512-uN6QE+TrzTAHC1IWTyrc4FfGo2KH/82J8Jl1tyKB7+z5DBit/m3D++Iu5lg91qJMnQQ3vpJrj5gxcK/pk4R9tQ==", + "license": "MIT", + "dependencies": { + "commander": "^14.0.0" + }, + "bin": { + "figlet": "bin/index.js" + }, + "engines": { + "node": ">= 17.0.0" + } + }, + "node_modules/figlet/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gradient-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz", + "integrity": "sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tinygradient": "^1.1.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gradient-string/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/gradient-string/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "9.3.8", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", + "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", + "license": "MIT", + "dependencies": { + "@inquirer/external-editor": "^1.0.2", + "@inquirer/figures": "^1.0.3", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/inquirer/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/inquirer/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/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/inquirer/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/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==", + "license": "ISC" + }, + "node_modules/inquirer/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/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "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_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-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==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "license": "MIT", + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "ISC" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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==", + "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/npm-run-path/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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "license": "MIT", + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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/ora/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/ora/node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/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==", + "license": "ISC" + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "license": "MIT", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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/run-applescript/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==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/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==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/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==", + "license": "ISC" + }, + "node_modules/run-applescript/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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "license": "MIT", + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "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/string-width-cjs/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/string-width/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/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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/strip-ansi-cjs": { + "name": "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/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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/tinygradient": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/tinygradient/-/tinygradient-1.1.5.tgz", + "integrity": "sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==", + "license": "MIT", + "dependencies": { + "@types/tinycolor2": "^1.4.0", + "tinycolor2": "^1.0.0" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "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==", + "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/wrap-ansi-cjs/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi/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/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +}