diff --git a/.ccw/workflows/cli-templates/schemas/project-guidelines-schema.json b/.ccw/workflows/cli-templates/schemas/project-guidelines-schema.json index 80318c89..d6256901 100644 --- a/.ccw/workflows/cli-templates/schemas/project-guidelines-schema.json +++ b/.ccw/workflows/cli-templates/schemas/project-guidelines-schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Project Guidelines Schema", - "description": "Schema for project-guidelines.json - user-maintained rules and constraints", + "description": "Legacy schema - project guidelines now managed by spec system (`ccw spec load --dimension specs`)", "type": "object", "required": ["conventions", "constraints", "_metadata"], "properties": { diff --git a/.claude/agents/action-planning-agent.md b/.claude/agents/action-planning-agent.md index 5298ee4a..fb55fd90 100644 --- a/.claude/agents/action-planning-agent.md +++ b/.claude/agents/action-planning-agent.md @@ -63,7 +63,7 @@ color: yellow align task tech choices with actual project stack → If missing: Fall back to context-package.project_context fields - b. Read .workflow/project-guidelines.json (if exists) + b. Read .workflow/specs/*.md (if exists) → coding_conventions, naming_rules, forbidden_patterns, quality_gates, custom_constraints → Usage: Apply as HARD CONSTRAINTS on all tasks — implementation steps, acceptance criteria, and convergence.verification MUST respect these rules @@ -1005,7 +1005,7 @@ Use `analysis_results.complexity` or task count to determine structure: ### 3.4 Guidelines Checklist **ALWAYS:** -- **Load project context FIRST**: Read `.workflow/project-tech.json` and `.workflow/project-guidelines.json` before any session-specific files. Apply project-guidelines as hard constraints on all tasks +- **Load project context FIRST**: Read `.workflow/project-tech.json` and `.workflow/specs/*.md` before any session-specific files. Apply specs/*.md as hard constraints on all tasks - **Load planning-notes.md SECOND**: Read planning-notes.md before context-package.json. Use its Consolidated Constraints as primary constraint source for all task generation - **Record N+1 Context**: Update `## N+1 Context` section with key decisions and deferred items - **Search Tool Priority**: ACE (`mcp__ace-tool__search_context`) → CCW (`mcp__ccw-tools__smart_search`) / Built-in (`Grep`, `Glob`, `Read`) diff --git a/.claude/agents/cli-explore-agent.md b/.claude/agents/cli-explore-agent.md index 2ee8fe3c..84032f42 100644 --- a/.claude/agents/cli-explore-agent.md +++ b/.claude/agents/cli-explore-agent.md @@ -58,7 +58,7 @@ Phase 4: Output Generation - Read `.workflow/project-tech.json` (if exists): - Extract: `tech_stack`, `architecture`, `key_components`, `overview` - Usage: Align analysis scope and patterns with actual project technology choices - - Read `.workflow/project-guidelines.json` (if exists): + - Read `.workflow/specs/*.md` (if exists): - Extract: `conventions`, `constraints`, `quality_rules`, `learnings` - Usage: Apply as constraints during pattern analysis, integration point evaluation, and recommendations - If either file does not exist, proceed with fresh analysis (no error). diff --git a/.claude/agents/cli-lite-planning-agent.md b/.claude/agents/cli-lite-planning-agent.md index 0f4f22eb..921ce86a 100644 --- a/.claude/agents/cli-lite-planning-agent.md +++ b/.claude/agents/cli-lite-planning-agent.md @@ -56,7 +56,7 @@ When invoked with `process_docs: true` in input context: **Project Context** (read from init.md products at startup): - `.workflow/project-tech.json` → tech_stack, architecture, key_components -- `.workflow/project-guidelines.json` → conventions, constraints, quality_rules +- `.workflow/specs/*.md` → conventions, constraints, quality_rules ```javascript { @@ -153,7 +153,7 @@ Phase 5: Plan Quality Check (MANDATORY) │ ├─ Dependency correctness (no circular deps, proper ordering) │ ├─ Acceptance criteria quality (quantified, testable) │ ├─ Implementation steps sufficiency (2+ steps per task) -│ └─ Constraint compliance (follows project-guidelines.json) +│ └─ Constraint compliance (follows specs/*.md) ├─ Parse check results and categorize issues └─ Decision: ├─ No issues → Return plan to orchestrator @@ -850,7 +850,7 @@ After generating plan.json, **MUST** execute CLI quality check before returning | **Dependencies** | No circular deps, correct ordering | Yes | | **Convergence Criteria** | Quantified and testable (not vague) | No | | **Implementation Steps** | 2+ actionable steps per task | No | -| **Constraint Compliance** | Follows project-guidelines.json | Yes | +| **Constraint Compliance** | Follows specs/*.md | Yes | ### CLI Command Format @@ -859,7 +859,7 @@ Use `ccw cli` with analysis mode to validate plan against quality dimensions: ```bash ccw cli -p "Validate plan quality: completeness, granularity, dependencies, convergence criteria, implementation steps, constraint compliance" \ --tool gemini --mode analysis \ - --context "@{plan_json_path} @{task_dir}/*.json @.workflow/project-guidelines.json" + --context "@{plan_json_path} @{task_dir}/*.json @.workflow/specs/*.md" ``` **Expected Output Structure**: diff --git a/.claude/agents/code-developer.md b/.claude/agents/code-developer.md index bddfe31f..54e43666 100644 --- a/.claude/agents/code-developer.md +++ b/.claude/agents/code-developer.md @@ -38,7 +38,7 @@ jq --arg ts "$(date -Iseconds)" '.status="in_progress" | .status_history += [{"f - Project CLAUDE.md standards - **context-package.json** (when available in workflow tasks) - **project-tech.json** (if exists) → tech_stack, architecture, key_components -- **project-guidelines.json** (if exists) → conventions, constraints, quality_rules +- **specs/*.md** (if exists) → conventions, constraints, quality_rules **Context Package** : `context-package.json` provides artifact paths - read using Read tool or ccw session: diff --git a/.claude/agents/context-search-agent.md b/.claude/agents/context-search-agent.md index 63a58123..f983d240 100644 --- a/.claude/agents/context-search-agent.md +++ b/.claude/agents/context-search-agent.md @@ -82,8 +82,8 @@ if (file_exists(contextPackagePath)) { const projectTech = file_exists('.workflow/project-tech.json') ? JSON.parse(Read('.workflow/project-tech.json')) // tech_stack, architecture_type, key_components, build_system, test_framework : null; -const projectGuidelines = file_exists('.workflow/project-guidelines.json') - ? JSON.parse(Read('.workflow/project-guidelines.json')) // coding_conventions, naming_rules, forbidden_patterns, quality_gates +const projectGuidelines = file_exists('.workflow/specs/*.md') + ? JSON.parse(Read('.workflow/specs/*.md')) // coding_conventions, naming_rules, forbidden_patterns, quality_gates : null; // Usage: diff --git a/.claude/agents/debug-explore-agent.md b/.claude/agents/debug-explore-agent.md index 5d2bc8bb..0f8b7ba0 100644 --- a/.claude/agents/debug-explore-agent.md +++ b/.claude/agents/debug-explore-agent.md @@ -37,7 +37,7 @@ Phase 5: Fix & Verification **Load Project Context** (from init.md products): - Read `.workflow/project-tech.json` (if exists) for tech stack context -- Read `.workflow/project-guidelines.json` (if exists) for coding constraints +- Read `.workflow/specs/*.md` (if exists) for coding constraints **Session Setup**: ```javascript diff --git a/.claude/agents/issue-plan-agent.md b/.claude/agents/issue-plan-agent.md index 1aa4247a..f8701b0a 100644 --- a/.claude/agents/issue-plan-agent.md +++ b/.claude/agents/issue-plan-agent.md @@ -28,7 +28,7 @@ color: green **Project Context** (load at startup): - Read `.workflow/project-tech.json` (if exists) → tech_stack, architecture -- Read `.workflow/project-guidelines.json` (if exists) → constraints, conventions +- Read `.workflow/specs/*.md` (if exists) → constraints, conventions ```javascript { diff --git a/.claude/commands/ccw.md b/.claude/commands/ccw.md index a9b49a27..1e58037c 100644 --- a/.claude/commands/ccw.md +++ b/.claude/commands/ccw.md @@ -834,7 +834,7 @@ todos = [ | `workflow:unified-execute-with-file` | Universal execution engine - consumes plan output from collaborative-plan, req-plan, brainstorm | | `workflow:clean` | Intelligent code cleanup - mainline detection, stale artifact removal | | `workflow:init` | Initialize `.workflow/project-tech.json` with project analysis | -| `workflow:init-guidelines` | Interactive wizard to fill `project-guidelines.json` | +| `workflow:init-guidelines` | Interactive wizard to fill `specs/*.md` | --- diff --git a/.claude/commands/issue/plan.md b/.claude/commands/issue/plan.md index 5dd8c67f..fb57027a 100644 --- a/.claude/commands/issue/plan.md +++ b/.claude/commands/issue/plan.md @@ -160,7 +160,7 @@ ${issueList} ### Project Context (MANDATORY) 1. Read: .workflow/project-tech.json (technology stack, architecture) -2. Read: .workflow/project-guidelines.json (constraints and conventions) +2. Read: .workflow/specs/*.md (constraints and conventions) ### Workflow 1. Fetch issue details: ccw issue status --json diff --git a/.claude/commands/workflow/analyze-with-file.md b/.claude/commands/workflow/analyze-with-file.md index 587bb273..c8948ded 100644 --- a/.claude/commands/workflow/analyze-with-file.md +++ b/.claude/commands/workflow/analyze-with-file.md @@ -571,27 +571,22 @@ CONSTRAINTS: ${perspective.constraints} .map(r => r.action) .join('\n') || conclusions.summary - // 2. Extract exploration digest (inline data, not path reference) - const explorationDigest = { relevant_files: [], patterns: [], key_findings: [] } + // 2. Assemble compact analysis context as inline memory block + const contextLines = [ + `## Prior Analysis (${sessionId})`, + `**Summary**: ${conclusions.summary}` + ] const codebasePath = `${sessionFolder}/exploration-codebase.json` if (file_exists(codebasePath)) { const data = JSON.parse(Read(codebasePath)) - explorationDigest.relevant_files = data.relevant_files || [] - explorationDigest.patterns = data.patterns || [] - explorationDigest.key_findings = data.key_findings || [] + const files = (data.relevant_files || []).slice(0, 8).map(f => f.path || f.file || f).filter(Boolean) + const findings = (data.key_findings || []).slice(0, 5) + if (files.length) contextLines.push(`**Key Files**: ${files.join(', ')}`) + if (findings.length) contextLines.push(`**Key Findings**:\n${findings.map(f => `- ${f}`).join('\n')}`) } - // 3. Write handoff file to analysis session folder - Write(`${sessionFolder}/handoff-lite-plan.json`, JSON.stringify({ - source_session: sessionId, - summary: conclusions.summary, - recommendations: conclusions.recommendations, - decision_trail: conclusions.decision_trail, - exploration_digest: explorationDigest - }, null, 2)) - - // 4. Call lite-plan with --from-analysis handoff - Skill(skill="workflow-lite-plan", args=`--from-analysis ${sessionFolder}/handoff-lite-plan.json "${taskDescription}"`) + // 3. Call lite-plan with enriched task description (no special flags) + Skill(skill="workflow-lite-plan", args=`"${taskDescription}\n\n${contextLines.join('\n')}"`) } ``` @@ -774,7 +769,7 @@ User agrees with current direction, wants deeper code analysis - Need simple task breakdown - Focus on quick execution planning -> **Note**: Phase 4「生成任务」auto-generates `--from-analysis` handoff. Manual invocation normally not needed after analysis. +> **Note**: Phase 4「生成任务」assembles analysis context as inline `## Prior Analysis` block in task description, allowing lite-plan to skip redundant exploration automatically. --- diff --git a/.claude/commands/workflow/clean.md b/.claude/commands/workflow/clean.md index 9ad3f25c..a3b31715 100644 --- a/.claude/commands/workflow/clean.md +++ b/.claude/commands/workflow/clean.md @@ -495,8 +495,8 @@ if (fileExists(projectPath)) { Write(projectPath, JSON.stringify(project, null, 2)) } -// Update project-guidelines.json: remove learnings referencing deleted sessions -const guidelinesPath = '.workflow/project-guidelines.json' +// Update specs/*.md: remove learnings referencing deleted sessions +const guidelinesPath = '.workflow/specs/*.md' if (fileExists(guidelinesPath)) { const guidelines = JSON.parse(Read(guidelinesPath)) const deletedSessionIds = results.deleted @@ -566,7 +566,7 @@ Cleanup manifest archived to: ${sessionFolder}/cleanup-manifest.json ## Related Commands -- `/workflow:session:sync` - Sync session work to project-guidelines + project-tech (正向写入) +- `/workflow:session:sync` - Sync session work to specs/*.md + project-tech (正向写入) - `/workflow:session:complete` - Properly archive active sessions - `memory-capture` skill - Save session memory before cleanup - `workflow-execute` skill - View current workflow state diff --git a/.claude/commands/workflow/collaborative-plan-with-file.md b/.claude/commands/workflow/collaborative-plan-with-file.md index 9dad176b..8bfa962f 100644 --- a/.claude/commands/workflow/collaborative-plan-with-file.md +++ b/.claude/commands/workflow/collaborative-plan-with-file.md @@ -208,7 +208,7 @@ Task( ### Project Context (MANDATORY) Read and incorporate: - \`.workflow/project-tech.json\` (if exists): Technology stack, architecture -- \`.workflow/project-guidelines.json\` (if exists): Constraints, conventions -- apply as HARD CONSTRAINTS on sub-domain splitting and plan structure +- \`.workflow/specs/*.md\` (if exists): Constraints, conventions -- apply as HARD CONSTRAINTS on sub-domain splitting and plan structure ### Input Requirements ${taskDescription} @@ -357,7 +357,7 @@ subDomains.map(sub => ### Project Context (MANDATORY) Read and incorporate: - \`.workflow/project-tech.json\` (if exists): Technology stack, architecture -- \`.workflow/project-guidelines.json\` (if exists): Constraints, conventions -- apply as HARD CONSTRAINTS +- \`.workflow/specs/*.md\` (if exists): Constraints, conventions -- apply as HARD CONSTRAINTS ## Dual Output Tasks diff --git a/.claude/commands/workflow/debug-with-file.md b/.claude/commands/workflow/debug-with-file.md index 9c32cc2a..a6677bd5 100644 --- a/.claude/commands/workflow/debug-with-file.md +++ b/.claude/commands/workflow/debug-with-file.md @@ -630,7 +630,7 @@ Why is config value None during update? ## Post-Completion Expansion -**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 project-guidelines + project-tech。 +**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 specs/*.md + project-tech。 完成后询问用户是否扩展为issue(test/enhance/refactor/doc),选中项调用 `/issue:new "{summary} - {dimension}"` diff --git a/.claude/commands/workflow/init-guidelines.md b/.claude/commands/workflow/init-guidelines.md index ab7c3ecb..b268d580 100644 --- a/.claude/commands/workflow/init-guidelines.md +++ b/.claude/commands/workflow/init-guidelines.md @@ -1,6 +1,6 @@ --- name: init-guidelines -description: Interactive wizard to fill project-guidelines.json based on project analysis +description: Interactive wizard to fill specs/*.md based on project analysis argument-hint: "[--reset]" examples: - /workflow:init-guidelines @@ -11,7 +11,7 @@ examples: ## Overview -Interactive multi-round wizard that analyzes the current project (via `project-tech.json`) and asks targeted questions to populate `.workflow/project-guidelines.json` with coding conventions, constraints, and quality rules. +Interactive multi-round wizard that analyzes the current project (via `project-tech.json`) and asks targeted questions to populate `.workflow/specs/*.md` with coding conventions, constraints, and quality rules. **Design Principle**: Questions are dynamically generated based on the project's tech stack, architecture, and patterns — not generic boilerplate. @@ -31,7 +31,7 @@ Input Parsing: Step 1: Check Prerequisites ├─ project-tech.json must exist (run /workflow:init first) - ├─ project-guidelines.json: check if populated or scaffold-only + ├─ specs/*.md: check if populated or scaffold-only └─ If populated + no --reset → Ask: "Guidelines already exist. Overwrite or append?" Step 2: Load Project Context @@ -44,7 +44,7 @@ Step 3: Multi-Round Interactive Questionnaire ├─ Round 4: Performance & Security Constraints (performance, security) └─ Round 5: Quality Rules (quality_rules) -Step 4: Write project-guidelines.json +Step 4: Write specs/*.md Step 5: Display Summary ``` @@ -55,7 +55,7 @@ Step 5: Display Summary ```bash bash(test -f .workflow/project-tech.json && echo "TECH_EXISTS" || echo "TECH_NOT_FOUND") -bash(test -f .workflow/project-guidelines.json && echo "GUIDELINES_EXISTS" || echo "GUIDELINES_NOT_FOUND") +bash(test -f .workflow/specs/coding-conventions.md && echo "SPECS_EXISTS" || echo "SPECS_NOT_FOUND") ``` **If TECH_NOT_FOUND**: Exit with message @@ -71,12 +71,10 @@ const reset = $ARGUMENTS.includes('--reset') **If GUIDELINES_EXISTS and not --reset**: Check if guidelines are populated (not just scaffold) ```javascript -const guidelines = JSON.parse(Read('.workflow/project-guidelines.json')) -const isPopulated = - guidelines.conventions.coding_style.length > 0 || - guidelines.conventions.naming_patterns.length > 0 || - guidelines.constraints.architecture.length > 0 || - guidelines.constraints.tech_stack.length > 0 +// Check if specs already have content via ccw spec list +const specsList = Bash('ccw spec list --json 2>/dev/null || echo "{}"') +const specsData = JSON.parse(specsList) +const isPopulated = (specsData.total || 0) > 5 // More than seed docs if (isPopulated) { AskUserQuestion({ @@ -326,64 +324,76 @@ AskUserQuestion({ **Process Round 5 answers** → add to `quality_rules` array as `{ rule, scope, enforced_by }` objects. -### Step 4: Write project-guidelines.json +### Step 4: Write specs/*.md + +For each category of collected answers, append rules to the corresponding spec MD file. Each spec file uses YAML frontmatter with `readMode`, `priority`, and `keywords`. ```javascript -// Build the final guidelines object -const finalGuidelines = { - conventions: { - coding_style: existingCodingStyle.concat(newCodingStyle), - naming_patterns: existingNamingPatterns.concat(newNamingPatterns), - file_structure: existingFileStructure.concat(newFileStructure), - documentation: existingDocumentation.concat(newDocumentation) - }, - constraints: { - architecture: existingArchitecture.concat(newArchitecture), - tech_stack: existingTechStack.concat(newTechStack), - performance: existingPerformance.concat(newPerformance), - security: existingSecurity.concat(newSecurity) - }, - quality_rules: existingQualityRules.concat(newQualityRules), - learnings: existingLearnings, // Preserve existing learnings - _metadata: { - created_at: existingMetadata?.created_at || new Date().toISOString(), - version: "1.0.0", - last_updated: new Date().toISOString(), - updated_by: "workflow:init-guidelines" - } +// Helper: append rules to a spec MD file +function appendRulesToSpecFile(filePath, rules) { + if (rules.length === 0) return + const existing = Read(filePath) + // Append new rules as markdown list items after existing content + const newContent = existing.trimEnd() + '\n' + rules.map(r => `- ${r}`).join('\n') + '\n' + Write(filePath, newContent) } -Write('.workflow/project-guidelines.json', JSON.stringify(finalGuidelines, null, 2)) +// Write conventions +appendRulesToSpecFile('.workflow/specs/coding-conventions.md', + [...newCodingStyle, ...newNamingPatterns, ...newFileStructure, ...newDocumentation]) + +// Write constraints +appendRulesToSpecFile('.workflow/specs/architecture-constraints.md', + [...newArchitecture, ...newTechStack, ...newPerformance, ...newSecurity]) + +// Write quality rules (create file if needed) +if (newQualityRules.length > 0) { + const qualityPath = '.workflow/specs/quality-rules.md' + if (!file_exists(qualityPath)) { + Write(qualityPath, `--- +title: Quality Rules +readMode: required +priority: high +keywords: [quality, testing, coverage, lint] +--- + +# Quality Rules + +`) + } + appendRulesToSpecFile(qualityPath, + newQualityRules.map(q => `${q.rule} (scope: ${q.scope}, enforced by: ${q.enforced_by})`)) +} + +// Rebuild spec index after writing +Bash('ccw spec rebuild') ``` ### Step 5: Display Summary ```javascript -const countConventions = finalGuidelines.conventions.coding_style.length - + finalGuidelines.conventions.naming_patterns.length - + finalGuidelines.conventions.file_structure.length - + finalGuidelines.conventions.documentation.length +const countConventions = newCodingStyle.length + newNamingPatterns.length + + newFileStructure.length + newDocumentation.length +const countConstraints = newArchitecture.length + newTechStack.length + + newPerformance.length + newSecurity.length +const countQuality = newQualityRules.length -const countConstraints = finalGuidelines.constraints.architecture.length - + finalGuidelines.constraints.tech_stack.length - + finalGuidelines.constraints.performance.length - + finalGuidelines.constraints.security.length - -const countQuality = finalGuidelines.quality_rules.length +// Get updated spec list +const specsList = Bash('ccw spec list --json 2>/dev/null || echo "{}"') console.log(` ✓ Project guidelines configured ## Summary -- Conventions: ${countConventions} rules (coding: ${cs}, naming: ${np}, files: ${fs}, docs: ${doc}) -- Constraints: ${countConstraints} rules (arch: ${ar}, tech: ${ts}, perf: ${pf}, security: ${sc}) -- Quality rules: ${countQuality} +- Conventions: ${countConventions} rules added to coding-conventions.md +- Constraints: ${countConstraints} rules added to architecture-constraints.md +- Quality rules: ${countQuality} rules added to quality-rules.md -File: .workflow/project-guidelines.json +Spec index rebuilt. Use \`ccw spec list\` to view all specs. Next steps: - Use /workflow:session:solidify to add individual rules later -- Guidelines will be auto-loaded by /workflow:plan for task generation +- Specs are auto-loaded via hook on each prompt `) ``` diff --git a/.claude/commands/workflow/init.md b/.claude/commands/workflow/init.md index 16cad481..82a85905 100644 --- a/.claude/commands/workflow/init.md +++ b/.claude/commands/workflow/init.md @@ -10,11 +10,11 @@ examples: # Workflow Init Command (/workflow:init) ## Overview -Initialize `.workflow/project-tech.json` and `.workflow/project-guidelines.json` with comprehensive project understanding by delegating analysis to **cli-explore-agent**. +Initialize `.workflow/project-tech.json` and `.workflow/specs/*.md` with comprehensive project understanding by delegating analysis to **cli-explore-agent**. **Dual File System**: - `project-tech.json`: Auto-generated technical analysis (stack, architecture, components) -- `project-guidelines.json`: User-maintained rules and constraints (created as scaffold) +- `specs/*.md`: User-maintained rules and constraints (created as scaffold) **Note**: This command may be called by other workflow commands. Upon completion, return immediately to continue the calling workflow without interrupting the task flow. @@ -43,7 +43,7 @@ Analysis Flow: │ ├─ Synthesis and merge │ └─ Write .workflow/project-tech.json ├─ Create guidelines scaffold (if not exists) - │ └─ Write .workflow/project-guidelines.json (empty structure) + │ └─ Write .workflow/specs/*.md (empty structure) ├─ Display summary └─ Ask about guidelines configuration ├─ If guidelines empty → Ask user: "Configure now?" or "Skip" @@ -53,7 +53,7 @@ Analysis Flow: Output: ├─ .workflow/project-tech.json (+ .backup if regenerate) - └─ .workflow/project-guidelines.json (scaffold or configured) + └─ .workflow/specs/*.md (scaffold or configured) ``` ## Implementation @@ -69,14 +69,14 @@ const regenerate = $ARGUMENTS.includes('--regenerate') ```bash bash(test -f .workflow/project-tech.json && echo "TECH_EXISTS" || echo "TECH_NOT_FOUND") -bash(test -f .workflow/project-guidelines.json && echo "GUIDELINES_EXISTS" || echo "GUIDELINES_NOT_FOUND") +bash(test -f .workflow/specs/coding-conventions.md && echo "SPECS_EXISTS" || echo "SPECS_NOT_FOUND") ``` **If BOTH_EXIST and no --regenerate**: Exit early ``` Project already initialized: - Tech analysis: .workflow/project-tech.json -- Guidelines: .workflow/project-guidelines.json +- Guidelines: .workflow/specs/*.md Use /workflow:init --regenerate to rebuild tech analysis Use /workflow:session:solidify to add guidelines @@ -159,33 +159,13 @@ Project root: ${projectRoot} ) ``` -### Step 3.5: Create Guidelines Scaffold (if not exists) +### Step 3.5: Initialize Spec System (if not exists) ```javascript -// Only create if not exists (never overwrite user guidelines) -if (!file_exists('.workflow/project-guidelines.json')) { - const guidelinesScaffold = { - conventions: { - coding_style: [], - naming_patterns: [], - file_structure: [], - documentation: [] - }, - constraints: { - architecture: [], - tech_stack: [], - performance: [], - security: [] - }, - quality_rules: [], - learnings: [], - _metadata: { - created_at: new Date().toISOString(), - version: "1.0.0" - } - }; - - Write('.workflow/project-guidelines.json', JSON.stringify(guidelinesScaffold, null, 2)); +// Initialize spec system if not already initialized +if (!file_exists('.workflow/specs/coding-conventions.md')) { + Bash('ccw spec init'); + Bash('ccw spec rebuild'); } ``` @@ -193,10 +173,10 @@ if (!file_exists('.workflow/project-guidelines.json')) { ```javascript const projectTech = JSON.parse(Read('.workflow/project-tech.json')); -const guidelinesExists = file_exists('.workflow/project-guidelines.json'); +const specsInitialized = file_exists('.workflow/specs/coding-conventions.md'); console.log(` -✓ Project initialized successfully +Project initialized successfully ## Project Overview Name: ${projectTech.project_name} @@ -213,7 +193,7 @@ Components: ${projectTech.overview.key_components.length} core modules --- Files created: - Tech analysis: .workflow/project-tech.json -- Guidelines: .workflow/project-guidelines.json ${guidelinesExists ? '(scaffold)' : ''} +- Specs: .workflow/specs/ ${specsInitialized ? '(initialized)' : ''} ${regenerate ? '- Backup: .workflow/project-tech.json.backup' : ''} `); ``` @@ -223,20 +203,16 @@ ${regenerate ? '- Backup: .workflow/project-tech.json.backup' : ''} After displaying the summary, ask the user if they want to configure project guidelines interactively. ```javascript -// Check if guidelines are just a scaffold (empty) or already populated -const guidelines = JSON.parse(Read('.workflow/project-guidelines.json')); -const isGuidelinesPopulated = - guidelines.conventions.coding_style.length > 0 || - guidelines.conventions.naming_patterns.length > 0 || - guidelines.constraints.architecture.length > 0 || - guidelines.constraints.security.length > 0; +// Check if specs have user content beyond seed documents +const specsList = Bash('ccw spec list --json'); +const specsCount = JSON.parse(specsList).total || 0; -// Only ask if guidelines are not yet populated -if (!isGuidelinesPopulated) { +// Only ask if specs are just seeds +if (specsCount <= 5) { const userChoice = AskUserQuestion({ questions: [{ - question: "Would you like to configure project guidelines now? The wizard will ask targeted questions based on your tech stack.", - header: "Guidelines", + question: "Would you like to configure project specs now? The wizard will ask targeted questions based on your tech stack.", + header: "Specs", multiSelect: false, options: [ { @@ -245,26 +221,26 @@ if (!isGuidelinesPopulated) { }, { label: "Skip for now", - description: "You can run /workflow:init-guidelines later or use /workflow:session:solidify to add rules individually" + description: "You can run /workflow:init-guidelines later or use ccw spec load to import specs" } ] }] }); - if (userChoice.answers["Guidelines"] === "Configure now (Recommended)") { - console.log("\n🔧 Starting guidelines configuration wizard...\n"); + if (userChoice.answers["Specs"] === "Configure now (Recommended)") { + console.log("\nStarting specs configuration wizard...\n"); Skill(skill="workflow:init-guidelines"); } else { console.log(` Next steps: -- Use /workflow:init-guidelines to configure guidelines interactively -- Use /workflow:session:solidify to add individual rules +- Use /workflow:init-guidelines to configure specs interactively +- Use ccw spec load to import specs from external sources - Use /workflow:plan to start planning `); } } else { console.log(` -Guidelines already configured (${guidelines.conventions.coding_style.length + guidelines.constraints.architecture.length}+ rules). +Specs already configured (${specsCount} spec files). Next steps: - Use /workflow:init-guidelines --reset to reconfigure diff --git a/.claude/commands/workflow/refactor-cycle.md b/.claude/commands/workflow/refactor-cycle.md index afb8df7b..a0f1cccf 100644 --- a/.claude/commands/workflow/refactor-cycle.md +++ b/.claude/commands/workflow/refactor-cycle.md @@ -843,7 +843,7 @@ AskUserQuestion({ ## Post-Completion Expansion -**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 project-guidelines + project-tech。 +**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 specs/*.md + project-tech。 完成后询问用户是否扩展为issue(test/enhance/refactor/doc),选中项调用 `/issue:new "{summary} - {dimension}"` diff --git a/.claude/commands/workflow/req-plan-with-file.md b/.claude/commands/workflow/req-plan-with-file.md index 44562491..68a58083 100644 --- a/.claude/commands/workflow/req-plan-with-file.md +++ b/.claude/commands/workflow/req-plan-with-file.md @@ -347,7 +347,7 @@ Bash(`mkdir -p ${sessionFolder}`) 1. Run: ccw tool exec get_modules_by_depth '{}' 2. Execute relevant searches based on requirement keywords 3. Read: .workflow/project-tech.json (if exists) - 4. Read: .workflow/project-guidelines.json (if exists) + 4. Read: .workflow/specs/*.md (if exists) ## Exploration Focus - Identify modules/components related to the requirement diff --git a/.claude/commands/workflow/session/complete.md b/.claude/commands/workflow/session/complete.md index 2d667108..e8ef3a84 100644 --- a/.claude/commands/workflow/session/complete.md +++ b/.claude/commands/workflow/session/complete.md @@ -111,7 +111,7 @@ rm -f .workflow/archives/$SESSION_ID/.archiving ### Phase 4: Auto-Sync Project State -Execute `/workflow:session:sync -y "{description}"` to update both `project-guidelines.json` and `project-tech.json` from session context. +Execute `/workflow:session:sync -y "{description}"` to update both `specs/*.md` and `project-tech.json` from session context. Description 取自 Phase 2 的 `workflow-session.json` description 字段。 @@ -135,5 +135,5 @@ When `--yes` or `-y` flag is used: Phase 1: find session → create .archiving marker Phase 2: read key files → build manifest entry (no writes) Phase 3: mkdir → mv → update manifest.json → rm marker -Phase 4: /workflow:session:sync -y → update project-guidelines + project-tech +Phase 4: /workflow:session:sync -y → update specs/*.md + project-tech ``` diff --git a/.claude/commands/workflow/session/solidify.md b/.claude/commands/workflow/session/solidify.md index c2a5b5cf..b5c781e1 100644 --- a/.claude/commands/workflow/session/solidify.md +++ b/.claude/commands/workflow/session/solidify.md @@ -18,7 +18,7 @@ When `--yes` or `-y`: Auto-categorize and add guideline without confirmation. ## Overview -Crystallizes ephemeral session context (insights, decisions, constraints) into permanent project guidelines stored in `.workflow/project-guidelines.json`. This ensures valuable learnings persist across sessions and inform future planning. +Crystallizes ephemeral session context (insights, decisions, constraints) into permanent project guidelines stored in `.workflow/specs/*.md`. This ensures valuable learnings persist across sessions and inform future planning. ## Use Cases @@ -113,34 +113,14 @@ ELSE (convention/constraint/learning): ### Step 1: Ensure Guidelines File Exists ```bash -bash(test -f .workflow/project-guidelines.json && echo "EXISTS" || echo "NOT_FOUND") +bash(test -f .workflow/specs/coding-conventions.md && echo "EXISTS" || echo "NOT_FOUND") ``` -**If NOT_FOUND**, create scaffold: +**If NOT_FOUND**, initialize spec system: -```javascript -const scaffold = { - conventions: { - coding_style: [], - naming_patterns: [], - file_structure: [], - documentation: [] - }, - constraints: { - architecture: [], - tech_stack: [], - performance: [], - security: [] - }, - quality_rules: [], - learnings: [], - _metadata: { - created_at: new Date().toISOString(), - version: "1.0.0" - } -}; - -Write('.workflow/project-guidelines.json', JSON.stringify(scaffold, null, 2)); +```bash +Bash('ccw spec init') +Bash('ccw spec rebuild') ``` ### Step 2: Auto-detect Type (if not specified) @@ -203,33 +183,40 @@ function buildEntry(rule, type, category, sessionId) { } ``` -### Step 4: Update Guidelines File +### Step 4: Update Spec Files ```javascript -const guidelines = JSON.parse(Read('.workflow/project-guidelines.json')); - -if (type === 'convention') { - if (!guidelines.conventions[category]) { - guidelines.conventions[category] = []; - } - if (!guidelines.conventions[category].includes(rule)) { - guidelines.conventions[category].push(rule); - } -} else if (type === 'constraint') { - if (!guidelines.constraints[category]) { - guidelines.constraints[category] = []; - } - if (!guidelines.constraints[category].includes(rule)) { - guidelines.constraints[category].push(rule); - } -} else if (type === 'learning') { - guidelines.learnings.push(buildEntry(rule, type, category, sessionId)); +// Map type+category to target spec file +const specFileMap = { + convention: '.workflow/specs/coding-conventions.md', + constraint: '.workflow/specs/architecture-constraints.md' } -guidelines._metadata.updated_at = new Date().toISOString(); -guidelines._metadata.last_solidified_by = sessionId; +if (type === 'convention' || type === 'constraint') { + const targetFile = specFileMap[type] + const existing = Read(targetFile) -Write('.workflow/project-guidelines.json', JSON.stringify(guidelines, null, 2)); + // Deduplicate: skip if rule text already exists in the file + if (!existing.includes(rule)) { + const ruleText = `- [${category}] ${rule}` + const newContent = existing.trimEnd() + '\n' + ruleText + '\n' + Write(targetFile, newContent) + } +} else if (type === 'learning') { + // Learnings go to coding-conventions.md as a special section + const targetFile = '.workflow/specs/coding-conventions.md' + const existing = Read(targetFile) + const entry = buildEntry(rule, type, category, sessionId) + const learningText = `- [learning/${category}] ${entry.insight} (${entry.date})` + + if (!existing.includes(entry.insight)) { + const newContent = existing.trimEnd() + '\n' + learningText + '\n' + Write(targetFile, newContent) + } +} + +// Rebuild spec index after modification +Bash('ccw spec rebuild') ``` ### Step 5: Display Confirmation @@ -241,7 +228,7 @@ Type: ${type} Category: ${category} Rule: "${rule}" -Location: .workflow/project-guidelines.json -> ${type}s.${category} +Location: .workflow/specs/*.md -> ${type}s.${category} Total ${type}s in ${category}: ${count} ``` @@ -386,7 +373,7 @@ AskUserQuestion({ /workflow:session:solidify "Use async/await instead of callbacks" --type convention --category coding_style ``` -Result in `project-guidelines.json`: +Result in `specs/*.md`: ```json { "conventions": { @@ -444,7 +431,7 @@ Result: Creates a new CMEM with consolidated content from the 10 most recent non ## Integration with Planning -The `project-guidelines.json` is consumed by: +The `specs/*.md` is consumed by: 1. **`workflow-plan` skill (context-gather phase)**: Loads guidelines into context-package.json 2. **`workflow-plan` skill**: Passes guidelines to task generation agent @@ -462,4 +449,4 @@ This ensures all future planning respects solidified rules without users needing - `/workflow:session:start` - Start a session (may prompt for solidify at end) - `/workflow:session:complete` - Complete session (prompts for learnings to solidify) -- `/workflow:init` - Creates project-guidelines.json scaffold if missing +- `/workflow:init` - Creates specs/*.md scaffold if missing diff --git a/.claude/commands/workflow/session/start.md b/.claude/commands/workflow/session/start.md index 4c856f1a..ca294e77 100644 --- a/.claude/commands/workflow/session/start.md +++ b/.claude/commands/workflow/session/start.md @@ -44,7 +44,7 @@ ERROR: Invalid session type. Valid types: workflow, review, tdd, test, docs ```bash # Check if project state exists (both files required) bash(test -f .workflow/project-tech.json && echo "TECH_EXISTS" || echo "TECH_NOT_FOUND") -bash(test -f .workflow/project-guidelines.json && echo "GUIDELINES_EXISTS" || echo "GUIDELINES_NOT_FOUND") +bash(test -f .workflow/specs/*.md && echo "GUIDELINES_EXISTS" || echo "GUIDELINES_NOT_FOUND") ``` **If either NOT_FOUND**, delegate to `/workflow:init`: @@ -53,14 +53,14 @@ bash(test -f .workflow/project-guidelines.json && echo "GUIDELINES_EXISTS" || ec Skill(skill="workflow:init"); // Wait for init completion -// project-tech.json and project-guidelines.json will be created +// project-tech.json and specs/*.md will be created ``` **Output**: - If BOTH_EXIST: `PROJECT_STATE: initialized` - If NOT_FOUND: Calls `/workflow:init` → creates: - `.workflow/project-tech.json` with full technical analysis - - `.workflow/project-guidelines.json` with empty scaffold + - `.workflow/specs/*.md` with empty scaffold **Note**: `/workflow:init` uses cli-explore-agent to build comprehensive project understanding (technology stack, architecture, key components). This step runs once per project. Subsequent executions skip initialization. diff --git a/.claude/commands/workflow/session/sync.md b/.claude/commands/workflow/session/sync.md index 37c5dd01..9f757e08 100644 --- a/.claude/commands/workflow/session/sync.md +++ b/.claude/commands/workflow/session/sync.md @@ -1,13 +1,13 @@ --- name: sync -description: Quick-sync session work to project-guidelines and project-tech +description: Quick-sync session work to specs/*.md and project-tech argument-hint: "[-y|--yes] [\"what was done\"]" allowed-tools: Bash(*), Read(*), Write(*), Edit(*) --- # Session Sync (/workflow:session:sync) -One-shot update `project-guidelines.json` + `project-tech.json` from current session context. +One-shot update `specs/*.md` + `project-tech.json` from current session context. **Design**: Scan context → extract → write. No interactive wizards. @@ -73,7 +73,8 @@ Analyze context and produce two update payloads. Use LLM reasoning (current agen // RULE: Only extract genuinely reusable insights. Skip trivial/obvious items. // RULE: Deduplicate against existing guidelines before adding. -const existingGuidelines = JSON.parse(Read('.workflow/project-guidelines.json')) +// Load existing specs via ccw spec load +const existingSpecs = Bash('ccw spec load --dimension specs 2>/dev/null || echo ""') const guidelineUpdates = [] // populated by agent analysis // ── Tech extraction ── @@ -123,7 +124,7 @@ Tech [${detectCategory(summary)}]: ${techEntry.title} Target files: - .workflow/project-guidelines.json + .workflow/specs/*.md .workflow/project-tech.json `) @@ -136,33 +137,31 @@ if (!autoYes) { ## Step 4: Write ```javascript -// ── Update project-guidelines.json ── +// ── Update specs/*.md ── if (guidelineUpdates.length > 0) { - const guidelines = JSON.parse(Read('.workflow/project-guidelines.json')) + // Map guideline types to spec files + const specFileMap = { + convention: '.workflow/specs/coding-conventions.md', + constraint: '.workflow/specs/architecture-constraints.md', + learning: '.workflow/specs/coding-conventions.md' // learnings appended to conventions + } for (const g of guidelineUpdates) { - if (g.type === 'learning') { - // Deduplicate by insight text - if (!guidelines.learnings.some(l => l.insight === g.text)) { - guidelines.learnings.push({ - date: new Date().toISOString().split('T')[0], - session_id: techEntry.session_id, - insight: g.text, - category: g.category - }) - } - } else { - // convention or constraint - const section = g.type === 'convention' ? 'conventions' : 'constraints' - if (!guidelines[section][g.category]) guidelines[section][g.category] = [] - if (!guidelines[section][g.category].includes(g.text)) { - guidelines[section][g.category].push(g.text) - } + const targetFile = specFileMap[g.type] + const existing = Read(targetFile) + const ruleText = g.type === 'learning' + ? `- [${g.category}] ${g.text} (learned: ${new Date().toISOString().split('T')[0]})` + : `- [${g.category}] ${g.text}` + + // Deduplicate: skip if text already in file + if (!existing.includes(g.text)) { + const newContent = existing.trimEnd() + '\n' + ruleText + '\n' + Write(targetFile, newContent) } } - guidelines._metadata.updated_at = new Date().toISOString() - Write('.workflow/project-guidelines.json', JSON.stringify(guidelines, null, 2)) + // Rebuild spec index after writing + Bash('ccw spec rebuild') } // ── Update project-tech.json ── diff --git a/.claude/commands/workflow/unified-execute-with-file.md b/.claude/commands/workflow/unified-execute-with-file.md index 67edf488..ce8705a3 100644 --- a/.claude/commands/workflow/unified-execute-with-file.md +++ b/.claude/commands/workflow/unified-execute-with-file.md @@ -476,9 +476,9 @@ ${recommendations.map(r => \`- ${r}\`).join('\\n')} // Read project-tech.json (if exists) const projectTech = file_exists('.workflow/project-tech.json') ? JSON.parse(Read('.workflow/project-tech.json')) : null - // Read project-guidelines.json (if exists) - const projectGuidelines = file_exists('.workflow/project-guidelines.json') - ? JSON.parse(Read('.workflow/project-guidelines.json')) : null + // Read specs/*.md (if exists) + const projectGuidelines = file_exists('.workflow/specs/*.md') + ? JSON.parse(Read('.workflow/specs/*.md')) : null ``` ```javascript diff --git a/.claude/skills/review-cycle/phases/review-fix.md b/.claude/skills/review-cycle/phases/review-fix.md index 78f2221c..9997e93c 100644 --- a/.claude/skills/review-cycle/phases/review-fix.md +++ b/.claude/skills/review-cycle/phases/review-fix.md @@ -736,7 +736,7 @@ TodoWrite({ ## Post-Completion Expansion -**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 project-guidelines + project-tech。 +**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 specs/*.md + project-tech。 完成后询问用户是否扩展为issue(test/enhance/refactor/doc),选中项调用 `/issue:new "{summary} - {dimension}"` diff --git a/.claude/skills/review-cycle/phases/review-module.md b/.claude/skills/review-cycle/phases/review-module.md index 423617b7..9fcc99e6 100644 --- a/.claude/skills/review-cycle/phases/review-module.md +++ b/.claude/skills/review-cycle/phases/review-module.md @@ -403,7 +403,7 @@ Task( 3. Validate file access: bash(ls -la ${targetFiles.join(' ')}) 4. Execute: cat ~/.ccw/workflows/cli-templates/schemas/review-dimension-results-schema.json (get output schema reference) 5. Read: .workflow/project-tech.json (technology stack and architecture context) - 6. Read: .workflow/project-guidelines.json (user-defined constraints and conventions to validate against) + 6. Read: .workflow/specs/*.md (user-defined constraints and conventions to validate against) ## Review Context - Review Type: module (independent) @@ -507,7 +507,7 @@ Task( 4. Read test files: bash(find ${projectDir}/tests -name "*${basename(file, '.ts')}*" -type f) 5. Execute: cat ~/.ccw/workflows/cli-templates/schemas/review-deep-dive-results-schema.json (get output schema reference) 6. Read: .workflow/project-tech.json (technology stack and architecture context) - 7. Read: .workflow/project-guidelines.json (user-defined constraints for remediation compliance) + 7. Read: .workflow/specs/*.md (user-defined constraints for remediation compliance) ## CLI Configuration - Tool Priority: gemini → qwen → codex diff --git a/.claude/skills/review-cycle/phases/review-session.md b/.claude/skills/review-cycle/phases/review-session.md index 7a861f94..03c6e041 100644 --- a/.claude/skills/review-cycle/phases/review-session.md +++ b/.claude/skills/review-cycle/phases/review-session.md @@ -414,7 +414,7 @@ Task( 4. Read review state: ${reviewStateJsonPath} 5. Execute: cat ~/.ccw/workflows/cli-templates/schemas/review-dimension-results-schema.json (get output schema reference) 6. Read: .workflow/project-tech.json (technology stack and architecture context) - 7. Read: .workflow/project-guidelines.json (user-defined constraints and conventions to validate against) + 7. Read: .workflow/specs/*.md (user-defined constraints and conventions to validate against) ## Session Context - Session ID: ${sessionId} @@ -518,7 +518,7 @@ Task( 4. Read test files: bash(find ${workflowDir}/tests -name "*${basename(file, '.ts')}*" -type f) 5. Execute: cat ~/.ccw/workflows/cli-templates/schemas/review-deep-dive-results-schema.json (get output schema reference) 6. Read: .workflow/project-tech.json (technology stack and architecture context) - 7. Read: .workflow/project-guidelines.json (user-defined constraints for remediation compliance) + 7. Read: .workflow/specs/*.md (user-defined constraints for remediation compliance) ## CLI Configuration - Tool Priority: gemini → qwen → codex diff --git a/.claude/skills/team-lifecycle-v3/SKILL.md b/.claude/skills/team-lifecycle-v3/SKILL.md index 708bc2cc..189b0fae 100644 --- a/.claude/skills/team-lifecycle-v3/SKILL.md +++ b/.claude/skills/team-lifecycle-v3/SKILL.md @@ -338,7 +338,8 @@ Session: │ ├── plan.json │ └── .task/TASK-*.json ├── explorations/ # Explorer output (cached) -├── architecture/ # Architect assessments +├── architecture/ # Architect assessments + design-tokens.json +├── analysis/ # analyst design-intelligence.json (UI mode) ├── qa/ # QA audit reports ├── wisdom/ # Cross-task knowledge │ ├── learnings.md diff --git a/.claude/skills/team-lifecycle-v3/roles/analyst/role.md b/.claude/skills/team-lifecycle-v3/roles/analyst/role.md index 52a3fa80..c73a857b 100644 --- a/.claude/skills/team-lifecycle-v3/roles/analyst/role.md +++ b/.claude/skills/team-lifecycle-v3/roles/analyst/role.md @@ -93,9 +93,14 @@ EXPECTED: JSON with: problem_statement, target_users[], domain, constraints[], e **discovery-context.json** → `/spec/discovery-context.json`: - session_id, phase=1, seed_analysis (all fields), codebase_context (or null), recommendations +**design-intelligence.json** → `/analysis/design-intelligence.json` (UI mode only): +- Produced when frontend keywords detected (component, page, UI, React, Vue, CSS, 前端) in seed_analysis +- Fields: industry, style_direction, ux_patterns, color_strategy, typography, component_patterns +- Consumed by architect (for design-tokens.json) and fe-developer + **Report**: complexity, codebase presence, problem statement, exploration dimensions, output paths. -**Success**: Both JSON files created, report sent. +**Success**: Both JSON files created; design-intelligence.json created if UI mode. --- diff --git a/.claude/skills/team-lifecycle-v3/roles/architect/role.md b/.claude/skills/team-lifecycle-v3/roles/architect/role.md index 26970159..a2cc6c5e 100644 --- a/.claude/skills/team-lifecycle-v3/roles/architect/role.md +++ b/.claude/skills/team-lifecycle-v3/roles/architect/role.md @@ -78,7 +78,11 @@ For complex questions → Gemini CLI with architecture review rule. Output to `/architecture/arch-.json`. Contribute decisions to wisdom/decisions.md. -**Report**: mode, verdict, concern count, recommendations, output path. +**Frontend project outputs** (when frontend tech stack detected in shared-memory or discovery-context): +- `/architecture/design-tokens.json` — color, spacing, typography, shadow tokens +- `/architecture/component-specs/*.md` — per-component design spec + +**Report**: mode, verdict, concern count, recommendations, output path(s). --- diff --git a/.claude/skills/team-lifecycle-v3/roles/discussant/role.md b/.claude/skills/team-lifecycle-v3/roles/discussant/role.md index 65720c62..0df0f144 100644 --- a/.claude/skills/team-lifecycle-v3/roles/discussant/role.md +++ b/.claude/skills/team-lifecycle-v3/roles/discussant/role.md @@ -105,6 +105,17 @@ Delegate to `commands/critique.md` -- launches parallel CLI calls per perspectiv Write discussion record to `/discussions/`. +**Output file naming convention**: + +| Round | Output File | +|-------|------------| +| DISCUSS-001 | discuss-001-scope.md | +| DISCUSS-002 | discuss-002-brief.md | +| DISCUSS-003 | discuss-003-requirements.md | +| DISCUSS-004 | discuss-004-architecture.md | +| DISCUSS-005 | discuss-005-epics.md | +| DISCUSS-006 | discuss-006-signoff.md | + --- ## Error Handling diff --git a/.claude/skills/team-lifecycle-v3/roles/reviewer/commands/spec-quality.md b/.claude/skills/team-lifecycle-v3/roles/reviewer/commands/spec-quality.md index 5172de88..3dfddc6f 100644 --- a/.claude/skills/team-lifecycle-v3/roles/reviewer/commands/spec-quality.md +++ b/.claude/skills/team-lifecycle-v3/roles/reviewer/commands/spec-quality.md @@ -15,14 +15,14 @@ **Spec document phases** (matched by filename/directory): -| Phase | Expected Path | -|-------|--------------| -| product-brief | spec/product-brief.md | -| prd | spec/requirements/*.md | -| architecture | spec/architecture/_index.md + ADR-*.md | -| user-stories | spec/epics/*.md | -| implementation-plan | plan/plan.json | -| test-strategy | spec/test-strategy.md | +| Phase | Expected Path | Required | +|-------|--------------|---------| +| product-brief | spec/product-brief.md | Yes | +| prd | spec/requirements/*.md | Yes | +| architecture | spec/architecture/_index.md + ADR-*.md | Yes | +| user-stories | spec/epics/*.md | Yes | +| implementation-plan | plan/plan.json | No (impl-only/full-lifecycle) | +| test-strategy | spec/test-strategy.md | No (optional, not generated by pipeline) | ## Phase 3: 5-Dimension Scoring @@ -51,7 +51,8 @@ Check each spec document for required sections. | architecture | System Overview, Component Design, Data Models, API Specifications, Technology Stack | | user-stories | Story List, Acceptance Criteria, Priority, Estimation | | implementation-plan | Task Breakdown, Dependencies, Timeline, Resource Allocation | -| test-strategy | Test Scope, Test Cases, Coverage Goals, Test Environment | + +> **Note**: `test-strategy` is optional — skip scoring if `spec/test-strategy.md` is absent. Do not penalize completeness score for missing optional phases. **Scoring formula**: - Section present: 50% credit diff --git a/.claude/skills/team-lifecycle-v3/specs/team-config.json b/.claude/skills/team-lifecycle-v3/specs/team-config.json index b2c2cb79..f0f6f941 100644 --- a/.claude/skills/team-lifecycle-v3/specs/team-config.json +++ b/.claude/skills/team-lifecycle-v3/specs/team-config.json @@ -150,6 +150,8 @@ "plan": "plan/", "explorations": "explorations/", "architecture": "architecture/", + "analysis": "analysis/", + "qa": "qa/", "wisdom": "wisdom/", "messages": ".msg/" } diff --git a/.claude/skills/team-planex/SKILL.md b/.claude/skills/team-planex/SKILL.md index efaf59cd..c852316a 100644 --- a/.claude/skills/team-planex/SKILL.md +++ b/.claude/skills/team-planex/SKILL.md @@ -213,6 +213,15 @@ Skill(skill="team-planex", args="-y --text '添加日志'") |---------|--------| | `check` / `status` | 输出执行状态图,不推进 | | `resume` / `continue` | 检查 worker 状态,推进下一步 | +| `add ` | 追加新任务到 planner 队列,不影响已有任务 | + +**`add` 命令处理逻辑**: + +1. 解析输入(Issue IDs / `--text` / `--plan`) +2. 获取当前最大 PLAN-* 序号(`TaskList` 筛选 `PLAN-*` prefix),计算下一个序号 N +3. `TaskCreate({ subject: "PLAN-00N: ...", owner: "planner", status: "pending" })`,description 写入新 issue IDs 或需求文本 +4. 若 planner 已发送 `all_planned`(检查 team_msg 日志),额外 `SendMessage` 通知 planner 有新任务,使其重新进入 Loop Check +5. 若 executor 已退出等待,同样发送消息唤醒 executor 继续轮询 `EXEC-*` 任务 ### Coordinator Spawn Template diff --git a/.claude/skills/workflow-execute/SKILL.md b/.claude/skills/workflow-execute/SKILL.md index 6e323e64..2103db2f 100644 --- a/.claude/skills/workflow-execute/SKILL.md +++ b/.claude/skills/workflow-execute/SKILL.md @@ -361,7 +361,7 @@ if (autoYes) { ### Post-Completion Expansion -**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 project-guidelines + project-tech。 +**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 specs/*.md + project-tech。 完成后询问用户是否扩展为issue(test/enhance/refactor/doc),选中项调用 `/issue:new "{summary} - {dimension}"` diff --git a/.claude/skills/workflow-execute/phases/06-review.md b/.claude/skills/workflow-execute/phases/06-review.md index 4df1dc80..91e772d5 100644 --- a/.claude/skills/workflow-execute/phases/06-review.md +++ b/.claude/skills/workflow-execute/phases/06-review.md @@ -96,7 +96,7 @@ rg "eval|exec|innerHTML|dangerouslySetInnerHTML" -g "*.{ts,js,tsx}" ccw cli -p " PURPOSE: Security audit of completed implementation TASK: Review code for security vulnerabilities, insecure patterns, auth/authz issues -CONTEXT: @.summaries/IMPL-*.md,../.. @../../project-tech.json @../../project-guidelines.json +CONTEXT: @.summaries/IMPL-*.md,../.. @../../project-tech.json @../../specs/*.md EXPECTED: Security findings report with severity levels RULES: Focus on OWASP Top 10, authentication, authorization, data validation, injection risks " --tool gemini --mode write --cd ${sessionPath} @@ -107,7 +107,7 @@ RULES: Focus on OWASP Top 10, authentication, authorization, data validation, in ccw cli -p " PURPOSE: Architecture compliance review TASK: Evaluate adherence to architectural patterns, identify technical debt, review design decisions -CONTEXT: @.summaries/IMPL-*.md,../.. @../../project-tech.json @../../project-guidelines.json +CONTEXT: @.summaries/IMPL-*.md,../.. @../../project-tech.json @../../specs/*.md EXPECTED: Architecture assessment with recommendations RULES: Check for patterns, separation of concerns, modularity, scalability " --tool qwen --mode write --cd ${sessionPath} @@ -118,7 +118,7 @@ RULES: Check for patterns, separation of concerns, modularity, scalability ccw cli -p " PURPOSE: Code quality and best practices review TASK: Assess code readability, maintainability, adherence to best practices -CONTEXT: @.summaries/IMPL-*.md,../.. @../../project-tech.json @../../project-guidelines.json +CONTEXT: @.summaries/IMPL-*.md,../.. @../../project-tech.json @../../specs/*.md EXPECTED: Quality assessment with improvement suggestions RULES: Check for code smells, duplication, complexity, naming conventions " --tool gemini --mode write --cd ${sessionPath} @@ -139,7 +139,7 @@ done ccw cli -p " PURPOSE: Verify all requirements and acceptance criteria are met TASK: Cross-check implementation summaries against original requirements -CONTEXT: @.task/IMPL-*.json,.summaries/IMPL-*.md,../.. @../../project-tech.json @../../project-guidelines.json +CONTEXT: @.task/IMPL-*.json,.summaries/IMPL-*.md,../.. @../../project-tech.json @../../specs/*.md EXPECTED: - Requirements coverage matrix - Acceptance criteria verification diff --git a/.claude/skills/workflow-lite-plan/SKILL.md b/.claude/skills/workflow-lite-plan/SKILL.md index e0508846..f6b990e2 100644 --- a/.claude/skills/workflow-lite-plan/SKILL.md +++ b/.claude/skills/workflow-lite-plan/SKILL.md @@ -126,26 +126,16 @@ if (autoYes) { After collecting preferences, enhance context and dispatch: ```javascript -// Step 0: Parse --from-analysis handoff (from analyze-with-file) -const fromAnalysisMatch = args.match(/--from-analysis\s+(\S+)/) -if (fromAnalysisMatch) { - const handoffPath = fromAnalysisMatch[1] - workflowPreferences.analysisHandoff = JSON.parse(Read(handoffPath)) - workflowPreferences.forceExplore = false - // Strip flag from args, keep task description - args = args.replace(/--from-analysis\s+\S+\s*/, '').trim() -} - // Step 1: Check for project context files const hasProjectTech = fileExists('.workflow/project-tech.json') -const hasProjectGuidelines = fileExists('.workflow/project-guidelines.json') +const hasProjectGuidelines = fileExists('.workflow/specs/*.md') // Step 2: Log available context if (hasProjectTech) { console.log('Project tech context available: .workflow/project-tech.json') } if (hasProjectGuidelines) { - console.log('Project guidelines available: .workflow/project-guidelines.json') + console.log('Project guidelines available: .workflow/specs/*.md') } // Step 3: Dispatch to phase (workflowPreferences available as context) diff --git a/.claude/skills/workflow-lite-plan/phases/01-lite-plan.md b/.claude/skills/workflow-lite-plan/phases/01-lite-plan.md index 15ed4247..889a8b98 100644 --- a/.claude/skills/workflow-lite-plan/phases/01-lite-plan.md +++ b/.claude/skills/workflow-lite-plan/phases/01-lite-plan.md @@ -106,36 +106,19 @@ bash(`mkdir -p ${sessionFolder} && test -d ${sessionFolder} && echo "SUCCESS: ${ **Exploration Decision Logic**: ```javascript -// Analysis handoff: reconstruct exploration from upstream analysis artifacts -if (workflowPreferences.analysisHandoff) { - const handoff = workflowPreferences.analysisHandoff - Write(`${sessionFolder}/exploration-from-analysis.json`, JSON.stringify({ - relevant_files: handoff.exploration_digest.relevant_files || [], - patterns: handoff.exploration_digest.patterns || [], - key_findings: handoff.exploration_digest.key_findings || [], - clarification_needs: [], // analysis already did multi-round discussion - _metadata: { exploration_angle: "from-analysis", source_session: handoff.source_session, reconstructed: true } - }, null, 2)) - Write(`${sessionFolder}/explorations-manifest.json`, JSON.stringify({ - session_id: sessionId, task_description: task_description, timestamp: getUtc8ISOString(), - complexity: complexity, exploration_count: 1, from_analysis: handoff.source_session, - explorations: [{ angle: "from-analysis", file: "exploration-from-analysis.json", - path: `${sessionFolder}/exploration-from-analysis.json`, index: 1 }] - }, null, 2)) - needsExploration = false - // clarification_needs=[] → Phase 2 naturally skipped → proceed to Phase 3 -} +// Check if task description already contains prior analysis context (from analyze-with-file) +const hasPriorAnalysis = /##\s*Prior Analysis/i.test(task_description) -needsExploration = needsExploration ?? ( - workflowPreferences.forceExplore || - task.mentions_specific_files || - task.requires_codebase_context || - task.needs_architecture_understanding || - task.modifies_existing_code -) +needsExploration = workflowPreferences.forceExplore ? true + : hasPriorAnalysis ? false + : (task.mentions_specific_files || + task.requires_codebase_context || + task.needs_architecture_understanding || + task.modifies_existing_code) if (!needsExploration) { - // Skip to Phase 2 (Clarification) or Phase 3 (Planning) + // Skip exploration — analysis context already in task description (or not needed) + // manifest is absent; Phase 3 loads it with safe fallback proceed_to_next_phase() } ``` @@ -185,12 +168,12 @@ const selectedAngles = selectAngles(task_description, complexity === 'High' ? 4 // Planning strategy determination // Agent trigger: anything beyond trivial single-file change -// - analysisHandoff → always agent (analysis validated non-trivial task) +// - hasPriorAnalysis → always agent (analysis validated non-trivial task) // - multi-angle exploration → agent (complexity warranted multiple angles) // - Medium/High complexity → agent // Direct Claude planning ONLY for truly trivial Low + no analysis + single angle const planningStrategy = ( - complexity === 'Low' && !workflowPreferences.analysisHandoff && selectedAngles.length <= 1 + complexity === 'Low' && !hasPriorAnalysis && selectedAngles.length <= 1 ) ? 'Direct Claude Planning' : 'cli-lite-planning-agent' @@ -233,7 +216,7 @@ Execute **${angle}** exploration for task planning context. Analyze codebase fro - **Exploration Index**: ${index + 1} of ${selectedAngles.length} ## Agent Initialization -cli-explore-agent autonomously handles: project structure discovery, schema loading, project context loading (project-tech.json, project-guidelines.json), and keyword search. These steps execute automatically. +cli-explore-agent autonomously handles: project structure discovery, schema loading, project context loading (project-tech.json, specs/*.md), and keyword search. These steps execute automatically. ## Exploration Strategy (${angle} focus) @@ -338,8 +321,10 @@ Angles explored: ${explorationManifest.explorations.map(e => e.angle).join(', ') **Aggregate clarification needs from all exploration angles**: ```javascript -// Load manifest and all exploration files -const manifest = JSON.parse(Read(`${sessionFolder}/explorations-manifest.json`)) +// Load manifest and all exploration files (may not exist if exploration was skipped) +const manifest = file_exists(`${sessionFolder}/explorations-manifest.json`) + ? JSON.parse(Read(`${sessionFolder}/explorations-manifest.json`)) + : { exploration_count: 0, explorations: [] } const explorations = manifest.explorations.map(exp => ({ angle: exp.angle, data: JSON.parse(Read(exp.path)) @@ -432,8 +417,10 @@ taskFiles.forEach(taskPath => { // Step 1: Read schema const schema = Bash(`cat ~/.ccw/workflows/cli-templates/schemas/plan-overview-base-schema.json`) -// Step 2: ⚠️ MANDATORY - Read and review ALL exploration files -const manifest = JSON.parse(Read(`${sessionFolder}/explorations-manifest.json`)) +// Step 2: Read exploration files if available +const manifest = file_exists(`${sessionFolder}/explorations-manifest.json`) + ? JSON.parse(Read(`${sessionFolder}/explorations-manifest.json`)) + : { explorations: [] } manifest.explorations.forEach(exp => { const explorationData = Read(exp.path) console.log(`\n### Exploration: ${exp.angle}\n${explorationData}`) @@ -509,9 +496,9 @@ Execute: cat ~/.ccw/workflows/cli-templates/schemas/plan-overview-base-schema.js ## Project Context (MANDATORY - Read Both Files) 1. Read: .workflow/project-tech.json (technology stack, architecture, key components) -2. Read: .workflow/project-guidelines.json (user-defined constraints and conventions) +2. Read: .workflow/specs/*.md (user-defined constraints and conventions) -**CRITICAL**: All generated tasks MUST comply with constraints in project-guidelines.json +**CRITICAL**: All generated tasks MUST comply with constraints in specs/*.md ## Task Description ${task_description} @@ -669,8 +656,10 @@ if (autoYes) { **Step 5.1: Build executionContext** ```javascript -// Load manifest and all exploration files -const manifest = JSON.parse(Read(`${sessionFolder}/explorations-manifest.json`)) +// Load manifest and all exploration files (may not exist if exploration was skipped) +const manifest = file_exists(`${sessionFolder}/explorations-manifest.json`) + ? JSON.parse(Read(`${sessionFolder}/explorations-manifest.json`)) + : { exploration_count: 0, explorations: [] } const explorations = {} manifest.explorations.forEach(exp => { diff --git a/.claude/skills/workflow-lite-plan/phases/02-lite-execute.md b/.claude/skills/workflow-lite-plan/phases/02-lite-execute.md index e21c81a5..a9176452 100644 --- a/.claude/skills/workflow-lite-plan/phases/02-lite-execute.md +++ b/.claude/skills/workflow-lite-plan/phases/02-lite-execute.md @@ -485,7 +485,7 @@ ${(t.test?.success_metrics || []).length > 0 ? `\n**Success metrics**: ${t.test. context.push(`### Artifacts\nPlan: ${executionContext.session.artifacts.plan}`) } // Project guidelines (user-defined constraints from /workflow:session:solidify) - context.push(`### Project Guidelines\n@.workflow/project-guidelines.json`) + context.push(`### Project Guidelines\n@.workflow/specs/*.md`) if (context.length > 0) sections.push(`## Context\n${context.join('\n\n')}`) sections.push(`Complete each task according to its "Done when" checklist.`) @@ -672,7 +672,7 @@ if (hasUnresolvedIssues(reviewResult)) { **Trigger**: After all executions complete (regardless of code review) -**Operation**: Execute `/workflow:session:sync -y "{summary}"` to update both `project-guidelines.json` and `project-tech.json` in one shot. +**Operation**: Execute `/workflow:session:sync -y "{summary}"` to update both `specs/*.md` and `project-tech.json` in one shot. Summary 取值优先级:`originalUserInput` → `planObject.summary` → git log 自动推断。 @@ -767,7 +767,7 @@ Appended to `previousExecutionResults` array for context continuity in multi-exe ## Post-Completion Expansion -**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 project-guidelines + project-tech(Step 6 已触发,此处不重复)。 +**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 specs/*.md + project-tech(Step 6 已触发,此处不重复)。 完成后询问用户是否扩展为issue(test/enhance/refactor/doc),选中项调用 `/issue:new "{summary} - {dimension}"` diff --git a/.claude/skills/workflow-multi-cli-plan/SKILL.md b/.claude/skills/workflow-multi-cli-plan/SKILL.md index d9b959a9..189544d0 100644 --- a/.claude/skills/workflow-multi-cli-plan/SKILL.md +++ b/.claude/skills/workflow-multi-cli-plan/SKILL.md @@ -102,14 +102,14 @@ After collecting preferences, enhance context and dispatch: ```javascript // Step 1: Check for project context files const hasProjectTech = fileExists('.workflow/project-tech.json') -const hasProjectGuidelines = fileExists('.workflow/project-guidelines.json') +const hasProjectGuidelines = fileExists('.workflow/specs/*.md') // Step 2: Log available context if (hasProjectTech) { console.log('Project tech context available: .workflow/project-tech.json') } if (hasProjectGuidelines) { - console.log('Project guidelines available: .workflow/project-guidelines.json') + console.log('Project guidelines available: .workflow/specs/*.md') } // Step 3: Dispatch to phase (workflowPreferences available as context) diff --git a/.claude/skills/workflow-multi-cli-plan/phases/01-multi-cli-plan.md b/.claude/skills/workflow-multi-cli-plan/phases/01-multi-cli-plan.md index 3781a1f6..8b0e9e00 100644 --- a/.claude/skills/workflow-multi-cli-plan/phases/01-multi-cli-plan.md +++ b/.claude/skills/workflow-multi-cli-plan/phases/01-multi-cli-plan.md @@ -373,7 +373,7 @@ ${JSON.stringify(contextPackage, null, 2)} ## Execution Process 1. Read plan-overview-base-schema.json + task-schema.json for output structure -2. Read project-tech.json and project-guidelines.json +2. Read project-tech.json and specs/*.md 3. Parse context-package fields: - solution: name, feasibility, summary - implementation_plan: tasks[], execution_flow, milestones diff --git a/.claude/skills/workflow-multi-cli-plan/phases/02-lite-execute.md b/.claude/skills/workflow-multi-cli-plan/phases/02-lite-execute.md index a55dc98f..a0b51360 100644 --- a/.claude/skills/workflow-multi-cli-plan/phases/02-lite-execute.md +++ b/.claude/skills/workflow-multi-cli-plan/phases/02-lite-execute.md @@ -487,7 +487,7 @@ ${(t.test?.success_metrics || []).length > 0 ? `\n**Success metrics**: ${t.test. context.push(`### Artifacts\nPlan: ${executionContext.session.artifacts.plan}`) } // Project guidelines (user-defined constraints from /workflow:session:solidify) - context.push(`### Project Guidelines\n@.workflow/project-guidelines.json`) + context.push(`### Project Guidelines\n@.workflow/specs/*.md`) if (context.length > 0) sections.push(`## Context\n${context.join('\n\n')}`) sections.push(`Complete each task according to its "Done when" checklist.`) @@ -672,7 +672,7 @@ if (hasUnresolvedIssues(reviewResult)) { **Trigger**: After all executions complete (regardless of code review) -**Operation**: Execute `/workflow:session:sync -y "{summary}"` to update both `project-guidelines.json` and `project-tech.json` in one shot. +**Operation**: Execute `/workflow:session:sync -y "{summary}"` to update both `specs/*.md` and `project-tech.json` in one shot. Summary 取值优先级:`originalUserInput` → `planObject.summary` → git log 自动推断。 @@ -767,7 +767,7 @@ Appended to `previousExecutionResults` array for context continuity in multi-exe ## Post-Completion Expansion -**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 project-guidelines + project-tech(Step 6 已触发,此处不重复)。 +**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 specs/*.md + project-tech(Step 6 已触发,此处不重复)。 完成后询问用户是否扩展为issue(test/enhance/refactor/doc),选中项调用 `/issue:new "{summary} - {dimension}"` diff --git a/.claude/skills/workflow-plan/phases/02-context-gathering.md b/.claude/skills/workflow-plan/phases/02-context-gathering.md index cc9787f6..f38b8b18 100644 --- a/.claude/skills/workflow-plan/phases/02-context-gathering.md +++ b/.claude/skills/workflow-plan/phases/02-context-gathering.md @@ -203,10 +203,10 @@ This is the PRIMARY context source - all subsequent analysis must align with use Execute complete context-search-agent workflow (Phase 1-3) for implementation planning. Key emphasis: -- Load project-tech.json and project-guidelines.json FIRST (per your spec Phase 1.1b) +- Load project-tech.json and specs/*.md FIRST (per your spec Phase 1.1b) - Synthesize exploration results with project context - Generate prioritized_context with user_intent alignment -- Apply project-guidelines.json constraints during conflict detection +- Apply specs/*.md constraints during conflict detection Input priority: User Intent > project-tech.json > Exploration results > Code discovery > Web examples diff --git a/.claude/skills/workflow-plan/phases/04-task-generation.md b/.claude/skills/workflow-plan/phases/04-task-generation.md index 184bc1af..57cdaaaf 100644 --- a/.claude/skills/workflow-plan/phases/04-task-generation.md +++ b/.claude/skills/workflow-plan/phases/04-task-generation.md @@ -178,13 +178,13 @@ These files provide project-level constraints that apply to ALL tasks: - Usage: Populate plan.json shared_context, align task tech choices, set correct test commands - If missing: Fall back to context-package.project_context -2. **.workflow/project-guidelines.json** (user-maintained rules and constraints) +2. **.workflow/specs/*.md** (user-maintained rules and constraints) - Contains: coding_conventions, naming_rules, forbidden_patterns, quality_gates, custom_constraints - Usage: Apply as HARD CONSTRAINTS on all generated tasks — task implementation steps, acceptance criteria, and convergence.verification MUST respect these guidelines - If empty/missing: No additional constraints (proceed normally) -Loading order: project-tech.json → project-guidelines.json → planning-notes.md → context-package.json +Loading order: project-tech.json → specs/*.md → planning-notes.md → context-package.json ## USER CONFIGURATION (from Step 4.0) Execution Method: ${userConfig.executionMethod} // agent|hybrid|cli diff --git a/.claude/skills/workflow-tdd/phases/02-context-gathering.md b/.claude/skills/workflow-tdd/phases/02-context-gathering.md index ec87932b..db9b85df 100644 --- a/.claude/skills/workflow-tdd/phases/02-context-gathering.md +++ b/.claude/skills/workflow-tdd/phases/02-context-gathering.md @@ -222,7 +222,7 @@ Execute complete context-search-agent workflow for TDD implementation planning: ### Phase 1: Initialization & Pre-Analysis 1. **Project State Loading**: - Read and parse .workflow/project-tech.json. Use its overview section as the foundational project_context. - - Read and parse .workflow/project-guidelines.json. Load conventions, constraints, and learnings into a project_guidelines section. + - Read and parse .workflow/specs/*.md. Load conventions, constraints, and learnings into a project_guidelines section. - If files don't exist, proceed with fresh analysis. 2. **Detection**: Check for existing context-package (early exit if valid) 3. **Foundation**: Initialize CodexLens, get project structure, load docs @@ -257,7 +257,7 @@ Execute all discovery tracks (WITH USER INTENT INTEGRATION): c. Generate dependency_order: Based on dependency graph + user goal sequence d. Document sorting_rationale: Explain prioritization logic 4. **Populate project_context**: Directly use the overview from project-tech.json -5. **Populate project_guidelines**: Load from project-guidelines.json +5. **Populate project_guidelines**: Load from specs/*.md 6. Integrate brainstorm artifacts (if .brainstorming/ exists, read content) 7. Perform conflict detection with risk assessment 8. **Inject historical conflicts** from archive analysis into conflict_detection @@ -279,7 +279,7 @@ Execute all discovery tracks (WITH USER INTENT INTEGRATION): Complete context-package.json with: - **metadata**: task_description, keywords, complexity, tech_stack, session_id - **project_context**: description, technology_stack, architecture, key_components (from project-tech.json) -- **project_guidelines**: {conventions, constraints, quality_rules, learnings} (from project-guidelines.json) +- **project_guidelines**: {conventions, constraints, quality_rules, learnings} (from specs/*.md) - **assets**: {documentation[], source_code[], config[], tests[]} with relevance scores - **dependencies**: {internal[], external[]} with dependency graph - **brainstorm_artifacts**: {guidance_specification, role_analyses[], synthesis_output} with content diff --git a/.claude/skills/workflow-tdd/phases/05-tdd-task-generation.md b/.claude/skills/workflow-tdd/phases/05-tdd-task-generation.md index 870c5617..dbec10a3 100644 --- a/.claude/skills/workflow-tdd/phases/05-tdd-task-generation.md +++ b/.claude/skills/workflow-tdd/phases/05-tdd-task-generation.md @@ -236,13 +236,13 @@ These files provide project-level constraints that apply to ALL tasks: - Usage: Populate plan.json shared_context, align task tech choices, set correct test commands - If missing: Fall back to context-package.project_context -2. **.workflow/project-guidelines.json** (user-maintained rules and constraints) +2. **.workflow/specs/*.md** (user-maintained rules and constraints) - Contains: coding_conventions, naming_rules, forbidden_patterns, quality_gates, custom_constraints - Usage: Apply as HARD CONSTRAINTS on all generated tasks — task implementation steps, acceptance criteria, and convergence.verification MUST respect these guidelines - If empty/missing: No additional constraints (proceed normally) -Loading order: project-tech.json → project-guidelines.json → planning-notes.md → context-package.json +Loading order: project-tech.json → specs/*.md → planning-notes.md → context-package.json ## USER CONFIGURATION (from Phase 0) Execution Method: ${userConfig.executionMethod} // agent|hybrid|cli diff --git a/.claude/skills/workflow-test-fix/SKILL.md b/.claude/skills/workflow-test-fix/SKILL.md index 54976397..d004d378 100644 --- a/.claude/skills/workflow-test-fix/SKILL.md +++ b/.claude/skills/workflow-test-fix/SKILL.md @@ -396,7 +396,7 @@ Automatic commits at key checkpoints: ## Post-Completion Expansion -**Auto-sync**: Execute `/workflow:session:sync -y "{summary}"` to update project-guidelines + project-tech. +**Auto-sync**: Execute `/workflow:session:sync -y "{summary}"` to update specs/*.md + project-tech. After completion, ask user if they want to expand into issues (test/enhance/refactor/doc). Selected items call `/issue:new "{summary} - {dimension}"`. diff --git a/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md b/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md index 39cdc2f2..28534cd5 100644 --- a/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +++ b/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md @@ -346,7 +346,7 @@ Execute complete context-search-agent workflow for implementation planning: ### Phase 1: Initialization & Pre-Analysis 1. **Project State Loading**: - Read and parse .workflow/project-tech.json. Use its overview section as the foundational project_context. - - Read and parse .workflow/project-guidelines.json. Load conventions, constraints, and learnings into a project_guidelines section. + - Read and parse .workflow/specs/*.md. Load conventions, constraints, and learnings into a project_guidelines section. - If files don't exist, proceed with fresh analysis. 2. **Detection**: Check for existing context-package (early exit if valid) 3. **Foundation**: Initialize CodexLens, get project structure, load docs @@ -381,7 +381,7 @@ Execute all discovery tracks (WITH USER INTENT INTEGRATION): c. Generate dependency_order: Based on dependency graph + user goal sequence d. Document sorting_rationale: Explain prioritization logic 4. **Populate project_context**: Directly use the overview from project-tech.json -5. **Populate project_guidelines**: Load from project-guidelines.json +5. **Populate project_guidelines**: Load from specs/*.md 6. Integrate brainstorm artifacts (if .brainstorming/ exists, read content) 7. Perform conflict detection with risk assessment 8. **Inject historical conflicts** from archive analysis into conflict_detection @@ -403,7 +403,7 @@ Execute all discovery tracks (WITH USER INTENT INTEGRATION): Complete context-package.json with: - **metadata**: task_description, keywords, complexity, tech_stack, session_id - **project_context**: description, technology_stack, architecture, key_components (from project-tech.json) -- **project_guidelines**: {conventions, constraints, quality_rules, learnings} (from project-guidelines.json) +- **project_guidelines**: {conventions, constraints, quality_rules, learnings} (from specs/*.md) - **assets**: {documentation[], source_code[], config[], tests[]} with relevance scores - **dependencies**: {internal[], external[]} with dependency graph - **brainstorm_artifacts**: {guidance_specification, role_analyses[], synthesis_output} with content diff --git a/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md b/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md index 041c62f1..85dc4c78 100644 --- a/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +++ b/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md @@ -245,7 +245,7 @@ Task( ## PROJECT CONTEXT (MANDATORY) 1. Read: .workflow/project-tech.json (tech stack, test framework, build system) - 2. Read: .workflow/project-guidelines.json (constraints — apply as HARD CONSTRAINTS on fixes) + 2. Read: .workflow/specs/*.md (constraints — apply as HARD CONSTRAINTS on fixes) ## MANDATORY FIRST STEPS 1. Read test results: ${session.test_results_path} @@ -454,7 +454,7 @@ The orchestrator automatically creates git commits at key checkpoints to enable #### Post-Completion Expansion -**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 project-guidelines + project-tech。 +**Auto-sync**: 执行 `/workflow:session:sync -y "{summary}"` 更新 specs/*.md + project-tech。 完成后询问用户是否扩展为issue(test/enhance/refactor/doc),选中项调用 `/issue:new "{summary} - {dimension}"` diff --git a/.codex/agents/cli-lite-planning-agent.md b/.codex/agents/cli-lite-planning-agent.md index e6c3827b..02b64020 100644 --- a/.codex/agents/cli-lite-planning-agent.md +++ b/.codex/agents/cli-lite-planning-agent.md @@ -148,7 +148,7 @@ Phase 5: Plan Quality Check (MANDATORY) │ ├─ Dependency correctness (no circular deps, proper ordering) │ ├─ Acceptance criteria quality (quantified, testable) │ ├─ Implementation steps sufficiency (2+ steps per task) -│ └─ Constraint compliance (follows project-guidelines.json) +│ └─ Constraint compliance (follows specs/*.md) ├─ Parse check results and categorize issues └─ Decision: ├─ No issues → Return plan to orchestrator @@ -848,7 +848,7 @@ After generating plan.json, **MUST** execute CLI quality check before returning | **Dependencies** | No circular deps, correct ordering | Yes | | **Acceptance Criteria** | Quantified and testable (not vague) | No | | **Implementation Steps** | 2+ actionable steps per task | No | -| **Constraint Compliance** | Follows project-guidelines.json | Yes | +| **Constraint Compliance** | Follows specs/*.md | Yes | ### CLI Command Format @@ -857,7 +857,7 @@ Use `ccw cli` with analysis mode to validate plan against quality dimensions: ```bash ccw cli -p "Validate plan quality: completeness, granularity, dependencies, acceptance criteria, implementation steps, constraint compliance" \ --tool gemini --mode analysis \ - --context "@{plan_json_path} @.workflow/project-guidelines.json" + --context "@{plan_json_path} @.workflow/specs/*.md" ``` **Expected Output Structure**: diff --git a/.codex/prompts/prep-cycle.md b/.codex/prompts/prep-cycle.md index 0ffd20fa..d7b73e1f 100644 --- a/.codex/prompts/prep-cycle.md +++ b/.codex/prompts/prep-cycle.md @@ -23,8 +23,8 @@ Check these items. Report results as a checklist. - **project-tech.json**: Check `{projectRoot}/.workflow/project-tech.json` - If missing: Read `package.json` / `tsconfig.json` / `pyproject.toml` and generate a minimal version. Ask user: "检测到项目使用 [tech stack], 是否正确?需要补充什么?" -- **project-guidelines.json**: Check `{projectRoot}/.workflow/project-guidelines.json` - - If missing: Scan for `.eslintrc`, `.prettierrc`, `ruff.toml` etc. Ask user: "未找到 project-guidelines.json, 是否有特定的编码规范需要遵循?" +- **specs/*.md**: Check `{projectRoot}/.workflow/specs/*.md` + - If missing: Scan for `.eslintrc`, `.prettierrc`, `ruff.toml` etc. Ask user: "未找到 specs/*.md, 是否有特定的编码规范需要遵循?" - **Test framework**: Detect from config files (jest.config, vitest.config, pytest.ini, etc.) - If missing: Ask user: "未检测到测试框架配置,请指定测试命令(如 `npm test`, `pytest`),或输入 'skip' 跳过测试验证" @@ -39,7 +39,7 @@ Print formatted checklist: ✓ 工作空间: .workflow/.cycle/ 就绪 ⚠ Git: 3 个未提交变更 ✓ project-tech.json: 已检测 (Express + TypeORM + PostgreSQL) -⚠ project-guidelines.json: 未找到 (已跳过) +⚠ specs/*.md: 未找到 (已跳过) ✓ 测试框架: jest (npm test) ``` @@ -173,7 +173,7 @@ Read the user's `$TASK` and score each dimension: For dimensions still at score 1 after Q&A, auto-enhance from codebase: - **Scope**: Use `Glob` and `Grep` to find related files, list them - **Context**: Read `project-tech.json` and key config files -- **Constraints**: Infer from `project-guidelines.json` and existing patterns +- **Constraints**: Infer from `specs/*.md` and existing patterns ### 2.5 Assemble Refined Task diff --git a/.codex/prompts/prep-plan.md b/.codex/prompts/prep-plan.md index 056dc875..74a46a35 100644 --- a/.codex/prompts/prep-plan.md +++ b/.codex/prompts/prep-plan.md @@ -23,7 +23,7 @@ Check these items. Report results as a checklist. - **project-tech.json**: Check `{projectRoot}/.workflow/project-tech.json` - If missing: WARN — Phase 1 will call `workflow:init` to generate it. Ask user: "检测到项目使用 [tech stack from package.json], 是否正确?需要补充什么?" -- **project-guidelines.json**: Check `{projectRoot}/.workflow/project-guidelines.json` +- **specs/*.md**: Check `{projectRoot}/.workflow/specs/*.md` - If missing: WARN — will be generated as empty scaffold. Ask: "有特定的编码规范需要遵循吗?" - **Test framework**: Detect from config files (jest.config, vitest.config, pytest.ini, etc.) - If missing: Ask: "未检测到测试框架,请指定测试命令(如 `npm test`),或输入 'skip' 跳过" @@ -39,7 +39,7 @@ Print formatted checklist: ✓ .workflow/ 目录就绪 ⚠ Git: 3 个未提交变更 ✓ project-tech.json: 已检测 (Express + TypeORM + PostgreSQL) -⚠ project-guidelines.json: 未找到 (Phase 1 将生成空模板) +⚠ specs/*.md: 未找到 (Phase 1 将生成空模板) ✓ 测试框架: jest (npm test) ``` @@ -163,7 +163,7 @@ Each dimension scores 0-2 (0=missing, 1=vague, 2=clear). **Total minimum: 6/10 t For dimensions still at score 1 after Q&A, auto-enhance from codebase: - **Scope**: Use `Glob` and `Grep` to find related files - **Context**: Read `project-tech.json` and key config files -- **Constraints**: Infer from `project-guidelines.json` +- **Constraints**: Infer from `specs/*.md` ### 2.5 Assemble Structured Description diff --git a/.codex/skills/analyze-with-file/SKILL.md b/.codex/skills/analyze-with-file/SKILL.md index 41e3e1b1..7cac83ee 100644 --- a/.codex/skills/analyze-with-file/SKILL.md +++ b/.codex/skills/analyze-with-file/SKILL.md @@ -85,7 +85,7 @@ Step 1: Topic Understanding Step 2: Exploration (Inline, No Agents) ├─ Detect codebase → search relevant modules, patterns - │ ├─ Read project-tech.json / project-guidelines.json (if exists) + │ ├─ Read project-tech.json / specs/*.md (if exists) │ └─ Use Grep, Glob, Read, mcp__ace-tool__search_context ├─ Multi-perspective analysis (if selected, serial) │ ├─ Single: Comprehensive analysis @@ -298,7 +298,7 @@ const hasCodebase = Bash(` if (hasCodebase !== 'none') { // 1. Read project metadata (if exists) // - .workflow/project-tech.json (tech stack info) - // - .workflow/project-guidelines.json (project conventions) + // - .workflow/specs/*.md (project conventions) // 2. Search codebase for relevant content // Use: Grep, Glob, Read, or mcp__ace-tool__search_context diff --git a/.codex/skills/brainstorm-with-file/SKILL.md b/.codex/skills/brainstorm-with-file/SKILL.md index 93b6cb19..d2994694 100644 --- a/.codex/skills/brainstorm-with-file/SKILL.md +++ b/.codex/skills/brainstorm-with-file/SKILL.md @@ -359,7 +359,7 @@ const agentIds = perspectives.map(perspective => { ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/cli-explore-agent.md (MUST read first) 2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json +3. Read: ${projectRoot}/.workflow/specs/*.md --- diff --git a/.codex/skills/collaborative-plan-with-file/SKILL.md b/.codex/skills/collaborative-plan-with-file/SKILL.md index ac54b963..0ce3f772 100644 --- a/.codex/skills/collaborative-plan-with-file/SKILL.md +++ b/.codex/skills/collaborative-plan-with-file/SKILL.md @@ -194,7 +194,7 @@ Use built-in tools directly to understand the task scope and identify sub-domain **Analysis Activities**: 1. **Search for references** — Find related documentation, README files, and architecture guides - Use: `mcp__ace-tool__search_context`, Grep, Glob, Read - - Read: `.workflow/project-tech.json`, `.workflow/project-guidelines.json` (if exists) + - Read: `.workflow/project-tech.json`, `.workflow/specs/*.md` (if exists) 2. **Extract task keywords** — Identify key terms and concepts from the task description 3. **Identify ambiguities** — List any unclear points or multiple possible interpretations 4. **Clarify with user** — If ambiguities found, use AskUserQuestion for clarification diff --git a/.codex/skills/issue-devpipeline/SKILL.md b/.codex/skills/issue-devpipeline/SKILL.md deleted file mode 100644 index 853e1cbd..00000000 --- a/.codex/skills/issue-devpipeline/SKILL.md +++ /dev/null @@ -1,378 +0,0 @@ ---- -name: issue-devpipeline -description: | - Plan-and-Execute pipeline with per-issue beat pattern. - Orchestrator coordinates planner (Deep Interaction) and executors (Parallel Fan-out). - Planner outputs per-issue solutions, executors implement solutions concurrently. -agents: 3 -phases: 4 ---- - -# Issue DevPipeline - -边规划边执行流水线。编排器通过逐 Issue 节拍流水线协调 planner 和 executor(s):planner 每完成一个 issue 的规划后立即输出,编排器即时为该 issue 派发 executor agent,同时 planner 继续规划下一 issue。 - -## Architecture Overview - -``` -┌─────────────────────────────────────────────────────────────┐ -│ Orchestrator (this file) │ -│ → Parse input → Manage planner → Dispatch executors │ -└───────────┬──────────────────────────────────────┬──────────┘ - │ │ - ┌──────┴──────┐ ┌──────────┴──────────┐ - │ Planner │ │ Executors (N) │ - │ (Deep │ │ (Parallel Fan-out) │ - │ Interaction│ │ │ - │ per-issue) │ │ exec-1 exec-2 ... │ - └──────┬──────┘ └──────────┬──────────┘ - │ │ - ┌──────┴──────┐ ┌──────────┴──────────┐ - │ issue-plan │ │ code-developer │ - │ (existing) │ │ (role reference) │ - └─────────────┘ └─────────────────────┘ -``` - -**Per-Issue Beat Pipeline Flow**: -``` -Planner → Issue 1 solution → ISSUE_READY - ↓ (spawn executor for issue 1) - ↓ send_input → Planner → Issue 2 solution → ISSUE_READY - ↓ (spawn executor for issue 2) - ... - ↓ Planner outputs "all_planned" - ↓ wait for all executor agents - ↓ Aggregate results → Done -``` - -## Agent Registry - -| Agent | Role File | Responsibility | New/Existing | -|-------|-----------|----------------|--------------| -| `planex-planner` | `~/.codex/agents/planex-planner.md` | 需求拆解 → issue 创建 → 方案设计 → 冲突检查 → 逐 issue 输出 | New | -| `planex-executor` | `~/.codex/agents/planex-executor.md` | 加载 solution → 代码实现 → 测试 → 提交 | New | -| `issue-plan-agent` | `~/.codex/agents/issue-plan-agent.md` | Closed-loop: ACE 探索 + solution 生成 | Existing | - -## Input Types - -支持 3 种输入方式(通过 orchestrator 参数传入): - -| 输入类型 | 格式 | 示例 | -|----------|------|------| -| Issue IDs | 直接传入 ID | `ISS-20260215-001 ISS-20260215-002` | -| 需求文本 | `--text '...'` | `--text '实现用户认证模块'` | -| Plan 文件 | `--plan path` | `--plan plan/2026-02-15-auth.md` | - -## Phase Execution - -### Phase 1: Input Parsing (Orchestrator Inline) - -```javascript -// Parse input arguments -const args = orchestratorInput -const issueIds = args.match(/ISS-\d{8}-\d{6}/g) || [] -const textMatch = args.match(/--text\s+['"]([^'"]+)['"]/) -const planMatch = args.match(/--plan\s+(\S+)/) - -let inputType = 'unknown' -if (issueIds.length > 0) inputType = 'issue_ids' -else if (textMatch) inputType = 'text' -else if (planMatch) inputType = 'plan_file' -else inputType = 'text_from_description' - -const inputPayload = { - type: inputType, - issueIds: issueIds, - text: textMatch ? textMatch[1] : args, - planFile: planMatch ? planMatch[1] : null -} - -// Initialize session directory for artifacts -const slug = (issueIds[0] || 'batch').replace(/[^a-zA-Z0-9-]/g, '') -const dateStr = new Date().toISOString().slice(0,10).replace(/-/g,'') -const sessionId = `PEX-${slug}-${dateStr}` -const sessionDir = `.workflow/.team/${sessionId}` -shell(`mkdir -p "${sessionDir}/artifacts/solutions"`) -``` - -### Phase 2: Planning (Deep Interaction with Planner — Per-Issue Beat) - -```javascript -// Track all agents for cleanup -const allAgentIds = [] - -// Spawn planner agent -const plannerId = spawn_agent({ - message: ` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: ~/.codex/agents/planex-planner.md (MUST read first) -2. Read: .workflow/project-tech.json -3. Read: .workflow/project-guidelines.json - ---- - -Goal: 分析需求并逐 issue 输出规划结果。每完成一个 issue 立即输出。 - -Input: -${JSON.stringify(inputPayload, null, 2)} - -Session Dir: ${sessionDir} - -Scope: -- Include: 需求分析、issue 创建、方案设计、inline 冲突检查、写中间产物 -- Exclude: 代码实现、测试执行、git 操作 - -Deliverables: -每个 issue 输出严格遵循以下 JSON 格式: -\`\`\`json -{ - "status": "issue_ready" | "all_planned", - "issue_id": "ISS-xxx", - "solution_id": "SOL-xxx", - "title": "描述", - "priority": "normal", - "depends_on": [], - "solution_file": "${sessionDir}/artifacts/solutions/ISS-xxx.json", - "remaining_issues": ["ISS-yyy", ...], - "summary": "本 issue 规划摘要" -} -\`\`\` - -Quality bar: -- 每个 issue 必须有绑定的 solution -- Solution 写入中间产物文件 -- Inline 冲突检查标记 depends_on -` -}) -allAgentIds.push(plannerId) - -// Wait for planner first issue output -let plannerResult = wait({ ids: [plannerId], timeout_ms: 900000 }) - -if (plannerResult.timed_out) { - send_input({ id: plannerId, message: "请尽快输出当前已完成的规划结果。" }) - plannerResult = wait({ ids: [plannerId], timeout_ms: 120000 }) -} - -// Parse planner output -let issueData = parseIssueOutput(plannerResult.status[plannerId].completed) -``` - -### Phase 3: Per-Issue Execution Loop - -```javascript -const executorResults = [] -let issueCount = 0 - -while (true) { - issueCount++ - - // ─── Dispatch executor for current issue (if valid) ─── - if (issueData && issueData.issue_id) { - const executorId = spawn_agent({ - message: ` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: ~/.codex/agents/planex-executor.md (MUST read first) -2. Read: .workflow/project-tech.json -3. Read: .workflow/project-guidelines.json - ---- - -Goal: 实现 ${issueData.issue_id} 的 solution - -Issue: ${issueData.issue_id} -Solution: ${issueData.solution_id} -Title: ${issueData.title} -Priority: ${issueData.priority} -Dependencies: ${issueData.depends_on?.join(', ') || 'none'} -Solution File: ${issueData.solution_file} -Session Dir: ${sessionDir} - -Scope: -- Include: 加载 solution plan、代码实现、测试运行、git commit -- Exclude: issue 创建、方案修改 - -Deliverables: -输出严格遵循以下格式: -\`\`\`json -{ - "issue_id": "${issueData.issue_id}", - "status": "success" | "failed", - "files_changed": ["path/to/file", ...], - "tests_passed": true | false, - "committed": true | false, - "commit_hash": "abc123" | null, - "error": null | "错误描述", - "summary": "实现摘要" -} -\`\`\` - -Quality bar: -- solution plan 中的所有任务必须实现 -- 现有测试不能 break -- 遵循项目编码规范 -- 每个变更必须 commit -` - }) - allAgentIds.push(executorId) - executorResults.push({ - id: executorId, - issueId: issueData.issue_id, - index: issueCount - }) - } - - // ─── Check if all planned ─── - if (issueData?.status === 'all_planned') { - break - } - - // ─── Request next issue from planner ─── - send_input({ - id: plannerId, - message: `Issue ${issueData?.issue_id || 'unknown'} dispatched. Continue to next issue.` - }) - - // ─── Wait for planner next issue ─── - const nextResult = wait({ ids: [plannerId], timeout_ms: 900000 }) - - if (nextResult.timed_out) { - send_input({ id: plannerId, message: "请尽快输出当前已完成的规划结果。" }) - const retryResult = wait({ ids: [plannerId], timeout_ms: 120000 }) - if (retryResult.timed_out) break - issueData = parseIssueOutput(retryResult.status[plannerId].completed) - } else { - issueData = parseIssueOutput(nextResult.status[plannerId].completed) - } -} - -// ─── Wait for all executor agents ─── -const executorIds = executorResults.map(e => e.id) -if (executorIds.length > 0) { - const execResults = wait({ ids: executorIds, timeout_ms: 1200000 }) - - // Handle timeouts - if (execResults.timed_out) { - const pending = executorIds.filter(id => !execResults.status[id]?.completed) - pending.forEach(id => { - send_input({ id, message: "Please finalize current task and output results." }) - }) - wait({ ids: pending, timeout_ms: 120000 }) - } - - // Collect results - executorResults.forEach(entry => { - entry.result = execResults.status[entry.id]?.completed || 'timeout' - }) -} -``` - -### Phase 4: Aggregation & Cleanup - -```javascript -// ─── Aggregate results ─── -const succeeded = executorResults.filter(r => { - try { - const parsed = JSON.parse(r.result) - return parsed.status === 'success' - } catch { return false } -}) - -const failed = executorResults.filter(r => { - try { - const parsed = JSON.parse(r.result) - return parsed.status === 'failed' - } catch { return true } -}) - -// ─── Output final report ─── -const report = ` -## PlanEx Pipeline Complete - -**Total Issues**: ${executorResults.length} -**Succeeded**: ${succeeded.length} -**Failed**: ${failed.length} - -### Results -${executorResults.map(r => `- ${r.issueId} | ${(() => { - try { return JSON.parse(r.result).status } catch { return 'error' } -})()}`).join('\n')} - -${failed.length > 0 ? `### Failed Issues -${failed.map(r => `- ${r.issueId}: ${(() => { - try { return JSON.parse(r.result).error } catch { return r.result?.slice(0, 200) || 'unknown' } -})()}`).join('\n')}` : ''} -` - -console.log(report) - -// ─── Lifecycle cleanup ─── -allAgentIds.forEach(id => { - try { close_agent({ id }) } catch { /* already closed */ } -}) -``` - -## Helper Functions - -```javascript -function parseIssueOutput(output) { - // Extract JSON block from agent output - const jsonMatch = output.match(/```json\s*([\s\S]*?)```/) - if (jsonMatch) { - try { return JSON.parse(jsonMatch[1]) } catch {} - } - // Fallback: try parsing entire output as JSON - try { return JSON.parse(output) } catch {} - // Last resort: return empty with all_planned - return { status: 'all_planned', issue_id: null, remaining_issues: [], summary: 'Parse failed' } -} -``` - -## Configuration - -```javascript -const CONFIG = { - sessionDir: ".workflow/.team/PEX-{slug}-{date}/", - artifactsDir: ".workflow/.team/PEX-{slug}-{date}/artifacts/", - issueDataDir: ".workflow/issues/", - plannerTimeout: 900000, // 15 min - executorTimeout: 1200000, // 20 min - maxIssues: 50 -} -``` - -## Lifecycle Management - -### Timeout Handling - -| Scenario | Action | -|----------|--------| -| Planner issue timeout | send_input 催促收敛,retry wait 120s | -| Executor timeout | 标记为 failed,继续其他 executor | -| Batch wait partial timeout | 收集已完成结果,继续 pipeline | -| Pipeline stall (> 3 issues timeout) | 中止 pipeline,输出部分结果 | - -### Cleanup Protocol - -```javascript -// All agents tracked in allAgentIds -// Final cleanup at end or on error -allAgentIds.forEach(id => { - try { close_agent({ id }) } catch { /* already closed */ } -}) -``` - -## Error Handling - -| Scenario | Resolution | -|----------|------------| -| Planner output parse failure | Retry with send_input asking for strict JSON | -| No issues created | Report error, abort pipeline | -| Solution planning failure | Skip issue, report in final results | -| Executor implementation failure | Mark as failed, continue with other executors | -| Inline conflict check failure | Use empty depends_on, continue | -| Planner exits early | Treat as all_planned, finish current executors | diff --git a/.codex/skills/issue-devpipeline/agents/planex-executor.md b/.codex/skills/issue-devpipeline/agents/planex-executor.md deleted file mode 100644 index 2f4b9099..00000000 --- a/.codex/skills/issue-devpipeline/agents/planex-executor.md +++ /dev/null @@ -1,451 +0,0 @@ ---- -name: planex-executor -description: | - PlanEx 执行角色。从中间产物文件加载 solution plan(兼容 CLI fallback)→ 代码实现 → 测试验证 → git commit。 - 每个 executor 实例处理一个 issue 的 solution。 -color: green -skill: issue-devpipeline ---- - -# PlanEx Executor - -代码实现角色。接收编排器派发的 issue + solution 信息,从中间产物文件加载 solution plan(兼容 CLI fallback),实现代码变更,运行测试验证,提交变更。每个 executor 实例独立处理一个 issue。 - -## Core Capabilities - -1. **Solution 加载**: 从中间产物文件加载 solution plan(兼容 `ccw issue solutions --json` fallback) -2. **代码实现**: 按 solution plan 的任务列表顺序实现代码变更 -3. **测试验证**: 运行相关测试确保变更正确且不破坏现有功能 -4. **变更提交**: 将实现的代码 commit 到 git - -## Execution Logging - -执行过程中**必须**实时维护两个日志文件,记录每个任务的执行状态和细节。 - -### Session Folder - -```javascript -// sessionFolder 从 TASK ASSIGNMENT 中的 session_dir 获取,或使用默认路径 -const sessionFolder = taskAssignment.session_dir || `.workflow/.team/PEX-${issueId}` -``` - -### execution.md — 执行概览 - -在开始实现前初始化,任务完成/失败时更新状态。 - -```javascript -function initExecution(issueId, solution) { - const executionMd = `# Execution Overview - -## Session Info -- **Issue**: ${issueId} -- **Solution**: ${solution.bound?.id || 'N/A'} -- **Started**: ${getUtc8ISOString()} -- **Executor**: planex-executor (issue-devpipeline) -- **Execution Mode**: Direct inline - -## Solution Tasks - -| # | Task | Files | Status | -|---|------|-------|--------| -${(solution.bound?.tasks || []).map((t, i) => - `| ${i+1} | ${t.title || t.description || 'Task ' + (i+1)} | ${(t.files || []).join(', ') || '-'} | pending |` -).join('\n')} - -## Execution Timeline -> Updated as tasks complete - -## Execution Summary -> Updated after completion -` - write_file(`${sessionFolder}/execution.md`, executionMd) -} -``` - -### execution-events.md — 事件流 - -每个任务的 START/COMPLETE/FAIL 实时追加记录。 - -```javascript -function initEvents(issueId) { - const eventsHeader = `# Execution Events - -**Issue**: ${issueId} -**Executor**: planex-executor (issue-devpipeline) -**Started**: ${getUtc8ISOString()} - ---- - -` - write_file(`${sessionFolder}/execution-events.md`, eventsHeader) -} - -function appendEvent(content) { - // Append to execution-events.md - const existing = read_file(`${sessionFolder}/execution-events.md`) - write_file(`${sessionFolder}/execution-events.md`, existing + content) -} - -function recordTaskStart(task, index) { - appendEvent(`## ${getUtc8ISOString()} — Task ${index + 1}: ${task.title || task.description || 'Unnamed'} - -**Status**: ⏳ IN PROGRESS -**Files**: ${(task.files || []).join(', ') || 'TBD'} - -### Execution Log -`) -} - -function recordTaskComplete(task, index, filesModified, changeSummary, duration) { - appendEvent(` -**Status**: ✅ COMPLETED -**Duration**: ${duration} -**Files Modified**: ${filesModified.join(', ')} - -#### Changes Summary -${changeSummary} - ---- -`) -} - -function recordTaskFailed(task, index, error, duration) { - appendEvent(` -**Status**: ❌ FAILED -**Duration**: ${duration} -**Error**: ${error} - ---- -`) -} - -function updateTaskStatus(taskIndex, status) { - // Update the task row in execution.md table: replace "pending" → status - const content = read_file(`${sessionFolder}/execution.md`) - // Find and update the Nth task row status - // (Edit the specific table row) -} - -function finalizeExecution(totalTasks, succeeded, failedCount, filesModified) { - const summary = ` -## Execution Summary - -- **Completed**: ${getUtc8ISOString()} -- **Total Tasks**: ${totalTasks} -- **Succeeded**: ${succeeded} -- **Failed**: ${failedCount} -- **Success Rate**: ${Math.round(succeeded / totalTasks * 100)}% -- **Files Modified**: ${filesModified.join(', ')} -` - // Append summary to execution.md - const content = read_file(`${sessionFolder}/execution.md`) - write_file(`${sessionFolder}/execution.md`, - content.replace('> Updated after completion', summary)) - - // Append session footer to execution-events.md - appendEvent(` ---- - -# Session Summary - -- **Issue**: ${issueId} -- **Completed**: ${getUtc8ISOString()} -- **Tasks**: ${succeeded} completed, ${failedCount} failed -`) -} - -function getUtc8ISOString() { - return new Date(Date.now() + 8 * 3600000).toISOString().replace('Z', '+08:00') -} -``` - -## Execution Process - -### Step 1: Context Loading - -**MANDATORY**: Execute these steps FIRST before any other action. - -1. Read this role definition file (already done if you're reading this) -2. Read: `.workflow/project-tech.json` — understand project technology stack -3. Read: `.workflow/project-guidelines.json` — understand project conventions -4. Parse the TASK ASSIGNMENT from the spawn message for: - - **Goal**: 实现指定 issue 的 solution - - **Issue ID**: 目标 issue 标识 - - **Solution ID**: 绑定的 solution 标识 - - **Dependencies**: 依赖的其他 issues(应已完成) - - **Session Dir**: 日志文件存放路径 - - **Deliverables**: Expected JSON output format - -### Step 2: Solution Loading & Implementation - -```javascript -// ── Load solution plan (dual-mode: artifact file first, CLI fallback) ── -const issueId = taskAssignment.issue_id -const solutionFile = taskAssignment.solution_file - -let solution -if (solutionFile) { - try { - const solutionData = JSON.parse(read_file(solutionFile)) - solution = solutionData.bound ? solutionData : { bound: solutionData } - } catch { - // Fallback to CLI - const solJson = shell(`ccw issue solutions ${issueId} --json`) - solution = JSON.parse(solJson) - } -} else { - const solJson = shell(`ccw issue solutions ${issueId} --json`) - solution = JSON.parse(solJson) -} - -if (!solution.bound) { - outputError(`No bound solution for ${issueId}`) - return -} - -// ── Initialize execution logs ── -shell(`mkdir -p ${sessionFolder}`) -initExecution(issueId, solution) -initEvents(issueId) - -// Update issue status -shell(`ccw issue update ${issueId} --status in-progress`) - -// ── Implement according to solution plan ── -const plan = solution.bound -const tasks = plan.tasks || [] -let succeeded = 0, failedCount = 0 -const allFilesModified = [] - -for (let i = 0; i < tasks.length; i++) { - const task = tasks[i] - const startTime = Date.now() - - // Record START event - recordTaskStart(task, i) - - try { - // 1. Read target files - // 2. Apply changes following existing patterns - // 3. Write/Edit files - // 4. Verify no syntax errors - - const endTime = Date.now() - const duration = `${Math.round((endTime - startTime) / 1000)}s` - const filesModified = getModifiedFiles() - allFilesModified.push(...filesModified) - - // Record COMPLETE event - recordTaskComplete(task, i, filesModified, changeSummary, duration) - updateTaskStatus(i, 'completed') - succeeded++ - } catch (error) { - const endTime = Date.now() - const duration = `${Math.round((endTime - startTime) / 1000)}s` - - // Record FAIL event - recordTaskFailed(task, i, error.message, duration) - updateTaskStatus(i, 'failed') - failedCount++ - } -} -``` - -**实现原则**: -- 按 solution plan 中的 task 顺序实现 -- 遵循项目现有代码风格和模式 -- 最小化变更,不做超出 solution 范围的修改 -- 每个 task 完成后验证无语法错误 - -### Step 3: Testing, Commit & Finalize Logs - -```javascript -// ── Detect test command ── -let testCmd = 'npm test' -try { - const pkgJson = JSON.parse(readFile('package.json')) - if (pkgJson.scripts?.test) testCmd = 'npm test' - else if (pkgJson.scripts?.['test:unit']) testCmd = 'npm run test:unit' -} catch { - if (fileExists('pytest.ini') || fileExists('setup.py')) testCmd = 'pytest' - else if (fileExists('Cargo.toml')) testCmd = 'cargo test' -} - -// ── Run tests ── -const testStartTime = Date.now() -appendEvent(`## ${getUtc8ISOString()} — Integration Test Verification - -**Status**: ⏳ IN PROGRESS -**Command**: \`${testCmd}\` - -### Test Log -`) - -const testResult = shell(`${testCmd} 2>&1`) -let testsPassed = !testResult.includes('FAIL') && testResult.exitCode === 0 - -if (!testsPassed) { - let retries = 0 - while (retries < 2 && !testsPassed) { - appendEvent(`- Retry ${retries + 1}: fixing test failures...\n`) - retries++ - const retestResult = shell(`${testCmd} 2>&1`) - testsPassed = !retestResult.includes('FAIL') && retestResult.exitCode === 0 - } -} - -const testDuration = `${Math.round((Date.now() - testStartTime) / 1000)}s` - -if (testsPassed) { - appendEvent(` -**Status**: ✅ TESTS PASSED -**Duration**: ${testDuration} - ---- -`) -} else { - appendEvent(` -**Status**: ❌ TESTS FAILED -**Duration**: ${testDuration} -**Output** (truncated): -\`\`\` -${testResult.slice(0, 500)} -\`\`\` - ---- -`) -} - -// ── Commit if tests pass ── -let commitHash = null -let committed = false - -if (testsPassed) { - shell('git add -A') - shell(`git commit -m "feat(${issueId}): implement solution ${solution.bound.id}"`) - commitHash = shell('git rev-parse --short HEAD').trim() - committed = true - - appendEvent(`## ${getUtc8ISOString()} — Git Commit - -**Commit**: \`${commitHash}\` -**Message**: feat(${issueId}): implement solution ${solution.bound.id} - ---- -`) - - shell(`ccw issue update ${issueId} --status resolved`) -} - -// ── Finalize execution logs ── -finalizeExecution(tasks.length, succeeded, failedCount, [...new Set(allFilesModified)]) -``` - -### Step 4: Output Delivery - -输出严格遵循编排器要求的 JSON 格式: - -```json -{ - "issue_id": "ISS-20260215-001", - "status": "success", - "files_changed": [ - "src/auth/login.ts", - "src/auth/login.test.ts" - ], - "tests_passed": true, - "committed": true, - "commit_hash": "abc1234", - "error": null, - "summary": "实现用户登录功能,添加 2 个文件,通过所有测试", - "execution_logs": { - "execution_md": "${sessionFolder}/execution.md", - "events_md": "${sessionFolder}/execution-events.md" - } -} -``` - -**失败时的输出**: - -```json -{ - "issue_id": "ISS-20260215-001", - "status": "failed", - "files_changed": ["src/auth/login.ts"], - "tests_passed": false, - "committed": false, - "commit_hash": null, - "error": "Tests failing: login.test.ts:42 - Expected 200 got 401", - "summary": "代码实现完成但测试未通过,需要 solution 修订", - "execution_logs": { - "execution_md": "${sessionFolder}/execution.md", - "events_md": "${sessionFolder}/execution-events.md" - } -} -``` - -## Execution Log Output Structure - -``` -${sessionFolder}/ -├── execution.md # 执行概览:session info, task table, summary -└── execution-events.md # 事件流:每个 task 的 START/COMPLETE/FAIL 详情 -``` - -| File | Purpose | -|------|---------| -| `execution.md` | 概览:solution tasks 表格、执行统计、最终结果 | -| `execution-events.md` | 时间线:每个任务和测试验证的详细事件记录 | - -## Role Boundaries - -### MUST - -- 仅处理分配的单个 issue -- 严格按 solution plan 实现 -- 实现前先读取目标文件理解现有代码 -- 遵循项目编码规范(from project-guidelines.json) -- 运行测试验证变更 -- 输出严格 JSON 格式结果 - -### MUST NOT - -- ❌ 创建新的 issue -- ❌ 修改 solution 或 queue -- ❌ 实现超出 solution 范围的功能 -- ❌ 跳过测试直接提交 -- ❌ 修改与当前 issue 无关的文件 -- ❌ 输出非 JSON 格式的结果 - -## Key Reminders - -**ALWAYS**: -- Read role definition file as FIRST action (Step 1) -- **Initialize execution.md + execution-events.md BEFORE starting implementation** -- **Record START event before each solution task** -- **Record COMPLETE/FAIL event after each task with duration and details** -- **Finalize logs after testing and commit** -- Load solution plan before implementing -- Follow existing code patterns in the project -- Run tests before committing -- Report accurate `files_changed` list -- Include meaningful `summary` and `error` descriptions - -**NEVER**: -- Modify files outside the solution scope -- Skip context loading (Step 1) -- Commit untested code -- Over-engineer beyond the solution plan -- Suppress test failures (`@ts-ignore`, `.skip`, etc.) -- Output unstructured text - -## Error Handling - -| Scenario | Action | -|----------|--------| -| Solution not found | Output `status: "failed"`, `error: "No bound solution"` | -| Target file not found | Create file if solution specifies, otherwise report error | -| Syntax/type errors after changes | Fix immediately, re-verify | -| Tests failing after 2 retries | Output `status: "failed"` with test output in error | -| Git commit failure | Output `committed: false`, include error | -| Issue status update failure | Log warning, continue with output | diff --git a/.codex/skills/issue-devpipeline/agents/planex-planner.md b/.codex/skills/issue-devpipeline/agents/planex-planner.md deleted file mode 100644 index 490eed1e..00000000 --- a/.codex/skills/issue-devpipeline/agents/planex-planner.md +++ /dev/null @@ -1,286 +0,0 @@ ---- -name: planex-planner -description: | - PlanEx 规划角色。需求拆解 → issue 创建 → 方案设计 → inline 冲突检查。 - 逐 issue 输出执行信息,支持 Deep Interaction 多轮交互。 -color: blue -skill: issue-devpipeline ---- - -# PlanEx Planner - -需求分析和规划角色。接收需求输入(issue IDs / 文本 / plan 文件),完成需求拆解、issue 创建、方案设计(调用 issue-plan-agent)、inline 冲突检查,逐 issue 输出执行信息供编排器即时派发 executor。 - -## Core Capabilities - -1. **需求分析**: 解析输入类型,提取需求要素 -2. **Issue 创建**: 将文本/plan 拆解为结构化 issue(通过 `ccw issue new`) -3. **方案设计**: 调用 issue-plan-agent 为每个 issue 生成 solution -4. **Inline 冲突检查**: 基于 files_touched 重叠检测 + 显式依赖排序 -5. **中间产物**: 将 solution 写入文件供 executor 直接加载 -6. **逐 issue 输出**: 每完成一个 issue 立即输出 JSON,编排器即时派发 - -## Execution Process - -### Step 1: Context Loading - -**MANDATORY**: Execute these steps FIRST before any other action. - -1. Read this role definition file (already done if you're reading this) -2. Read: `.workflow/project-tech.json` — understand project technology stack -3. Read: `.workflow/project-guidelines.json` — understand project conventions -4. Parse the TASK ASSIGNMENT from the spawn message for: - - **Goal**: What to achieve - - **Scope**: What's allowed and forbidden - - **Input**: Input payload with type, issueIds, text, planFile - - **Session Dir**: Path for writing solution artifacts - - **Deliverables**: Expected JSON output format - -### Step 2: Input Processing & Issue Creation - -根据输入类型创建 issues。 - -```javascript -const input = taskAssignment.input -const sessionDir = taskAssignment.session_dir - -if (input.type === 'issue_ids') { - // Issue IDs 已提供,直接使用 - issueIds = input.issueIds -} - -if (input.type === 'text' || input.type === 'text_from_description') { - // 从文本创建 issue - const result = shell(`ccw issue new --text '${input.text}' --json`) - const issue = JSON.parse(result) - issueIds = [issue.id] -} - -if (input.type === 'plan_file') { - // 读取 plan 文件,解析 phases/steps - const planContent = readFile(input.planFile) - const phases = parsePlanPhases(planContent) - - // 每个 phase 创建一个 issue - issueIds = [] - for (const phase of phases) { - const result = shell(`ccw issue new --text '${phase.title}: ${phase.description}' --json`) - const issue = JSON.parse(result) - issueIds.push(issue.id) - } -} -``` - -### Step 3: Per-Issue Solution Planning & Artifact Writing - -逐 issue 处理:plan-agent → 写中间产物 → 冲突检查 → 输出 JSON。 - -```javascript -const projectRoot = shell('pwd').trim() -const dispatchedSolutions = [] -const remainingIssues = [...issueIds] - -shell(`mkdir -p "${sessionDir}/artifacts/solutions"`) - -for (let i = 0; i < issueIds.length; i++) { - const issueId = issueIds[i] - remainingIssues.shift() - - // --- Step 3a: Spawn issue-plan-agent for single issue --- - const planAgent = spawn_agent({ - message: ` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: ~/.codex/agents/issue-plan-agent.md (MUST read first) - ---- - -issue_ids: ["${issueId}"] -project_root: "${projectRoot}" - -## Requirements -- Generate solution for this issue -- Auto-bind single solution -- For multiple solutions, select the most pragmatic one -` - }) - const planResult = wait({ ids: [planAgent], timeout_ms: 600000 }) - - if (planResult.timed_out) { - send_input({ id: planAgent, message: "Please finalize solution and output results." }) - wait({ ids: [planAgent], timeout_ms: 120000 }) - } - - close_agent({ id: planAgent }) - - // --- Step 3b: Load solution + write artifact file --- - const solJson = shell(`ccw issue solution ${issueId} --json`) - const solution = JSON.parse(solJson) - - const solutionFile = `${sessionDir}/artifacts/solutions/${issueId}.json` - write_file(solutionFile, JSON.stringify({ - issue_id: issueId, - ...solution, - timestamp: new Date().toISOString() - }, null, 2)) - - // --- Step 3c: Inline conflict check --- - const dependsOn = inlineConflictCheck(issueId, solution, dispatchedSolutions) - - // --- Step 3d: Track + output per-issue JSON --- - dispatchedSolutions.push({ issueId, solution, solutionFile }) - - const isLast = remainingIssues.length === 0 - - // Output per-issue JSON for orchestrator - console.log(JSON.stringify({ - status: isLast ? "all_planned" : "issue_ready", - issue_id: issueId, - solution_id: solution.bound?.id || 'N/A', - title: solution.bound?.title || issueId, - priority: "normal", - depends_on: dependsOn, - solution_file: solutionFile, - remaining_issues: remainingIssues, - summary: `${issueId} solution ready` + (isLast ? ` (all ${issueIds.length} issues planned)` : '') - }, null, 2)) - - // Wait for orchestrator send_input before continuing - // (orchestrator will send: "Issue dispatched. Continue.") -} -``` - -### Step 4: Output Delivery - -输出格式(每个 issue 独立输出): - -```json -{ - "status": "issue_ready", - "issue_id": "ISS-xxx", - "solution_id": "SOL-xxx", - "title": "实现功能A", - "priority": "normal", - "depends_on": [], - "solution_file": ".workflow/.team/PEX-xxx/artifacts/solutions/ISS-xxx.json", - "remaining_issues": ["ISS-yyy", "ISS-zzz"], - "summary": "ISS-xxx solution ready" -} -``` - -**status 取值**: -- `"issue_ready"` — 本 issue 完成,还有后续 issues -- `"all_planned"` — 所有 issues 已规划完毕(最后一个 issue 的输出) - -## Inline Conflict Check - -```javascript -function inlineConflictCheck(issueId, solution, dispatchedSolutions) { - const currentFiles = solution.bound?.files_touched - || solution.bound?.affected_files || [] - const blockedBy = [] - - // 1. File conflict detection - for (const prev of dispatchedSolutions) { - const prevFiles = prev.solution.bound?.files_touched - || prev.solution.bound?.affected_files || [] - const overlap = currentFiles.filter(f => prevFiles.includes(f)) - if (overlap.length > 0) { - blockedBy.push(prev.issueId) - } - } - - // 2. Explicit dependencies - const explicitDeps = solution.bound?.dependencies?.on_issues || [] - for (const depId of explicitDeps) { - if (!blockedBy.includes(depId)) { - blockedBy.push(depId) - } - } - - return blockedBy -} -``` - -## Plan File Parsing - -```javascript -function parsePlanPhases(planContent) { - const phases = [] - const phaseRegex = /^#{2,3}\s+(?:Phase|Step|阶段)\s*\d*[:.:]\s*(.+?)$/gm - let match - let lastIndex = 0 - let lastTitle = null - - while ((match = phaseRegex.exec(planContent)) !== null) { - if (lastTitle !== null) { - phases.push({ title: lastTitle, description: planContent.slice(lastIndex, match.index).trim() }) - } - lastTitle = match[1].trim() - lastIndex = match.index + match[0].length - } - - if (lastTitle !== null) { - phases.push({ title: lastTitle, description: planContent.slice(lastIndex).trim() }) - } - - if (phases.length === 0) { - const titleMatch = planContent.match(/^#\s+(.+)$/m) - phases.push({ - title: titleMatch ? titleMatch[1] : 'Plan Implementation', - description: planContent.slice(0, 500) - }) - } - - return phases -} -``` - -## Role Boundaries - -### MUST - -- 仅执行规划相关工作(需求分析、issue 创建、方案设计、冲突检查) -- 输出严格遵循 JSON 格式 -- 按依赖关系标记 depends_on -- 将 solution 写入中间产物文件 -- 每个 issue 完成后立即输出 JSON - -### MUST NOT - -- ❌ 直接编写/修改业务代码 -- ❌ 运行项目测试 -- ❌ 执行 git commit -- ❌ 修改已存在的 solution -- ❌ 输出非 JSON 格式的结果 - -## Key Reminders - -**ALWAYS**: -- Read role definition file as FIRST action -- Output strictly formatted JSON for each issue -- Include `remaining_issues` for orchestrator to track progress -- Set correct `status` (`issue_ready` vs `all_planned`) -- Write solution artifact file before outputting JSON -- Include `solution_file` path in output -- Use `ccw issue new --json` for issue creation -- Clean up spawned sub-agents (issue-plan-agent) - -**NEVER**: -- Implement code (executor's job) -- Output free-form text instead of structured JSON -- Skip solution planning (every issue needs a bound solution) -- Skip writing solution artifact file - -## Error Handling - -| Scenario | Action | -|----------|--------| -| Issue creation fails | Retry once with simplified text, skip if still fails | -| issue-plan-agent timeout | Retry once, output partial results | -| Inline conflict check failure | Use empty depends_on, continue | -| Solution artifact write failure | Report error in JSON output, continue | -| Plan file not found | Report in output JSON: `"error": "plan file not found"` | -| Empty input | Output: `"status": "all_planned", "error": "no input"` | -| Sub-agent parse failure | Use raw output, include in summary | diff --git a/.codex/skills/issue-discover/SKILL.md b/.codex/skills/issue-discover/SKILL.md index 08347de0..023c2078 100644 --- a/.codex/skills/issue-discover/SKILL.md +++ b/.codex/skills/issue-discover/SKILL.md @@ -232,7 +232,7 @@ const agentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/{agent-type}.md (MUST read first) 2. Read: {projectRoot}/.workflow/project-tech.json -3. Read: {projectRoot}/.workflow/project-guidelines.json +3. Read: {projectRoot}/.workflow/specs/*.md ## TASK CONTEXT ${taskContext} diff --git a/.codex/skills/issue-discover/phases/02-discover.md b/.codex/skills/issue-discover/phases/02-discover.md index 481d291c..32d871f3 100644 --- a/.codex/skills/issue-discover/phases/02-discover.md +++ b/.codex/skills/issue-discover/phases/02-discover.md @@ -118,7 +118,7 @@ selectedPerspectives.forEach(perspective => { ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/cli-explore-agent.md (MUST read first) 2. Read: {projectRoot}/.workflow/project-tech.json -3. Read: {projectRoot}/.workflow/project-guidelines.json +3. Read: {projectRoot}/.workflow/specs/*.md --- @@ -196,7 +196,7 @@ if (selectedPerspectives.includes('security') || selectedPerspectives.includes(' ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/cli-explore-agent.md (MUST read first) 2. Read: {projectRoot}/.workflow/project-tech.json -3. Read: {projectRoot}/.workflow/project-guidelines.json +3. Read: {projectRoot}/.workflow/specs/*.md --- diff --git a/.codex/skills/issue-discover/phases/03-discover-by-prompt.md b/.codex/skills/issue-discover/phases/03-discover-by-prompt.md index da811c1d..13ca4708 100644 --- a/.codex/skills/issue-discover/phases/03-discover-by-prompt.md +++ b/.codex/skills/issue-discover/phases/03-discover-by-prompt.md @@ -416,7 +416,7 @@ function buildDimensionPromptWithACE(dimension, iteration, previousFindings, ace ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/cli-explore-agent.md (MUST read first) 2. Read: {projectRoot}/.workflow/project-tech.json -3. Read: {projectRoot}/.workflow/project-guidelines.json +3. Read: {projectRoot}/.workflow/specs/*.md --- diff --git a/.codex/skills/issue-execute/SKILL.md b/.codex/skills/issue-execute/SKILL.md deleted file mode 100644 index 1f79429a..00000000 --- a/.codex/skills/issue-execute/SKILL.md +++ /dev/null @@ -1,820 +0,0 @@ ---- -name: issue-execute -description: Execute all solutions from issue queue with git commit after each solution. Supports batch processing and execution control. -argument-hint: "--queue= [--worktree=] [--skip-tests] [--skip-build] [--dry-run]" ---- - -# Issue Execute (Codex Version) - -## Core Principle - -**Serial Execution**: Execute solutions ONE BY ONE from the issue queue via `ccw issue next`. For each solution, complete all tasks sequentially (implement → test → verify), then commit once per solution with formatted summary. Continue autonomously until queue is empty. - -## Project Context (MANDATORY FIRST STEPS) - -Before starting execution, load project context: - -1. **Read project tech stack**: `.workflow/project-tech.json` -2. **Read project guidelines**: `.workflow/project-guidelines.json` -3. **Read solution schema**: `~/.ccw/workflows/cli-templates/schemas/solution-schema.json` - -This ensures execution follows project conventions and patterns. - -## Parameters - -- `--queue=`: Queue ID to execute (REQUIRED) -- `--worktree=`: Worktree path or 'new' for creating new worktree -- `--skip-tests`: Skip test execution during solution implementation -- `--skip-build`: Skip build step -- `--dry-run`: Preview execution without making changes - -## Queue ID Requirement (MANDATORY) - -**`--queue ` parameter is REQUIRED** - -### When Queue ID Not Provided - -``` -List queues → Output options → Stop and wait for user -``` - -**Actions**: - -1. `ccw issue queue list --brief --json` - Fetch queue list -2. Filter active/pending status, output formatted list -3. **Stop execution**, prompt user to rerun with `codex -p "@.codex/prompts/issue-execute.md --queue QUE-xxx"` - -**No auto-selection** - User MUST explicitly specify queue-id - -## Worktree Mode (Recommended for Parallel Execution) - -When `--worktree` is specified, create or use a git worktree to isolate work. - -**Usage**: -- `--worktree` - Create a new worktree with timestamp-based name -- `--worktree ` - Resume in an existing worktree (for recovery/continuation) - -**Note**: `ccw issue` commands auto-detect worktree and redirect to main repo automatically. - -```bash -# Step 0: Setup worktree before starting (run from MAIN REPO) - -# Use absolute paths to avoid issues when running from subdirectories -REPO_ROOT=$(git rev-parse --show-toplevel) -WORKTREE_BASE="${REPO_ROOT}/.ccw/worktrees" - -# Check if existing worktree path was provided -EXISTING_WORKTREE="${1:-}" # Pass as argument or empty - -if [[ -n "${EXISTING_WORKTREE}" && -d "${EXISTING_WORKTREE}" ]]; then - # Resume mode: Use existing worktree - WORKTREE_PATH="${EXISTING_WORKTREE}" - WORKTREE_NAME=$(basename "${WORKTREE_PATH}") - - # Verify it's a valid git worktree - if ! git -C "${WORKTREE_PATH}" rev-parse --is-inside-work-tree &>/dev/null; then - echo "Error: ${EXISTING_WORKTREE} is not a valid git worktree" - exit 1 - fi - - echo "Resuming in existing worktree: ${WORKTREE_PATH}" -else - # Create mode: New worktree with timestamp - WORKTREE_NAME="issue-exec-$(date +%Y%m%d-%H%M%S)" - WORKTREE_PATH="${WORKTREE_BASE}/${WORKTREE_NAME}" - - # Ensure worktree base directory exists (gitignored) - mkdir -p "${WORKTREE_BASE}" - - # Prune stale worktrees from previous interrupted executions - git worktree prune - - # Create worktree from current branch - git worktree add "${WORKTREE_PATH}" -b "${WORKTREE_NAME}" - - echo "Created new worktree: ${WORKTREE_PATH}" -fi - -# Setup cleanup trap for graceful failure handling -cleanup_worktree() { - echo "Cleaning up worktree due to interruption..." - cd "${REPO_ROOT}" 2>/dev/null || true - git worktree remove "${WORKTREE_PATH}" --force 2>/dev/null || true - # Keep branch for debugging failed executions - echo "Worktree removed. Branch '${WORKTREE_NAME}' kept for inspection." -} -trap cleanup_worktree EXIT INT TERM - -# Change to worktree directory -cd "${WORKTREE_PATH}" - -# ccw issue commands auto-detect worktree and use main repo's .workflow/ -# So you can run ccw issue next/done directly from worktree -``` - -**Worktree Execution Pattern**: -``` -0. [MAIN REPO] Validate queue ID (--queue required, or prompt user to select) -1. [WORKTREE] ccw issue next --queue → auto-redirects to main repo's .workflow/ -2. [WORKTREE] Implement all tasks, run tests, git commit -3. [WORKTREE] ccw issue done → auto-redirects to main repo -4. Repeat from step 1 -``` - -**Note**: Add `.ccw/worktrees/` to `.gitignore` to prevent tracking worktree contents. - -**Benefits:** -- Parallel executors don't conflict with each other -- Main working directory stays clean -- Easy cleanup after execution -- **Resume support**: Pass existing worktree path to continue interrupted executions - -**Resume Examples:** -```bash -# List existing worktrees to find interrupted execution -git worktree list - -# Resume in existing worktree (pass path as argument) -# The worktree path will be used instead of creating a new one -codex -p "@.codex/prompts/issue-execute.md --worktree /path/to/existing/worktree" -``` - -**Completion - User Choice:** - -When all solutions are complete, output options and wait for user to specify: - -``` -All solutions completed in worktree. Choose next action: - -1. Merge to main - Merge worktree branch into main and cleanup -2. Create PR - Push branch and create pull request (Recommended for parallel execution) -3. Keep branch - Keep branch for manual handling, cleanup worktree only - -Please respond with: 1, 2, or 3 -``` - -**Based on user response:** - -```bash -# Disable cleanup trap before intentional cleanup -trap - EXIT INT TERM - -# Return to main repo first (use REPO_ROOT from setup) -cd "${REPO_ROOT}" - -# Validate main repo state before merge (prevents conflicts) -validate_main_clean() { - if [[ -n $(git status --porcelain) ]]; then - echo "⚠️ Warning: Main repo has uncommitted changes." - echo "Cannot auto-merge. Falling back to 'Create PR' option." - return 1 - fi - return 0 -} - -# Option 1: Merge to main (only if main is clean) -if validate_main_clean; then - git merge "${WORKTREE_NAME}" --no-ff -m "Merge issue queue execution: ${WORKTREE_NAME}" - git worktree remove "${WORKTREE_PATH}" - git branch -d "${WORKTREE_NAME}" -else - # Fallback to PR if main is dirty - git push -u origin "${WORKTREE_NAME}" - gh pr create --title "Issue Queue: ${WORKTREE_NAME}" --body "Automated issue queue execution (main had uncommitted changes)" - git worktree remove "${WORKTREE_PATH}" -fi - -# Option 2: Create PR (Recommended for parallel execution) -git push -u origin "${WORKTREE_NAME}" -gh pr create --title "Issue Queue: ${WORKTREE_NAME}" --body "Automated issue queue execution" -git worktree remove "${WORKTREE_PATH}" -# Branch kept on remote - -# Option 3: Keep branch -git worktree remove "${WORKTREE_PATH}" -# Branch kept locally for manual handling -echo "Branch '${WORKTREE_NAME}' kept. Merge manually when ready." -``` - -**Parallel Execution Safety**: For parallel executors, "Create PR" is the safest option as it avoids race conditions during merge. Multiple PRs can be reviewed and merged sequentially. - -## Execution Flow - -``` -STEP 0: Validate queue ID (--queue required, or prompt user to select) - -INIT: Fetch first solution via ccw issue next --queue - -WHILE solution exists: - 1. Receive solution JSON from ccw issue next --queue - 2. Execute all tasks in solution.tasks sequentially: - FOR each task: - - IMPLEMENT: Follow task.implementation steps - - TEST: Run task.test commands - - VERIFY: Check task.acceptance criteria - 3. COMMIT: Stage all files, commit once with formatted summary - 4. Report completion via ccw issue done - 5. Fetch next solution via ccw issue next --queue - -WHEN queue empty: - Output final summary -``` - -## Step 1: Fetch First Solution - -**Prerequisite**: Queue ID must be determined (either from `--queue` argument or user selection in Step 0). - -Run this command to get your first solution: - -```javascript -// ccw auto-detects worktree and uses main repo's .workflow/ -// QUEUE_ID is required - obtained from --queue argument or user selection -const result = shell_command({ command: `ccw issue next --queue ${QUEUE_ID}` }) -``` - -This returns JSON with the full solution definition: -- `item_id`: Solution identifier in queue (e.g., "S-1") -- `issue_id`: Parent issue ID (e.g., "ISS-20251227-001") -- `solution_id`: Solution ID (e.g., "SOL-ISS-20251227-001-1") -- `solution`: Full solution with all tasks -- `execution_hints`: Timing and executor hints - -If response contains `{ "status": "empty" }`, all solutions are complete - skip to final summary. - -## Step 2: Parse Solution Response - -Expected solution structure: - -```json -{ - "item_id": "S-1", - "issue_id": "ISS-20251227-001", - "solution_id": "SOL-ISS-20251227-001-1", - "status": "pending", - "solution": { - "id": "SOL-ISS-20251227-001-1", - "description": "Description of solution approach", - "tasks": [ - { - "id": "T1", - "title": "Task title", - "scope": "src/module/", - "action": "Create|Modify|Fix|Refactor|Add", - "description": "What to do", - "modification_points": [ - { "file": "path/to/file.ts", "target": "function name", "change": "description" } - ], - "implementation": [ - "Step 1: Do this", - "Step 2: Do that" - ], - "test": { - "commands": ["npm test -- --filter=xxx"], - "unit": ["Unit test requirement 1", "Unit test requirement 2"] - }, - "regression": ["Verify existing tests still pass"], - "acceptance": { - "criteria": ["Criterion 1: Must pass", "Criterion 2: Must verify"], - "verification": ["Run test command", "Manual verification step"] - }, - "commit": { - "type": "feat|fix|test|refactor", - "scope": "module", - "message_template": "feat(scope): description" - }, - "depends_on": [], - "estimated_minutes": 30, - "priority": 1 - } - ], - "exploration_context": { - "relevant_files": ["path/to/reference.ts"], - "patterns": "Follow existing pattern in xxx", - "integration_points": "Used by other modules" - }, - "analysis": { - "risk": "low|medium|high", - "impact": "low|medium|high", - "complexity": "low|medium|high" - }, - "score": 0.95, - "is_bound": true - }, - "execution_hints": { - "executor": "codex", - "estimated_minutes": 180 - } -} -``` - -## Step 2.1: Determine Execution Strategy - -After parsing the solution, analyze the issue type and task actions to determine the appropriate execution strategy. The strategy defines additional verification steps and quality gates beyond the basic implement-test-verify cycle. - -### Strategy Auto-Matching - -**Matching Priority**: -1. Explicit `solution.strategy_type` if provided -2. Infer from `task.action` keywords (Debug, Fix, Feature, Refactor, Test, etc.) -3. Infer from `solution.description` and `task.title` content -4. Default to "standard" if no clear match - -**Strategy Types and Matching Keywords**: - -| Strategy Type | Match Keywords | Description | -|---------------|----------------|-------------| -| `debug` | Debug, Diagnose, Trace, Investigate | Bug diagnosis with logging and debugging | -| `bugfix` | Fix, Patch, Resolve, Correct | Bug fixing with root cause analysis | -| `feature` | Feature, Add, Implement, Create, Build | New feature development with full testing | -| `refactor` | Refactor, Restructure, Optimize, Cleanup | Code restructuring with behavior preservation | -| `test` | Test, Coverage, E2E, Integration | Test implementation with coverage checks | -| `performance` | Performance, Optimize, Speed, Memory | Performance optimization with benchmarking | -| `security` | Security, Vulnerability, CVE, Audit | Security fixes with vulnerability checks | -| `hotfix` | Hotfix, Urgent, Critical, Emergency | Urgent fixes with minimal changes | -| `documentation` | Documentation, Docs, Comment, README | Documentation updates with example validation | -| `chore` | Chore, Dependency, Config, Maintenance | Maintenance tasks with compatibility checks | -| `standard` | (default) | Standard implementation without extra steps | - -### Strategy-Specific Execution Phases - -Each strategy extends the basic cycle with additional quality gates: - -#### 1. Debug → Reproduce → Instrument → Diagnose → Implement → Test → Verify → Cleanup - -``` -REPRODUCE → INSTRUMENT → DIAGNOSE → IMPLEMENT → TEST → VERIFY → CLEANUP -``` - -#### 2. Bugfix → Root Cause → Implement → Test → Edge Cases → Regression → Verify - -``` -ROOT_CAUSE → IMPLEMENT → TEST → EDGE_CASES → REGRESSION → VERIFY -``` - -#### 3. Feature → Design Review → Unit Tests → Implement → Integration Tests → Code Review → Docs → Verify - -``` -DESIGN_REVIEW → UNIT_TESTS → IMPLEMENT → INTEGRATION_TESTS → TEST → CODE_REVIEW → DOCS → VERIFY -``` - -#### 4. Refactor → Baseline Tests → Implement → Test → Behavior Check → Performance Compare → Verify - -``` -BASELINE_TESTS → IMPLEMENT → TEST → BEHAVIOR_PRESERVATION → PERFORMANCE_CMP → VERIFY -``` - -#### 5. Test → Coverage Baseline → Test Design → Implement → Coverage Check → Verify - -``` -COVERAGE_BASELINE → TEST_DESIGN → IMPLEMENT → COVERAGE_CHECK → VERIFY -``` - -#### 6. Performance → Profiling → Bottleneck → Implement → Benchmark → Test → Verify - -``` -PROFILING → BOTTLENECK → IMPLEMENT → BENCHMARK → TEST → VERIFY -``` - -#### 7. Security → Vulnerability Scan → Implement → Security Test → Penetration Test → Verify - -``` -VULNERABILITY_SCAN → IMPLEMENT → SECURITY_TEST → PENETRATION_TEST → VERIFY -``` - -#### 8. Hotfix → Impact Assessment → Implement → Test → Quick Verify → Verify - -``` -IMPACT_ASSESSMENT → IMPLEMENT → TEST → QUICK_VERIFY → VERIFY -``` - -#### 9. Documentation → Implement → Example Validation → Format Check → Link Validation → Verify - -``` -IMPLEMENT → EXAMPLE_VALIDATION → FORMAT_CHECK → LINK_VALIDATION → VERIFY -``` - -#### 10. Chore → Implement → Compatibility Check → Test → Changelog → Verify - -``` -IMPLEMENT → COMPATIBILITY_CHECK → TEST → CHANGELOG → VERIFY -``` - -#### 11. Standard → Implement → Test → Verify - -``` -IMPLEMENT → TEST → VERIFY -``` - -### Strategy Selection Implementation - -**Pseudo-code for strategy matching**: - -```javascript -function determineStrategy(solution) { - // Priority 1: Explicit strategy type - if (solution.strategy_type) { - return solution.strategy_type - } - - // Priority 2: Infer from task actions - const actions = solution.tasks.map(t => t.action.toLowerCase()) - const titles = solution.tasks.map(t => t.title.toLowerCase()) - const description = solution.description.toLowerCase() - const allText = [...actions, ...titles, description].join(' ') - - // Match keywords (order matters - more specific first) - if (/hotfix|urgent|critical|emergency/.test(allText)) return 'hotfix' - if (/debug|diagnose|trace|investigate/.test(allText)) return 'debug' - if (/security|vulnerability|cve|audit/.test(allText)) return 'security' - if (/performance|optimize|speed|memory|benchmark/.test(allText)) return 'performance' - if (/refactor|restructure|cleanup/.test(allText)) return 'refactor' - if (/test|coverage|e2e|integration/.test(allText)) return 'test' - if (/documentation|docs|comment|readme/.test(allText)) return 'documentation' - if (/chore|dependency|config|maintenance/.test(allText)) return 'chore' - if (/fix|patch|resolve|correct/.test(allText)) return 'bugfix' - if (/feature|add|implement|create|build/.test(allText)) return 'feature' - - // Default - return 'standard' -} -``` - -**Usage in execution flow**: - -```javascript -// After parsing solution (Step 2) -const strategy = determineStrategy(solution) -console.log(`Strategy selected: ${strategy}`) - -// During task execution (Step 3), follow strategy-specific phases -for (const task of solution.tasks) { - executeTaskWithStrategy(task, strategy) -} -``` - -## Step 2.5: Initialize Task Tracking - -After parsing solution and determining strategy, use `update_plan` to track each task: - -```javascript -// Initialize plan with all tasks from solution -update_plan({ - explanation: `Starting solution ${item_id}`, - plan: solution.tasks.map(task => ({ - step: `${task.id}: ${task.title}`, - status: "pending" - })) -}) -``` - -**Note**: Codex uses `update_plan` tool for task tracking (not TodoWrite). - -## Step 3: Execute Tasks Sequentially - -Iterate through `solution.tasks` array and execute each task. - -**Before starting each task**, mark it as in_progress: -```javascript -// Update current task status -update_plan({ - explanation: `Working on ${task.id}: ${task.title}`, - plan: tasks.map(t => ({ - step: `${t.id}: ${t.title}`, - status: t.id === task.id ? "in_progress" : (t.completed ? "completed" : "pending") - })) -}) -``` - -**After completing each task** (verification passed), mark it as completed: -```javascript -// Mark task as completed (commit happens at solution level) -update_plan({ - explanation: `Completed ${task.id}: ${task.title}`, - plan: tasks.map(t => ({ - step: `${t.id}: ${t.title}`, - status: t.id === task.id ? "completed" : t.status - })) -}) -``` - -### Phase A: IMPLEMENT - -1. **Read context files in parallel** using `multi_tool_use.parallel`: -```javascript -// Read all relevant files in parallel for context -multi_tool_use.parallel({ - tool_uses: solution.exploration_context.relevant_files.map(file => ({ - recipient_name: "functions.read_file", - parameters: { path: file } - })) -}) -``` - -2. Follow `task.implementation` steps in order -3. Apply changes to `task.modification_points` files -4. Follow `solution.exploration_context.patterns` for code style consistency -5. Run `task.regression` checks if specified to ensure no breakage - -**Output format:** -``` -## Implementing: [task.title] (Task [N]/[Total]) - -**Scope**: [task.scope] -**Action**: [task.action] - -**Steps**: -1. ✓ [implementation step 1] -2. ✓ [implementation step 2] -... - -**Files Modified**: -- path/to/file1.ts -- path/to/file2.ts -``` - -### Phase B: TEST - -1. Run all commands in `task.test.commands` -2. Verify unit tests pass (`task.test.unit`) -3. Run integration tests if specified (`task.test.integration`) - -**If tests fail**: Fix the code and re-run. Do NOT proceed until tests pass. - -**Output format:** -``` -## Testing: [task.title] - -**Test Results**: -- [x] Unit tests: PASSED -- [x] Integration tests: PASSED (or N/A) -``` - -### Phase C: VERIFY - -Check all `task.acceptance.criteria` are met using `task.acceptance.verification` steps: - -``` -## Verifying: [task.title] - -**Acceptance Criteria**: -- [x] Criterion 1: Verified -- [x] Criterion 2: Verified -... - -**Verification Steps**: -- [x] Run test command -- [x] Manual verification step - -All criteria met: YES -``` - -**If any criterion fails**: Go back to IMPLEMENT phase and fix. - -### Repeat for Next Task - -Continue to next task in `solution.tasks` array until all tasks are complete. - -**Note**: Do NOT commit after each task. Commits happen at solution level after all tasks pass. - -## Step 3.5: Commit Solution - -After ALL tasks in the solution pass implementation, testing, and verification, commit once for the entire solution: - -```bash -# Stage all modified files from all tasks -git add path/to/file1.ts path/to/file2.ts ... - -# Commit with clean, standard format (NO solution metadata) -git commit -m "[commit_type](scope): [brief description of changes]" - -# Example commits: -# feat(auth): add token refresh mechanism -# fix(payment): resolve timeout handling in checkout flow -# refactor(api): simplify error handling logic -``` - -**Commit Type Selection**: -- `feat`: New feature or capability -- `fix`: Bug fix -- `refactor`: Code restructuring without behavior change -- `test`: Adding or updating tests -- `docs`: Documentation changes -- `chore`: Maintenance tasks - -**Commit Language**: -- Use **Chinese** commit summary if project's `CLAUDE.md` specifies Chinese response guidelines or user explicitly requests Chinese -- Use **English** commit summary by default or when project targets international collaboration -- Check project's existing commit history for language convention consistency - -**Output format:** -``` -## Solution Committed: [solution_id] - -**Commit**: [commit hash] -**Type**: [commit_type]([scope]) - -**Changes**: -- [Feature/Fix/Improvement]: [What functionality was added/fixed/improved] -- [Specific change 1] -- [Specific change 2] - -**Files Modified**: -- path/to/file1.ts - [Brief description of changes] -- path/to/file2.ts - [Brief description of changes] -- path/to/file3.ts - [Brief description of changes] - -**Solution**: [solution_id] ([N] tasks completed) -``` - -## Step 4: Report Completion - -After ALL tasks in the solution are complete and committed, report to queue system with full solution metadata: - -```javascript -// ccw auto-detects worktree and uses main repo's .workflow/ -// Record ALL solution context here (NOT in git commit) -shell_command({ - command: `ccw issue done ${item_id} --result '${JSON.stringify({ - solution_id: solution.id, - issue_id: issue_id, - commit: { - hash: commit_hash, - type: commit_type, - scope: commit_scope, - message: commit_message - }, - analysis: { - risk: solution.analysis.risk, - impact: solution.analysis.impact, - complexity: solution.analysis.complexity - }, - tasks_completed: solution.tasks.map(t => ({ - id: t.id, - title: t.title, - action: t.action, - scope: t.scope - })), - files_modified: ["path1", "path2", ...], - tests_passed: true, - verification: { - all_tests_passed: true, - acceptance_criteria_met: true, - regression_checked: true - }, - summary: "[What was accomplished - brief description]" - })}'` -}) -``` - -**Complete Example**: - -```javascript -shell_command({ - command: `ccw issue done S-1 --result '${JSON.stringify({ - solution_id: "SOL-ISS-20251227-001-1", - issue_id: "ISS-20251227-001", - commit: { - hash: "a1b2c3d4", - type: "feat", - scope: "auth", - message: "feat(auth): add token refresh mechanism" - }, - analysis: { - risk: "low", - impact: "medium", - complexity: "medium" - }, - tasks_completed: [ - { id: "T1", title: "Implement refresh token endpoint", action: "Add", scope: "src/auth/" }, - { id: "T2", title: "Add token rotation logic", action: "Create", scope: "src/auth/services/" } - ], - files_modified: [ - "src/auth/routes/token.ts", - "src/auth/services/refresh.ts", - "src/auth/middleware/validate.ts" - ], - tests_passed: true, - verification: { - all_tests_passed: true, - acceptance_criteria_met: true, - regression_checked: true - }, - summary: "Implemented token refresh mechanism with automatic rotation" - })}'` -}) -``` - -**If solution failed:** - -```javascript -shell_command({ - command: `ccw issue done ${item_id} --fail --reason '${JSON.stringify({ - task_id: "TX", - error_type: "test_failure", - message: "Integration tests failed: timeout in token validation", - files_attempted: ["path1", "path2"], - commit: null - })}'` -}) -``` - -## Step 5: Continue to Next Solution - -Fetch next solution (using same QUEUE_ID from Step 0/1): - -```javascript -// ccw auto-detects worktree -// Continue using the same QUEUE_ID throughout execution -const result = shell_command({ command: `ccw issue next --queue ${QUEUE_ID}` }) -``` - -**Output progress:** -``` -✓ [N/M] Completed: [item_id] - [solution.description] - Commit: [commit_hash] ([commit_type]) - Tasks: [task_count] completed -→ Fetching next solution... -``` - -**DO NOT STOP.** Return to Step 2 and continue until queue is empty. - -## Final Summary - -When `ccw issue next` returns `{ "status": "empty" }`: - -**If running in worktree mode**: Prompt user for merge/PR/keep choice (see "Completion - User Choice" above) before outputting summary. - -```markdown -## Issue Queue Execution Complete - -**Total Solutions Executed**: N -**Total Tasks Executed**: M -**Total Commits**: N (one per solution) - -**Solution Commits**: -| # | Solution | Tasks | Commit | Type | -|---|----------|-------|--------|------| -| 1 | SOL-xxx-1 | T1, T2 | abc123 | feat | -| 2 | SOL-xxx-2 | T1 | def456 | fix | -| 3 | SOL-yyy-1 | T1, T2, T3 | ghi789 | refactor | - -**Files Modified**: -- path/to/file1.ts -- path/to/file2.ts - -**Summary**: -[Overall what was accomplished] -``` - -## Execution Rules - -1. **Never stop mid-queue** - Continue until queue is empty -2. **One solution at a time** - Fully complete (all tasks + commit + report) before moving on -3. **Sequential within solution** - Complete each task's implement/test/verify before next task -4. **Tests MUST pass** - Do not proceed if any task's tests fail -5. **One commit per solution** - All tasks share a single commit with formatted summary -6. **Self-verify** - All acceptance criteria must pass before solution commit -7. **Report accurately** - Use `ccw issue done` after each solution -8. **Handle failures gracefully** - If a solution fails, report via `ccw issue done --fail` and continue to next -9. **Track with update_plan** - Use update_plan tool for task progress tracking -10. **Worktree auto-detect** - `ccw issue` commands auto-redirect to main repo from worktree - -## Error Handling - -| Situation | Action | -|-----------|--------| -| `ccw issue next` returns empty | All done - output final summary | -| Tests fail | Fix code, re-run tests | -| Verification fails | Go back to implement phase | -| Solution commit fails | Check staging, retry commit | -| `ccw issue done` fails | Log error, continue to next solution | -| Any task unrecoverable | Call `ccw issue done --fail`, continue to next solution | - -## CLI Command Reference - -| Command | Purpose | -|---------|---------| -| `ccw issue queue list --brief --json` | List all queues (for queue selection) | -| `ccw issue next --queue QUE-xxx` | Fetch next solution from specified queue (**--queue required**) | -| `ccw issue done ` | Mark solution complete with result (auto-detects queue) | -| `ccw issue done --fail --reason "..."` | Mark solution failed with structured reason | -| `ccw issue retry --queue QUE-xxx` | Reset failed items in specific queue | - -## Start Execution - -**Step 0: Validate Queue ID** - -If `--queue` was NOT provided in the command arguments: -1. Run `ccw issue queue list --brief --json` -2. Filter and display active/pending queues to user -3. **Stop execution**, prompt user to rerun with `--queue QUE-xxx` - -**Step 1: Fetch First Solution** - -Once queue ID is confirmed, begin by running: - -```bash -ccw issue next --queue -``` - -Then follow the solution lifecycle for each solution until queue is empty. diff --git a/.codex/skills/issue-resolve/SKILL.md b/.codex/skills/issue-resolve/SKILL.md deleted file mode 100644 index 680f127d..00000000 --- a/.codex/skills/issue-resolve/SKILL.md +++ /dev/null @@ -1,399 +0,0 @@ ---- -name: issue-resolve -description: Unified issue resolution pipeline with source selection. Plan issues via AI exploration, convert from artifacts, import from brainstorm sessions, form execution queues, or export solutions to task JSON. Triggers on "issue:plan", "issue:queue", "issue:convert-to-plan", "issue:from-brainstorm", "export-to-tasks", "resolve issue", "plan issue", "queue issues", "convert plan to issue". -allowed-tools: spawn_agent, wait, send_input, close_agent, AskUserQuestion, Read, Write, Edit, Bash, Glob, Grep ---- - -# Issue Resolve (Codex Version) - -Unified issue resolution pipeline that orchestrates solution creation from multiple sources and queue formation for execution. - -## Architecture Overview - -``` -┌─────────────────────────────────────────────────────────────────┐ -│ Issue Resolve Orchestrator (SKILL.md) │ -│ → Source selection → Route to phase → Execute → Summary │ -└───────────────┬─────────────────────────────────────────────────┘ - │ - ├─ ASK_USER: Select issue source - │ - ┌───────────┼───────────┬───────────┬───────────┐ - ↓ ↓ ↓ ↓ │ -┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ -│ Phase 1 │ │ Phase 2 │ │ Phase 3 │ │ Phase 4 │ │ -│ Explore │ │ Convert │ │ From │ │ Form │ │ -│ & Plan │ │Artifact │ │Brainstorm│ │ Queue │ │ -└─────────┘ └─────────┘ └─────────┘ └─────────┘ │ - ↓ ↓ ↓ ↓ │ - Solutions Solutions Issue+Sol Exec Queue │ - (bound) (bound) (bound) (ordered) │ - │ │ │ │ - └─────┬─────┘───────────┘ │ - ↓ (optional --export-tasks) │ - .task/TASK-*.json │ - │ - ┌────────────────────────────────┘ - ↓ - /issue:execute -``` - -## Key Design Principles - -1. **Source-Driven Routing**: ASK_USER selects workflow, then load single phase -2. **Progressive Phase Loading**: Only read the selected phase document -3. **CLI-First Data Access**: All issue/solution CRUD via `ccw issue` CLI commands -4. **Auto Mode Support**: `-y` flag skips source selection (defaults to Explore & Plan) - -## Subagent API Reference - -### spawn_agent -Create a new subagent with task assignment. - -```javascript -const agentId = spawn_agent({ - message: ` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: ~/.codex/agents/{agent-type}.md (MUST read first) -2. Read: {projectRoot}/.workflow/project-tech.json -3. Read: {projectRoot}/.workflow/project-guidelines.json - -## TASK CONTEXT -${taskContext} - -## DELIVERABLES -${deliverables} -` -}) -``` - -### wait -Get results from subagent (only way to retrieve results). - -```javascript -const result = wait({ - ids: [agentId], - timeout_ms: 600000 // 10 minutes -}) - -if (result.timed_out) { - // Handle timeout - can continue waiting or send_input to prompt completion -} -``` - -### send_input -Continue interaction with active subagent (for clarification or follow-up). - -```javascript -send_input({ - id: agentId, - message: ` -## CLARIFICATION ANSWERS -${answers} - -## NEXT STEP -Continue with updated analysis. -` -}) -``` - -### close_agent -Clean up subagent resources (irreversible). - -```javascript -close_agent({ id: agentId }) -``` - -## Auto Mode - -When `--yes` or `-y`: Skip source selection, use Explore & Plan for issue IDs, or auto-detect source type for paths. - -## Usage - -``` -codex -p "@.codex/prompts/issue-resolve.md " -codex -p "@.codex/prompts/issue-resolve.md [FLAGS] \"\"" - -# Flags --y, --yes Skip all confirmations (auto mode) ---source Pre-select source: plan|convert|brainstorm|queue ---batch-size Max issues per agent batch (plan mode, default: 3) ---issue Bind to existing issue (convert mode) ---supplement Add tasks to existing solution (convert mode) ---queues Number of parallel queues (queue mode, default: 1) ---export-tasks Export solution tasks to .task/TASK-*.json (task-schema.json format) - -# Examples -codex -p "@.codex/prompts/issue-resolve.md GH-123,GH-124" # Explore & plan issues -codex -p "@.codex/prompts/issue-resolve.md --source plan --all-pending" # Plan all pending issues -codex -p "@.codex/prompts/issue-resolve.md --source convert \".workflow/.lite-plan/my-plan\"" # Convert artifact -codex -p "@.codex/prompts/issue-resolve.md --source brainstorm SESSION=\"BS-rate-limiting\"" # From brainstorm -codex -p "@.codex/prompts/issue-resolve.md --source queue" # Form execution queue -codex -p "@.codex/prompts/issue-resolve.md -y GH-123" # Auto mode, plan single issue -``` - -## Execution Flow - -``` -Input Parsing: - └─ Parse flags (--source, -y, --issue, etc.) and positional args - -Source Selection: - ├─ --source flag provided → Route directly - ├─ Auto-detect from input: - │ ├─ Issue IDs (GH-xxx, ISS-xxx) → Explore & Plan - │ ├─ SESSION="..." → From Brainstorm - │ ├─ File/folder path → Convert from Artifact - │ └─ No input or --all-pending → Explore & Plan (all pending) - └─ Otherwise → ASK_USER to select source - -Phase Execution (load one phase): - ├─ Phase 1: Explore & Plan → phases/01-issue-plan.md - ├─ Phase 2: Convert Artifact → phases/02-convert-to-plan.md - ├─ Phase 3: From Brainstorm → phases/03-from-brainstorm.md - └─ Phase 4: Form Queue → phases/04-issue-queue.md - -Post-Phase: - ├─ Export to Task JSON (optional, with --export-tasks flag) - │ ├─ For each solution.tasks[] → write .task/TASK-{T-id}.json - │ └─ Generate plan.json (plan-overview-base-schema) from exported tasks - └─ Summary + Next steps recommendation -``` - -### Phase Reference Documents - -| Phase | Document | Load When | Purpose | -|-------|----------|-----------|---------| -| Phase 1 | [phases/01-issue-plan.md](phases/01-issue-plan.md) | Source = Explore & Plan | Batch plan issues via issue-plan-agent | -| Phase 2 | [phases/02-convert-to-plan.md](phases/02-convert-to-plan.md) | Source = Convert Artifact | Convert lite-plan/session/markdown to solutions | -| Phase 3 | [phases/03-from-brainstorm.md](phases/03-from-brainstorm.md) | Source = From Brainstorm | Convert brainstorm ideas to issue + solution | -| Phase 4 | [phases/04-issue-queue.md](phases/04-issue-queue.md) | Source = Form Queue | Order bound solutions into execution queue | - -## Core Rules - -1. **Source Selection First**: Always determine source before loading any phase -2. **Single Phase Load**: Only read the selected phase document, never load all phases -3. **CLI Data Access**: Use `ccw issue` CLI for all issue/solution operations, NEVER read files directly -4. **Content Preservation**: Each phase contains complete execution logic from original commands -5. **Auto-Detect Input**: Smart input parsing reduces need for explicit --source flag -6. **DO NOT STOP**: Continuous multi-phase workflow. After completing each phase, immediately proceed to next -7. **Explicit Lifecycle**: Always close_agent after wait completes to free resources - -## Input Processing - -### Auto-Detection Logic - -```javascript -function detectSource(input, flags) { - // 1. Explicit --source flag - if (flags.source) return flags.source; - - // 2. Auto-detect from input content - const trimmed = input.trim(); - - // Issue IDs pattern (GH-xxx, ISS-xxx, comma-separated) - if (trimmed.match(/^[A-Z]+-\d+/i) || trimmed.includes(',')) { - return 'plan'; - } - - // --all-pending or empty input → plan all pending - if (flags.allPending || trimmed === '') { - return 'plan'; - } - - // SESSION="..." pattern → brainstorm - if (trimmed.includes('SESSION=')) { - return 'brainstorm'; - } - - // File/folder path → convert - if (trimmed.match(/\.(md|json)$/) || trimmed.includes('.workflow/')) { - return 'convert'; - } - - // Cannot auto-detect → ask user - return null; -} -``` - -### Source Selection (ASK_USER) - -```javascript -// When source cannot be auto-detected -const answer = ASK_USER([{ - id: "source", - type: "select", - prompt: "How would you like to create/manage issue solutions?", - options: [ - { - label: "Explore & Plan (Recommended)", - description: "AI explores codebase and generates solutions for issues" - }, - { - label: "Convert from Artifact", - description: "Convert existing lite-plan, workflow session, or markdown to solution" - }, - { - label: "From Brainstorm", - description: "Convert brainstorm session ideas into issue with solution" - }, - { - label: "Form Execution Queue", - description: "Order bound solutions into execution queue for /issue:execute" - } - ] -}]); // BLOCKS (wait for user response) - -// Route based on selection -const sourceMap = { - "Explore & Plan": "plan", - "Convert from Artifact": "convert", - "From Brainstorm": "brainstorm", - "Form Execution Queue": "queue" -}; -``` - -## Data Flow - -``` -User Input (issue IDs / artifact path / session ID / flags) - ↓ -[Parse Flags + Auto-Detect Source] - ↓ -[Source Selection] ← ASK_USER (if needed) - ↓ -[Read Selected Phase Document] - ↓ -[Execute Phase Logic] - ↓ -[Summary + Next Steps] - ├─ After Plan/Convert/Brainstorm → Suggest /issue:queue or /issue:execute - └─ After Queue → Suggest /issue:execute - -(Optional) Export to Task JSON (when --export-tasks flag is set): - ├─ For each solution.tasks[] entry: - │ ├─ solution.task.id → id (prefixed as TASK-{T-id}) - │ ├─ solution.task.title → title - │ ├─ solution.task.description → description - │ ├─ solution.task.action → action - │ ├─ solution.task.scope → scope - │ ├─ solution.task.modification_points[] → files[] - │ │ ├─ mp.file → files[].path - │ │ ├─ mp.target → files[].target - │ │ └─ mp.change → files[].changes[] - │ ├─ solution.task.acceptance → convergence - │ │ ├─ acceptance.criteria[] → convergence.criteria[] - │ │ └─ acceptance.verification[]→ convergence.verification (joined) - │ ├─ solution.task.implementation → implementation[] - │ ├─ solution.task.test → test - │ ├─ solution.task.depends_on → depends_on - │ ├─ solution.task.commit → commit - │ └─ solution.task.priority → priority (1→critical, 2→high, 3→medium, 4-5→low) - ├─ Output path: .workflow/issues/{issue-id}/.task/TASK-{T-id}.json - ├─ Each file follows task-schema.json (IDENTITY + CONVERGENCE + FILES required) - ├─ source.tool = "issue-resolve", source.issue_id = {issue-id} - │ - └─ Generate plan.json (after all TASK-*.json exported): - const issueDir = `.workflow/issues/${issueId}` - const taskFiles = Glob(`${issueDir}/.task/TASK-*.json`) - const taskIds = taskFiles.map(f => JSON.parse(Read(f)).id).sort() - - // Guard: skip plan.json if no tasks generated - if (taskIds.length === 0) { - console.warn('No tasks generated; skipping plan.json') - } else { - - const planOverview = { - summary: `Issue resolution plan for ${issueId}: ${issueTitle}`, - approach: solution.approach || "AI-explored resolution strategy", - task_ids: taskIds, - task_count: taskIds.length, - complexity: taskIds.length > 5 ? "High" : taskIds.length > 2 ? "Medium" : "Low", - _metadata: { - timestamp: getUtc8ISOString(), - source: "issue-plan-agent", - planning_mode: "agent-based", - plan_type: "feature", - schema_version: "2.0" - } - } - Write(`${issueDir}/plan.json`, JSON.stringify(planOverview, null, 2)) - - } // end guard - Output path: .workflow/issues/{issue-id}/plan.json -``` - -## Task Tracking Pattern - -```javascript -// Initialize plan with phase steps -update_plan({ - explanation: "Issue resolve workflow started", - plan: [ - { step: "Select issue source", status: "completed" }, - { step: "Execute: [selected phase name]", status: "in_progress" }, - { step: "Summary & next steps", status: "pending" } - ] -}) -``` - -Phase-specific sub-tasks are attached when the phase executes (see individual phase docs for details). - -## Core Guidelines - -**Data Access Principle**: Issues and solutions files can grow very large. To avoid context overflow: - -| Operation | Correct | Incorrect | -|-----------|---------|-----------| -| List issues (brief) | `ccw issue list --status pending --brief` | `Read('issues.jsonl')` | -| Read issue details | `ccw issue status --json` | `Read('issues.jsonl')` | -| Update status | `ccw issue update --status ...` | Direct file edit | -| Bind solution | `ccw issue bind ` | Direct file edit | -| Batch solutions | `ccw issue solutions --status planned --brief` | Loop individual queries | - -**Output Options**: -- `--brief`: JSON with minimal fields (orchestrator use) -- `--json`: Full JSON (agent use only) - -**ALWAYS** use CLI commands for CRUD operations. **NEVER** read entire `issues.jsonl` or `solutions/*.jsonl` directly. - -## Error Handling - -| Error | Resolution | -|-------|------------| -| No source detected | Show ASK_USER with all 4 options | -| Invalid source type | Show available sources, re-prompt | -| Phase execution fails | Report error, suggest manual intervention | -| No pending issues (plan) | Suggest creating issues first | -| No bound solutions (queue) | Suggest running plan/convert/brainstorm first | - -## Post-Phase Next Steps - -After successful phase execution, recommend next action: - -```javascript -// After Plan/Convert/Brainstorm (solutions created) -ASK_USER([{ - id: "next_action", - type: "select", - prompt: "Solutions created. What next?", - options: [ - { label: "Form Queue", description: "Order solutions for execution (/issue:queue)" }, - { label: "Plan More Issues", description: "Continue creating solutions" }, - { label: "View Issues", description: "Review issue details" }, - { label: "Done", description: "Exit workflow" } - ] -}]); // BLOCKS (wait for user response) - -// After Queue (queue formed) -// → Suggest /issue:execute directly -``` - -## Related Commands - -- `issue-manage` - Interactive issue CRUD operations -- `/issue:execute` - Execute queue with DAG-based parallel orchestration -- `ccw issue list` - List all issues -- `ccw issue status ` - View issue details diff --git a/.codex/skills/issue-resolve/phases/01-issue-plan.md b/.codex/skills/issue-resolve/phases/01-issue-plan.md deleted file mode 100644 index 28bc3e5a..00000000 --- a/.codex/skills/issue-resolve/phases/01-issue-plan.md +++ /dev/null @@ -1,316 +0,0 @@ -# Phase 1: Explore & Plan - -## Overview - -Batch plan issue resolution using **issue-plan-agent** that combines exploration and planning into a single closed-loop workflow. - -**Behavior:** -- Single solution per issue → auto-bind -- Multiple solutions → return for user selection -- Agent handles file generation - -## Prerequisites - -- Issue IDs provided (comma-separated) or `--all-pending` flag -- `ccw issue` CLI available -- `{projectRoot}/.workflow/issues/` directory exists or will be created - -## Auto Mode - -When `--yes` or `-y`: Auto-bind solutions without confirmation, use recommended settings. - -## Core Guidelines - -**Data Access Principle**: Issues and solutions files can grow very large. To avoid context overflow: - -| Operation | Correct | Incorrect | -|-----------|---------|-----------| -| List issues (brief) | `ccw issue list --status pending --brief` | `Read('issues.jsonl')` | -| Read issue details | `ccw issue status --json` | `Read('issues.jsonl')` | -| Update status | `ccw issue update --status ...` | Direct file edit | -| Bind solution | `ccw issue bind ` | Direct file edit | - -**Output Options**: -- `--brief`: JSON with minimal fields (id, title, status, priority, tags) -- `--json`: Full JSON (agent use only) - -**Orchestration vs Execution**: -- **Command (orchestrator)**: Use `--brief` for minimal context -- **Agent (executor)**: Fetch full details → `ccw issue status --json` - -**ALWAYS** use CLI commands for CRUD operations. **NEVER** read entire `issues.jsonl` or `solutions/*.jsonl` directly. - -## Execution Steps - -### Step 1.1: Issue Loading (Brief Info Only) - -```javascript -const batchSize = flags.batchSize || 3; -let issues = []; // {id, title, tags} - brief info for grouping only - -// Default to --all-pending if no input provided -const useAllPending = flags.allPending || !userInput || userInput.trim() === ''; - -if (useAllPending) { - // Get pending issues with brief metadata via CLI - const result = Bash(`ccw issue list --status pending,registered --json`).trim(); - const parsed = result ? JSON.parse(result) : []; - issues = parsed.map(i => ({ id: i.id, title: i.title || '', tags: i.tags || [] })); - - if (issues.length === 0) { - console.log('No pending issues found.'); - return; - } - console.log(`Found ${issues.length} pending issues`); -} else { - // Parse comma-separated issue IDs, fetch brief metadata - const ids = userInput.includes(',') - ? userInput.split(',').map(s => s.trim()) - : [userInput.trim()]; - - for (const id of ids) { - Bash(`ccw issue init ${id} --title "Issue ${id}" 2>/dev/null || true`); - const info = Bash(`ccw issue status ${id} --json`).trim(); - const parsed = info ? JSON.parse(info) : {}; - issues.push({ id, title: parsed.title || '', tags: parsed.tags || [] }); - } -} -// Note: Agent fetches full issue content via `ccw issue status --json` - -// Intelligent grouping: Analyze issues by title/tags, group semantically similar ones -// Strategy: Same module/component, related bugs, feature clusters -// Constraint: Max ${batchSize} issues per batch - -console.log(`Processing ${issues.length} issues in ${batches.length} batch(es)`); - -update_plan({ - explanation: "Issue loading complete, starting batch planning", - plan: batches.map((_, i) => ({ - step: `Plan batch ${i+1}`, - status: 'pending' - })) -}); -``` - -### Step 1.2: Unified Explore + Plan (issue-plan-agent) - PARALLEL - -```javascript -Bash(`mkdir -p ${projectRoot}/.workflow/issues/solutions`); -const pendingSelections = []; // Collect multi-solution issues for user selection -const agentResults = []; // Collect all agent results for conflict aggregation - -// Build prompts for all batches -const agentTasks = batches.map((batch, batchIndex) => { - const issueList = batch.map(i => `- ${i.id}: ${i.title}${i.tags.length ? ` [${i.tags.join(', ')}]` : ''}`).join('\n'); - const batchIds = batch.map(i => i.id); - - const issuePrompt = ` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: ~/.codex/agents/issue-plan-agent.md (MUST read first) -2. Read: {projectRoot}/.workflow/project-tech.json -3. Read: {projectRoot}/.workflow/project-guidelines.json - ---- - -## Plan Issues - -**Issues** (grouped by similarity): -${issueList} - -**Project Root**: ${process.cwd()} - -### Project Context (MANDATORY) -1. Read: {projectRoot}/.workflow/project-tech.json (technology stack, architecture) -2. Read: {projectRoot}/.workflow/project-guidelines.json (constraints and conventions) - -### Workflow -1. Fetch issue details: ccw issue status --json -2. **Analyze failure history** (if issue.feedback exists): - - Extract failure details from issue.feedback (type='failure', stage='execute') - - Parse error_type, message, task_id, solution_id from content JSON - - Identify failure patterns: repeated errors, root causes, blockers - - **Constraint**: Avoid repeating failed approaches -3. Load project context files -4. Explore codebase (ACE semantic search) -5. Plan solution with tasks (schema: solution-schema.json) - - **If previous solution failed**: Reference failure analysis in solution.approach - - Add explicit verification steps to prevent same failure mode -6. **If github_url exists**: Add final task to comment on GitHub issue -7. Write solution to: ${projectRoot}/.workflow/issues/solutions/{issue-id}.jsonl -8. **CRITICAL - Binding Decision**: - - Single solution → **MUST execute**: ccw issue bind - - Multiple solutions → Return pending_selection only (no bind) - -### Failure-Aware Planning Rules -- **Extract failure patterns**: Parse issue.feedback where type='failure' and stage='execute' -- **Identify root causes**: Analyze error_type (test_failure, compilation, timeout, etc.) -- **Design alternative approach**: Create solution that addresses root cause -- **Add prevention steps**: Include explicit verification to catch same error earlier -- **Document lessons**: Reference previous failures in solution.approach - -### Rules -- Solution ID format: SOL-{issue-id}-{uid} (uid: 4 random alphanumeric chars, e.g., a7x9) -- Single solution per issue → auto-bind via ccw issue bind -- Multiple solutions → register only, return pending_selection -- Tasks must have quantified acceptance.criteria - -### Return Summary -{"bound":[{"issue_id":"...","solution_id":"...","task_count":N}],"pending_selection":[{"issue_id":"...","solutions":[{"id":"...","description":"...","task_count":N}]}]} -`; - - return { batchIndex, batchIds, issuePrompt, batch }; -}); - -// Launch agents in parallel (max 10 concurrent) -const MAX_PARALLEL = 10; -for (let i = 0; i < agentTasks.length; i += MAX_PARALLEL) { - const chunk = agentTasks.slice(i, i + MAX_PARALLEL); - const agentIds = []; - - // Step 1: Spawn agents in parallel - for (const { batchIndex, batchIds, issuePrompt, batch } of chunk) { - updatePlanStep(`Plan batch ${batchIndex + 1}`, 'in_progress'); - const agentId = spawn_agent({ - message: issuePrompt - }); - agentIds.push({ agentId, batchIndex }); - } - - console.log(`Launched ${agentIds.length} agents (chunk ${Math.floor(i/MAX_PARALLEL) + 1}/${Math.ceil(agentTasks.length/MAX_PARALLEL)})...`); - - // Step 2: Batch wait for all agents in this chunk - const allIds = agentIds.map(a => a.agentId); - const waitResult = wait({ - ids: allIds, - timeout_ms: 600000 // 10 minutes - }); - - if (waitResult.timed_out) { - console.log('Some agents timed out, continuing with completed results'); - } - - // Step 3: Collect results from completed agents - for (const { agentId, batchIndex } of agentIds) { - const agentStatus = waitResult.status[agentId]; - if (!agentStatus || !agentStatus.completed) { - console.log(`Batch ${batchIndex + 1}: Agent did not complete, skipping`); - updatePlanStep(`Plan batch ${batchIndex + 1}`, 'completed'); - continue; - } - - const result = agentStatus.completed; - - // Extract JSON from potential markdown code blocks (agent may wrap in ```json...```) - const jsonText = extractJsonFromMarkdown(result); - let summary; - try { - summary = JSON.parse(jsonText); - } catch (e) { - console.log(`Batch ${batchIndex + 1}: Failed to parse agent result, skipping`); - updatePlanStep(`Plan batch ${batchIndex + 1}`, 'completed'); - continue; - } - agentResults.push(summary); // Store for conflict aggregation - - // Verify binding for bound issues (agent should have executed bind) - for (const item of summary.bound || []) { - const status = JSON.parse(Bash(`ccw issue status ${item.issue_id} --json`).trim()); - if (status.bound_solution_id === item.solution_id) { - console.log(`${item.issue_id}: ${item.solution_id} (${item.task_count} tasks)`); - } else { - // Fallback: agent failed to bind, execute here - Bash(`ccw issue bind ${item.issue_id} ${item.solution_id}`); - console.log(`${item.issue_id}: ${item.solution_id} (${item.task_count} tasks) [recovered]`); - } - } - // Collect pending selections - for (const pending of summary.pending_selection || []) { - pendingSelections.push(pending); - } - updatePlanStep(`Plan batch ${batchIndex + 1}`, 'completed'); - } - - // Step 4: Batch cleanup - close all agents in this chunk - allIds.forEach(id => close_agent({ id })); -} -``` - -### Step 1.3: Solution Selection (if pending) - -```javascript -// Handle multi-solution issues -for (const pending of pendingSelections) { - if (pending.solutions.length === 0) continue; - - const options = pending.solutions.slice(0, 4).map(sol => ({ - label: `${sol.id} (${sol.task_count} tasks)`, - description: sol.description || sol.approach || 'No description' - })); - - const answer = ASK_USER([{ - id: pending.issue_id, - type: "select", - prompt: `Issue ${pending.issue_id}: which solution to bind?`, - options: options - }]); // BLOCKS (wait for user response) - - const selected = answer[Object.keys(answer)[0]]; - if (!selected || selected === 'Other') continue; - - const solId = selected.split(' ')[0]; - Bash(`ccw issue bind ${pending.issue_id} ${solId}`); - console.log(`${pending.issue_id}: ${solId} bound`); -} -``` - -### Step 1.4: Summary - -```javascript -// Count planned issues via CLI -const planned = JSON.parse(Bash(`ccw issue list --status planned --brief`) || '[]'); -const plannedCount = planned.length; - -console.log(` -## Done: ${issues.length} issues → ${plannedCount} planned - -Next: \`/issue:queue\` → \`/issue:execute\` -`); -``` - -## Error Handling - -| Error | Resolution | -|-------|------------| -| Issue not found | Auto-create in issues.jsonl | -| ACE search fails | Agent falls back to ripgrep | -| No solutions generated | Display error, suggest manual planning | -| User cancels selection | Skip issue, continue with others | -| File conflicts | Agent detects and suggests resolution order | - -## Bash Compatibility - -**Avoid**: `$(cmd)`, `$var`, `for` loops — will be escaped incorrectly - -**Use**: Simple commands + `&&` chains, quote comma params `"pending,registered"` - -## Quality Checklist - -Before completing, verify: - -- [ ] All input issues have solutions in `solutions/{issue-id}.jsonl` -- [ ] Single solution issues are auto-bound (`bound_solution_id` set) -- [ ] Multi-solution issues returned in `pending_selection` for user choice -- [ ] Each solution has executable tasks with `modification_points` -- [ ] Task acceptance criteria are quantified (not vague) -- [ ] Conflicts detected and reported (if multiple issues touch same files) -- [ ] Issue status updated to `planned` after binding -- [ ] All spawned agents are properly closed via close_agent - -## Post-Phase Update - -After plan completion: -- All processed issues should have `status: planned` and `bound_solution_id` set -- Report: total issues processed, solutions bound, pending selections resolved -- Recommend next step: Form execution queue via Phase 4 diff --git a/.codex/skills/issue-resolve/phases/02-convert-to-plan.md b/.codex/skills/issue-resolve/phases/02-convert-to-plan.md deleted file mode 100644 index fe5b6482..00000000 --- a/.codex/skills/issue-resolve/phases/02-convert-to-plan.md +++ /dev/null @@ -1,691 +0,0 @@ -# Phase 2: Convert from Artifact - -## Overview - -Converts various planning artifact formats into issue workflow solutions with intelligent detection and automatic binding. - -**Supported Sources** (auto-detected): -- **lite-plan**: `{projectRoot}/.workflow/.lite-plan/{slug}/plan.json` -- **workflow-session**: `WFS-xxx` ID or `{projectRoot}/.workflow/active/{session}/` folder -- **markdown**: Any `.md` file with implementation/task content -- **json**: Direct JSON files matching plan-json-schema - -## Prerequisites - -- Source artifact path or WFS-xxx ID provided -- `ccw issue` CLI available -- `{projectRoot}/.workflow/issues/` directory exists or will be created - -## Auto Mode - -When `--yes` or `-y`: Skip confirmation, auto-create issue and bind solution. - -## Command Options - -| Option | Description | Default | -|--------|-------------|---------| -| `` | Planning artifact path or WFS-xxx ID | Required | -| `--issue ` | Bind to existing issue instead of creating new | Auto-create | -| `--supplement` | Add tasks to existing solution (requires --issue) | false | -| `-y, --yes` | Skip all confirmations | false | - -## Core Data Access Principle - -**Important**: Use CLI commands for all issue/solution operations. - -| Operation | Correct | Incorrect | -|-----------|---------|-----------| -| Get issue | `ccw issue status --json` | Read issues.jsonl directly | -| Create issue | `ccw issue init --title "..."` | Write to issues.jsonl | -| Bind solution | `ccw issue bind ` | Edit issues.jsonl | -| List solutions | `ccw issue solutions --issue --brief` | Read solutions/*.jsonl | - -## Solution Schema Reference - -Target format for all extracted data (from solution-schema.json): - -```typescript -interface Solution { - id: string; // SOL-{issue-id}-{4-char-uid} - description?: string; // High-level summary - approach?: string; // Technical strategy - tasks: Task[]; // Required: at least 1 task - exploration_context?: object; // Optional: source context - analysis?: { risk, impact, complexity }; - score?: number; // 0.0-1.0 - is_bound: boolean; - created_at: string; - bound_at?: string; -} - -interface Task { - id: string; // T1, T2, T3... (pattern: ^T[0-9]+$) - title: string; // Required: action verb + target - scope: string; // Required: module path or feature area - action: Action; // Required: Create|Update|Implement|... - description?: string; - modification_points?: Array<{file, target, change}>; - implementation: string[]; // Required: step-by-step guide - test?: { unit?, integration?, commands?, coverage_target? }; - acceptance: { criteria: string[], verification: string[] }; // Required - commit?: { type, scope, message_template, breaking? }; - depends_on?: string[]; - priority?: number; // 1-5 (default: 3) -} - -type Action = 'Create' | 'Update' | 'Implement' | 'Refactor' | 'Add' | 'Delete' | 'Configure' | 'Test' | 'Fix'; -``` - -## Execution Steps - -### Step 2.1: Parse Arguments & Detect Source Type - -```javascript -const input = userInput.trim(); -const flags = parseFlags(userInput); // --issue, --supplement, -y/--yes - -// Extract source path (first non-flag argument) -const source = extractSourceArg(input); - -// Detect source type -function detectSourceType(source) { - // Check for WFS-xxx pattern (workflow session ID) - if (source.match(/^WFS-[\w-]+$/)) { - return { type: 'workflow-session-id', path: `${projectRoot}/.workflow/active/${source}` }; - } - - // Check if directory - const isDir = Bash(`test -d "${source}" && echo "dir" || echo "file"`).trim() === 'dir'; - - if (isDir) { - // Check for lite-plan indicator - const hasPlanJson = Bash(`test -f "${source}/plan.json" && echo "yes" || echo "no"`).trim() === 'yes'; - if (hasPlanJson) { - return { type: 'lite-plan', path: source }; - } - - // Check for workflow session indicator - const hasSession = Bash(`test -f "${source}/workflow-session.json" && echo "yes" || echo "no"`).trim() === 'yes'; - if (hasSession) { - return { type: 'workflow-session', path: source }; - } - } - - // Check file extensions - if (source.endsWith('.json')) { - return { type: 'json-file', path: source }; - } - if (source.endsWith('.md')) { - return { type: 'markdown-file', path: source }; - } - - // Check if path exists at all - const exists = Bash(`test -e "${source}" && echo "yes" || echo "no"`).trim() === 'yes'; - if (!exists) { - throw new Error(`E001: Source not found: ${source}`); - } - - return { type: 'unknown', path: source }; -} - -const sourceInfo = detectSourceType(source); -if (sourceInfo.type === 'unknown') { - throw new Error(`E002: Unable to detect source format for: ${source}`); -} - -console.log(`Detected source type: ${sourceInfo.type}`); -``` - -### Step 2.2: Extract Data Using Format-Specific Extractor - -```javascript -let extracted = { title: '', approach: '', tasks: [], metadata: {} }; - -switch (sourceInfo.type) { - case 'lite-plan': - extracted = extractFromLitePlan(sourceInfo.path); - break; - case 'workflow-session': - case 'workflow-session-id': - extracted = extractFromWorkflowSession(sourceInfo.path); - break; - case 'markdown-file': - extracted = await extractFromMarkdownAI(sourceInfo.path); - break; - case 'json-file': - extracted = extractFromJsonFile(sourceInfo.path); - break; -} - -// Validate extraction -if (!extracted.tasks || extracted.tasks.length === 0) { - throw new Error('E006: No tasks extracted from source'); -} - -// Ensure task IDs are normalized to T1, T2, T3... -extracted.tasks = normalizeTaskIds(extracted.tasks); - -console.log(`Extracted: ${extracted.tasks.length} tasks`); -``` - -#### Extractor: Lite-Plan - -```javascript -function extractFromLitePlan(folderPath) { - const planJson = Read(`${folderPath}/plan.json`); - const plan = JSON.parse(planJson); - - return { - title: plan.summary?.split('.')[0]?.trim() || 'Untitled Plan', - description: plan.summary, - approach: plan.approach, - tasks: plan.tasks.map(t => ({ - id: t.id, - title: t.title, - scope: t.scope || '', - action: t.action || 'Implement', - description: t.description || t.title, - modification_points: t.modification_points || [], - implementation: Array.isArray(t.implementation) ? t.implementation : [t.implementation || ''], - test: t.verification ? { - unit: t.verification.unit_tests, - integration: t.verification.integration_tests, - commands: t.verification.manual_checks - } : {}, - acceptance: { - criteria: Array.isArray(t.acceptance) ? t.acceptance : [t.acceptance || ''], - verification: t.verification?.manual_checks || [] - }, - depends_on: t.depends_on || [], - priority: 3 - })), - metadata: { - source_type: 'lite-plan', - source_path: folderPath, - complexity: plan.complexity, - estimated_time: plan.estimated_time, - exploration_angles: plan._metadata?.exploration_angles || [], - original_timestamp: plan._metadata?.timestamp - } - }; -} -``` - -#### Extractor: Workflow Session - -```javascript -function extractFromWorkflowSession(sessionPath) { - // Load session metadata - const sessionJson = Read(`${sessionPath}/workflow-session.json`); - const session = JSON.parse(sessionJson); - - // Load IMPL_PLAN.md for approach (if exists) - let approach = ''; - const implPlanPath = `${sessionPath}/IMPL_PLAN.md`; - const hasImplPlan = Bash(`test -f "${implPlanPath}" && echo "yes" || echo "no"`).trim() === 'yes'; - if (hasImplPlan) { - const implPlan = Read(implPlanPath); - // Extract overview/approach section - const overviewMatch = implPlan.match(/##\s*(?:Overview|Approach|Strategy)\s*\n([\s\S]*?)(?=\n##|$)/i); - approach = overviewMatch?.[1]?.trim() || implPlan.split('\n').slice(0, 10).join('\n'); - } - - // Load all task JSONs from .task folder - const taskFiles = Glob({ pattern: `${sessionPath}/.task/IMPL-*.json` }); - const tasks = taskFiles.map(f => { - const taskJson = Read(f); - const task = JSON.parse(taskJson); - return { - id: task.id?.replace(/^IMPL-0*/, 'T') || 'T1', // IMPL-001 → T1 - title: task.title, - scope: task.scope || inferScopeFromTask(task), - action: capitalizeAction(task.type) || 'Implement', - description: task.description, - modification_points: task.implementation?.modification_points || [], - implementation: task.implementation?.steps || [], - test: task.implementation?.test || {}, - acceptance: { - criteria: task.acceptance_criteria || [], - verification: task.verification_steps || [] - }, - commit: task.commit, - depends_on: (task.depends_on || []).map(d => d.replace(/^IMPL-0*/, 'T')), - priority: task.priority || 3 - }; - }); - - return { - title: session.name || session.description?.split('.')[0] || 'Workflow Session', - description: session.description || session.name, - approach: approach || session.description, - tasks: tasks, - metadata: { - source_type: 'workflow-session', - source_path: sessionPath, - session_id: session.id, - created_at: session.created_at - } - }; -} - -function inferScopeFromTask(task) { - if (task.implementation?.modification_points?.length) { - const files = task.implementation.modification_points.map(m => m.file); - // Find common directory prefix - const dirs = files.map(f => f.split('/').slice(0, -1).join('/')); - return [...new Set(dirs)][0] || ''; - } - return ''; -} - -function capitalizeAction(type) { - if (!type) return 'Implement'; - const map = { feature: 'Implement', bugfix: 'Fix', refactor: 'Refactor', test: 'Test', docs: 'Update' }; - return map[type.toLowerCase()] || type.charAt(0).toUpperCase() + type.slice(1); -} -``` - -#### Extractor: Markdown (AI-Assisted via Gemini) - -```javascript -async function extractFromMarkdownAI(filePath) { - const fileContent = Read(filePath); - - // Use Gemini CLI for intelligent extraction - const cliPrompt = `PURPOSE: Extract implementation plan from markdown document for issue solution conversion. Must output ONLY valid JSON. -TASK: • Analyze document structure • Identify title/summary • Extract approach/strategy section • Parse tasks from any format (lists, tables, sections, code blocks) • Normalize each task to solution schema -MODE: analysis -CONTEXT: Document content provided below -EXPECTED: Valid JSON object with format: -{ - "title": "extracted title", - "approach": "extracted approach/strategy", - "tasks": [ - { - "id": "T1", - "title": "task title", - "scope": "module or feature area", - "action": "Implement|Update|Create|Fix|Refactor|Add|Delete|Configure|Test", - "description": "what to do", - "implementation": ["step 1", "step 2"], - "acceptance": ["criteria 1", "criteria 2"] - } - ] -} -CONSTRAINTS: Output ONLY valid JSON - no markdown, no explanation | Action must be one of: Create, Update, Implement, Refactor, Add, Delete, Configure, Test, Fix | Tasks must have id, title, scope, action, implementation (array), acceptance (array) - -DOCUMENT CONTENT: -${fileContent}`; - - // Execute Gemini CLI - const result = Bash(`ccw cli -p '${cliPrompt.replace(/'/g, "'\\''")}' --tool gemini --mode analysis`, { timeout: 120000 }); - - // Parse JSON from result (may be wrapped in markdown code block) - let jsonText = result.trim(); - const jsonMatch = jsonText.match(/```(?:json)?\s*([\s\S]*?)```/); - if (jsonMatch) { - jsonText = jsonMatch[1].trim(); - } - - try { - const extracted = JSON.parse(jsonText); - - // Normalize tasks - const tasks = (extracted.tasks || []).map((t, i) => ({ - id: t.id || `T${i + 1}`, - title: t.title || 'Untitled task', - scope: t.scope || '', - action: validateAction(t.action) || 'Implement', - description: t.description || t.title, - modification_points: t.modification_points || [], - implementation: Array.isArray(t.implementation) ? t.implementation : [t.implementation || ''], - test: t.test || {}, - acceptance: { - criteria: Array.isArray(t.acceptance) ? t.acceptance : [t.acceptance || ''], - verification: t.verification || [] - }, - depends_on: t.depends_on || [], - priority: t.priority || 3 - })); - - return { - title: extracted.title || 'Extracted Plan', - description: extracted.summary || extracted.title, - approach: extracted.approach || '', - tasks: tasks, - metadata: { - source_type: 'markdown', - source_path: filePath, - extraction_method: 'gemini-ai' - } - }; - } catch (e) { - // Provide more context for debugging - throw new Error(`E005: Failed to extract tasks from markdown. Gemini response was not valid JSON. Error: ${e.message}. Response preview: ${jsonText.substring(0, 200)}...`); - } -} - -function validateAction(action) { - const validActions = ['Create', 'Update', 'Implement', 'Refactor', 'Add', 'Delete', 'Configure', 'Test', 'Fix']; - if (!action) return null; - const normalized = action.charAt(0).toUpperCase() + action.slice(1).toLowerCase(); - return validActions.includes(normalized) ? normalized : null; -} -``` - -#### Extractor: JSON File - -```javascript -function extractFromJsonFile(filePath) { - const content = Read(filePath); - const plan = JSON.parse(content); - - // Detect if it's already solution format or plan format - if (plan.tasks && Array.isArray(plan.tasks)) { - // Map tasks to normalized format - const tasks = plan.tasks.map((t, i) => ({ - id: t.id || `T${i + 1}`, - title: t.title, - scope: t.scope || '', - action: t.action || 'Implement', - description: t.description || t.title, - modification_points: t.modification_points || [], - implementation: Array.isArray(t.implementation) ? t.implementation : [t.implementation || ''], - test: t.test || t.verification || {}, - acceptance: normalizeAcceptance(t.acceptance), - depends_on: t.depends_on || [], - priority: t.priority || 3 - })); - - return { - title: plan.summary?.split('.')[0] || plan.title || 'JSON Plan', - description: plan.summary || plan.description, - approach: plan.approach, - tasks: tasks, - metadata: { - source_type: 'json', - source_path: filePath, - complexity: plan.complexity, - original_metadata: plan._metadata - } - }; - } - - throw new Error('E002: JSON file does not contain valid plan structure (missing tasks array)'); -} - -function normalizeAcceptance(acceptance) { - if (!acceptance) return { criteria: [], verification: [] }; - if (typeof acceptance === 'object' && acceptance.criteria) return acceptance; - if (Array.isArray(acceptance)) return { criteria: acceptance, verification: [] }; - return { criteria: [String(acceptance)], verification: [] }; -} -``` - -### Step 2.3: Normalize Task IDs - -```javascript -function normalizeTaskIds(tasks) { - return tasks.map((t, i) => ({ - ...t, - id: `T${i + 1}`, - // Also normalize depends_on references - depends_on: (t.depends_on || []).map(d => { - // Handle various ID formats: IMPL-001, T1, 1, etc. - const num = d.match(/\d+/)?.[0]; - return num ? `T${parseInt(num)}` : d; - }) - })); -} -``` - -### Step 2.4: Resolve Issue (Create or Find) - -```javascript -let issueId = flags.issue; -let existingSolution = null; - -if (issueId) { - // Validate issue exists - let issueCheck; - try { - issueCheck = Bash(`ccw issue status ${issueId} --json 2>/dev/null`).trim(); - if (!issueCheck || issueCheck === '') { - throw new Error('empty response'); - } - } catch (e) { - throw new Error(`E003: Issue not found: ${issueId}`); - } - - const issue = JSON.parse(issueCheck); - - // Check if issue already has bound solution - if (issue.bound_solution_id && !flags.supplement) { - throw new Error(`E004: Issue ${issueId} already has bound solution (${issue.bound_solution_id}). Use --supplement to add tasks.`); - } - - // Load existing solution for supplement mode - if (flags.supplement && issue.bound_solution_id) { - try { - const solResult = Bash(`ccw issue solution ${issue.bound_solution_id} --json`).trim(); - existingSolution = JSON.parse(solResult); - console.log(`Loaded existing solution with ${existingSolution.tasks.length} tasks`); - } catch (e) { - throw new Error(`Failed to load existing solution: ${e.message}`); - } - } -} else { - // Create new issue via ccw issue create (auto-generates correct ID) - // Smart extraction: title from content, priority from complexity - const title = extracted.title || 'Converted Plan'; - const context = extracted.description || extracted.approach || title; - - // Auto-determine priority based on complexity - const complexityMap = { high: 2, medium: 3, low: 4 }; - const priority = complexityMap[extracted.metadata.complexity?.toLowerCase()] || 3; - - try { - // Use heredoc to avoid shell escaping issues - const createResult = Bash(`ccw issue create << 'EOF' -{ - "title": ${JSON.stringify(title)}, - "context": ${JSON.stringify(context)}, - "priority": ${priority}, - "source": "converted" -} -EOF`).trim(); - - // Parse result to get created issue ID - const created = JSON.parse(createResult); - issueId = created.id; - console.log(`Created issue: ${issueId} (priority: ${priority})`); - } catch (e) { - throw new Error(`Failed to create issue: ${e.message}`); - } -} -``` - -### Step 2.5: Generate Solution - -```javascript -// Generate solution ID -function generateSolutionId(issueId) { - const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; - let uid = ''; - for (let i = 0; i < 4; i++) { - uid += chars[Math.floor(Math.random() * chars.length)]; - } - return `SOL-${issueId}-${uid}`; -} - -let solution; -const solutionId = generateSolutionId(issueId); - -if (flags.supplement && existingSolution) { - // Supplement mode: merge with existing solution - const maxTaskId = Math.max(...existingSolution.tasks.map(t => parseInt(t.id.slice(1)))); - - const newTasks = extracted.tasks.map((t, i) => ({ - ...t, - id: `T${maxTaskId + i + 1}` - })); - - solution = { - ...existingSolution, - tasks: [...existingSolution.tasks, ...newTasks], - approach: existingSolution.approach + '\n\n[Supplementary] ' + (extracted.approach || ''), - updated_at: new Date().toISOString() - }; - - console.log(`Supplementing: ${existingSolution.tasks.length} existing + ${newTasks.length} new = ${solution.tasks.length} total tasks`); -} else { - // New solution - solution = { - id: solutionId, - description: extracted.description || extracted.title, - approach: extracted.approach, - tasks: extracted.tasks, - exploration_context: extracted.metadata.exploration_angles ? { - exploration_angles: extracted.metadata.exploration_angles - } : undefined, - analysis: { - risk: 'medium', - impact: 'medium', - complexity: extracted.metadata.complexity?.toLowerCase() || 'medium' - }, - is_bound: false, - created_at: new Date().toISOString(), - _conversion_metadata: { - source_type: extracted.metadata.source_type, - source_path: extracted.metadata.source_path, - converted_at: new Date().toISOString() - } - }; -} -``` - -### Step 2.6: Confirm & Persist - -```javascript -// Display preview -console.log(` -## Conversion Summary - -**Issue**: ${issueId} -**Solution**: ${flags.supplement ? existingSolution.id : solutionId} -**Tasks**: ${solution.tasks.length} -**Mode**: ${flags.supplement ? 'Supplement' : 'New'} - -### Tasks: -${solution.tasks.map(t => `- ${t.id}: ${t.title} [${t.action}]`).join('\n')} -`); - -// Confirm if not auto mode -if (!flags.yes && !flags.y) { - const confirmed = CONFIRM(`Create solution for issue ${issueId} with ${solution.tasks.length} tasks?`); // BLOCKS (wait for user response) - - if (!confirmed) { - console.log('Cancelled.'); - return; - } -} - -// Persist solution (following issue-plan-agent pattern) -Bash(`mkdir -p ${projectRoot}/.workflow/issues/solutions`); - -const solutionFile = `${projectRoot}/.workflow/issues/solutions/${issueId}.jsonl`; - -if (flags.supplement) { - // Supplement mode: update existing solution line atomically - try { - const existingContent = Read(solutionFile); - const lines = existingContent.trim().split('\n').filter(l => l); - const updatedLines = lines.map(line => { - const sol = JSON.parse(line); - if (sol.id === existingSolution.id) { - return JSON.stringify(solution); - } - return line; - }); - // Atomic write: write entire content at once - Write({ file_path: solutionFile, content: updatedLines.join('\n') + '\n' }); - console.log(`Updated solution: ${existingSolution.id}`); - } catch (e) { - throw new Error(`Failed to update solution: ${e.message}`); - } - - // Note: No need to rebind - solution is already bound to issue -} else { - // New solution: append to JSONL file (following issue-plan-agent pattern) - try { - const solutionLine = JSON.stringify(solution); - - // Read existing content, append new line, write atomically - const existing = Bash(`test -f "${solutionFile}" && cat "${solutionFile}" || echo ""`).trim(); - const newContent = existing ? existing + '\n' + solutionLine + '\n' : solutionLine + '\n'; - Write({ file_path: solutionFile, content: newContent }); - - console.log(`Created solution: ${solutionId}`); - } catch (e) { - throw new Error(`Failed to write solution: ${e.message}`); - } - - // Bind solution to issue - try { - Bash(`ccw issue bind ${issueId} ${solutionId}`); - console.log(`Bound solution to issue`); - } catch (e) { - // Cleanup: remove solution file on bind failure - try { - Bash(`rm -f "${solutionFile}"`); - } catch (cleanupError) { - // Ignore cleanup errors - } - throw new Error(`Failed to bind solution: ${e.message}`); - } - - // Update issue status to planned - try { - Bash(`ccw issue update ${issueId} --status planned`); - } catch (e) { - throw new Error(`Failed to update issue status: ${e.message}`); - } -} -``` - -### Step 2.7: Summary - -```javascript -console.log(` -## Done - -**Issue**: ${issueId} -**Solution**: ${flags.supplement ? existingSolution.id : solutionId} -**Tasks**: ${solution.tasks.length} -**Status**: planned - -### Next Steps: -- \`/issue:queue\` → Form execution queue -- \`ccw issue status ${issueId}\` → View issue details -- \`ccw issue solution ${flags.supplement ? existingSolution.id : solutionId}\` → View solution -`); -``` - -## Error Handling - -| Error | Code | Resolution | -|-------|------|------------| -| Source not found | E001 | Check path exists | -| Invalid source format | E002 | Verify file contains valid plan structure | -| Issue not found | E003 | Check issue ID or omit --issue to create new | -| Solution already bound | E004 | Use --supplement to add tasks | -| AI extraction failed | E005 | Check markdown structure, try simpler format | -| No tasks extracted | E006 | Source must contain at least 1 task | - -## Post-Phase Update - -After conversion completion: -- Issue created/updated with `status: planned` and `bound_solution_id` set -- Solution persisted in `{projectRoot}/.workflow/issues/solutions/{issue-id}.jsonl` -- Report: issue ID, solution ID, task count, mode (new/supplement) -- Recommend next step: Form execution queue via Phase 4 diff --git a/.codex/skills/issue-resolve/phases/03-from-brainstorm.md b/.codex/skills/issue-resolve/phases/03-from-brainstorm.md deleted file mode 100644 index 01667c76..00000000 --- a/.codex/skills/issue-resolve/phases/03-from-brainstorm.md +++ /dev/null @@ -1,391 +0,0 @@ -# Phase 3: From Brainstorm - -## Overview - -Bridge command that converts **brainstorm-with-file** session output into executable **issue + solution** for parallel-dev-cycle consumption. - -**Core workflow**: Load Session → Select Idea → Convert to Issue → Generate Solution → Bind & Ready - -**Input sources**: -- **synthesis.json** - Main brainstorm results with top_ideas -- **perspectives.json** - Multi-CLI perspectives (creative/pragmatic/systematic) -- **.brainstorming/** - Synthesis artifacts (clarifications, enhancements from role analyses) - -**Output**: -- **Issue** (ISS-YYYYMMDD-NNN) - Full context with clarifications -- **Solution** (SOL-{issue-id}-{uid}) - Structured tasks for parallel-dev-cycle - -## Prerequisites - -- Brainstorm session ID or path (e.g., `SESSION="BS-rate-limiting-2025-01-28"`) -- `synthesis.json` must exist in session directory -- `ccw issue` CLI available - -## Auto Mode - -When `--yes` or `-y`: Auto-select highest-scored idea, skip confirmations, create issue directly. - -## Arguments - -| Argument | Required | Type | Default | Description | -|----------|----------|------|---------|-------------| -| SESSION | Yes | String | - | Session ID or path to `{projectRoot}/.workflow/.brainstorm/BS-xxx` | -| --idea | No | Integer | - | Pre-select idea by index (0-based) | -| --auto | No | Flag | false | Auto-select highest-scored idea | -| -y, --yes | No | Flag | false | Skip all confirmations | - -## Data Structures - -### Issue Schema (Output) - -```typescript -interface Issue { - id: string; // ISS-YYYYMMDD-NNN - title: string; // From idea.title - status: 'planned'; // Auto-set after solution binding - priority: number; // 1-5 (derived from idea.score) - context: string; // Full description with clarifications - source: 'brainstorm'; - labels: string[]; // ['brainstorm', perspective, feasibility] - - // Structured fields - expected_behavior: string; // From key_strengths - actual_behavior: string; // From main_challenges - affected_components: string[]; // Extracted from description - - _brainstorm_metadata: { - session_id: string; - idea_score: number; - novelty: number; - feasibility: string; - clarifications_count: number; - }; -} -``` - -### Solution Schema (Output) - -```typescript -interface Solution { - id: string; // SOL-{issue-id}-{4-char-uid} - description: string; // idea.title - approach: string; // idea.description - tasks: Task[]; // Generated from idea.next_steps - - analysis: { - risk: 'low' | 'medium' | 'high'; - impact: 'low' | 'medium' | 'high'; - complexity: 'low' | 'medium' | 'high'; - }; - - is_bound: boolean; // true - created_at: string; - bound_at: string; -} - -interface Task { - id: string; // T1, T2, T3... - title: string; // Actionable task name - scope: string; // design|implementation|testing|documentation - action: string; // Implement|Design|Research|Test|Document - description: string; - - implementation: string[]; // Step-by-step guide - acceptance: { - criteria: string[]; // What defines success - verification: string[]; // How to verify - }; - - priority: number; // 1-5 - depends_on: string[]; // Task dependencies -} -``` - -## Execution Steps - -### Step 3.1: Session Loading - -``` -Phase 1: Session Loading - ├─ Validate session path - ├─ Load synthesis.json (required) - ├─ Load perspectives.json (optional - multi-CLI insights) - ├─ Load .brainstorming/** (optional - synthesis artifacts) - └─ Validate top_ideas array exists -``` - -### Step 3.2: Idea Selection - -``` -Phase 2: Idea Selection - ├─ Auto mode: Select highest scored idea - ├─ Pre-selected: Use --idea=N index - └─ Interactive: Display table, ask user to select -``` - -### Step 3.3: Enrich Issue Context - -``` -Phase 3: Enrich Issue Context - ├─ Base: idea.description + key_strengths + main_challenges - ├─ Add: Relevant clarifications (Requirements/Architecture/Feasibility) - ├─ Add: Multi-perspective insights (creative/pragmatic/systematic) - └─ Add: Session metadata (session_id, completion date, clarification count) -``` - -### Step 3.4: Create Issue - -``` -Phase 4: Create Issue - ├─ Generate issue data with enriched context - ├─ Calculate priority from idea.score (0-10 → 1-5) - ├─ Create via: ccw issue create (heredoc for JSON) - └─ Returns: ISS-YYYYMMDD-NNN -``` - -### Step 3.5: Generate Solution Tasks - -``` -Phase 5: Generate Solution Tasks - ├─ T1: Research & Validate (if main_challenges exist) - ├─ T2: Design & Specification (if key_strengths exist) - ├─ T3+: Implementation tasks (from idea.next_steps) - └─ Each task includes: implementation steps + acceptance criteria -``` - -### Step 3.6: Bind Solution - -``` -Phase 6: Bind Solution - ├─ Write solution to {projectRoot}/.workflow/issues/solutions/{issue-id}.jsonl - ├─ Bind via: ccw issue bind {issue-id} {solution-id} - ├─ Update issue status to 'planned' - └─ Returns: SOL-{issue-id}-{uid} -``` - -### Step 3.7: Next Steps - -``` -Phase 7: Next Steps - └─ Offer: Form queue | Convert another idea | View details | Done -``` - -## Context Enrichment Logic - -### Base Context (Always Included) - -- **Description**: `idea.description` -- **Why This Idea**: `idea.key_strengths[]` -- **Challenges to Address**: `idea.main_challenges[]` -- **Implementation Steps**: `idea.next_steps[]` - -### Enhanced Context (If Available) - -**From Synthesis Artifacts** (`.brainstorming/*/analysis*.md`): -- Extract clarifications matching categories: Requirements, Architecture, Feasibility -- Format: `**{Category}** ({role}): {question} → {answer}` -- Limit: Top 3 most relevant - -**From Perspectives** (`perspectives.json`): -- **Creative**: First insight from `perspectives.creative.insights[0]` -- **Pragmatic**: First blocker from `perspectives.pragmatic.blockers[0]` -- **Systematic**: First pattern from `perspectives.systematic.patterns[0]` - -**Session Metadata**: -- Session ID, Topic, Completion Date -- Clarifications count (if synthesis artifacts loaded) - -## Task Generation Strategy - -### Task 1: Research & Validation -**Trigger**: `idea.main_challenges.length > 0` -- **Title**: "Research & Validate Approach" -- **Scope**: design -- **Action**: Research -- **Implementation**: Investigate blockers, review similar implementations, validate with team -- **Acceptance**: Blockers documented, feasibility assessed, approach validated - -### Task 2: Design & Specification -**Trigger**: `idea.key_strengths.length > 0` -- **Title**: "Design & Create Specification" -- **Scope**: design -- **Action**: Design -- **Implementation**: Create design doc, define success criteria, plan phases -- **Acceptance**: Design complete, metrics defined, plan outlined - -### Task 3+: Implementation Tasks -**Trigger**: `idea.next_steps[]` -- **Title**: From `next_steps[i]` (max 60 chars) -- **Scope**: Inferred from keywords (test→testing, api→backend, ui→frontend) -- **Action**: Detected from verbs (implement, create, update, fix, test, document) -- **Implementation**: Execute step + follow design + write tests -- **Acceptance**: Step implemented + tests passing + code reviewed - -### Fallback Task -**Trigger**: No tasks generated from above -- **Title**: `idea.title` -- **Scope**: implementation -- **Action**: Implement -- **Generic implementation + acceptance criteria** - -## Priority Calculation - -### Issue Priority (1-5) -``` -idea.score: 0-10 -priority = max(1, min(5, ceil((10 - score) / 2))) - -Examples: -score 9-10 → priority 1 (critical) -score 7-8 → priority 2 (high) -score 5-6 → priority 3 (medium) -score 3-4 → priority 4 (low) -score 0-2 → priority 5 (lowest) -``` - -### Task Priority (1-5) -- Research task: 1 (highest) -- Design task: 2 -- Implementation tasks: 3 by default, decrement for later tasks -- Testing/documentation: 4-5 - -### Complexity Analysis -``` -risk: main_challenges.length > 2 ? 'high' : 'medium' -impact: score >= 8 ? 'high' : score >= 6 ? 'medium' : 'low' -complexity: main_challenges > 3 OR tasks > 5 ? 'high' - tasks > 3 ? 'medium' : 'low' -``` - -## CLI Integration - -### Issue Creation -```bash -# Uses heredoc to avoid shell escaping -ccw issue create << 'EOF' -{ - "title": "...", - "context": "...", - "priority": 3, - "source": "brainstorm", - "labels": ["brainstorm", "creative", "feasibility-high"], - ... -} -EOF -``` - -### Solution Binding -```bash -# Append solution to JSONL file -echo '{"id":"SOL-xxx","tasks":[...]}' >> ${projectRoot}/.workflow/issues/solutions/{issue-id}.jsonl - -# Bind to issue -ccw issue bind {issue-id} {solution-id} - -# Update status -ccw issue update {issue-id} --status planned -``` - -## Error Handling - -| Error | Message | Resolution | -|-------|---------|------------| -| Session not found | synthesis.json missing | Check session ID, list available sessions | -| No ideas | top_ideas array empty | Complete brainstorm workflow first | -| Invalid idea index | Index out of range | Check valid range 0 to N-1 | -| Issue creation failed | ccw issue create error | Verify CLI endpoint working | -| Solution binding failed | Bind error | Check issue exists, retry | - -## Examples - -### Interactive Mode - -```bash -codex -p "@.codex/prompts/issue-resolve.md --source brainstorm SESSION=\"BS-rate-limiting-2025-01-28\"" - -# Output: -# | # | Title | Score | Feasibility | -# |---|-------|-------|-------------| -# | 0 | Token Bucket Algorithm | 8.5 | High | -# | 1 | Sliding Window Counter | 7.2 | Medium | -# | 2 | Fixed Window | 6.1 | High | - -# User selects: #0 - -# Result: -# Created issue: ISS-20250128-001 -# Created solution: SOL-ISS-20250128-001-ab3d -# Bound solution to issue -# → Next: /issue:queue -``` - -### Auto Mode - -```bash -codex -p "@.codex/prompts/issue-resolve.md --source brainstorm SESSION=\"BS-caching-2025-01-28\" --auto" - -# Result: -# Auto-selected: Redis Cache Layer (Score: 9.2/10) -# Created issue: ISS-20250128-002 -# Solution with 4 tasks -# → Status: planned -``` - -## Integration Flow - -``` -brainstorm-with-file - │ - ├─ synthesis.json - ├─ perspectives.json - └─ .brainstorming/** (optional) - │ - ▼ - Phase 3: From Brainstorm ◄─── This phase - │ - ├─ ISS-YYYYMMDD-NNN (enriched issue) - └─ SOL-{issue-id}-{uid} (structured solution) - │ - ▼ - Phase 4: Form Queue - │ - ▼ - /issue:execute - │ - ▼ - RA → EP → CD → VAS -``` - -## Session Files Reference - -### Input Files - -``` -{projectRoot}/.workflow/.brainstorm/BS-{slug}-{date}/ -├── synthesis.json # REQUIRED - Top ideas with scores -├── perspectives.json # OPTIONAL - Multi-CLI insights -├── brainstorm.md # Reference only -└── .brainstorming/ # OPTIONAL - Synthesis artifacts - ├── system-architect/ - │ └── analysis.md # Contains clarifications + enhancements - ├── api-designer/ - │ └── analysis.md - └── ... -``` - -### Output Files - -``` -{projectRoot}/.workflow/issues/ -├── solutions/ -│ └── ISS-YYYYMMDD-001.jsonl # Created solution (JSONL) -└── (managed by ccw issue CLI) -``` - -## Post-Phase Update - -After brainstorm conversion: -- Issue created with `status: planned`, enriched context from brainstorm session -- Solution bound with structured tasks derived from idea.next_steps -- Report: issue ID, solution ID, task count, idea score -- Recommend next step: Form execution queue via Phase 4 diff --git a/.codex/skills/issue-resolve/phases/04-issue-queue.md b/.codex/skills/issue-resolve/phases/04-issue-queue.md deleted file mode 100644 index 1d8fde6e..00000000 --- a/.codex/skills/issue-resolve/phases/04-issue-queue.md +++ /dev/null @@ -1,449 +0,0 @@ -# Phase 4: Form Execution Queue - -## Overview - -Queue formation command using **issue-queue-agent** that analyzes all bound solutions, resolves **inter-solution** conflicts, and creates an ordered execution queue at **solution level**. - -**Design Principle**: Queue items are **solutions**, not individual tasks. Each executor receives a complete solution with all its tasks. - -## Prerequisites - -- Issues with `status: planned` and `bound_solution_id` exist -- Solutions written in `{projectRoot}/.workflow/issues/solutions/{issue-id}.jsonl` -- `ccw issue` CLI available - -## Auto Mode - -When `--yes` or `-y`: Auto-confirm queue formation, use recommended conflict resolutions. - -## Core Capabilities - -- **Agent-driven**: issue-queue-agent handles all ordering logic -- **Solution-level granularity**: Queue items are solutions, not tasks -- **Conflict clarification**: High-severity conflicts prompt user decision -- Semantic priority calculation per solution (0.0-1.0) -- Parallel/Sequential group assignment for solutions - -## Core Guidelines - -**Data Access Principle**: Issues and queue files can grow very large. To avoid context overflow: - -| Operation | Correct | Incorrect | -|-----------|---------|-----------| -| List issues (brief) | `ccw issue list --status planned --brief` | `Read('issues.jsonl')` | -| **Batch solutions (NEW)** | `ccw issue solutions --status planned --brief` | Loop `ccw issue solution ` | -| List queue (brief) | `ccw issue queue --brief` | `Read('queues/*.json')` | -| Read issue details | `ccw issue status --json` | `Read('issues.jsonl')` | -| Get next item | `ccw issue next --json` | `Read('queues/*.json')` | -| Update status | `ccw issue update --status ...` | Direct file edit | -| Sync from queue | `ccw issue update --from-queue` | Direct file edit | -| Read solution (single) | `ccw issue solution --brief` | `Read('solutions/*.jsonl')` | - -**Output Options**: -- `--brief`: JSON with minimal fields (id, status, counts) -- `--json`: Full JSON (agent use only) - -**Orchestration vs Execution**: -- **Command (orchestrator)**: Use `--brief` for minimal context -- **Agent (executor)**: Fetch full details → `ccw issue status --json` - -**ALWAYS** use CLI commands for CRUD operations. **NEVER** read entire `issues.jsonl` or `queues/*.json` directly. - -## Flags - -| Flag | Description | Default | -|------|-------------|---------| -| `--queues ` | Number of parallel queues | 1 | -| `--issue ` | Form queue for specific issue only | All planned | -| `--append ` | Append issue to active queue (don't create new) | - | -| `--force` | Skip active queue check, always create new queue | false | - -## CLI Subcommands Reference - -```bash -ccw issue queue list List all queues with status -ccw issue queue add Add issue to queue (interactive if active queue exists) -ccw issue queue add -f Add to new queue without prompt (force) -ccw issue queue merge --queue Merge source queue into target queue -ccw issue queue switch Switch active queue -ccw issue queue archive Archive current queue -ccw issue queue delete Delete queue from history -``` - -## Execution Steps - -### Step 4.1: Solution Loading & Distribution - -**Data Loading:** -- Use `ccw issue solutions --status planned --brief` to get all planned issues with solutions in **one call** -- Returns: Array of `{ issue_id, solution_id, is_bound, task_count, files_touched[], priority }` -- If no bound solutions found → display message, suggest running plan/convert/brainstorm first - -**Build Solution Objects:** -```javascript -// Single CLI call replaces N individual queries -const result = Bash(`ccw issue solutions --status planned --brief`).trim(); -const solutions = result ? JSON.parse(result) : []; - -if (solutions.length === 0) { - console.log('No bound solutions found. Run /issue:plan first.'); - return; -} - -// solutions already in correct format: -// { issue_id, solution_id, is_bound, task_count, files_touched[], priority } -``` - -**Multi-Queue Distribution** (if `--queues > 1`): -- Use `files_touched` from brief output for partitioning -- Group solutions with overlapping files into same queue - -**Output:** Array of solution objects (or N arrays if multi-queue) - -### Step 4.2: Agent-Driven Queue Formation - -**Generate Queue IDs** (command layer, pass to agent): -```javascript -const timestamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14); -const numQueues = args.queues || 1; -const queueIds = numQueues === 1 - ? [`QUE-${timestamp}`] - : Array.from({length: numQueues}, (_, i) => `QUE-${timestamp}-${i + 1}`); -``` - -**Agent Prompt** (same for each queue, with assigned solutions): -``` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: ~/.codex/agents/issue-queue-agent.md (MUST read first) -2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json - ---- - -## Order Solutions into Execution Queue - -**Queue ID**: ${queueId} -**Solutions**: ${solutions.length} from ${issues.length} issues -**Project Root**: ${cwd} -**Queue Index**: ${queueIndex} of ${numQueues} - -### Input -${JSON.stringify(solutions)} -// Each object: { issue_id, solution_id, task_count, files_touched[], priority } - -### Workflow - -Step 1: Build dependency graph from solutions (nodes=solutions, edges=file conflicts via files_touched) -Step 2: Use Gemini CLI for conflict analysis (5 types: file, API, data, dependency, architecture) -Step 3: For high-severity conflicts without clear resolution → add to `clarifications` -Step 4: Calculate semantic priority (base from issue priority + task_count boost) -Step 5: Assign execution groups: P* (parallel, no overlaps) / S* (sequential, shared files) -Step 6: Write queue JSON + update index - -### Output Requirements - -**Write files** (exactly 2): -- `${projectRoot}/.workflow/issues/queues/${queueId}.json` - Full queue with solutions, conflicts, groups -- `${projectRoot}/.workflow/issues/queues/index.json` - Update with new queue entry - -**Return JSON**: -\`\`\`json -{ - "queue_id": "${queueId}", - "total_solutions": N, - "total_tasks": N, - "execution_groups": [{"id": "P1", "type": "parallel", "count": N}], - "issues_queued": ["ISS-xxx"], - "clarifications": [{"conflict_id": "CFT-1", "question": "...", "options": [...]}] -} -\`\`\` - -### Rules -- Solution granularity (NOT individual tasks) -- Queue Item ID format: S-1, S-2, S-3, ... -- Use provided Queue ID (do NOT generate new) -- `clarifications` only present if high-severity unresolved conflicts exist -- Use `files_touched` from input (already extracted by orchestrator) - -### Done Criteria -- [ ] Queue JSON written with all solutions ordered -- [ ] Index updated with active_queue_id -- [ ] No circular dependencies -- [ ] Parallel groups have no file overlaps -- [ ] Return JSON matches required shape -``` - -**Launch Agents** (parallel if multi-queue): -```javascript -const numQueues = args.queues || 1; - -if (numQueues === 1) { - // Single queue: single agent call - const agentId = spawn_agent({ - message: buildPrompt(queueIds[0], solutions) - }); - - // Wait for completion - const result = wait({ - ids: [agentId], - timeout_ms: 600000 // 10 minutes - }); - - // Close agent - close_agent({ id: agentId }); -} else { - // Multi-queue: parallel agent calls - const agentIds = []; - - // Step 1: Spawn all agents - solutionGroups.forEach((group, i) => { - const agentId = spawn_agent({ - message: buildPrompt(queueIds[i], group, i + 1, numQueues) - }); - agentIds.push(agentId); - }); - - // Step 2: Batch wait for all agents - const results = wait({ - ids: agentIds, - timeout_ms: 600000 // 10 minutes - }); - - if (results.timed_out) { - console.log('Some queue agents timed out, continuing with completed results'); - } - - // Step 3: Collect results (see Step 4.3 for clarification handling) - - // Step 4: Batch cleanup - close all agents - agentIds.forEach(id => close_agent({ id })); -} -``` - -**Multi-Queue Index Update:** -- First queue sets `active_queue_id` -- All queues added to `queues` array with `queue_group` field linking them - -### Step 4.3: Conflict Clarification - -**Collect Agent Results** (multi-queue): -```javascript -// Collect clarifications from all agents -const allClarifications = []; -agentIds.forEach((agentId, i) => { - const agentStatus = results.status[agentId]; - if (agentStatus && agentStatus.completed) { - const parsed = JSON.parse(agentStatus.completed); - for (const c of parsed.clarifications || []) { - allClarifications.push({ ...c, queue_id: queueIds[i], agent_id: agentId }); - } - } -}); -``` - -**Check Agent Return:** -- Parse agent result JSON (or all results if multi-queue) -- If any `clarifications` array exists and non-empty → user decision required - -**Clarification Flow:** -```javascript -if (allClarifications.length > 0) { - for (const clarification of allClarifications) { - // Present to user via ASK_USER - const answer = ASK_USER([{ - id: clarification.conflict_id, - type: "select", - prompt: `[${clarification.queue_id}] ${clarification.question}`, - options: clarification.options - }]); // BLOCKS (wait for user response) - - // Re-spawn agent with user decision (original agent already closed) - // Create new agent with previous context + resolution - const resolveAgentId = spawn_agent({ - message: ` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: ~/.codex/agents/issue-queue-agent.md (MUST read first) -2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json - ---- - -## Conflict Resolution Update - -**Queue ID**: ${clarification.queue_id} -**Conflict**: ${clarification.conflict_id} resolved: ${answer.selected} - -### Instructions -1. Read existing queue file: ${projectRoot}/.workflow/issues/queues/${clarification.queue_id}.json -2. Update conflict resolution with user decision -3. Re-order affected solutions if needed -4. Write updated queue file -` - }); - - const resolveResult = wait({ - ids: [resolveAgentId], - timeout_ms: 300000 // 5 minutes - }); - - close_agent({ id: resolveAgentId }); - } -} -``` - -### Step 4.4: Status Update & Summary - -**Status Update** (MUST use CLI command, NOT direct file operations): - -```bash -# Option 1: Batch update from queue (recommended) -ccw issue update --from-queue [queue-id] --json -ccw issue update --from-queue --json # Use active queue -ccw issue update --from-queue QUE-xxx --json # Use specific queue - -# Option 2: Individual issue update -ccw issue update --status queued -``` - -**IMPORTANT**: Do NOT directly modify `issues.jsonl`. Always use CLI command to ensure proper validation and history tracking. - -**Output** (JSON): -```json -{ - "success": true, - "queue_id": "QUE-xxx", - "queued": ["ISS-001", "ISS-002"], - "queued_count": 2, - "unplanned": ["ISS-003"], - "unplanned_count": 1 -} -``` - -**Behavior:** -- Updates issues in queue to `status: 'queued'` (skips already queued/executing/completed) -- Identifies planned issues with `bound_solution_id` NOT in queue → `unplanned` array -- Optional `queue-id`: defaults to active queue if omitted - -**Summary Output:** -- Display queue ID, solution count, task count -- Show unplanned issues (planned but NOT in queue) -- Show next step: `/issue:execute` - -### Step 4.5: Active Queue Check & Decision - -**After agent completes, check for active queue:** - -```bash -ccw issue queue list --brief -``` - -**Decision:** -- If `active_queue_id` is null → `ccw issue queue switch ` (activate new queue) -- If active queue exists → Use **ASK_USER** to prompt user - -**ASK_USER:** -```javascript -ASK_USER([{ - id: "queue_action", - type: "select", - prompt: "Active queue exists. How would you like to proceed?", - options: [ - { label: "Merge into existing queue", description: "Add new items to active queue, delete new queue" }, - { label: "Use new queue", description: "Switch to new queue, keep existing in history" }, - { label: "Cancel", description: "Delete new queue, keep existing active" } - ] -}]); // BLOCKS (wait for user response) -``` - -**Action Commands:** - -| User Choice | Commands | -|-------------|----------| -| **Merge into existing** | `ccw issue queue merge --queue ` then `ccw issue queue delete ` | -| **Use new queue** | `ccw issue queue switch ` | -| **Cancel** | `ccw issue queue delete ` | - -## Storage Structure (Queue History) - -``` -{projectRoot}/.workflow/issues/ -├── issues.jsonl # All issues (one per line) -├── queues/ # Queue history directory -│ ├── index.json # Queue index (active + history) -│ ├── {queue-id}.json # Individual queue files -│ └── ... -└── solutions/ - ├── {issue-id}.jsonl # Solutions for issue - └── ... -``` - -### Queue Index Schema - -```json -{ - "active_queue_id": "QUE-20251227-143000", - "active_queue_group": "QGR-20251227-143000", - "queues": [ - { - "id": "QUE-20251227-143000-1", - "queue_group": "QGR-20251227-143000", - "queue_index": 1, - "total_queues": 3, - "status": "active", - "issue_ids": ["ISS-xxx", "ISS-yyy"], - "total_solutions": 3, - "completed_solutions": 1, - "created_at": "2025-12-27T14:30:00Z" - } - ] -} -``` - -**Multi-Queue Fields:** -- `queue_group`: Links queues created in same batch (format: `QGR-{timestamp}`) -- `queue_index`: Position in group (1-based) -- `total_queues`: Total queues in group -- `active_queue_group`: Current active group (for multi-queue execution) - -**Note**: Queue file schema is produced by `issue-queue-agent`. See agent documentation for details. - -## Error Handling - -| Error | Resolution | -|-------|------------| -| No bound solutions | Display message, suggest phases 1-3 (plan/convert/brainstorm) | -| Circular dependency | List cycles, abort queue formation | -| High-severity conflict | Return `clarifications`, prompt user decision | -| User cancels clarification | Abort queue formation | -| **index.json not updated** | Auto-fix: Set active_queue_id to new queue | -| **Queue file missing solutions** | Abort with error, agent must regenerate | -| **User cancels queue add** | Display message, return without changes | -| **Merge with empty source** | Skip merge, display warning | -| **All items duplicate** | Skip merge, display "All items already exist" | - -## Quality Checklist - -Before completing, verify: - -- [ ] All planned issues with `bound_solution_id` are included -- [ ] Queue JSON written to `queues/{queue-id}.json` (N files if multi-queue) -- [ ] Index updated in `queues/index.json` with `active_queue_id` -- [ ] Multi-queue: All queues share same `queue_group` -- [ ] No circular dependencies in solution DAG -- [ ] All conflicts resolved (auto or via user clarification) -- [ ] Parallel groups have no file overlaps -- [ ] Cross-queue: No file overlaps between queues -- [ ] Issue statuses updated to `queued` -- [ ] All spawned agents are properly closed via close_agent - -## Post-Phase Update - -After queue formation: -- All planned issues updated to `status: queued` -- Queue files written and index updated -- Report: queue ID(s), solution count, task count, execution groups -- Recommend next step: `/issue:execute` to begin execution diff --git a/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md b/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md index 83acbca5..90799bbf 100644 --- a/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md +++ b/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md @@ -86,7 +86,7 @@ Cross-reference the task description against these documents for completeness. ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/requirements-analyst.md 2. Read: ${projectRoot}/.workflow/project-tech.json (if exists) -3. Read: ${projectRoot}/.workflow/project-guidelines.json (if exists) +3. Read: ${projectRoot}/.workflow/specs/*.md (if exists) 4. Read: ${projectRoot}/.workflow/.cycle/${cycleId}.progress/coordination/feedback.md (if exists) --- @@ -169,7 +169,7 @@ function spawnEPAgent(cycleId, state, progressDir) { ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/exploration-planner.md 2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json +3. Read: ${projectRoot}/.workflow/specs/*.md 4. Read: ${progressDir}/ra/requirements.md --- diff --git a/.codex/skills/plan-converter/SKILL.md b/.codex/skills/plan-converter/SKILL.md deleted file mode 100644 index 419070dc..00000000 --- a/.codex/skills/plan-converter/SKILL.md +++ /dev/null @@ -1,442 +0,0 @@ ---- -name: plan-converter -description: Convert any planning/analysis/brainstorm output to .task/*.json multi-file format. Supports roadmap.jsonl, plan.json, plan-note.md, conclusions.json, synthesis.json. -argument-hint: " [-o ]" ---- - -# Plan Converter - -## Overview - -Converts any planning artifact to **`.task/*.json` multi-file format** — the single standard consumed by `unified-execute-with-file`. - -> **Schema**: `cat ~/.ccw/workflows/cli-templates/schemas/task-schema.json` - -```bash -# Auto-detect format, output to same directory .task/ -/codex:plan-converter ".workflow/.req-plan/RPLAN-auth-2025-01-21/roadmap.jsonl" - -# Specify output directory -/codex:plan-converter ".workflow/.planning/CPLAN-xxx/plan-note.md" -o .task/ - -# Convert brainstorm synthesis -/codex:plan-converter ".workflow/.brainstorm/BS-xxx/synthesis.json" -``` - -**Supported inputs**: roadmap.jsonl, .task/*.json (per-domain), plan-note.md, conclusions.json, synthesis.json - -**Output**: `.task/*.json` (one file per task, in same directory's `.task/` subfolder, or specified `-o` path) - -## Task JSON Schema - -每个任务一个独立 JSON 文件 (`.task/TASK-{id}.json`),遵循统一 schema: - -> **Schema 定义**: `cat ~/.ccw/workflows/cli-templates/schemas/task-schema.json` - -**Producer 使用的字段集** (plan-converter 输出): - -``` -IDENTITY (必填): id, title, description -CLASSIFICATION (可选): type, priority, effort, action -SCOPE (可选): scope, excludes, focus_paths -DEPENDENCIES (必填): depends_on, parallel_group, inputs, outputs -CONVERGENCE (必填): convergence.criteria, convergence.verification, convergence.definition_of_done -FILES (可选): files[].path, files[].action, files[].changes, files[].change, files[].target, files[].conflict_risk -IMPLEMENTATION (可选): implementation[], test.manual_checks, test.success_metrics -PLANNING (可选): reference, rationale, risks -CONTEXT (可选): source.tool, source.session_id, source.original_id, evidence, risk_items -RUNTIME (执行时填充): status, executed_at, result -``` - -**文件命名**: `TASK-{id}.json` (保留原有 ID 前缀: L0-, T1-, IDEA- 等) - -## Target Input - -**$ARGUMENTS** - -## Execution Process - -``` -Step 0: Parse arguments, resolve input path -Step 1: Detect input format -Step 2: Parse input → extract raw records -Step 3: Transform → unified task records -Step 4: Validate convergence quality -Step 5: Write .task/*.json output + display summary -``` - -## Implementation - -### Step 0: Parse Arguments - -```javascript -const args = $ARGUMENTS -const outputMatch = args.match(/-o\s+(\S+)/) -const outputPath = outputMatch ? outputMatch[1] : null -const inputPath = args.replace(/-o\s+\S+/, '').trim() - -// Resolve absolute path -const projectRoot = Bash(`git rev-parse --show-toplevel 2>/dev/null || pwd`).trim() -const resolvedInput = path.isAbsolute(inputPath) ? inputPath : `${projectRoot}/${inputPath}` -``` - -### Step 1: Detect Format - -```javascript -const filename = path.basename(resolvedInput) -const content = Read(resolvedInput) - -function detectFormat(filename, content) { - if (filename === 'roadmap.jsonl') return 'roadmap-jsonl' - if (filename === 'tasks.jsonl') return 'tasks-jsonl' // legacy JSONL or per-domain - if (filename === 'plan-note.md') return 'plan-note-md' - if (filename === 'conclusions.json') return 'conclusions-json' - if (filename === 'synthesis.json') return 'synthesis-json' - if (filename.endsWith('.jsonl')) return 'generic-jsonl' - if (filename.endsWith('.json')) { - const parsed = JSON.parse(content) - if (parsed.top_ideas) return 'synthesis-json' - if (parsed.recommendations && parsed.key_conclusions) return 'conclusions-json' - if (parsed.tasks && parsed.focus_area) return 'domain-plan-json' - return 'unknown-json' - } - if (filename.endsWith('.md')) return 'plan-note-md' - return 'unknown' -} -``` - -**Format Detection Table**: - -| Filename | Format ID | Source Tool | -|----------|-----------|------------| -| `roadmap.jsonl` | roadmap-jsonl | req-plan-with-file | -| `tasks.jsonl` (legacy) / `.task/*.json` | tasks-jsonl / task-json | collaborative-plan-with-file | -| `plan-note.md` | plan-note-md | collaborative-plan-with-file | -| `conclusions.json` | conclusions-json | analyze-with-file | -| `synthesis.json` | synthesis-json | brainstorm-with-file | - -### Step 2: Parse Input - -#### roadmap-jsonl (req-plan-with-file) - -```javascript -function parseRoadmapJsonl(content) { - return content.split('\n') - .filter(line => line.trim()) - .map(line => JSON.parse(line)) -} -// Records have: id (L0/T1), name/title, goal/scope, convergence, depends_on, etc. -``` - -#### plan-note-md (collaborative-plan-with-file) - -```javascript -function parsePlanNoteMd(content) { - const tasks = [] - // 1. Extract YAML frontmatter for session metadata - const frontmatter = extractYamlFrontmatter(content) - - // 2. Find all "## 任务池 - {Domain}" sections - const taskPoolSections = content.match(/## 任务池 - .+/g) || [] - - // 3. For each section, extract tasks matching: - // ### TASK-{ID}: {Title} [{domain}] - // - **状态**: pending - // - **复杂度**: Medium - // - **依赖**: TASK-xxx - // - **范围**: ... - // - **修改点**: `file:location`: change summary - // - **冲突风险**: Low - taskPoolSections.forEach(section => { - const sectionContent = extractSectionContent(content, section) - const taskPattern = /### (TASK-\d+):\s+(.+?)\s+\[(.+?)\]/g - let match - while ((match = taskPattern.exec(sectionContent)) !== null) { - const [_, id, title, domain] = match - const taskBlock = extractTaskBlock(sectionContent, match.index) - tasks.push({ - id, title, domain, - ...parseTaskDetails(taskBlock) - }) - } - }) - return { tasks, frontmatter } -} -``` - -#### conclusions-json (analyze-with-file) - -```javascript -function parseConclusionsJson(content) { - const conclusions = JSON.parse(content) - // Extract from: conclusions.recommendations[] - // { action, rationale, priority } - // Also available: conclusions.key_conclusions[] - return conclusions -} -``` - -#### synthesis-json (brainstorm-with-file) - -```javascript -function parseSynthesisJson(content) { - const synthesis = JSON.parse(content) - // Extract from: synthesis.top_ideas[] - // { title, description, score, feasibility, next_steps, key_strengths, main_challenges } - // Also available: synthesis.recommendations - return synthesis -} -``` - -### Step 3: Transform to Unified Records - -#### roadmap-jsonl → unified - -```javascript -function transformRoadmap(records, sessionId) { - return records.map(rec => { - // roadmap.jsonl now uses unified field names (title, description, source) - // Passthrough is mostly direct - return { - id: rec.id, - title: rec.title, - description: rec.description, - type: rec.type || 'feature', - effort: rec.effort, - scope: rec.scope, - excludes: rec.excludes, - depends_on: rec.depends_on || [], - parallel_group: rec.parallel_group, - inputs: rec.inputs, - outputs: rec.outputs, - convergence: rec.convergence, // already unified format - risk_items: rec.risk_items, - source: rec.source || { - tool: 'req-plan-with-file', - session_id: sessionId, - original_id: rec.id - } - } - }) -} -``` - -#### plan-note-md → unified - -```javascript -function transformPlanNote(parsed) { - const { tasks, frontmatter } = parsed - return tasks.map(task => ({ - id: task.id, - title: task.title, - description: task.scope || task.title, - type: task.type || inferTypeFromTitle(task.title), - priority: task.priority || inferPriorityFromEffort(task.effort), - effort: task.effort || 'medium', - scope: task.scope, - depends_on: task.depends_on || [], - convergence: task.convergence || generateConvergence(task), // plan-note now has convergence - files: task.files?.map(f => ({ - path: f.path || f.file, - action: f.action || 'modify', - changes: f.changes || (f.change ? [f.change] : undefined), - change: f.change, - target: f.target, - conflict_risk: f.conflict_risk - })), - source: { - tool: 'collaborative-plan-with-file', - session_id: frontmatter.session_id, - original_id: task.id - } - })) -} - -// Generate convergence from task details when source lacks it (legacy fallback) -function generateConvergence(task) { - return { - criteria: [ - // Derive testable conditions from scope and files - // e.g., "Modified files compile without errors" - // e.g., scope-derived: "API endpoint returns expected response" - ], - verification: '// Derive from files — e.g., test commands', - definition_of_done: '// Derive from scope — business language summary' - } -} -``` - -#### conclusions-json → unified - -```javascript -function transformConclusions(conclusions) { - return conclusions.recommendations.map((rec, index) => ({ - id: `TASK-${String(index + 1).padStart(3, '0')}`, - title: rec.action, - description: rec.rationale, - type: inferTypeFromAction(rec.action), - priority: rec.priority, - depends_on: [], - convergence: { - criteria: generateCriteriaFromAction(rec), - verification: generateVerificationFromAction(rec), - definition_of_done: generateDoDFromRationale(rec) - }, - evidence: conclusions.key_conclusions.map(c => c.point), - source: { - tool: 'analyze-with-file', - session_id: conclusions.session_id - } - })) -} - -function inferTypeFromAction(action) { - const lower = action.toLowerCase() - if (/fix|resolve|repair|修复/.test(lower)) return 'fix' - if (/refactor|restructure|extract|重构/.test(lower)) return 'refactor' - if (/add|implement|create|新增|实现/.test(lower)) return 'feature' - if (/improve|optimize|enhance|优化/.test(lower)) return 'enhancement' - if (/test|coverage|validate|测试/.test(lower)) return 'testing' - return 'feature' -} -``` - -#### synthesis-json → unified - -```javascript -function transformSynthesis(synthesis) { - return synthesis.top_ideas - .filter(idea => idea.score >= 6) // Only viable ideas (score ≥ 6) - .map((idea, index) => ({ - id: `IDEA-${String(index + 1).padStart(3, '0')}`, - title: idea.title, - description: idea.description, - type: 'feature', - priority: idea.score >= 8 ? 'high' : idea.score >= 6 ? 'medium' : 'low', - effort: idea.feasibility >= 4 ? 'small' : idea.feasibility >= 2 ? 'medium' : 'large', - depends_on: [], - convergence: { - criteria: idea.next_steps || [`${idea.title} implemented and functional`], - verification: 'Manual validation of feature functionality', - definition_of_done: idea.description - }, - risk_items: idea.main_challenges || [], - source: { - tool: 'brainstorm-with-file', - session_id: synthesis.session_id, - original_id: `idea-${index + 1}` - } - })) -} -``` - -### Step 4: Validate Convergence Quality - -All records must pass convergence quality checks before output. - -```javascript -function validateConvergence(records) { - const vaguePatterns = /正常|正确|好|可以|没问题|works|fine|good|correct/i - const technicalPatterns = /compile|build|lint|npm|npx|jest|tsc|eslint/i - const issues = [] - - records.forEach(record => { - const c = record.convergence - if (!c) { - issues.push({ id: record.id, field: 'convergence', issue: 'Missing entirely' }) - return - } - if (!c.criteria?.length) { - issues.push({ id: record.id, field: 'criteria', issue: 'Empty criteria array' }) - } - c.criteria?.forEach((criterion, i) => { - if (vaguePatterns.test(criterion) && criterion.length < 15) { - issues.push({ id: record.id, field: `criteria[${i}]`, issue: `Too vague: "${criterion}"` }) - } - }) - if (!c.verification || c.verification.length < 10) { - issues.push({ id: record.id, field: 'verification', issue: 'Too short or missing' }) - } - if (technicalPatterns.test(c.definition_of_done)) { - issues.push({ id: record.id, field: 'definition_of_done', issue: 'Should be business language' }) - } - }) - - return issues -} - -// Auto-fix strategy: -// | Issue | Fix | -// |----------------------|----------------------------------------------| -// | Missing convergence | Generate from title + description + files | -// | Vague criteria | Replace with specific condition from context | -// | Short verification | Expand with file-based test suggestion | -// | Technical DoD | Rewrite in business language | -``` - -### Step 5: Write .task/*.json Output & Summary - -```javascript -// Determine output directory -const outputDir = outputPath - || `${path.dirname(resolvedInput)}/.task` - -// Create output directory -Bash(`mkdir -p ${outputDir}`) - -// Clean records: remove undefined/null optional fields -const cleanedRecords = records.map(rec => { - const clean = { ...rec } - Object.keys(clean).forEach(key => { - if (clean[key] === undefined || clean[key] === null) delete clean[key] - if (Array.isArray(clean[key]) && clean[key].length === 0 && key !== 'depends_on') delete clean[key] - }) - return clean -}) - -// Write individual task JSON files -cleanedRecords.forEach(record => { - const filename = `${record.id}.json` - Write(`${outputDir}/${filename}`, JSON.stringify(record, null, 2)) -}) - -// Display summary -// | Source | Format | Records | Issues | -// |-----------------|-------------------|---------|--------| -// | roadmap.jsonl | roadmap-jsonl | 4 | 0 | -// -// Output: .workflow/.req-plan/RPLAN-xxx/.task/ (4 files) -// Records: 4 tasks with convergence criteria -// Quality: All convergence checks passed -``` - ---- - -## Conversion Matrix - -| Source | Source Tool | ID Pattern | Has Convergence | Has Files | Has Priority | Has Source | -|--------|-----------|------------|-----------------|-----------|--------------|-----------| -| roadmap.jsonl (progressive) | req-plan | L0-L3 | **Yes** | No | No | **Yes** | -| roadmap.jsonl (direct) | req-plan | T1-TN | **Yes** | No | No | **Yes** | -| .task/TASK-*.json (per-domain) | collaborative-plan | TASK-NNN | **Yes** | **Yes** (detailed) | Optional | **Yes** | -| plan-note.md | collaborative-plan | TASK-NNN | **Generate** | **Yes** (from 修改文件) | From effort | No | -| conclusions.json | analyze | TASK-NNN | **Generate** | No | **Yes** | No | -| synthesis.json | brainstorm | IDEA-NNN | **Generate** | No | From score | No | - -**Legend**: Yes = source already has it, Generate = converter produces it, No = not available - -## Error Handling - -| Situation | Action | -|-----------|--------| -| Input file not found | Report error, suggest checking path | -| Unknown format | Report error, list supported formats | -| Empty input | Report error, no output file created | -| Convergence validation fails | Auto-fix where possible, report remaining issues | -| Partial parse failure | Convert valid records, report skipped items | -| Output file exists | Overwrite with warning message | -| plan-note.md has empty sections | Skip empty domains, report in summary | - ---- - -**Now execute plan-converter for**: $ARGUMENTS diff --git a/.codex/skills/req-plan-with-file/SKILL.md b/.codex/skills/req-plan-with-file/SKILL.md index a92edb8e..2db940b6 100644 --- a/.codex/skills/req-plan-with-file/SKILL.md +++ b/.codex/skills/req-plan-with-file/SKILL.md @@ -268,7 +268,7 @@ const hasCodebase = bash(` // 2. Codebase Exploration (only when hasCodebase !== 'none') if (hasCodebase !== 'none') { // Read project metadata (if exists) - // .workflow/project-tech.json, .workflow/project-guidelines.json + // .workflow/project-tech.json, .workflow/specs/*.md // Search codebase for requirement-relevant context // Use: mcp__ace-tool__search_context, Grep, Glob, Read diff --git a/.codex/skills/review-cycle/SKILL.md b/.codex/skills/review-cycle/SKILL.md index 6de5a9e9..47b9e62b 100644 --- a/.codex/skills/review-cycle/SKILL.md +++ b/.codex/skills/review-cycle/SKILL.md @@ -304,7 +304,7 @@ const agentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/{agent-type}.md (MUST read first) 2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json +3. Read: ${projectRoot}/.workflow/specs/*.md --- diff --git a/.codex/skills/review-cycle/phases/02-parallel-review.md b/.codex/skills/review-cycle/phases/02-parallel-review.md index 026429d9..eb0b0931 100644 --- a/.codex/skills/review-cycle/phases/02-parallel-review.md +++ b/.codex/skills/review-cycle/phases/02-parallel-review.md @@ -95,7 +95,7 @@ dimensions.forEach(dimension => { 4. Validate file access: bash(ls -la ${targetFiles.join(' ')}) 5. Execute: cat ~/.ccw/workflows/cli-templates/schemas/review-dimension-results-schema.json (get output schema reference) 6. Read: ${projectRoot}/.workflow/project-tech.json (technology stack and architecture context) -7. Read: ${projectRoot}/.workflow/project-guidelines.json (user-defined constraints and conventions to validate against) +7. Read: ${projectRoot}/.workflow/specs/*.md (user-defined constraints and conventions to validate against) --- @@ -218,7 +218,7 @@ dimensions.forEach(dimension => { 5. Read review state: ${reviewStateJsonPath} 6. Execute: cat ~/.ccw/workflows/cli-templates/schemas/review-dimension-results-schema.json (get output schema reference) 7. Read: ${projectRoot}/.workflow/project-tech.json (technology stack and architecture context) -8. Read: ${projectRoot}/.workflow/project-guidelines.json (user-defined constraints and conventions to validate against) +8. Read: ${projectRoot}/.workflow/specs/*.md (user-defined constraints and conventions to validate against) --- @@ -337,7 +337,7 @@ const deepDiveAgentId = spawn_agent({ 5. Read test files: bash(find ${projectDir}/tests -name "*${basename(file, '.ts')}*" -type f) 6. Execute: cat ~/.ccw/workflows/cli-templates/schemas/review-deep-dive-results-schema.json (get output schema reference) 7. Read: ${projectRoot}/.workflow/project-tech.json (technology stack and architecture context) -8. Read: ${projectRoot}/.workflow/project-guidelines.json (user-defined constraints for remediation compliance) +8. Read: ${projectRoot}/.workflow/specs/*.md (user-defined constraints for remediation compliance) --- diff --git a/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md b/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md index 037599db..04d989f8 100644 --- a/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md +++ b/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md @@ -90,7 +90,7 @@ selectedFindings.forEach(finding => { 5. Read test files: bash(find ${projectDir}/tests -name "*${basename(finding.file, '.ts')}*" -type f) 6. Execute: cat ~/.ccw/workflows/cli-templates/schemas/review-deep-dive-results-schema.json (get output schema reference) 7. Read: ${projectRoot}/.workflow/project-tech.json (technology stack and architecture context) -8. Read: ${projectRoot}/.workflow/project-guidelines.json (user-defined constraints for remediation compliance) +8. Read: ${projectRoot}/.workflow/specs/*.md (user-defined constraints for remediation compliance) --- @@ -201,7 +201,7 @@ selectedFindings.forEach(finding => { 5. Read test files: bash(find ${workflowDir}/tests -name "*${basename(finding.file, '.ts')}*" -type f) 6. Execute: cat ~/.ccw/workflows/cli-templates/schemas/review-deep-dive-results-schema.json (get output schema reference) 7. Read: ${projectRoot}/.workflow/project-tech.json (technology stack and architecture context) -8. Read: ${projectRoot}/.workflow/project-guidelines.json (user-defined constraints for remediation compliance) +8. Read: ${projectRoot}/.workflow/specs/*.md (user-defined constraints for remediation compliance) --- diff --git a/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md b/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md index 59cb8c2a..caf249a3 100644 --- a/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md +++ b/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md @@ -106,7 +106,7 @@ const agentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/cli-planning-agent.md (MUST read first) 2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json +3. Read: ${projectRoot}/.workflow/specs/*.md --- diff --git a/.codex/skills/review-cycle/phases/08-fix-execution.md b/.codex/skills/review-cycle/phases/08-fix-execution.md index f19c8753..bc29818f 100644 --- a/.codex/skills/review-cycle/phases/08-fix-execution.md +++ b/.codex/skills/review-cycle/phases/08-fix-execution.md @@ -61,7 +61,7 @@ const execAgentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/cli-execution-agent.md (MUST read first) 2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json +3. Read: ${projectRoot}/.workflow/specs/*.md --- diff --git a/.codex/skills/team-planex/SKILL.md b/.codex/skills/team-planex/SKILL.md deleted file mode 100644 index c88c3746..00000000 --- a/.codex/skills/team-planex/SKILL.md +++ /dev/null @@ -1,427 +0,0 @@ ---- -name: team-planex -description: 2-member plan-and-execute pipeline with per-issue beat pipeline for concurrent planning and execution. Planner decomposes requirements into issues, generates solutions, writes artifacts. Executor implements solutions via configurable backends (agent/codex/gemini). Triggers on "team planex". -allowed-tools: spawn_agent, wait, send_input, close_agent, AskUserQuestion, Read, Write, Edit, Bash, Glob, Grep -argument-hint: " [--exec=agent|codex|gemini|auto] [-y]" ---- - -# Team PlanEx - -2 成员边规划边执行团队。通过逐 Issue 节拍流水线实现 planner 和 executor 并行工作:planner 每完成一个 issue 的 solution 后输出 ISSUE_READY 信号,orchestrator 立即 spawn executor agent 处理该 issue,同时 send_input 让 planner 继续下一 issue。 - -## Architecture Overview - -``` -┌──────────────────────────────────────────────┐ -│ Orchestrator (this file) │ -│ → Parse input → Spawn planner → Spawn exec │ -└────────────────┬─────────────────────────────┘ - │ Per-Issue Beat Pipeline - ┌───────┴───────┐ - ↓ ↓ - ┌─────────┐ ┌──────────┐ - │ planner │ │ executor │ - │ (plan) │ │ (impl) │ - └─────────┘ └──────────┘ - │ │ - issue-plan-agent code-developer - (or codex/gemini CLI) -``` - -## Agent Registry - -| Agent | Role File | Responsibility | New/Existing | -|-------|-----------|----------------|--------------| -| `planex-planner` | `.codex/skills/team-planex/agents/planex-planner.md` | 需求拆解 → issue 创建 → 方案设计 → 冲突检查 → 逐 issue 派发 | New (skill-specific) | -| `planex-executor` | `.codex/skills/team-planex/agents/planex-executor.md` | 加载 solution → 代码实现 → 测试 → 提交 | New (skill-specific) | -| `issue-plan-agent` | `~/.codex/agents/issue-plan-agent.md` | ACE exploration + solution generation + binding | Existing | -| `code-developer` | `~/.codex/agents/code-developer.md` | Code implementation (agent backend) | Existing | - -## Input Types - -支持 3 种输入方式(通过 orchestrator message 传入): - -| 输入类型 | 格式 | 示例 | -|----------|------|------| -| Issue IDs | 直接传入 ID | `ISS-20260215-001 ISS-20260215-002` | -| 需求文本 | `--text '...'` | `--text '实现用户认证模块'` | -| Plan 文件 | `--plan path` | `--plan plan/2026-02-15-auth.md` | - -## Execution Method Selection - -支持 3 种执行后端: - -| Executor | 后端 | 适用场景 | -|----------|------|----------| -| `agent` | code-developer subagent | 简单任务、同步执行 | -| `codex` | `ccw cli --tool codex --mode write` | 复杂任务、后台执行 | -| `gemini` | `ccw cli --tool gemini --mode write` | 分析类任务、后台执行 | - -## Phase Execution - -### Phase 1: Input Parsing & Preference Collection - -Parse user arguments and determine execution configuration. - -```javascript -// Parse input from orchestrator message -const args = orchestratorMessage -const issueIds = args.match(/ISS-\d{8}-\d{6}/g) || [] -const textMatch = args.match(/--text\s+['"]([^'"]+)['"]/) -const planMatch = args.match(/--plan\s+(\S+)/) -const autoYes = /\b(-y|--yes)\b/.test(args) -const explicitExec = args.match(/--exec[=\s]+(agent|codex|gemini|auto)/i)?.[1] - -let executionConfig - -if (explicitExec) { - executionConfig = { - executionMethod: explicitExec.charAt(0).toUpperCase() + explicitExec.slice(1), - codeReviewTool: "Skip" - } -} else if (autoYes) { - executionConfig = { executionMethod: "Auto", codeReviewTool: "Skip" } -} else { - // Interactive: ask user for preferences - // (orchestrator handles user interaction directly) -} - -// Initialize session directory for artifacts -const slug = (issueIds[0] || 'batch').replace(/[^a-zA-Z0-9-]/g, '') -const dateStr = new Date().toISOString().slice(0,10).replace(/-/g,'') -const sessionId = `PEX-${slug}-${dateStr}` -const sessionDir = `.workflow/.team/${sessionId}` -shell(`mkdir -p "${sessionDir}/artifacts/solutions"`) -``` - -### Phase 2: Planning (Planner Agent — Per-Issue Beat) - -Spawn planner agent for per-issue planning. Uses send_input for issue-by-issue progression. - -```javascript -// Build planner input context -let plannerInput = "" -if (issueIds.length > 0) plannerInput = `issue_ids: ${JSON.stringify(issueIds)}` -else if (textMatch) plannerInput = `text: ${textMatch[1]}` -else if (planMatch) plannerInput = `plan_file: ${planMatch[1]}` - -const planner = spawn_agent({ - message: ` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: .codex/skills/team-planex/agents/planex-planner.md (MUST read first) -2. Read: .workflow/project-tech.json -3. Read: .workflow/project-guidelines.json - ---- - -Goal: Decompose requirements into executable solutions (per-issue beat) - -## Input -${plannerInput} - -## Execution Config -execution_method: ${executionConfig.executionMethod} -code_review: ${executionConfig.codeReviewTool} - -## Session Dir -session_dir: ${sessionDir} - -## Deliverables -For EACH issue, output structured data: - -\`\`\` -ISSUE_READY: -{ - "issue_id": "ISS-xxx", - "solution_id": "SOL-xxx", - "title": "...", - "priority": "normal", - "depends_on": [], - "solution_file": "${sessionDir}/artifacts/solutions/ISS-xxx.json" -} -\`\`\` - -After ALL issues planned, output: -\`\`\` -ALL_PLANNED: -{ "total_issues": N } -\`\`\` - -## Quality bar -- Every issue has a bound solution -- Solution artifact written to file before output -- Inline conflict check determines depends_on -` -}) - -// Wait for first ISSUE_READY -const firstIssue = wait({ ids: [planner], timeout_ms: 600000 }) - -if (firstIssue.timed_out) { - send_input({ id: planner, message: "Please finalize current issue and output ISSUE_READY." }) - const retry = wait({ ids: [planner], timeout_ms: 120000 }) -} - -// Parse first issue data -const firstIssueData = parseIssueReady(firstIssue.status[planner].completed) -``` - -### Phase 3: Per-Issue Beat Pipeline (Planning + Execution Interleaved) - -Pipeline: spawn executor for current issue while planner continues next issue. - -```javascript -const allAgentIds = [planner] -const executorAgents = [] -let allPlanned = false -let currentIssueOutput = firstIssue.status[planner].completed - -while (!allPlanned) { - // --- Spawn executor for current issue --- - const issueData = parseIssueReady(currentIssueOutput) - - if (issueData) { - const executor = spawn_agent({ - message: ` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: .codex/skills/team-planex/agents/planex-executor.md (MUST read first) -2. Read: .workflow/project-tech.json -3. Read: .workflow/project-guidelines.json - ---- - -Goal: Implement solution for ${issueData.issue_id} - -## Task -${JSON.stringify([issueData], null, 2)} - -## Execution Config -execution_method: ${executionConfig.executionMethod} -code_review: ${executionConfig.codeReviewTool} - -## Solution File -solution_file: ${issueData.solution_file} - -## Session Dir -session_dir: ${sessionDir} - -## Deliverables -\`\`\` -IMPL_COMPLETE: -issue_id: ${issueData.issue_id} -status: success|failed -test_result: pass|fail -commit: -\`\`\` - -## Quality bar -- All existing tests pass after implementation -- Code follows project conventions -- One commit per solution -` - }) - allAgentIds.push(executor) - executorAgents.push({ id: executor, issueId: issueData.issue_id }) - } - - // --- Check if ALL_PLANNED was in this output --- - if (currentIssueOutput.includes("ALL_PLANNED")) { - allPlanned = true - break - } - - // --- Tell planner to continue next issue --- - send_input({ id: planner, message: `Issue ${issueData?.issue_id || 'unknown'} dispatched. Continue to next issue.` }) - - // Wait for planner (next issue) - const plannerResult = wait({ ids: [planner], timeout_ms: 600000 }) - - if (plannerResult.timed_out) { - send_input({ id: planner, message: "Please finalize current issue and output results." }) - const retry = wait({ ids: [planner], timeout_ms: 120000 }) - currentIssueOutput = retry.status?.[planner]?.completed || "" - } else { - currentIssueOutput = plannerResult.status[planner]?.completed || "" - } - - // Check for ALL_PLANNED - if (currentIssueOutput.includes("ALL_PLANNED")) { - // May contain a final ISSUE_READY before ALL_PLANNED - const finalIssue = parseIssueReady(currentIssueOutput) - if (finalIssue) { - // Spawn one more executor for the last issue - const lastExec = spawn_agent({ - message: `... same executor spawn as above for ${finalIssue.issue_id} ...` - }) - allAgentIds.push(lastExec) - executorAgents.push({ id: lastExec, issueId: finalIssue.issue_id }) - } - allPlanned = true - } -} - -// Wait for all remaining executor agents -const pendingExecutors = executorAgents.map(e => e.id) - -if (pendingExecutors.length > 0) { - const finalResults = wait({ ids: pendingExecutors, timeout_ms: 900000 }) - - if (finalResults.timed_out) { - const pending = pendingExecutors.filter(id => !finalResults.status[id]?.completed) - pending.forEach(id => { - send_input({ id, message: "Please finalize current task and output results." }) - }) - wait({ ids: pending, timeout_ms: 120000 }) - } -} -``` - -### Phase 4: Result Aggregation & Cleanup - -```javascript -// Collect results from all executors -const pipelineResults = { - issues: [], - totalCompleted: 0, - totalFailed: 0 -} - -executorAgents.forEach(({ id, issueId }) => { - const output = results.status[id]?.completed || "" - const implResult = parseImplComplete(output) - pipelineResults.issues.push({ - issueId, - status: implResult?.status || 'unknown', - commit: implResult?.commit || 'N/A' - }) - if (implResult?.status === 'success') pipelineResults.totalCompleted++ - else pipelineResults.totalFailed++ -}) - -// Output final summary -console.log(` -## PlanEx Pipeline Complete - -### Summary -- Total Issues: ${executorAgents.length} -- Completed: ${pipelineResults.totalCompleted} -- Failed: ${pipelineResults.totalFailed} - -### Issue Details -${pipelineResults.issues.map(i => - `- ${i.issueId}: ${i.status} (commit: ${i.commit})` -).join('\n')} -`) - -// Cleanup ALL agents -allAgentIds.forEach(id => { - try { close_agent({ id }) } catch { /* already closed */ } -}) -``` - -## Coordination Protocol - -### File-Based Communication - -Since Codex agents have isolated contexts, use file-based coordination: - -| File | Purpose | Writer | Reader | -|------|---------|--------|--------| -| `{sessionDir}/artifacts/solutions/{issueId}.json` | Solution artifact | planner | executor | -| `{sessionDir}/exec-{issueId}.json` | Execution result | executor | orchestrator | -| `{sessionDir}/pipeline-log.ndjson` | Event log | both | orchestrator | - -### Solution Artifact Format - -```json -{ - "issue_id": "ISS-20260215-001", - "bound": { - "id": "SOL-001", - "title": "Implement auth module", - "tasks": [...], - "files_touched": ["src/auth/login.ts"] - }, - "execution_config": { - "execution_method": "Agent", - "code_review": "Skip" - }, - "timestamp": "2026-02-15T10:00:00Z" -} -``` - -### Execution Result Format - -```json -{ - "issue_id": "ISS-20260215-001", - "status": "success", - "executor": "agent", - "test_result": "pass", - "commit": "abc123", - "files_changed": ["src/auth/login.ts", "src/auth/login.test.ts"] -} -``` - -## Lifecycle Management - -### Timeout Handling - -| Timeout Scenario | Action | -|-----------------|--------| -| Planner issue timeout | send_input to urge convergence, retry wait | -| Executor impl timeout | send_input to finalize, record partial result | -| All agents timeout | Log error, abort with partial state | - -### Cleanup Protocol - -```javascript -// Track all agents created during execution -const allAgentIds = [] - -// ... (agents added during phase execution) ... - -// Final cleanup (end of orchestrator or on error) -allAgentIds.forEach(id => { - try { close_agent({ id }) } catch { /* already closed */ } -}) -``` - -## Error Handling - -| Scenario | Resolution | -|----------|------------| -| Planner issue failure | Retry once via send_input, then skip issue | -| Executor impl failure | Record failure, continue with next issue | -| No issues created from text | Report to user, abort | -| Solution generation failure | Skip issue, continue with remaining | -| Inline conflict check failure | Use empty depends_on, continue | -| Pipeline stall (no progress) | Timeout handling → urge convergence → abort | -| Missing role file | Log error, use inline fallback instructions | - -## Helper Functions - -```javascript -function parseIssueReady(output) { - const match = output.match(/ISSUE_READY:\s*\n([\s\S]*?)(?=\n```|$)/) - if (!match) return null - try { return JSON.parse(match[1]) } catch { return null } -} - -function parseImplComplete(output) { - const match = output.match(/IMPL_COMPLETE:\s*\n([\s\S]*?)(?=\n```|$)/) - if (!match) return null - try { return JSON.parse(match[1]) } catch { return null } -} - -function resolveExecutor(method, taskCount) { - if (method.toLowerCase() === 'auto') { - return taskCount <= 3 ? 'agent' : 'codex' - } - return method.toLowerCase() -} -``` diff --git a/.codex/skills/team-planex/agents/executor.md b/.codex/skills/team-planex/agents/executor.md new file mode 100644 index 00000000..f4ea4649 --- /dev/null +++ b/.codex/skills/team-planex/agents/executor.md @@ -0,0 +1,218 @@ +--- +name: planex-executor +description: | + PlanEx executor agent. Loads solution from artifact file → implements via Codex CLI + (ccw cli --tool codex --mode write) → verifies tests → commits → reports. + Deploy to: ~/.codex/agents/planex-executor.md +color: green +--- + +# PlanEx Executor + +Single-issue implementation agent. Loads solution from JSON artifact, executes +implementation via Codex CLI, verifies with tests, commits, and outputs a structured +completion report. + +## Identity + +- **Tag**: `[executor]` +- **Backend**: Codex CLI only (`ccw cli --tool codex --mode write`) +- **Granularity**: One issue per agent instance + +## Core Responsibilities + +| Action | Allowed | +|--------|---------| +| Read solution artifact from disk | ✅ | +| Implement via Codex CLI | ✅ | +| Run tests for verification | ✅ | +| git commit completed work | ✅ | +| Create or modify issues | ❌ | +| Spawn subagents | ❌ | +| Interact with user (AskUserQuestion) | ❌ | + +--- + +## Execution Flow + +### Step 1: Load Context + +After reading role definition: +- Read: `.workflow/project-tech.json` +- Read: `.workflow/specs/*.md` +- Extract issue ID, solution file path, session dir from task message + +### Step 2: Load Solution + +Read solution artifact: + +```javascript +const solutionData = JSON.parse(Read(solutionFile)) +const solution = solutionData.solution +``` + +If file not found or invalid: +- Log error: `[executor] ERROR: Solution file not found: ${solutionFile}` +- Output: `EXEC_FAILED:{issueId}:solution_file_missing` +- Stop execution + +Verify solution has required fields: +- `solution.bound.title` or `solution.title` +- `solution.bound.tasks` or `solution.tasks` + +### Step 3: Update Issue Status + +```bash +ccw issue update ${issueId} --status executing +``` + +### Step 4: Codex CLI Execution + +Build execution prompt and invoke Codex: + +```bash +ccw cli -p "$(cat <<'PROMPT_EOF' +## Issue +ID: ${issueId} +Title: ${solution.bound.title} + +## Solution Plan +${JSON.stringify(solution.bound, null, 2)} + +## Implementation Requirements +1. Follow the solution plan tasks in order +2. Write clean, minimal code following existing patterns +3. Read .workflow/specs/*.md for project conventions +4. Run tests after each significant change +5. Ensure all existing tests still pass +6. Do NOT over-engineer - implement exactly what the solution specifies + +## Quality Checklist +- [ ] All solution tasks implemented +- [ ] No TypeScript/linting errors (run: npx tsc --noEmit) +- [ ] Existing tests pass +- [ ] New tests added where specified in solution +- [ ] No security vulnerabilities introduced + +## Project Guidelines +@.workflow/specs/*.md +PROMPT_EOF +)" --tool codex --mode write --id planex-${issueId} +``` + +**STOP after spawn** — Codex CLI executes in background. Do NOT poll or wait inside this agent. The CLI process handles implementation autonomously. + +Wait for CLI completion signal before proceeding to Step 5. + +### Step 5: Verify Tests + +Detect and run project test command: + +```javascript +// Detection priority: +// 1. package.json scripts.test +// 2. package.json scripts.test:unit +// 3. pytest.ini / setup.cfg (Python) +// 4. Makefile test target + +const testCmd = detectTestCommand() + +if (testCmd) { + const testResult = Bash(`${testCmd} 2>&1 || echo TEST_FAILED`) + + if (testResult.includes('TEST_FAILED') || testResult.includes('FAIL')) { + // Report failure with resume command + const resumeCmd = `ccw cli -p "Fix failing tests" --resume planex-${issueId} --tool codex --mode write` + + Write({ + file_path: `${sessionDir}/errors.json`, + content: JSON.stringify({ + issue_id: issueId, + type: 'test_failure', + test_output: testResult.slice(0, 2000), + resume_cmd: resumeCmd, + timestamp: new Date().toISOString() + }, null, 2) + }) + + Output: `EXEC_FAILED:${issueId}:tests_failing` + Stop. + } +} +``` + +### Step 6: Commit + +```bash +git add -A +git commit -m "feat(${issueId}): ${solution.bound.title}" +``` + +If commit fails (nothing to commit, pre-commit hook error): +- Log warning: `[executor] WARN: Commit failed for ${issueId}, continuing` +- Still proceed to Step 7 + +### Step 7: Update Issue & Report + +```bash +ccw issue update ${issueId} --status completed +``` + +Output completion report: + +``` +## [executor] Implementation Complete + +**Issue**: ${issueId} +**Title**: ${solution.bound.title} +**Backend**: codex +**Tests**: ${testCmd ? 'passing' : 'skipped (no test command found)'} +**Commit**: ${commitHash} +**Status**: resolved + +EXEC_DONE:${issueId} +``` + +--- + +## Resume Protocol + +If Codex CLI execution fails or times out: + +```bash +# Resume with same session ID +ccw cli -p "Continue implementation from where stopped" \ + --resume planex-${issueId} \ + --tool codex --mode write \ + --id planex-${issueId}-retry +``` + +Resume command is always logged to `${sessionDir}/errors.json` on any failure. + +--- + +## Error Handling + +| Scenario | Resolution | +|----------|------------| +| Solution file missing | Output `EXEC_FAILED:{id}:solution_file_missing`, stop | +| Solution JSON malformed | Output `EXEC_FAILED:{id}:solution_invalid`, stop | +| Issue status update fails | Log warning, continue | +| Codex CLI failure | Log resume command to errors.json, output `EXEC_FAILED:{id}:codex_failed` | +| Tests failing | Log test output + resume command, output `EXEC_FAILED:{id}:tests_failing` | +| Commit fails | Log warning, still output `EXEC_DONE:{id}` (implementation complete) | +| No test command found | Skip test step, proceed to commit | + +## Key Reminders + +**ALWAYS**: +- Output `EXEC_DONE:{issueId}` on its own line when implementation succeeds +- Output `EXEC_FAILED:{issueId}:{reason}` on its own line when implementation fails +- Log resume command to errors.json on any failure +- Use `[executor]` prefix in all status messages + +**NEVER**: +- Use any execution backend other than Codex CLI +- Create, modify, or read issues beyond the assigned issueId +- Spawn subagents +- Ask the user for clarification (fail fast with structured error) diff --git a/.codex/skills/team-planex/agents/planex-executor.md b/.codex/skills/team-planex/agents/planex-executor.md deleted file mode 100644 index 66aeda2a..00000000 --- a/.codex/skills/team-planex/agents/planex-executor.md +++ /dev/null @@ -1,544 +0,0 @@ ---- -name: planex-executor -description: | - Execution agent for PlanEx pipeline. Loads solutions from artifact files - (with CLI fallback), routes to configurable backends (agent/codex/gemini CLI), - runs tests, commits. Processes all tasks within a single assignment. -color: green -skill: team-planex ---- - -# PlanEx Executor - -从中间产物文件加载 solution(兼容 CLI fallback)→ 根据 execution_method 路由到对应后端(Agent/Codex/Gemini)→ 测试验证 → 提交。每次被 spawn 时处理分配的 exec tasks,按依赖顺序执行。 - -## Core Capabilities - -1. **Solution Loading**: 从中间产物文件加载 bound solution plan(兼容 CLI fallback) -2. **Multi-Backend Routing**: 根据 execution_method 选择 agent/codex/gemini 后端 -3. **Test Verification**: 实现后运行测试验证 -4. **Commit Management**: 每个 solution 完成后 git commit -5. **Result Reporting**: 输出结构化 IMPL_COMPLETE / WAVE_DONE 数据 - -## Execution Logging - -执行过程中**必须**实时维护两个日志文件,记录每个任务的执行状态和细节。 - -### Session Folder - -```javascript -// sessionFolder 从 TASK ASSIGNMENT 中的 session_dir 获取,或使用默认路径 -const sessionFolder = taskAssignment.session_dir - || `.workflow/.team/PEX-wave${waveNum}-${new Date().toISOString().slice(0,10)}` -``` - -### execution.md — 执行概览 - -在开始实现前初始化,任务完成/失败时更新状态。 - -```javascript -function initExecution(waveNum, execTasks, executionMethod) { - const executionMd = `# Execution Overview - -## Session Info -- **Wave**: ${waveNum} -- **Started**: ${getUtc8ISOString()} -- **Total Tasks**: ${execTasks.length} -- **Executor**: planex-executor (team-planex) -- **Execution Method**: ${executionMethod} -- **Execution Mode**: Sequential by dependency - -## Task Overview - -| # | Issue ID | Solution | Title | Priority | Dependencies | Status | -|---|----------|----------|-------|----------|--------------|--------| -${execTasks.map((t, i) => - `| ${i+1} | ${t.issue_id} | ${t.solution_id} | ${t.title} | ${t.priority} | ${(t.depends_on || []).join(', ') || '-'} | pending |` -).join('\n')} - -## Execution Timeline -> Updated as tasks complete - -## Execution Summary -> Updated after all tasks complete -` - shell(`mkdir -p ${sessionFolder}`) - write_file(`${sessionFolder}/execution.md`, executionMd) -} -``` - -### execution-events.md — 事件流 - -每个任务的 START/COMPLETE/FAIL 实时追加记录。 - -```javascript -function initEvents(waveNum) { - const eventsHeader = `# Execution Events - -**Wave**: ${waveNum} -**Executor**: planex-executor (team-planex) -**Started**: ${getUtc8ISOString()} - ---- - -` - write_file(`${sessionFolder}/execution-events.md`, eventsHeader) -} - -function appendEvent(content) { - const existing = read_file(`${sessionFolder}/execution-events.md`) - write_file(`${sessionFolder}/execution-events.md`, existing + content) -} - -function recordTaskStart(issueId, title, executor, files) { - appendEvent(`## ${getUtc8ISOString()} — ${issueId}: ${title} - -**Executor Backend**: ${executor} -**Status**: ⏳ IN PROGRESS -**Files**: ${files || 'TBD'} - -### Execution Log -`) -} - -function recordTaskComplete(issueId, executor, commitHash, filesModified, duration) { - appendEvent(` -**Status**: ✅ COMPLETED -**Duration**: ${duration} -**Executor**: ${executor} -**Commit**: \`${commitHash}\` -**Files Modified**: ${filesModified.join(', ')} - ---- -`) -} - -function recordTaskFailed(issueId, executor, error, resumeHint, duration) { - appendEvent(` -**Status**: ❌ FAILED -**Duration**: ${duration} -**Executor**: ${executor} -**Error**: ${error} -${resumeHint ? `**Resume**: \`${resumeHint}\`` : ''} - ---- -`) -} - -function recordTestVerification(issueId, passed, testOutput, duration) { - appendEvent(` -#### Test Verification — ${issueId} -- **Result**: ${passed ? '✅ PASS' : '❌ FAIL'} -- **Duration**: ${duration} -${!passed ? `- **Output** (truncated):\n\`\`\`\n${testOutput.slice(0, 500)}\n\`\`\`\n` : ''} -`) -} - -function updateTaskStatus(issueId, status) { - // Update the task row in execution.md table: replace "pending" with status - const content = read_file(`${sessionFolder}/execution.md`) - // Find row containing issueId, replace "pending" → status -} - -function finalizeExecution(totalTasks, succeeded, failedCount) { - const summary = ` -## Execution Summary - -- **Completed**: ${getUtc8ISOString()} -- **Total Tasks**: ${totalTasks} -- **Succeeded**: ${succeeded} -- **Failed**: ${failedCount} -- **Success Rate**: ${Math.round(succeeded / totalTasks * 100)}% -` - const content = read_file(`${sessionFolder}/execution.md`) - write_file(`${sessionFolder}/execution.md`, - content.replace('> Updated after all tasks complete', summary)) - - appendEvent(` ---- - -# Session Summary - -- **Wave**: ${waveNum} -- **Completed**: ${getUtc8ISOString()} -- **Tasks**: ${succeeded} completed, ${failedCount} failed -`) -} - -function getUtc8ISOString() { - return new Date(Date.now() + 8 * 3600000).toISOString().replace('Z', '+08:00') -} -``` - -## Execution Process - -### Step 1: Context Loading - -**MANDATORY**: Execute these steps FIRST before any other action. - -1. Read this role definition file (already done if you're reading this) -2. Read: `.workflow/project-tech.json` — understand project technology stack -3. Read: `.workflow/project-guidelines.json` — understand project conventions -4. Parse the TASK ASSIGNMENT from the spawn message for: - - **Goal**: Which wave to implement - - **Wave Tasks**: Array of exec_tasks with issue_id, solution_id, depends_on - - **Execution Config**: execution_method + code_review settings - - **Deliverables**: IMPL_COMPLETE + WAVE_DONE structured output - -### Step 2: Implementation (Sequential by Dependency) - -Process each task in the wave, respecting dependency order. **Record every task to execution logs.** - -```javascript -const tasks = taskAssignment.exec_tasks -const executionMethod = taskAssignment.execution_config.execution_method -const codeReview = taskAssignment.execution_config.code_review -const waveNum = taskAssignment.wave_number - -// ── Initialize execution logs ── -initExecution(waveNum, tasks, executionMethod) -initEvents(waveNum) - -let completed = 0 -let failed = 0 - -// Sort by dependencies (topological order — tasks with no deps first) -const sorted = topologicalSort(tasks) - -for (const task of sorted) { - const issueId = task.issue_id - const taskStartTime = Date.now() - - // --- Load solution (dual-mode: artifact file first, CLI fallback) --- - let solution - const solutionFile = task.solution_file - if (solutionFile) { - try { - const solutionData = JSON.parse(read_file(solutionFile)) - solution = solutionData.bound ? solutionData : { bound: solutionData } - } catch { - // Fallback to CLI - const solJson = shell(`ccw issue solution ${issueId} --json`) - solution = JSON.parse(solJson) - } - } else { - const solJson = shell(`ccw issue solution ${issueId} --json`) - solution = JSON.parse(solJson) - } - - if (!solution.bound) { - recordTaskStart(issueId, task.title, 'N/A', '') - recordTaskFailed(issueId, 'N/A', 'No bound solution', null, - `${Math.round((Date.now() - taskStartTime) / 1000)}s`) - updateTaskStatus(issueId, 'failed') - - console.log(`IMPL_COMPLETE:\n${JSON.stringify({ - issue_id: issueId, - status: "failed", - reason: "No bound solution", - test_result: "N/A", - commit: "N/A" - }, null, 2)}`) - failed++ - continue - } - - // --- Update issue status --- - shell(`ccw issue update ${issueId} --status executing`) - - // --- Resolve executor backend --- - const taskCount = solution.bound.task_count || solution.bound.tasks?.length || 0 - const executor = resolveExecutor(executionMethod, taskCount) - - // --- Record START event --- - const solutionFiles = (solution.bound.tasks || []) - .flatMap(t => t.files || []).join(', ') - recordTaskStart(issueId, task.title, executor, solutionFiles) - updateTaskStatus(issueId, 'in_progress') - - // --- Build execution prompt --- - const prompt = buildExecutionPrompt(issueId, solution) - - // --- Route to backend --- - let implSuccess = false - - if (executor === 'agent') { - // Spawn code-developer subagent (synchronous) - appendEvent(`- Spawning code-developer agent...\n`) - const devAgent = spawn_agent({ - message: ` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: ~/.codex/agents/code-developer.md (MUST read first) -2. Read: .workflow/project-tech.json -3. Read: .workflow/project-guidelines.json - ---- - -${prompt} -` - }) - - const devResult = wait({ ids: [devAgent], timeout_ms: 900000 }) - - if (devResult.timed_out) { - appendEvent(`- Agent timed out, urging convergence...\n`) - send_input({ id: devAgent, message: "Please finalize implementation and output results." }) - wait({ ids: [devAgent], timeout_ms: 120000 }) - } - - close_agent({ id: devAgent }) - appendEvent(`- code-developer agent completed\n`) - implSuccess = true - - } else if (executor === 'codex') { - const fixedId = `planex-${issueId}` - appendEvent(`- Executing via Codex CLI (id: ${fixedId})...\n`) - shell(`ccw cli -p "${prompt}" --tool codex --mode write --id ${fixedId}`) - appendEvent(`- Codex CLI completed\n`) - implSuccess = true - - } else if (executor === 'gemini') { - const fixedId = `planex-${issueId}` - appendEvent(`- Executing via Gemini CLI (id: ${fixedId})...\n`) - shell(`ccw cli -p "${prompt}" --tool gemini --mode write --id ${fixedId}`) - appendEvent(`- Gemini CLI completed\n`) - implSuccess = true - } - - // --- Test verification --- - let testCmd = 'npm test' - try { - const pkgJson = JSON.parse(read_file('package.json')) - if (pkgJson.scripts?.test) testCmd = 'npm test' - else if (pkgJson.scripts?.['test:unit']) testCmd = 'npm run test:unit' - } catch { /* use default */ } - - const testStartTime = Date.now() - appendEvent(`- Running tests: \`${testCmd}\`...\n`) - const testResult = shell(`${testCmd} 2>&1 || echo "TEST_FAILED"`) - const testPassed = !testResult.includes('TEST_FAILED') && !testResult.includes('FAIL') - const testDuration = `${Math.round((Date.now() - testStartTime) / 1000)}s` - - recordTestVerification(issueId, testPassed, testResult, testDuration) - - if (!testPassed) { - const duration = `${Math.round((Date.now() - taskStartTime) / 1000)}s` - const resumeHint = executor !== 'agent' - ? `ccw cli -p "Fix failing tests" --resume planex-${issueId} --tool ${executor} --mode write` - : null - - recordTaskFailed(issueId, executor, 'Tests failing after implementation', resumeHint, duration) - updateTaskStatus(issueId, 'failed') - - console.log(`IMPL_COMPLETE:\n${JSON.stringify({ - issue_id: issueId, - status: "failed", - reason: "Tests failing after implementation", - executor: executor, - test_result: "fail", - test_output: testResult.slice(0, 500), - commit: "N/A", - resume_hint: resumeHint || "Re-spawn code-developer with fix instructions" - }, null, 2)}`) - failed++ - continue - } - - // --- Optional code review --- - if (codeReview && codeReview !== 'Skip') { - appendEvent(`- Running code review (${codeReview})...\n`) - executeCodeReview(codeReview, issueId) - } - - // --- Git commit --- - shell(`git add -A && git commit -m "feat(${issueId}): implement solution ${task.solution_id}"`) - const commitHash = shell('git rev-parse --short HEAD').trim() - - appendEvent(`- Committed: \`${commitHash}\`\n`) - - // --- Update issue status --- - shell(`ccw issue update ${issueId} --status completed`) - - // --- Record completion --- - const duration = `${Math.round((Date.now() - taskStartTime) / 1000)}s` - const filesModified = shell('git diff --name-only HEAD~1 HEAD').trim().split('\n') - - recordTaskComplete(issueId, executor, commitHash, filesModified, duration) - updateTaskStatus(issueId, 'completed') - - console.log(`IMPL_COMPLETE:\n${JSON.stringify({ - issue_id: issueId, - status: "success", - executor: executor, - test_result: "pass", - commit: commitHash - }, null, 2)}`) - - completed++ -} -``` - -### Step 3: Wave Completion Report & Log Finalization - -```javascript -// ── Finalize execution logs ── -finalizeExecution(sorted.length, completed, failed) - -// ── Output structured wave result ── -console.log(`WAVE_DONE:\n${JSON.stringify({ - wave_number: waveNum, - completed: completed, - failed: failed, - execution_logs: { - execution_md: `${sessionFolder}/execution.md`, - events_md: `${sessionFolder}/execution-events.md` - } -}, null, 2)}`) -``` - -## Execution Log Output Structure - -``` -${sessionFolder}/ -├── execution.md # 执行概览:wave info, task table, summary -└── execution-events.md # 事件流:每个 task 的 START/COMPLETE/FAIL + 测试验证详情 -``` - -| File | Purpose | -|------|---------| -| `execution.md` | 概览:wave task 表格(issue/solution/status)、执行统计、最终结果 | -| `execution-events.md` | 时间线:每个 task 的后端选择、实现日志、测试验证、commit 记录 | - -## Execution Method Resolution - -```javascript -function resolveExecutor(method, taskCount) { - if (method.toLowerCase() === 'auto') { - return taskCount <= 3 ? 'agent' : 'codex' - } - return method.toLowerCase() // 'agent' | 'codex' | 'gemini' -} -``` - -## Execution Prompt Builder - -```javascript -function buildExecutionPrompt(issueId, solution) { - return ` -## Issue -ID: ${issueId} -Title: ${solution.bound.title || 'N/A'} - -## Solution Plan -${JSON.stringify(solution.bound, null, 2)} - -## Implementation Requirements -1. Follow the solution plan tasks in order -2. Write clean, minimal code following existing patterns -3. Run tests after each significant change -4. Ensure all existing tests still pass -5. Do NOT over-engineer — implement exactly what the solution specifies - -## Quality Checklist -- [ ] All solution tasks implemented -- [ ] No TypeScript/linting errors -- [ ] Existing tests pass -- [ ] New tests added where appropriate -- [ ] No security vulnerabilities introduced -` -} -``` - -## Code Review (Optional) - -```javascript -function executeCodeReview(reviewTool, issueId) { - if (reviewTool === 'Gemini Review') { - shell(`ccw cli -p "PURPOSE: Code review for ${issueId} implementation -TASK: Verify solution convergence, check test coverage, analyze quality -MODE: analysis -CONTEXT: @**/* -EXPECTED: Quality assessment with issue identification -CONSTRAINTS: Focus on solution adherence" --tool gemini --mode analysis`) - } else if (reviewTool === 'Codex Review') { - shell(`ccw cli --tool codex --mode review --uncommitted`) - } - // Agent Review: perform inline review (read diff, analyze) -} -``` - -## Role Boundaries - -### MUST - -- 仅处理被分配的 wave 中的 exec tasks -- 按依赖顺序(topological sort)执行任务 -- 每个 task 完成后输出 IMPL_COMPLETE -- 所有 tasks 完成后输出 WAVE_DONE -- 通过 spawn_agent 调用 code-developer(agent 后端) -- 运行测试验证实现 - -### MUST NOT - -- ❌ 创建 issue(planner 职责) -- ❌ 修改 solution 或 queue(planner 职责) -- ❌ Spawn issue-plan-agent 或 issue-queue-agent -- ❌ 处理非当前 wave 的任务 -- ❌ 跳过测试验证直接 commit - -## Topological Sort - -```javascript -function topologicalSort(tasks) { - const taskMap = new Map(tasks.map(t => [t.issue_id, t])) - const visited = new Set() - const result = [] - - function visit(id) { - if (visited.has(id)) return - visited.add(id) - const task = taskMap.get(id) - if (task?.depends_on) { - task.depends_on.forEach(dep => visit(dep)) - } - result.push(task) - } - - tasks.forEach(t => visit(t.issue_id)) - return result.filter(Boolean) -} -``` - -## Key Reminders - -**ALWAYS**: -- Read role definition file as FIRST action (Step 1) -- **Initialize execution.md + execution-events.md BEFORE starting any task** -- **Record START event before each task implementation** -- **Record COMPLETE/FAIL event after each task with duration and details** -- **Finalize logs at wave completion** -- Follow structured output template (IMPL_COMPLETE / WAVE_DONE) -- Verify tests pass before committing -- Respect dependency ordering within the wave -- Include executor backend info and commit hash in reports - -**NEVER**: -- Skip test verification before commit -- Modify files outside of the assigned solution scope -- Produce unstructured output -- Continue to next task if current has unresolved blockers -- Create new issues or modify planning artifacts - -## Error Handling - -| Scenario | Action | -|----------|--------| -| Solution not found | Report IMPL_COMPLETE with status=failed, reason | -| code-developer timeout | Urge convergence via send_input, close and report | -| CLI execution failure | Include resume_hint in IMPL_COMPLETE output | -| Tests failing | Report with test_output excerpt and resume_hint | -| Git commit failure | Retry once, then report in IMPL_COMPLETE | -| Unknown execution_method | Fallback to 'agent' with warning | -| Dependency task failed | Skip dependent tasks, report as failed with reason | diff --git a/.codex/skills/team-planex/agents/planex-planner.md b/.codex/skills/team-planex/agents/planex-planner.md deleted file mode 100644 index 07033940..00000000 --- a/.codex/skills/team-planex/agents/planex-planner.md +++ /dev/null @@ -1,290 +0,0 @@ ---- -name: planex-planner -description: | - Planning lead for PlanEx pipeline. Decomposes requirements into issues, - generates solutions via issue-plan-agent, performs inline conflict check, - writes solution artifacts. Per-issue output for orchestrator dispatch. -color: blue -skill: team-planex ---- - -# PlanEx Planner - -需求拆解 → issue 创建 → 方案设计 → inline 冲突检查 → 写中间产物 → 逐 issue 输出。内部 spawn issue-plan-agent 子代理,每完成一个 issue 的 solution 立即输出 ISSUE_READY,等待 orchestrator send_input 继续下一 issue。 - -## Core Capabilities - -1. **Requirement Decomposition**: 将需求文本/plan 文件拆解为独立 issues -2. **Solution Planning**: 通过 issue-plan-agent 为每个 issue 生成 solution -3. **Inline Conflict Check**: 基于 files_touched 重叠检测 + 显式依赖排序 -4. **Solution Artifacts**: 将 solution 写入中间产物文件供 executor 加载 -5. **Per-Issue Output**: 每个 issue 完成后立即输出 ISSUE_READY 数据 - -## Execution Process - -### Step 1: Context Loading - -**MANDATORY**: Execute these steps FIRST before any other action. - -1. Read this role definition file (already done if you're reading this) -2. Read: `.workflow/project-tech.json` — understand project technology stack -3. Read: `.workflow/project-guidelines.json` — understand project conventions -4. Parse the TASK ASSIGNMENT from the spawn message for: - - **Goal**: What to achieve - - **Input**: Issue IDs / text / plan file - - **Execution Config**: execution_method + code_review settings - - **Session Dir**: Path for writing solution artifacts - - **Deliverables**: ISSUE_READY + ALL_PLANNED structured output - -### Step 2: Input Parsing & Issue Creation - -Parse the input from TASK ASSIGNMENT and create issues as needed. - -```javascript -const input = taskAssignment.input -const sessionDir = taskAssignment.session_dir -const executionConfig = taskAssignment.execution_config - -// 1) 已有 Issue IDs -const issueIds = input.match(/ISS-\d{8}-\d{6}/g) || [] - -// 2) 文本输入 → 创建 issue -const textMatch = input.match(/text:\s*(.+)/) -if (textMatch && issueIds.length === 0) { - const result = shell(`ccw issue create --data '{"title":"${textMatch[1]}","description":"${textMatch[1]}"}' --json`) - const newIssue = JSON.parse(result) - issueIds.push(newIssue.id) -} - -// 3) Plan 文件 → 解析并批量创建 issues -const planMatch = input.match(/plan_file:\s*(\S+)/) -if (planMatch && issueIds.length === 0) { - const planContent = read_file(planMatch[1]) - - try { - const content = JSON.parse(planContent) - if (content.waves && content.issue_ids) { - // execution-plan format: use issue_ids directly - executionPlan = content - issueIds = content.issue_ids - } - } catch { - // Regular plan file: parse phases and create issues - const phases = parsePlanPhases(planContent) - for (const phase of phases) { - const result = shell(`ccw issue create --data '{"title":"${phase.title}","description":"${phase.description}"}' --json`) - issueIds.push(JSON.parse(result).id) - } - } -} -``` - -### Step 3: Per-Issue Solution Planning & Artifact Writing - -Process each issue individually: plan → write artifact → conflict check → output ISSUE_READY. - -```javascript -const projectRoot = shell('cd . && pwd').trim() -const dispatchedSolutions = [] - -shell(`mkdir -p "${sessionDir}/artifacts/solutions"`) - -for (let i = 0; i < issueIds.length; i++) { - const issueId = issueIds[i] - - // --- Step 3a: Spawn issue-plan-agent for single issue --- - const planAgent = spawn_agent({ - message: ` -## TASK ASSIGNMENT - -### MANDATORY FIRST STEPS (Agent Execute) -1. **Read role definition**: ~/.codex/agents/issue-plan-agent.md (MUST read first) -2. Read: .workflow/project-tech.json -3. Read: .workflow/project-guidelines.json - ---- - -Goal: Generate solution for issue ${issueId} - -issue_ids: ["${issueId}"] -project_root: "${projectRoot}" - -## Requirements -- Generate solution for this issue -- Auto-bind single solution -- For multiple solutions, select the most pragmatic one - -## Deliverables -Structured output with solution binding. -` - }) - - const planResult = wait({ ids: [planAgent], timeout_ms: 600000 }) - - if (planResult.timed_out) { - send_input({ id: planAgent, message: "Please finalize solution and output results." }) - wait({ ids: [planAgent], timeout_ms: 120000 }) - } - - close_agent({ id: planAgent }) - - // --- Step 3b: Load solution + write artifact file --- - const solJson = shell(`ccw issue solution ${issueId} --json`) - const solution = JSON.parse(solJson) - - const solutionFile = `${sessionDir}/artifacts/solutions/${issueId}.json` - write_file(solutionFile, JSON.stringify({ - issue_id: issueId, - ...solution, - execution_config: { - execution_method: executionConfig.executionMethod, - code_review: executionConfig.codeReviewTool - }, - timestamp: new Date().toISOString() - }, null, 2)) - - // --- Step 3c: Inline conflict check --- - const blockedBy = inlineConflictCheck(issueId, solution, dispatchedSolutions) - - // --- Step 3d: Output ISSUE_READY for orchestrator --- - dispatchedSolutions.push({ issueId, solution, solutionFile }) - - console.log(` -ISSUE_READY: -${JSON.stringify({ - issue_id: issueId, - solution_id: solution.bound?.id || 'N/A', - title: solution.bound?.title || issueId, - priority: "normal", - depends_on: blockedBy, - solution_file: solutionFile - }, null, 2)} -`) - - // Wait for orchestrator send_input before continuing to next issue - // (orchestrator will send: "Issue dispatched. Continue to next issue.") -} -``` - -### Step 4: Finalization - -After all issues are planned, output ALL_PLANNED signal. - -```javascript -console.log(` -ALL_PLANNED: -${JSON.stringify({ - total_issues: issueIds.length -}, null, 2)} -`) -``` - -## Inline Conflict Check - -```javascript -function inlineConflictCheck(issueId, solution, dispatchedSolutions) { - const currentFiles = solution.bound?.files_touched - || solution.bound?.affected_files || [] - const blockedBy = [] - - // 1. File conflict detection - for (const prev of dispatchedSolutions) { - const prevFiles = prev.solution.bound?.files_touched - || prev.solution.bound?.affected_files || [] - const overlap = currentFiles.filter(f => prevFiles.includes(f)) - if (overlap.length > 0) { - blockedBy.push(prev.issueId) - } - } - - // 2. Explicit dependencies - const explicitDeps = solution.bound?.dependencies?.on_issues || [] - for (const depId of explicitDeps) { - if (!blockedBy.includes(depId)) { - blockedBy.push(depId) - } - } - - return blockedBy -} -``` - -## Role Boundaries - -### MUST - -- 仅执行规划和拆解工作 -- 每个 issue 完成后输出 ISSUE_READY 结构化数据 -- 所有 issues 完成后输出 ALL_PLANNED -- 通过 spawn_agent 调用 issue-plan-agent(逐个 issue) -- 等待 orchestrator send_input 才继续下一 issue -- 将 solution 写入中间产物文件 - -### MUST NOT - -- ❌ 直接编写/修改业务代码(executor 职责) -- ❌ Spawn code-developer agent(executor 职责) -- ❌ 运行项目测试 -- ❌ git commit 代码变更 -- ❌ 直接修改 solution 内容(issue-plan-agent 负责) - -## Plan File Parsing - -```javascript -function parsePlanPhases(planContent) { - const phases = [] - const phaseRegex = /^#{2,3}\s+(?:Phase|Step|阶段)\s*\d*[:.:]\s*(.+?)$/gm - let match, lastIndex = 0, lastTitle = null - - while ((match = phaseRegex.exec(planContent)) !== null) { - if (lastTitle !== null) { - phases.push({ title: lastTitle, description: planContent.slice(lastIndex, match.index).trim() }) - } - lastTitle = match[1].trim() - lastIndex = match.index + match[0].length - } - - if (lastTitle !== null) { - phases.push({ title: lastTitle, description: planContent.slice(lastIndex).trim() }) - } - - if (phases.length === 0) { - const titleMatch = planContent.match(/^#\s+(.+)$/m) - phases.push({ - title: titleMatch ? titleMatch[1] : 'Plan Implementation', - description: planContent.slice(0, 500) - }) - } - - return phases -} -``` - -## Key Reminders - -**ALWAYS**: -- Read role definition file as FIRST action (Step 1) -- Follow structured output template (ISSUE_READY / ALL_PLANNED) -- Stay within planning boundaries (no code implementation) -- Spawn issue-plan-agent for each issue individually -- Write solution artifact file before outputting ISSUE_READY -- Include solution_file path in ISSUE_READY data - -**NEVER**: -- Modify source code files -- Skip context loading (Step 1) -- Produce unstructured or free-form output -- Continue to next issue without outputting ISSUE_READY -- Close without outputting ALL_PLANNED - -## Error Handling - -| Scenario | Action | -|----------|--------| -| Issue creation failure | Retry once with simplified text, report in output | -| issue-plan-agent timeout | Urge convergence via send_input, close and report partial | -| Inline conflict check failure | Use empty depends_on, continue | -| Solution artifact write failure | Report error, continue with ISSUE_READY output | -| Plan file not found | Report error in output with CLARIFICATION_NEEDED | -| Empty input (no issues, no text) | Output CLARIFICATION_NEEDED asking for requirements | -| Sub-agent produces invalid output | Report error, continue with available data | diff --git a/.codex/skills/team-planex/agents/planner.md b/.codex/skills/team-planex/agents/planner.md new file mode 100644 index 00000000..271c1087 --- /dev/null +++ b/.codex/skills/team-planex/agents/planner.md @@ -0,0 +1,184 @@ +--- +name: planex-planner +description: | + PlanEx planner agent. Issue decomposition + solution design with beat protocol. + Outputs ISSUE_READY:{id} after each solution, waits for "Continue" signal. + Deploy to: ~/.codex/agents/planex-planner.md +color: blue +--- + +# PlanEx Planner + +Requirement decomposition → issue creation → solution design, one issue at a time. +Outputs `ISSUE_READY:{issueId}` after each solution and waits for orchestrator to signal +"Continue". Only outputs `ALL_PLANNED:{count}` when all issues are processed. + +## Identity + +- **Tag**: `[planner]` +- **Beat Protocol**: ISSUE_READY per issue → wait → ALL_PLANNED when done +- **Boundary**: Planning only — no code writing, no test running, no git commits + +## Core Responsibilities + +| Action | Allowed | +|--------|---------| +| Parse input (Issue IDs / text / plan file) | ✅ | +| Create issues via CLI | ✅ | +| Generate solution via issue-plan-agent | ✅ | +| Write solution artifacts to disk | ✅ | +| Output ISSUE_READY / ALL_PLANNED signals | ✅ | +| Write or modify business code | ❌ | +| Run tests or git commit | ❌ | + +--- + +## CLI Toolbox + +| Command | Purpose | +|---------|---------| +| `ccw issue create --data '{"title":"...","description":"..."}' --json` | Create issue | +| `ccw issue status --json` | Check issue status | +| `ccw issue plan ` | Plan single issue (generates solution) | + +--- + +## Execution Flow + +### Step 1: Load Context + +After reading role definition, load project context: +- Read: `.workflow/project-tech.json` +- Read: `.workflow/specs/*.md` +- Extract session directory and artifacts directory from task message + +### Step 2: Parse Input + +Determine input type from task message: + +| Detection | Condition | Action | +|-----------|-----------|--------| +| Issue IDs | `ISS-\d{8}-\d{6}` pattern | Use directly for planning | +| `--text '...'` | Flag in message | Create issue(s) first via CLI | +| `--plan ` | Flag in message | Read file, parse phases, batch create issues | + +**Plan file parsing rules** (when `--plan` is used): +- Match `## Phase N: Title`, `## Step N: Title`, or `### N. Title` +- Each match → one issue (title + description from section content) +- Fallback: no structure found → entire file as single issue + +### Step 3: Issue Processing Loop (Beat Protocol) + +For each issue, execute in sequence: + +#### 3a. Generate Solution + +Use `issue-plan-agent` subagent to generate and bind solution: + +``` +spawn_agent({ + message: ` +## TASK ASSIGNMENT + +### MANDATORY FIRST STEPS (Agent Execute) +1. **Read role definition**: ~/.codex/agents/issue-plan-agent.md (MUST read first) +2. Read: .workflow/project-tech.json + +--- + +issue_ids: ["${issueId}"] +project_root: "${projectRoot}" + +## Requirements +- Generate solution for this issue +- Auto-bind single solution +- Output solution JSON when complete +` +}) + +const result = wait({ ids: [agent], timeout_ms: 600000 }) +close_agent({ id: agent }) +``` + +#### 3b. Write Solution Artifact + +```javascript +// Extract solution from issue-plan-agent result +const solution = parseSolution(result) + +Write({ + file_path: `${artifactsDir}/${issueId}.json`, + content: JSON.stringify({ + session_id: sessionId, + issue_id: issueId, + solution: solution, + planned_at: new Date().toISOString() + }, null, 2) +}) +``` + +#### 3c. Output Beat Signal + +Output EXACTLY (no surrounding text on this line): +``` +ISSUE_READY:{issueId} +``` + +Then STOP. Do not process next issue. Wait for "Continue" message from orchestrator. + +### Step 4: After All Issues + +When every issue has been processed and confirmed with "Continue": + +Output EXACTLY: +``` +ALL_PLANNED:{totalCount} +``` + +Where `{totalCount}` is the integer count of issues planned. + +--- + +## Issue Creation (when needed) + +For `--text` input: + +```bash +ccw issue create --data '{"title":"","description":"<description>"}' --json +``` + +Parse returned JSON for `id` field → use as issue ID. + +For `--plan` input, create issues one at a time: +```bash +# For each parsed phase/step: +ccw issue create --data '{"title":"<phase-title>","description":"<phase-content>"}' --json +``` + +Collect all created issue IDs before proceeding to Step 3. + +--- + +## Error Handling + +| Scenario | Resolution | +|----------|------------| +| Issue creation failure | Retry once with simplified text, then report error | +| `issue-plan-agent` failure | Retry once, then skip issue with `ISSUE_SKIP:{issueId}:reason` signal | +| Plan file not found | Output error immediately, do not proceed | +| Artifact write failure | Log warning inline, still output ISSUE_READY (executor will handle missing file) | +| "Continue" not received after 5 min | Re-output `ISSUE_READY:{issueId}` once as reminder | + +## Key Reminders + +**ALWAYS**: +- Output `ISSUE_READY:{issueId}` on its own line with no surrounding text +- Wait after each ISSUE_READY — do NOT auto-continue +- Write solution file before outputting ISSUE_READY +- Use `[planner]` prefix in all status messages + +**NEVER**: +- Output multiple ISSUE_READY signals before waiting for "Continue" +- Proceed to next issue without receiving "Continue" +- Write or modify any business logic files +- Run tests or execute git commands diff --git a/.codex/skills/team-planex/orchestrator.md b/.codex/skills/team-planex/orchestrator.md new file mode 100644 index 00000000..50b9be6b --- /dev/null +++ b/.codex/skills/team-planex/orchestrator.md @@ -0,0 +1,286 @@ +--- +name: team-planex +description: | + Beat pipeline: planner decomposes requirements issue-by-issue, orchestrator spawns + Codex executor per issue immediately. All execution via Codex CLI only. +agents: 2 +phases: 3 +--- + +# Team PlanEx (Codex) + +逐 Issue 节拍流水线。Planner 每完成一个 issue 的 solution 立即输出 `ISSUE_READY` 信号,Orchestrator 即刻 spawn 独立 Codex executor 并行实现,无需等待 planner 完成全部规划。 + +## Architecture + +``` +Input (Issue IDs / --text / --plan) + → Orchestrator: parse input → init session → spawn planner + → Beat loop: + wait(planner) → ISSUE_READY:{issueId} → spawn_agent(executor) + → send_input(planner, "Continue") + → ALL_PLANNED:{count} → close_agent(planner) + → wait(all executors) → report +``` + +## Agent Registry + +| Agent | Role File | Responsibility | +|-------|-----------|----------------| +| `planner` | `~/.codex/agents/planex-planner.md` | Issue decomp → solution design → ISSUE_READY signals | +| `executor` | `~/.codex/agents/planex-executor.md` | Codex CLI implementation per issue | + +> Both agents must be deployed to `~/.codex/agents/` before use. +> Source: `.codex/skills/team-planex/agents/` + +--- + +## Input Parsing + +Supported input types (parse from `$ARGUMENTS`): + +| Type | Detection | Handler | +|------|-----------|---------| +| Issue IDs | `ISS-\d{8}-\d{6}` regex | Pass directly to planner | +| Text | `--text '...'` flag | Planner creates issue(s) first | +| Plan file | `--plan <path>` flag | Planner reads file, batch creates issues | + +--- + +## Session Setup + +Before spawning agents, initialize session directory: + +```javascript +// Generate session slug from input description (max 20 chars, kebab-case) +const slug = toSlug(inputDescription).slice(0, 20) +const date = new Date().toISOString().slice(0, 10).replace(/-/g, '') +const sessionDir = `.workflow/.team/PEX-${slug}-${date}` +const artifactsDir = `${sessionDir}/artifacts/solutions` + +Bash(`mkdir -p "${artifactsDir}"`) + +// Write initial session state +Write({ + file_path: `${sessionDir}/team-session.json`, + content: JSON.stringify({ + session_id: `PEX-${slug}-${date}`, + input_type: inputType, + input: rawInput, + status: "running", + started_at: new Date().toISOString(), + executors: [] + }, null, 2) +}) +``` + +--- + +## Phase 1: Spawn Planner + +```javascript +const plannerAgent = spawn_agent({ + message: ` +## TASK ASSIGNMENT + +### MANDATORY FIRST STEPS (Agent Execute) +1. **Read role definition**: ~/.codex/agents/planex-planner.md (MUST read first) +2. Read: .workflow/project-tech.json +3. Read: .workflow/specs/*.md + +--- + +## Session +Session directory: ${sessionDir} +Artifacts directory: ${artifactsDir} + +## Input +${inputType === 'issues' ? `Issue IDs: ${issueIds.join(' ')}` : ''} +${inputType === 'text' ? `Requirement: ${requirementText}` : ''} +${inputType === 'plan' ? `Plan file: ${planPath}` : ''} + +## Beat Protocol (CRITICAL) +Process issues one at a time. After completing each issue's solution: +1. Write solution JSON to: ${artifactsDir}/{issueId}.json +2. Output EXACTLY this line: ISSUE_READY:{issueId} +3. STOP and wait — do NOT continue until you receive "Continue" + +When ALL issues are processed: +1. Output EXACTLY: ALL_PLANNED:{totalCount} +` +}) +``` + +--- + +## Phase 2: Beat Loop + +Orchestrator coordinates the planner-executor pipeline: + +```javascript +const executorIds = [] +const executorIssueMap = {} + +while (true) { + // Wait for planner beat signal (up to 10 min per issue) + const plannerOut = wait({ ids: [plannerAgent], timeout_ms: 600000 }) + + // Handle timeout: urge convergence and retry + if (plannerOut.timed_out) { + send_input({ + id: plannerAgent, + message: "Please output ISSUE_READY:{issueId} for current issue or ALL_PLANNED if done." + }) + continue + } + + const output = plannerOut.status[plannerAgent].completed + + // Detect ALL_PLANNED — pipeline complete + if (output.includes('ALL_PLANNED')) { + const match = output.match(/ALL_PLANNED:(\d+)/) + const total = match ? parseInt(match[1]) : executorIds.length + close_agent({ id: plannerAgent }) + break + } + + // Detect ISSUE_READY — spawn executor immediately + const issueMatch = output.match(/ISSUE_READY:(ISS-\d{8}-\d{6}|[A-Z0-9-]+)/) + if (issueMatch) { + const issueId = issueMatch[1] + const solutionFile = `${artifactsDir}/${issueId}.json` + + const executorId = spawn_agent({ + message: ` +## TASK ASSIGNMENT + +### MANDATORY FIRST STEPS (Agent Execute) +1. **Read role definition**: ~/.codex/agents/planex-executor.md (MUST read first) +2. Read: .workflow/project-tech.json +3. Read: .workflow/specs/*.md + +--- + +## Issue +Issue ID: ${issueId} +Solution file: ${solutionFile} +Session: ${sessionDir} + +## Execution +Load solution from file → implement via Codex CLI → verify tests → commit → report. +` + }) + + executorIds.push(executorId) + executorIssueMap[executorId] = issueId + + // Signal planner to continue to next issue + send_input({ id: plannerAgent, message: "Continue with next issue." }) + continue + } + + // Unexpected output: urge convergence + send_input({ + id: plannerAgent, + message: "Output ISSUE_READY:{issueId} when solution is ready, or ALL_PLANNED when all done." + }) +} +``` + +--- + +## Phase 3: Wait All Executors + +```javascript +if (executorIds.length > 0) { + // Extended timeout: Codex CLI execution per issue (~10-20 min each) + const execResults = wait({ ids: executorIds, timeout_ms: 1800000 }) + + if (execResults.timed_out) { + const completed = executorIds.filter(id => execResults.status[id]?.completed) + const pending = executorIds.filter(id => !execResults.status[id]?.completed) + // Log pending issues for manual follow-up + if (pending.length > 0) { + const pendingIssues = pending.map(id => executorIssueMap[id]) + Write({ + file_path: `${sessionDir}/pending-executors.json`, + content: JSON.stringify({ pending_issues: pendingIssues, executor_ids: pending }, null, 2) + }) + } + } + + // Collect summaries + const summaries = executorIds.map(id => ({ + issue_id: executorIssueMap[id], + status: execResults.status[id]?.completed ? 'completed' : 'timeout', + output: execResults.status[id]?.completed ?? null + })) + + // Cleanup + executorIds.forEach(id => { + try { close_agent({ id }) } catch { /* already closed */ } + }) + + // Final report + const completed = summaries.filter(s => s.status === 'completed').length + const failed = summaries.filter(s => s.status === 'timeout').length + + return ` +## Pipeline Complete + +**Total issues**: ${executorIds.length} +**Completed**: ${completed} +**Timed out**: ${failed} + +${summaries.map(s => `- ${s.issue_id}: ${s.status}`).join('\n')} + +Session: ${sessionDir} +` +} +``` + +--- + +## User Commands + +During execution, the user may issue: + +| Command | Action | +|---------|--------| +| `check` / `status` | Show executor progress summary | +| `resume` / `continue` | Urge stalled planner or executor | +| `add <issue-ids>` | `send_input` to planner with new issue IDs | +| `add --text '...'` | `send_input` to planner to create and plan new issue | +| `add --plan <path>` | `send_input` to planner to parse and batch create from plan file | + +**`add` handler** (inject mid-execution): + +```javascript +// Get current planner agent ID from session state +const session = JSON.parse(Read(`${sessionDir}/team-session.json`)) +const plannerAgentId = session.planner_agent_id // saved during Phase 1 + +send_input({ + id: plannerAgentId, + message: ` +## NEW ISSUES INJECTED +${newInput} + +Process these after current issue (or immediately if idle). +Follow beat protocol: ISSUE_READY → wait for Continue → next issue. +` +}) +``` + +--- + +## Error Handling + +| Scenario | Resolution | +|----------|------------| +| Planner timeout (>10 min per issue) | `send_input` urge convergence, re-enter loop | +| Planner never outputs ISSUE_READY | After 3 retries, `close_agent` + report stall | +| Solution file not written | Executor reports error, logs to `${sessionDir}/errors.json` | +| Executor (Codex CLI) failure | Executor handles resume; logs CLI resume command | +| ALL_PLANNED never received | After 60 min total, close planner, wait remaining executors | +| No issues to process | AskUserQuestion for clarification | diff --git a/.codex/skills/workflow-test-fix-cycle/SKILL.md b/.codex/skills/workflow-test-fix-cycle/SKILL.md index 350dfbb0..399aa0ba 100644 --- a/.codex/skills/workflow-test-fix-cycle/SKILL.md +++ b/.codex/skills/workflow-test-fix-cycle/SKILL.md @@ -89,7 +89,7 @@ const agentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/{agent-type}.md (MUST read first) 2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json +3. Read: ${projectRoot}/.workflow/specs/*.md ## TASK CONTEXT ${taskContext} diff --git a/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md b/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md index 5277ece2..ffe45002 100644 --- a/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +++ b/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md @@ -76,7 +76,7 @@ const contextAgentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/test-context-search-agent.md (MUST read first) 2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json +3. Read: ${projectRoot}/.workflow/specs/*.md --- @@ -103,7 +103,7 @@ const contextAgentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/context-search-agent.md (MUST read first) 2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json +3. Read: ${projectRoot}/.workflow/specs/*.md --- @@ -177,7 +177,7 @@ const analysisAgentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/cli-execution-agent.md (MUST read first) 2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json +3. Read: ${projectRoot}/.workflow/specs/*.md --- @@ -246,7 +246,7 @@ const taskGenAgentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/action-planning-agent.md (MUST read first) 2. Read: ${projectRoot}/.workflow/project-tech.json -3. Read: ${projectRoot}/.workflow/project-guidelines.json +3. Read: ${projectRoot}/.workflow/specs/*.md --- diff --git a/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md b/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md index 98701cc1..35091d57 100644 --- a/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +++ b/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md @@ -91,7 +91,7 @@ const analysisAgentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/cli-planning-agent.md (MUST read first) 2. Read: {projectRoot}/.workflow/project-tech.json -3. Read: {projectRoot}/.workflow/project-guidelines.json +3. Read: {projectRoot}/.workflow/specs/*.md --- @@ -158,7 +158,7 @@ const fixAgentId = spawn_agent({ ### MANDATORY FIRST STEPS (Agent Execute) 1. **Read role definition**: ~/.codex/agents/test-fix-agent.md (MUST read first) 2. Read: {projectRoot}/.workflow/project-tech.json -3. Read: {projectRoot}/.workflow/project-guidelines.json +3. Read: {projectRoot}/.workflow/specs/*.md --- diff --git a/.gitignore b/.gitignore index 33801300..419d65f2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ *.tmp *.log +# Spec index cache +.spec-index/ + # Node modules node_modules/ npm-debug.log* diff --git a/ccw/frontend/src/components/issue/hub/IssueBoardPanel.tsx b/ccw/frontend/src/components/issue/hub/IssueBoardPanel.tsx index 841ff439..5ae491f4 100644 --- a/ccw/frontend/src/components/issue/hub/IssueBoardPanel.tsx +++ b/ccw/frontend/src/components/issue/hub/IssueBoardPanel.tsx @@ -25,11 +25,12 @@ type ToolName = 'claude' | 'codex' | 'gemini'; type ResumeStrategy = 'nativeResume' | 'promptConcat'; const BOARD_COLUMNS: Array<{ id: IssueBoardStatus; titleKey: string }> = [ - { id: 'open', titleKey: 'issues.status.open' }, - { id: 'in_progress', titleKey: 'issues.status.inProgress' }, - { id: 'resolved', titleKey: 'issues.status.resolved' }, + { id: 'registered', titleKey: 'issues.status.registered' }, + { id: 'planning', titleKey: 'issues.status.planning' }, + { id: 'planned', titleKey: 'issues.status.planned' }, + { id: 'executing', titleKey: 'issues.status.executing' }, { id: 'completed', titleKey: 'issues.status.completed' }, - { id: 'closed', titleKey: 'issues.status.closed' }, + { id: 'failed', titleKey: 'issues.status.failed' }, ]; type BoardOrder = Partial<Record<IssueBoardStatus, string[]>>; @@ -294,8 +295,8 @@ export function IssueBoardPanel() { try { await updateIssue(issueId, { status: destStatus }); - // Auto action: drag to in_progress opens the drawer on terminal tab. - if (destStatus === 'in_progress' && sourceStatus !== 'in_progress') { + // Auto action: drag to executing opens the drawer on terminal tab. + if (destStatus === 'executing' && sourceStatus !== 'executing') { setDrawerInitialTab('terminal'); setSelectedIssue({ ...issue, status: destStatus }); diff --git a/ccw/frontend/src/components/issue/hub/IssueHubTabs.tsx b/ccw/frontend/src/components/issue/hub/IssueHubTabs.tsx index 3a297d23..cdfb0c43 100644 --- a/ccw/frontend/src/components/issue/hub/IssueHubTabs.tsx +++ b/ccw/frontend/src/components/issue/hub/IssueHubTabs.tsx @@ -8,7 +8,7 @@ import { Button } from '@/components/ui/Button'; import { cn } from '@/lib/utils'; // Keep in sync with IssueHubHeader/IssueHubPage -export type IssueTab = 'issues' | 'board' | 'queue' | 'discovery'; +export type IssueTab = 'issues' | 'queue' | 'discovery'; interface IssueHubTabsProps { currentTab: IssueTab; @@ -20,7 +20,6 @@ export function IssueHubTabs({ currentTab, onTabChange }: IssueHubTabsProps) { const tabs: Array<{ value: IssueTab; label: string }> = [ { value: 'issues', label: formatMessage({ id: 'issues.hub.tabs.issues' }) }, - { value: 'board', label: formatMessage({ id: 'issues.hub.tabs.board' }) }, { value: 'queue', label: formatMessage({ id: 'issues.hub.tabs.queue' }) }, { value: 'discovery', label: formatMessage({ id: 'issues.hub.tabs.discovery' }) }, ]; diff --git a/ccw/frontend/src/components/issue/hub/IssuesPanel.tsx b/ccw/frontend/src/components/issue/hub/IssuesPanel.tsx index f98711d6..76946754 100644 --- a/ccw/frontend/src/components/issue/hub/IssuesPanel.tsx +++ b/ccw/frontend/src/components/issue/hub/IssuesPanel.tsx @@ -1,9 +1,9 @@ // ======================================== // Issues Panel // ======================================== -// Issue list panel for IssueHub +// Unified issue list panel with list/board view toggle -import { useState, useMemo } from 'react'; +import { useState, useMemo, useCallback, useEffect } from 'react'; import { useIntl } from 'react-intl'; import { Search, @@ -11,7 +11,10 @@ import { Clock, AlertTriangle, AlertCircle, + LayoutGrid, + List, } from 'lucide-react'; +import type { DropResult } from '@hello-pangea/dnd'; import { Card } from '@/components/ui/Card'; import { Input } from '@/components/ui/Input'; import { Badge } from '@/components/ui/Badge'; @@ -19,11 +22,24 @@ import { Button } from '@/components/ui/Button'; import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@/components/ui/Select'; import { IssueCard } from '@/components/shared/IssueCard'; import { IssueDrawer } from '@/components/issue/hub/IssueDrawer'; +import { KanbanBoard, type KanbanColumn, type KanbanItem } from '@/components/shared/KanbanBoard'; import { useIssues, useIssueMutations } from '@/hooks'; +import { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore'; +import { cn } from '@/lib/utils'; import type { Issue } from '@/lib/api'; type StatusFilter = 'all' | Issue['status']; type PriorityFilter = 'all' | Issue['priority']; +type ViewMode = 'list' | 'board'; + +// Board columns matching backend status with Chinese defaults +const BOARD_COLUMNS: Array<{ id: Issue['status']; titleKey: string; defaultLabel: string }> = [ + { id: 'registered', titleKey: 'issues.status.registered', defaultLabel: '新注册' }, + { id: 'planning', titleKey: 'issues.status.planning', defaultLabel: '规划中' }, + { id: 'planned', titleKey: 'issues.status.planned', defaultLabel: '已规划' }, + { id: 'executing', titleKey: 'issues.status.executing', defaultLabel: '执行中' }, + { id: 'completed', titleKey: 'issues.status.completed', defaultLabel: '已完成' }, +]; interface IssuesPanelProps { onCreateIssue?: () => void; @@ -77,14 +93,114 @@ function IssueList({ issues, isLoading, onIssueClick, onIssueEdit, onIssueDelete ); } +// Local storage key for board order +function storageKey(projectPath: string | null | undefined): string { + const base = projectPath ? encodeURIComponent(projectPath) : 'global'; + return `ccw.issues.board.order:${base}`; +} + +type BoardOrder = Partial<Record<Issue['status'], string[]>>; + +function safeParseOrder(value: string | null): BoardOrder { + if (!value) return {}; + try { + const parsed = JSON.parse(value) as unknown; + if (!parsed || typeof parsed !== 'object') return {}; + return parsed as BoardOrder; + } catch { + return {}; + } +} + +function buildColumns( + issues: Issue[], + order: BoardOrder, + formatTitle: (statusId: Issue['status']) => string +): KanbanColumn<Issue & KanbanItem>[] { + const byId = new Map(issues.map((i) => [i.id, i])); + const columns: KanbanColumn<Issue & KanbanItem>[] = []; + + for (const col of BOARD_COLUMNS) { + const desired = (order[col.id] ?? []).map((id) => byId.get(id)).filter(Boolean) as Issue[]; + const desiredIds = new Set(desired.map((i) => i.id)); + + const remaining = issues + .filter((i) => i.status === col.id && !desiredIds.has(i.id)) + .sort((a, b) => { + const at = a.updatedAt || a.createdAt || ''; + const bt = b.updatedAt || b.createdAt || ''; + return bt.localeCompare(at); + }); + + const items = [...desired, ...remaining].map((issue) => ({ + ...issue, + id: issue.id, + title: issue.title, + status: issue.status, + })); + + columns.push({ + id: col.id, + title: formatTitle(col.id), + items, + icon: <LayoutGrid className="w-4 h-4" />, + }); + } + + return columns; +} + +function syncOrderWithIssues(prev: BoardOrder, issues: Issue[]): BoardOrder { + const statusById = new Map(issues.map((i) => [i.id, i.status])); + const next: BoardOrder = {}; + + for (const { id: status } of BOARD_COLUMNS) { + const existing = prev[status] ?? []; + const filtered = existing.filter((id) => statusById.get(id) === status); + const present = new Set(filtered); + + const missing = issues + .filter((i) => i.status === status && !present.has(i.id)) + .map((i) => i.id); + + next[status] = [...filtered, ...missing]; + } + + return next; +} + +function reorderIds(list: string[], from: number, to: number): string[] { + const next = [...list]; + const [moved] = next.splice(from, 1); + if (moved === undefined) return list; + next.splice(to, 0, moved); + return next; +} + export function IssuesPanel({ onCreateIssue: _onCreateIssue }: IssuesPanelProps) { const { formatMessage } = useIntl(); + const projectPath = useWorkflowStore(selectProjectPath); + + // View mode state + const [viewMode, setViewMode] = useState<ViewMode>('list'); + + // Filter state const [searchQuery, setSearchQuery] = useState(''); const [statusFilter, setStatusFilter] = useState<StatusFilter>('all'); const [priorityFilter, setPriorityFilter] = useState<PriorityFilter>('all'); const [selectedIssue, setSelectedIssue] = useState<Issue | null>(null); - const { issues, issuesByStatus, openCount, criticalCount, isLoading } = useIssues({ + // Board order state + const [order, setOrder] = useState<BoardOrder>({}); + + // Load board order when project changes + useEffect(() => { + const key = storageKey(projectPath); + const loaded = safeParseOrder(localStorage.getItem(key)); + setOrder(loaded); + }, [projectPath]); + + const { issues, criticalCount, isLoading } = useIssues({ filter: { search: searchQuery || undefined, status: statusFilter !== 'all' ? [statusFilter] : undefined, @@ -94,14 +210,50 @@ export function IssuesPanel({ onCreateIssue: _onCreateIssue }: IssuesPanelProps) const { updateIssue, deleteIssue } = useIssueMutations(); + // Keep order consistent with current issues + useEffect(() => { + setOrder((prev) => syncOrderWithIssues(prev, issues)); + }, [issues]); + + // Persist order + useEffect(() => { + const key = storageKey(projectPath); + try { + localStorage.setItem(key, JSON.stringify(order)); + } catch { + // ignore quota errors + } + }, [order, projectPath]); + + // Status counts using backend statuses const statusCounts = useMemo(() => ({ all: issues.length, - open: issuesByStatus.open?.length || 0, - in_progress: issuesByStatus.in_progress?.length || 0, - resolved: issuesByStatus.resolved?.length || 0, - closed: issuesByStatus.closed?.length || 0, - completed: issuesByStatus.completed?.length || 0, - }), [issues, issuesByStatus]); + registered: issues.filter(i => i.status === 'registered').length, + planning: issues.filter(i => i.status === 'planning').length, + planned: issues.filter(i => i.status === 'planned').length, + executing: issues.filter(i => i.status === 'executing').length, + completed: issues.filter(i => i.status === 'completed').length, + failed: issues.filter(i => i.status === 'failed').length, + }), [issues]); + + // Build kanban columns + const columns = useMemo( + () => + buildColumns(issues, order, (statusId) => { + const col = BOARD_COLUMNS.find((c) => c.id === statusId); + if (!col) return statusId; + return formatMessage({ id: col.titleKey, defaultMessage: col.defaultLabel }); + }), + [issues, order, formatMessage] + ); + + const idsByStatus = useMemo(() => { + const map: Record<string, string[]> = {}; + for (const col of columns) { + map[col.id] = col.items.map((i) => i.id); + } + return map; + }, [columns]); const handleEditIssue = (_issue: Issue) => {}; @@ -123,22 +275,66 @@ export function IssuesPanel({ onCreateIssue: _onCreateIssue }: IssuesPanelProps) setSelectedIssue(null); }; + // Board drag handler + const handleDragEnd = useCallback( + async (result: DropResult, sourceColumn: string, destColumn: string) => { + const issueId = result.draggableId; + const issue = issues.find((i) => i.id === issueId); + if (!issue) return; + + const sourceStatus = sourceColumn as Issue['status']; + const destStatus = destColumn as Issue['status']; + const sourceIds = idsByStatus[sourceStatus] ?? []; + const destIds = idsByStatus[destStatus] ?? []; + + // Update local order first (optimistic) + setOrder((prev) => { + const next = { ...prev }; + if (sourceStatus === destStatus) { + next[sourceStatus] = reorderIds(sourceIds, result.source.index, result.destination!.index); + return next; + } + + const nextSource = [...sourceIds]; + nextSource.splice(result.source.index, 1); + + const nextDest = [...destIds]; + nextDest.splice(result.destination!.index, 0, issueId); + + next[sourceStatus] = nextSource; + next[destStatus] = nextDest; + return next; + }); + + // Status update + if (sourceStatus !== destStatus) { + try { + await updateIssue(issueId, { status: destStatus }); + } catch (e) { + console.error('Failed to update issue status:', e); + } + } + }, + [issues, idsByStatus, updateIssue] + ); + return ( <div className="space-y-4"> + {/* Stats Cards */} <div className="grid grid-cols-2 md:grid-cols-4 gap-4"> <Card className="p-4"> <div className="flex items-center gap-2"> <AlertCircle className="w-5 h-5 text-info" /> - <span className="text-2xl font-bold">{openCount}</span> + <span className="text-2xl font-bold">{statusCounts.registered}</span> </div> - <p className="text-sm text-muted-foreground mt-1">{formatMessage({ id: 'common.status.openIssues' })}</p> + <p className="text-sm text-muted-foreground mt-1">{formatMessage({ id: 'issues.status.registered', defaultMessage: '新注册' })}</p> </Card> <Card className="p-4"> <div className="flex items-center gap-2"> <Clock className="w-5 h-5 text-warning" /> - <span className="text-2xl font-bold">{issuesByStatus.in_progress?.length || 0}</span> + <span className="text-2xl font-bold">{statusCounts.executing}</span> </div> - <p className="text-sm text-muted-foreground mt-1">{formatMessage({ id: 'issues.status.inProgress' })}</p> + <p className="text-sm text-muted-foreground mt-1">{formatMessage({ id: 'issues.status.executing', defaultMessage: '执行中' })}</p> </Card> <Card className="p-4"> <div className="flex items-center gap-2"> @@ -150,12 +346,13 @@ export function IssuesPanel({ onCreateIssue: _onCreateIssue }: IssuesPanelProps) <Card className="p-4"> <div className="flex items-center gap-2"> <CheckCircle className="w-5 h-5 text-success" /> - <span className="text-2xl font-bold">{issuesByStatus.resolved?.length || 0}</span> + <span className="text-2xl font-bold">{statusCounts.completed}</span> </div> - <p className="text-sm text-muted-foreground mt-1">{formatMessage({ id: 'issues.status.resolved' })}</p> + <p className="text-sm text-muted-foreground mt-1">{formatMessage({ id: 'issues.status.completed', defaultMessage: '已完成' })}</p> </Card> </div> + {/* Toolbar */} <div className="flex flex-col sm:flex-row gap-3"> <div className="relative flex-1"> <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground" /> @@ -166,6 +363,29 @@ export function IssuesPanel({ onCreateIssue: _onCreateIssue }: IssuesPanelProps) className="pl-9" /> </div> + + {/* View Mode Toggle */} + <div className="flex border border-border rounded-md overflow-hidden"> + <Button + variant={viewMode === 'list' ? 'default' : 'ghost'} + size="sm" + className="rounded-none" + onClick={() => setViewMode('list')} + > + <List className="w-4 h-4 mr-1" /> + {formatMessage({ id: 'common.view.list', defaultMessage: '列表' })} + </Button> + <Button + variant={viewMode === 'board' ? 'default' : 'ghost'} + size="sm" + className="rounded-none" + onClick={() => setViewMode('board')} + > + <LayoutGrid className="w-4 h-4 mr-1" /> + {formatMessage({ id: 'common.view.board', defaultMessage: '看板' })} + </Button> + </div> + <div className="flex gap-2"> <Select value={statusFilter} onValueChange={(v) => setStatusFilter(v as StatusFilter)}> <SelectTrigger className="w-[140px]"> @@ -173,10 +393,12 @@ export function IssuesPanel({ onCreateIssue: _onCreateIssue }: IssuesPanelProps) </SelectTrigger> <SelectContent> <SelectItem value="all">{formatMessage({ id: 'issues.filters.all' })}</SelectItem> - <SelectItem value="open">{formatMessage({ id: 'issues.status.open' })}</SelectItem> - <SelectItem value="in_progress">{formatMessage({ id: 'issues.status.inProgress' })}</SelectItem> - <SelectItem value="resolved">{formatMessage({ id: 'issues.status.resolved' })}</SelectItem> - <SelectItem value="closed">{formatMessage({ id: 'issues.status.closed' })}</SelectItem> + <SelectItem value="registered">{formatMessage({ id: 'issues.status.registered', defaultMessage: '新注册' })}</SelectItem> + <SelectItem value="planning">{formatMessage({ id: 'issues.status.planning', defaultMessage: '规划中' })}</SelectItem> + <SelectItem value="planned">{formatMessage({ id: 'issues.status.planned', defaultMessage: '已规划' })}</SelectItem> + <SelectItem value="executing">{formatMessage({ id: 'issues.status.executing', defaultMessage: '执行中' })}</SelectItem> + <SelectItem value="completed">{formatMessage({ id: 'issues.status.completed', defaultMessage: '已完成' })}</SelectItem> + <SelectItem value="failed">{formatMessage({ id: 'issues.status.failed', defaultMessage: '失败' })}</SelectItem> </SelectContent> </Select> <Select value={priorityFilter} onValueChange={(v) => setPriorityFilter(v as PriorityFilter)}> @@ -194,32 +416,59 @@ export function IssuesPanel({ onCreateIssue: _onCreateIssue }: IssuesPanelProps) </div> </div> - <div className="flex flex-wrap gap-2"> - <Button variant={statusFilter === 'all' ? 'default' : 'outline'} size="sm" onClick={() => setStatusFilter('all')}> - {formatMessage({ id: 'issues.filters.all' })} ({statusCounts.all}) - </Button> - <Button variant={statusFilter === 'open' ? 'default' : 'outline'} size="sm" onClick={() => setStatusFilter('open')}> - <Badge variant="info" className="mr-2">{statusCounts.open}</Badge> - {formatMessage({ id: 'issues.status.open' })} - </Button> - <Button variant={statusFilter === 'in_progress' ? 'default' : 'outline'} size="sm" onClick={() => setStatusFilter('in_progress')}> - <Badge variant="warning" className="mr-2">{statusCounts.in_progress}</Badge> - {formatMessage({ id: 'issues.status.inProgress' })} - </Button> - <Button variant={priorityFilter === 'critical' ? 'destructive' : 'outline'} size="sm" onClick={() => { setPriorityFilter(priorityFilter === 'critical' ? 'all' : 'critical'); setStatusFilter('all'); }}> - <Badge variant="destructive" className="mr-2">{criticalCount}</Badge> - {formatMessage({ id: 'issues.priority.critical' })} - </Button> - </div> + {/* Status Filter Pills - only in list mode */} + {viewMode === 'list' && ( + <div className="flex flex-wrap gap-2"> + <Button variant={statusFilter === 'all' ? 'default' : 'outline'} size="sm" onClick={() => setStatusFilter('all')}> + {formatMessage({ id: 'issues.filters.all' })} ({statusCounts.all}) + </Button> + <Button variant={statusFilter === 'registered' ? 'default' : 'outline'} size="sm" onClick={() => setStatusFilter('registered')}> + <Badge variant="info" className="mr-2">{statusCounts.registered}</Badge> + {formatMessage({ id: 'issues.status.registered', defaultMessage: '新注册' })} + </Button> + <Button variant={statusFilter === 'executing' ? 'default' : 'outline'} size="sm" onClick={() => setStatusFilter('executing')}> + <Badge variant="warning" className="mr-2">{statusCounts.executing}</Badge> + {formatMessage({ id: 'issues.status.executing', defaultMessage: '执行中' })} + </Button> + <Button variant={priorityFilter === 'critical' ? 'destructive' : 'outline'} size="sm" onClick={() => { setPriorityFilter(priorityFilter === 'critical' ? 'all' : 'critical'); setStatusFilter('all'); }}> + <Badge variant="destructive" className="mr-2">{criticalCount}</Badge> + {formatMessage({ id: 'issues.priority.critical' })} + </Button> + </div> + )} - <IssueList - issues={issues} - isLoading={isLoading} - onIssueClick={handleIssueClick} - onIssueEdit={handleEditIssue} - onIssueDelete={handleDeleteIssue} - onStatusChange={handleStatusChange} - /> + {/* Content Area */} + {viewMode === 'list' ? ( + <IssueList + issues={issues} + isLoading={isLoading} + onIssueClick={handleIssueClick} + onIssueEdit={handleEditIssue} + onIssueDelete={handleDeleteIssue} + onStatusChange={handleStatusChange} + /> + ) : ( + <KanbanBoard<Issue & KanbanItem> + columns={columns} + onDragEnd={handleDragEnd} + onItemClick={(item) => handleIssueClick(item as unknown as Issue)} + isLoading={isLoading} + emptyColumnMessage={formatMessage({ id: 'issues.emptyState.message' })} + className={cn('gap-4', 'grid')} + renderItem={(item, provided) => ( + <IssueCard + issue={item as unknown as Issue} + compact + showActions={false} + onClick={(i) => handleIssueClick(i)} + innerRef={provided.innerRef} + draggableProps={provided.draggableProps} + dragHandleProps={provided.dragHandleProps} + className="w-full" + /> + )} + /> + )} {/* Issue Detail Drawer */} <IssueDrawer diff --git a/ccw/frontend/src/components/layout/Sidebar.tsx b/ccw/frontend/src/components/layout/Sidebar.tsx index bbe6b0d6..3df210d9 100644 --- a/ccw/frontend/src/components/layout/Sidebar.tsx +++ b/ccw/frontend/src/components/layout/Sidebar.tsx @@ -26,6 +26,7 @@ import { Cog, Users, FileSearch, + ScrollText, } from 'lucide-react'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/Button'; @@ -101,6 +102,7 @@ const navGroupDefinitions: NavGroupDef[] = [ items: [ { path: '/hooks', labelKey: 'navigation.main.hooks', icon: GitFork }, { path: '/settings/mcp', labelKey: 'navigation.main.mcp', icon: Server }, + { path: '/settings/specs', labelKey: 'navigation.main.specs', icon: ScrollText }, ], }, { diff --git a/ccw/frontend/src/components/shared/IssueCard.tsx b/ccw/frontend/src/components/shared/IssueCard.tsx index 0502d1e1..be7804ea 100644 --- a/ccw/frontend/src/components/shared/IssueCard.tsx +++ b/ccw/frontend/src/components/shared/IssueCard.tsx @@ -16,6 +16,7 @@ import { CheckCircle, Clock, XCircle, + Loader2, } from 'lucide-react'; import { cn } from '@/lib/utils'; import { Card } from '@/components/ui/Card'; @@ -61,20 +62,26 @@ const priorityLabelKeys: Record<Issue['priority'], string> = { // Status icon and color configuration (without labels for i18n) const statusVariantConfig: Record<Issue['status'], { icon: React.ElementType; color: string }> = { - open: { icon: AlertCircle, color: 'info' }, - in_progress: { icon: Clock, color: 'warning' }, - resolved: { icon: CheckCircle, color: 'success' }, - closed: { icon: XCircle, color: 'muted' }, + registered: { icon: AlertCircle, color: 'info' }, + planning: { icon: Clock, color: 'warning' }, + planned: { icon: Clock, color: 'warning' }, + queued: { icon: Clock, color: 'warning' }, + executing: { icon: Loader2, color: 'warning' }, completed: { icon: CheckCircle, color: 'success' }, + failed: { icon: XCircle, color: 'destructive' }, + paused: { icon: Clock, color: 'muted' }, }; // Status label keys for i18n const statusLabelKeys: Record<Issue['status'], string> = { - open: 'issues.status.open', - in_progress: 'issues.status.inProgress', - resolved: 'issues.status.resolved', - closed: 'issues.status.closed', + registered: 'issues.status.registered', + planning: 'issues.status.planning', + planned: 'issues.status.planned', + queued: 'issues.status.queued', + executing: 'issues.status.executing', completed: 'issues.status.completed', + failed: 'issues.status.failed', + paused: 'issues.status.paused', }; // ========== Priority Badge ========== @@ -228,11 +235,11 @@ export function IssueCard({ <Edit className="w-4 h-4 mr-2" /> {formatMessage({ id: 'issues.actions.edit' })} </DropdownMenuItem> - <DropdownMenuItem onClick={() => onStatusChange?.(issue, 'in_progress')}> + <DropdownMenuItem onClick={() => onStatusChange?.(issue, 'executing')}> <Clock className="w-4 h-4 mr-2" /> {formatMessage({ id: 'issues.actions.startProgress' })} </DropdownMenuItem> - <DropdownMenuItem onClick={() => onStatusChange?.(issue, 'resolved')}> + <DropdownMenuItem onClick={() => onStatusChange?.(issue, 'completed')}> <CheckCircle className="w-4 h-4 mr-2" /> {formatMessage({ id: 'issues.actions.markResolved' })} </DropdownMenuItem> diff --git a/ccw/frontend/src/components/specs/GlobalSettingsTab.tsx b/ccw/frontend/src/components/specs/GlobalSettingsTab.tsx new file mode 100644 index 00000000..c1184d18 --- /dev/null +++ b/ccw/frontend/src/components/specs/GlobalSettingsTab.tsx @@ -0,0 +1,341 @@ +// ======================================== +// GlobalSettingsTab Component +// ======================================== +// Global settings for personal spec defaults and spec statistics + +import { useState, useEffect } from 'react'; +import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { toast } from 'sonner'; +import { Settings, RefreshCw } from 'lucide-react'; +import { + Card, + CardHeader, + CardTitle, + CardDescription, + CardContent, +} from '@/components/ui/Card'; +import { Button } from '@/components/ui/Button'; +import { Label } from '@/components/ui/Label'; +import { Switch } from '@/components/ui/Switch'; +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from '@/components/ui/Select'; +import { cn } from '@/lib/utils'; + +// ========== Types ========== + +interface PersonalSpecDefaults { + defaultReadMode: 'required' | 'optional'; + autoEnable: boolean; +} + +interface SystemSettings { + injectionControl: { + maxLength: number; + warnThreshold: number; + truncateOnExceed: boolean; + }; + personalSpecDefaults: PersonalSpecDefaults; +} + +interface SpecDimensionStats { + count: number; + requiredCount: number; +} + +interface SpecStats { + dimensions: { + specs: SpecDimensionStats; + roadmap: SpecDimensionStats; + changelog: SpecDimensionStats; + personal: SpecDimensionStats; + }; + injectionLength?: { + requiredOnly: number; + withKeywords: number; + maxLength: number; + percentage: number; + }; +} + +// ========== API Functions ========== + +const API_BASE = '/api'; + +async function fetchSystemSettings(): Promise<SystemSettings> { + const response = await fetch(`${API_BASE}/system/settings`, { + credentials: 'same-origin', + }); + if (!response.ok) { + throw new Error(`Failed to fetch settings: ${response.statusText}`); + } + const data = await response.json(); + return data; +} + +async function updateSystemSettings( + settings: Partial<SystemSettings> +): Promise<{ success: boolean; settings: SystemSettings }> { + const response = await fetch(`${API_BASE}/system/settings`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'same-origin', + body: JSON.stringify(settings), + }); + if (!response.ok) { + throw new Error(`Failed to update settings: ${response.statusText}`); + } + return response.json(); +} + +async function fetchSpecStats(): Promise<SpecStats> { + const response = await fetch(`${API_BASE}/specs/stats`, { + credentials: 'same-origin', + }); + if (!response.ok) { + throw new Error(`Failed to fetch spec stats: ${response.statusText}`); + } + return response.json(); +} + +// ========== Query Keys ========== + +const settingsKeys = { + all: ['system-settings'] as const, + settings: () => [...settingsKeys.all, 'settings'] as const, + stats: () => [...settingsKeys.all, 'stats'] as const, +}; + +// ========== Component ========== + +export function GlobalSettingsTab() { + const queryClient = useQueryClient(); + + // Local state for immediate UI feedback + const [localDefaults, setLocalDefaults] = useState<PersonalSpecDefaults>({ + defaultReadMode: 'optional', + autoEnable: true, + }); + + // Fetch system settings + const { + data: settings, + isLoading: isLoadingSettings, + error: settingsError, + } = useQuery({ + queryKey: settingsKeys.settings(), + queryFn: fetchSystemSettings, + staleTime: 60000, // 1 minute + }); + + // Fetch spec stats + const { + data: stats, + isLoading: isLoadingStats, + error: statsError, + refetch: refetchStats, + } = useQuery({ + queryKey: settingsKeys.stats(), + queryFn: fetchSpecStats, + staleTime: 30000, // 30 seconds + }); + + // Update settings mutation + const updateMutation = useMutation({ + mutationFn: updateSystemSettings, + onSuccess: (data) => { + queryClient.setQueryData(settingsKeys.settings(), data.settings); + toast.success('Settings saved successfully'); + }, + onError: (error) => { + toast.error(`Failed to save settings: ${error.message}`); + }, + }); + + // Sync local state with server state + useEffect(() => { + if (settings?.personalSpecDefaults) { + setLocalDefaults(settings.personalSpecDefaults); + } + }, [settings]); + + // Handlers + const handleReadModeChange = (value: 'required' | 'optional') => { + const newDefaults = { ...localDefaults, defaultReadMode: value }; + setLocalDefaults(newDefaults); + updateMutation.mutate({ personalSpecDefaults: newDefaults }); + }; + + const handleAutoEnableChange = (checked: boolean) => { + const newDefaults = { ...localDefaults, autoEnable: checked }; + setLocalDefaults(newDefaults); + updateMutation.mutate({ personalSpecDefaults: newDefaults }); + }; + + // Calculate totals + const dimensions = stats?.dimensions || {}; + const dimensionEntries = Object.entries(dimensions) as [ + keyof typeof dimensions, + SpecDimensionStats + ][]; + const totalCount = dimensionEntries.reduce( + (sum, [, data]) => sum + data.count, + 0 + ); + const totalRequired = dimensionEntries.reduce( + (sum, [, data]) => sum + data.requiredCount, + 0 + ); + + const isLoading = isLoadingSettings || isLoadingStats; + const hasError = settingsError || statsError; + + // Dimension display config + const dimensionLabels: Record<string, string> = { + specs: 'Specs', + roadmap: 'Roadmap', + changelog: 'Changelog', + personal: 'Personal', + }; + + return ( + <div className="space-y-6"> + {/* Personal Spec Defaults Card */} + <Card> + <CardHeader> + <div className="flex items-center gap-2"> + <Settings className="h-5 w-5 text-muted-foreground" /> + <CardTitle>Personal Spec Defaults</CardTitle> + </div> + <CardDescription> + These settings will be applied when creating new personal specs + </CardDescription> + </CardHeader> + <CardContent className="space-y-6"> + {/* Default Read Mode */} + <div className="space-y-2"> + <Label htmlFor="default-read-mode">Default Read Mode</Label> + <Select + value={localDefaults.defaultReadMode} + onValueChange={(value) => + handleReadModeChange(value as 'required' | 'optional') + } + > + <SelectTrigger id="default-read-mode" className="w-full"> + <SelectValue placeholder="Select read mode" /> + </SelectTrigger> + <SelectContent> + <SelectItem value="required"> + Required (Always inject) + </SelectItem> + <SelectItem value="optional"> + Optional (Inject on keyword match) + </SelectItem> + </SelectContent> + </Select> + <p className="text-sm text-muted-foreground"> + The default read mode for newly created personal specs + </p> + </div> + + {/* Auto Enable */} + <div className="flex items-center justify-between"> + <div className="space-y-0.5"> + <Label htmlFor="auto-enable">Auto Enable New Specs</Label> + <p className="text-sm text-muted-foreground"> + Automatically enable newly created personal specs + </p> + </div> + <Switch + id="auto-enable" + checked={localDefaults.autoEnable} + onCheckedChange={handleAutoEnableChange} + disabled={updateMutation.isPending} + /> + </div> + </CardContent> + </Card> + + {/* Spec Statistics Card */} + <Card> + <CardHeader> + <div className="flex items-center justify-between"> + <CardTitle>Spec Statistics</CardTitle> + <Button + variant="ghost" + size="sm" + onClick={() => refetchStats()} + disabled={isLoadingStats} + > + <RefreshCw + className={cn( + 'h-4 w-4', + isLoadingStats && 'animate-spin' + )} + /> + </Button> + </div> + </CardHeader> + <CardContent> + {isLoading ? ( + <div className="grid grid-cols-4 gap-4"> + {[1, 2, 3, 4].map((i) => ( + <div + key={i} + className="text-center p-4 rounded-lg bg-muted animate-pulse" + > + <div className="h-8 w-12 mx-auto bg-muted-foreground/20 rounded mb-2" /> + <div className="h-4 w-16 mx-auto bg-muted-foreground/20 rounded" /> + </div> + ))} + </div> + ) : hasError ? ( + <div className="text-center py-8 text-muted-foreground"> + Failed to load statistics + </div> + ) : ( + <> + <div className="grid grid-cols-4 gap-4"> + {dimensionEntries.map(([dim, data]) => ( + <div + key={dim} + className="text-center p-4 rounded-lg bg-muted/50 hover:bg-muted transition-colors" + > + <div className="text-2xl font-bold text-foreground"> + {data.count} + </div> + <div className="text-sm text-muted-foreground capitalize"> + {dimensionLabels[dim] || dim} + </div> + <div className="text-xs text-muted-foreground mt-1"> + {data.requiredCount} required + </div> + </div> + ))} + </div> + + {/* Summary */} + <div className="mt-4 pt-4 border-t border-border"> + <div className="flex justify-between text-sm text-muted-foreground"> + <span>Total: {totalCount} spec files</span> + <span> + {totalRequired} required | {totalCount - totalRequired}{' '} + optional + </span> + </div> + </div> + </> + )} + </CardContent> + </Card> + </div> + ); +} + +export default GlobalSettingsTab; diff --git a/ccw/frontend/src/components/specs/HookCard.tsx b/ccw/frontend/src/components/specs/HookCard.tsx new file mode 100644 index 00000000..eccdf974 --- /dev/null +++ b/ccw/frontend/src/components/specs/HookCard.tsx @@ -0,0 +1,318 @@ +// ======================================== +// HookCard Component +// ======================================== +// Hook card with event badge, scope badge and action menu + +import * as React from 'react'; +import { useIntl } from 'react-intl'; +import { cn } from '@/lib/utils'; +import { Card, CardContent } from '@/components/ui/Card'; +import { Badge } from '@/components/ui/Badge'; +import { Button } from '@/components/ui/Button'; +import { Switch } from '@/components/ui/Switch'; +import { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, +} from '@/components/ui/Dropdown'; +import { + Zap, + MoreVertical, + Edit, + Trash2, + Globe, + Folder, + Play, + Clock, + Terminal, +} from 'lucide-react'; + +/** + * Hook event types + */ +export type HookEvent = 'SessionStart' | 'UserPromptSubmit' | 'SessionEnd'; + +/** + * Hook scope types + */ +export type HookScope = 'global' | 'project'; + +/** + * Fail mode for hooks + */ +export type HookFailMode = 'continue' | 'block' | 'warn'; + +/** + * Hook configuration interface + */ +export interface HookConfig { + /** Unique hook identifier */ + id: string; + /** Hook name */ + name: string; + /** Trigger event */ + event: HookEvent; + /** Command to execute */ + command: string; + /** Description */ + description?: string; + /** Scope (global or project) */ + scope: HookScope; + /** Whether hook is enabled */ + enabled: boolean; + /** Whether hook is installed */ + installed?: boolean; + /** Whether this is a recommended hook */ + isRecommended?: boolean; + /** Timeout in milliseconds */ + timeout?: number; + /** Fail mode */ + failMode?: HookFailMode; +} + +export interface HookCardProps { + /** Hook data */ + hook: HookConfig; + /** Called when edit action is triggered */ + onEdit?: (hook: HookConfig) => void; + /** Called when uninstall action is triggered */ + onUninstall?: (hookId: string) => void; + /** Called when toggle enabled is triggered */ + onToggle?: (hookId: string, enabled: boolean) => void; + /** Optional className */ + className?: string; + /** Show actions dropdown */ + showActions?: boolean; + /** Disabled state for actions */ + actionsDisabled?: boolean; + /** Whether this is a recommended hook card */ + isRecommendedCard?: boolean; + /** Called when install action is triggered (recommended hooks only) */ + onInstall?: (hookId: string) => void; +} + +// Event type configuration +const eventConfig: Record< + HookEvent, + { variant: 'default' | 'secondary' | 'destructive' | 'success' | 'warning' | 'info'; icon: React.ReactNode } +> = { + SessionStart: { variant: 'success' as const, icon: <Play className="h-3 w-3" /> }, + UserPromptSubmit: { variant: 'info' as const, icon: <Terminal className="h-3 w-3" /> }, + SessionEnd: { variant: 'secondary' as const, icon: <Clock className="h-3 w-3" /> }, +}; + +// Event label keys for i18n +const eventLabelKeys: Record<HookEvent, string> = { + SessionStart: 'hooks.events.sessionStart', + UserPromptSubmit: 'hooks.events.userPromptSubmit', + SessionEnd: 'hooks.events.sessionEnd', +}; + +// Scope label keys for i18n +const scopeLabelKeys: Record<HookScope, string> = { + global: 'hooks.scope.global', + project: 'hooks.scope.project', +}; + +/** + * HookCard component for displaying hook information + */ +export function HookCard({ + hook, + onEdit, + onUninstall, + onToggle, + className, + showActions = true, + actionsDisabled = false, + isRecommendedCard = false, + onInstall, +}: HookCardProps) { + const { formatMessage } = useIntl(); + + const { variant: eventVariant, icon: eventIcon } = eventConfig[hook.event] || { + variant: 'default' as const, + icon: <Zap className="h-3 w-3" />, + }; + const eventLabel = formatMessage({ id: eventLabelKeys[hook.event] || 'hooks.events.unknown' }); + + const scopeIcon = hook.scope === 'global' ? <Globe className="h-3 w-3" /> : <Folder className="h-3 w-3" />; + const scopeLabel = formatMessage({ id: scopeLabelKeys[hook.scope] }); + + const handleToggle = (enabled: boolean) => { + onToggle?.(hook.id, enabled); + }; + + const handleAction = (e: React.MouseEvent, action: 'edit' | 'uninstall' | 'install') => { + e.stopPropagation(); + switch (action) { + case 'edit': + onEdit?.(hook); + break; + case 'uninstall': + onUninstall?.(hook.id); + break; + case 'install': + onInstall?.(hook.id); + break; + } + }; + + // For recommended hooks that are not installed + if (isRecommendedCard && !hook.installed) { + return ( + <Card + className={cn( + 'group transition-all duration-200 hover:shadow-md hover:border-primary/30 hover-glow', + className + )} + > + <CardContent className="p-4"> + <div className="flex items-center justify-between"> + <div className="flex-1 min-w-0"> + <div className="flex items-center gap-2"> + <h3 className="font-medium text-card-foreground truncate"> + {hook.name} + </h3> + <Badge variant="outline" className="gap-1"> + {scopeIcon} + {scopeLabel} + </Badge> + </div> + {hook.description && ( + <p className="text-sm text-muted-foreground mt-1 line-clamp-1"> + {hook.description} + </p> + )} + </div> + <Button + variant="outline" + size="sm" + onClick={(e) => handleAction(e, 'install')} + disabled={actionsDisabled} + className="ml-4" + > + {formatMessage({ id: 'hooks.actions.install' })} + </Button> + </div> + </CardContent> + </Card> + ); + } + + return ( + <Card + className={cn( + 'group transition-all duration-200 hover:shadow-md hover:border-primary/30 hover-glow', + !hook.enabled && 'opacity-60', + className + )} + > + <CardContent className="p-4"> + {/* Header */} + <div className="flex items-start justify-between gap-2"> + <div className="flex-1 min-w-0"> + <div className="flex items-center gap-2"> + <h3 className="font-medium text-card-foreground truncate"> + {hook.name} + </h3> + <Badge variant="outline" className="gap-1" title={scopeLabel}> + {scopeIcon} + </Badge> + </div> + {hook.description && ( + <p className="text-sm text-muted-foreground mt-0.5 line-clamp-1"> + {hook.description} + </p> + )} + </div> + <div className="flex items-center gap-2 flex-shrink-0"> + <Badge variant={eventVariant} className="gap-1"> + {eventIcon} + {eventLabel} + </Badge> + <Switch + checked={hook.enabled} + onCheckedChange={handleToggle} + disabled={actionsDisabled} + className="data-[state=checked]:bg-primary" + /> + {showActions && ( + <DropdownMenu> + <DropdownMenuTrigger asChild> + <Button + variant="ghost" + size="icon" + className="h-8 w-8 opacity-0 group-hover:opacity-100 transition-opacity" + onClick={(e) => e.stopPropagation()} + disabled={actionsDisabled} + > + <MoreVertical className="h-4 w-4" /> + <span className="sr-only">{formatMessage({ id: 'common.aria.actions' })}</span> + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent align="end"> + <DropdownMenuItem onClick={(e) => handleAction(e, 'edit')}> + <Edit className="mr-2 h-4 w-4" /> + {formatMessage({ id: 'hooks.actions.edit' })} + </DropdownMenuItem> + <DropdownMenuSeparator /> + <DropdownMenuItem + onClick={(e) => handleAction(e, 'uninstall')} + className="text-destructive focus:text-destructive" + > + <Trash2 className="mr-2 h-4 w-4" /> + {formatMessage({ id: 'hooks.actions.uninstall' })} + </DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> + )} + </div> + </div> + + {/* Command info */} + <div className="mt-3 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground"> + <span className="flex items-center gap-1 font-mono"> + <Terminal className="h-3.5 w-3.5" /> + {hook.command} + </span> + {hook.timeout && ( + <span className="flex items-center gap-1"> + <Clock className="h-3.5 w-3.5" /> + {hook.timeout}ms + </span> + )} + </div> + </CardContent> + </Card> + ); +} + +/** + * Skeleton loader for HookCard + */ +export function HookCardSkeleton({ className }: { className?: string }) { + return ( + <Card className={cn('animate-pulse', className)}> + <CardContent className="p-4"> + <div className="flex items-start justify-between"> + <div className="flex-1"> + <div className="h-5 w-32 rounded bg-muted" /> + <div className="mt-1 h-3 w-48 rounded bg-muted" /> + </div> + <div className="flex items-center gap-2"> + <div className="h-5 w-20 rounded bg-muted" /> + <div className="h-5 w-8 rounded-full bg-muted" /> + <div className="h-8 w-8 rounded bg-muted" /> + </div> + </div> + <div className="mt-3 flex gap-4"> + <div className="h-3 w-32 rounded bg-muted" /> + <div className="h-3 w-16 rounded bg-muted" /> + </div> + </CardContent> + </Card> + ); +} diff --git a/ccw/frontend/src/components/specs/HookDialog.tsx b/ccw/frontend/src/components/specs/HookDialog.tsx new file mode 100644 index 00000000..03ed5e2f --- /dev/null +++ b/ccw/frontend/src/components/specs/HookDialog.tsx @@ -0,0 +1,354 @@ +// ======================================== +// HookDialog Component +// ======================================== +// Dialog for editing hook configuration + +import * as React from 'react'; +import { useIntl } from 'react-intl'; +import { cn } from '@/lib/utils'; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription, + DialogFooter, +} from '@/components/ui/Dialog'; +import { Button } from '@/components/ui/Button'; +import { Input } from '@/components/ui/Input'; +import { Label } from '@/components/ui/Label'; +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from '@/components/ui/Select'; +import { RadioGroup, RadioGroupItem } from '@/components/ui/RadioGroup'; +import { Textarea } from '@/components/ui/Textarea'; +import { Globe, Folder, HelpCircle } from 'lucide-react'; +import { + HookConfig, + HookEvent, + HookScope, + HookFailMode, +} from './HookCard'; + +export interface HookDialogProps { + /** Whether dialog is open */ + open: boolean; + /** Called when dialog open state changes */ + onOpenChange: (open: boolean) => void; + /** Hook data to edit (undefined for new hook) */ + hook?: HookConfig; + /** Called when save is triggered */ + onSave: (hook: Omit<HookConfig, 'id'> & { id?: string }) => void; + /** Optional className */ + className?: string; + /** Loading state */ + isLoading?: boolean; +} + +/** + * Default hook configuration + */ +const defaultHookConfig: Omit<HookConfig, 'id'> = { + name: '', + event: 'SessionStart', + command: '', + description: '', + scope: 'global', + enabled: true, + installed: true, + timeout: 30000, + failMode: 'continue', +}; + +/** + * HookDialog component for editing hook configuration + */ +export function HookDialog({ + open, + onOpenChange, + hook, + onSave, + className, + isLoading = false, +}: HookDialogProps) { + const { formatMessage } = useIntl(); + const isEditing = !!hook; + + // Form state + const [formData, setFormData] = React.useState<Omit<HookConfig, 'id'>>(defaultHookConfig); + const [errors, setErrors] = React.useState<Record<string, string>>({}); + + // Reset form when hook changes or dialog opens + React.useEffect(() => { + if (open) { + setFormData(hook ? { ...hook } : defaultHookConfig); + setErrors({}); + } + }, [open, hook]); + + // Update form field + const updateField = <K extends keyof typeof formData>( + field: K, + value: (typeof formData)[K] + ) => { + setFormData((prev) => ({ ...prev, [field]: value })); + // Clear error when field is updated + if (errors[field]) { + setErrors((prev) => { + const next = { ...prev }; + delete next[field]; + return next; + }); + } + }; + + // Validate form + const validateForm = (): boolean => { + const newErrors: Record<string, string> = {}; + + if (!formData.name.trim()) { + newErrors.name = formatMessage({ id: 'hooks.validation.nameRequired' }); + } + + if (!formData.command.trim()) { + newErrors.command = formatMessage({ id: 'hooks.validation.commandRequired' }); + } + + if (formData.timeout && formData.timeout < 1000) { + newErrors.timeout = formatMessage({ id: 'hooks.validation.timeoutMin' }); + } + + if (formData.timeout && formData.timeout > 300000) { + newErrors.timeout = formatMessage({ id: 'hooks.validation.timeoutMax' }); + } + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + // Handle save + const handleSave = () => { + if (!validateForm()) { + return; + } + + onSave({ + ...(hook ? { id: hook.id } : {}), + ...formData, + }); + }; + + // Handle cancel + const handleCancel = () => { + onOpenChange(false); + }; + + return ( + <Dialog open={open} onOpenChange={onOpenChange}> + <DialogContent className={cn('sm:max-w-[500px]', className)}> + <DialogHeader> + <DialogTitle> + {isEditing + ? formatMessage({ id: 'hooks.dialog.editTitle' }) + : formatMessage({ id: 'hooks.dialog.createTitle' })} + </DialogTitle> + <DialogDescription> + {formatMessage({ id: 'hooks.dialog.description' })} + </DialogDescription> + </DialogHeader> + + <div className="space-y-4 py-4"> + {/* Name field */} + <div className="space-y-2"> + <Label htmlFor="name" className="required"> + {formatMessage({ id: 'hooks.fields.name' })} + </Label> + <Input + id="name" + value={formData.name} + onChange={(e) => updateField('name', e.target.value)} + placeholder={formatMessage({ id: 'hooks.placeholders.name' })} + className={errors.name ? 'border-destructive' : ''} + disabled={isLoading} + /> + {errors.name && ( + <p className="text-xs text-destructive">{errors.name}</p> + )} + </div> + + {/* Event type field */} + <div className="space-y-2"> + <Label htmlFor="event" className="required"> + {formatMessage({ id: 'hooks.fields.event' })} + </Label> + <Select + value={formData.event} + onValueChange={(value) => updateField('event', value as HookEvent)} + disabled={isLoading} + > + <SelectTrigger id="event"> + <SelectValue placeholder={formatMessage({ id: 'hooks.placeholders.event' })} /> + </SelectTrigger> + <SelectContent> + <SelectItem value="SessionStart"> + {formatMessage({ id: 'hooks.events.sessionStart' })} + </SelectItem> + <SelectItem value="UserPromptSubmit"> + {formatMessage({ id: 'hooks.events.userPromptSubmit' })} + </SelectItem> + <SelectItem value="SessionEnd"> + {formatMessage({ id: 'hooks.events.sessionEnd' })} + </SelectItem> + </SelectContent> + </Select> + <p className="text-xs text-muted-foreground"> + {formatMessage({ id: 'hints.hookEvents' })} + </p> + </div> + + {/* Scope field */} + <div className="space-y-2"> + <Label className="required"> + {formatMessage({ id: 'hooks.fields.scope' })} + </Label> + <RadioGroup + value={formData.scope} + onValueChange={(value) => updateField('scope', value as HookScope)} + className="flex gap-4" + disabled={isLoading} + > + <div className="flex items-center space-x-2"> + <RadioGroupItem value="global" id="scope-global" /> + <Label htmlFor="scope-global" className="flex items-center gap-1.5 cursor-pointer"> + <Globe className="h-4 w-4" /> + {formatMessage({ id: 'hooks.scope.global' })} + </Label> + </div> + <div className="flex items-center space-x-2"> + <RadioGroupItem value="project" id="scope-project" /> + <Label htmlFor="scope-project" className="flex items-center gap-1.5 cursor-pointer"> + <Folder className="h-4 w-4" /> + {formatMessage({ id: 'hooks.scope.project' })} + </Label> + </div> + </RadioGroup> + <p className="text-xs text-muted-foreground"> + {formatMessage({ id: 'hints.hookScope' })} + </p> + </div> + + {/* Command field */} + <div className="space-y-2"> + <Label htmlFor="command" className="required"> + {formatMessage({ id: 'hooks.fields.command' })} + </Label> + <Input + id="command" + value={formData.command} + onChange={(e) => updateField('command', e.target.value)} + placeholder={formatMessage({ id: 'hooks.placeholders.command' })} + className={cn('font-mono', errors.command ? 'border-destructive' : '')} + disabled={isLoading} + /> + {errors.command && ( + <p className="text-xs text-destructive">{errors.command}</p> + )} + <p className="text-xs text-muted-foreground"> + {formatMessage({ id: 'hints.hookCommand' })} + </p> + </div> + + {/* Description field */} + <div className="space-y-2"> + <Label htmlFor="description"> + {formatMessage({ id: 'hooks.fields.description' })} + </Label> + <Textarea + id="description" + value={formData.description || ''} + onChange={(e) => updateField('description', e.target.value)} + placeholder={formatMessage({ id: 'hooks.placeholders.description' })} + rows={2} + disabled={isLoading} + /> + </div> + + {/* Timeout field */} + <div className="space-y-2"> + <Label htmlFor="timeout" className="flex items-center gap-1"> + {formatMessage({ id: 'hooks.fields.timeout' })} + <span className="text-xs text-muted-foreground"> + ({formatMessage({ id: 'hooks.fields.timeoutUnit' })}) + </span> + </Label> + <Input + id="timeout" + type="number" + value={formData.timeout || ''} + onChange={(e) => updateField('timeout', parseInt(e.target.value, 10) || undefined)} + placeholder="30000" + className={errors.timeout ? 'border-destructive' : ''} + disabled={isLoading} + min={1000} + max={300000} + /> + {errors.timeout && ( + <p className="text-xs text-destructive">{errors.timeout}</p> + )} + <p className="text-xs text-muted-foreground"> + {formatMessage({ id: 'hints.hookTimeout' })} + </p> + </div> + + {/* Fail mode field */} + <div className="space-y-2"> + <Label htmlFor="failMode" className="flex items-center gap-1"> + {formatMessage({ id: 'hooks.fields.failMode' })} + <HelpCircle className="h-3.5 w-3.5 text-muted-foreground" /> + </Label> + <Select + value={formData.failMode || 'continue'} + onValueChange={(value) => updateField('failMode', value as HookFailMode)} + disabled={isLoading} + > + <SelectTrigger id="failMode"> + <SelectValue /> + </SelectTrigger> + <SelectContent> + <SelectItem value="continue"> + {formatMessage({ id: 'hooks.failModes.continue' })} + </SelectItem> + <SelectItem value="warn"> + {formatMessage({ id: 'hooks.failModes.warn' })} + </SelectItem> + <SelectItem value="block"> + {formatMessage({ id: 'hooks.failModes.block' })} + </SelectItem> + </SelectContent> + </Select> + <p className="text-xs text-muted-foreground"> + {formatMessage({ id: 'hints.hookFailMode' })} + </p> + </div> + </div> + + <DialogFooter> + <Button variant="outline" onClick={handleCancel} disabled={isLoading}> + {formatMessage({ id: 'common.cancel' })} + </Button> + <Button onClick={handleSave} disabled={isLoading}> + {isLoading + ? formatMessage({ id: 'common.saving' }) + : formatMessage({ id: 'common.save' })} + </Button> + </DialogFooter> + </DialogContent> + </Dialog> + ); +} + +export { type HookConfig, type HookEvent, type HookScope, type HookFailMode } from './HookCard'; diff --git a/ccw/frontend/src/components/specs/InjectionControlTab.tsx b/ccw/frontend/src/components/specs/InjectionControlTab.tsx new file mode 100644 index 00000000..94e9b60c --- /dev/null +++ b/ccw/frontend/src/components/specs/InjectionControlTab.tsx @@ -0,0 +1,474 @@ +// ======================================== +// InjectionControlTab Component +// ======================================== +// Tab for managing spec injection control settings + +import { useState, useEffect, useCallback } from 'react'; +import { useIntl } from 'react-intl'; +import { toast } from 'sonner'; +import { cn } from '@/lib/utils'; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@/components/ui/Card'; +import { Input } from '@/components/ui/Input'; +import { Label } from '@/components/ui/Label'; +import { Button } from '@/components/ui/Button'; +import { Switch } from '@/components/ui/Switch'; +import { Progress } from '@/components/ui/Progress'; +import { + AlertCircle, + Info, + Loader2, + RefreshCw, + AlertTriangle, +} from 'lucide-react'; + +// ========== Types ========== + +export interface InjectionStats { + requiredOnly: number; + withKeywords: number; + maxLength: number; + percentage: number; +} + +export interface SpecStatsResponse { + dimensions: { + specs: { count: number; requiredCount: number }; + roadmap: { count: number; requiredCount: number }; + changelog: { count: number; requiredCount: number }; + personal: { count: number; requiredCount: number }; + }; + injectionLength: InjectionStats; +} + +export interface InjectionSettings { + maxLength: number; + warnThreshold: number; + truncateOnExceed: boolean; +} + +export interface SystemSettingsResponse { + injectionControl: InjectionSettings; + personalSpecDefaults: { + defaultReadMode: 'required' | 'optional'; + autoEnable: boolean; + }; +} + +export interface InjectionControlTabProps { + className?: string; +} + +// ========== API Functions ========== + +async function fetchSpecStats(): Promise<SpecStatsResponse> { + const response = await fetch('/api/specs/stats'); + if (!response.ok) { + throw new Error('Failed to fetch spec stats'); + } + return response.json(); +} + +async function fetchSystemSettings(): Promise<SystemSettingsResponse> { + const response = await fetch('/api/system/settings'); + if (!response.ok) { + throw new Error('Failed to fetch system settings'); + } + return response.json(); +} + +async function updateInjectionSettings( + settings: Partial<InjectionSettings> +): Promise<SystemSettingsResponse> { + const currentSettings = await fetchSystemSettings(); + const response = await fetch('/api/system/settings', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + injectionControl: { + ...currentSettings.injectionControl, + ...settings, + }, + }), + }); + if (!response.ok) { + throw new Error('Failed to update settings'); + } + return response.json(); +} + +// ========== Helper Functions ========== + +function formatNumber(num: number): string { + return num.toLocaleString(); +} + +function calculatePercentage(current: number, max: number): number { + if (max <= 0) return 0; + return Math.min(100, (current / max) * 100); +} + +// ========== Component ========== + +export function InjectionControlTab({ className }: InjectionControlTabProps) { + const { formatMessage } = useIntl(); + + // State for stats + const [stats, setStats] = useState<SpecStatsResponse | null>(null); + const [statsLoading, setStatsLoading] = useState(true); + const [statsError, setStatsError] = useState<Error | null>(null); + + // State for settings + const [settings, setSettings] = useState<InjectionSettings>({ + maxLength: 8000, + warnThreshold: 6000, + truncateOnExceed: true, + }); + const [settingsLoading, setSettingsLoading] = useState(true); + + // Form state (for local editing before save) + const [formData, setFormData] = useState<InjectionSettings>(settings); + const [hasChanges, setHasChanges] = useState(false); + const [isSaving, setIsSaving] = useState(false); + + // Fetch stats + const loadStats = useCallback(async () => { + setStatsLoading(true); + setStatsError(null); + try { + const data = await fetchSpecStats(); + setStats(data); + } catch (err) { + setStatsError(err instanceof Error ? err : new Error('Unknown error')); + } finally { + setStatsLoading(false); + } + }, []); + + // Fetch settings + const loadSettings = useCallback(async () => { + setSettingsLoading(true); + try { + const data = await fetchSystemSettings(); + setSettings(data.injectionControl); + setFormData(data.injectionControl); + } catch (err) { + console.error('Failed to load settings:', err); + } finally { + setSettingsLoading(false); + } + }, []); + + // Initial load + useEffect(() => { + loadStats(); + loadSettings(); + }, [loadStats, loadSettings]); + + // Check for changes + useEffect(() => { + const changed = + formData.maxLength !== settings.maxLength || + formData.warnThreshold !== settings.warnThreshold || + formData.truncateOnExceed !== settings.truncateOnExceed; + setHasChanges(changed); + }, [formData, settings]); + + // Handle form field changes + const handleFieldChange = <K extends keyof InjectionSettings>( + field: K, + value: InjectionSettings[K] + ) => { + setFormData((prev) => ({ ...prev, [field]: value })); + }; + + // Save settings + const handleSave = async () => { + setIsSaving(true); + try { + const result = await updateInjectionSettings(formData); + setSettings(result.injectionControl); + setFormData(result.injectionControl); + setHasChanges(false); + toast.success( + formatMessage({ id: 'specs.injection.saveSuccess' }, { default: 'Settings saved successfully' }) + ); + } catch (err) { + toast.error( + formatMessage({ id: 'specs.injection.saveError' }, { default: 'Failed to save settings' }) + ); + console.error('Failed to save settings:', err); + } finally { + setIsSaving(false); + } + }; + + // Reset form + const handleReset = () => { + setFormData(settings); + setHasChanges(false); + }; + + // Calculate progress and status + const currentLength = stats?.injectionLength?.withKeywords || 0; + const maxLength = settings.maxLength; + const warnThreshold = settings.warnThreshold; + const percentage = calculatePercentage(currentLength, maxLength); + const isOverLimit = currentLength > maxLength; + const isOverWarning = currentLength > warnThreshold; + const remainingSpace = Math.max(0, maxLength - currentLength); + + return ( + <div className={cn('space-y-6', className)}> + {/* Current Injection Status Card */} + <Card> + <CardHeader> + <CardTitle className="flex items-center gap-2"> + {formatMessage( + { id: 'specs.injection.statusTitle', defaultMessage: 'Current Injection Status' } + )} + <Button + variant="ghost" + size="icon" + className="h-6 w-6" + onClick={loadStats} + disabled={statsLoading} + > + <RefreshCw className={cn('h-4 w-4', statsLoading && 'animate-spin')} /> + </Button> + </CardTitle> + </CardHeader> + <CardContent className="space-y-4"> + {statsLoading ? ( + <div className="flex items-center justify-center py-8"> + <Loader2 className="h-6 w-6 animate-spin text-muted-foreground" /> + </div> + ) : statsError ? ( + <div className="text-sm text-destructive"> + {formatMessage( + { id: 'specs.injection.loadError', defaultMessage: 'Failed to load stats' } + )} + </div> + ) : ( + <> + {/* Current Length Display */} + <div className="flex justify-between text-sm"> + <span className="text-muted-foreground"> + {formatMessage({ id: 'specs.injection.currentLength', defaultMessage: 'Current Length' })} + </span> + <span + className={cn( + 'font-medium', + isOverLimit && 'text-destructive', + !isOverLimit && isOverWarning && 'text-yellow-600 dark:text-yellow-400' + )} + > + {formatNumber(currentLength)} / {formatNumber(maxLength)}{' '} + {formatMessage({ id: 'specs.injection.characters', defaultMessage: 'characters' })} + </span> + </div> + + {/* Progress Bar */} + <div className="space-y-2"> + <Progress + value={percentage} + className={cn( + 'h-3', + isOverLimit && 'bg-destructive/20', + !isOverLimit && isOverWarning && 'bg-yellow-100 dark:bg-yellow-900/30' + )} + indicatorClassName={cn( + isOverLimit && 'bg-destructive', + !isOverLimit && isOverWarning && 'bg-yellow-500' + )} + /> + + {/* Warning threshold marker */} + <div + className="relative h-0" + style={{ + left: `${Math.min(100, (warnThreshold / maxLength) * 100)}%`, + }} + > + <div className="absolute -top-5 transform -translate-x-1/2 flex flex-col items-center"> + <AlertTriangle className="h-3 w-3 text-yellow-500" /> + <div className="text-[10px] text-muted-foreground whitespace-nowrap"> + {formatMessage({ id: 'specs.injection.warnThreshold', defaultMessage: 'Warn' })} + </div> + </div> + </div> + </div> + + {/* Warning Alert when over limit */} + {isOverLimit && ( + <div className="flex items-start gap-3 p-4 rounded-lg bg-destructive/10 border border-destructive/20"> + <AlertCircle className="h-5 w-5 text-destructive flex-shrink-0 mt-0.5" /> + <div> + <div className="font-medium text-destructive"> + {formatMessage({ id: 'specs.injection.overLimit', defaultMessage: 'Over Limit' })} + </div> + <div className="text-sm text-muted-foreground mt-1"> + {formatMessage( + { + id: 'specs.injection.overLimitDescription', + defaultMessage: 'Current injection content exceeds maximum length of {max} characters. Excess content will be truncated.', + }, + { max: formatNumber(maxLength) } + )} + </div> + </div> + </div> + )} + + {/* Statistics Info */} + <div className="p-4 rounded-lg bg-muted/50 space-y-2"> + <div className="flex items-center gap-2 text-sm font-medium"> + <Info className="h-4 w-4 text-muted-foreground" /> + {formatMessage({ id: 'specs.injection.statsInfo', defaultMessage: 'Statistics' })} + </div> + <div className="grid grid-cols-2 gap-2 text-sm"> + <div className="text-muted-foreground"> + {formatMessage({ id: 'specs.injection.requiredLength', defaultMessage: 'Required specs length:' })} + </div> + <div className="text-right"> + {formatNumber(stats?.injectionLength?.requiredOnly || 0)} {formatMessage({ id: 'specs.injection.characters', defaultMessage: 'characters' })} + </div> + <div className="text-muted-foreground"> + {formatMessage({ id: 'specs.injection.matchedLength', defaultMessage: 'Keyword-matched length:' })} + </div> + <div className="text-right"> + {formatNumber(stats?.injectionLength?.withKeywords || 0)} {formatMessage({ id: 'specs.injection.characters', defaultMessage: 'characters' })} + </div> + <div className="text-muted-foreground"> + {formatMessage({ id: 'specs.injection.remaining', defaultMessage: 'Remaining space:' })} + </div> + <div className={cn('text-right', remainingSpace === 0 && 'text-destructive')}> + {formatNumber(remainingSpace)} ({Math.round(100 - percentage)}%) + </div> + </div> + </div> + </> + )} + </CardContent> + </Card> + + {/* Settings Card */} + <Card> + <CardHeader> + <CardTitle> + {formatMessage({ id: 'specs.injection.settingsTitle', defaultMessage: 'Injection Control Settings' })} + </CardTitle> + <CardDescription> + {formatMessage({ + id: 'specs.injection.settingsDescription', + defaultMessage: 'Configure how spec content is injected into AI context.', + })} + </CardDescription> + </CardHeader> + <CardContent className="space-y-6"> + {settingsLoading ? ( + <div className="flex items-center justify-center py-4"> + <Loader2 className="h-5 w-5 animate-spin text-muted-foreground" /> + </div> + ) : ( + <> + {/* Max Injection Length */} + <div className="space-y-2"> + <Label htmlFor="maxLength"> + {formatMessage({ id: 'specs.injection.maxLength', defaultMessage: 'Max Injection Length (characters)' })} + </Label> + <Input + id="maxLength" + type="number" + min={1000} + max={50000} + step={500} + value={formData.maxLength} + onChange={(e) => handleFieldChange('maxLength', Number(e.target.value))} + /> + <p className="text-sm text-muted-foreground"> + {formatMessage({ + id: 'specs.injection.maxLengthHelp', + defaultMessage: 'Recommended: 4000-10000. Too large may consume too much context; too small may truncate important specs.', + })} + </p> + </div> + + {/* Warning Threshold */} + <div className="space-y-2"> + <Label htmlFor="warnThreshold"> + {formatMessage({ id: 'specs.injection.warnThresholdLabel', defaultMessage: 'Warning Threshold (characters)' })} + </Label> + <Input + id="warnThreshold" + type="number" + min={500} + max={formData.maxLength - 1} + step={500} + value={formData.warnThreshold} + onChange={(e) => handleFieldChange('warnThreshold', Number(e.target.value))} + /> + <p className="text-sm text-muted-foreground"> + {formatMessage({ + id: 'specs.injection.warnThresholdHelp', + defaultMessage: 'A warning will be displayed when injection length exceeds this value.', + })} + </p> + </div> + + {/* Truncate on Exceed */} + <div className="flex items-center justify-between"> + <div className="space-y-0.5"> + <Label htmlFor="truncate"> + {formatMessage({ id: 'specs.injection.truncateOnExceed', defaultMessage: 'Truncate on Exceed' })} + </Label> + <p className="text-sm text-muted-foreground"> + {formatMessage({ + id: 'specs.injection.truncateHelp', + defaultMessage: 'Automatically truncate content when it exceeds the maximum length.', + })} + </p> + </div> + <Switch + id="truncate" + checked={formData.truncateOnExceed} + onCheckedChange={(checked) => handleFieldChange('truncateOnExceed', checked)} + /> + </div> + + {/* Action Buttons */} + <div className="flex items-center justify-end gap-3 pt-4 border-t"> + <Button + variant="outline" + onClick={handleReset} + disabled={!hasChanges || isSaving} + > + {formatMessage({ id: 'common.actions.reset', defaultMessage: 'Reset' })} + </Button> + <Button onClick={handleSave} disabled={!hasChanges || isSaving}> + {isSaving ? ( + <> + <Loader2 className="h-4 w-4 mr-2 animate-spin" /> + {formatMessage({ id: 'common.actions.saving', defaultMessage: 'Saving...' })} + </> + ) : ( + formatMessage({ id: 'common.actions.save', defaultMessage: 'Save' }) + )} + </Button> + </div> + </> + )} + </CardContent> + </Card> + </div> + ); +} + +export default InjectionControlTab; diff --git a/ccw/frontend/src/components/specs/SpecCard.tsx b/ccw/frontend/src/components/specs/SpecCard.tsx new file mode 100644 index 00000000..5c2efcea --- /dev/null +++ b/ccw/frontend/src/components/specs/SpecCard.tsx @@ -0,0 +1,289 @@ +// ======================================== +// SpecCard Component +// ======================================== +// Spec card with readMode badge, keywords, priority indicator and action menu + +import * as React from 'react'; +import { useIntl } from 'react-intl'; +import { cn } from '@/lib/utils'; +import { Card, CardContent } from '@/components/ui/Card'; +import { Badge } from '@/components/ui/Badge'; +import { Button } from '@/components/ui/Button'; +import { Switch } from '@/components/ui/Switch'; +import { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, +} from '@/components/ui/DropdownMenu'; +import { + MoreVertical, + Edit, + Trash2, + FileText, + Tag, +} from 'lucide-react'; + +// ========== Types ========== + +/** + * Spec dimension type + */ +export type SpecDimension = 'specs' | 'roadmap' | 'changelog' | 'personal'; + +/** + * Spec read mode type + */ +export type SpecReadMode = 'required' | 'optional'; + +/** + * Spec priority type + */ +export type SpecPriority = 'critical' | 'high' | 'medium' | 'low'; + +/** + * Spec data structure + */ +export interface Spec { + /** Unique spec identifier */ + id: string; + /** Spec title (display name) */ + title: string; + /** Spec file path */ + file: string; + /** Spec dimension/category */ + dimension: SpecDimension; + /** Read mode: required (always inject) or optional (keyword match) */ + readMode: SpecReadMode; + /** Priority level */ + priority: SpecPriority; + /** Keywords for matching (optional specs) */ + keywords: string[]; + /** Whether spec is enabled */ + enabled: boolean; + /** Optional description */ + description?: string; +} + +/** + * SpecCard component props + */ +export interface SpecCardProps { + /** Spec data */ + spec: Spec; + /** Called when edit action is triggered */ + onEdit?: (spec: Spec) => void; + /** Called when delete action is triggered */ + onDelete?: (specId: string) => void; + /** Called when toggle enabled is triggered */ + onToggle?: (specId: string, enabled: boolean) => void; + /** Optional className */ + className?: string; + /** Show actions dropdown */ + showActions?: boolean; + /** Disabled state for actions */ + actionsDisabled?: boolean; +} + +// ========== Configuration ========== + +// Read mode badge configuration +const readModeConfig: Record< + SpecReadMode, + { variant: 'default' | 'secondary'; labelKey: string } +> = { + required: { variant: 'default', labelKey: 'specs.readMode.required' }, + optional: { variant: 'secondary', labelKey: 'specs.readMode.optional' }, +}; + +// Priority badge configuration +const priorityConfig: Record< + SpecPriority, + { variant: 'destructive' | 'warning' | 'info' | 'secondary'; labelKey: string } +> = { + critical: { variant: 'destructive', labelKey: 'specs.priority.critical' }, + high: { variant: 'warning', labelKey: 'specs.priority.high' }, + medium: { variant: 'info', labelKey: 'specs.priority.medium' }, + low: { variant: 'secondary', labelKey: 'specs.priority.low' }, +}; + +// ========== Component ========== + +/** + * SpecCard component for displaying spec information + */ +export function SpecCard({ + spec, + onEdit, + onDelete, + onToggle, + className, + showActions = true, + actionsDisabled = false, +}: SpecCardProps) { + const { formatMessage } = useIntl(); + + const readMode = readModeConfig[spec.readMode]; + const priority = priorityConfig[spec.priority]; + + const handleToggle = (enabled: boolean) => { + onToggle?.(spec.id, enabled); + }; + + const handleAction = (e: React.MouseEvent, action: 'edit' | 'delete') => { + e.stopPropagation(); + switch (action) { + case 'edit': + onEdit?.(spec); + break; + case 'delete': + onDelete?.(spec.id); + break; + } + }; + + return ( + <Card + className={cn( + 'group transition-all duration-200 hover:shadow-md hover:border-primary/30 hover-glow', + !spec.enabled && 'opacity-60', + className + )} + > + <CardContent className="p-4"> + {/* Header */} + <div className="flex items-start justify-between gap-2"> + <div className="flex-1 min-w-0"> + <div className="flex items-center gap-2"> + <FileText className="h-4 w-4 text-muted-foreground shrink-0" /> + <h3 className="font-medium text-card-foreground truncate"> + {spec.title} + </h3> + </div> + <p className="text-xs text-muted-foreground mt-0.5 truncate"> + {spec.file} + </p> + </div> + <div className="flex items-center gap-2 flex-shrink-0"> + {showActions && ( + <DropdownMenu> + <DropdownMenuTrigger asChild> + <Button + variant="ghost" + size="icon" + className="h-8 w-8 opacity-0 group-hover:opacity-100 transition-opacity" + onClick={(e) => e.stopPropagation()} + disabled={actionsDisabled} + > + <MoreVertical className="h-4 w-4" /> + <span className="sr-only">{formatMessage({ id: 'common.aria.actions' })}</span> + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent align="end"> + <DropdownMenuItem onClick={(e) => handleAction(e, 'edit')}> + <Edit className="mr-2 h-4 w-4" /> + {formatMessage({ id: 'specs.actions.edit' })} + </DropdownMenuItem> + <DropdownMenuSeparator /> + <DropdownMenuItem + onClick={(e) => handleAction(e, 'delete')} + className="text-destructive focus:text-destructive" + > + <Trash2 className="mr-2 h-4 w-4" /> + {formatMessage({ id: 'specs.actions.delete' })} + </DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> + )} + </div> + </div> + + {/* Badges */} + <div className="mt-3 flex flex-wrap items-center gap-2"> + <Badge variant={readMode.variant} className="text-xs"> + {formatMessage({ id: readMode.labelKey })} + </Badge> + <Badge variant={priority.variant} className="text-xs"> + {formatMessage({ id: priority.labelKey })} + </Badge> + </div> + + {/* Description */} + {spec.description && ( + <p className="mt-3 text-sm text-muted-foreground line-clamp-2"> + {spec.description} + </p> + )} + + {/* Keywords */} + {spec.keywords.length > 0 && ( + <div className="mt-3 flex flex-wrap items-center gap-1.5"> + <Tag className="h-3.5 w-3.5 text-muted-foreground" /> + {spec.keywords.slice(0, 4).map((keyword) => ( + <Badge key={keyword} variant="outline" className="text-xs px-1.5 py-0"> + {keyword} + </Badge> + ))} + {spec.keywords.length > 4 && ( + <span className="text-xs text-muted-foreground"> + +{spec.keywords.length - 4} + </span> + )} + </div> + )} + + {/* Footer with toggle */} + <div className="mt-3 pt-3 border-t border-border flex items-center justify-between"> + <span className="text-xs text-muted-foreground"> + {formatMessage({ id: spec.enabled ? 'specs.status.enabled' : 'specs.status.disabled' })} + </span> + <Switch + checked={spec.enabled} + onCheckedChange={handleToggle} + disabled={actionsDisabled} + className="data-[state=checked]:bg-primary" + /> + </div> + </CardContent> + </Card> + ); +} + +/** + * Skeleton loader for SpecCard + */ +export function SpecCardSkeleton({ className }: { className?: string }) { + return ( + <Card className={cn('animate-pulse', className)}> + <CardContent className="p-4"> + <div className="flex items-start justify-between"> + <div className="flex-1"> + <div className="flex items-center gap-2"> + <div className="h-4 w-4 rounded bg-muted" /> + <div className="h-5 w-32 rounded bg-muted" /> + </div> + <div className="mt-1 h-3 w-24 rounded bg-muted" /> + </div> + <div className="h-8 w-8 rounded bg-muted" /> + </div> + <div className="mt-3 flex gap-2"> + <div className="h-5 w-14 rounded-full bg-muted" /> + <div className="h-5 w-12 rounded-full bg-muted" /> + </div> + <div className="mt-3 h-4 w-full rounded bg-muted" /> + <div className="mt-2 flex gap-1.5"> + <div className="h-5 w-16 rounded bg-muted" /> + <div className="h-5 w-14 rounded bg-muted" /> + <div className="h-5 w-12 rounded bg-muted" /> + </div> + <div className="mt-3 pt-3 border-t border-border flex items-center justify-between"> + <div className="h-3 w-16 rounded bg-muted" /> + <div className="h-5 w-9 rounded-full bg-muted" /> + </div> + </CardContent> + </Card> + ); +} + +export default SpecCard; diff --git a/ccw/frontend/src/components/specs/SpecDialog.tsx b/ccw/frontend/src/components/specs/SpecDialog.tsx new file mode 100644 index 00000000..51fa0ef9 --- /dev/null +++ b/ccw/frontend/src/components/specs/SpecDialog.tsx @@ -0,0 +1,319 @@ +// ======================================== +// SpecDialog Component +// ======================================== +// Dialog for editing spec frontmatter (title, readMode, priority, keywords) + +import * as React from 'react'; +import { useIntl } from 'react-intl'; +import { cn } from '@/lib/utils'; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription, + DialogFooter, +} from '@/components/ui/Dialog'; +import { Button } from '@/components/ui/Button'; +import { Input } from '@/components/ui/Input'; +import { Label } from '@/components/ui/Label'; +import { Badge } from '@/components/ui/Badge'; +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from '@/components/ui/Select'; +import { Tag, X } from 'lucide-react'; +import type { Spec, SpecReadMode, SpecPriority } from './SpecCard'; + +// ========== Types ========== + +/** + * Spec form data for editing + */ +export interface SpecFormData { + title: string; + readMode: SpecReadMode; + priority: SpecPriority; + keywords: string[]; +} + +/** + * SpecDialog component props + */ +export interface SpecDialogProps { + /** Whether dialog is open */ + open: boolean; + /** Called when dialog open state changes */ + onOpenChange: (open: boolean) => void; + /** Spec being edited */ + spec: Spec | null; + /** Called when save is clicked */ + onSave: (specId: string, data: SpecFormData) => Promise<void> | void; + /** Optional loading state */ + isLoading?: boolean; +} + +// ========== Constants ========== + +const READ_MODE_OPTIONS: { value: SpecReadMode; labelKey: string }[] = [ + { value: 'required', labelKey: 'specs.readMode.required' }, + { value: 'optional', labelKey: 'specs.readMode.optional' }, +]; + +const PRIORITY_OPTIONS: { value: SpecPriority; labelKey: string }[] = [ + { value: 'critical', labelKey: 'specs.priority.critical' }, + { value: 'high', labelKey: 'specs.priority.high' }, + { value: 'medium', labelKey: 'specs.priority.medium' }, + { value: 'low', labelKey: 'specs.priority.low' }, +]; + +// ========== Component ========== + +/** + * SpecDialog component for editing spec frontmatter + */ +export function SpecDialog({ + open, + onOpenChange, + spec, + onSave, + isLoading = false, +}: SpecDialogProps) { + const { formatMessage } = useIntl(); + const [formData, setFormData] = React.useState<SpecFormData>({ + title: '', + readMode: 'optional', + priority: 'medium', + keywords: [], + }); + const [keywordInput, setKeywordInput] = React.useState(''); + const [errors, setErrors] = React.useState<Partial<Record<keyof SpecFormData, string>>>({}); + + // Reset form when spec changes + React.useEffect(() => { + if (spec) { + setFormData({ + title: spec.title, + readMode: spec.readMode, + priority: spec.priority, + keywords: [...spec.keywords], + }); + setErrors({}); + setKeywordInput(''); + } + }, [spec]); + + // Validate form + const validateForm = (): boolean => { + const newErrors: Partial<Record<keyof SpecFormData, string>> = {}; + + if (!formData.title.trim()) { + newErrors.title = formatMessage({ id: 'specs.validation.titleRequired' }); + } + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + // Handle save + const handleSave = async () => { + if (!spec || !validateForm()) return; + + await onSave(spec.id, formData); + }; + + // Handle keyword input + const handleKeywordKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => { + if (e.key === 'Enter' || e.key === ',') { + e.preventDefault(); + addKeyword(); + } + }; + + // Add keyword + const addKeyword = () => { + const keyword = keywordInput.trim().toLowerCase(); + if (keyword && !formData.keywords.includes(keyword)) { + setFormData((prev) => ({ + ...prev, + keywords: [...prev.keywords, keyword], + })); + } + setKeywordInput(''); + }; + + // Remove keyword + const removeKeyword = (keyword: string) => { + setFormData((prev) => ({ + ...prev, + keywords: prev.keywords.filter((k) => k !== keyword), + })); + }; + + if (!spec) return null; + + return ( + <Dialog open={open} onOpenChange={onOpenChange}> + <DialogContent className="sm:max-w-[500px]"> + <DialogHeader> + <DialogTitle> + {formatMessage({ id: 'specs.dialog.editTitle' }, { title: spec.title })} + </DialogTitle> + <DialogDescription> + {formatMessage({ id: 'specs.dialog.editDescription' })} + </DialogDescription> + </DialogHeader> + + <div className="space-y-4 py-4"> + {/* Title field */} + <div className="space-y-2"> + <Label htmlFor="title"> + {formatMessage({ id: 'specs.form.title' })} + </Label> + <Input + id="title" + value={formData.title} + onChange={(e) => setFormData((prev) => ({ ...prev, title: e.target.value }))} + placeholder={formatMessage({ id: 'specs.form.titlePlaceholder' })} + error={!!errors.title} + disabled={isLoading} + /> + {errors.title && ( + <p className="text-sm text-destructive">{errors.title}</p> + )} + </div> + + {/* Read mode and Priority */} + <div className="grid grid-cols-2 gap-4"> + <div className="space-y-2"> + <Label>{formatMessage({ id: 'specs.form.readMode' })}</Label> + <Select + value={formData.readMode} + onValueChange={(value: SpecReadMode) => + setFormData((prev) => ({ ...prev, readMode: value })) + } + disabled={isLoading} + > + <SelectTrigger> + <SelectValue /> + </SelectTrigger> + <SelectContent> + {READ_MODE_OPTIONS.map((option) => ( + <SelectItem key={option.value} value={option.value}> + {formatMessage({ id: option.labelKey })} + </SelectItem> + ))} + </SelectContent> + </Select> + </div> + + <div className="space-y-2"> + <Label>{formatMessage({ id: 'specs.form.priority' })}</Label> + <Select + value={formData.priority} + onValueChange={(value: SpecPriority) => + setFormData((prev) => ({ ...prev, priority: value })) + } + disabled={isLoading} + > + <SelectTrigger> + <SelectValue /> + </SelectTrigger> + <SelectContent> + {PRIORITY_OPTIONS.map((option) => ( + <SelectItem key={option.value} value={option.value}> + {formatMessage({ id: option.labelKey })} + </SelectItem> + ))} + </SelectContent> + </Select> + </div> + </div> + + {/* Keywords */} + <div className="space-y-2"> + <Label htmlFor="keywords"> + {formatMessage({ id: 'specs.form.keywords' })} + </Label> + <div className="flex items-center gap-2"> + <div className="relative flex-1"> + <Input + id="keywords" + value={keywordInput} + onChange={(e) => setKeywordInput(e.target.value)} + onKeyDown={handleKeywordKeyDown} + onBlur={addKeyword} + placeholder={formatMessage({ id: 'specs.form.keywordsPlaceholder' })} + disabled={isLoading} + /> + </div> + <Button + type="button" + variant="outline" + size="sm" + onClick={addKeyword} + disabled={isLoading || !keywordInput.trim()} + > + {formatMessage({ id: 'specs.form.addKeyword' })} + </Button> + </div> + <p className="text-xs text-muted-foreground"> + {formatMessage({ id: 'specs.form.keywordsHint' })} + </p> + + {/* Keywords display */} + {formData.keywords.length > 0 && ( + <div className="flex flex-wrap gap-1.5 mt-2"> + <Tag className="h-3.5 w-3.5 text-muted-foreground mt-0.5" /> + {formData.keywords.map((keyword) => ( + <Badge + key={keyword} + variant="secondary" + className="text-xs pl-2 pr-1 gap-1" + > + {keyword} + <button + type="button" + onClick={() => removeKeyword(keyword)} + className="ml-0.5 hover:text-destructive transition-colors" + disabled={isLoading} + > + <X className="h-3 w-3" /> + </button> + </Badge> + ))} + </div> + )} + </div> + + {/* File info */} + <div className="pt-2 border-t border-border"> + <p className="text-xs text-muted-foreground"> + {formatMessage({ id: 'specs.form.fileInfo' }, { file: spec.file })} + </p> + </div> + </div> + + <DialogFooter> + <Button + variant="outline" + onClick={() => onOpenChange(false)} + disabled={isLoading} + > + {formatMessage({ id: 'common.cancel' })} + </Button> + <Button onClick={handleSave} disabled={isLoading}> + {isLoading + ? formatMessage({ id: 'specs.form.saving' }) + : formatMessage({ id: 'common.save' })} + </Button> + </DialogFooter> + </DialogContent> + </Dialog> + ); +} + +export default SpecDialog; diff --git a/ccw/frontend/src/components/specs/index.ts b/ccw/frontend/src/components/specs/index.ts new file mode 100644 index 00000000..093d6260 --- /dev/null +++ b/ccw/frontend/src/components/specs/index.ts @@ -0,0 +1,62 @@ +// ======================================== +// Specs Components Index +// ======================================== +// Export all specs-related components + +export { + SpecCard, + SpecCardSkeleton, +} from './SpecCard'; + +export type { + Spec, + SpecDimension, + SpecReadMode, + SpecPriority, + SpecCardProps, +} from './SpecCard'; + +export { + SpecDialog, +} from './SpecDialog'; + +export type { + SpecFormData, + SpecDialogProps, +} from './SpecDialog'; + +export { + HookCard, +} from './HookCard'; + +export type { + HookConfig, + HookEvent, + HookScope, + HookFailMode, + HookCardProps, +} from './HookCard'; + +export { + HookDialog, +} from './HookDialog'; + +export type { + HookDialogProps, +} from './HookDialog'; + +export { + InjectionControlTab, +} from './InjectionControlTab'; + +export type { + InjectionStats, + InjectionSettings, + SpecStatsResponse, + SystemSettingsResponse, + InjectionControlTabProps, +} from './InjectionControlTab'; + +export { + GlobalSettingsTab, +} from './GlobalSettingsTab'; diff --git a/ccw/frontend/src/hooks/useIssues.ts b/ccw/frontend/src/hooks/useIssues.ts index a243d78c..624075f7 100644 --- a/ccw/frontend/src/hooks/useIssues.ts +++ b/ccw/frontend/src/hooks/useIssues.ts @@ -139,11 +139,14 @@ export function useIssues(options: UseIssuesOptions = {}): UseIssuesReturn { // Group by status const issuesByStatus: Record<Issue['status'], Issue[]> = { - open: [], - in_progress: [], - resolved: [], - closed: [], + registered: [], + planning: [], + planned: [], + queued: [], + executing: [], completed: [], + failed: [], + paused: [], }; for (const issue of allIssues) { @@ -184,7 +187,7 @@ export function useIssues(options: UseIssuesOptions = {}): UseIssuesReturn { allIssues, issuesByStatus, issuesByPriority, - openCount: issuesByStatus.open.length + issuesByStatus.in_progress.length, + openCount: issuesByStatus.registered.length + issuesByStatus.planning.length + issuesByStatus.planned.length, criticalCount: issuesByPriority.critical.length, isLoading: issuesQuery.isLoading, isFetching: issuesQuery.isFetching || historyQuery.isFetching, diff --git a/ccw/frontend/src/hooks/useSystemSettings.ts b/ccw/frontend/src/hooks/useSystemSettings.ts index ca82d3b1..38cbd8ed 100644 --- a/ccw/frontend/src/hooks/useSystemSettings.ts +++ b/ccw/frontend/src/hooks/useSystemSettings.ts @@ -326,3 +326,140 @@ export function useImportSettings() { error: mutation.error, }; } + +// ======================================== +// Specs Settings Hooks +// ======================================== + +import { + getSystemSettings, + updateSystemSettings, + installRecommendedHooks, + getSpecStats, + type SystemSettings, + type UpdateSystemSettingsInput, + type InstallRecommendedHooksResponse, + type SpecStats, +} from '../lib/api'; + +// Query keys for specs settings +export const specsSettingsKeys = { + all: ['specsSettings'] as const, + systemSettings: () => [...specsSettingsKeys.all, 'systemSettings'] as const, + specStats: (projectPath?: string) => [...specsSettingsKeys.all, 'specStats', projectPath] as const, +}; + +// ======================================== +// System Settings Query Hook +// ======================================== + +export interface UseSystemSettingsReturn { + data: SystemSettings | undefined; + isLoading: boolean; + error: Error | null; + refetch: () => void; +} + +/** + * Hook to fetch system settings (injection control, personal spec defaults, recommended hooks) + */ +export function useSystemSettings(): UseSystemSettingsReturn { + const query = useQuery({ + queryKey: specsSettingsKeys.systemSettings(), + queryFn: getSystemSettings, + staleTime: STALE_TIME, + retry: 1, + }); + + return { + data: query.data, + isLoading: query.isLoading, + error: query.error, + refetch: () => { query.refetch(); }, + }; +} + +// ======================================== +// Update System Settings Mutation Hook +// ======================================== + +export function useUpdateSystemSettings() { + const queryClient = useQueryClient(); + + const mutation = useMutation({ + mutationFn: (data: UpdateSystemSettingsInput) => updateSystemSettings(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: specsSettingsKeys.systemSettings() }); + }, + }); + + return { + updateSettings: mutation.mutateAsync, + isPending: mutation.isPending, + error: mutation.error, + }; +} + +// ======================================== +// Install Recommended Hooks Mutation Hook +// ======================================== + +export function useInstallRecommendedHooks() { + const queryClient = useQueryClient(); + + const mutation = useMutation({ + mutationFn: ({ hookIds, scope }: { hookIds: string[]; scope?: 'global' | 'project' }) => + installRecommendedHooks(hookIds, scope), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: specsSettingsKeys.systemSettings() }); + }, + }); + + return { + installHooks: (hookIds: string[], scope?: 'global' | 'project') => + mutation.mutateAsync({ hookIds, scope }), + isPending: mutation.isPending, + error: mutation.error, + data: mutation.data, + }; +} + +// ======================================== +// Spec Stats Query Hook +// ======================================== + +export interface UseSpecStatsOptions { + projectPath?: string; + enabled?: boolean; + staleTime?: number; +} + +export interface UseSpecStatsReturn { + data: SpecStats | undefined; + isLoading: boolean; + error: Error | null; + refetch: () => void; +} + +/** + * Hook to fetch spec statistics (dimensions count, injection length info) + * @param options - Options including projectPath for workspace isolation + */ +export function useSpecStats(options: UseSpecStatsOptions = {}): UseSpecStatsReturn { + const { projectPath, enabled = true, staleTime = STALE_TIME } = options; + + const query = useQuery({ + queryKey: specsSettingsKeys.specStats(projectPath), + queryFn: () => getSpecStats(projectPath), + staleTime, + enabled, + retry: 1, + }); + + return { + data: query.data, + isLoading: query.isLoading, + error: query.error, + refetch: () => { query.refetch(); }, + }; +} diff --git a/ccw/frontend/src/lib/api.ts b/ccw/frontend/src/lib/api.ts index 5cc84757..11ca8722 100644 --- a/ccw/frontend/src/lib/api.ts +++ b/ccw/frontend/src/lib/api.ts @@ -728,13 +728,26 @@ export interface Issue { id: string; title: string; context?: string; - status: 'open' | 'in_progress' | 'resolved' | 'closed' | 'completed'; + status: 'registered' | 'planning' | 'planned' | 'queued' | 'executing' | 'completed' | 'failed' | 'paused'; priority: 'low' | 'medium' | 'high' | 'critical'; createdAt: string; updatedAt?: string; + plannedAt?: string; + queuedAt?: string; + completedAt?: string; solutions?: IssueSolution[]; labels?: string[]; assignee?: string; + tags?: string[]; + source?: 'github' | 'text' | 'discovery'; + sourceUrl?: string; + boundSolutionId?: string | null; + feedback?: Array<{ + type: 'failure' | 'clarification' | 'rejection'; + stage: string; + content: string; + createdAt: string; + }>; attachments?: Attachment[]; } @@ -7133,6 +7146,121 @@ export async function triggerReindex( ); } +// ========== System Settings API ========== + +/** + * System settings response from /api/system/settings + */ +export interface SystemSettings { + injectionControl: { + maxLength: number; + warnThreshold: number; + truncateOnExceed: boolean; + }; + personalSpecDefaults: { + defaultReadMode: 'required' | 'optional' | 'keywords'; + autoEnable: boolean; + }; + recommendedHooks: Array<{ + id: string; + event: string; + name: string; + command: string; + description: string; + scope: 'global' | 'project'; + autoInstall: boolean; + }>; +} + +/** + * Update system settings request + */ +export interface UpdateSystemSettingsInput { + injectionControl?: Partial<SystemSettings['injectionControl']>; + personalSpecDefaults?: Partial<SystemSettings['personalSpecDefaults']>; +} + +/** + * Install recommended hooks request + */ +export interface InstallRecommendedHooksInput { + hookIds: string[]; + scope?: 'global' | 'project'; +} + +/** + * Installed hook result + */ +export interface InstalledHook { + id: string; + event: string; + status: 'installed' | 'already-exists'; +} + +/** + * Install recommended hooks response + */ +export interface InstallRecommendedHooksResponse { + success: boolean; + installed: InstalledHook[]; +} + +/** + * Fetch system settings (injection control, personal spec defaults, recommended hooks) + */ +export async function getSystemSettings(): Promise<SystemSettings> { + return fetchApi<SystemSettings>('/api/system/settings'); +} + +/** + * Update system settings + */ +export async function updateSystemSettings(data: UpdateSystemSettingsInput): Promise<{ success: boolean; settings?: Record<string, unknown> }> { + return fetchApi<{ success: boolean; settings?: Record<string, unknown> }>('/api/system/settings', { + method: 'POST', + body: JSON.stringify(data), + }); +} + +/** + * Install recommended hooks + */ +export async function installRecommendedHooks( + hookIds: string[], + scope?: 'global' | 'project' +): Promise<InstallRecommendedHooksResponse> { + return fetchApi<InstallRecommendedHooksResponse>('/api/system/hooks/install-recommended', { + method: 'POST', + body: JSON.stringify({ hookIds, scope } as InstallRecommendedHooksInput), + }); +} + +// ========== Spec Stats API ========== + +/** + * Spec stats response from /api/specs/stats + */ +export interface SpecStats { + dimensions: Record<string, { count: number; requiredCount: number }>; + injectionLength: { + requiredOnly: number; + withKeywords: number; + maxLength: number; + percentage: number; + }; +} + +/** + * Fetch spec statistics for a specific workspace + * @param projectPath - Optional project path to filter data by workspace + */ +export async function getSpecStats(projectPath?: string): Promise<SpecStats> { + const url = projectPath + ? `/api/specs/stats?path=${encodeURIComponent(projectPath)}` + : '/api/specs/stats'; + return fetchApi<SpecStats>(url); +} + // ========== Analysis API ========== import type { AnalysisSessionSummary, AnalysisSessionDetail } from '../types/analysis'; diff --git a/ccw/frontend/src/locales/en/navigation.json b/ccw/frontend/src/locales/en/navigation.json index 692e6f92..ea8accad 100644 --- a/ccw/frontend/src/locales/en/navigation.json +++ b/ccw/frontend/src/locales/en/navigation.json @@ -38,7 +38,8 @@ "teams": "Team Execution", "terminalDashboard": "Terminal Dashboard", "skillHub": "Skill Hub", - "analysis": "Analysis Viewer" + "analysis": "Analysis Viewer", + "specs": "Spec Settings" }, "sidebar": { "collapse": "Collapse", diff --git a/ccw/frontend/src/locales/zh/navigation.json b/ccw/frontend/src/locales/zh/navigation.json index 12e63099..e09fb9da 100644 --- a/ccw/frontend/src/locales/zh/navigation.json +++ b/ccw/frontend/src/locales/zh/navigation.json @@ -38,7 +38,8 @@ "teams": "团队执行", "terminalDashboard": "终端仪表板", "skillHub": "技能中心", - "analysis": "分析查看器" + "analysis": "分析查看器", + "specs": "规范设置" }, "sidebar": { "collapse": "收起", diff --git a/ccw/frontend/src/pages/IssueHubPage.tsx b/ccw/frontend/src/pages/IssueHubPage.tsx index c3283eb6..fe1e3e7b 100644 --- a/ccw/frontend/src/pages/IssueHubPage.tsx +++ b/ccw/frontend/src/pages/IssueHubPage.tsx @@ -17,9 +17,8 @@ import { import { IssueHubHeader } from '@/components/issue/hub/IssueHubHeader'; import { IssueHubTabs, type IssueTab } from '@/components/issue/hub/IssueHubTabs'; -const VALID_TABS: IssueTab[] = ['issues', 'board', 'queue', 'discovery']; +const VALID_TABS: IssueTab[] = ['issues', 'queue', 'discovery']; import { IssuesPanel } from '@/components/issue/hub/IssuesPanel'; -import { IssueBoardPanel } from '@/components/issue/hub/IssueBoardPanel'; import { QueuePanel } from '@/components/issue/hub/QueuePanel'; import { DiscoveryPanel } from '@/components/issue/hub/DiscoveryPanel'; // ExecutionPanel hidden - import { ExecutionPanel } from '@/components/issue/hub/ExecutionPanel'; @@ -366,7 +365,6 @@ export function IssueHubPage() { const renderActionButtons = () => { switch (currentTab) { case 'issues': - case 'board': return ( <> <Button variant="outline" onClick={handleIssuesRefresh} disabled={isFetchingIssues}> @@ -437,7 +435,6 @@ export function IssueHubPage() { <IssueHubTabs currentTab={currentTab} onTabChange={setCurrentTab} /> {currentTab === 'issues' && <IssuesPanel onCreateIssue={() => setIsNewIssueOpen(true)} />} - {currentTab === 'board' && <IssueBoardPanel />} {currentTab === 'queue' && <QueuePanel />} {currentTab === 'discovery' && <DiscoveryPanel />} diff --git a/ccw/frontend/src/pages/SpecsSettingsPage.tsx b/ccw/frontend/src/pages/SpecsSettingsPage.tsx new file mode 100644 index 00000000..f1e17958 --- /dev/null +++ b/ccw/frontend/src/pages/SpecsSettingsPage.tsx @@ -0,0 +1,353 @@ +/** + * Specs Settings Page + * + * Main page for managing spec settings, hooks, injection control, and global settings. + * Uses 5 tabs: Project Specs | Personal Specs | Hooks | Injection | Settings + */ +import { useState } from 'react'; +import { useIntl } from 'react-intl'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { ScrollText, User, Plug, Gauge, Settings, RefreshCw, Search } from 'lucide-react'; +import { SpecCard, SpecDialog, type Spec, type SpecFormData } from '@/components/specs'; +import { HookCard, HookDialog, type HookConfig } from '@/components/specs'; +import { InjectionControlTab } from '@/components/specs/InjectionControlTab'; +import { GlobalSettingsTab } from '@/components/specs/GlobalSettingsTab'; +import { useSpecStats } from '@/hooks/useSystemSettings'; + +type SettingsTab = 'project-specs' | 'personal-specs' | 'hooks' | 'injection' | 'settings'; + +export function SpecsSettingsPage() { + const { formatMessage } = useIntl(); + const [activeTab, setActiveTab] = useState<SettingsTab>('project-specs'); + const [searchQuery, setSearchQuery] = useState(''); + const [editDialogOpen, setEditDialogOpen] = useState(false); + const [hookDialogOpen, setHookDialogOpen] = useState(false); + const [editingSpec, setEditingSpec] = useState<Spec | null>(null); + const [editingHook, setEditingHook] = useState<HookConfig | null>(null); + + // Mock data for demonstration - will be replaced with real API calls + const [projectSpecs] = useState<Spec[]>([]); + const [personalSpecs] = useState<Spec[]>([]); + const [hooks] = useState<HookConfig[]>([]); + const [isLoading] = useState(false); + + const { data: statsData, refetch: refetchStats } = useSpecStats(); + + const handleSpecEdit = (spec: Spec) => { + setEditingSpec(spec); + setEditDialogOpen(true); + }; + + const handleSpecSave = async (specId: string, data: SpecFormData) => { + console.log('Saving spec:', specId, data); + // TODO: Implement save logic + setEditDialogOpen(false); + }; + + const handleSpecToggle = async (specId: string, enabled: boolean) => { + console.log('Toggling spec:', specId, enabled); + // TODO: Implement toggle logic + }; + + const handleSpecDelete = async (specId: string) => { + console.log('Deleting spec:', specId); + // TODO: Implement delete logic + }; + + const handleHookEdit = (hook: HookConfig) => { + setEditingHook(hook); + setHookDialogOpen(true); + }; + + const handleHookSave = async (hookId: string | null, data: Partial<HookConfig>) => { + console.log('Saving hook:', hookId, data); + // TODO: Implement save logic + setHookDialogOpen(false); + }; + + const handleHookToggle = async (hookId: string, enabled: boolean) => { + console.log('Toggling hook:', hookId, enabled); + // TODO: Implement toggle logic + }; + + const handleHookDelete = async (hookId: string) => { + console.log('Deleting hook:', hookId); + // TODO: Implement delete logic + }; + + const handleRebuildIndex = async () => { + console.log('Rebuilding index...'); + // TODO: Implement rebuild logic + }; + + const filterSpecs = (specs: Spec[]) => { + if (!searchQuery.trim()) return specs; + const query = searchQuery.toLowerCase(); + return specs.filter(spec => + spec.title.toLowerCase().includes(query) || + spec.keywords.some(k => k.toLowerCase().includes(query)) + ); + }; + + const renderSpecsTab = (dimension: 'project' | 'personal') => { + const specs = dimension === 'project' ? projectSpecs : personalSpecs; + const filteredSpecs = filterSpecs(specs); + + return ( + <div className="space-y-4"> + {/* Search and Actions */} + <div className="flex items-center gap-4"> + <div className="relative flex-1"> + <Search className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" /> + <Input + placeholder={formatMessage({ id: 'specs.searchPlaceholder', defaultMessage: 'Search specs...' })} + value={searchQuery} + onChange={(e) => setSearchQuery(e.target.value)} + className="pl-9" + /> + </div> + <Button variant="outline" onClick={handleRebuildIndex}> + <RefreshCw className="h-4 w-4 mr-2" /> + {formatMessage({ id: 'specs.rebuildIndex', defaultMessage: 'Rebuild Index' })} + </Button> + </div> + + {/* Stats Summary */} + {statsData && ( + <div className="grid grid-cols-4 gap-4"> + {Object.entries(statsData.dimensions).map(([dim, data]) => ( + <Card key={dim}> + <CardContent className="pt-4"> + <div className="text-sm text-muted-foreground capitalize">{dim}</div> + <div className="text-2xl font-bold">{(data as { count: number }).count}</div> + <div className="text-xs text-muted-foreground"> + {(data as { requiredCount: number }).requiredCount} required + </div> + </CardContent> + </Card> + ))} + </div> + )} + + {/* Specs Grid */} + {filteredSpecs.length === 0 ? ( + <Card> + <CardContent className="py-8 text-center text-muted-foreground"> + {isLoading + ? formatMessage({ id: 'specs.loading', defaultMessage: 'Loading specs...' }) + : formatMessage({ id: 'specs.noSpecs', defaultMessage: 'No specs found. Create specs in .workflow/ directory.' }) + } + </CardContent> + </Card> + ) : ( + <div className="grid gap-4"> + {filteredSpecs.map(spec => ( + <SpecCard + key={spec.id} + spec={spec} + onEdit={handleSpecEdit} + onToggle={handleSpecToggle} + onDelete={handleSpecDelete} + /> + ))} + </div> + )} + </div> + ); + }; + + const renderHooksTab = () => { + const filteredHooks = hooks.filter(hook => { + if (!searchQuery.trim()) return true; + const query = searchQuery.toLowerCase(); + return hook.name.toLowerCase().includes(query) || + hook.event.toLowerCase().includes(query); + }); + + // Recommended hooks + const recommendedHooks: HookConfig[] = [ + { + id: 'spec-injection-session', + name: 'Spec Context Injection (Session)', + event: 'SessionStart', + command: 'ccw spec load --stdin', + scope: 'global', + enabled: true, + timeout: 5000, + failMode: 'silent' + }, + { + id: 'spec-injection-prompt', + name: 'Spec Context Injection (Prompt)', + event: 'UserPromptSubmit', + command: 'ccw spec load --stdin', + scope: 'project', + enabled: true, + timeout: 5000, + failMode: 'silent' + } + ]; + + return ( + <div className="space-y-6"> + {/* Recommended Hooks Section */} + <Card> + <CardHeader> + <CardTitle className="flex items-center gap-2"> + <Plug className="h-5 w-5" /> + {formatMessage({ id: 'specs.recommendedHooks', defaultMessage: 'Recommended Hooks' })} + </CardTitle> + <CardDescription> + {formatMessage({ id: 'specs.recommendedHooksDesc', defaultMessage: 'One-click install system-preset spec injection hooks' })} + </CardDescription> + </CardHeader> + <CardContent> + <div className="flex gap-4 mb-4"> + <Button onClick={() => console.log('Install all')}> + {formatMessage({ id: 'specs.installAll', defaultMessage: 'Install All Recommended Hooks' })} + </Button> + <div className="text-sm text-muted-foreground flex items-center"> + {hooks.filter(h => recommendedHooks.some(r => r.command === h.command)).length} / {recommendedHooks.length} installed + </div> + </div> + <div className="grid gap-3"> + {recommendedHooks.map(hook => ( + <HookCard + key={hook.id} + hook={hook} + isRecommended={true} + onInstall={() => console.log('Install:', hook.id)} + onEdit={handleHookEdit} + onToggle={handleHookToggle} + onDelete={handleHookDelete} + /> + ))} + </div> + </CardContent> + </Card> + + {/* Installed Hooks Section */} + <Card> + <CardHeader> + <CardTitle>{formatMessage({ id: 'specs.installedHooks', defaultMessage: 'Installed Hooks' })}</CardTitle> + <CardDescription> + {formatMessage({ id: 'specs.installedHooksDesc', defaultMessage: 'Manage your installed hooks configuration' })} + </CardDescription> + </CardHeader> + <CardContent> + <div className="relative mb-4"> + <Search className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" /> + <Input + placeholder={formatMessage({ id: 'specs.searchHooks', defaultMessage: 'Search hooks...' })} + value={searchQuery} + onChange={(e) => setSearchQuery(e.target.value)} + className="pl-9" + /> + </div> + + {filteredHooks.length === 0 ? ( + <div className="py-8 text-center text-muted-foreground"> + {formatMessage({ id: 'specs.noHooks', defaultMessage: 'No hooks installed. Install recommended hooks above.' })} + </div> + ) : ( + <div className="grid gap-3"> + {filteredHooks.map(hook => ( + <HookCard + key={hook.id} + hook={hook} + onEdit={handleHookEdit} + onToggle={handleHookToggle} + onDelete={handleHookDelete} + /> + ))} + </div> + )} + </CardContent> + </Card> + </div> + ); + }; + + return ( + <div className="container py-6 max-w-6xl"> + {/* Page Header */} + <div className="mb-6"> + <h1 className="text-2xl font-bold flex items-center gap-2"> + <ScrollText className="h-6 w-6" /> + {formatMessage({ id: 'specs.pageTitle', defaultMessage: 'Spec Settings' })} + </h1> + <p className="text-muted-foreground mt-1"> + {formatMessage({ id: 'specs.pageDescription', defaultMessage: 'Manage specification injection, hooks, and system settings' })} + </p> + </div> + + {/* Main Tabs */} + <Tabs value={activeTab} onValueChange={(v) => setActiveTab(v as SettingsTab)}> + <TabsList className="grid grid-cols-5 mb-6"> + <TabsTrigger value="project-specs" className="flex items-center gap-2"> + <ScrollText className="h-4 w-4" /> + <span className="hidden sm:inline">{formatMessage({ id: 'specs.tabProjectSpecs', defaultMessage: 'Project Specs' })}</span> + </TabsTrigger> + <TabsTrigger value="personal-specs" className="flex items-center gap-2"> + <User className="h-4 w-4" /> + <span className="hidden sm:inline">{formatMessage({ id: 'specs.tabPersonalSpecs', defaultMessage: 'Personal' })}</span> + </TabsTrigger> + <TabsTrigger value="hooks" className="flex items-center gap-2"> + <Plug className="h-4 w-4" /> + <span className="hidden sm:inline">{formatMessage({ id: 'specs.tabHooks', defaultMessage: 'Hooks' })}</span> + </TabsTrigger> + <TabsTrigger value="injection" className="flex items-center gap-2"> + <Gauge className="h-4 w-4" /> + <span className="hidden sm:inline">{formatMessage({ id: 'specs.tabInjection', defaultMessage: 'Injection' })}</span> + </TabsTrigger> + <TabsTrigger value="settings" className="flex items-center gap-2"> + <Settings className="h-4 w-4" /> + <span className="hidden sm:inline">{formatMessage({ id: 'specs.tabSettings', defaultMessage: 'Settings' })}</span> + </TabsTrigger> + </TabsList> + + <TabsContent value="project-specs"> + {renderSpecsTab('project')} + </TabsContent> + + <TabsContent value="personal-specs"> + {renderSpecsTab('personal')} + </TabsContent> + + <TabsContent value="hooks"> + {renderHooksTab()} + </TabsContent> + + <TabsContent value="injection"> + <InjectionControlTab /> + </TabsContent> + + <TabsContent value="settings"> + <GlobalSettingsTab /> + </TabsContent> + </Tabs> + + {/* Edit Spec Dialog */} + <SpecDialog + open={editDialogOpen} + onOpenChange={setEditDialogOpen} + spec={editingSpec} + onSave={handleSpecSave} + /> + + {/* Edit Hook Dialog */} + <HookDialog + open={hookDialogOpen} + onOpenChange={setHookDialogOpen} + hook={editingHook} + onSave={handleHookSave} + /> + </div> + ); +} + +export default SpecsSettingsPage; diff --git a/ccw/frontend/src/pages/index.ts b/ccw/frontend/src/pages/index.ts index c7a0b0f6..7d777ece 100644 --- a/ccw/frontend/src/pages/index.ts +++ b/ccw/frontend/src/pages/index.ts @@ -38,3 +38,4 @@ export { TeamPage } from './TeamPage'; export { TerminalDashboardPage } from './TerminalDashboardPage'; export { SkillHubPage } from './SkillHubPage'; export { AnalysisPage } from './AnalysisPage'; +export { SpecsSettingsPage } from './SpecsSettingsPage'; diff --git a/ccw/frontend/src/router.tsx b/ccw/frontend/src/router.tsx index e1f381a7..d79a3830 100644 --- a/ccw/frontend/src/router.tsx +++ b/ccw/frontend/src/router.tsx @@ -37,6 +37,7 @@ import { TeamPage, TerminalDashboardPage, AnalysisPage, + SpecsSettingsPage, } from '@/pages'; /** @@ -146,6 +147,10 @@ const routes: RouteObject[] = [ path: 'settings/rules', element: <RulesManagerPage />, }, + { + path: 'settings/specs', + element: <SpecsSettingsPage />, + }, { path: 'settings/codexlens', element: <CodexLensManagerPage />, diff --git a/ccw/src/commands/hook.ts b/ccw/src/commands/hook.ts index 681a4864..1e55665a 100644 --- a/ccw/src/commands/hook.ts +++ b/ccw/src/commands/hook.ts @@ -716,7 +716,7 @@ async function notifyAction(options: HookOptions): Promise<void> { } /** - * Project state action - reads project-tech.json and project-guidelines.json + * Project state action - reads project-tech.json and specs * and outputs a concise summary for session context injection. * * Used as SessionStart hook: stdout → injected as system message. @@ -767,31 +767,19 @@ async function projectStateAction(options: HookOptions): Promise<void> { } catch { /* ignore parse errors */ } } - // Read project-guidelines.json - const guidelinesPath = join(projectPath, '.workflow', 'project-guidelines.json'); - if (existsSync(guidelinesPath)) { - try { - const gl = JSON.parse(readFileSync(guidelinesPath, 'utf8')); - // constraints is Record<string, array> - flatten all categories - const allConstraints: string[] = []; - if (gl.constraints && typeof gl.constraints === 'object') { - for (const entries of Object.values(gl.constraints)) { - if (Array.isArray(entries)) { - for (const c of entries) { - allConstraints.push(typeof c === 'string' ? c : (c as { rule?: string }).rule || JSON.stringify(c)); - } - } - } + // Read specs from spec system (ccw spec load --dimension specs) + try { + const { getDimensionIndex } = await import('../tools/spec-index-builder.js'); + const specsIndex = await getDimensionIndex(projectPath, 'specs'); + const constraints: string[] = []; + for (const entry of specsIndex.entries) { + if (entry.readMode === 'required') { + constraints.push(entry.title); } - result.guidelines.constraints = allConstraints.slice(0, limit); - - const learnings = Array.isArray(gl.learnings) ? gl.learnings : []; - learnings.sort((a: { date?: string }, b: { date?: string }) => (b.date || '').localeCompare(a.date || '')); - result.guidelines.recent_learnings = learnings.slice(0, limit).map( - (l: { insight?: string; date?: string }) => ({ insight: l.insight || '', date: l.date || '' }) - ); - } catch { /* ignore parse errors */ } - } + } + result.guidelines.constraints = constraints.slice(0, limit); + result.guidelines.recent_learnings = []; + } catch { /* ignore errors */ } if (stdin) { // Format as <project-state> tag for system message injection diff --git a/ccw/src/core/data-aggregator.ts b/ccw/src/core/data-aggregator.ts index 85f98da4..132ff86e 100644 --- a/ccw/src/core/data-aggregator.ts +++ b/ccw/src/core/data-aggregator.ts @@ -205,7 +205,7 @@ export async function aggregateData(sessions: ScanSessionsResult, workflowDir: s join(workflowDir, 'active'), join(workflowDir, 'archives'), join(workflowDir, 'project-tech.json'), - join(workflowDir, 'project-guidelines.json'), + join(workflowDir, 'specs'), ...sessions.active.map(s => s.path), ...sessions.archived.map(s => s.path) ]; @@ -564,14 +564,12 @@ function sortTaskIds(a: string, b: string): number { } /** - * Load project overview from project-tech.json and project-guidelines.json + * Load project overview from project-tech.json * @param workflowDir - Path to .workflow directory * @returns Project overview data or null if not found */ export function loadProjectOverview(workflowDir: string): ProjectOverview | null { const techFile = join(workflowDir, 'project-tech.json'); - const guidelinesFile = join(workflowDir, 'project-guidelines.json'); - if (!existsSync(techFile)) { console.log(`Project file not found at: ${techFile}`); return null; @@ -607,44 +605,9 @@ export function loadProjectOverview(workflowDir: string): ProjectOverview | null }); }; - // Load guidelines from separate file if exists - let guidelines: ProjectGuidelines | null = null; - if (existsSync(guidelinesFile)) { - try { - const guidelinesContent = readFileSync(guidelinesFile, 'utf8'); - const guidelinesData = JSON.parse(guidelinesContent) as Record<string, unknown>; - - const conventions = guidelinesData.conventions as Record<string, string[]> | undefined; - const constraints = guidelinesData.constraints as Record<string, string[]> | undefined; - - guidelines = { - conventions: { - coding_style: conventions?.coding_style || [], - naming_patterns: conventions?.naming_patterns || [], - file_structure: conventions?.file_structure || [], - documentation: conventions?.documentation || [] - }, - constraints: { - architecture: constraints?.architecture || [], - tech_stack: constraints?.tech_stack || [], - performance: constraints?.performance || [], - security: constraints?.security || [] - }, - quality_rules: (guidelinesData.quality_rules as Array<{ rule: string; scope: string; enforced_by?: string }>) || [], - learnings: (guidelinesData.learnings as Array<{ - date: string; - session_id?: string; - insight: string; - context?: string; - category?: string; - }>) || [], - _metadata: guidelinesData._metadata as ProjectGuidelines['_metadata'] | undefined - }; - console.log(`Successfully loaded project guidelines`); - } catch (guidelinesErr) { - console.error(`Failed to parse project-guidelines.json:`, (guidelinesErr as Error).message); - } - } + // Guidelines now managed by spec system (ccw spec load) + // Return null - dashboard doesn't need guidelines data directly + const guidelines: ProjectGuidelines | null = null; return { projectName: (projectData.project_name as string) || 'Unknown', diff --git a/ccw/src/core/routes/ccw-routes.ts b/ccw/src/core/routes/ccw-routes.ts index 14bc7532..5980779a 100644 --- a/ccw/src/core/routes/ccw-routes.ts +++ b/ccw/src/core/routes/ccw-routes.ts @@ -7,7 +7,6 @@ import { listTools } from '../../tools/index.js'; import { loadProjectOverview } from '../data-aggregator.js'; import { resolvePath } from '../../utils/path-resolver.js'; import { join } from 'path'; -import { readFileSync, writeFileSync, existsSync } from 'fs'; import type { RouteContext } from './types.js'; /** @@ -46,74 +45,23 @@ export async function handleCcwRoutes(ctx: RouteContext): Promise<boolean> { return true; } - // API: Get Project Guidelines + // API: Get Project Guidelines (DEPRECATED - use spec system) if (pathname === '/api/ccw/guidelines' && req.method === 'GET') { - const projectPath = url.searchParams.get('path') || initialPath; - const resolvedPath = resolvePath(projectPath); - const guidelinesFile = join(resolvedPath, '.workflow', 'project-guidelines.json'); - - if (!existsSync(guidelinesFile)) { - res.writeHead(200, { 'Content-Type': 'application/json' }); - res.end(JSON.stringify({ guidelines: null })); - return true; - } - - try { - const content = readFileSync(guidelinesFile, 'utf-8'); - const guidelines = JSON.parse(content); - res.writeHead(200, { 'Content-Type': 'application/json' }); - res.end(JSON.stringify({ guidelines })); - } catch (err) { - res.writeHead(500, { 'Content-Type': 'application/json' }); - res.end(JSON.stringify({ error: 'Failed to read guidelines file' })); - } + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ + deprecated: true, + message: 'Use /api/specs/list instead. Guidelines are now managed by the spec system (ccw spec).' + })); return true; } - // API: Update Project Guidelines + // API: Update Project Guidelines (DEPRECATED - use spec system) if (pathname === '/api/ccw/guidelines' && req.method === 'PUT') { - handlePostRequest(req, res, async (body) => { - const projectPath = url.searchParams.get('path') || initialPath; - const resolvedPath = resolvePath(projectPath); - const guidelinesFile = join(resolvedPath, '.workflow', 'project-guidelines.json'); - - try { - const data = body as Record<string, unknown>; - - // Read existing file to preserve _metadata.created_at - let existingMetadata: Record<string, unknown> = {}; - if (existsSync(guidelinesFile)) { - try { - const existing = JSON.parse(readFileSync(guidelinesFile, 'utf-8')); - existingMetadata = existing._metadata || {}; - } catch { /* ignore parse errors */ } - } - - // Build the guidelines object - const guidelines = { - conventions: data.conventions || { coding_style: [], naming_patterns: [], file_structure: [], documentation: [] }, - constraints: data.constraints || { architecture: [], tech_stack: [], performance: [], security: [] }, - quality_rules: data.quality_rules || [], - learnings: data.learnings || [], - _metadata: { - created_at: (existingMetadata.created_at as string) || new Date().toISOString(), - updated_at: new Date().toISOString(), - version: (existingMetadata.version as string) || '1.0.0', - }, - }; - - writeFileSync(guidelinesFile, JSON.stringify(guidelines, null, 2), 'utf-8'); - - broadcastToClients({ - type: 'PROJECT_GUIDELINES_UPDATED', - payload: { timestamp: new Date().toISOString() }, - }); - - return { success: true, guidelines }; - } catch (err) { - return { error: (err as Error).message, status: 500 }; - } - }); + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ + deprecated: true, + message: 'Use /api/specs/update-frontmatter instead. Guidelines are now managed by the spec system (ccw spec).' + })); return true; } diff --git a/ccw/src/core/routes/hooks-routes.ts b/ccw/src/core/routes/hooks-routes.ts index d3397844..5708e21f 100644 --- a/ccw/src/core/routes/hooks-routes.ts +++ b/ccw/src/core/routes/hooks-routes.ts @@ -548,29 +548,20 @@ export async function handleHooksRoutes(ctx: HooksRouteContext): Promise<boolean } catch { /* ignore parse errors */ } } - // Read project-guidelines.json - const guidelinesPath = join(projectPath, '.workflow', 'project-guidelines.json'); - if (existsSync(guidelinesPath)) { - try { - const gl = JSON.parse(readFileSync(guidelinesPath, 'utf8')); - const g = result.guidelines as Record<string, unknown>; - // constraints is Record<string, array> - flatten all categories - const allConstraints: string[] = []; - if (gl.constraints && typeof gl.constraints === 'object') { - for (const entries of Object.values(gl.constraints)) { - if (Array.isArray(entries)) { - for (const c of entries) { - allConstraints.push(typeof c === 'string' ? c : (c as { rule?: string }).rule || JSON.stringify(c)); - } - } - } + // Read specs from spec system (ccw spec load --dimension specs) + try { + const { getDimensionIndex } = await import('../../tools/spec-index-builder.js'); + const specsIndex = await getDimensionIndex(projectPath, 'specs'); + const g = result.guidelines as Record<string, unknown>; + const constraints: string[] = []; + for (const entry of specsIndex.entries) { + if (entry.readMode === 'required') { + constraints.push(entry.title); } - g.constraints = allConstraints.slice(0, limit); - const learnings = Array.isArray(gl.learnings) ? gl.learnings : []; - learnings.sort((a: { date?: string }, b: { date?: string }) => (b.date || '').localeCompare(a.date || '')); - g.recent_learnings = learnings.slice(0, limit).map((l: { insight?: string; date?: string }) => ({ insight: l.insight || '', date: l.date || '' })); - } catch { /* ignore parse errors */ } - } + } + g.constraints = constraints.slice(0, limit); + g.recent_learnings = []; + } catch { /* ignore errors */ } res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify(result)); diff --git a/ccw/src/core/routes/spec-routes.ts b/ccw/src/core/routes/spec-routes.ts new file mode 100644 index 00000000..c7e8c851 --- /dev/null +++ b/ccw/src/core/routes/spec-routes.ts @@ -0,0 +1,232 @@ +/** + * Spec Routes Module + * Handles all spec management API endpoints + */ +import { readFileSync, writeFileSync, existsSync } from 'fs'; +import { join } from 'path'; +import { homedir } from 'os'; +import { resolvePath } from '../../utils/path-resolver.js'; +import type { RouteContext } from './types.js'; + +/** + * Handle Spec routes + * @returns true if route was handled, false otherwise + */ +export async function handleSpecRoutes(ctx: RouteContext): Promise<boolean> { + const { pathname, url, req, res, initialPath, handlePostRequest } = ctx; + + // API: List all specs from index + if (pathname === '/api/specs/list' && req.method === 'GET') { + const projectPath = url.searchParams.get('path') || initialPath; + const resolvedPath = resolvePath(projectPath); + + try { + const { getDimensionIndex, SPEC_DIMENSIONS } = await import( + '../../tools/spec-index-builder.js' + ); + + const result: Record<string, unknown[]> = {}; + + for (const dim of SPEC_DIMENSIONS) { + const index = await getDimensionIndex(resolvedPath, dim); + result[dim] = index.entries; + } + + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ specs: result })); + } catch (err) { + res.writeHead(500, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: (err as Error).message })); + } + return true; + } + + // API: Get spec detail (MD content) + if (pathname === '/api/specs/detail' && req.method === 'GET') { + const projectPath = url.searchParams.get('path') || initialPath; + const resolvedPath = resolvePath(projectPath); + const file = url.searchParams.get('file'); + + if (!file) { + res.writeHead(400, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: 'Missing file parameter' })); + return true; + } + + const filePath = join(resolvedPath, file); + + if (!existsSync(filePath)) { + res.writeHead(404, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: 'File not found' })); + return true; + } + + try { + const content = readFileSync(filePath, 'utf-8'); + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ content })); + } catch (err) { + res.writeHead(500, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: (err as Error).message })); + } + return true; + } + + // API: Update frontmatter (toggle readMode) + if (pathname === '/api/specs/update-frontmatter' && req.method === 'PUT') { + handlePostRequest(req, res, async (body) => { + const projectPath = url.searchParams.get('path') || initialPath; + const resolvedPath = resolvePath(projectPath); + const data = body as { file: string; readMode: string }; + + if (!data.file || !data.readMode) { + return { error: 'Missing file or readMode', status: 400 }; + } + + const filePath = join(resolvedPath, data.file); + + if (!existsSync(filePath)) { + return { error: 'File not found', status: 404 }; + } + + try { + const matter = (await import('gray-matter')).default; + const raw = readFileSync(filePath, 'utf-8'); + const parsed = matter(raw); + + parsed.data.readMode = data.readMode; + + const updated = matter.stringify(parsed.content, parsed.data); + writeFileSync(filePath, updated, 'utf-8'); + + return { success: true, readMode: data.readMode }; + } catch (err) { + return { error: (err as Error).message, status: 500 }; + } + }); + return true; + } + + // API: Rebuild index + if (pathname === '/api/specs/rebuild' && req.method === 'POST') { + handlePostRequest(req, res, async () => { + const projectPath = url.searchParams.get('path') || initialPath; + const resolvedPath = resolvePath(projectPath); + + try { + const { buildAllIndices, readCachedIndex, SPEC_DIMENSIONS } = await import( + '../../tools/spec-index-builder.js' + ); + + await buildAllIndices(resolvedPath); + + const stats: Record<string, number> = {}; + for (const dim of SPEC_DIMENSIONS) { + const cached = readCachedIndex(resolvedPath, dim); + stats[dim] = cached?.entries.length ?? 0; + } + + return { success: true, stats }; + } catch (err) { + return { error: (err as Error).message, status: 500 }; + } + }); + return true; + } + + // API: Init spec system + if (pathname === '/api/specs/init' && req.method === 'POST') { + handlePostRequest(req, res, async () => { + const projectPath = url.searchParams.get('path') || initialPath; + const resolvedPath = resolvePath(projectPath); + + try { + const { initSpecSystem } = await import('../../tools/spec-init.js'); + const result = initSpecSystem(resolvedPath); + return { success: true, ...result }; + } catch (err) { + return { error: (err as Error).message, status: 500 }; + } + }); + return true; + } + + // API: Get spec stats (dimensions count + injection length info) + if (pathname === '/api/specs/stats' && req.method === 'GET') { + const projectPath = url.searchParams.get('path') || initialPath; + const resolvedPath = resolvePath(projectPath); + + try { + const { getDimensionIndex, SPEC_DIMENSIONS } = await import( + '../../tools/spec-index-builder.js' + ); + + // Get maxLength from system settings + let maxLength = 8000; + const settingsPath = join(homedir(), '.claude', 'settings.json'); + + if (existsSync(settingsPath)) { + try { + const rawSettings = readFileSync(settingsPath, 'utf-8'); + const settings = JSON.parse(rawSettings) as { + system?: { injectionControl?: { maxLength?: number } }; + }; + maxLength = settings?.system?.injectionControl?.maxLength || 8000; + } catch { /* ignore */ } + } + + const dimensions: Record<string, { count: number; requiredCount: number }> = {}; + let totalRequiredLength = 0; + let totalWithKeywords = 0; + + for (const dim of SPEC_DIMENSIONS) { + const index = await getDimensionIndex(resolvedPath, dim); + let count = 0; + let requiredCount = 0; + + for (const entry of index.entries) { + count++; + // Calculate content length by reading the file + const filePath = join(resolvedPath, entry.file); + let contentLength = 0; + try { + if (existsSync(filePath)) { + const rawContent = readFileSync(filePath, 'utf-8'); + // Strip frontmatter to get actual content length + const matter = (await import('gray-matter')).default; + const parsed = matter(rawContent); + contentLength = parsed.content.length; + } + } catch { /* ignore */ } + + if (entry.readMode === 'required') { + requiredCount++; + totalRequiredLength += contentLength; + } + totalWithKeywords += contentLength; + } + + dimensions[dim] = { count, requiredCount }; + } + + const percentage = totalWithKeywords > 0 ? Math.round((totalWithKeywords / maxLength) * 100) : 0; + + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ + dimensions, + injectionLength: { + requiredOnly: totalRequiredLength, + withKeywords: totalWithKeywords, + maxLength, + percentage + } + })); + } catch (err) { + res.writeHead(500, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: (err as Error).message })); + } + return true; + } + + return false; +} diff --git a/ccw/src/core/routes/system-routes.ts b/ccw/src/core/routes/system-routes.ts index db3faea2..1ae8b53e 100644 --- a/ccw/src/core/routes/system-routes.ts +++ b/ccw/src/core/routes/system-routes.ts @@ -3,8 +3,9 @@ * Handles all system-related API endpoints */ import type { Server } from 'http'; -import { readFileSync, existsSync, promises as fsPromises } from 'fs'; -import { join } from 'path'; +import { readFileSync, writeFileSync, existsSync, mkdirSync, promises as fsPromises } from 'fs'; +import { join, dirname } from 'path'; +import { homedir } from 'os'; import { resolvePath, getRecentPaths, trackRecentPath, removeRecentPath, normalizePathForDisplay } from '../../utils/path-resolver.js'; import { validatePath as validateAllowedPath } from '../../utils/path-validator.js'; import { scanSessions } from '../session-scanner.js'; @@ -24,6 +25,196 @@ interface SystemRouteContext extends RouteContext { server: Server; } +// ======================================== +// System Settings Helper Functions +// ======================================== + +const GLOBAL_SETTINGS_PATH = join(homedir(), '.claude', 'settings.json'); + +// Default system settings +const DEFAULT_INJECTION_CONTROL = { + maxLength: 8000, + warnThreshold: 6000, + truncateOnExceed: true +}; + +const DEFAULT_PERSONAL_SPEC_DEFAULTS = { + defaultReadMode: 'optional', + autoEnable: true +}; + +// Recommended hooks for spec injection +const RECOMMENDED_HOOKS = [ + { + id: 'spec-injection-session', + event: 'SessionStart', + name: 'Spec Context Injection (Session)', + command: 'ccw spec load --stdin', + description: 'Session开始时注入规范上下文', + scope: 'global', + autoInstall: true + }, + { + id: 'spec-injection-prompt', + event: 'UserPromptSubmit', + name: 'Spec Context Injection (Prompt)', + command: 'ccw spec load --stdin', + description: '提示词触发时注入规范上下文', + scope: 'project', + autoInstall: true + } +]; + +/** + * Read settings file safely + */ +function readSettingsFile(filePath: string): Record<string, unknown> { + try { + if (!existsSync(filePath)) { + return {}; + } + const content = readFileSync(filePath, 'utf8'); + if (!content.trim()) { + return {}; + } + return JSON.parse(content); + } catch (error: unknown) { + console.error(`Error reading settings file ${filePath}:`, error); + return {}; + } +} + +/** + * Get system settings from global settings file + */ +function getSystemSettings(): { + injectionControl: typeof DEFAULT_INJECTION_CONTROL; + personalSpecDefaults: typeof DEFAULT_PERSONAL_SPEC_DEFAULTS; + recommendedHooks: typeof RECOMMENDED_HOOKS; +} { + const settings = readSettingsFile(GLOBAL_SETTINGS_PATH) as Record<string, unknown>; + const system = (settings.system || {}) as Record<string, unknown>; + const user = (settings.user || {}) as Record<string, unknown>; + + return { + injectionControl: { + ...DEFAULT_INJECTION_CONTROL, + ...((system.injectionControl || {}) as Record<string, unknown>) + } as typeof DEFAULT_INJECTION_CONTROL, + personalSpecDefaults: { + ...DEFAULT_PERSONAL_SPEC_DEFAULTS, + ...((user.personalSpecDefaults || {}) as Record<string, unknown>) + } as typeof DEFAULT_PERSONAL_SPEC_DEFAULTS, + recommendedHooks: RECOMMENDED_HOOKS + }; +} + +/** + * Save system settings to global settings file + */ +function saveSystemSettings(updates: { + injectionControl?: Partial<typeof DEFAULT_INJECTION_CONTROL>; + personalSpecDefaults?: Partial<typeof DEFAULT_PERSONAL_SPEC_DEFAULTS>; +}): { success: boolean; settings?: Record<string, unknown>; error?: string } { + try { + const settings = readSettingsFile(GLOBAL_SETTINGS_PATH) as Record<string, unknown>; + + // Initialize nested objects if needed + if (!settings.system) settings.system = {}; + if (!settings.user) settings.user = {}; + + const system = settings.system as Record<string, unknown>; + const user = settings.user as Record<string, unknown>; + + // Apply updates + if (updates.injectionControl) { + system.injectionControl = { + ...DEFAULT_INJECTION_CONTROL, + ...((system.injectionControl || {}) as Record<string, unknown>), + ...updates.injectionControl + }; + } + + if (updates.personalSpecDefaults) { + user.personalSpecDefaults = { + ...DEFAULT_PERSONAL_SPEC_DEFAULTS, + ...((user.personalSpecDefaults || {}) as Record<string, unknown>), + ...updates.personalSpecDefaults + }; + } + + // Ensure directory exists + const dirPath = dirname(GLOBAL_SETTINGS_PATH); + if (!existsSync(dirPath)) { + mkdirSync(dirPath, { recursive: true }); + } + + writeFileSync(GLOBAL_SETTINGS_PATH, JSON.stringify(settings, null, 2), 'utf8'); + + return { success: true, settings }; + } catch (error: unknown) { + console.error('Error saving system settings:', error); + return { success: false, error: (error as Error).message }; + } +} + +/** + * Install a recommended hook to settings + */ +function installRecommendedHook( + hookId: string, + scope: 'global' | 'project' +): { success: boolean; installed?: Record<string, unknown>; error?: string; status?: string } { + const hook = RECOMMENDED_HOOKS.find(h => h.id === hookId); + if (!hook) { + return { success: false, error: 'Hook not found', status: 'not-found' }; + } + + try { + const filePath = scope === 'global' ? GLOBAL_SETTINGS_PATH : join(process.cwd(), '.claude', 'settings.json'); + const settings = readSettingsFile(filePath) as Record<string, unknown> & { hooks?: Record<string, unknown[]> }; + + // Initialize hooks object if needed + if (!settings.hooks) settings.hooks = {}; + + const event = hook.event; + if (!settings.hooks[event]) { + settings.hooks[event] = []; + } + + // Check if hook already exists (by command) + const existingHooks = (settings.hooks[event] || []) as Array<Record<string, unknown>>; + const existingIndex = existingHooks.findIndex( + (h) => (h as Record<string, unknown>).command === hook.command + ); + + if (existingIndex >= 0) { + return { success: true, installed: { id: hookId, event, status: 'already-exists' } }; + } + + // Add new hook + settings.hooks[event].push({ + name: hook.name, + command: hook.command, + timeout: 5000, + failMode: 'silent' + }); + + // Ensure directory exists + const dirPath = dirname(filePath); + if (!existsSync(dirPath)) { + mkdirSync(dirPath, { recursive: true }); + } + + writeFileSync(filePath, JSON.stringify(settings, null, 2), 'utf8'); + + return { success: true, installed: { id: hookId, event, status: 'installed' } }; + } catch (error: unknown) { + console.error('Error installing hook:', error); + return { success: false, error: (error as Error).message }; + } +} + // ======================================== // Helper Functions // ======================================== @@ -196,6 +387,67 @@ export async function handleSystemRoutes(ctx: SystemRouteContext): Promise<boole return true; } + // ======================================== + // System Settings API Endpoints + // ======================================== + + // API: Get system settings (injection control + personal spec defaults + recommended hooks) + if (pathname === '/api/system/settings' && req.method === 'GET') { + try { + const settings = getSystemSettings(); + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify(settings)); + } catch (err) { + res.writeHead(500, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: (err as Error).message })); + } + return true; + } + + // API: Save system settings + if (pathname === '/api/system/settings' && req.method === 'POST') { + handlePostRequest(req, res, async (body) => { + const updates = body as { + injectionControl?: { maxLength?: number; warnThreshold?: number; truncateOnExceed?: boolean }; + personalSpecDefaults?: { defaultReadMode?: string; autoEnable?: boolean }; + }; + + const result = saveSystemSettings(updates); + if (result.error) { + return { error: result.error, status: 500 }; + } + return { success: true, settings: result.settings }; + }); + return true; + } + + // API: Install recommended hooks + if (pathname === '/api/system/hooks/install-recommended' && req.method === 'POST') { + handlePostRequest(req, res, async (body) => { + const { hookIds, scope } = body as { + hookIds?: string[]; + scope?: 'global' | 'project'; + }; + + if (!hookIds || !Array.isArray(hookIds)) { + return { error: 'hookIds array is required', status: 400 }; + } + + const targetScope = scope || 'global'; + const installed: Array<{ id: string; event: string; status: string }> = []; + + for (const hookId of hookIds) { + const result = installRecommendedHook(hookId, targetScope); + if (result.success && result.installed) { + installed.push(result.installed as { id: string; event: string; status: string }); + } + } + + return { success: true, installed }; + }); + return true; + } + // API: Get recent paths if (pathname === '/api/recent-paths') { const paths = getRecentPaths(); diff --git a/ccw/src/core/server.ts b/ccw/src/core/server.ts index 9ac47574..54caff69 100644 --- a/ccw/src/core/server.ts +++ b/ccw/src/core/server.ts @@ -41,6 +41,7 @@ import { handleConfigRoutes } from './routes/config-routes.js'; import { handleTeamRoutes } from './routes/team-routes.js'; import { handleNotificationRoutes } from './routes/notification-routes.js'; import { handleAnalysisRoutes } from './routes/analysis-routes.js'; +import { handleSpecRoutes } from './routes/spec-routes.js'; // Import WebSocket handling import { handleWebSocketUpgrade, broadcastToClients, extractSessionIdFromPath } from './websocket.js'; @@ -523,6 +524,11 @@ export async function startServer(options: ServerOptions = {}): Promise<http.Ser if (await handleGraphRoutes(routeContext)) return; } + // Spec routes (/api/specs/*) + if (pathname.startsWith('/api/specs/')) { + if (await handleSpecRoutes(routeContext)) return; + } + // CCW routes (/api/ccw and /api/ccw/*) if (pathname.startsWith('/api/ccw')) { if (await handleCcwRoutes(routeContext)) return; diff --git a/ccw/src/tools/spec-init.ts b/ccw/src/tools/spec-init.ts index a899fea2..baa7811f 100644 --- a/ccw/src/tools/spec-init.ts +++ b/ccw/src/tools/spec-init.ts @@ -267,8 +267,8 @@ export function initSpecSystem(projectPath: string): InitResult { } } - // Create index directory - const indexPath = join(workflowDir, INDEX_DIR); + // Create index directory at project root (matches spec-index-builder.ts location) + const indexPath = join(projectPath, INDEX_DIR); if (!existsSync(indexPath)) { mkdirSync(indexPath, { recursive: true }); result.directories.push(indexPath); diff --git a/ccw/src/tools/spec-loader.ts b/ccw/src/tools/spec-loader.ts index 343f61ef..81887438 100644 --- a/ccw/src/tools/spec-loader.ts +++ b/ccw/src/tools/spec-loader.ts @@ -15,6 +15,7 @@ import matter from 'gray-matter'; import { readFileSync, existsSync } from 'fs'; import { join } from 'path'; +import { homedir } from 'os'; import { getDimensionIndex, @@ -49,6 +50,10 @@ export interface SpecLoadOptions { stdinData?: { user_prompt?: string; prompt?: string; [key: string]: unknown }; /** Enable debug logging to stderr */ debug?: boolean; + /** Maximum content length in characters (default: 8000) */ + maxLength?: number; + /** Whether to truncate content if it exceeds maxLength (default: true) */ + truncateOnExceed?: boolean; } /** @@ -63,6 +68,19 @@ export interface SpecLoadResult { matchedSpecs: string[]; /** Total number of spec files loaded */ totalLoaded: number; + /** Content length statistics */ + contentLength: { + /** Original content length before truncation */ + original: number; + /** Final content length (after truncation if applied) */ + final: number; + /** Maximum allowed length */ + maxLength: number; + /** Whether content was truncated */ + truncated: boolean; + /** Percentage of max length used */ + percentage: number; + }; } /** @@ -114,7 +132,8 @@ const SPEC_PRIORITY_WEIGHT: Record<string, number> = { * 3. Filter: all required specs + optional specs with keyword match * 4. Load MD file content (strip frontmatter) * 5. Merge by dimension priority - * 6. Format for CLI (markdown) or Hook (JSON) + * 6. Check length and truncate if needed + * 7. Format for CLI (markdown) or Hook (JSON) * * @param options - Loading configuration * @returns SpecLoadResult with formatted content @@ -122,6 +141,10 @@ const SPEC_PRIORITY_WEIGHT: Record<string, number> = { export async function loadSpecs(options: SpecLoadOptions): Promise<SpecLoadResult> { const { projectPath, outputFormat, debug } = options; + // Get injection control settings + const maxLength = options.maxLength ?? 8000; + const truncateOnExceed = options.truncateOnExceed ?? true; + // Step 1: Resolve keywords const keywords = resolveKeywords(options); @@ -165,16 +188,40 @@ export async function loadSpecs(options: SpecLoadOptions): Promise<SpecLoadResul // Step 5: Merge by dimension priority const mergedContent = mergeByPriority(allLoadedSpecs); - // Step 6: Format output + // Step 6: Check length and truncate if needed + const originalLength = mergedContent.length; + let finalContent = mergedContent; + let truncated = false; + + if (originalLength > maxLength && truncateOnExceed) { + // Truncate content, preserving complete sections where possible + finalContent = truncateContent(mergedContent, maxLength); + truncated = true; + + if (debug) { + debugLog(`Content truncated: ${originalLength} -> ${finalContent.length} (max: ${maxLength})`); + } + } + + // Step 7: Format output const matchedTitles = allLoadedSpecs.map(s => s.title); - const content = formatOutput(mergedContent, matchedTitles, outputFormat); + const content = formatOutput(finalContent, matchedTitles, outputFormat); const format = outputFormat === 'cli' ? 'markdown' : 'json'; + const percentage = Math.round((originalLength / maxLength) * 100); + return { content, format, matchedSpecs: matchedTitles, totalLoaded: allLoadedSpecs.length, + contentLength: { + original: originalLength, + final: finalContent.length, + maxLength, + truncated, + percentage: Math.min(percentage, 100), + }, }; } @@ -376,3 +423,37 @@ function formatOutput( function debugLog(message: string): void { process.stderr.write(`[spec-loader] ${message}\n`); } + +/** + * Truncate content to fit within maxLength while preserving complete sections. + * + * Strategy: Remove sections from the end (lowest priority) until within limit. + * Each section is delimited by '\n\n---\n\n' from mergeByPriority. + * + * @param content - Full merged content + * @param maxLength - Maximum allowed length + * @returns Truncated content string + */ +function truncateContent(content: string, maxLength: number): string { + if (content.length <= maxLength) { + return content; + } + + // Split by section separator + const sections = content.split('\n\n---\n\n'); + + // Remove sections from the end until we're within limit + while (sections.length > 1) { + sections.pop(); + + const newContent = sections.join('\n\n---\n\n'); + if (newContent.length <= maxLength) { + // Add truncation notice + return newContent + '\n\n---\n\n[Content truncated due to length limit]'; + } + } + + // If single section is still too long, hard truncate + const truncated = sections[0]?.substring(0, maxLength - 50) ?? ''; + return truncated + '\n\n[Content truncated due to length limit]'; +} diff --git a/package-lock.json b/package-lock.json index f6107bfd..5281d672 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,7 @@ "hasInstallScript": true, "license": "MIT", "workspaces": [ - "ccw/frontend", - "ccw/docs-site" + "ccw/frontend" ], "dependencies": { "@modelcontextprotocol/sdk": "^1.0.4", @@ -22,6 +21,7 @@ "figlet": "^1.7.0", "glob": "^10.3.0", "gradient-string": "^2.0.2", + "gray-matter": "^4.0.3", "inquirer": "^9.2.0", "jsonwebtoken": "^9.0.3", "node-pty": "^1.1.0-beta21", @@ -55,6 +55,7 @@ "ccw/docs-site": { "name": "ccw-docs", "version": "1.0.0", + "extraneous": true, "dependencies": { "@docusaurus/core": "^3.5.2", "@docusaurus/plugin-client-redirects": "^3.5.2", @@ -152,207 +153,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@algolia/abtesting": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.13.0.tgz", - "integrity": "sha512-Zrqam12iorp3FjiKMXSTpedGYznZ3hTEOAr2oCxI8tbF8bS1kQHClyDYNq/eV0ewMNLyFkgZVWjaS+8spsOYiQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.47.0.tgz", - "integrity": "sha512-aOpsdlgS9xTEvz47+nXmw8m0NtUiQbvGWNuSEb7fA46iPL5FxOmOUZkh8PREBJpZ0/H8fclSc7BMJCVr+Dn72w==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.47.0.tgz", - "integrity": "sha512-EcF4w7IvIk1sowrO7Pdy4Ako7x/S8+nuCgdk6En+u5jsaNQM4rTT09zjBPA+WQphXkA2mLrsMwge96rf6i7Mow==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.47.0.tgz", - "integrity": "sha512-Wzg5Me2FqgRDj0lFuPWFK05UOWccSMsIBL2YqmTmaOzxVlLZ+oUqvKbsUSOE5ud8Fo1JU7JyiLmEXBtgDKzTwg==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.47.0.tgz", - "integrity": "sha512-Ci+cn/FDIsDxSKMRBEiyKrqybblbk8xugo6ujDN1GSTv9RIZxwxqZYuHfdLnLEwLlX7GB8pqVyqrUSlRnR+sJA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.47.0.tgz", - "integrity": "sha512-gsLnHPZmWcX0T3IigkDL2imCNtsQ7dR5xfnwiFsb+uTHCuYQt+IwSNjsd8tok6HLGLzZrliSaXtB5mfGBtYZvQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.47.0.tgz", - "integrity": "sha512-PDOw0s8WSlR2fWFjPQldEpmm/gAoUgLigvC3k/jCSi/DzigdGX6RdC0Gh1RR1P8Cbk5KOWYDuL3TNzdYwkfDyA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.47.0.tgz", - "integrity": "sha512-b5hlU69CuhnS2Rqgsz7uSW0t4VqrLMLTPbUpEl0QVz56rsSwr1Sugyogrjb493sWDA+XU1FU5m9eB8uH7MoI0g==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", - "license": "MIT" - }, - "node_modules/@algolia/ingestion": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.47.0.tgz", - "integrity": "sha512-WvwwXp5+LqIGISK3zHRApLT1xkuEk320/EGeD7uYy+K8WwDd5OjXnhjuXRhYr1685KnkvWkq1rQ/ihCJjOfHpQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/monitoring": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.47.0.tgz", - "integrity": "sha512-j2EUFKAlzM0TE4GRfkDE3IDfkVeJdcbBANWzK16Tb3RHz87WuDfQ9oeEW6XiRE1/bEkq2xf4MvZesvSeQrZRDA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.47.0.tgz", - "integrity": "sha512-+kTSE4aQ1ARj2feXyN+DMq0CIDHJwZw1kpxIunedkmpWUg8k3TzFwWsMCzJVkF2nu1UcFbl7xsIURz3Q3XwOXA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.47.0.tgz", - "integrity": "sha512-Ja+zPoeSA2SDowPwCNRbm5Q2mzDvVV8oqxCQ4m6SNmbKmPlCfe30zPfrt9ho3kBHnsg37pGucwOedRIOIklCHw==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.47.0.tgz", - "integrity": "sha512-N6nOvLbaR4Ge+oVm7T4W/ea1PqcSbsHR4O58FJ31XtZjFPtOyxmnhgCmGCzP9hsJI6+x0yxJjkW5BMK/XI8OvA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.47.0.tgz", - "integrity": "sha512-z1oyLq5/UVkohVXNDEY70mJbT/sv/t6HYtCvCwNrOri6pxBJDomP9R83KOlwcat+xqBQEdJHjbrPh36f1avmZA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -380,19 +180,6 @@ "node": ">=6.0.0" } }, - "node_modules/@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "license": "MIT", - "dependencies": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/@asamuzakjp/css-color": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", @@ -411,6 +198,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -425,6 +213,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -434,6 +223,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -464,6 +254,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -473,6 +264,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz", "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", @@ -485,22 +277,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", @@ -517,6 +298,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -526,109 +308,27 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", - "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.6", @@ -642,6 +342,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -655,78 +356,21 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -736,6 +380,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -745,29 +390,17 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", @@ -781,6 +414,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -792,869 +426,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", - "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", - "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", - "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", - "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", - "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-syntax-jsx": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", @@ -1687,414 +458,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", - "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", - "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", - "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz", - "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.28.6", - "@babel/plugin-syntax-import-attributes": "^7.28.6", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.29.0", - "@babel/plugin-transform-async-to-generator": "^7.28.6", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.6", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-class-static-block": "^7.28.6", - "@babel/plugin-transform-classes": "^7.28.6", - "@babel/plugin-transform-computed-properties": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.28.6", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.6", - "@babel/plugin-transform-exponentiation-operator": "^7.28.6", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.28.6", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.29.0", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", - "@babel/plugin-transform-numeric-separator": "^7.28.6", - "@babel/plugin-transform-object-rest-spread": "^7.28.6", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.28.6", - "@babel/plugin-transform-optional-chaining": "^7.28.6", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.28.6", - "@babel/plugin-transform-private-property-in-object": "^7.28.6", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.29.0", - "@babel/plugin-transform-regexp-modifiers": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.28.6", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.28.6", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.15", - "babel-plugin-polyfill-corejs3": "^0.14.0", - "babel-plugin-polyfill-regenerator": "^0.6.6", - "core-js-compat": "^3.48.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz", - "integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.6", - "core-js-compat": "^3.48.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", - "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.28.0", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", @@ -2104,22 +467,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz", - "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.48.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.28.6", @@ -2134,6 +486,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -2152,6 +505,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -2168,100 +522,11 @@ "dev": true, "license": "MIT" }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", - "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", - "license": "MIT" - }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/cst-dts-gen/node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/gast/node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", - "license": "Apache-2.0" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", - "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, "funding": [ { "type": "github", @@ -2281,6 +546,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, "funding": [ { "type": "github", @@ -2304,6 +570,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, "funding": [ { "type": "github", @@ -2331,6 +598,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, "funding": [ { "type": "github", @@ -2353,2399 +621,20 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/postcss-alpha-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", - "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", - "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-function-display-p3-linear": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", - "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", - "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", - "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", - "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-contrast-color-function": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", - "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", - "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", - "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", - "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", - "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", - "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", - "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-initial": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", - "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", - "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", - "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", - "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overflow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", - "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overscroll-behavior": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", - "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-resize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", - "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", - "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", - "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", - "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", - "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", - "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", - "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-position-area-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", - "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-property-rule-prelude-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", - "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-random-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", - "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", - "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", - "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", - "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", - "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", - "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-system-ui-font-family": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", - "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", - "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", - "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", - "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/utilities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", - "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/core": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.5.3.tgz", - "integrity": "sha512-x/P5+HVzv9ALtbuJIfpkF8Eyc5RE8YCsFcOgLrrtWa9Ui+53ggZA5seIAanCRORbS4+m982lu7rZmebSiuMIcw==", - "license": "MIT", - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@docsearch/css": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.5.3.tgz", - "integrity": "sha512-kUpHaxn0AgI3LQfyzTYkNUuaFY4uEz/Ym9/N/FvyDE+PzSgZsCyDH9jE49B6N6f1eLCm9Yp64J9wENd6vypdxA==", - "license": "MIT" - }, - "node_modules/@docsearch/react": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.5.3.tgz", - "integrity": "sha512-Hm3Lg/FD9HXV57WshhWOHOprbcObF5ptLzcjA5zdgJDzYOMwEN+AvY8heQ5YMTWyC6kW2d+Qk25AVlHnDWMSvA==", - "license": "MIT", - "dependencies": { - "@docsearch/core": "4.5.3", - "@docsearch/css": "4.5.3" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@docusaurus/babel": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", - "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.25.9", - "@babel/preset-env": "^7.25.9", - "@babel/preset-react": "^7.25.9", - "@babel/preset-typescript": "^7.25.9", - "@babel/runtime": "^7.25.9", - "@babel/runtime-corejs3": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "babel-plugin-dynamic-import-node": "^2.3.3", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/bundler": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", - "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.9.2", - "@docusaurus/cssnano-preset": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "babel-loader": "^9.2.1", - "clean-css": "^5.3.3", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.11.0", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "file-loader": "^6.2.0", - "html-minifier-terser": "^7.2.0", - "mini-css-extract-plugin": "^2.9.2", - "null-loader": "^4.0.1", - "postcss": "^8.5.4", - "postcss-loader": "^7.3.4", - "postcss-preset-env": "^10.2.1", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "webpack": "^5.95.0", - "webpackbar": "^6.0.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/faster": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/faster": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", - "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", - "license": "MIT", - "dependencies": { - "@docusaurus/babel": "3.9.2", - "@docusaurus/bundler": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "core-js": "^3.31.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "execa": "5.1.1", - "fs-extra": "^11.1.1", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.6.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "open": "^8.4.0", - "p-map": "^4.0.0", - "prompts": "^2.4.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.6", - "tinypool": "^1.0.2", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "webpack": "^5.95.0", - "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-server": "^5.2.2", - "webpack-merge": "^6.0.1" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@mdx-js/react": "^3.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/core/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/@docusaurus/core/node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/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/@docusaurus/core/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@docusaurus/core/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@docusaurus/core/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/@docusaurus/core/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/@docusaurus/core/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/@docusaurus/core/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/@docusaurus/core/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/@docusaurus/core/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/@docusaurus/core/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/@docusaurus/core/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/@docusaurus/core/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/@docusaurus/core/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/@docusaurus/cssnano-preset": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", - "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", - "license": "MIT", - "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.5.4", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/logger": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", - "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/logger/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/@docusaurus/logger/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/@docusaurus/mdx-loader": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", - "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", - "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.9.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-client-redirects": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.9.2.tgz", - "integrity": "sha512-lUgMArI9vyOYMzLRBUILcg9vcPTCyyI2aiuXq/4npcMVqOr6GfmwtmBYWSbNMlIUM0147smm4WhpXD0KFboffw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", - "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "cheerio": "1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", - "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", - "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", - "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", - "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^2.3.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", - "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", - "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", - "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", - "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-svgr": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", - "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@svgr/core": "8.1.0", - "@svgr/webpack": "^8.1.0", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", - "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/plugin-content-blog": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/plugin-content-pages": "3.9.2", - "@docusaurus/plugin-css-cascade-layers": "3.9.2", - "@docusaurus/plugin-debug": "3.9.2", - "@docusaurus/plugin-google-analytics": "3.9.2", - "@docusaurus/plugin-google-gtag": "3.9.2", - "@docusaurus/plugin-google-tag-manager": "3.9.2", - "@docusaurus/plugin-sitemap": "3.9.2", - "@docusaurus/plugin-svgr": "3.9.2", - "@docusaurus/theme-classic": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-search-algolia": "3.9.2", - "@docusaurus/types": "3.9.2" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", - "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/plugin-content-blog": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/plugin-content-pages": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "infima": "0.2.0-alpha.45", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.5.4", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", - "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", - "license": "MIT", - "dependencies": { - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-mermaid": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.9.2.tgz", - "integrity": "sha512-5vhShRDq/ntLzdInsQkTdoKWSzw8d1jB17sNPYhA/KvYYFXfuVEGHLM6nrf8MFbV8TruAHDG21Fn3W4lO8GaDw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "mermaid": ">=11.6.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@mermaid-js/layout-elk": "^0.1.9", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@mermaid-js/layout-elk": { - "optional": true - } - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", - "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", - "license": "MIT", - "dependencies": { - "@docsearch/react": "^3.9.0 || ^4.1.0", - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "algoliasearch": "^5.37.0", - "algoliasearch-helper": "^3.26.0", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", - "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", - "license": "MIT", - "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/tsconfig": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", - "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", "dev": true, - "license": "MIT" - }, - "node_modules/@docusaurus/types": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", - "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/types/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "engines": { - "node": ">= 6" - } - }, - "node_modules/@docusaurus/types/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", - "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "escape-string-regexp": "^4.0.0", - "execa": "5.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "p-queue": "^6.6.2", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", - "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", - "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils/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/@docusaurus/utils/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/@docusaurus/utils/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/@docusaurus/utils/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/@docusaurus/utils/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/@docusaurus/utils/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/@docusaurus/utils/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/@docusaurus/utils/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": ">=18" } }, "node_modules/@esbuild/aix-ppc64": { @@ -5432,21 +1321,6 @@ "tslib": "2" } }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, "node_modules/@hello-pangea/dnd": { "version": "18.0.1", "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-18.0.1.tgz", @@ -5476,23 +1350,6 @@ "hono": "^4" } }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^1.1.0", - "@iconify/types": "^2.0.0", - "mlly": "^1.8.0" - } - }, "node_modules/@inquirer/external-editor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", @@ -5577,70 +1434,11 @@ "node": ">=8" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/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/@jest/types/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/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -5651,6 +1449,7 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -5661,515 +1460,30 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/buffers": { - "version": "17.65.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.65.0.tgz", - "integrity": "sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-core": { - "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.56.10.tgz", - "integrity": "sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.56.10", - "@jsonjoy.com/fs-node-utils": "4.56.10", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.56.10.tgz", - "integrity": "sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.56.10", - "@jsonjoy.com/fs-node-builtins": "4.56.10", - "@jsonjoy.com/fs-node-utils": "4.56.10", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node": { - "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.56.10.tgz", - "integrity": "sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.56.10", - "@jsonjoy.com/fs-node-builtins": "4.56.10", - "@jsonjoy.com/fs-node-utils": "4.56.10", - "@jsonjoy.com/fs-print": "4.56.10", - "@jsonjoy.com/fs-snapshot": "4.56.10", - "glob-to-regex.js": "^1.0.0", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.56.10.tgz", - "integrity": "sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.56.10.tgz", - "integrity": "sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-fsa": "4.56.10", - "@jsonjoy.com/fs-node-builtins": "4.56.10", - "@jsonjoy.com/fs-node-utils": "4.56.10" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.56.10.tgz", - "integrity": "sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.56.10" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-print": { - "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.56.10.tgz", - "integrity": "sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.56.10", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.56.10.tgz", - "integrity": "sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.56.10", - "@jsonjoy.com/json-pack": "^17.65.0", - "@jsonjoy.com/util": "^17.65.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { - "version": "17.65.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.65.0.tgz", - "integrity": "sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { - "version": "17.65.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.65.0.tgz", - "integrity": "sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { - "version": "17.65.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.65.0.tgz", - "integrity": "sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "17.65.0", - "@jsonjoy.com/buffers": "17.65.0", - "@jsonjoy.com/codegen": "17.65.0", - "@jsonjoy.com/json-pointer": "17.65.0", - "@jsonjoy.com/util": "17.65.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { - "version": "17.65.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.65.0.tgz", - "integrity": "sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/util": "17.65.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { - "version": "17.65.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.65.0.tgz", - "integrity": "sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "17.65.0", - "@jsonjoy.com/codegen": "17.65.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" - }, - "node_modules/@mdx-js/mdx": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", - "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "acorn": "^8.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-scope": "^1.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "recma-build-jsx": "^1.0.0", - "recma-jsx": "^1.0.0", - "recma-stringify": "^1.0.0", - "rehype-recma": "^1.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/react": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", - "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", - "license": "MIT", - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@mermaid-js/parser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", - "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", - "license": "MIT", - "dependencies": { - "langium": "3.3.1" - } - }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.25.1", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.1.tgz", @@ -6209,22 +1523,11 @@ } } }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -6238,6 +1541,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -6247,6 +1551,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -6256,154 +1561,6 @@ "node": ">= 8" } }, - "node_modules/@peculiar/asn1-cms": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", - "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-csr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", - "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-ecc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", - "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pfx": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", - "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", - "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", - "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pfx": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-rsa": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", - "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", - "license": "MIT", - "dependencies": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", - "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", - "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/x509": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-csr": "^2.6.0", - "@peculiar/asn1-ecc": "^2.6.0", - "@peculiar/asn1-pkcs9": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -6430,51 +1587,11 @@ "node": ">=18" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", - "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@polka/url": { "version": "1.0.0-next.29", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, "license": "MIT" }, "node_modules/@radix-ui/number": { @@ -7892,337 +3009,6 @@ "win32" ] }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, "node_modules/@tanstack/query-core": { "version": "5.90.20", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz", @@ -8393,15 +3179,6 @@ "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -8464,140 +3241,18 @@ "@types/node": "*" } }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, "node_modules/@types/d3-array": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", "license": "MIT" }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "license": "MIT" }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", - "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", - "license": "MIT" - }, "node_modules/@types/d3-drag": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", @@ -8607,54 +3262,12 @@ "@types/d3-selection": "*" } }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, "node_modules/@types/d3-ease": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "license": "MIT" }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", @@ -8670,24 +3283,6 @@ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", "license": "MIT" }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "license": "MIT" - }, "node_modules/@types/d3-scale": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", @@ -8697,12 +3292,6 @@ "@types/d3-time": "*" } }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "license": "MIT" - }, "node_modules/@types/d3-selection": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", @@ -8724,12 +3313,6 @@ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", "license": "MIT" }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, "node_modules/@types/d3-timer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", @@ -8764,26 +3347,6 @@ "@types/ms": "*" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -8799,36 +3362,6 @@ "@types/estree": "*" } }, - "node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, "node_modules/@types/gradient-string": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@types/gradient-string/-/gradient-string-1.1.6.tgz", @@ -8839,12 +3372,6 @@ "@types/tinycolor2": "*" } }, - "node_modules/@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", - "license": "MIT" - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -8854,12 +3381,6 @@ "@types/unist": "*" } }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "license": "MIT" - }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", @@ -8872,33 +3393,6 @@ "@types/react": "*" } }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/inquirer": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.9.tgz", @@ -8910,36 +3404,6 @@ "rxjs": "^7.2.0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, "node_modules/@types/jsonwebtoken": { "version": "9.0.10", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", @@ -8960,18 +3424,6 @@ "@types/unist": "*" } }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" - }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", @@ -8982,35 +3434,18 @@ "version": "25.0.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" } }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", - "license": "MIT" - }, "node_modules/@types/prop-types": { "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "license": "MIT" }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, "node_modules/@types/react": { "version": "18.3.27", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", @@ -9041,101 +3476,6 @@ "@types/react": "*" } }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "license": "MIT" - }, - "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/through": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", @@ -9152,13 +3492,6 @@ "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", "license": "MIT" }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -9171,30 +3504,6 @@ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" - }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", @@ -9363,164 +3672,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, "node_modules/@xyflow/react": { "version": "12.10.0", "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.0.tgz", @@ -9594,60 +3745,6 @@ "node": ">= 0.6" } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -9658,19 +3755,6 @@ "node": ">= 14" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -9704,55 +3788,6 @@ } } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/algoliasearch": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.47.0.tgz", - "integrity": "sha512-AGtz2U7zOV4DlsuYV84tLp2tBbA7RPtLA44jbVH4TTpDcc1dIWmULjHSsunlhscbzDydnjuFlNhflR3nV4VJaQ==", - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.13.0", - "@algolia/client-abtesting": "5.47.0", - "@algolia/client-analytics": "5.47.0", - "@algolia/client-common": "5.47.0", - "@algolia/client-insights": "5.47.0", - "@algolia/client-personalization": "5.47.0", - "@algolia/client-query-suggestions": "5.47.0", - "@algolia/client-search": "5.47.0", - "@algolia/ingestion": "1.47.0", - "@algolia/monitoring": "1.47.0", - "@algolia/recommend": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.27.0.tgz", - "integrity": "sha512-eNYchRerbsvk2doHOMfdS1/B6Tm70oGtu8mzQlrNzbCeQ8p1MjCW8t/BL6iZ5PD+cL5NNMgTMyMnmiXZ1sgmNw==", - "license": "MIT", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, "node_modules/allotment": { "version": "1.20.5", "resolved": "https://registry.npmjs.org/allotment/-/allotment-1.20.5.tgz", @@ -9833,18 +3868,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -9877,6 +3900,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -9890,14 +3914,9 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, "license": "MIT" }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, "node_modules/aria-hidden": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", @@ -9937,35 +3956,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1js": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -9976,15 +3966,6 @@ "node": ">=12" } }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "license": "MIT", - "bin": { - "astring": "bin/astring" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -9996,6 +3977,7 @@ "version": "10.4.24", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", + "dev": true, "funding": [ { "type": "opencollective", @@ -10044,80 +4026,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", - "license": "MIT", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", - "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.6", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", - "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.6" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -10158,17 +4066,12 @@ "version": "2.9.19", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, "node_modules/better-sqlite3": { "version": "11.10.0", "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz", @@ -10189,19 +4092,11 @@ "node": ">=0.6" } }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10254,22 +4149,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, "node_modules/boxen": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", @@ -10317,6 +4196,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -10329,6 +4209,7 @@ "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, "funding": [ { "type": "opencollective", @@ -10388,12 +4269,6 @@ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, "node_modules/bundle-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", @@ -10418,15 +4293,6 @@ "node": ">= 0.8" } }, - "node_modules/bytestreamjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -10437,49 +4303,11 @@ "node": ">=8" } }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -10523,25 +4351,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", @@ -10564,22 +4373,11 @@ "node": ">= 6" } }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001767", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001767.tgz", "integrity": "sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -10606,10 +4404,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/ccw-docs": { - "resolved": "ccw/docs-site", - "link": true - }, "node_modules/ccw-frontend": { "resolved": "ccw/frontend", "link": true @@ -10643,15 +4437,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -10708,80 +4493,11 @@ "node": ">= 16" } }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/chevrotain-allstar": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", - "license": "MIT", - "dependencies": { - "lodash-es": "^4.17.21" - }, - "peerDependencies": { - "chevrotain": "^11.0.0" - } - }, - "node_modules/chevrotain/node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -10808,30 +4524,6 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "license": "ISC" }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -10856,36 +4548,6 @@ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", @@ -10925,41 +4587,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/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/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -11049,20 +4676,6 @@ "node": ">=0.8" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -11072,16 +4685,6 @@ "node": ">=6" } }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -11100,27 +4703,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" - }, - "node_modules/combine-promises": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -11153,72 +4735,6 @@ "node": ">=16" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "license": "ISC" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, "node_modules/concurrently": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", @@ -11306,59 +4822,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "license": "MIT" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/content-disposition": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", @@ -11385,6 +4848,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, "license": "MIT" }, "node_modules/cookie": { @@ -11405,114 +4869,6 @@ "node": ">=6.6.0" } }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", - "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", - "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.48.0.tgz", - "integrity": "sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -11526,41 +4882,6 @@ "node": ">= 0.10" } }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "license": "MIT", - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -11575,71 +4896,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-blank-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", - "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/css-box-model": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", @@ -11649,222 +4905,6 @@ "tiny-invariant": "^1.0.6" } }, - "node_modules/css-declaration-sorter": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.1.tgz", - "integrity": "sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==", - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", - "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", - "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -11872,26 +4912,11 @@ "dev": true, "license": "MIT" }, - "node_modules/cssdb": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.7.1.tgz", - "integrity": "sha512-+F6LKx48RrdGOtE4DT5jz7Uo+VeyKXpK797FAevIkzjV8bMHz6xTO5F7gNDcRCHmPgD5jj2g6QCsY9zmVrh38A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "MIT-0" - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -11900,136 +4925,6 @@ "node": ">=4" } }, - "node_modules/cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", - "license": "MIT", - "dependencies": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" - }, "node_modules/cssstyle": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", @@ -12057,95 +4952,6 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, - "node_modules/cytoscape": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", - "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "license": "MIT", - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "license": "MIT" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", @@ -12158,43 +4964,6 @@ "node": ">=12" } }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", @@ -12204,30 +4973,6 @@ "node": ">=12" } }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-dispatch": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", @@ -12250,52 +4995,6 @@ "node": ">=12" } }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-dsv/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", @@ -12305,32 +5004,6 @@ "node": ">=12" } }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-format": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", @@ -12340,27 +5013,6 @@ "node": ">=12" } }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", @@ -12382,73 +5034,6 @@ "node": ">=12" } }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, "node_modules/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", @@ -12465,19 +5050,6 @@ "node": ">=12" } }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", @@ -12567,16 +5139,6 @@ "node": ">=12" } }, - "node_modules/dagre-d3-es": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", - "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", - "license": "MIT", - "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, "node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", @@ -12601,18 +5163,6 @@ "url": "https://github.com/sponsors/kossnocorp" } }, - "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", - "license": "MIT" - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "license": "MIT" - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -12722,15 +5272,6 @@ "node": ">=4.0.0" } }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/default-browser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", @@ -12777,19 +5318,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -12819,6 +5352,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -12832,15 +5366,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -12869,16 +5394,6 @@ "node": ">=6" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -12888,35 +5403,12 @@ "node": ">=8" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, - "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - }, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -12937,18 +5429,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -12956,18 +5436,6 @@ "dev": true, "license": "MIT" }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -12975,15 +5443,6 @@ "dev": true, "license": "MIT" }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -12994,104 +5453,6 @@ "csstype": "^3.0.2" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/dompurify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", - "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -13106,12 +5467,6 @@ "node": ">= 0.4" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -13137,6 +5492,7 @@ "version": "1.5.283", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", + "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { @@ -13145,31 +5501,6 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -13188,40 +5519,6 @@ "once": "^1.4.0" } }, - "node_modules/enhanced-resolve": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -13296,38 +5593,6 @@ "node": ">= 0.4" } }, - "node_modules/esast-util-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/esast-util-from-js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "acorn": "^8.0.0", - "esast-util-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/esbuild": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", @@ -13374,54 +5639,18 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -13435,65 +5664,6 @@ "node": ">=4" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", @@ -13504,91 +5674,16 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/estree-util-scope": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", - "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-value-to-estree": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", - "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -13598,33 +5693,12 @@ "node": ">= 0.6" } }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", @@ -13786,6 +5860,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -13798,12 +5873,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, "node_modules/fast-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", @@ -13824,48 +5893,12 @@ "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "license": "MIT", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "license": "MIT", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", @@ -13897,99 +5930,6 @@ "node": ">=20" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/file-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/file-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -14000,6 +5940,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -14029,47 +5970,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", @@ -14077,26 +5977,6 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -14146,15 +6026,6 @@ "node": ">= 6" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, "node_modules/form-data/node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -14178,14 +6049,6 @@ "node": ">= 0.6" } }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -14199,6 +6062,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, "license": "MIT", "engines": { "node": "*" @@ -14223,24 +6087,11 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, - "node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -14274,6 +6125,7 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -14322,12 +6174,6 @@ "node": ">=6" } }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "license": "ISC" - }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -14372,12 +6218,6 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "license": "MIT" }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "license": "ISC" - }, "node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -14402,6 +6242,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -14410,72 +6251,6 @@ "node": ">= 6" } }, - "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -14488,49 +6263,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, "node_modules/gradient-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz", @@ -14612,33 +6344,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "license": "MIT" - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT" - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -14665,6 +6370,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -14701,18 +6407,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -14725,26 +6419,6 @@ "node": ">= 0.4" } }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-is-element": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", @@ -14758,72 +6432,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-estree": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", - "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", @@ -14851,25 +6459,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-to-text": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", @@ -14899,32 +6488,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, "node_modules/highlight.js": { "version": "11.11.1", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", @@ -14934,20 +6497,6 @@ "node": ">=12.0.0" } }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -14973,54 +6522,6 @@ "node": ">=16.9.0" } }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -15038,50 +6539,9 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, "license": "MIT" }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/html-url-attributes": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", @@ -15092,109 +6552,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.6", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", - "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT" - }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -15215,26 +6572,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -15249,55 +6586,6 @@ "node": ">= 14" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -15321,15 +6609,6 @@ "node": ">=14.18.0" } }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "license": "MIT", - "engines": { - "node": ">=10.18" - } - }, "node_modules/iconv-lite": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", @@ -15346,18 +6625,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -15378,79 +6645,16 @@ ], "license": "BSD-3-Clause" }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/infima": { - "version": "0.2.0-alpha.45", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", - "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -15793,15 +6997,6 @@ "tslib": "2" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -15870,12 +7065,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, "node_modules/is-bigint": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", @@ -15896,6 +7085,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -15934,22 +7124,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -16016,6 +7195,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -16034,6 +7214,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -16070,22 +7251,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "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", @@ -16111,34 +7276,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-network-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", - "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", - "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -16161,24 +7303,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -16191,18 +7315,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -16235,15 +7347,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -16320,12 +7423,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" - }, "node_modules/is-unicode-supported": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", @@ -16395,15 +7492,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -16417,15 +7505,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -16495,106 +7574,16 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/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/jest-util/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/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, "license": "MIT", "bin": { "jiti": "bin/jiti.js" } }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, "node_modules/jose": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", @@ -16610,18 +7599,6 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/jsdom": { "version": "25.0.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", @@ -16667,6 +7644,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -16675,18 +7653,6 @@ "node": ">=6" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -16703,6 +7669,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -16711,18 +7678,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsonwebtoken": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", @@ -16766,45 +7721,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/katex": { - "version": "0.16.28", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.28.tgz", - "integrity": "sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -16814,75 +7730,11 @@ "node": ">=0.10.0" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/langium": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", - "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", - "license": "MIT", - "dependencies": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "license": "MIT", - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/launch-editor": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", - "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "license": "MIT" - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, "license": "MIT", "engines": { "node": ">=14" @@ -16895,62 +7747,15 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, "license": "MIT" }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lodash": { "version": "4.17.23", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, - "node_modules/lodash-es": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", - "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", - "license": "MIT" - }, "node_modules/lodash.clamp": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/lodash.clamp/-/lodash.clamp-4.0.3.tgz", @@ -16999,24 +7804,12 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "license": "MIT" - }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "license": "MIT" - }, "node_modules/log-symbols": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", @@ -17062,27 +7855,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lowlight": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", @@ -17161,18 +7933,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -17183,18 +7943,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -17204,27 +7952,6 @@ "node": ">= 0.4" } }, - "node_modules/mdast-util-directive": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", - "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", @@ -17293,36 +8020,6 @@ ], "license": "MIT" }, - "node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mdast-util-gfm": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", @@ -17460,23 +8157,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-mdx-expression": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", @@ -17606,12 +8286,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "license": "CC0-1.0" - }, "node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", @@ -17621,35 +8295,6 @@ "node": ">= 0.8" } }, - "node_modules/memfs": { - "version": "4.56.10", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.56.10.tgz", - "integrity": "sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.56.10", - "@jsonjoy.com/fs-fsa": "4.56.10", - "@jsonjoy.com/fs-node": "4.56.10", - "@jsonjoy.com/fs-node-builtins": "4.56.10", - "@jsonjoy.com/fs-node-to-fsa": "4.56.10", - "@jsonjoy.com/fs-node-utils": "4.56.10", - "@jsonjoy.com/fs-print": "4.56.10", - "@jsonjoy.com/fs-snapshot": "4.56.10", - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/merge-descriptors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", @@ -17672,48 +8317,12 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" } }, - "node_modules/mermaid": { - "version": "11.12.2", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.2.tgz", - "integrity": "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==", - "license": "MIT", - "dependencies": { - "@braintree/sanitize-url": "^7.1.1", - "@iconify/utils": "^3.0.1", - "@mermaid-js/parser": "^0.6.3", - "@types/d3": "^7.4.3", - "cytoscape": "^3.29.3", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.13", - "dayjs": "^1.11.18", - "dompurify": "^3.2.5", - "katex": "^0.16.22", - "khroma": "^2.1.0", - "lodash-es": "^4.17.21", - "marked": "^16.2.1", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -17839,133 +8448,6 @@ ], "license": "MIT" }, - "node_modules/micromark-extension-directive": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", - "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "license": "MIT", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", @@ -18307,256 +8789,6 @@ ], "license": "MIT" }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", - "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", - "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "license": "MIT", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-factory-destination": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", @@ -18672,125 +8904,6 @@ ], "license": "MIT" }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", - "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-space/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-factory-title": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", @@ -18947,42 +9060,6 @@ ], "license": "MIT" }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-character/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-util-chunked": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", @@ -19204,47 +9281,6 @@ ], "license": "MIT" }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", - "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", @@ -19410,22 +9446,6 @@ ], "license": "MIT" }, - "node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-util-types": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", @@ -19502,6 +9522,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -19511,18 +9532,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -19582,32 +9591,6 @@ "node": ">=4" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.0.tgz", - "integrity": "sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==", - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -19647,28 +9630,11 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "license": "MIT" }, - "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - "license": "MIT", - "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" - } - }, - "node_modules/mlly/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -19680,19 +9646,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "node_modules/mute-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", @@ -19718,6 +9671,7 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, "funding": [ { "type": "github", @@ -19747,22 +9701,6 @@ "node": ">= 0.6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-abi": { "version": "3.85.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz", @@ -19781,21 +9719,6 @@ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT" }, - "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/node-pty": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.1.0.tgz", @@ -19810,29 +9733,19 @@ "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", - "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -19860,93 +9773,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "license": "MIT" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/null-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/null-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/null-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/null-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/nwsapi": { "version": "2.2.23", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", @@ -20006,6 +9832,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -20015,6 +9842,7 @@ "version": "4.1.7", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -20031,12 +9859,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -20049,15 +9871,6 @@ "node": ">= 0.8" } }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -20100,15 +9913,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, "node_modules/ora": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", @@ -20182,166 +9986,12 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "license": "MIT", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "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/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", - "license": "MIT" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", @@ -20367,34 +10017,11 @@ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", - "license": "ISC" - }, "node_modules/parse5": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -20403,23 +10030,11 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -20437,37 +10052,6 @@ "node": ">= 0.8" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "license": "(WTFPL OR MIT)" - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -20481,6 +10065,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, "license": "MIT" }, "node_modules/path-scurry": { @@ -20509,15 +10094,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -20539,12 +10115,14 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -20595,55 +10173,6 @@ "node": ">=16.20.0" } }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, - "node_modules/pkijs": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", - "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", - "license": "BSD-3-Clause", - "dependencies": { - "@noble/hashes": "1.4.0", - "asn1js": "^3.0.6", - "bytestreamjs": "^2.0.1", - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/playwright": { "version": "1.57.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", @@ -20686,22 +10215,6 @@ "node": ">=14.19.0" } }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "license": "MIT" - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "license": "MIT", - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -20716,6 +10229,7 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -20740,549 +10254,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", - "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", - "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", - "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", - "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-custom-media": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-properties": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", - "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", - "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", - "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-discard-comments": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-unused": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", - "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", - "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-focus-within": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", - "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", - "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", - "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, "node_modules/postcss-import": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", @@ -21327,35 +10298,6 @@ "postcss": "^8.4.21" } }, - "node_modules/postcss-lab-function": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", - "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, "node_modules/postcss-load-config": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", @@ -21399,252 +10341,6 @@ } } }, - "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-logical": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", - "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-merge-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", - "license": "MIT", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/postcss-nested": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", @@ -21671,550 +10367,11 @@ "postcss": "^8.2.14" } }, - "node_modules/postcss-nesting": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-resolve-nested": "^3.1.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", - "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", - "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", - "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-preset-env": { - "version": "10.6.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", - "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-alpha-function": "^1.0.1", - "@csstools/postcss-cascade-layers": "^5.0.2", - "@csstools/postcss-color-function": "^4.0.12", - "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", - "@csstools/postcss-color-mix-function": "^3.0.12", - "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", - "@csstools/postcss-content-alt-text": "^2.0.8", - "@csstools/postcss-contrast-color-function": "^2.0.12", - "@csstools/postcss-exponential-functions": "^2.0.9", - "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.11", - "@csstools/postcss-gradients-interpolation-method": "^5.0.12", - "@csstools/postcss-hwb-function": "^4.0.12", - "@csstools/postcss-ic-unit": "^4.0.4", - "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.3", - "@csstools/postcss-light-dark-function": "^2.0.11", - "@csstools/postcss-logical-float-and-clear": "^3.0.0", - "@csstools/postcss-logical-overflow": "^2.0.0", - "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", - "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.4", - "@csstools/postcss-media-minmax": "^2.0.9", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", - "@csstools/postcss-nested-calc": "^4.0.0", - "@csstools/postcss-normalize-display-values": "^4.0.1", - "@csstools/postcss-oklab-function": "^4.0.12", - "@csstools/postcss-position-area-property": "^1.0.0", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/postcss-property-rule-prelude-list": "^1.0.0", - "@csstools/postcss-random-function": "^2.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.12", - "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.4", - "@csstools/postcss-stepped-value-functions": "^4.0.9", - "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", - "@csstools/postcss-system-ui-font-family": "^1.0.0", - "@csstools/postcss-text-decoration-shorthand": "^4.0.3", - "@csstools/postcss-trigonometric-functions": "^4.0.9", - "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.23", - "browserslist": "^4.28.1", - "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.3", - "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.6.0", - "postcss-attribute-case-insensitive": "^7.0.1", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.12", - "postcss-color-hex-alpha": "^10.0.0", - "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.6", - "postcss-custom-properties": "^14.0.6", - "postcss-custom-selectors": "^8.0.5", - "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.4", - "postcss-focus-visible": "^10.0.1", - "postcss-focus-within": "^9.0.1", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^6.0.0", - "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.12", - "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.2", - "postcss-opacity-percentage": "^3.0.0", - "postcss-overflow-shorthand": "^6.0.0", - "postcss-page-break": "^3.0.4", - "postcss-place": "^10.0.0", - "postcss-pseudo-class-any-link": "^10.0.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^8.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", - "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", - "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-selector-parser": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -22224,70 +10381,13 @@ "node": ">=4" } }, - "node_modules/postcss-sort-media-queries": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", - "license": "MIT", - "dependencies": { - "sort-css-media-queries": "2.2.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.23" - } - }, - "node_modules/postcss-svgo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" - }, - "engines": { - "node": "^14 || ^16 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, "license": "MIT" }, - "node_modules/postcss-zindex": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -22314,16 +10414,6 @@ "node": ">=10" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -22352,56 +10442,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", - "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", - "license": "MIT", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -22429,12 +10469,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "license": "ISC" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -22462,44 +10496,12 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/pupa": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", - "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", - "license": "MIT", - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", @@ -22519,6 +10521,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -22535,33 +10538,12 @@ ], "license": "MIT" }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/raf-schd": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -22640,12 +10622,6 @@ "react-dom": ">= 16.3.0" } }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" - }, "node_modules/react-grid-layout": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.5.3.tgz", @@ -22664,24 +10640,6 @@ "react-dom": ">= 16.3.0" } }, - "node_modules/react-helmet-async": { - "name": "@slorber/react-helmet-async", - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/react-intl": { "version": "6.8.9", "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.8.9.tgz", @@ -22766,47 +10724,6 @@ "dev": true, "license": "MIT" }, - "node_modules/react-json-view-lite": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", - "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, "node_modules/react-markdown": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", @@ -22928,39 +10845,6 @@ "react-dom": ">= 16.3" } }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, "node_modules/react-router-dom": { "version": "6.30.3", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", @@ -22993,27 +10877,6 @@ "react": ">=16.8" } }, - "node_modules/react-router/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/react-router/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, "node_modules/react-smooth": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", @@ -23104,6 +10967,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -23150,73 +11014,6 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, - "node_modules/recma-build-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", - "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-jsx": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", - "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", - "license": "MIT", - "dependencies": { - "acorn-jsx": "^5.0.0", - "estree-util-to-js": "^2.0.0", - "recma-parse": "^1.0.0", - "recma-stringify": "^1.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/recma-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", - "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "esast-util-from-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-stringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", - "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-to-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -23237,30 +11034,6 @@ "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -23282,68 +11055,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", - "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^3.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, "node_modules/rehype-highlight": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.2.tgz", @@ -23361,93 +11072,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-recma": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", - "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "hast-util-to-estree": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-directive": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", - "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^3.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/remark-frontmatter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -23466,20 +11090,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-mdx": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", - "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", - "license": "MIT", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", @@ -23528,115 +11138,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -23656,20 +11157,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -23680,6 +11167,7 @@ "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.1", @@ -23696,27 +11184,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "license": "MIT" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "license": "MIT" - }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -23727,21 +11194,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/restore-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", @@ -23788,31 +11240,17 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "license": "Unlicense" - }, "node_modules/rollup": { "version": "4.57.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", @@ -23858,18 +11296,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "license": "MIT", - "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -23893,36 +11319,6 @@ "dev": true, "license": "MIT" }, - "node_modules/rtlcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", - "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0", - "postcss": "^8.4.21", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/rtlcss/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/run-applescript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", @@ -24046,6 +11442,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -24065,12 +11462,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -24124,15 +11515,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -24155,48 +11537,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/schema-dts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", - "license": "Apache-2.0" - }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -24210,25 +11550,6 @@ "node": ">=4" } }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", - "license": "MIT", - "dependencies": { - "@peculiar/x509": "^1.14.2", - "pkijs": "^3.3.3" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -24241,21 +11562,6 @@ "node": ">=10" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", @@ -24282,220 +11588,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", - "license": "MIT", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/serve-handler/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-handler/node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "license": "MIT", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "license": "MIT" - }, - "node_modules/serve-handler/node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.8.0", - "mime-types": "~2.1.35", - "parseurl": "~1.3.3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-index/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/serve-index/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serve-static": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", @@ -24519,6 +11611,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -24554,24 +11647,6 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -24597,6 +11672,7 @@ "version": "1.8.3", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -24756,88 +11832,6 @@ "node": ">=18" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/sitemap": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", - "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", - "license": "MIT", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "license": "MIT" - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "license": "MIT", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/sonner": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", @@ -24848,47 +11842,11 @@ "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, - "node_modules/sort-css-media-queries": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", - "license": "MIT", - "engines": { - "node": ">= 6.3.0" - } - }, - "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -24904,54 +11862,12 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, - "node_modules/srcset": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -24972,6 +11888,7 @@ "version": "3.10.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, "license": "MIT" }, "node_modules/stdin-discarder": { @@ -25091,20 +12008,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "license": "BSD-2-Clause", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -25191,28 +12094,6 @@ "inline-style-parser": "0.2.7" } }, - "node_modules/stylehacks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "license": "MIT" - }, "node_modules/sucrase": { "version": "3.35.1", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", @@ -25262,6 +12143,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -25270,46 +12152,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "license": "MIT" - }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -25388,19 +12230,6 @@ "node": ">=10.13.0" } }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/tar-fs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", @@ -25464,93 +12293,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/terser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -25589,40 +12331,12 @@ "node": ">=0.8" } }, - "node_modules/thingies": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", - "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", - "license": "MIT", - "engines": { - "node": ">=10.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT" - }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -25636,15 +12350,6 @@ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "license": "MIT" }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -25707,6 +12412,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" @@ -25768,6 +12474,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -25789,6 +12496,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -25820,22 +12528,6 @@ "node": ">=18" } }, - "node_modules/tree-dump": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -25875,15 +12567,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -25932,24 +12615,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/tsyringe": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", - "license": "MIT", - "dependencies": { - "tslib": "^1.9.3" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/tsyringe/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -25988,15 +12653,6 @@ "node": ">= 0.6" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -26011,67 +12667,13 @@ "node": ">=14.17" } }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - "license": "MIT" - }, "node_modules/undici-types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "devOptional": true, "license": "MIT" }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -26091,21 +12693,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/unist-util-find-after": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", @@ -26146,19 +12733,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -26201,15 +12775,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -26232,6 +12797,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, "funding": [ { "type": "opencollective", @@ -26258,140 +12824,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/url-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/url-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/url-loader/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -26465,49 +12897,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "license": "MIT" - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -26531,20 +12920,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vfile-message": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", @@ -28319,55 +14694,6 @@ } } }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "license": "MIT" - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -28381,28 +14707,6 @@ "node": ">=18" } }, - "node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -28412,16 +14716,6 @@ "defaults": "^1.0.3" } }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/web-tree-sitter": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.0.tgz", @@ -28444,744 +14738,6 @@ "node": ">=12" } }, - "node_modules/webpack": { - "version": "5.104.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", - "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.4", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.4.4", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", - "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.25", - "@types/express-serve-static-core": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.8.1", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.22.1", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.9", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^5.5.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/webpack-dev-server/node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" - }, - "node_modules/webpack-dev-server/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/webpack-dev-server/node_modules/default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/webpack-dev-server/node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webpack-dev-server/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-server/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/webpack-dev-server/node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webpack-dev-server/node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/webpack-dev-server/node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/webpack-dev-server/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "license": "MIT" - }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpackbar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", - "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "consola": "^3.2.3", - "figures": "^3.2.0", - "markdown-table": "^2.0.0", - "pretty-time": "^1.1.0", - "std-env": "^3.7.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/webpackbar/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/webpackbar/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/webpackbar/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/webpackbar/node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "license": "MIT", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webpackbar/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/webpackbar/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -29341,12 +14897,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "license": "MIT" - }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -29450,28 +15000,11 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/write-file-atomic/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/ws": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -29489,60 +15022,6 @@ } } }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, "node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -29591,6 +15070,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, "license": "ISC" }, "node_modules/yargs": { @@ -29644,18 +15124,6 @@ "node": ">=8" } }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/yoctocolors-cjs": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",