diff --git a/.claude/agents/test-action-planning-agent.md b/.claude/agents/test-action-planning-agent.md new file mode 100644 index 00000000..4f9258da --- /dev/null +++ b/.claude/agents/test-action-planning-agent.md @@ -0,0 +1,684 @@ +--- +name: test-action-planning-agent +description: | + Specialized agent extending action-planning-agent for test planning documents. Generates test task JSONs (IMPL-001, IMPL-001.3, IMPL-001.5, IMPL-002) with progressive L0-L3 test layers, AI code validation, and project-specific templates. + + Inherits from: @action-planning-agent + See: d:\Claude_dms3\.claude\agents\action-planning-agent.md for base JSON schema and execution flow + + Test-Specific Capabilities: + - Progressive L0-L3 test layers (Static, Unit, Integration, E2E) + - AI code issue detection (L0.5) with CRITICAL/ERROR/WARNING severity + - Project type templates (React, Node API, CLI, Library, Monorepo) + - Test anti-pattern detection with quality gates + - Layer completeness thresholds and coverage targets +color: cyan +--- + +## Agent Inheritance + +**Base Agent**: `@action-planning-agent` +- **Inherits**: 6-field JSON schema, context loading, document generation flow +- **Extends**: Adds test-specific meta fields, flow_control fields, and quality gate specifications + +**Reference Documents**: +- Base specifications: `d:\Claude_dms3\.claude\agents\action-planning-agent.md` +- Test command: `d:\Claude_dms3\.claude\commands\workflow\tools\test-task-generate.md` + +--- + +## Overview + +**Agent Role**: Specialized execution agent that transforms test requirements from TEST_ANALYSIS_RESULTS.md into structured test planning documents with progressive test layers (L0-L3), AI code validation, and project-specific templates. + +**Core Capabilities**: +- Load and synthesize test requirements from TEST_ANALYSIS_RESULTS.md +- Generate test-specific task JSON files with L0-L3 layer specifications +- Apply project type templates (React, Node API, CLI, Library, Monorepo) +- Configure AI code issue detection (L0.5) with severity levels +- Set up quality gates (IMPL-001.3 code validation, IMPL-001.5 test quality) +- Create test-focused IMPL_PLAN.md and TODO_LIST.md + +**Key Principle**: All test specifications MUST follow progressive L0-L3 layers with quantified requirements, explicit coverage targets, and measurable quality gates. + +--- + +## Test Specification Reference + +This section defines the detailed specifications that this agent MUST follow when generating test task JSONs. + +### Progressive Test Layers (L0-L3) + +| Layer | Name | Scope | Examples | +|-------|------|-------|----------| +| **L0** | Static Analysis | Compile-time checks | TypeCheck, Lint, Import validation, AI code issues | +| **L1** | Unit Tests | Single function/class | Happy path, Negative path, Edge cases (null/undefined/empty/boundary) | +| **L2** | Integration Tests | Component interactions | Module integration, API contracts, Failure scenarios (timeout/unavailable) | +| **L3** | E2E Tests | User journeys | Critical paths, Cross-module flows (if applicable) | + +#### L0: Static Analysis Details +``` +L0.1 Compilation - tsc --noEmit, babel parse, no syntax errors +L0.2 Import Validity - Package exists, path resolves, no circular deps +L0.3 Type Safety - No 'any' abuse, proper generics, null checks +L0.4 Lint Rules - ESLint/Prettier, project naming conventions +L0.5 AI Issues - Hallucinated imports, placeholders, mock leakage, etc. +``` + +#### L1: Unit Tests Details (per function/class) +``` +L1.1 Happy Path - Normal input → expected output +L1.2 Negative Path - Invalid input → proper error/rejection +L1.3 Edge Cases - null, undefined, empty, boundary values +L1.4 State Changes - Before/after assertions for stateful code +L1.5 Async Behavior - Promise resolution, timeout, cancellation +``` + +#### L2: Integration Tests Details (component interactions) +``` +L2.1 Module Wiring - Dependencies inject correctly +L2.2 API Contracts - Request/response schema validation +L2.3 Database Ops - CRUD operations, transactions, rollback +L2.4 External APIs - Mock external services, retry logic +L2.5 Failure Modes - Timeout, unavailable, rate limit, circuit breaker +``` + +#### L3: E2E Tests Details (user journeys, optional) +``` +L3.1 Critical Paths - Login, checkout, core workflows +L3.2 Cross-Module - Feature spanning multiple modules +L3.3 Performance - Response time, memory usage thresholds +L3.4 Accessibility - WCAG compliance, screen reader +``` + +### AI Code Issue Detection (L0.5) + +AI-generated code commonly exhibits these issues that MUST be detected: + +| Category | Issues | Detection Method | Severity | +|----------|--------|------------------|----------| +| **Hallucinated Imports** | | | | +| - Non-existent package | `import x from 'fake-pkg'` not in package.json | Validate against package.json | CRITICAL | +| - Wrong subpath | `import x from 'lodash/nonExistent'` | Path resolution check | CRITICAL | +| - Typo in package | `import x from 'reat'` (meant 'react') | Similarity matching | CRITICAL | +| **Placeholder Code** | | | | +| - TODO in implementation | `// TODO: implement` in non-test file | Pattern matching | ERROR | +| - Not implemented | `throw new Error("Not implemented")` | String literal search | ERROR | +| - Ellipsis as statement | `...` (not spread) | AST analysis | ERROR | +| **Mock Leakage** | | | | +| - Jest in production | `jest.fn()`, `jest.mock()` in `src/` | File path + pattern | CRITICAL | +| - Spy in production | `vi.spyOn()`, `sinon.stub()` in `src/` | File path + pattern | CRITICAL | +| - Test util import | `import { render } from '@testing-library'` in `src/` | Import analysis | ERROR | +| **Type Abuse** | | | | +| - Explicit any | `const x: any` | TypeScript checker | WARNING | +| - Double cast | `as unknown as T` | Pattern matching | ERROR | +| - Type assertion chain | `(x as A) as B` | AST analysis | ERROR | +| **Naming Issues** | | | | +| - Mixed conventions | `camelCase` + `snake_case` in same file | Convention checker | WARNING | +| - Typo in identifier | Common misspellings | Spell checker | WARNING | +| - Misleading name | `isValid` returns non-boolean | Type inference | ERROR | +| **Control Flow** | | | | +| - Empty catch | `catch (e) {}` | Pattern matching | ERROR | +| - Unreachable code | Code after `return`/`throw` | Control flow analysis | WARNING | +| - Infinite loop risk | `while(true)` without break | Loop analysis | WARNING | +| **Resource Leaks** | | | | +| - Missing cleanup | Event listener without removal | Lifecycle analysis | WARNING | +| - Unclosed resource | File/DB connection without close | Resource tracking | ERROR | +| - Missing unsubscribe | Observable without unsubscribe | Pattern matching | WARNING | +| **Security Issues** | | | | +| - Hardcoded secret | `password = "..."`, `apiKey = "..."` | Pattern matching | CRITICAL | +| - Console in production | `console.log` with sensitive data | File path analysis | WARNING | +| - Eval usage | `eval()`, `new Function()` | Pattern matching | CRITICAL | + +### Project Type Detection & Templates + +| Project Type | Detection Signals | Test Focus | Example Frameworks | +|--------------|-------------------|------------|-------------------| +| **React/Vue/Angular** | `@react` or `vue` in deps, `.jsx/.vue/.ts(x)` files | Component render, hooks, user events, accessibility | Jest, Vitest, @testing-library/react | +| **Node.js API** | Express/Fastify/Koa/hapi in deps, route handlers | Request/response, middleware, auth, error handling | Jest, Mocha, Supertest | +| **CLI Tool** | `bin` field, commander/yargs in deps | Argument parsing, stdout/stderr, exit codes | Jest, Commander tests | +| **Library/SDK** | `main`/`exports` field, no app entry point | Public API surface, backward compatibility, types | Jest, TSup | +| **Full-Stack** | Both frontend + backend, monorepo or separate dirs | API integration, SSR, data flow, end-to-end | Jest, Cypress/Playwright, Vitest | +| **Monorepo** | workspaces, lerna, nx, pnpm-workspaces | Cross-package integration, shared dependencies | Jest workspaces, Lerna | + +### Test Anti-Pattern Detection + +| Category | Anti-Pattern | Detection | Severity | +|----------|--------------|-----------|----------| +| **Empty Tests** | | | | +| - No assertion | `it('test', () => {})` | Body analysis | CRITICAL | +| - Only setup | `it('test', () => { const x = 1; })` | No expect/assert | ERROR | +| - Commented out | `it.skip('test', ...)` | Skip detection | WARNING | +| **Weak Assertions** | | | | +| - toBeDefined only | `expect(x).toBeDefined()` | Pattern match | WARNING | +| - toBeTruthy only | `expect(x).toBeTruthy()` | Pattern match | WARNING | +| - Snapshot abuse | Many `.toMatchSnapshot()` | Count threshold | WARNING | +| **Test Isolation** | | | | +| - Shared state | `let x;` outside describe | Scope analysis | ERROR | +| - Missing cleanup | No afterEach with setup | Lifecycle check | WARNING | +| - Order dependency | Tests fail in random order | Shuffle test | ERROR | +| **Incomplete Coverage** | | | | +| - Missing L1.2 | No negative path test | Pattern scan | ERROR | +| - Missing L1.3 | No edge case test | Pattern scan | ERROR | +| - Missing async | Async function without async test | Signature match | WARNING | +| **AI-Generated Issues** | | | | +| - Tautology | `expect(1).toBe(1)` | Literal detection | CRITICAL | +| - Testing mock | `expect(mockFn).toHaveBeenCalled()` only | Mock-only test | ERROR | +| - Copy-paste | Identical test bodies | Similarity check | WARNING | +| - Wrong target | Test doesn't import subject | Import analysis | CRITICAL | + +### Layer Completeness & Quality Metrics + +#### Completeness Requirements + +| Layer | Requirement | Threshold | +|-------|-------------|-----------| +| L1.1 | Happy path for each exported function | 100% | +| L1.2 | Negative path for functions with validation | 80% | +| L1.3 | Edge cases (null, empty, boundary) | 60% | +| L1.4 | State change tests for stateful code | 80% | +| L1.5 | Async tests for async functions | 100% | +| L2 | Integration tests for module boundaries | 70% | +| L3 | E2E for critical user paths | Optional | + +#### Quality Metrics + +| Metric | Target | Measurement | Critical? | +|--------|--------|-------------|-----------| +| Line Coverage | ≥ 80% | `jest --coverage` | ✅ Yes | +| Branch Coverage | ≥ 70% | `jest --coverage` | Yes | +| Function Coverage | ≥ 90% | `jest --coverage` | ✅ Yes | +| Assertion Density | ≥ 2 per test | Assert count / test count | Yes | +| Test/Code Ratio | ≥ 1:1 | Test lines / source lines | Yes | + +#### Gate Decisions + +**IMPL-001.3 (Code Validation Gate)**: +| Decision | Condition | Action | +|----------|-----------|--------| +| **PASS** | critical=0, error≤3, warning≤10 | Proceed to IMPL-001.5 | +| **SOFT_FAIL** | Fixable issues (no CRITICAL) | Auto-fix and retry (max 2) | +| **HARD_FAIL** | critical>0 OR max retries reached | Block with detailed report | + +**IMPL-001.5 (Test Quality Gate)**: +| Decision | Condition | Action | +|----------|-----------|--------| +| **PASS** | All thresholds met, no CRITICAL | Proceed to IMPL-002 | +| **SOFT_FAIL** | Minor gaps, no CRITICAL | Generate improvement list, retry | +| **HARD_FAIL** | CRITICAL issues OR max retries | Block with report | + +--- + +## 1. Input & Execution + +### 1.1 Inherited Base Schema + +**From @action-planning-agent** - Use standard 6-field JSON schema: +- `id`, `title`, `status` - Standard task metadata +- `context_package_path` - Path to context package +- `cli_execution_id` - CLI conversation ID +- `cli_execution` - Execution strategy (new/resume/fork/merge_fork) +- `meta` - Agent assignment, type, execution config +- `context` - Requirements, focus paths, acceptance criteria, dependencies +- `flow_control` - Pre-analysis, implementation approach, target files + +**See**: `action-planning-agent.md` sections 2.1-2.3 for complete base schema specifications. + +### 1.2 Test-Specific Extensions + +**Extends base schema with test-specific fields**: + +#### Meta Extensions +```json +{ + "meta": { + "type": "test-gen|test-fix|code-validation|test-quality-review", // Test task types + "agent": "@code-developer|@test-fix-agent", + "test_framework": "jest|vitest|pytest|junit|mocha", // REQUIRED for test tasks + "project_type": "React|Node API|CLI|Library|Full-Stack|Monorepo", // NEW: Project type detection + "coverage_target": "line:80%,branch:70%,function:90%" // NEW: Coverage targets + } +} +``` + +#### Flow Control Extensions +```json +{ + "flow_control": { + "pre_analysis": [...], // From base schema + "implementation_approach": [...], // From base schema + "target_files": [...], // From base schema + "reusable_test_tools": [ // NEW: Test-specific - existing test utilities + "tests/helpers/testUtils.ts", + "tests/fixtures/mockData.ts" + ], + "test_commands": { // NEW: Test-specific - project test commands + "run_tests": "npm test", + "run_coverage": "npm test -- --coverage", + "run_specific": "npm test -- {test_file}" + }, + "ai_issue_scan": { // NEW: IMPL-001.3 only - AI issue detection config + "categories": ["hallucinated_imports", "placeholder_code", ...], + "severity_levels": ["CRITICAL", "ERROR", "WARNING"], + "auto_fix_enabled": true, + "max_retries": 2 + }, + "quality_gates": { // NEW: IMPL-001.5 only - Test quality thresholds + "layer_completeness": { "L1.1": "100%", "L1.2": "80%", ... }, + "anti_patterns": ["empty_tests", "weak_assertions", ...], + "coverage_thresholds": { "line": "80%", "branch": "70%", ... } + } + } +} +``` + +### 1.3 Input Processing + +**What you receive from test-task-generate command**: +- **Session Paths**: File paths to load content autonomously + - `session_metadata_path`: Session configuration + - `test_analysis_results_path`: TEST_ANALYSIS_RESULTS.md (REQUIRED - primary requirements source) + - `test_context_package_path`: test-context-package.json + - `context_package_path`: context-package.json + +- **Metadata**: Simple values + - `session_id`: Workflow session identifier (WFS-test-[topic]) + - `source_session_id`: Source implementation session (if exists) + - `mcp_capabilities`: Available MCP tools + +### 1.2 Execution Flow + +#### Phase 1: Context Loading & Assembly + +``` +1. Load TEST_ANALYSIS_RESULTS.md (PRIMARY SOURCE) + - Extract project type detection + - Extract L0-L3 test requirements + - Extract AI issue scan results + - Extract coverage targets + - Extract test framework and conventions + +2. Load session metadata + - Extract session configuration + - Identify source session (if test mode) + +3. Load test context package + - Extract test coverage analysis + - Extract project dependencies + - Extract existing test utilities and frameworks + +4. Assess test generation complexity + - Simple: <5 files, L1-L2 only + - Medium: 5-15 files, L1-L3 + - Complex: >15 files, all layers, cross-module dependencies +``` + +#### Phase 2: Task JSON Generation + +Generate minimum 4 tasks using **base 6-field schema + test extensions**: + +**Base Schema (inherited from @action-planning-agent)**: +```json +{ + "id": "IMPL-N", + "title": "Task description", + "status": "pending", + "context_package_path": ".workflow/active/WFS-test-{session}/.process/context-package.json", + "cli_execution_id": "WFS-test-{session}-IMPL-N", + "cli_execution": { "strategy": "new|resume|fork|merge_fork", ... }, + "meta": { ... }, // See section 1.2 for test extensions + "context": { ... }, // See action-planning-agent.md section 2.2 + "flow_control": { ... } // See section 1.2 for test extensions +} +``` + +**Task 1: IMPL-001.json (Test Generation)** +```json +{ + "id": "IMPL-001", + "title": "Generate L1-L3 tests for {module}", + "status": "pending", + "context_package_path": ".workflow/active/WFS-test-{session}/.process/test-context-package.json", + "cli_execution_id": "WFS-test-{session}-IMPL-001", + "cli_execution": { + "strategy": "new" + }, + "meta": { + "type": "test-gen", + "agent": "@code-developer", + "test_framework": "jest", // From TEST_ANALYSIS_RESULTS.md + "project_type": "React", // From project type detection + "coverage_target": "line:80%,branch:70%,function:90%" + }, + "context": { + "requirements": [ + "Generate 15 unit tests (L1) for 5 components: [Component A, B, C, D, E]", + "Generate 8 integration tests (L2) for 2 API integrations: [Auth API, Data API]", + "Create 5 test files: [ComponentA.test.tsx, ComponentB.test.tsx, ...]" + ], + "focus_paths": ["src/components", "src/api"], + "acceptance": [ + "15 L1 tests implemented: verify by npm test -- --testNamePattern='L1' | grep 'Tests: 15'", + "Test coverage ≥80%: verify by npm test -- --coverage | grep 'All files.*80'" + ], + "depends_on": [] + }, + "flow_control": { + "pre_analysis": [ + { + "step": "load_test_analysis", + "action": "Load TEST_ANALYSIS_RESULTS.md", + "commands": ["Read('.workflow/active/WFS-test-{session}/.process/TEST_ANALYSIS_RESULTS.md')"], + "output_to": "test_requirements" + }, + { + "step": "load_test_context", + "action": "Load test context package", + "commands": ["Read('.workflow/active/WFS-test-{session}/.process/test-context-package.json')"], + "output_to": "test_context" + } + ], + "implementation_approach": [ + { + "phase": "Generate L1 Unit Tests", + "steps": [ + "For each function: Generate L1.1 (happy path), L1.2 (negative), L1.3 (edge cases), L1.4 (state), L1.5 (async)" + ], + "test_patterns": "render(), screen.getByRole(), userEvent.click(), waitFor()" + }, + { + "phase": "Generate L2 Integration Tests", + "steps": [ + "Generate L2.1 (module wiring), L2.2 (API contracts), L2.5 (failure modes)" + ], + "test_patterns": "supertest(app), expect(res.status), expect(res.body)" + } + ], + "target_files": [ + "tests/components/ComponentA.test.tsx", + "tests/components/ComponentB.test.tsx", + "tests/api/auth.integration.test.ts" + ], + "reusable_test_tools": [ + "tests/helpers/renderWithProviders.tsx", + "tests/fixtures/mockData.ts" + ], + "test_commands": { + "run_tests": "npm test", + "run_coverage": "npm test -- --coverage" + } + } +} +``` + +**Task 2: IMPL-001.3-validation.json (Code Validation Gate)** +```json +{ + "id": "IMPL-001.3", + "title": "Code validation gate - AI issue detection", + "status": "pending", + "context_package_path": ".workflow/active/WFS-test-{session}/.process/test-context-package.json", + "cli_execution_id": "WFS-test-{session}-IMPL-001.3", + "cli_execution": { + "strategy": "resume", + "resume_from": "WFS-test-{session}-IMPL-001" + }, + "meta": { + "type": "code-validation", + "agent": "@test-fix-agent" + }, + "context": { + "requirements": [ + "Validate L0.1-L0.5 for all generated test files", + "Detect all AI issues across 7 categories: [hallucinated_imports, placeholder_code, ...]", + "Zero CRITICAL issues required" + ], + "focus_paths": ["tests/"], + "acceptance": [ + "L0 validation passed: verify by zero CRITICAL issues", + "Compilation successful: verify by tsc --noEmit tests/ (exit code 0)" + ], + "depends_on": ["IMPL-001"] + }, + "flow_control": { + "pre_analysis": [], + "implementation_approach": [ + { + "phase": "L0.1 Compilation Check", + "validation": "tsc --noEmit tests/" + }, + { + "phase": "L0.2 Import Validity", + "validation": "Check all imports against package.json and node_modules" + }, + { + "phase": "L0.5 AI Issue Detection", + "validation": "Scan for all 7 AI issue categories with severity levels" + } + ], + "target_files": [], + "ai_issue_scan": { + "categories": [ + "hallucinated_imports", + "placeholder_code", + "mock_leakage", + "type_abuse", + "naming_issues", + "control_flow", + "resource_leaks", + "security_issues" + ], + "severity_levels": ["CRITICAL", "ERROR", "WARNING"], + "auto_fix_enabled": true, + "max_retries": 2, + "thresholds": { + "critical": 0, + "error": 3, + "warning": 10 + } + } + } +} +``` + +**Task 3: IMPL-001.5-review.json (Test Quality Gate)** +```json +{ + "id": "IMPL-001.5", + "title": "Test quality gate - anti-patterns and coverage", + "status": "pending", + "context_package_path": ".workflow/active/WFS-test-{session}/.process/test-context-package.json", + "cli_execution_id": "WFS-test-{session}-IMPL-001.5", + "cli_execution": { + "strategy": "resume", + "resume_from": "WFS-test-{session}-IMPL-001.3" + }, + "meta": { + "type": "test-quality-review", + "agent": "@test-fix-agent" + }, + "context": { + "requirements": [ + "Validate layer completeness: L1.1 100%, L1.2 80%, L1.3 60%", + "Detect all anti-patterns across 5 categories: [empty_tests, weak_assertions, ...]", + "Verify coverage: line ≥80%, branch ≥70%, function ≥90%" + ], + "focus_paths": ["tests/"], + "acceptance": [ + "Coverage ≥80%: verify by npm test -- --coverage | grep 'All files.*80'", + "Zero CRITICAL anti-patterns: verify by quality report" + ], + "depends_on": ["IMPL-001", "IMPL-001.3"] + }, + "flow_control": { + "pre_analysis": [], + "implementation_approach": [ + { + "phase": "Static Analysis", + "validation": "Lint test files, check anti-patterns" + }, + { + "phase": "Coverage Analysis", + "validation": "Calculate coverage percentage, identify gaps" + }, + { + "phase": "Quality Metrics", + "validation": "Verify thresholds, layer completeness" + } + ], + "target_files": [], + "quality_gates": { + "layer_completeness": { + "L1.1": "100%", + "L1.2": "80%", + "L1.3": "60%", + "L1.4": "80%", + "L1.5": "100%", + "L2": "70%" + }, + "anti_patterns": [ + "empty_tests", + "weak_assertions", + "test_isolation", + "incomplete_coverage", + "ai_generated_issues" + ], + "coverage_thresholds": { + "line": "80%", + "branch": "70%", + "function": "90%" + } + } + } +} +``` + +**Task 4: IMPL-002.json (Test Execution & Fix)** +```json +{ + "id": "IMPL-002", + "title": "Test execution and fix cycle", + "status": "pending", + "context_package_path": ".workflow/active/WFS-test-{session}/.process/test-context-package.json", + "cli_execution_id": "WFS-test-{session}-IMPL-002", + "cli_execution": { + "strategy": "resume", + "resume_from": "WFS-test-{session}-IMPL-001.5" + }, + "meta": { + "type": "test-fix", + "agent": "@test-fix-agent" + }, + "context": { + "requirements": [ + "Execute all tests and fix failures until pass rate ≥95%", + "Maximum 5 fix iterations", + "Use Gemini for diagnosis, agent for fixes" + ], + "focus_paths": ["tests/", "src/"], + "acceptance": [ + "All tests pass: verify by npm test (exit code 0)", + "Pass rate ≥95%: verify by test output" + ], + "depends_on": ["IMPL-001", "IMPL-001.3", "IMPL-001.5"] + }, + "flow_control": { + "pre_analysis": [], + "implementation_approach": [ + { + "phase": "Initial Test Execution", + "command": "npm test" + }, + { + "phase": "Iterative Fix Cycle", + "steps": [ + "Diagnose failures with Gemini", + "Apply fixes via agent or CLI", + "Re-run tests", + "Repeat until pass rate ≥95% or max iterations" + ], + "max_iterations": 5 + } + ], + "target_files": [], + "test_fix_cycle": { + "max_iterations": 5, + "diagnosis_tool": "gemini", + "fix_mode": "agent", + "exit_conditions": ["all_tests_pass", "max_iterations_reached"] + } + } +} +``` + +#### Phase 3: Document Generation + +``` +1. Create IMPL_PLAN.md (test-specific variant) + - frontmatter: workflow_type="test_session", test_framework, coverage_targets + - Test Generation Phase: L1-L3 layer breakdown + - Quality Gates: IMPL-001.3 and IMPL-001.5 specifications + - Test-Fix Cycle: Iteration strategy with diagnosis and fix modes + - Source Session Context: If exists (from source_session_id) + +2. Create TODO_LIST.md + - Hierarchical structure with test phase containers + - Links to task JSONs with status markers + - Test layer indicators (L0, L1, L2, L3) + - Quality gate indicators (validation, review) +``` + +--- + +## 2. Output Validation + +### Task JSON Validation + +**IMPL-001 Requirements**: +- All L1.1-L1.5 tests explicitly defined for each target function +- Project type template correctly applied +- Reusable test tools and test commands included +- Implementation approach includes all 3 phases (L1, L2, L3) + +**IMPL-001.3 Requirements**: +- All 7 AI issue categories included +- Severity levels properly assigned +- Auto-fix logic for ERROR and below +- Acceptance criteria references zero CRITICAL rule + +**IMPL-001.5 Requirements**: +- Layer completeness thresholds: L1.1 100%, L1.2 80%, L1.3 60% +- All 5 anti-pattern categories included +- Coverage metrics: Line 80%, Branch 70%, Function 90% +- Acceptance criteria references all thresholds + +**IMPL-002 Requirements**: +- Depends on: IMPL-001, IMPL-001.3, IMPL-001.5 (sequential) +- Max iterations: 5 +- Diagnosis tool: Gemini +- Exit conditions: all_tests_pass OR max_iterations_reached + +### Quality Standards + +Hard Constraints: +- Task count: minimum 4, maximum 18 +- All requirements quantified from TEST_ANALYSIS_RESULTS.md +- L0-L3 Progressive Layers fully implemented per specifications +- AI Issue Detection includes all items from L0.5 checklist +- Project Type Template correctly applied +- Test Anti-Patterns validation rules implemented +- Layer Completeness Thresholds met +- Quality Metrics targets: Line 80%, Branch 70%, Function 90% + +--- + +## 3. Success Criteria + +- All test planning documents generated successfully +- Task count reported: minimum 4 +- Test framework correctly detected and reported +- Coverage targets clearly specified: L0 zero errors, L1 80%+, L2 70%+ +- L0-L3 layers explicitly defined in IMPL-001 task +- AI issue detection configured in IMPL-001.3 +- Quality gates with measurable thresholds in IMPL-001.5 +- Source session status reported (if applicable) diff --git a/.claude/commands/workflow/test-fix-gen.md b/.claude/commands/workflow/test-fix-gen.md index 33c7e207..b182ca21 100644 --- a/.claude/commands/workflow/test-fix-gen.md +++ b/.claude/commands/workflow/test-fix-gen.md @@ -1,200 +1,264 @@ --- name: test-fix-gen -description: Create test-fix workflow session from session ID, description, or file path with test strategy generation and task planning +description: Create test-fix workflow session with progressive test layers (L0-L3), AI code validation, and test task generation argument-hint: "(source-session-id | \"feature description\" | /path/to/file.md)" allowed-tools: SlashCommand(*), TodoWrite(*), Read(*), Bash(*) +group: workflow --- # Workflow Test-Fix Generation Command (/workflow:test-fix-gen) -## Quick Reference +## Coordinator Role -### Command Scope +**This command is a pure orchestrator**: Execute 5 slash commands in sequence, parse their outputs, pass context between them, and ensure complete execution through **automatic continuation**. -| Aspect | Description | -|--------|-------------| -| **Purpose** | Generate test-fix workflow session with task JSON files | -| **Output** | IMPL-001.json, IMPL-001.3-validation.json, IMPL-001.5-review.json, IMPL-002.json | -| **Does NOT** | Execute tests, apply fixes, handle test failures | -| **Next Step** | Must call `/workflow:test-cycle-execute` after this command | +**Execution Model - Auto-Continue Workflow**: -### Task Pipeline +This workflow runs **fully autonomously** once triggered. Phase 3 (test analysis) and Phase 4 (task generation) are delegated to specialized agents. -``` -IMPL-001 (Test Generation) → IMPL-001.3 (Code Validation) → IMPL-001.5 (Test Quality) → IMPL-002 (Test Execution) - @code-developer @test-fix-agent @test-fix-agent @test-fix-agent -``` +1. **User triggers**: `/workflow:test-fix-gen "task"` or `/workflow:test-fix-gen WFS-source-session` +2. **Phase 1 executes** → Test session created → Auto-continues +3. **Phase 2 executes** → Context gathering → Auto-continues +4. **Phase 3 executes** → Test generation analysis (Gemini) → Auto-continues +5. **Phase 4 executes** → Task generation (test-task-generate) → Reports final summary -### Coordinator Role +**Task Attachment Model**: +- SlashCommand execute **expands workflow** by attaching sub-tasks to current TodoWrite +- When a sub-command is executed, its internal tasks are attached to the orchestrator's TodoWrite +- Orchestrator **executes these attached tasks** sequentially +- After completion, attached tasks are **collapsed** back to high-level phase summary +- This is **task expansion**, not external delegation -This command is a **pure planning coordinator**: -- ONLY coordinates slash commands to generate task JSON files -- Does NOT analyze code, generate tests, execute tests, or apply fixes -- All execution delegated to `/workflow:test-cycle-execute` +**Auto-Continue Mechanism**: +- TodoList tracks current phase status and dynamically manages task attachment/collapse +- When each phase finishes executing, automatically execute next pending phase +- All phases run autonomously without user interaction +- **⚠️ CONTINUOUS EXECUTION** - Do not stop until all phases complete -### Core Principles +## Core Rules -| Principle | Description | -|-----------|-------------| -| **Session Isolation** | Creates independent `WFS-test-[slug]` session | -| **Context-First** | Gathers implementation context via appropriate method | -| **Format Reuse** | Creates standard `IMPL-*.json` tasks with `meta.type: "test-fix"` | -| **Semantic CLI Selection** | CLI tool usage determined from user's task description | -| **Automatic Detection** | Input pattern determines execution mode | +1. **Start Immediately**: First action is TodoWrite initialization, second action is Phase 1 command execution +2. **No Preliminary Analysis**: Do not read files, analyze structure, or gather context before Phase 1 +3. **Parse Every Output**: Extract required data from each command output for next phase +4. **Auto-Continue via TodoList**: Check TodoList status to execute next pending phase automatically +5. **Track Progress**: Update TodoWrite dynamically with task attachment/collapse pattern +6. **Task Attachment Model**: SlashCommand execute **attaches** sub-tasks to current workflow. Orchestrator **executes** these attached tasks itself, then **collapses** them after completion +7. **⚠️ CRITICAL: DO NOT STOP**: Continuous multi-phase workflow. After executing all attached tasks, immediately collapse them and execute next phase --- -## Usage +## Test Strategy Overview -### Command Syntax +This workflow generates tests using **Progressive Test Layers (L0-L3)**: -```bash -/workflow:test-fix-gen +| Layer | Name | Focus | +|-------|------|-------| +| **L0** | Static Analysis | Compilation, imports, types, AI code issues | +| **L1** | Unit Tests | Function/class behavior (happy/negative/edge cases) | +| **L2** | Integration Tests | Component interactions, API contracts, failure modes | +| **L3** | E2E Tests | User journeys, critical paths (optional) | + +**Key Features**: +- **AI Code Issue Detection** - Validates against common AI-generated code problems (hallucinated imports, placeholder code, mock leakage, etc.) +- **Project Type Detection** - Applies appropriate test templates (React, Node API, CLI, Library, etc.) +- **Quality Gates** - IMPL-001.3 (code validation) and IMPL-001.5 (test quality) ensure high standards + +**Detailed specifications**: See `/workflow:tools:test-task-generate` for complete L0-L3 requirements and quality thresholds. + +--- + +## Execution Process -# INPUT can be: -# - Session ID: WFS-user-auth-v2 -# - Description: "Test the user authentication API" -# - File path: ./docs/api-requirements.md ``` +Input Parsing: + ├─ Detect input type: Session ID (WFS-*) | Description | File path + └─ Set MODE: session | prompt -### Mode Detection +Phase 1: Create Test Session + └─ /workflow:session:start --type test --new "structured-description" + └─ Output: testSessionId (WFS-test-xxx) -**Automatic mode detection** based on input pattern: +Phase 2: Gather Test Context + ├─ MODE=session → /workflow:tools:test-context-gather --session testSessionId + └─ MODE=prompt → /workflow:tools:context-gather --session testSessionId "description" + └─ Output: contextPath (context-package.json) -```bash -if [[ "$input" == WFS-* ]]; then - MODE="session" # Use test-context-gather -else - MODE="prompt" # Use context-gather -fi -``` +Phase 3: Test Generation Analysis + └─ /workflow:tools:test-concept-enhanced --session testSessionId --context contextPath + └─ Output: TEST_ANALYSIS_RESULTS.md (L0-L3 requirements) -| Mode | Input Pattern | Context Source | Use Case | -|------|--------------|----------------|----------| -| **Session** | `WFS-xxx` | Source session summaries | Test validation for completed workflow | -| **Prompt** | Text or file path | Direct codebase analysis | Ad-hoc test generation | +Phase 4: Generate Test Tasks + └─ /workflow:tools:test-task-generate --session testSessionId + └─ Output: IMPL_PLAN.md, IMPL-*.json (4+ tasks), TODO_LIST.md -### Examples - -```bash -# Session Mode - test validation for completed implementation -/workflow:test-fix-gen WFS-user-auth-v2 - -# Prompt Mode - text description -/workflow:test-fix-gen "Test the user authentication API endpoints in src/auth/api.ts" - -# Prompt Mode - file reference -/workflow:test-fix-gen ./docs/api-requirements.md - -# With CLI tool preference (semantic detection) -/workflow:test-fix-gen "Test user registration, use Codex for automated fixes" +Phase 5: Return Summary + └─ Summary with next steps → /workflow:test-cycle-execute ``` --- -## Execution Phases - -### Execution Rules - -1. **Start Immediately**: First action is TodoWrite, second is Phase 1 execution -2. **No Preliminary Analysis**: Do not read files before Phase 1 -3. **Parse Every Output**: Extract required data from each phase for next phase -4. **Sequential Execution**: Each phase depends on previous phase's output -5. **Complete All Phases**: Do not return until Phase 5 completes -6. **⚠️ CONTINUOUS EXECUTION**: Do not stop between phases +## 5-Phase Execution ### Phase 1: Create Test Session -**Execute**: -```javascript -// Session Mode - preserve original task description -Read(".workflow/active/[sourceSessionId]/workflow-session.json") -SlashCommand("/workflow:session:start --type test --new \"Test validation for [sourceSessionId]: [originalTaskDescription]\"") +**Step 1.0: Detect Input Mode** -// Prompt Mode - use user's description directly -SlashCommand("/workflow:session:start --type test --new \"Test generation for: [description]\"") +```javascript +// Automatic mode detection based on input pattern +if (input.startsWith("WFS-")) { + MODE = "session" + // Load source session to preserve original task description + Read(".workflow/active/[sourceSessionId]/workflow-session.json") +} else { + MODE = "prompt" +} ``` -**Output**: `testSessionId` (pattern: `WFS-test-[slug]`) +**Step 1.1: Execute** - Create test workflow session + +```javascript +// Session Mode - preserve original task description +SlashCommand(command="/workflow:session:start --type test --new \"Test validation for [sourceSessionId]: [originalTaskDescription]\"") + +// Prompt Mode - use user's description directly +SlashCommand(command="/workflow:session:start --type test --new \"Test generation for: [description]\"") +``` + +**Parse Output**: +- Extract: `SESSION_ID: WFS-test-[slug]` (store as `testSessionId`) **Validation**: -- Session Mode: Source session exists with completed IMPL tasks +- Session Mode: Source session `.workflow/active/[sourceSessionId]/` exists with completed IMPL tasks - Both Modes: New test session directory created with metadata +**TodoWrite**: Mark phase 1 completed, phase 2 in_progress + --- ### Phase 2: Gather Test Context -**Execute**: -```javascript -// Session Mode -SlashCommand("/workflow:tools:test-context-gather --session [testSessionId]") +**Step 2.1: Execute** - Gather context based on mode -// Prompt Mode -SlashCommand("/workflow:tools:context-gather --session [testSessionId] \"[task_description]\"") +```javascript +// Session Mode - gather from source session +SlashCommand(command="/workflow:tools:test-context-gather --session [testSessionId]") + +// Prompt Mode - gather from codebase +SlashCommand(command="/workflow:tools:context-gather --session [testSessionId] \"[task_description]\"") ``` -**Expected Behavior**: -- **Session Mode**: Load source session summaries, analyze test coverage -- **Prompt Mode**: Analyze codebase from description -- Both: Detect test framework, generate context package +**Input**: `testSessionId` from Phase 1 -**Output**: `contextPath` (pattern: `.workflow/[testSessionId]/.process/[test-]context-package.json`) +**Parse Output**: +- Extract: context package path (store as `contextPath`) +- Pattern: `.workflow/active/[testSessionId]/.process/[test-]context-package.json` + +**Validation**: +- Context package file exists and is valid JSON +- Contains coverage analysis (session mode) or codebase analysis (prompt mode) +- Test framework detected + +**TodoWrite Update (tasks attached)**: +```json +[ + {"content": "Phase 1: Create Test Session", "status": "completed"}, + {"content": "Phase 2: Gather Test Context", "status": "in_progress"}, + {"content": " → Load source/codebase context", "status": "in_progress"}, + {"content": " → Analyze test coverage", "status": "pending"}, + {"content": " → Generate context package", "status": "pending"}, + {"content": "Phase 3: Test Generation Analysis", "status": "pending"}, + {"content": "Phase 4: Generate Test Tasks", "status": "pending"}, + {"content": "Phase 5: Return Summary", "status": "pending"} +] +``` + +**TodoWrite Update (tasks collapsed)**: +```json +[ + {"content": "Phase 1: Create Test Session", "status": "completed"}, + {"content": "Phase 2: Gather Test Context", "status": "completed"}, + {"content": "Phase 3: Test Generation Analysis", "status": "pending"}, + {"content": "Phase 4: Generate Test Tasks", "status": "pending"}, + {"content": "Phase 5: Return Summary", "status": "pending"} +] +``` --- ### Phase 3: Test Generation Analysis -**Execute**: +**Step 3.1: Execute** - Analyze test requirements with Gemini + ```javascript -SlashCommand("/workflow:tools:test-concept-enhanced --session [testSessionId] --context [contextPath]") +SlashCommand(command="/workflow:tools:test-concept-enhanced --session [testSessionId] --context [contextPath]") ``` +**Input**: +- `testSessionId` from Phase 1 +- `contextPath` from Phase 2 + **Expected Behavior**: - Use Gemini to analyze coverage gaps -- Generate **multi-layered test requirements**: - - L0: Static Analysis (linting, type checking, anti-pattern detection) - - L1: Unit Tests (happy path, negative path, edge cases: null/undefined/empty) - - L2: Integration Tests (component interactions, failure scenarios: timeout/unavailable) - - L3: E2E Tests (user journeys, if applicable) +- Detect project type and apply appropriate test templates +- Generate **multi-layered test requirements** (L0-L3) +- Scan for AI code issues - Generate `TEST_ANALYSIS_RESULTS.md` **Output**: `.workflow/[testSessionId]/.process/TEST_ANALYSIS_RESULTS.md` **Validation** - TEST_ANALYSIS_RESULTS.md must include: -- Coverage Assessment +- Project Type Detection (with confidence) +- Coverage Assessment (current vs target) - Test Framework & Conventions - Multi-Layered Test Plan (L0-L3) +- AI Issue Scan Results - Test Requirements by File (with layer annotations) -- Test Generation Strategy -- Implementation Targets -- Quality Assurance Criteria: - - Minimum coverage thresholds - - Required test types per function - - Acceptance criteria for test quality +- Quality Assurance Criteria - Success Criteria +**Note**: Detailed specifications for project types, L0-L3 layers, and AI issue detection are defined in `/workflow:tools:test-concept-enhanced`. + --- ### Phase 4: Generate Test Tasks -**Execute**: +**Step 4.1: Execute** - Generate test planning documents + ```javascript -SlashCommand("/workflow:tools:test-task-generate --session [testSessionId]") +SlashCommand(command="/workflow:tools:test-task-generate --session [testSessionId]") ``` -**Expected Behavior**: -- Parse TEST_ANALYSIS_RESULTS.md -- Generate **minimum 4 task JSON files**: - - IMPL-001.json (Test Generation) - - IMPL-001.3-validation.json (Code Validation Gate) - - IMPL-001.5-review.json (Test Quality Gate) - - IMPL-002.json (Test Execution & Fix) -- Generate IMPL_PLAN.md and TODO_LIST.md +**Input**: `testSessionId` from Phase 1 -**Output Validation**: -- Verify all `.task/IMPL-*.json` files exist -- Verify `IMPL_PLAN.md` and `TODO_LIST.md` created +**Note**: test-task-generate invokes action-planning-agent to generate test-specific IMPL_PLAN.md and task JSONs based on TEST_ANALYSIS_RESULTS.md. + +**Expected Output** (minimum 4 tasks): + +| Task | Type | Agent | Purpose | +|------|------|-------|---------| +| IMPL-001 | test-gen | @code-developer | Test understanding & generation (L1-L3) | +| IMPL-001.3 | code-validation | @test-fix-agent | Code validation gate (L0 + AI issues) | +| IMPL-001.5 | test-quality-review | @test-fix-agent | Test quality gate | +| IMPL-002 | test-fix | @test-fix-agent | Test execution & fix cycle | + +**Validation**: +- `.workflow/active/[testSessionId]/.task/IMPL-001.json` exists +- `.workflow/active/[testSessionId]/.task/IMPL-001.3-validation.json` exists +- `.workflow/active/[testSessionId]/.task/IMPL-001.5-review.json` exists +- `.workflow/active/[testSessionId]/.task/IMPL-002.json` exists +- `.workflow/active/[testSessionId]/IMPL_PLAN.md` exists +- `.workflow/active/[testSessionId]/TODO_LIST.md` exists + +**TodoWrite Update (agent task attached)**: +```json +[ + {"content": "Phase 1: Create Test Session", "status": "completed"}, + {"content": "Phase 2: Gather Test Context", "status": "completed"}, + {"content": "Phase 3: Test Generation Analysis", "status": "completed"}, + {"content": "Phase 4: Generate Test Tasks", "status": "in_progress"}, + {"content": "Phase 5: Return Summary", "status": "pending"} +] +``` --- @@ -202,7 +266,7 @@ SlashCommand("/workflow:tools:test-task-generate --session [testSessionId]") **Return to User**: ``` -Independent test-fix workflow created successfully! +Test-fix workflow created successfully! Input: [original input] Mode: [Session|Prompt] @@ -215,148 +279,104 @@ Tasks Created: - IMPL-002: Test Execution & Fix Cycle (@test-fix-agent) Quality Thresholds: -- Code Validation: Zero compilation/import/variable errors -- Minimum Coverage: 80% -- Static Analysis: Zero critical issues +- Code Validation: Zero CRITICAL issues, zero compilation errors +- Minimum Coverage: 80% line, 70% branch +- Static Analysis: Zero critical anti-patterns - Max Fix Iterations: 5 Review artifacts: - Test plan: .workflow/[testSessionId]/IMPL_PLAN.md - Task list: .workflow/[testSessionId]/TODO_LIST.md -- Validation config: ~/.claude/workflows/test-quality-config.json +- Analysis: .workflow/[testSessionId]/.process/TEST_ANALYSIS_RESULTS.md -CRITICAL - Next Steps: -1. Review IMPL_PLAN.md -2. **MUST execute: /workflow:test-cycle-execute** +CRITICAL - Next Step: + /workflow:test-cycle-execute --session [testSessionId] ``` --- -## Task Specifications +## Data Flow -Generates minimum 4 tasks (expandable for complex projects): - -### IMPL-001: Test Understanding & Generation - -| Field | Value | -|-------|-------| -| **Agent** | `@code-developer` | -| **Type** | `test-gen` | -| **Depends On** | None | - -**Purpose**: Understand source implementation and generate test files following multi-layered test strategy - -**Execution Flow**: -1. **Understand**: Load TEST_ANALYSIS_RESULTS.md, analyze requirements (L0-L3) -2. **Generate**: Create test files (unit, integration, E2E as applicable) -3. **Verify**: Check test completeness, meaningful assertions, no anti-patterns - ---- - -### IMPL-001.3: Code Validation Gate - -| Field | Value | -|-------|-------| -| **Agent** | `@test-fix-agent` | -| **Type** | `code-validation` | -| **Depends On** | `["IMPL-001"]` | -| **Config** | `~/.claude/workflows/test-quality-config.json` | - -**Purpose**: Validate AI-generated code for common errors before test execution - -**Validation Phases**: -| Phase | Checks | -|-------|--------| -| L0.1 Compilation | `tsc --noEmit` - syntax errors, module resolution | -| L0.2 Imports | Unresolved/hallucinated packages, circular deps, duplicates | -| L0.3 Variables | Redeclaration, scope conflicts, undefined/unused vars | -| L0.4 Types | Type mismatches, missing definitions, `any` abuse | -| L0.5 AI-Specific | Placeholder code, mock in production, naming inconsistency | - -**Gate Decision**: -| Decision | Condition | Action | -|----------|-----------|--------| -| **PASS** | critical=0, error≤3, warning≤10 | Proceed to IMPL-001.5 | -| **SOFT_FAIL** | Fixable issues | Auto-fix and retry (max 2) | -| **HARD_FAIL** | critical>0 OR max retries | Block with report | - -**Acceptance Criteria**: -- Zero compilation errors -- All imports resolvable -- No variable redeclarations -- No undefined variable usage - -**Output**: `.process/code-validation-report.md`, `.process/code-validation-report.json` - ---- - -### IMPL-001.5: Test Quality Gate - -| Field | Value | -|-------|-------| -| **Agent** | `@test-fix-agent` | -| **Type** | `test-quality-review` | -| **Depends On** | `["IMPL-001", "IMPL-001.3"]` | -| **Config** | `~/.claude/workflows/test-quality-config.json` | - -**Purpose**: Validate test quality before entering fix cycle - -**Execution Flow**: -1. **Static Analysis**: Lint test files, check anti-patterns (empty tests, missing assertions) -2. **Coverage Analysis**: Calculate coverage percentage, identify gaps -3. **Quality Metrics**: Verify thresholds, negative test coverage -4. **Gate Decision**: PASS (proceed) or FAIL (loop back to IMPL-001) - -**Acceptance Criteria**: -- Coverage ≥ 80% -- Zero critical anti-patterns -- All targeted functions have unit tests -- Each public API has error handling test - -**Failure Handling**: -If quality gate fails: -1. Generate detailed feedback report (`.process/test-quality-report.md`) -2. Update IMPL-001 task with specific improvement requirements -3. Trigger IMPL-001 re-execution with enhanced context -4. Maximum 2 quality gate retries before escalating to user - -**Output**: `.process/test-quality-report.md` - ---- - -### IMPL-002: Test Execution & Fix Cycle - -| Field | Value | -|-------|-------| -| **Agent** | `@test-fix-agent` | -| **Type** | `test-fix` | -| **Depends On** | `["IMPL-001", "IMPL-001.3", "IMPL-001.5"]` | - -**Purpose**: Execute tests and trigger orchestrator-managed fix cycles - -**Note**: The agent executes tests and reports results. The `test-cycle-execute` orchestrator manages all fix iterations. - -**Cycle Pattern** (orchestrator-managed): ``` -test → gemini_diagnose → fix (agent or CLI) → retest +User Input (session ID | description | file path) + ↓ +[Detect Mode: session | prompt] + ↓ +Phase 1: session:start --type test --new "description" + ↓ Output: testSessionId + ↓ +Phase 2: test-context-gather | context-gather + ↓ Input: testSessionId + ↓ Output: contextPath (context-package.json) + ↓ +Phase 3: test-concept-enhanced + ↓ Input: testSessionId + contextPath + ↓ Output: TEST_ANALYSIS_RESULTS.md (L0-L3 requirements + AI issues) + ↓ +Phase 4: test-task-generate + ↓ Input: testSessionId + TEST_ANALYSIS_RESULTS.md + ↓ Output: IMPL_PLAN.md, IMPL-*.json (4+), TODO_LIST.md + ↓ +Phase 5: Return summary to user + ↓ +Next: /workflow:test-cycle-execute ``` -**Tools Configuration** (orchestrator-controlled): -- Gemini for analysis with bug-fix template → surgical fix suggestions -- Agent fix application (default) OR CLI if `command` field present in implementation_approach - -**Exit Conditions**: -- Success: All tests pass -- Failure: Max iterations reached (5) - --- -### IMPL-003+: Additional Tasks (Optional) +## Execution Flow Diagram -**Scenarios**: -- Large projects requiring per-module test generation -- Separate integration vs unit test tasks -- Specialized test types (performance, security) +``` +User triggers: /workflow:test-fix-gen "Test user authentication" + ↓ +[Input Detection] → MODE: prompt + ↓ +[TodoWrite Init] 5 orchestrator-level tasks + ↓ +Phase 1: Create Test Session + → /workflow:session:start --type test + → testSessionId extracted (WFS-test-user-auth) + ↓ +Phase 2: Gather Test Context (SlashCommand executed) + → ATTACH 3 sub-tasks: ← ATTACHED + - → Load codebase context + - → Analyze test coverage + - → Generate context package + → Execute sub-tasks sequentially + → COLLAPSE tasks ← COLLAPSED + → contextPath extracted + ↓ +Phase 3: Test Generation Analysis (SlashCommand executed) + → ATTACH 3 sub-tasks: ← ATTACHED + - → Analyze coverage gaps with Gemini + - → Detect AI code issues (L0.5) + - → Generate L0-L3 test requirements + → Execute sub-tasks sequentially + → COLLAPSE tasks ← COLLAPSED + → TEST_ANALYSIS_RESULTS.md created + ↓ +Phase 4: Generate Test Tasks (SlashCommand executed) + → Single agent task (test-task-generate → action-planning-agent) + → Agent autonomously generates: + - IMPL-001.json (test generation) + - IMPL-001.3-validation.json (code validation) + - IMPL-001.5-review.json (test quality) + - IMPL-002.json (test execution) + - IMPL_PLAN.md + - TODO_LIST.md + ↓ +Phase 5: Return Summary + → Display summary with next steps + → Command ends + +Task Pipeline (for execution): +┌──────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────┐ +│ IMPL-001 │───→│ IMPL-001.3 │───→│ IMPL-001.5 │───→│ IMPL-002 │ +│ Test Gen │ │ Code Validate │ │ Quality Gate │ │ Test & Fix │ +│ L1-L3 │ │ L0 + AI Issues │ │ Coverage 80%+ │ │ Max 5 iter │ +│@code-developer│ │ @test-fix-agent │ │ @test-fix-agent │ │@test-fix-agent│ +└──────────────┘ └─────────────────┘ └─────────────────┘ └──────────────┘ +``` --- @@ -377,10 +397,7 @@ test → gemini_diagnose → fix (agent or CLI) → retest │ └── IMPL-*.json # Additional tasks (if applicable) └── .process/ ├── [test-]context-package.json # Context and coverage analysis - ├── TEST_ANALYSIS_RESULTS.md # Test requirements and strategy - ├── code-validation-report.md # Code validation findings - ├── code-validation-report.json # Machine-readable findings - └── test-quality-report.md # Test quality gate findings + └── TEST_ANALYSIS_RESULTS.md # Test requirements and strategy (L0-L3) ``` ### Session Metadata @@ -394,101 +411,67 @@ test → gemini_diagnose → fix (agent or CLI) → retest --- -## Orchestration Patterns - -### TodoWrite Pattern - -**Initial Structure**: -```json -[ - {"content": "Phase 1: Create Test Session", "status": "in_progress", "activeForm": "Creating test session"}, - {"content": "Phase 2: Gather Test Context", "status": "pending", "activeForm": "Gathering test context"}, - {"content": "Phase 3: Test Generation Analysis", "status": "pending", "activeForm": "Analyzing test generation"}, - {"content": "Phase 4: Generate Test Tasks", "status": "pending", "activeForm": "Generating test tasks"}, - {"content": "Phase 5: Return Summary", "status": "pending", "activeForm": "Completing"} -] -``` - -### Task Attachment Model - -SlashCommand execution follows **attach → execute → collapse** pattern: - -1. **Attach**: Sub-command's tasks are attached to orchestrator's TodoWrite -2. **Execute**: Orchestrator executes attached tasks sequentially -3. **Collapse**: After completion, sub-tasks collapse to phase summary - -**Example - Phase 2 Expanded**: -```json -[ - {"content": "Phase 1: Create Test Session", "status": "completed"}, - {"content": "Phase 2: Gather Test Context", "status": "in_progress"}, - {"content": " → Load context and analyze coverage", "status": "in_progress"}, - {"content": " → Detect test framework and conventions", "status": "pending"}, - {"content": " → Generate context package", "status": "pending"}, - {"content": "Phase 3: Test Generation Analysis", "status": "pending"}, - ... -] -``` - -### Auto-Continue Mechanism - -- TodoList tracks current phase status -- When phase completes, automatically execute next pending phase -- All phases run autonomously without user interaction -- **⚠️ Do not stop until all phases complete** - ---- - -## Reference - -### Error Handling +## Error Handling | Phase | Error Condition | Action | |-------|----------------|--------| -| 1 | Source session not found | Return error with session ID | -| 1 | No completed IMPL tasks | Return error, source incomplete | +| 1 | Source session not found (session mode) | Return error with session ID | +| 1 | No completed IMPL tasks (session mode) | Return error, source incomplete | | 2 | Context gathering failed | Return error, check source artifacts | | 3 | Gemini analysis failed | Return error, check context package | | 4 | Task generation failed | Retry once, then return error | -### Best Practices +--- -**Before Running**: -- Ensure implementation is complete (session mode: check summaries exist) -- Commit all implementation changes +## Coordinator Checklist -**After Running**: -- Review `IMPL_PLAN.md` before execution -- Check `TEST_ANALYSIS_RESULTS.md` for completeness -- Verify task dependencies in `TODO_LIST.md` +- Detect input type (session ID / description / file path) +- Initialize TodoWrite before any command +- Execute Phase 1 immediately with structured description +- Parse test session ID from Phase 1 output, store in memory +- Execute Phase 2 with appropriate context-gather command based on mode +- Parse context path from Phase 2 output, store in memory +- Execute Phase 3 test-concept-enhanced with session and context +- Verify TEST_ANALYSIS_RESULTS.md created with L0-L3 requirements +- Execute Phase 4 test-task-generate with session ID +- Verify all Phase 4 outputs (4 task JSONs, IMPL_PLAN.md, TODO_LIST.md) +- Return summary with next step: `/workflow:test-cycle-execute` +- Update TodoWrite after each phase -**During Execution** (in test-cycle-execute): -- Monitor iteration logs in `.process/fix-iteration-*` -- Track progress with `/workflow:status` -- Review Gemini diagnostic outputs +--- -**Mode Selection**: -- **Session Mode**: For completed workflow validation -- **Prompt Mode**: For ad-hoc test generation -- Include "use Codex" in description for autonomous fix application +## Usage Examples -### Related Commands +```bash +# Session Mode - test validation for completed implementation +/workflow:test-fix-gen WFS-user-auth-v2 -**Prerequisites**: +# Prompt Mode - text description +/workflow:test-fix-gen "Test the user authentication API endpoints in src/auth/api.ts" + +# Prompt Mode - file reference +/workflow:test-fix-gen ./docs/api-requirements.md + +# With CLI tool preference (semantic detection) +/workflow:test-fix-gen "Test user registration, use Codex for automated fixes" +``` + +--- + +## Related Commands + +**Prerequisite Commands**: - `/workflow:plan` or `/workflow:execute` - Complete implementation (Session Mode) - None for Prompt Mode -**Called by This Command**: -- `/workflow:session:start` - Phase 1 -- `/workflow:tools:test-context-gather` - Phase 2 (Session Mode) -- `/workflow:tools:context-gather` - Phase 2 (Prompt Mode) -- `/workflow:tools:test-concept-enhanced` - Phase 3 -- `/workflow:tools:test-task-generate` - Phase 4 - -**Validation Commands** (invoked during test-cycle-execute): -- `/workflow:tools:code-validation-gate` - IMPL-001.3 +**Called by This Command** (5 phases): +- `/workflow:session:start` - Phase 1: Create test workflow session +- `/workflow:tools:test-context-gather` - Phase 2 (Session Mode): Analyze test coverage +- `/workflow:tools:context-gather` - Phase 2 (Prompt Mode): Analyze codebase +- `/workflow:tools:test-concept-enhanced` - Phase 3: Generate test requirements with Gemini +- `/workflow:tools:test-task-generate` - Phase 4: Generate test task JSONs via action-planning-agent **Follow-up Commands**: - `/workflow:status` - Review generated tasks -- `/workflow:test-cycle-execute` - Execute test workflow -- `/workflow:execute` - Standard task execution +- `/workflow:test-cycle-execute` - Execute test workflow (REQUIRED next step) +- `/workflow:execute` - Alternative: Standard task execution diff --git a/.claude/commands/workflow/test-gen.md b/.claude/commands/workflow/test-gen.md deleted file mode 100644 index 11ba7379..00000000 --- a/.claude/commands/workflow/test-gen.md +++ /dev/null @@ -1,529 +0,0 @@ ---- -name: test-gen -description: Create independent test-fix workflow session from completed implementation session, analyzes code to generate test tasks -argument-hint: "source-session-id" -allowed-tools: SlashCommand(*), TodoWrite(*), Read(*), Bash(*) ---- - -# Workflow Test Generation Command (/workflow:test-gen) - -## Coordinator Role - -**This command is a pure orchestrator**: Creates an independent test-fix workflow session for validating a completed implementation. It reuses the standard planning toolchain with automatic cross-session context gathering. - -**Core Principles**: -- **Session Isolation**: Creates new `WFS-test-[source]` session to keep verification separate from implementation -- **Context-First**: Prioritizes gathering code changes and summaries from source session -- **Format Reuse**: Creates standard `IMPL-*.json` task, using `meta.type: "test-fix"` for agent assignment -- **Parameter Simplification**: Tools auto-detect test session type via metadata, no manual cross-session parameters needed -- **Semantic CLI Selection**: CLI tool usage is determined by user's task description (e.g., "use Codex for fixes") - -**Task Attachment Model**: -- SlashCommand dispatch **expands workflow** by attaching sub-tasks to current TodoWrite -- When a sub-command is executed (e.g., `/workflow:tools:test-context-gather`), its internal tasks are attached to the orchestrator's TodoWrite -- Orchestrator **executes these attached tasks** sequentially -- After completion, attached tasks are **collapsed** back to high-level phase summary -- This is **task expansion**, not external delegation - -**Auto-Continue Mechanism**: -- TodoList tracks current phase status and dynamically manages task attachment/collapse -- When each phase finishes executing, automatically execute next pending phase -- All phases run autonomously without user interaction -- **⚠️ CONTINUOUS EXECUTION** - Do not stop until all phases complete - -**Execution Flow**: -1. Initialize TodoWrite → Create test session → Parse session ID -2. Gather cross-session context (automatic) → Parse context path -3. Analyze implementation with concept-enhanced → Parse ANALYSIS_RESULTS.md -4. Generate test task from analysis → Return summary - -**Command Scope**: This command ONLY prepares test workflow artifacts. It does NOT execute tests or implementation. Task execution requires separate user action. - -## Core Rules - -1. **Start Immediately**: First action is TodoWrite initialization, second action is Phase 1 test session creation -2. **No Preliminary Analysis**: Do not read files or analyze before Phase 1 -3. **Parse Every Output**: Extract required data from each phase for next phase -4. **Sequential Execution**: Each phase depends on previous phase's output -5. **Complete All Phases**: Do not return to user until Phase 5 completes (summary returned) -6. **Track Progress**: Update TodoWrite dynamically with task attachment/collapse pattern -7. **Automatic Detection**: context-gather auto-detects test session and gathers source session context -8. **Semantic CLI Selection**: CLI tool usage determined from user's task description, passed to Phase 4 -9. **Command Boundary**: This command ends at Phase 5 summary. Test execution is NOT part of this command. -10. **Task Attachment Model**: SlashCommand dispatch **attaches** sub-tasks to current workflow. Orchestrator **executes** these attached tasks itself, then **collapses** them after completion -11. **⚠️ CRITICAL: DO NOT STOP**: Continuous multi-phase workflow. After executing all attached tasks, immediately collapse them and execute next phase - -## 5-Phase Execution - -### Phase 1: Create Test Session - -**Step 1.0: Load Source Session Intent** - Preserve user's original task description for semantic CLI selection - -```javascript -// Read source session metadata to get original task description -Read(".workflow/active/[sourceSessionId]/workflow-session.json") -// OR if context-package exists: -Read(".workflow/active/[sourceSessionId]/.process/context-package.json") - -// Extract: metadata.task_description or project/description field -// This preserves user's CLI tool preferences (e.g., "use Codex for fixes") -``` - -**Step 1.1: Execute** - Create new test workflow session with preserved intent - -```javascript -// Include original task description to enable semantic CLI selection -SlashCommand(command="/workflow:session:start --new \"Test validation for [sourceSessionId]: [originalTaskDescription]\"") -``` - -**Input**: -- `sourceSessionId` from user argument (e.g., `WFS-user-auth`) -- `originalTaskDescription` from source session metadata (preserves CLI tool preferences) - -**Expected Behavior**: -- Creates new session with pattern `WFS-test-[source-slug]` (e.g., `WFS-test-user-auth`) -- Writes metadata to `workflow-session.json`: - - `workflow_type: "test_session"` - - `source_session_id: "[sourceSessionId]"` - - Description includes original user intent for semantic CLI selection -- Returns new session ID for subsequent phases - -**Parse Output**: -- Extract: new test session ID (store as `testSessionId`) -- Pattern: `WFS-test-[slug]` - -**Validation**: -- Source session `.workflow/[sourceSessionId]/` exists -- Source session has completed IMPL tasks (`.summaries/IMPL-*-summary.md`) -- New test session directory created -- Metadata includes `workflow_type` and `source_session_id` - -**TodoWrite**: Mark phase 1 completed, phase 2 in_progress - ---- - -### Phase 2: Gather Test Context - -**Step 2.1: Execute** - Gather test coverage context from source session - -```javascript -SlashCommand(command="/workflow:tools:test-context-gather --session [testSessionId]") -``` - -**Input**: `testSessionId` from Phase 1 (e.g., `WFS-test-user-auth`) - -**Expected Behavior**: -- Load source session implementation context and summaries -- Analyze test coverage using MCP tools (find existing tests) -- Identify files requiring tests (coverage gaps) -- Detect test framework and conventions -- Generate `test-context-package.json` - -**Parse Output**: -- Extract: test context package path (store as `testContextPath`) -- Pattern: `.workflow/[testSessionId]/.process/test-context-package.json` - -**Validation**: -- Test context package created -- Contains source session summaries -- Includes coverage gap analysis -- Test framework detected -- Test conventions documented - - - -**TodoWrite Update (Phase 2 SlashCommand executed - tasks attached)**: -```json -[ - {"content": "Create independent test session", "status": "completed", "activeForm": "Creating test session"}, - {"content": "Phase 2.1: Load source session summaries (test-context-gather)", "status": "in_progress", "activeForm": "Loading source session summaries"}, - {"content": "Phase 2.2: Analyze test coverage with MCP tools (test-context-gather)", "status": "pending", "activeForm": "Analyzing test coverage"}, - {"content": "Phase 2.3: Identify coverage gaps and framework (test-context-gather)", "status": "pending", "activeForm": "Identifying coverage gaps"}, - {"content": "Analyze test requirements with Gemini", "status": "pending", "activeForm": "Analyzing test requirements"}, - {"content": "Generate test generation and execution tasks", "status": "pending", "activeForm": "Generating test tasks"}, - {"content": "Return workflow summary", "status": "pending", "activeForm": "Returning workflow summary"} -] -``` - -**Note**: SlashCommand dispatch **attaches** test-context-gather's 3 tasks. Orchestrator **executes** these tasks. - -**Next Action**: Tasks attached → **Execute Phase 2.1-2.3** sequentially - - - -**TodoWrite Update (Phase 2 completed - tasks collapsed)**: -```json -[ - {"content": "Create independent test session", "status": "completed", "activeForm": "Creating test session"}, - {"content": "Gather test coverage context", "status": "completed", "activeForm": "Gathering test coverage context"}, - {"content": "Analyze test requirements with Gemini", "status": "pending", "activeForm": "Analyzing test requirements"}, - {"content": "Generate test generation and execution tasks", "status": "pending", "activeForm": "Generating test tasks"}, - {"content": "Return workflow summary", "status": "pending", "activeForm": "Returning workflow summary"} -] -``` - -**Note**: Phase 2 tasks completed and collapsed to summary. - ---- - -### Phase 3: Test Generation Analysis - -**Step 3.1: Execute** - Analyze test requirements with Gemini - -```javascript -SlashCommand(command="/workflow:tools:test-concept-enhanced --session [testSessionId] --context [testContextPath]") -``` - -**Input**: -- `testSessionId` from Phase 1 -- `testContextPath` from Phase 2 - -**Expected Behavior**: -- Use Gemini to analyze coverage gaps and implementation context -- Study existing test patterns and conventions -- Generate test requirements for each missing test file -- Design test generation strategy -- Generate `TEST_ANALYSIS_RESULTS.md` - -**Parse Output**: -- Verify `.workflow/[testSessionId]/.process/TEST_ANALYSIS_RESULTS.md` created -- Contains test requirements and generation strategy -- Lists test files to create with specifications - -**Validation**: -- TEST_ANALYSIS_RESULTS.md exists with complete sections: - - Coverage Assessment - - Test Framework & Conventions - - Test Requirements by File - - Test Generation Strategy - - Implementation Targets (test files to create) - - Success Criteria - - - -**TodoWrite Update (Phase 3 SlashCommand executed - tasks attached)**: -```json -[ - {"content": "Create independent test session", "status": "completed", "activeForm": "Creating test session"}, - {"content": "Gather test coverage context", "status": "completed", "activeForm": "Gathering test coverage context"}, - {"content": "Phase 3.1: Analyze coverage gaps with Gemini (test-concept-enhanced)", "status": "in_progress", "activeForm": "Analyzing coverage gaps"}, - {"content": "Phase 3.2: Study existing test patterns (test-concept-enhanced)", "status": "pending", "activeForm": "Studying test patterns"}, - {"content": "Phase 3.3: Generate test generation strategy (test-concept-enhanced)", "status": "pending", "activeForm": "Generating test strategy"}, - {"content": "Generate test generation and execution tasks", "status": "pending", "activeForm": "Generating test tasks"}, - {"content": "Return workflow summary", "status": "pending", "activeForm": "Returning workflow summary"} -] -``` - -**Note**: SlashCommand dispatch **attaches** test-concept-enhanced's 3 tasks. Orchestrator **executes** these tasks. - -**Next Action**: Tasks attached → **Execute Phase 3.1-3.3** sequentially - - - -**TodoWrite Update (Phase 3 completed - tasks collapsed)**: -```json -[ - {"content": "Create independent test session", "status": "completed", "activeForm": "Creating test session"}, - {"content": "Gather test coverage context", "status": "completed", "activeForm": "Gathering test coverage context"}, - {"content": "Analyze test requirements with Gemini", "status": "completed", "activeForm": "Analyzing test requirements"}, - {"content": "Generate test generation and execution tasks", "status": "pending", "activeForm": "Generating test tasks"}, - {"content": "Return workflow summary", "status": "pending", "activeForm": "Returning workflow summary"} -] -``` - -**Note**: Phase 3 tasks completed and collapsed to summary. - ---- - -### Phase 4: Generate Test Tasks - -**Step 4.1: Execute** - Generate test task JSON files and planning documents - -```javascript -SlashCommand(command="/workflow:tools:test-task-generate --session [testSessionId]") -``` - -**Input**: -- `testSessionId` from Phase 1 - -**Note**: CLI tool usage for fixes is determined semantically from user's task description (e.g., "use Codex for automated fixes"). - -**Expected Behavior**: -- Parse TEST_ANALYSIS_RESULTS.md from Phase 3 -- Extract test requirements and generation strategy -- Generate **TWO task JSON files**: - - **IMPL-001.json**: Test Generation task (calls @code-developer) - - **IMPL-002.json**: Test Execution and Fix Cycle task (calls @test-fix-agent) -- Generate IMPL_PLAN.md with test generation and execution strategy -- Generate TODO_LIST.md with both tasks - -**Parse Output**: -- Verify `.workflow/[testSessionId]/.task/IMPL-001.json` exists (test generation) -- Verify `.workflow/[testSessionId]/.task/IMPL-002.json` exists (test execution & fix) -- Verify `.workflow/[testSessionId]/IMPL_PLAN.md` created -- Verify `.workflow/[testSessionId]/TODO_LIST.md` created - -**Validation - IMPL-001.json (Test Generation)**: -- Task ID: `IMPL-001` -- `meta.type: "test-gen"` -- `meta.agent: "@code-developer"` -- `context.requirements`: Generate tests based on TEST_ANALYSIS_RESULTS.md -- `flow_control.pre_analysis`: Load TEST_ANALYSIS_RESULTS.md and test context -- `flow_control.implementation_approach`: Test generation steps -- `flow_control.target_files`: Test files to create from analysis section 5 - -**Validation - IMPL-002.json (Test Execution & Fix)**: -- Task ID: `IMPL-002` -- `meta.type: "test-fix"` -- `meta.agent: "@test-fix-agent"` -- `context.depends_on: ["IMPL-001"]` -- `context.requirements`: Execute and fix tests -- `flow_control.implementation_approach.test_fix_cycle`: Complete cycle specification - - **Cycle pattern**: test → gemini_diagnose → fix (agent or CLI based on `command` field) → retest - - **Tools configuration**: Gemini for analysis with bug-fix template, agent or CLI for fixes - - **Exit conditions**: Success (all pass) or failure (max iterations) -- `flow_control.implementation_approach.modification_points`: 3-phase execution flow - - Phase 1: Initial test execution - - Phase 2: Iterative Gemini diagnosis + fixes (agent or CLI based on step's `command` field) - - Phase 3: Final validation and certification - - - -**TodoWrite Update (Phase 4 SlashCommand executed - tasks attached)**: -```json -[ - {"content": "Create independent test session", "status": "completed", "activeForm": "Creating test session"}, - {"content": "Gather test coverage context", "status": "completed", "activeForm": "Gathering test coverage context"}, - {"content": "Analyze test requirements with Gemini", "status": "completed", "activeForm": "Analyzing test requirements"}, - {"content": "Phase 4.1: Parse TEST_ANALYSIS_RESULTS.md (test-task-generate)", "status": "in_progress", "activeForm": "Parsing test analysis"}, - {"content": "Phase 4.2: Generate IMPL-001.json and IMPL-002.json (test-task-generate)", "status": "pending", "activeForm": "Generating task JSONs"}, - {"content": "Phase 4.3: Generate IMPL_PLAN.md and TODO_LIST.md (test-task-generate)", "status": "pending", "activeForm": "Generating plan documents"}, - {"content": "Return workflow summary", "status": "pending", "activeForm": "Returning workflow summary"} -] -``` - -**Note**: SlashCommand dispatch **attaches** test-task-generate's 3 tasks. Orchestrator **executes** these tasks. - -**Next Action**: Tasks attached → **Execute Phase 4.1-4.3** sequentially - - - -**TodoWrite Update (Phase 4 completed - tasks collapsed)**: -```json -[ - {"content": "Create independent test session", "status": "completed", "activeForm": "Creating test session"}, - {"content": "Gather test coverage context", "status": "completed", "activeForm": "Gathering test coverage context"}, - {"content": "Analyze test requirements with Gemini", "status": "completed", "activeForm": "Analyzing test requirements"}, - {"content": "Generate test generation and execution tasks", "status": "completed", "activeForm": "Generating test tasks"}, - {"content": "Return workflow summary", "status": "in_progress", "activeForm": "Returning workflow summary"} -] -``` - -**Note**: Phase 4 tasks completed and collapsed to summary. - ---- - -### Phase 5: Return Summary (Command Ends Here) - -**Important**: This is the final phase of `/workflow:test-gen`. The command completes and returns control to the user. No automatic execution occurs. - -**Return to User**: -``` -Test workflow preparation complete! - -Source Session: [sourceSessionId] -Test Session: [testSessionId] - -Artifacts Created: -- Test context analysis -- Test generation strategy -- Task definitions (IMPL-001, IMPL-002) -- Implementation plan - -Test Framework: [detected framework] -Test Files to Generate: [count] -Fix Mode: [Agent|CLI] (based on `command` field in implementation_approach steps) - -Review Generated Artifacts: -- Test plan: .workflow/[testSessionId]/IMPL_PLAN.md -- Task list: .workflow/[testSessionId]/TODO_LIST.md -- Analysis: .workflow/[testSessionId]/.process/TEST_ANALYSIS_RESULTS.md - -Ready for execution. Use appropriate workflow commands to proceed. -``` - -**TodoWrite**: Mark phase 5 completed - -**Command Boundary**: After this phase, the command terminates and returns to user prompt. - ---- - -## TodoWrite Pattern - -**Core Concept**: Dynamic task attachment and collapse for test-gen workflow with cross-session context gathering and test generation strategy. - -### Key Principles - -1. **Task Attachment** (when SlashCommand executed): - - Sub-command's internal tasks are **attached** to orchestrator's TodoWrite - - Example: `/workflow:tools:test-context-gather` attaches 3 sub-tasks (Phase 2.1, 2.2, 2.3) - - First attached task marked as `in_progress`, others as `pending` - - Orchestrator **executes** these attached tasks sequentially - -2. **Task Collapse** (after sub-tasks complete): - - Remove detailed sub-tasks from TodoWrite - - **Collapse** to high-level phase summary - - Example: Phase 2.1-2.3 collapse to "Gather test coverage context: completed" - - Maintains clean orchestrator-level view - -3. **Continuous Execution**: - - After collapse, automatically proceed to next pending phase - - No user intervention required between phases - - TodoWrite dynamically reflects current execution state - -**Lifecycle Summary**: Initial pending tasks → Phase executed (tasks ATTACHED) → Sub-tasks executed sequentially → Phase completed (tasks COLLAPSED to summary) → Next phase begins → Repeat until all phases complete. - -### Test-Gen Specific Features - -- **Phase 2**: Cross-session context gathering from source implementation session -- **Phase 3**: Test requirements analysis with Gemini for generation strategy -- **Phase 4**: Dual-task generation (IMPL-001 for test generation, IMPL-002 for test execution) -- **Fix Mode Configuration**: CLI tool usage determined semantically from user's task description - - - -**Note**: See individual Phase descriptions (Phase 2, 3, 4) for detailed TodoWrite Update examples with full JSON structures. - -## Execution Flow Diagram - -``` -Test-Gen Workflow Orchestrator -│ -├─ Phase 1: Create Test Session -│ └─ /workflow:session:start --new -│ └─ Returns: testSessionId (WFS-test-[source]) -│ -├─ Phase 2: Gather Test Context ← ATTACHED (3 tasks) -│ └─ /workflow:tools:test-context-gather -│ ├─ Phase 2.1: Load source session summaries -│ ├─ Phase 2.2: Analyze test coverage with MCP tools -│ └─ Phase 2.3: Identify coverage gaps and framework -│ └─ Returns: test-context-package.json ← COLLAPSED -│ -├─ Phase 3: Test Generation Analysis ← ATTACHED (3 tasks) -│ └─ /workflow:tools:test-concept-enhanced -│ ├─ Phase 3.1: Analyze coverage gaps with Gemini -│ ├─ Phase 3.2: Study existing test patterns -│ └─ Phase 3.3: Generate test generation strategy -│ └─ Returns: TEST_ANALYSIS_RESULTS.md ← COLLAPSED -│ -├─ Phase 4: Generate Test Tasks ← ATTACHED (3 tasks) -│ └─ /workflow:tools:test-task-generate -│ ├─ Phase 4.1: Parse TEST_ANALYSIS_RESULTS.md -│ ├─ Phase 4.2: Generate IMPL-001.json and IMPL-002.json -│ └─ Phase 4.3: Generate IMPL_PLAN.md and TODO_LIST.md -│ └─ Returns: Task JSONs and plans ← COLLAPSED -│ -└─ Phase 5: Return Summary - └─ Command ends, control returns to user - -Artifacts Created: -├── .workflow/active/WFS-test-[session]/ -│ ├── workflow-session.json -│ ├── IMPL_PLAN.md -│ ├── TODO_LIST.md -│ ├── .task/ -│ │ ├── IMPL-001.json (test generation task) -│ │ └── IMPL-002.json (test execution task) -│ └── .process/ -│ ├── test-context-package.json -│ └── TEST_ANALYSIS_RESULTS.md - -Key Points: -• ← ATTACHED: SlashCommand attaches sub-tasks to orchestrator TodoWrite -• ← COLLAPSED: Sub-tasks executed and collapsed to phase summary -``` - -## Session Metadata - -Test session includes `workflow_type: "test_session"` and `source_session_id` for automatic context gathering. - -## Task Output - -Generates two task definition files: -- **IMPL-001.json**: Test generation task specification - - Agent: @code-developer - - Input: TEST_ANALYSIS_RESULTS.md - - Output: Test files based on analysis -- **IMPL-002.json**: Test execution and fix cycle specification - - Agent: @test-fix-agent - - Dependency: IMPL-001 must complete first - - Max iterations: 5 - - Fix mode: Agent or CLI (based on `command` field in implementation_approach) - -See `/workflow:tools:test-task-generate` for complete task JSON schemas. - -## Error Handling - -| Phase | Error | Action | -|-------|-------|--------| -| 1 | Source session not found | Return error with source session ID | -| 1 | No completed IMPL tasks | Return error, source incomplete | -| 2 | Context gathering failed | Return error, check source artifacts | -| 3 | Analysis failed | Return error, check context package | -| 4 | Task generation failed | Retry once, then error with details | - -## Output Files - -Created in `.workflow/active/WFS-test-[session]/`: -- `workflow-session.json` - Session metadata -- `.process/test-context-package.json` - Coverage analysis -- `.process/TEST_ANALYSIS_RESULTS.md` - Test requirements -- `.task/IMPL-001.json` - Test generation task -- `.task/IMPL-002.json` - Test execution & fix task -- `IMPL_PLAN.md` - Test plan -- `TODO_LIST.md` - Task checklist - -## Task Specifications - -**IMPL-001.json Structure**: -- `meta.type: "test-gen"` -- `meta.agent: "@code-developer"` -- `context.requirements`: Generate tests based on TEST_ANALYSIS_RESULTS.md -- `flow_control.target_files`: Test files to create -- `flow_control.implementation_approach`: Test generation strategy - -**IMPL-002.json Structure**: -- `meta.type: "test-fix"` -- `meta.agent: "@test-fix-agent"` -- `context.depends_on: ["IMPL-001"]` -- `flow_control.implementation_approach.test_fix_cycle`: Complete cycle specification - - Gemini diagnosis template - - Fix application mode (agent or CLI based on `command` field) - - Max iterations: 5 -- `flow_control.implementation_approach.modification_points`: 3-phase flow - -See `/workflow:tools:test-task-generate` for complete JSON schemas. - -## Best Practices - -1. **Prerequisites**: Ensure source session has completed IMPL tasks with summaries -2. **Clean State**: Commit implementation changes before running test-gen -3. **Review Artifacts**: Check generated IMPL_PLAN.md and TODO_LIST.md before proceeding -4. **Understand Scope**: This command only prepares artifacts; it does not execute tests - -## Related Commands - -**Prerequisite Commands**: -- `/workflow:plan` or `/workflow:execute` - Complete implementation session that needs test validation - -**Executed by This Command** (4 phases): -- `/workflow:session:start` - Phase 1: Create independent test workflow session -- `/workflow:tools:test-context-gather` - Phase 2: Analyze test coverage and gather source session context -- `/workflow:tools:test-concept-enhanced` - Phase 3: Generate test requirements and strategy using Gemini -- `/workflow:tools:test-task-generate` - Phase 4: Generate test task JSONs (CLI tool usage determined semantically) - -**Follow-up Commands**: -- `/workflow:status` - Review generated test tasks -- `/workflow:test-cycle-execute` - Execute test generation and fix cycles -- `/workflow:execute` - Execute generated test tasks \ No newline at end of file diff --git a/.claude/commands/workflow/tools/test-task-generate.md b/.claude/commands/workflow/tools/test-task-generate.md index ddf4c8e0..8619d065 100644 --- a/.claude/commands/workflow/tools/test-task-generate.md +++ b/.claude/commands/workflow/tools/test-task-generate.md @@ -1,6 +1,6 @@ --- name: test-task-generate -description: Generate test planning documents (IMPL_PLAN.md, test task JSONs, TODO_LIST.md) using action-planning-agent - produces test planning artifacts, does NOT execute tests +description: Generate test planning documents (IMPL_PLAN.md, test task JSONs, TODO_LIST.md) by invoking test-action-planning-agent argument-hint: "--session WFS-test-session-id" examples: - /workflow:tools:test-task-generate --session WFS-test-auth @@ -9,33 +9,29 @@ examples: # Generate Test Planning Documents Command ## Overview -Generate test planning documents (IMPL_PLAN.md, test task JSONs, TODO_LIST.md) using action-planning-agent. This command produces **test planning artifacts only** - it does NOT execute tests or implement code. Actual test execution requires separate execution command (e.g., /workflow:test-cycle-execute). -## Core Philosophy -- **Planning Only**: Generate test planning documents (IMPL_PLAN.md, task JSONs, TODO_LIST.md) - does NOT execute tests -- **Agent-Driven Document Generation**: Delegate test plan generation to action-planning-agent -- **Two-Phase Flow**: Context Preparation (command) → Test Document Generation (agent) -- **Memory-First**: Reuse loaded documents from conversation memory -- **MCP-Enhanced**: Use MCP tools for test pattern research and analysis -- **Path Clarity**: All `focus_paths` prefer absolute paths (e.g., `D:\\project\\src\\module`), or clear relative paths from project root -- **Leverage Existing Test Infrastructure**: Prioritize using established testing frameworks and tools present in the project +Generate test planning documents (IMPL_PLAN.md, test task JSONs, TODO_LIST.md) by invoking **test-action-planning-agent**. -## Test-Specific Execution Modes +This command produces **test planning artifacts only** - it does NOT execute tests or implement code. Actual test execution requires separate execution command (e.g., /workflow:test-cycle-execute). -### Test Generation (IMPL-001) -- **Agent Mode** (default): @code-developer generates tests within agent context -- **CLI Mode**: Use CLI tools when `command` field present in implementation_approach (determined semantically) +### Agent Specialization -### Test Execution & Fix (IMPL-002+) -- **Agent Mode** (default): Gemini diagnosis → agent applies fixes -- **CLI Mode**: Gemini diagnosis → CLI applies fixes (when `command` field present in implementation_approach) +This command invokes `@test-action-planning-agent` - a specialized variant of action-planning-agent with: +- Progressive L0-L3 test layers (Static, Unit, Integration, E2E) +- AI code issue detection (L0.5) with severity levels +- Project type templates (React, Node API, CLI, Library, Monorepo) +- Test anti-pattern detection with quality gates +- Layer completeness thresholds and coverage targets + +**See**: `d:\Claude_dms3\.claude\agents\test-action-planning-agent.md` for complete test specifications. + +--- ## Execution Process ``` Input Parsing: - ├─ Parse flags: --session - └─ Validation: session_id REQUIRED + └─ Parse flags: --session Phase 1: Context Preparation (Command) ├─ Assemble test session paths @@ -47,78 +43,33 @@ Phase 1: Context Preparation (Command) Phase 2: Test Document Generation (Agent) ├─ Load TEST_ANALYSIS_RESULTS.md as primary requirements source ├─ Generate Test Task JSON Files (.task/IMPL-*.json) - │ ├─ IMPL-001: Test generation (meta.type: "test-gen") - │ └─ IMPL-002+: Test execution & fix (meta.type: "test-fix") + │ ├─ IMPL-001: Test generation (L1-L3 layers, project-specific templates) + │ ├─ IMPL-001.3: Code validation gate (L0 + AI issue detection) + │ ├─ IMPL-001.5: Test quality gate (anti-patterns + coverage) + │ └─ IMPL-002: Test execution & fix cycle ├─ Create IMPL_PLAN.md (test_session variant) └─ Generate TODO_LIST.md with test phase indicators ``` -## Document Generation Lifecycle +--- -### Phase 1: Context Preparation (Command Responsibility) +## Agent Invocation -**Command prepares test session paths and metadata for planning document generation.** - -**Test Session Path Structure**: -``` -.workflow/active/WFS-test-{session-id}/ -├── workflow-session.json # Test session metadata -├── .process/ -│ ├── TEST_ANALYSIS_RESULTS.md # Test requirements and strategy -│ ├── test-context-package.json # Test patterns and coverage -│ └── context-package.json # General context artifacts -├── .task/ # Output: Test task JSON files -├── IMPL_PLAN.md # Output: Test implementation plan -└── TODO_LIST.md # Output: Test TODO list -``` - -**Command Preparation**: -1. **Assemble Test Session Paths** for agent prompt: - - `session_metadata_path` - - `test_analysis_results_path` (REQUIRED) - - `test_context_package_path` - - Output directory paths - -2. **Provide Metadata** (simple values): - - `session_id` - - `source_session_id` (if exists) - - `mcp_capabilities` (available MCP tools) - -**Note**: CLI tool usage is now determined semantically from user's task description, not by flags. - -### Phase 2: Test Document Generation (Agent Responsibility) - -**Purpose**: Generate test-specific IMPL_PLAN.md, task JSONs, and TODO_LIST.md - planning documents only, NOT test execution. - -**Agent Invocation**: ```javascript Task( - subagent_type="action-planning-agent", + subagent_type="test-action-planning-agent", run_in_background=false, - description="Generate test planning documents (IMPL_PLAN.md, task JSONs, TODO_LIST.md)", + description="Generate test planning documents", prompt=` ## TASK OBJECTIVE Generate test planning documents (IMPL_PLAN.md, task JSONs, TODO_LIST.md) for test workflow session IMPORTANT: This is TEST PLANNING ONLY - you are generating planning documents, NOT executing tests. -CRITICAL: -- Use existing test frameworks and utilities from the project -- Follow the progressive loading strategy defined in your agent specification (load context incrementally from memory-first approach) - -## AGENT CONFIGURATION REFERENCE - -Refer to your specification for: -- Test Task JSON Schema (6-field structure with test-specific metadata) -- Test IMPL_PLAN.md Structure (test_session variant with test-fix cycle) -- TODO_LIST.md Format (with test phase indicators) -- Progressive Loading Strategy (memory-first, load TEST_ANALYSIS_RESULTS.md as primary source) -- Quality Validation Rules (task count limits, requirement quantification) - ## SESSION PATHS Input: - Session Metadata: .workflow/active/{test-session-id}/workflow-session.json - - TEST_ANALYSIS_RESULTS: .workflow/active/{test-session-id}/.process/TEST_ANALYSIS_RESULTS.md (REQUIRED - primary requirements source) + - TEST_ANALYSIS_RESULTS: .workflow/active/{test-session-id}/.process/TEST_ANALYSIS_RESULTS.md (REQUIRED) - Test Context Package: .workflow/active/{test-session-id}/.process/test-context-package.json - Context Package: .workflow/active/{test-session-id}/.process/context-package.json - Source Session Summaries: .workflow/active/{source-session-id}/.summaries/IMPL-*.md (if exists) @@ -134,130 +85,95 @@ Workflow Type: test_session Source Session: {source-session-id} (if exists) MCP Capabilities: {exa_code, exa_web, code_index} -## CLI TOOL SELECTION -Determine CLI tool usage per-step based on user's task description: -- If user specifies "use Codex/Gemini/Qwen for X" → Add command field to relevant steps -- Default: Agent execution (no command field) unless user explicitly requests CLI +## YOUR SPECIFICATIONS +You are @test-action-planning-agent. Your complete test specifications are defined in: + d:\Claude_dms3\.claude\agents\test-action-planning-agent.md -## TEST-SPECIFIC REQUIREMENTS SUMMARY -(Detailed specifications in your agent definition) +This includes: + - Progressive Test Layers (L0-L3) with L0.1-L0.5, L1.1-L1.5, L2.1-L2.5, L3.1-L3.4 + - AI Code Issue Detection (L0.5) with 7 categories and severity levels + - Project Type Detection & Templates (6 project types) + - Test Anti-Pattern Detection (5 categories) + - Layer Completeness & Quality Metrics (thresholds and gate decisions) + - Task JSON structure requirements (minimum 4 tasks) + - Quality validation rules -### Task Structure Requirements -- Minimum 4 tasks: IMPL-001 (test generation) + IMPL-001.3 (code validation) + IMPL-001.5 (test quality) + IMPL-002 (test execution & fix) -- Expandable for complex projects: Add IMPL-003+ (per-module, integration, E2E tests) - -Task Configuration: - IMPL-001 (Test Generation): - - meta.type: "test-gen" - - meta.agent: "@code-developer" - - meta.test_framework: Specify existing framework (e.g., "jest", "vitest", "pytest") - - flow_control: Test generation strategy from TEST_ANALYSIS_RESULTS.md - - CLI execution: Add `command` field when user requests (determined semantically) - - IMPL-001.3 (Code Validation Gate) ← NEW: - - meta.type: "code-validation" - - meta.agent: "@test-fix-agent" - - context.depends_on: ["IMPL-001"] - - context.validation_config: "~/.claude/workflows/test-quality-config.json" - - flow_control.validation_phases: ["compilation", "imports", "variables", "types", "ai_specific"] - - flow_control.auto_fix_enabled: true - - flow_control.max_retries: 2 - - flow_control.severity_thresholds: { critical: 0, error: 3, warning: 10 } - - acceptance_criteria: Zero compilation errors, all imports resolvable, no variable redeclarations - - IMPL-001.5 (Test Quality Gate): - - meta.type: "test-quality-review" - - meta.agent: "@test-fix-agent" - - context.depends_on: ["IMPL-001", "IMPL-001.3"] - - context.quality_config: "~/.claude/workflows/test-quality-config.json" - - flow_control: Static analysis, coverage analysis, anti-pattern detection - - acceptance_criteria: Coverage ≥ 80%, zero critical anti-patterns - - IMPL-002+ (Test Execution & Fix): - - meta.type: "test-fix" - - meta.agent: "@test-fix-agent" - - context.depends_on: ["IMPL-001", "IMPL-001.3", "IMPL-001.5"] - - flow_control: Test-fix cycle with iteration limits and diagnosis configuration - - CLI execution: Add `command` field when user requests (determined semantically) - -### Test-Fix Cycle Specification (IMPL-002+) -Required flow_control fields: - - max_iterations: 5 - - diagnosis_tool: "gemini" - - diagnosis_template: "~/.claude/workflows/cli-templates/prompts/analysis/01-diagnose-bug-root-cause.txt" - - cycle_pattern: "test → gemini_diagnose → fix → retest" - - exit_conditions: ["all_tests_pass", "max_iterations_reached"] - - auto_revert_on_failure: true - - CLI fix: Add `command` field when user specifies CLI tool usage - -### Automation Framework Configuration -Select automation tools based on test requirements from TEST_ANALYSIS_RESULTS.md: -- UI interaction testing → E2E browser automation (meta.e2e_framework) -- API/database integration → integration test tools (meta.test_tools) -- Performance metrics → load testing tools (meta.perf_framework) -- Logic verification → unit test framework (meta.test_framework) - -**Tool Selection**: Detect from project config > suggest based on requirements - -### TEST_ANALYSIS_RESULTS.md Mapping -PRIMARY requirements source - extract and map to task JSONs: - - Test framework config → meta.test_framework (use existing framework from project) - - Existing test utilities → flow_control.reusable_test_tools (discovered test helpers, fixtures, mocks) - - Test runner commands → flow_control.test_commands (from package.json or pytest config) - - Coverage targets → meta.coverage_target - - Test requirements → context.requirements (quantified with explicit counts) - - Test generation strategy → IMPL-001 flow_control.implementation_approach - - Implementation targets → context.files_to_test (absolute paths) +**Follow your specification exactly** when generating test task JSONs. ## EXPECTED DELIVERABLES -1. Test Task JSON Files (.task/IMPL-*.json) - Minimum 4 required: - - IMPL-001.json: Test generation task - - IMPL-001.3-validation.json: Code validation gate (AI error detection) ← NEW - - IMPL-001.5-review.json: Test quality gate +1. Test Task JSON Files (.task/IMPL-*.json) - Minimum 4: + - IMPL-001.json: Test generation (L1-L3 layers per spec) + - IMPL-001.3-validation.json: Code validation gate (L0 + AI issues per spec) + - IMPL-001.5-review.json: Test quality gate (anti-patterns + coverage per spec) - IMPL-002.json: Test execution & fix cycle - Each task includes: - - 6-field schema with quantified requirements from TEST_ANALYSIS_RESULTS.md - - Test-specific metadata: type, agent, test_framework, coverage_target - - flow_control includes: reusable_test_tools, test_commands (from project config) - - Validation config reference for IMPL-001.3: ~/.claude/workflows/test-quality-config.json - - CLI execution via `command` field when user requests (determined semantically) - - Artifact references from test-context-package.json - - Absolute paths in context.files_to_test +2. IMPL_PLAN.md: Test implementation plan with quality gates -2. Test Implementation Plan (IMPL_PLAN.md) - - Template: ~/.claude/workflows/cli-templates/prompts/workflow/impl-plan-template.txt - - Test-specific frontmatter: workflow_type="test_session", test_framework, source_session_id - - Test-Fix-Retest Cycle section with diagnosis configuration - - Source session context integration (if applicable) - -3. TODO List (TODO_LIST.md) - - Hierarchical structure with test phase containers - - Links to task JSONs with status markers - - Matches task JSON hierarchy - -## QUALITY STANDARDS -Hard Constraints: - - Task count: minimum 4, maximum 18 (IMPL-001, IMPL-001.3, IMPL-001.5, IMPL-002 required) - - All requirements quantified from TEST_ANALYSIS_RESULTS.md - - Test framework matches existing project framework - - flow_control includes reusable_test_tools and test_commands from project - - Absolute paths for all focus_paths - - Acceptance criteria include verification commands - - CLI `command` field added only when user explicitly requests CLI tool usage +3. TODO_LIST.md: Hierarchical task list with test phase indicators ## SUCCESS CRITERIA - All test planning documents generated successfully -- Return completion status: task count, test framework, coverage targets, source session status +- Task count: minimum 4 (expandable for complex projects) +- Test framework: {detected from project} +- Coverage targets: L0 zero errors, L1 80%+, L2 70%+ +- L0-L3 layers explicitly defined per spec +- AI issue detection configured per spec +- Quality gates with measurable thresholds ` ) ``` +--- + +## Test-Specific Execution Modes + +### Test Generation (IMPL-001) +- **Agent Mode** (default): @code-developer generates tests within agent context +- **CLI Mode**: Use CLI tools when `command` field present in implementation_approach + +### Test Execution & Fix (IMPL-002+) +- **Agent Mode** (default): Gemini diagnosis → agent applies fixes +- **CLI Mode**: Gemini diagnosis → CLI applies fixes (when `command` field present) + +**CLI Tool Selection**: Determined semantically from user's task description (e.g., "use Codex for fixes") + +--- + +## Output + +### Directory Structure + +``` +.workflow/active/WFS-test-[session]/ +├── workflow-session.json # Session metadata +├── IMPL_PLAN.md # Test implementation plan +├── TODO_LIST.md # Task checklist +├── .task/ +│ ├── IMPL-001.json # Test generation (L1-L3) +│ ├── IMPL-001.3-validation.json # Code validation gate (L0 + AI) +│ ├── IMPL-001.5-review.json # Test quality gate +│ └── IMPL-002.json # Test execution & fix cycle +└── .process/ + ├── test-context-package.json # Test coverage and patterns + └── TEST_ANALYSIS_RESULTS.md # L0-L3 requirements (source for agent) +``` + +### Task Summary + +| Task | Type | Agent | Purpose | +|------|------|-------|---------| +| IMPL-001 | test-gen | @code-developer | Generate L1-L3 tests with project templates | +| IMPL-001.3 | code-validation | @test-fix-agent | Validate L0 + detect AI issues (CRITICAL/ERROR/WARNING) | +| IMPL-001.5 | test-quality-review | @test-fix-agent | Check anti-patterns, layer completeness, coverage | +| IMPL-002 | test-fix | @test-fix-agent | Execute tests, diagnose failures, apply fixes | + +--- + ## Integration & Usage ### Command Chain -- **Called By**: `/workflow:test-gen` (Phase 4), `/workflow:test-fix-gen` (Phase 4) -- **Invokes**: `action-planning-agent` for test planning document generation +- **Called By**: `/workflow:test-fix-gen` (Phase 4) +- **Invokes**: `@test-action-planning-agent` for test planning document generation - **Followed By**: `/workflow:test-cycle-execute` or `/workflow:execute` (user-triggered) ### Usage Examples @@ -265,22 +181,31 @@ Hard Constraints: # Standard execution /workflow:tools:test-task-generate --session WFS-test-auth -# With semantic CLI request (include in task description) +# With semantic CLI request (include in task description when calling /workflow:test-fix-gen) # e.g., "Generate tests, use Codex for implementation and fixes" ``` -### CLI Tool Selection -CLI tool usage is determined semantically from user's task description: -- Include "use Codex" for automated fixes -- Include "use Gemini" for analysis -- Default: Agent execution (no `command` field) +### Output Validation -### Output -- Test task JSON files in `.task/` directory (minimum 4): - - IMPL-001.json (test generation) - - IMPL-001.3-validation.json (code validation gate) - - IMPL-001.5-review.json (test quality gate) - - IMPL-002.json (test execution & fix) -- IMPL_PLAN.md with test strategy, validation gates, and fix cycle specification -- TODO_LIST.md with test phase indicators -- Session ready for test execution +**Minimum Requirements**: +- 4 task JSON files created +- IMPL_PLAN.md exists with test-specific sections +- TODO_LIST.md exists with test phase hierarchy +- All tasks reference TEST_ANALYSIS_RESULTS.md specifications +- L0-L3 layers explicitly defined in IMPL-001 +- AI issue detection configured in IMPL-001.3 +- Quality gates with thresholds in IMPL-001.5 + +--- + +## Related Commands + +**Called By**: +- `/workflow:test-fix-gen` - Phase 4: Generate test planning documents + +**Prerequisite**: +- `/workflow:tools:test-concept-enhanced` - Must generate TEST_ANALYSIS_RESULTS.md first + +**Follow-Up**: +- `/workflow:test-cycle-execute` - Execute generated test tasks +- `/workflow:execute` - Alternative: Standard task execution diff --git a/ccw/frontend/.gitignore b/ccw/frontend/.gitignore new file mode 100644 index 00000000..b4a7d405 --- /dev/null +++ b/ccw/frontend/.gitignore @@ -0,0 +1 @@ +.ace-tool/ diff --git a/ccw/frontend/package-lock.json b/ccw/frontend/package-lock.json index c48628ce..a14b676e 100644 --- a/ccw/frontend/package-lock.json +++ b/ccw/frontend/package-lock.json @@ -8,6 +8,7 @@ "name": "ccw-frontend", "version": "0.1.0", "dependencies": { + "@formatjs/icu-messageformat-parser": "^2.11.4", "@hello-pangea/dnd": "^18.0.1", "@radix-ui/react-dialog": "^1.1.0", "@radix-ui/react-dropdown-menu": "^2.1.0", @@ -16,29 +17,46 @@ "@radix-ui/react-toast": "^1.2.0", "@radix-ui/react-tooltip": "^1.1.0", "@tanstack/react-query": "^5.60.0", - "@xyflow/react": "^12.3.0", + "@xyflow/react": "^12.10.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "lucide-react": "^0.460.0", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-intl": "^6.8.9", "react-router-dom": "^6.28.0", "tailwind-merge": "^2.5.0", "zod": "^3.23.8", "zustand": "^5.0.0" }, "devDependencies": { + "@playwright/test": "^1.40.0", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.0.0", "@types/react": "^18.3.0", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.3.0", + "@vitest/coverage-v8": "^2.0.0", + "@vitest/ui": "^2.0.0", "autoprefixer": "^10.4.20", + "jsdom": "^25.0.0", "postcss": "^8.4.40", "tailwindcss": "^3.4.0", "tailwindcss-animate": "^1.0.7", + "tsx": "^4.19.0", "typescript": "^5.6.0", - "vite": "^6.0.0" + "vite": "^6.0.0", + "vitest": "^2.0.0" } }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -52,6 +70,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/code-frame": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", @@ -343,6 +396,128 @@ "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "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", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "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", + "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/css-color-parser": { + "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", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "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", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", @@ -823,6 +998,210 @@ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz", + "integrity": "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.7", + "@formatjs/intl-localematcher": "0.6.2", + "decimal.js": "^10.4.3", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz", + "integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz", + "integrity": "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.6", + "@formatjs/icu-skeleton-parser": "1.8.16", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.16", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz", + "integrity": "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.6", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/intl": { + "version": "2.10.15", + "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.10.15.tgz", + "integrity": "sha512-i6+xVqT+6KCz7nBfk4ybMXmbKO36tKvbMKtgFz9KV+8idYFyFbfwKooYk8kGjyA5+T5f1kEPQM5IDLXucTAQ9g==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/icu-messageformat-parser": "2.9.4", + "@formatjs/intl-displaynames": "6.8.5", + "@formatjs/intl-listformat": "7.7.5", + "intl-messageformat": "10.7.7", + "tslib": "2" + }, + "peerDependencies": { + "typescript": "^4.7 || 5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@formatjs/intl-displaynames": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.8.5.tgz", + "integrity": "sha512-85b+GdAKCsleS6cqVxf/Aw/uBd+20EM0wDpgaxzHo3RIR3bxF4xCJqH/Grbzx8CXurTgDDZHPdPdwJC+May41w==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/intl-localematcher": "0.5.8", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-displaynames/node_modules/@formatjs/ecma402-abstract": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", + "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/intl-localematcher": "0.5.8", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-displaynames/node_modules/@formatjs/fast-memoize": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", + "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-displaynames/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz", + "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-listformat": { + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.7.5.tgz", + "integrity": "sha512-Wzes10SMNeYgnxYiKsda4rnHP3Q3II4XT2tZyOgnH5fWuHDtIkceuWlRQNsvrI3uiwP4hLqp2XdQTCsfkhXulg==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/intl-localematcher": "0.5.8", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-listformat/node_modules/@formatjs/ecma402-abstract": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", + "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/intl-localematcher": "0.5.8", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-listformat/node_modules/@formatjs/fast-memoize": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", + "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-listformat/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz", + "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz", + "integrity": "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/intl/node_modules/@formatjs/ecma402-abstract": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", + "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/intl-localematcher": "0.5.8", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl/node_modules/@formatjs/fast-memoize": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", + "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@formatjs/intl/node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz", + "integrity": "sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/icu-skeleton-parser": "1.8.8", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl/node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz", + "integrity": "sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz", + "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, "node_modules/@hello-pangea/dnd": { "version": "18.0.1", "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-18.0.1.tgz", @@ -840,6 +1219,34 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -928,6 +1335,40 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@playwright/test": { + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.0.tgz", + "integrity": "sha512-fWza+Lpbj6SkQKCrU6si4iu+fD2dD3gxNHFhUPxsfXBPhnv3rRSQVd0NtBUT9Z/RhF/boCBcuUaMUSTRTopjZg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "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": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", @@ -2074,6 +2515,124 @@ "react": "^18 || ^19" } }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", + "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2175,18 +2734,28 @@ "dev": true, "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", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "license": "MIT", + "dependencies": { + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@types/react": "*" + } + }, "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==", - "devOptional": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.27", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", - "devOptional": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -2230,6 +2799,147 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "node_modules/@vitest/coverage-v8": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz", + "integrity": "sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", + "std-env": "^3.8.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "2.1.9", + "vitest": "2.1.9" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.9.tgz", + "integrity": "sha512-izzd2zmnk8Nl5ECYkW27328RbQ1nKvkm6Bb5DAaz1Gk59EbLkiCMa6OLT0NoaAYTjOFS6N+SMYW1nh4/9ljPiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "fflate": "^0.8.2", + "flatted": "^3.3.1", + "pathe": "^1.1.2", + "sirv": "^3.0.0", + "tinyglobby": "^0.2.10", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.1.9" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@xyflow/react": { "version": "12.10.0", "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.0.tgz", @@ -2290,6 +3000,39 @@ "d3-zoom": "^3.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -2330,6 +3073,50 @@ "node": ">=10" } }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/autoprefixer": { "version": "10.4.23", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", @@ -2367,6 +3154,29 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/baseline-browser-mapping": { "version": "2.9.19", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", @@ -2390,6 +3200,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -2437,6 +3257,66 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -2468,6 +3348,66 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -2533,6 +3473,39 @@ "node": ">=6" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -2550,6 +3523,21 @@ "dev": true, "license": "MIT" }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/css-box-model": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", @@ -2559,6 +3547,13 @@ "tiny-invariant": "^1.0.6" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2572,11 +3567,31 @@ "node": ">=4" } }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, "license": "MIT" }, "node_modules/d3-color": { @@ -2684,6 +3699,20 @@ "node": ">=12" } }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2702,6 +3731,111 @@ } } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "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", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -2722,6 +3856,35 @@ "dev": true, "license": "MIT" }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.282", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.282.tgz", @@ -2729,6 +3892,103 @@ "dev": true, "license": "ISC" }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "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" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=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", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", @@ -2781,6 +4041,26 @@ "node": ">=6" } }, + "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/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -2821,6 +4101,13 @@ "reusify": "^1.0.4" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true, + "license": "MIT" + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -2834,6 +4121,63 @@ "node": ">=8" } }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -2873,6 +4217,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2883,6 +4237,31 @@ "node": ">=6.9.0" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-nonce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", @@ -2892,6 +4271,54 @@ "node": ">=6" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2905,6 +4332,84 @@ "node": ">=10.13.0" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -2918,6 +4423,214 @@ "node": ">= 0.4" } }, + "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", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.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", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escaper": { + "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/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/intl-messageformat": { + "version": "10.7.7", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.7.tgz", + "integrity": "sha512-F134jIoeYMro/3I0h08D0Yt4N9o9pjddU/4IIxMMURqbAtI2wu70X8hvG1V48W49zXHXv3RKSF/po+0fDfsGjA==", + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/icu-messageformat-parser": "2.9.4", + "tslib": "2" + } + }, + "node_modules/intl-messageformat/node_modules/@formatjs/ecma402-abstract": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", + "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/intl-localematcher": "0.5.8", + "tslib": "2" + } + }, + "node_modules/intl-messageformat/node_modules/@formatjs/fast-memoize": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", + "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/intl-messageformat/node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz", + "integrity": "sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/icu-skeleton-parser": "1.8.8", + "tslib": "2" + } + }, + "node_modules/intl-messageformat/node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz", + "integrity": "sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "tslib": "2" + } + }, + "node_modules/intl-messageformat/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz", + "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2931,6 +4644,36 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -2947,6 +4690,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2957,6 +4717,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2970,6 +4740,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2980,6 +4763,227 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -2996,6 +5000,47 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, + "node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -3054,6 +5099,13 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3073,6 +5125,77 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3097,6 +5220,75 @@ "node": ">=8.6" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3152,6 +5344,13 @@ "node": ">=0.10.0" } }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3172,6 +5371,97 @@ "node": ">= 6" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "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" + } + }, + "node_modules/object.assign": { + "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", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "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" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -3179,6 +5469,47 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3219,6 +5550,63 @@ "node": ">= 6" } }, + "node_modules/playwright": { + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.0.tgz", + "integrity": "sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0.tgz", + "integrity": "sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/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, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.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", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -3382,6 +5770,38 @@ "dev": true, "license": "MIT" }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "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/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3434,6 +5854,89 @@ "react": "^18.3.1" } }, + "node_modules/react-intl": { + "version": "6.8.9", + "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.8.9.tgz", + "integrity": "sha512-TUfj5E7lyUDvz/GtovC9OMh441kBr08rtIbgh3p0R8iF3hVY+V2W9Am7rb8BpJ/29BH1utJOqOOhmvEVh3GfZg==", + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/icu-messageformat-parser": "2.9.4", + "@formatjs/intl": "2.10.15", + "@formatjs/intl-displaynames": "6.8.5", + "@formatjs/intl-listformat": "7.7.5", + "@types/hoist-non-react-statics": "3", + "@types/react": "16 || 17 || 18", + "hoist-non-react-statics": "3", + "intl-messageformat": "10.7.7", + "tslib": "2" + }, + "peerDependencies": { + "react": "^16.6.0 || 17 || 18", + "typescript": "^4.7 || 5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-intl/node_modules/@formatjs/ecma402-abstract": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", + "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/intl-localematcher": "0.5.8", + "tslib": "2" + } + }, + "node_modules/react-intl/node_modules/@formatjs/fast-memoize": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", + "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/react-intl/node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz", + "integrity": "sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/icu-skeleton-parser": "1.8.8", + "tslib": "2" + } + }, + "node_modules/react-intl/node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz", + "integrity": "sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "tslib": "2" + } + }, + "node_modules/react-intl/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz", + "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "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-redux": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", @@ -3591,12 +6094,47 @@ "node": ">=8.10.0" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -3618,6 +6156,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -3674,6 +6222,13 @@ "fsevents": "~2.3.2" } }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true, + "license": "MIT" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3698,6 +6253,44 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -3717,6 +6310,174 @@ "semver": "bin/semver.js" } }, + "node_modules/set-function-length": { + "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", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -3727,6 +6488,144 @@ "node": ">=0.10.0" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "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/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/sucrase": { "version": "3.35.1", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", @@ -3750,6 +6649,19 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -3763,6 +6675,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, "node_modules/tailwind-merge": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", @@ -3821,6 +6740,21 @@ "tailwindcss": ">=3.0.0 || insiders" } }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -3850,6 +6784,20 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -3898,6 +6846,56 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/tinypool": { + "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" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3911,6 +6909,42 @@ "node": ">=8.0" } }, + "node_modules/totalist": { + "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" + } + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -3924,11 +6958,515 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -4103,6 +7641,519 @@ } } }, + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vite-node/node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, "node_modules/vite/node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -4134,6 +8185,884 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/ccw/frontend/package.json b/ccw/frontend/package.json index c9678046..9318467e 100644 --- a/ccw/frontend/package.json +++ b/ccw/frontend/package.json @@ -7,9 +7,17 @@ "dev": "vite", "build": "tsc && vite build", "preview": "vite preview", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0" + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "test": "vitest", + "test:ui": "vitest --ui", + "test:coverage": "vitest --coverage", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", + "test:e2e:debug": "playwright test --debug", + "validate:i18n": "tsx scripts/validate-translations.ts" }, "dependencies": { + "@formatjs/icu-messageformat-parser": "^2.11.4", "@hello-pangea/dnd": "^18.0.1", "@radix-ui/react-dialog": "^1.1.0", "@radix-ui/react-dropdown-menu": "^2.1.0", @@ -18,26 +26,36 @@ "@radix-ui/react-toast": "^1.2.0", "@radix-ui/react-tooltip": "^1.1.0", "@tanstack/react-query": "^5.60.0", - "@xyflow/react": "^12.3.0", + "@xyflow/react": "^12.10.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "lucide-react": "^0.460.0", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-intl": "^6.8.9", "react-router-dom": "^6.28.0", "tailwind-merge": "^2.5.0", "zod": "^3.23.8", "zustand": "^5.0.0" }, "devDependencies": { + "@playwright/test": "^1.40.0", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.0.0", "@types/react": "^18.3.0", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.3.0", + "@vitest/coverage-v8": "^2.0.0", + "@vitest/ui": "^2.0.0", "autoprefixer": "^10.4.20", + "jsdom": "^25.0.0", "postcss": "^8.4.40", "tailwindcss": "^3.4.0", "tailwindcss-animate": "^1.0.7", + "tsx": "^4.19.0", "typescript": "^5.6.0", - "vite": "^6.0.0" + "vite": "^6.0.0", + "vitest": "^2.0.0" } } diff --git a/ccw/frontend/playwright-report/data/0f69085c372bda0417b36a33558d3bad4fe136ed.md b/ccw/frontend/playwright-report/data/0f69085c372bda0417b36a33558d3bad4fe136ed.md new file mode 100644 index 00000000..e759e71d --- /dev/null +++ b/ccw/frontend/playwright-report/data/0f69085c372bda0417b36a33558d3bad4fe136ed.md @@ -0,0 +1,128 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6] [cursor=pointer]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e18] + - button "common.aria.switchToDarkMode" [ref=e20] [cursor=pointer]: + - img [ref=e21] + - button "common.aria.userMenu" [ref=e24] [cursor=pointer]: + - img [ref=e25] + - generic [ref=e28]: + - navigation "Claude Code Workflow" [ref=e29]: + - navigation [ref=e30]: + - list [ref=e31]: + - listitem [ref=e32]: + - link "navigation.main.home" [ref=e33] [cursor=pointer]: + - /url: / + - img [ref=e34] + - generic [ref=e37]: navigation.main.home + - listitem [ref=e38]: + - link "navigation.main.sessions" [ref=e39] [cursor=pointer]: + - /url: /sessions + - img [ref=e40] + - generic [ref=e42]: navigation.main.sessions + - listitem [ref=e43]: + - link "navigation.main.liteTasks" [ref=e44] [cursor=pointer]: + - /url: /lite-tasks + - img [ref=e45] + - generic [ref=e47]: navigation.main.liteTasks + - listitem [ref=e48]: + - link "navigation.main.project" [ref=e49] [cursor=pointer]: + - /url: /project + - img [ref=e50] + - generic [ref=e55]: navigation.main.project + - listitem [ref=e56]: + - link "navigation.main.history" [ref=e57] [cursor=pointer]: + - /url: /history + - img [ref=e58] + - generic [ref=e61]: navigation.main.history + - listitem [ref=e62]: + - link "navigation.main.orchestrator" [ref=e63] [cursor=pointer]: + - /url: /orchestrator + - img [ref=e64] + - generic [ref=e68]: navigation.main.orchestrator + - listitem [ref=e69]: + - link "navigation.main.loops" [ref=e70] [cursor=pointer]: + - /url: /loops + - img [ref=e71] + - generic [ref=e76]: navigation.main.loops + - listitem [ref=e77]: + - link "navigation.main.issues" [ref=e78] [cursor=pointer]: + - /url: /issues + - img [ref=e79] + - generic [ref=e81]: navigation.main.issues + - listitem [ref=e82]: + - link "navigation.main.skills" [ref=e83] [cursor=pointer]: + - /url: /skills + - img [ref=e84] + - generic [ref=e86]: navigation.main.skills + - listitem [ref=e87]: + - link "navigation.main.commands" [ref=e88] [cursor=pointer]: + - /url: /commands + - img [ref=e89] + - generic [ref=e91]: navigation.main.commands + - listitem [ref=e92]: + - link "navigation.main.memory" [ref=e93] [cursor=pointer]: + - /url: /memory + - img [ref=e94] + - generic [ref=e104]: navigation.main.memory + - listitem [ref=e105]: + - link "navigation.main.settings" [ref=e106] [cursor=pointer]: + - /url: /settings + - img [ref=e107] + - generic [ref=e110]: navigation.main.settings + - listitem [ref=e111]: + - link "navigation.main.help" [ref=e112] [cursor=pointer]: + - /url: /help + - img [ref=e113] + - generic [ref=e116]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e118] [cursor=pointer]: + - img [ref=e119] + - generic [ref=e122]: navigation.sidebar.collapse + - main [ref=e123]: + - generic [ref=e124]: + - generic [ref=e125]: + - generic [ref=e126]: + - heading "memory.title" [level=1] [ref=e127]: + - img [ref=e128] + - text: memory.title + - paragraph [ref=e138]: memory.description + - generic [ref=e139]: + - button "common.actions.refresh" [disabled]: + - img + - text: common.actions.refresh + - button "memory.actions.add" [ref=e140] [cursor=pointer]: + - img [ref=e141] + - text: memory.actions.add + - generic [ref=e142]: + - generic [ref=e144]: + - img [ref=e146] + - generic [ref=e150]: + - generic [ref=e151]: "0" + - paragraph [ref=e152]: memory.stats.count + - generic [ref=e154]: + - img [ref=e156] + - generic [ref=e159]: + - generic [ref=e160]: "0" + - paragraph [ref=e161]: memory.stats.claudeMdCount + - generic [ref=e163]: + - img [ref=e165] + - generic [ref=e175]: + - generic [ref=e176]: 0 B + - paragraph [ref=e177]: memory.stats.totalSize + - generic [ref=e179]: + - img [ref=e180] + - textbox "memory.filters.search" [ref=e183] +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/1ee7f748a8aa21564608910924f07fe370158ca0.md b/ccw/frontend/playwright-report/data/1ee7f748a8aa21564608910924f07fe370158ca0.md new file mode 100644 index 00000000..7aa6b141 --- /dev/null +++ b/ccw/frontend/playwright-report/data/1ee7f748a8aa21564608910924f07fe370158ca0.md @@ -0,0 +1,144 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇺🇸 + - generic: English + - img [ref=e18] + - button "common.aria.switchToDarkMode" [ref=e20] [cursor=pointer]: + - img [ref=e21] + - button "common.aria.userMenu" [ref=e24] [cursor=pointer]: + - img [ref=e25] + - generic [ref=e28]: + - navigation "Claude Code Workflow" [ref=e29]: + - navigation [ref=e30]: + - list [ref=e31]: + - listitem [ref=e32]: + - link "navigation.main.home" [ref=e33]: + - /url: / + - img [ref=e34] + - generic [ref=e37]: navigation.main.home + - listitem [ref=e38]: + - link "navigation.main.sessions" [ref=e39]: + - /url: /sessions + - img [ref=e40] + - generic [ref=e42]: navigation.main.sessions + - listitem [ref=e43]: + - link "navigation.main.liteTasks" [ref=e44]: + - /url: /lite-tasks + - img [ref=e45] + - generic [ref=e47]: navigation.main.liteTasks + - listitem [ref=e48]: + - link "navigation.main.project" [ref=e49]: + - /url: /project + - img [ref=e50] + - generic [ref=e55]: navigation.main.project + - listitem [ref=e56]: + - link "navigation.main.history" [ref=e57]: + - /url: /history + - img [ref=e58] + - generic [ref=e61]: navigation.main.history + - listitem [ref=e62]: + - link "navigation.main.orchestrator" [ref=e63]: + - /url: /orchestrator + - img [ref=e64] + - generic [ref=e68]: navigation.main.orchestrator + - listitem [ref=e69]: + - link "navigation.main.loops" [ref=e70]: + - /url: /loops + - img [ref=e71] + - generic [ref=e76]: navigation.main.loops + - listitem [ref=e77]: + - link "navigation.main.issues" [ref=e78]: + - /url: /issues + - img [ref=e79] + - generic [ref=e81]: navigation.main.issues + - listitem [ref=e82]: + - link "navigation.main.skills" [ref=e83]: + - /url: /skills + - img [ref=e84] + - generic [ref=e86]: navigation.main.skills + - listitem [ref=e87]: + - link "navigation.main.commands" [ref=e88]: + - /url: /commands + - img [ref=e89] + - generic [ref=e91]: navigation.main.commands + - listitem [ref=e92]: + - link "navigation.main.memory" [ref=e93]: + - /url: /memory + - img [ref=e94] + - generic [ref=e104]: navigation.main.memory + - listitem [ref=e105]: + - link "navigation.main.settings" [ref=e106]: + - /url: /settings + - img [ref=e107] + - generic [ref=e110]: navigation.main.settings + - listitem [ref=e111]: + - link "navigation.main.help" [ref=e112]: + - /url: /help + - img [ref=e113] + - generic [ref=e116]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e118] [cursor=pointer]: + - img [ref=e119] + - generic [ref=e122]: navigation.sidebar.collapse + - main [ref=e123]: + - generic [ref=e124]: + - generic [ref=e125]: + - generic [ref=e126]: + - heading "home.title" [level=1] [ref=e127] + - paragraph [ref=e128]: home.description + - button "common.actions.refresh" [ref=e129] [cursor=pointer]: + - img [ref=e130] + - text: common.actions.refresh + - generic [ref=e135]: + - heading "home.sections.statistics" [level=2] [ref=e136] + - generic [ref=e137]: + - generic [ref=e140]: + - generic [ref=e141]: + - paragraph [ref=e142]: home.stats.activeSessions + - paragraph [ref=e144]: "0" + - img [ref=e146] + - generic [ref=e150]: + - generic [ref=e151]: + - paragraph [ref=e152]: home.stats.totalTasks + - paragraph [ref=e154]: "0" + - img [ref=e156] + - generic [ref=e161]: + - generic [ref=e162]: + - paragraph [ref=e163]: home.stats.completedTasks + - paragraph [ref=e165]: "0" + - img [ref=e167] + - generic [ref=e172]: + - generic [ref=e173]: + - paragraph [ref=e174]: home.stats.pendingTasks + - paragraph [ref=e176]: "0" + - img [ref=e178] + - generic [ref=e183]: + - generic [ref=e184]: + - paragraph [ref=e185]: common.status.failed + - paragraph [ref=e187]: "0" + - img [ref=e189] + - generic [ref=e195]: + - generic [ref=e196]: + - paragraph [ref=e197]: common.stats.todayActivity + - paragraph [ref=e199]: "0" + - img [ref=e201] + - generic [ref=e203]: + - generic [ref=e204]: + - heading "home.sections.recentSessions" [level=2] [ref=e205] + - button "common.actions.viewAll" [ref=e206] [cursor=pointer] + - generic [ref=e207]: + - img [ref=e208] + - heading "home.emptyState.noSessions.title" [level=3] [ref=e210] + - paragraph [ref=e211]: home.emptyState.noSessions.message +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/1fd31c8f52944bee5b60cb008f591365e722662a.md b/ccw/frontend/playwright-report/data/1fd31c8f52944bee5b60cb008f591365e722662a.md new file mode 100644 index 00000000..cbe38b18 --- /dev/null +++ b/ccw/frontend/playwright-report/data/1fd31c8f52944bee5b60cb008f591365e722662a.md @@ -0,0 +1,144 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6] [cursor=pointer]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e21] + - button "common.aria.switchToDarkMode" [ref=e23] [cursor=pointer]: + - img [ref=e24] + - button "common.aria.userMenu" [ref=e27] [cursor=pointer]: + - img [ref=e28] + - generic [ref=e31]: + - navigation "Claude Code Workflow" [ref=e32]: + - navigation [ref=e33]: + - list [ref=e34]: + - listitem [ref=e35]: + - link "navigation.main.home" [ref=e36] [cursor=pointer]: + - /url: / + - img [ref=e37] + - generic [ref=e40]: navigation.main.home + - listitem [ref=e41]: + - link "navigation.main.sessions" [ref=e42] [cursor=pointer]: + - /url: /sessions + - img [ref=e43] + - generic [ref=e48]: navigation.main.sessions + - listitem [ref=e49]: + - link "navigation.main.liteTasks" [ref=e50] [cursor=pointer]: + - /url: /lite-tasks + - img [ref=e51] + - generic [ref=e53]: navigation.main.liteTasks + - listitem [ref=e54]: + - link "navigation.main.project" [ref=e55] [cursor=pointer]: + - /url: /project + - img [ref=e56] + - generic [ref=e61]: navigation.main.project + - listitem [ref=e62]: + - link "navigation.main.history" [ref=e63] [cursor=pointer]: + - /url: /history + - img [ref=e64] + - generic [ref=e67]: navigation.main.history + - listitem [ref=e68]: + - link "navigation.main.orchestrator" [ref=e69] [cursor=pointer]: + - /url: /orchestrator + - img [ref=e70] + - generic [ref=e74]: navigation.main.orchestrator + - listitem [ref=e75]: + - link "navigation.main.loops" [ref=e76] [cursor=pointer]: + - /url: /loops + - img [ref=e77] + - generic [ref=e82]: navigation.main.loops + - listitem [ref=e83]: + - link "navigation.main.issues" [ref=e84] [cursor=pointer]: + - /url: /issues + - img [ref=e85] + - generic [ref=e89]: navigation.main.issues + - listitem [ref=e90]: + - link "navigation.main.skills" [ref=e91] [cursor=pointer]: + - /url: /skills + - img [ref=e92] + - generic [ref=e98]: navigation.main.skills + - listitem [ref=e99]: + - link "navigation.main.commands" [ref=e100] [cursor=pointer]: + - /url: /commands + - img [ref=e101] + - generic [ref=e104]: navigation.main.commands + - listitem [ref=e105]: + - link "navigation.main.memory" [ref=e106] [cursor=pointer]: + - /url: /memory + - img [ref=e107] + - generic [ref=e117]: navigation.main.memory + - listitem [ref=e118]: + - link "navigation.main.settings" [ref=e119] [cursor=pointer]: + - /url: /settings + - img [ref=e120] + - generic [ref=e123]: navigation.main.settings + - listitem [ref=e124]: + - link "navigation.main.help" [ref=e125] [cursor=pointer]: + - /url: /help + - img [ref=e126] + - generic [ref=e130]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e132] [cursor=pointer]: + - img [ref=e133] + - generic [ref=e137]: navigation.sidebar.collapse + - main [ref=e138]: + - generic [ref=e139]: + - generic [ref=e140]: + - generic [ref=e141]: + - heading "home.title" [level=1] [ref=e142] + - paragraph [ref=e143]: home.description + - button "common.actions.refresh" [ref=e144] [cursor=pointer]: + - img [ref=e145] + - text: common.actions.refresh + - generic [ref=e150]: + - heading "home.sections.statistics" [level=2] [ref=e151] + - generic [ref=e152]: + - generic [ref=e155]: + - generic [ref=e156]: + - paragraph [ref=e157]: home.stats.activeSessions + - paragraph [ref=e159]: "0" + - img [ref=e161] + - generic [ref=e168]: + - generic [ref=e169]: + - paragraph [ref=e170]: home.stats.totalTasks + - paragraph [ref=e172]: "0" + - img [ref=e174] + - generic [ref=e182]: + - generic [ref=e183]: + - paragraph [ref=e184]: home.stats.completedTasks + - paragraph [ref=e186]: "0" + - img [ref=e188] + - generic [ref=e193]: + - generic [ref=e194]: + - paragraph [ref=e195]: home.stats.pendingTasks + - paragraph [ref=e197]: "0" + - img [ref=e199] + - generic [ref=e204]: + - generic [ref=e205]: + - paragraph [ref=e206]: common.status.failed + - paragraph [ref=e208]: "0" + - img [ref=e210] + - generic [ref=e216]: + - generic [ref=e217]: + - paragraph [ref=e218]: common.stats.todayActivity + - paragraph [ref=e220]: "0" + - img [ref=e222] + - generic [ref=e224]: + - generic [ref=e225]: + - heading "home.sections.recentSessions" [level=2] [ref=e226] + - button "common.actions.viewAll" [ref=e227] [cursor=pointer] + - generic [ref=e228]: + - img [ref=e229] + - heading "home.emptyState.noSessions.title" [level=3] [ref=e234] + - paragraph [ref=e235]: home.emptyState.noSessions.message +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/46d2276f6ff9087a6311cb88f55e5090ebdf01f6.md b/ccw/frontend/playwright-report/data/46d2276f6ff9087a6311cb88f55e5090ebdf01f6.md new file mode 100644 index 00000000..8381fcf3 --- /dev/null +++ b/ccw/frontend/playwright-report/data/46d2276f6ff9087a6311cb88f55e5090ebdf01f6.md @@ -0,0 +1,265 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e18] + - button "common.aria.switchToDarkMode" [ref=e20] [cursor=pointer]: + - img [ref=e21] + - button "common.aria.userMenu" [ref=e24] [cursor=pointer]: + - img [ref=e25] + - generic [ref=e28]: + - navigation "Claude Code Workflow" [ref=e29]: + - navigation [ref=e30]: + - list [ref=e31]: + - listitem [ref=e32]: + - link "navigation.main.home" [ref=e33]: + - /url: / + - img [ref=e34] + - generic [ref=e37]: navigation.main.home + - listitem [ref=e38]: + - link "navigation.main.sessions" [ref=e39]: + - /url: /sessions + - img [ref=e40] + - generic [ref=e42]: navigation.main.sessions + - listitem [ref=e43]: + - link "navigation.main.liteTasks" [ref=e44]: + - /url: /lite-tasks + - img [ref=e45] + - generic [ref=e47]: navigation.main.liteTasks + - listitem [ref=e48]: + - link "navigation.main.project" [ref=e49]: + - /url: /project + - img [ref=e50] + - generic [ref=e55]: navigation.main.project + - listitem [ref=e56]: + - link "navigation.main.history" [ref=e57]: + - /url: /history + - img [ref=e58] + - generic [ref=e61]: navigation.main.history + - listitem [ref=e62]: + - link "navigation.main.orchestrator" [ref=e63]: + - /url: /orchestrator + - img [ref=e64] + - generic [ref=e68]: navigation.main.orchestrator + - listitem [ref=e69]: + - link "navigation.main.loops" [ref=e70]: + - /url: /loops + - img [ref=e71] + - generic [ref=e76]: navigation.main.loops + - listitem [ref=e77]: + - link "navigation.main.issues" [ref=e78]: + - /url: /issues + - img [ref=e79] + - generic [ref=e81]: navigation.main.issues + - listitem [ref=e82]: + - link "navigation.main.skills" [ref=e83]: + - /url: /skills + - img [ref=e84] + - generic [ref=e86]: navigation.main.skills + - listitem [ref=e87]: + - link "navigation.main.commands" [ref=e88]: + - /url: /commands + - img [ref=e89] + - generic [ref=e91]: navigation.main.commands + - listitem [ref=e92]: + - link "navigation.main.memory" [ref=e93]: + - /url: /memory + - img [ref=e94] + - generic [ref=e104]: navigation.main.memory + - listitem [ref=e105]: + - link "navigation.main.settings" [ref=e106]: + - /url: /settings + - img [ref=e107] + - generic [ref=e110]: navigation.main.settings + - listitem [ref=e111]: + - link "navigation.main.help" [ref=e112]: + - /url: /help + - img [ref=e113] + - generic [ref=e116]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e118] [cursor=pointer]: + - img [ref=e119] + - generic [ref=e122]: navigation.sidebar.collapse + - main [ref=e123]: + - generic [ref=e124]: + - generic [ref=e125]: + - heading "settings.title" [level=1] [ref=e126]: + - img [ref=e127] + - text: settings.title + - paragraph [ref=e130]: settings.description + - generic [ref=e131]: + - heading "settings.sections.appearance" [level=2] [ref=e132]: + - img [ref=e133] + - text: settings.sections.appearance + - generic [ref=e136]: + - generic [ref=e137]: + - paragraph [ref=e138]: settings.appearance.theme + - paragraph [ref=e139]: settings.appearance.description + - generic [ref=e140]: + - button "settings.appearance.themeOptions.light" [ref=e141] [cursor=pointer]: + - img [ref=e142] + - text: settings.appearance.themeOptions.light + - button "settings.appearance.themeOptions.dark" [ref=e148] [cursor=pointer]: + - img [ref=e149] + - text: settings.appearance.themeOptions.dark + - button "settings.appearance.themeOptions.system" [ref=e151] [cursor=pointer] + - generic [ref=e152]: + - heading "settings.sections.language" [level=2] [ref=e153]: + - img [ref=e154] + - text: settings.sections.language + - generic [ref=e159]: + - generic [ref=e160]: + - paragraph [ref=e161]: settings.language.displayLanguage + - paragraph [ref=e162]: settings.language.chooseLanguage + - combobox "Select language" [ref=e163] [cursor=pointer]: + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e164] + - generic [ref=e166]: + - heading "settings.sections.cliTools" [level=2] [ref=e167]: + - img [ref=e168] + - text: settings.sections.cliTools + - paragraph [ref=e171]: + - text: settings.cliTools.description + - strong [ref=e172]: gemini + - generic [ref=e173]: + - generic [ref=e175] [cursor=pointer]: + - generic [ref=e176]: + - generic [ref=e177]: + - img [ref=e179] + - generic [ref=e182]: + - generic [ref=e183]: + - generic [ref=e184]: gemini + - generic [ref=e185]: settings.cliTools.default + - generic [ref=e186]: builtin + - paragraph [ref=e187]: gemini-2.5-pro + - generic [ref=e188]: + - button "settings.cliTools.enabled" [ref=e189]: + - img [ref=e190] + - text: settings.cliTools.enabled + - img [ref=e192] + - generic [ref=e194]: + - generic [ref=e195]: analysis + - generic [ref=e196]: debug + - generic [ref=e199] [cursor=pointer]: + - generic [ref=e200]: + - img [ref=e202] + - generic [ref=e205]: + - generic [ref=e206]: + - generic [ref=e207]: qwen + - generic [ref=e208]: builtin + - paragraph [ref=e209]: coder-model + - generic [ref=e210]: + - button "settings.cliTools.enabled" [ref=e211]: + - img [ref=e212] + - text: settings.cliTools.enabled + - img [ref=e214] + - generic [ref=e218] [cursor=pointer]: + - generic [ref=e219]: + - img [ref=e221] + - generic [ref=e224]: + - generic [ref=e225]: + - generic [ref=e226]: codex + - generic [ref=e227]: builtin + - paragraph [ref=e228]: gpt-5.2 + - generic [ref=e229]: + - button "settings.cliTools.enabled" [ref=e230]: + - img [ref=e231] + - text: settings.cliTools.enabled + - img [ref=e233] + - generic [ref=e237] [cursor=pointer]: + - generic [ref=e238]: + - img [ref=e240] + - generic [ref=e243]: + - generic [ref=e244]: + - generic [ref=e245]: claude + - generic [ref=e246]: builtin + - paragraph [ref=e247]: sonnet + - generic [ref=e248]: + - button "settings.cliTools.enabled" [ref=e249]: + - img [ref=e250] + - text: settings.cliTools.enabled + - img [ref=e252] + - generic [ref=e254]: + - heading "settings.dataRefresh.title" [level=2] [ref=e255]: + - img [ref=e256] + - text: settings.dataRefresh.title + - generic [ref=e261]: + - generic [ref=e262]: + - generic [ref=e263]: + - paragraph [ref=e264]: settings.dataRefresh.autoRefresh + - paragraph [ref=e265]: settings.dataRefresh.autoRefreshDesc + - button "settings.dataRefresh.enabled" [ref=e266] [cursor=pointer] + - generic [ref=e267]: + - generic [ref=e268]: + - paragraph [ref=e269]: settings.dataRefresh.refreshInterval + - paragraph [ref=e270]: settings.dataRefresh.refreshIntervalDesc + - generic [ref=e271]: + - button "15s" [ref=e272] [cursor=pointer] + - button "30s" [ref=e273] [cursor=pointer] + - button "60s" [ref=e274] [cursor=pointer] + - button "120s" [ref=e275] [cursor=pointer] + - generic [ref=e276]: + - heading "settings.notifications.title" [level=2] [ref=e277]: + - img [ref=e278] + - text: settings.notifications.title + - generic [ref=e281]: + - generic [ref=e282]: + - generic [ref=e283]: + - paragraph [ref=e284]: settings.notifications.enableNotifications + - paragraph [ref=e285]: settings.notifications.enableNotificationsDesc + - button "settings.dataRefresh.enabled" [ref=e286] [cursor=pointer] + - generic [ref=e287]: + - generic [ref=e288]: + - paragraph [ref=e289]: settings.notifications.soundEffects + - paragraph [ref=e290]: settings.notifications.soundEffectsDesc + - button "settings.notifications.off" [ref=e291] [cursor=pointer] + - generic [ref=e292]: + - heading "settings.sections.display" [level=2] [ref=e293]: + - img [ref=e294] + - text: settings.sections.display + - generic [ref=e298]: + - generic [ref=e299]: + - paragraph [ref=e300]: settings.display.showCompletedTasks + - paragraph [ref=e301]: settings.display.showCompletedTasksDesc + - button "settings.display.show" [ref=e302] [cursor=pointer] + - generic [ref=e303]: + - generic [ref=e304]: + - heading "settings.sections.hooks" [level=2] [ref=e305]: + - img [ref=e306] + - text: settings.sections.hooks + - generic [ref=e312]: 0/0 cliHooks.stats.enabled + - generic [ref=e313]: + - img [ref=e314] + - textbox "cliHooks.filters.searchPlaceholder" [ref=e317] + - generic [ref=e323]: + - generic [ref=e324]: + - heading "settings.sections.rules" [level=2] [ref=e325]: + - img [ref=e326] + - text: settings.sections.rules + - generic [ref=e331]: 0/0 cliRules.stats.enabled + - generic [ref=e332]: + - img [ref=e333] + - textbox "cliRules.filters.searchPlaceholder" [ref=e336] + - generic [ref=e342]: + - heading "common.actions.reset" [level=2] [ref=e343]: + - img [ref=e344] + - text: common.actions.reset + - paragraph [ref=e347]: settings.reset.description + - button "common.actions.resetToDefaults" [ref=e348] [cursor=pointer]: + - img [ref=e349] + - text: common.actions.resetToDefaults +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/55e168398efbf32e15acaac18dfe7c2ef2cbb1c7.md b/ccw/frontend/playwright-report/data/55e168398efbf32e15acaac18dfe7c2ef2cbb1c7.md new file mode 100644 index 00000000..6ce976e8 --- /dev/null +++ b/ccw/frontend/playwright-report/data/55e168398efbf32e15acaac18dfe7c2ef2cbb1c7.md @@ -0,0 +1,153 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e18] + - button "common.aria.switchToDarkMode" [ref=e20] [cursor=pointer]: + - img [ref=e21] + - button "common.aria.userMenu" [ref=e24] [cursor=pointer]: + - img [ref=e25] + - generic [ref=e28]: + - navigation "Claude Code Workflow" [ref=e29]: + - navigation [ref=e30]: + - list [ref=e31]: + - listitem [ref=e32]: + - link "navigation.main.home" [ref=e33]: + - /url: / + - img [ref=e34] + - generic [ref=e37]: navigation.main.home + - listitem [ref=e38]: + - link "navigation.main.sessions" [ref=e39]: + - /url: /sessions + - img [ref=e40] + - generic [ref=e42]: navigation.main.sessions + - listitem [ref=e43]: + - link "navigation.main.liteTasks" [ref=e44]: + - /url: /lite-tasks + - img [ref=e45] + - generic [ref=e47]: navigation.main.liteTasks + - listitem [ref=e48]: + - link "navigation.main.project" [ref=e49]: + - /url: /project + - img [ref=e50] + - generic [ref=e55]: navigation.main.project + - listitem [ref=e56]: + - link "navigation.main.history" [ref=e57]: + - /url: /history + - img [ref=e58] + - generic [ref=e61]: navigation.main.history + - listitem [ref=e62]: + - link "navigation.main.orchestrator" [ref=e63]: + - /url: /orchestrator + - img [ref=e64] + - generic [ref=e68]: navigation.main.orchestrator + - listitem [ref=e69]: + - link "navigation.main.loops" [ref=e70]: + - /url: /loops + - img [ref=e71] + - generic [ref=e76]: navigation.main.loops + - listitem [ref=e77]: + - link "navigation.main.issues" [ref=e78]: + - /url: /issues + - img [ref=e79] + - generic [ref=e81]: navigation.main.issues + - listitem [ref=e82]: + - link "navigation.main.skills" [ref=e83]: + - /url: /skills + - img [ref=e84] + - generic [ref=e86]: navigation.main.skills + - listitem [ref=e87]: + - link "navigation.main.commands" [ref=e88]: + - /url: /commands + - img [ref=e89] + - generic [ref=e91]: navigation.main.commands + - listitem [ref=e92]: + - link "navigation.main.memory" [ref=e93]: + - /url: /memory + - img [ref=e94] + - generic [ref=e104]: navigation.main.memory + - listitem [ref=e105]: + - link "navigation.main.settings" [ref=e106]: + - /url: /settings + - img [ref=e107] + - generic [ref=e110]: navigation.main.settings + - listitem [ref=e111]: + - link "navigation.main.help" [ref=e112]: + - /url: /help + - img [ref=e113] + - generic [ref=e116]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e118] [cursor=pointer]: + - img [ref=e119] + - generic [ref=e122]: navigation.sidebar.collapse + - main [ref=e123]: + - generic [ref=e124]: + - generic [ref=e125]: + - generic [ref=e126]: + - heading "skills.title" [level=1] [ref=e127]: + - img [ref=e128] + - text: skills.title + - paragraph [ref=e130]: skills.description + - generic [ref=e131]: + - button "common.actions.refresh" [disabled]: + - img + - text: common.actions.refresh + - button "skills.actions.install" [ref=e132] [cursor=pointer]: + - img [ref=e133] + - text: skills.actions.install + - generic [ref=e134]: + - generic [ref=e135]: + - generic [ref=e136]: + - img [ref=e137] + - generic [ref=e139]: "0" + - paragraph [ref=e140]: common.stats.totalSkills + - generic [ref=e141]: + - generic [ref=e142]: + - img [ref=e143] + - generic [ref=e145]: "0" + - paragraph [ref=e146]: skills.state.enabled + - generic [ref=e147]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: "0" + - paragraph [ref=e154]: skills.state.disabled + - generic [ref=e155]: + - generic [ref=e156]: + - img [ref=e157] + - generic [ref=e160]: "0" + - paragraph [ref=e161]: skills.card.category + - generic [ref=e162]: + - generic [ref=e163]: + - img [ref=e164] + - textbox "skills.filters.searchPlaceholder" [ref=e167] + - generic [ref=e168]: + - combobox [ref=e169] [cursor=pointer]: + - generic: skills.filters.all + - img [ref=e170] + - combobox [ref=e172] [cursor=pointer]: + - generic: skills.filters.allSources + - img [ref=e173] + - combobox [ref=e175] [cursor=pointer]: + - generic: skills.filters.all + - img [ref=e176] + - generic [ref=e178]: + - button "skills.filters.all (0)" [ref=e179] [cursor=pointer] + - button "skills.state.enabled (0)" [ref=e180] [cursor=pointer]: + - img [ref=e181] + - text: skills.state.enabled (0) + - button "skills.state.disabled (0)" [ref=e183] [cursor=pointer]: + - img [ref=e184] + - text: skills.state.disabled (0) + - button "skills.view.compact" [ref=e189] [cursor=pointer] +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/9a9c6953d81db84a2e345bffce0910a9c9b778e0.md b/ccw/frontend/playwright-report/data/9a9c6953d81db84a2e345bffce0910a9c9b778e0.md new file mode 100644 index 00000000..ca1792d0 --- /dev/null +++ b/ccw/frontend/playwright-report/data/9a9c6953d81db84a2e345bffce0910a9c9b778e0.md @@ -0,0 +1,135 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e18] + - button "common.aria.switchToDarkMode" [ref=e20] [cursor=pointer]: + - img [ref=e21] + - button "common.aria.userMenu" [ref=e24] [cursor=pointer]: + - img [ref=e25] + - generic [ref=e28]: + - navigation "Claude Code Workflow" [ref=e29]: + - navigation [ref=e30]: + - list [ref=e31]: + - listitem [ref=e32]: + - link "navigation.main.home" [ref=e33]: + - /url: / + - img [ref=e34] + - generic [ref=e37]: navigation.main.home + - listitem [ref=e38]: + - link "navigation.main.sessions" [ref=e39]: + - /url: /sessions + - img [ref=e40] + - generic [ref=e42]: navigation.main.sessions + - listitem [ref=e43]: + - link "navigation.main.liteTasks" [ref=e44]: + - /url: /lite-tasks + - img [ref=e45] + - generic [ref=e47]: navigation.main.liteTasks + - listitem [ref=e48]: + - link "navigation.main.project" [ref=e49]: + - /url: /project + - img [ref=e50] + - generic [ref=e55]: navigation.main.project + - listitem [ref=e56]: + - link "navigation.main.history" [ref=e57]: + - /url: /history + - img [ref=e58] + - generic [ref=e61]: navigation.main.history + - listitem [ref=e62]: + - link "navigation.main.orchestrator" [ref=e63]: + - /url: /orchestrator + - img [ref=e64] + - generic [ref=e68]: navigation.main.orchestrator + - listitem [ref=e69]: + - link "navigation.main.loops" [ref=e70]: + - /url: /loops + - img [ref=e71] + - generic [ref=e76]: navigation.main.loops + - listitem [ref=e77]: + - link "navigation.main.issues" [ref=e78]: + - /url: /issues + - img [ref=e79] + - generic [ref=e81]: navigation.main.issues + - listitem [ref=e82]: + - link "navigation.main.skills" [ref=e83]: + - /url: /skills + - img [ref=e84] + - generic [ref=e86]: navigation.main.skills + - listitem [ref=e87]: + - link "navigation.main.commands" [ref=e88]: + - /url: /commands + - img [ref=e89] + - generic [ref=e91]: navigation.main.commands + - listitem [ref=e92]: + - link "navigation.main.memory" [ref=e93]: + - /url: /memory + - img [ref=e94] + - generic [ref=e104]: navigation.main.memory + - listitem [ref=e105]: + - link "navigation.main.settings" [ref=e106]: + - /url: /settings + - img [ref=e107] + - generic [ref=e110]: navigation.main.settings + - listitem [ref=e111]: + - link "navigation.main.help" [ref=e112]: + - /url: /help + - img [ref=e113] + - generic [ref=e116]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e118] [cursor=pointer]: + - img [ref=e119] + - generic [ref=e122]: navigation.sidebar.collapse + - main [ref=e123]: + - generic [ref=e124]: + - generic [ref=e125]: + - generic [ref=e126]: + - heading "memory.title" [level=1] [ref=e127]: + - img [ref=e128] + - text: memory.title + - paragraph [ref=e138]: memory.description + - generic [ref=e139]: + - button "common.actions.refresh" [ref=e140] [cursor=pointer]: + - img [ref=e141] + - text: common.actions.refresh + - button "memory.actions.add" [ref=e146] [cursor=pointer]: + - img [ref=e147] + - text: memory.actions.add + - generic [ref=e148]: + - generic [ref=e150]: + - img [ref=e152] + - generic [ref=e156]: + - generic [ref=e157]: "0" + - paragraph [ref=e158]: memory.stats.count + - generic [ref=e160]: + - img [ref=e162] + - generic [ref=e165]: + - generic [ref=e166]: "0" + - paragraph [ref=e167]: memory.stats.claudeMdCount + - generic [ref=e169]: + - img [ref=e171] + - generic [ref=e181]: + - generic [ref=e182]: 0 B + - paragraph [ref=e183]: memory.stats.totalSize + - generic [ref=e185]: + - img [ref=e186] + - textbox "memory.filters.search" [ref=e189] + - generic [ref=e190]: + - img [ref=e191] + - heading "memory.emptyState.title" [level=3] [ref=e201] + - paragraph [ref=e202]: memory.emptyState.message + - button "memory.emptyState.createFirst" [ref=e203] [cursor=pointer]: + - img [ref=e204] + - text: memory.emptyState.createFirst +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/cb02cc89b036f72d51e391f540e49f54564eae7f.md b/ccw/frontend/playwright-report/data/cb02cc89b036f72d51e391f540e49f54564eae7f.md new file mode 100644 index 00000000..95c0a1e0 --- /dev/null +++ b/ccw/frontend/playwright-report/data/cb02cc89b036f72d51e391f540e49f54564eae7f.md @@ -0,0 +1,265 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6] [cursor=pointer]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e21] + - button "common.aria.switchToDarkMode" [ref=e23] [cursor=pointer]: + - img [ref=e24] + - button "common.aria.userMenu" [ref=e27] [cursor=pointer]: + - img [ref=e28] + - generic [ref=e31]: + - navigation "Claude Code Workflow" [ref=e32]: + - navigation [ref=e33]: + - list [ref=e34]: + - listitem [ref=e35]: + - link "navigation.main.home" [ref=e36] [cursor=pointer]: + - /url: / + - img [ref=e37] + - generic [ref=e40]: navigation.main.home + - listitem [ref=e41]: + - link "navigation.main.sessions" [ref=e42] [cursor=pointer]: + - /url: /sessions + - img [ref=e43] + - generic [ref=e48]: navigation.main.sessions + - listitem [ref=e49]: + - link "navigation.main.liteTasks" [ref=e50] [cursor=pointer]: + - /url: /lite-tasks + - img [ref=e51] + - generic [ref=e53]: navigation.main.liteTasks + - listitem [ref=e54]: + - link "navigation.main.project" [ref=e55] [cursor=pointer]: + - /url: /project + - img [ref=e56] + - generic [ref=e61]: navigation.main.project + - listitem [ref=e62]: + - link "navigation.main.history" [ref=e63] [cursor=pointer]: + - /url: /history + - img [ref=e64] + - generic [ref=e67]: navigation.main.history + - listitem [ref=e68]: + - link "navigation.main.orchestrator" [ref=e69] [cursor=pointer]: + - /url: /orchestrator + - img [ref=e70] + - generic [ref=e74]: navigation.main.orchestrator + - listitem [ref=e75]: + - link "navigation.main.loops" [ref=e76] [cursor=pointer]: + - /url: /loops + - img [ref=e77] + - generic [ref=e82]: navigation.main.loops + - listitem [ref=e83]: + - link "navigation.main.issues" [ref=e84] [cursor=pointer]: + - /url: /issues + - img [ref=e85] + - generic [ref=e89]: navigation.main.issues + - listitem [ref=e90]: + - link "navigation.main.skills" [ref=e91] [cursor=pointer]: + - /url: /skills + - img [ref=e92] + - generic [ref=e98]: navigation.main.skills + - listitem [ref=e99]: + - link "navigation.main.commands" [ref=e100] [cursor=pointer]: + - /url: /commands + - img [ref=e101] + - generic [ref=e104]: navigation.main.commands + - listitem [ref=e105]: + - link "navigation.main.memory" [ref=e106] [cursor=pointer]: + - /url: /memory + - img [ref=e107] + - generic [ref=e117]: navigation.main.memory + - listitem [ref=e118]: + - link "navigation.main.settings" [ref=e119] [cursor=pointer]: + - /url: /settings + - img [ref=e120] + - generic [ref=e123]: navigation.main.settings + - listitem [ref=e124]: + - link "navigation.main.help" [ref=e125] [cursor=pointer]: + - /url: /help + - img [ref=e126] + - generic [ref=e130]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e132] [cursor=pointer]: + - img [ref=e133] + - generic [ref=e137]: navigation.sidebar.collapse + - main [ref=e138]: + - generic [ref=e139]: + - generic [ref=e140]: + - heading "settings.title" [level=1] [ref=e141]: + - img [ref=e142] + - text: settings.title + - paragraph [ref=e145]: settings.description + - generic [ref=e146]: + - heading "settings.sections.appearance" [level=2] [ref=e147]: + - img [ref=e148] + - text: settings.sections.appearance + - generic [ref=e151]: + - generic [ref=e152]: + - paragraph [ref=e153]: settings.appearance.theme + - paragraph [ref=e154]: settings.appearance.description + - generic [ref=e155]: + - button "settings.appearance.themeOptions.light" [ref=e156] [cursor=pointer]: + - img [ref=e157] + - text: settings.appearance.themeOptions.light + - button "settings.appearance.themeOptions.dark" [ref=e167] [cursor=pointer]: + - img [ref=e168] + - text: settings.appearance.themeOptions.dark + - button "settings.appearance.themeOptions.system" [ref=e170] [cursor=pointer] + - generic [ref=e171]: + - heading "settings.sections.language" [level=2] [ref=e172]: + - img [ref=e173] + - text: settings.sections.language + - generic [ref=e181]: + - generic [ref=e182]: + - paragraph [ref=e183]: settings.language.displayLanguage + - paragraph [ref=e184]: settings.language.chooseLanguage + - combobox "Select language" [ref=e185] [cursor=pointer]: + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e186] + - generic [ref=e188]: + - heading "settings.sections.cliTools" [level=2] [ref=e189]: + - img [ref=e190] + - text: settings.sections.cliTools + - paragraph [ref=e201]: + - text: settings.cliTools.description + - strong [ref=e202]: gemini + - generic [ref=e203]: + - generic [ref=e205] [cursor=pointer]: + - generic [ref=e206]: + - generic [ref=e207]: + - img [ref=e209] + - generic [ref=e220]: + - generic [ref=e221]: + - generic [ref=e222]: gemini + - generic [ref=e223]: settings.cliTools.default + - generic [ref=e224]: builtin + - paragraph [ref=e225]: gemini-2.5-pro + - generic [ref=e226]: + - button "settings.cliTools.enabled" [ref=e227]: + - img [ref=e228] + - text: settings.cliTools.enabled + - img [ref=e230] + - generic [ref=e232]: + - generic [ref=e233]: analysis + - generic [ref=e234]: debug + - generic [ref=e237] [cursor=pointer]: + - generic [ref=e238]: + - img [ref=e240] + - generic [ref=e251]: + - generic [ref=e252]: + - generic [ref=e253]: qwen + - generic [ref=e254]: builtin + - paragraph [ref=e255]: coder-model + - generic [ref=e256]: + - button "settings.cliTools.enabled" [ref=e257]: + - img [ref=e258] + - text: settings.cliTools.enabled + - img [ref=e260] + - generic [ref=e264] [cursor=pointer]: + - generic [ref=e265]: + - img [ref=e267] + - generic [ref=e278]: + - generic [ref=e279]: + - generic [ref=e280]: codex + - generic [ref=e281]: builtin + - paragraph [ref=e282]: gpt-5.2 + - generic [ref=e283]: + - button "settings.cliTools.enabled" [ref=e284]: + - img [ref=e285] + - text: settings.cliTools.enabled + - img [ref=e287] + - generic [ref=e291] [cursor=pointer]: + - generic [ref=e292]: + - img [ref=e294] + - generic [ref=e305]: + - generic [ref=e306]: + - generic [ref=e307]: claude + - generic [ref=e308]: builtin + - paragraph [ref=e309]: sonnet + - generic [ref=e310]: + - button "settings.cliTools.enabled" [ref=e311]: + - img [ref=e312] + - text: settings.cliTools.enabled + - img [ref=e314] + - generic [ref=e316]: + - heading "settings.dataRefresh.title" [level=2] [ref=e317]: + - img [ref=e318] + - text: settings.dataRefresh.title + - generic [ref=e323]: + - generic [ref=e324]: + - generic [ref=e325]: + - paragraph [ref=e326]: settings.dataRefresh.autoRefresh + - paragraph [ref=e327]: settings.dataRefresh.autoRefreshDesc + - button "settings.dataRefresh.enabled" [ref=e328] [cursor=pointer] + - generic [ref=e329]: + - generic [ref=e330]: + - paragraph [ref=e331]: settings.dataRefresh.refreshInterval + - paragraph [ref=e332]: settings.dataRefresh.refreshIntervalDesc + - generic [ref=e333]: + - button "15s" [ref=e334] [cursor=pointer] + - button "30s" [ref=e335] [cursor=pointer] + - button "60s" [ref=e336] [cursor=pointer] + - button "120s" [ref=e337] [cursor=pointer] + - generic [ref=e338]: + - heading "settings.notifications.title" [level=2] [ref=e339]: + - img [ref=e340] + - text: settings.notifications.title + - generic [ref=e343]: + - generic [ref=e344]: + - generic [ref=e345]: + - paragraph [ref=e346]: settings.notifications.enableNotifications + - paragraph [ref=e347]: settings.notifications.enableNotificationsDesc + - button "settings.dataRefresh.enabled" [ref=e348] [cursor=pointer] + - generic [ref=e349]: + - generic [ref=e350]: + - paragraph [ref=e351]: settings.notifications.soundEffects + - paragraph [ref=e352]: settings.notifications.soundEffectsDesc + - button "settings.notifications.off" [ref=e353] [cursor=pointer] + - generic [ref=e354]: + - heading "settings.sections.display" [level=2] [ref=e355]: + - img [ref=e356] + - text: settings.sections.display + - generic [ref=e360]: + - generic [ref=e361]: + - paragraph [ref=e362]: settings.display.showCompletedTasks + - paragraph [ref=e363]: settings.display.showCompletedTasksDesc + - button "settings.display.show" [ref=e364] [cursor=pointer] + - generic [ref=e365]: + - generic [ref=e366]: + - heading "settings.sections.hooks" [level=2] [ref=e367]: + - img [ref=e368] + - text: settings.sections.hooks + - generic [ref=e375]: 0/0 cliHooks.stats.enabled + - generic [ref=e376]: + - img [ref=e377] + - textbox "cliHooks.filters.searchPlaceholder" [ref=e380] + - generic [ref=e386]: + - generic [ref=e387]: + - heading "settings.sections.rules" [level=2] [ref=e388]: + - img [ref=e389] + - text: settings.sections.rules + - generic [ref=e396]: 0/0 cliRules.stats.enabled + - generic [ref=e397]: + - img [ref=e398] + - textbox "cliRules.filters.searchPlaceholder" [ref=e401] + - generic [ref=e407]: + - heading "common.actions.reset" [level=2] [ref=e408]: + - img [ref=e409] + - text: common.actions.reset + - paragraph [ref=e412]: settings.reset.description + - button "common.actions.resetToDefaults" [ref=e413] [cursor=pointer]: + - img [ref=e414] + - text: common.actions.resetToDefaults +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/d5fc0e791607362e771e6a16b8e28fe06a8d361c.md b/ccw/frontend/playwright-report/data/d5fc0e791607362e771e6a16b8e28fe06a8d361c.md new file mode 100644 index 00000000..0ce87ccd --- /dev/null +++ b/ccw/frontend/playwright-report/data/d5fc0e791607362e771e6a16b8e28fe06a8d361c.md @@ -0,0 +1,183 @@ +# Page snapshot + +```yaml +- generic: + - generic: + - generic: + - banner: + - generic: + - link: + - /url: / + - img + - generic: navigation.header.brand + - generic: + - combobox [expanded]: + - img + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img + - button: + - img + - generic: + - button: + - img + - generic: + - navigation: + - navigation: + - list: + - listitem: + - link: + - /url: / + - img + - generic: navigation.main.home + - listitem: + - link: + - /url: /sessions + - img + - generic: navigation.main.sessions + - listitem: + - link: + - /url: /lite-tasks + - img + - generic: navigation.main.liteTasks + - listitem: + - link: + - /url: /project + - img + - generic: navigation.main.project + - listitem: + - link: + - /url: /history + - img + - generic: navigation.main.history + - listitem: + - link: + - /url: /orchestrator + - img + - generic: navigation.main.orchestrator + - listitem: + - link: + - /url: /loops + - img + - generic: navigation.main.loops + - listitem: + - link: + - /url: /issues + - img + - generic: navigation.main.issues + - listitem: + - link: + - /url: /skills + - img + - generic: navigation.main.skills + - listitem: + - link: + - /url: /commands + - img + - generic: navigation.main.commands + - listitem: + - link: + - /url: /memory + - img + - generic: navigation.main.memory + - listitem: + - link: + - /url: /settings + - img + - generic: navigation.main.settings + - listitem: + - link: + - /url: /help + - img + - generic: navigation.main.help + - generic: + - button: + - img + - generic: navigation.sidebar.collapse + - main: + - generic: + - generic: + - generic: + - heading [level=1]: home.title + - paragraph: home.description + - button: + - img + - text: common.actions.refresh + - generic: + - heading [level=2]: home.sections.statistics + - generic: + - generic: + - generic: + - generic: + - generic: + - paragraph: home.stats.activeSessions + - generic: + - paragraph: "0" + - generic: + - img + - generic: + - generic: + - generic: + - generic: + - paragraph: home.stats.totalTasks + - generic: + - paragraph: "0" + - generic: + - img + - generic: + - generic: + - generic: + - generic: + - paragraph: home.stats.completedTasks + - generic: + - paragraph: "0" + - generic: + - img + - generic: + - generic: + - generic: + - generic: + - paragraph: home.stats.pendingTasks + - generic: + - paragraph: "0" + - generic: + - img + - generic: + - generic: + - generic: + - generic: + - paragraph: common.status.failed + - generic: + - paragraph: "0" + - generic: + - img + - generic: + - generic: + - generic: + - generic: + - paragraph: common.stats.todayActivity + - generic: + - paragraph: "0" + - generic: + - img + - generic: + - generic: + - heading [level=2]: home.sections.recentSessions + - button: common.actions.viewAll + - generic: + - img + - heading [level=3]: home.emptyState.noSessions.title + - paragraph: home.emptyState.noSessions.message + - listbox [ref=e1]: + - option "🇺🇸 English" [ref=e2]: + - generic [ref=e5]: + - generic [ref=e6]: 🇺🇸 + - generic [ref=e7]: English + - option "🇨🇳 中文" [active] [selected] [ref=e8]: + - img [ref=e11] + - generic [ref=e14]: + - generic [ref=e15]: 🇨🇳 + - generic [ref=e16]: 中文 +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/d7a9772441a2dad22161b466f95904edbe1188a1.md b/ccw/frontend/playwright-report/data/d7a9772441a2dad22161b466f95904edbe1188a1.md new file mode 100644 index 00000000..e87c529e --- /dev/null +++ b/ccw/frontend/playwright-report/data/d7a9772441a2dad22161b466f95904edbe1188a1.md @@ -0,0 +1,144 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6] [cursor=pointer]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e18] + - button "common.aria.switchToDarkMode" [ref=e20] [cursor=pointer]: + - img [ref=e21] + - button "common.aria.userMenu" [ref=e24] [cursor=pointer]: + - img [ref=e25] + - generic [ref=e28]: + - navigation "Claude Code Workflow" [ref=e29]: + - navigation [ref=e30]: + - list [ref=e31]: + - listitem [ref=e32]: + - link "navigation.main.home" [ref=e33] [cursor=pointer]: + - /url: / + - img [ref=e34] + - generic [ref=e37]: navigation.main.home + - listitem [ref=e38]: + - link "navigation.main.sessions" [ref=e39] [cursor=pointer]: + - /url: /sessions + - img [ref=e40] + - generic [ref=e42]: navigation.main.sessions + - listitem [ref=e43]: + - link "navigation.main.liteTasks" [ref=e44] [cursor=pointer]: + - /url: /lite-tasks + - img [ref=e45] + - generic [ref=e47]: navigation.main.liteTasks + - listitem [ref=e48]: + - link "navigation.main.project" [ref=e49] [cursor=pointer]: + - /url: /project + - img [ref=e50] + - generic [ref=e55]: navigation.main.project + - listitem [ref=e56]: + - link "navigation.main.history" [ref=e57] [cursor=pointer]: + - /url: /history + - img [ref=e58] + - generic [ref=e61]: navigation.main.history + - listitem [ref=e62]: + - link "navigation.main.orchestrator" [ref=e63] [cursor=pointer]: + - /url: /orchestrator + - img [ref=e64] + - generic [ref=e68]: navigation.main.orchestrator + - listitem [ref=e69]: + - link "navigation.main.loops" [ref=e70] [cursor=pointer]: + - /url: /loops + - img [ref=e71] + - generic [ref=e76]: navigation.main.loops + - listitem [ref=e77]: + - link "navigation.main.issues" [ref=e78] [cursor=pointer]: + - /url: /issues + - img [ref=e79] + - generic [ref=e81]: navigation.main.issues + - listitem [ref=e82]: + - link "navigation.main.skills" [ref=e83] [cursor=pointer]: + - /url: /skills + - img [ref=e84] + - generic [ref=e86]: navigation.main.skills + - listitem [ref=e87]: + - link "navigation.main.commands" [ref=e88] [cursor=pointer]: + - /url: /commands + - img [ref=e89] + - generic [ref=e91]: navigation.main.commands + - listitem [ref=e92]: + - link "navigation.main.memory" [ref=e93] [cursor=pointer]: + - /url: /memory + - img [ref=e94] + - generic [ref=e104]: navigation.main.memory + - listitem [ref=e105]: + - link "navigation.main.settings" [ref=e106] [cursor=pointer]: + - /url: /settings + - img [ref=e107] + - generic [ref=e110]: navigation.main.settings + - listitem [ref=e111]: + - link "navigation.main.help" [ref=e112] [cursor=pointer]: + - /url: /help + - img [ref=e113] + - generic [ref=e116]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e118] [cursor=pointer]: + - img [ref=e119] + - generic [ref=e122]: navigation.sidebar.collapse + - main [ref=e123]: + - generic [ref=e124]: + - generic [ref=e125]: + - generic [ref=e126]: + - heading "home.title" [level=1] [ref=e127] + - paragraph [ref=e128]: home.description + - button "common.actions.refresh" [ref=e129] [cursor=pointer]: + - img [ref=e130] + - text: common.actions.refresh + - generic [ref=e135]: + - heading "home.sections.statistics" [level=2] [ref=e136] + - generic [ref=e137]: + - generic [ref=e140]: + - generic [ref=e141]: + - paragraph [ref=e142]: home.stats.activeSessions + - paragraph [ref=e144]: "0" + - img [ref=e146] + - generic [ref=e150]: + - generic [ref=e151]: + - paragraph [ref=e152]: home.stats.totalTasks + - paragraph [ref=e154]: "0" + - img [ref=e156] + - generic [ref=e161]: + - generic [ref=e162]: + - paragraph [ref=e163]: home.stats.completedTasks + - paragraph [ref=e165]: "0" + - img [ref=e167] + - generic [ref=e172]: + - generic [ref=e173]: + - paragraph [ref=e174]: home.stats.pendingTasks + - paragraph [ref=e176]: "0" + - img [ref=e178] + - generic [ref=e183]: + - generic [ref=e184]: + - paragraph [ref=e185]: common.status.failed + - paragraph [ref=e187]: "0" + - img [ref=e189] + - generic [ref=e195]: + - generic [ref=e196]: + - paragraph [ref=e197]: common.stats.todayActivity + - paragraph [ref=e199]: "0" + - img [ref=e201] + - generic [ref=e203]: + - generic [ref=e204]: + - heading "home.sections.recentSessions" [level=2] [ref=e205] + - button "common.actions.viewAll" [ref=e206] [cursor=pointer] + - generic [ref=e207]: + - img [ref=e208] + - heading "home.emptyState.noSessions.title" [level=3] [ref=e210] + - paragraph [ref=e211]: home.emptyState.noSessions.message +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/e119ac6c858cee9ad3c4367e13ce141f7a8a1651.md b/ccw/frontend/playwright-report/data/e119ac6c858cee9ad3c4367e13ce141f7a8a1651.md new file mode 100644 index 00000000..16d6c6b0 --- /dev/null +++ b/ccw/frontend/playwright-report/data/e119ac6c858cee9ad3c4367e13ce141f7a8a1651.md @@ -0,0 +1,128 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6] [cursor=pointer]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e21] + - button "common.aria.switchToDarkMode" [ref=e23] [cursor=pointer]: + - img [ref=e24] + - button "common.aria.userMenu" [ref=e27] [cursor=pointer]: + - img [ref=e28] + - generic [ref=e31]: + - navigation "Claude Code Workflow" [ref=e32]: + - navigation [ref=e33]: + - list [ref=e34]: + - listitem [ref=e35]: + - link "navigation.main.home" [ref=e36] [cursor=pointer]: + - /url: / + - img [ref=e37] + - generic [ref=e40]: navigation.main.home + - listitem [ref=e41]: + - link "navigation.main.sessions" [ref=e42] [cursor=pointer]: + - /url: /sessions + - img [ref=e43] + - generic [ref=e48]: navigation.main.sessions + - listitem [ref=e49]: + - link "navigation.main.liteTasks" [ref=e50] [cursor=pointer]: + - /url: /lite-tasks + - img [ref=e51] + - generic [ref=e53]: navigation.main.liteTasks + - listitem [ref=e54]: + - link "navigation.main.project" [ref=e55] [cursor=pointer]: + - /url: /project + - img [ref=e56] + - generic [ref=e61]: navigation.main.project + - listitem [ref=e62]: + - link "navigation.main.history" [ref=e63] [cursor=pointer]: + - /url: /history + - img [ref=e64] + - generic [ref=e67]: navigation.main.history + - listitem [ref=e68]: + - link "navigation.main.orchestrator" [ref=e69] [cursor=pointer]: + - /url: /orchestrator + - img [ref=e70] + - generic [ref=e74]: navigation.main.orchestrator + - listitem [ref=e75]: + - link "navigation.main.loops" [ref=e76] [cursor=pointer]: + - /url: /loops + - img [ref=e77] + - generic [ref=e82]: navigation.main.loops + - listitem [ref=e83]: + - link "navigation.main.issues" [ref=e84] [cursor=pointer]: + - /url: /issues + - img [ref=e85] + - generic [ref=e89]: navigation.main.issues + - listitem [ref=e90]: + - link "navigation.main.skills" [ref=e91] [cursor=pointer]: + - /url: /skills + - img [ref=e92] + - generic [ref=e98]: navigation.main.skills + - listitem [ref=e99]: + - link "navigation.main.commands" [ref=e100] [cursor=pointer]: + - /url: /commands + - img [ref=e101] + - generic [ref=e104]: navigation.main.commands + - listitem [ref=e105]: + - link "navigation.main.memory" [ref=e106] [cursor=pointer]: + - /url: /memory + - img [ref=e107] + - generic [ref=e117]: navigation.main.memory + - listitem [ref=e118]: + - link "navigation.main.settings" [ref=e119] [cursor=pointer]: + - /url: /settings + - img [ref=e120] + - generic [ref=e123]: navigation.main.settings + - listitem [ref=e124]: + - link "navigation.main.help" [ref=e125] [cursor=pointer]: + - /url: /help + - img [ref=e126] + - generic [ref=e130]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e132] [cursor=pointer]: + - img [ref=e133] + - generic [ref=e137]: navigation.sidebar.collapse + - main [ref=e138]: + - generic [ref=e139]: + - generic [ref=e140]: + - generic [ref=e141]: + - heading "memory.title" [level=1] [ref=e142]: + - img [ref=e143] + - text: memory.title + - paragraph [ref=e153]: memory.description + - generic [ref=e154]: + - button "common.actions.refresh" [disabled]: + - img + - text: common.actions.refresh + - button "memory.actions.add" [ref=e155] [cursor=pointer]: + - img [ref=e156] + - text: memory.actions.add + - generic [ref=e159]: + - generic [ref=e161]: + - img [ref=e163] + - generic [ref=e167]: + - generic [ref=e168]: "0" + - paragraph [ref=e169]: memory.stats.count + - generic [ref=e171]: + - img [ref=e173] + - generic [ref=e179]: + - generic [ref=e180]: "0" + - paragraph [ref=e181]: memory.stats.claudeMdCount + - generic [ref=e183]: + - img [ref=e185] + - generic [ref=e195]: + - generic [ref=e196]: 0 B + - paragraph [ref=e197]: memory.stats.totalSize + - generic [ref=e199]: + - img [ref=e200] + - textbox "memory.filters.search" [ref=e203] +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/e12890e1d9aac9689b5d6d1b720b5141662d8562.md b/ccw/frontend/playwright-report/data/e12890e1d9aac9689b5d6d1b720b5141662d8562.md new file mode 100644 index 00000000..10950934 --- /dev/null +++ b/ccw/frontend/playwright-report/data/e12890e1d9aac9689b5d6d1b720b5141662d8562.md @@ -0,0 +1,153 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6] [cursor=pointer]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e18] + - button "common.aria.switchToDarkMode" [ref=e20] [cursor=pointer]: + - img [ref=e21] + - button "common.aria.userMenu" [ref=e24] [cursor=pointer]: + - img [ref=e25] + - generic [ref=e28]: + - navigation "Claude Code Workflow" [ref=e29]: + - navigation [ref=e30]: + - list [ref=e31]: + - listitem [ref=e32]: + - link "navigation.main.home" [ref=e33] [cursor=pointer]: + - /url: / + - img [ref=e34] + - generic [ref=e37]: navigation.main.home + - listitem [ref=e38]: + - link "navigation.main.sessions" [ref=e39] [cursor=pointer]: + - /url: /sessions + - img [ref=e40] + - generic [ref=e42]: navigation.main.sessions + - listitem [ref=e43]: + - link "navigation.main.liteTasks" [ref=e44] [cursor=pointer]: + - /url: /lite-tasks + - img [ref=e45] + - generic [ref=e47]: navigation.main.liteTasks + - listitem [ref=e48]: + - link "navigation.main.project" [ref=e49] [cursor=pointer]: + - /url: /project + - img [ref=e50] + - generic [ref=e55]: navigation.main.project + - listitem [ref=e56]: + - link "navigation.main.history" [ref=e57] [cursor=pointer]: + - /url: /history + - img [ref=e58] + - generic [ref=e61]: navigation.main.history + - listitem [ref=e62]: + - link "navigation.main.orchestrator" [ref=e63] [cursor=pointer]: + - /url: /orchestrator + - img [ref=e64] + - generic [ref=e68]: navigation.main.orchestrator + - listitem [ref=e69]: + - link "navigation.main.loops" [ref=e70] [cursor=pointer]: + - /url: /loops + - img [ref=e71] + - generic [ref=e76]: navigation.main.loops + - listitem [ref=e77]: + - link "navigation.main.issues" [ref=e78] [cursor=pointer]: + - /url: /issues + - img [ref=e79] + - generic [ref=e81]: navigation.main.issues + - listitem [ref=e82]: + - link "navigation.main.skills" [ref=e83] [cursor=pointer]: + - /url: /skills + - img [ref=e84] + - generic [ref=e86]: navigation.main.skills + - listitem [ref=e87]: + - link "navigation.main.commands" [ref=e88] [cursor=pointer]: + - /url: /commands + - img [ref=e89] + - generic [ref=e91]: navigation.main.commands + - listitem [ref=e92]: + - link "navigation.main.memory" [ref=e93] [cursor=pointer]: + - /url: /memory + - img [ref=e94] + - generic [ref=e104]: navigation.main.memory + - listitem [ref=e105]: + - link "navigation.main.settings" [ref=e106] [cursor=pointer]: + - /url: /settings + - img [ref=e107] + - generic [ref=e110]: navigation.main.settings + - listitem [ref=e111]: + - link "navigation.main.help" [ref=e112] [cursor=pointer]: + - /url: /help + - img [ref=e113] + - generic [ref=e116]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e118] [cursor=pointer]: + - img [ref=e119] + - generic [ref=e122]: navigation.sidebar.collapse + - main [ref=e123]: + - generic [ref=e124]: + - generic [ref=e125]: + - generic [ref=e126]: + - heading "skills.title" [level=1] [ref=e127]: + - img [ref=e128] + - text: skills.title + - paragraph [ref=e130]: skills.description + - generic [ref=e131]: + - button "common.actions.refresh" [disabled]: + - img + - text: common.actions.refresh + - button "skills.actions.install" [ref=e132] [cursor=pointer]: + - img [ref=e133] + - text: skills.actions.install + - generic [ref=e134]: + - generic [ref=e135]: + - generic [ref=e136]: + - img [ref=e137] + - generic [ref=e139]: "0" + - paragraph [ref=e140]: common.stats.totalSkills + - generic [ref=e141]: + - generic [ref=e142]: + - img [ref=e143] + - generic [ref=e145]: "0" + - paragraph [ref=e146]: skills.state.enabled + - generic [ref=e147]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: "0" + - paragraph [ref=e154]: skills.state.disabled + - generic [ref=e155]: + - generic [ref=e156]: + - img [ref=e157] + - generic [ref=e160]: "0" + - paragraph [ref=e161]: skills.card.category + - generic [ref=e162]: + - generic [ref=e163]: + - img [ref=e164] + - textbox "skills.filters.searchPlaceholder" [ref=e167] + - generic [ref=e168]: + - combobox [ref=e169] [cursor=pointer]: + - generic: skills.filters.all + - img [ref=e170] + - combobox [ref=e172] [cursor=pointer]: + - generic: skills.filters.allSources + - img [ref=e173] + - combobox [ref=e175] [cursor=pointer]: + - generic: skills.filters.all + - img [ref=e176] + - generic [ref=e178]: + - button "skills.filters.all (0)" [ref=e179] [cursor=pointer] + - button "skills.state.enabled (0)" [ref=e180] [cursor=pointer]: + - img [ref=e181] + - text: skills.state.enabled (0) + - button "skills.state.disabled (0)" [ref=e183] [cursor=pointer]: + - img [ref=e184] + - text: skills.state.disabled (0) + - button "skills.view.compact" [ref=e189] [cursor=pointer] +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/e1412618739de5c5e4dbb83d0de1ecdeca750fbb.md b/ccw/frontend/playwright-report/data/e1412618739de5c5e4dbb83d0de1ecdeca750fbb.md new file mode 100644 index 00000000..daf141d0 --- /dev/null +++ b/ccw/frontend/playwright-report/data/e1412618739de5c5e4dbb83d0de1ecdeca750fbb.md @@ -0,0 +1,144 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e18] + - button "common.aria.switchToDarkMode" [ref=e20] [cursor=pointer]: + - img [ref=e21] + - button "common.aria.userMenu" [ref=e24] [cursor=pointer]: + - img [ref=e25] + - generic [ref=e28]: + - navigation "Claude Code Workflow" [ref=e29]: + - navigation [ref=e30]: + - list [ref=e31]: + - listitem [ref=e32]: + - link "navigation.main.home" [ref=e33]: + - /url: / + - img [ref=e34] + - generic [ref=e37]: navigation.main.home + - listitem [ref=e38]: + - link "navigation.main.sessions" [ref=e39]: + - /url: /sessions + - img [ref=e40] + - generic [ref=e42]: navigation.main.sessions + - listitem [ref=e43]: + - link "navigation.main.liteTasks" [ref=e44]: + - /url: /lite-tasks + - img [ref=e45] + - generic [ref=e47]: navigation.main.liteTasks + - listitem [ref=e48]: + - link "navigation.main.project" [ref=e49]: + - /url: /project + - img [ref=e50] + - generic [ref=e55]: navigation.main.project + - listitem [ref=e56]: + - link "navigation.main.history" [ref=e57]: + - /url: /history + - img [ref=e58] + - generic [ref=e61]: navigation.main.history + - listitem [ref=e62]: + - link "navigation.main.orchestrator" [ref=e63]: + - /url: /orchestrator + - img [ref=e64] + - generic [ref=e68]: navigation.main.orchestrator + - listitem [ref=e69]: + - link "navigation.main.loops" [ref=e70]: + - /url: /loops + - img [ref=e71] + - generic [ref=e76]: navigation.main.loops + - listitem [ref=e77]: + - link "navigation.main.issues" [ref=e78]: + - /url: /issues + - img [ref=e79] + - generic [ref=e81]: navigation.main.issues + - listitem [ref=e82]: + - link "navigation.main.skills" [ref=e83]: + - /url: /skills + - img [ref=e84] + - generic [ref=e86]: navigation.main.skills + - listitem [ref=e87]: + - link "navigation.main.commands" [ref=e88]: + - /url: /commands + - img [ref=e89] + - generic [ref=e91]: navigation.main.commands + - listitem [ref=e92]: + - link "navigation.main.memory" [ref=e93]: + - /url: /memory + - img [ref=e94] + - generic [ref=e104]: navigation.main.memory + - listitem [ref=e105]: + - link "navigation.main.settings" [ref=e106]: + - /url: /settings + - img [ref=e107] + - generic [ref=e110]: navigation.main.settings + - listitem [ref=e111]: + - link "navigation.main.help" [ref=e112]: + - /url: /help + - img [ref=e113] + - generic [ref=e116]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e118] [cursor=pointer]: + - img [ref=e119] + - generic [ref=e122]: navigation.sidebar.collapse + - main [ref=e123]: + - generic [ref=e124]: + - generic [ref=e125]: + - generic [ref=e126]: + - heading "home.title" [level=1] [ref=e127] + - paragraph [ref=e128]: home.description + - button "common.actions.refresh" [ref=e129] [cursor=pointer]: + - img [ref=e130] + - text: common.actions.refresh + - generic [ref=e135]: + - heading "home.sections.statistics" [level=2] [ref=e136] + - generic [ref=e137]: + - generic [ref=e140]: + - generic [ref=e141]: + - paragraph [ref=e142]: home.stats.activeSessions + - paragraph [ref=e144]: "0" + - img [ref=e146] + - generic [ref=e150]: + - generic [ref=e151]: + - paragraph [ref=e152]: home.stats.totalTasks + - paragraph [ref=e154]: "0" + - img [ref=e156] + - generic [ref=e161]: + - generic [ref=e162]: + - paragraph [ref=e163]: home.stats.completedTasks + - paragraph [ref=e165]: "0" + - img [ref=e167] + - generic [ref=e172]: + - generic [ref=e173]: + - paragraph [ref=e174]: home.stats.pendingTasks + - paragraph [ref=e176]: "0" + - img [ref=e178] + - generic [ref=e183]: + - generic [ref=e184]: + - paragraph [ref=e185]: common.status.failed + - paragraph [ref=e187]: "0" + - img [ref=e189] + - generic [ref=e195]: + - generic [ref=e196]: + - paragraph [ref=e197]: common.stats.todayActivity + - paragraph [ref=e199]: "0" + - img [ref=e201] + - generic [ref=e203]: + - generic [ref=e204]: + - heading "home.sections.recentSessions" [level=2] [ref=e205] + - button "common.actions.viewAll" [ref=e206] [cursor=pointer] + - generic [ref=e207]: + - img [ref=e208] + - heading "home.emptyState.noSessions.title" [level=3] [ref=e210] + - paragraph [ref=e211]: home.emptyState.noSessions.message +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/e48ac45e7276feee01c6a8acc875404b2031d615.md b/ccw/frontend/playwright-report/data/e48ac45e7276feee01c6a8acc875404b2031d615.md new file mode 100644 index 00000000..899a45f6 --- /dev/null +++ b/ccw/frontend/playwright-report/data/e48ac45e7276feee01c6a8acc875404b2031d615.md @@ -0,0 +1,153 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6] [cursor=pointer]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e21] + - button "common.aria.switchToDarkMode" [ref=e23] [cursor=pointer]: + - img [ref=e24] + - button "common.aria.userMenu" [ref=e27] [cursor=pointer]: + - img [ref=e28] + - generic [ref=e31]: + - navigation "Claude Code Workflow" [ref=e32]: + - navigation [ref=e33]: + - list [ref=e34]: + - listitem [ref=e35]: + - link "navigation.main.home" [ref=e36] [cursor=pointer]: + - /url: / + - img [ref=e37] + - generic [ref=e40]: navigation.main.home + - listitem [ref=e41]: + - link "navigation.main.sessions" [ref=e42] [cursor=pointer]: + - /url: /sessions + - img [ref=e43] + - generic [ref=e48]: navigation.main.sessions + - listitem [ref=e49]: + - link "navigation.main.liteTasks" [ref=e50] [cursor=pointer]: + - /url: /lite-tasks + - img [ref=e51] + - generic [ref=e53]: navigation.main.liteTasks + - listitem [ref=e54]: + - link "navigation.main.project" [ref=e55] [cursor=pointer]: + - /url: /project + - img [ref=e56] + - generic [ref=e61]: navigation.main.project + - listitem [ref=e62]: + - link "navigation.main.history" [ref=e63] [cursor=pointer]: + - /url: /history + - img [ref=e64] + - generic [ref=e67]: navigation.main.history + - listitem [ref=e68]: + - link "navigation.main.orchestrator" [ref=e69] [cursor=pointer]: + - /url: /orchestrator + - img [ref=e70] + - generic [ref=e74]: navigation.main.orchestrator + - listitem [ref=e75]: + - link "navigation.main.loops" [ref=e76] [cursor=pointer]: + - /url: /loops + - img [ref=e77] + - generic [ref=e82]: navigation.main.loops + - listitem [ref=e83]: + - link "navigation.main.issues" [ref=e84] [cursor=pointer]: + - /url: /issues + - img [ref=e85] + - generic [ref=e89]: navigation.main.issues + - listitem [ref=e90]: + - link "navigation.main.skills" [ref=e91] [cursor=pointer]: + - /url: /skills + - img [ref=e92] + - generic [ref=e98]: navigation.main.skills + - listitem [ref=e99]: + - link "navigation.main.commands" [ref=e100] [cursor=pointer]: + - /url: /commands + - img [ref=e101] + - generic [ref=e104]: navigation.main.commands + - listitem [ref=e105]: + - link "navigation.main.memory" [ref=e106] [cursor=pointer]: + - /url: /memory + - img [ref=e107] + - generic [ref=e117]: navigation.main.memory + - listitem [ref=e118]: + - link "navigation.main.settings" [ref=e119] [cursor=pointer]: + - /url: /settings + - img [ref=e120] + - generic [ref=e123]: navigation.main.settings + - listitem [ref=e124]: + - link "navigation.main.help" [ref=e125] [cursor=pointer]: + - /url: /help + - img [ref=e126] + - generic [ref=e130]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e132] [cursor=pointer]: + - img [ref=e133] + - generic [ref=e137]: navigation.sidebar.collapse + - main [ref=e138]: + - generic [ref=e139]: + - generic [ref=e140]: + - generic [ref=e141]: + - heading "skills.title" [level=1] [ref=e142]: + - img [ref=e143] + - text: skills.title + - paragraph [ref=e149]: skills.description + - generic [ref=e150]: + - button "common.actions.refresh" [disabled]: + - img + - text: common.actions.refresh + - button "skills.actions.install" [ref=e151] [cursor=pointer]: + - img [ref=e152] + - text: skills.actions.install + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - img [ref=e158] + - generic [ref=e164]: "0" + - paragraph [ref=e165]: common.stats.totalSkills + - generic [ref=e166]: + - generic [ref=e167]: + - img [ref=e168] + - generic [ref=e171]: "0" + - paragraph [ref=e172]: skills.state.enabled + - generic [ref=e173]: + - generic [ref=e174]: + - img [ref=e175] + - generic [ref=e180]: "0" + - paragraph [ref=e181]: skills.state.disabled + - generic [ref=e182]: + - generic [ref=e183]: + - img [ref=e184] + - generic [ref=e187]: "0" + - paragraph [ref=e188]: skills.card.category + - generic [ref=e189]: + - generic [ref=e190]: + - img [ref=e191] + - textbox "skills.filters.searchPlaceholder" [ref=e194] + - generic [ref=e195]: + - combobox [ref=e196] [cursor=pointer]: + - generic: skills.filters.all + - img [ref=e197] + - combobox [ref=e199] [cursor=pointer]: + - generic: skills.filters.allSources + - img [ref=e200] + - combobox [ref=e202] [cursor=pointer]: + - generic: skills.filters.all + - img [ref=e203] + - generic [ref=e205]: + - button "skills.filters.all (0)" [ref=e206] [cursor=pointer] + - button "skills.state.enabled (0)" [ref=e207] [cursor=pointer]: + - img [ref=e208] + - text: skills.state.enabled (0) + - button "skills.state.disabled (0)" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - text: skills.state.disabled (0) + - button "skills.view.compact" [ref=e218] [cursor=pointer] +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/data/f5ec99f0ca30a7d3cbf7d780f74ebb49487aaf93.md b/ccw/frontend/playwright-report/data/f5ec99f0ca30a7d3cbf7d780f74ebb49487aaf93.md new file mode 100644 index 00000000..bcfadf42 --- /dev/null +++ b/ccw/frontend/playwright-report/data/f5ec99f0ca30a7d3cbf7d780f74ebb49487aaf93.md @@ -0,0 +1,265 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - banner [ref=e4]: + - link "navigation.header.brand" [ref=e6] [cursor=pointer]: + - /url: / + - img [ref=e7] + - generic [ref=e11]: navigation.header.brand + - generic [ref=e12]: + - combobox "Select language" [active] [ref=e13] [cursor=pointer]: + - img [ref=e14] + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e18] + - button "common.aria.switchToDarkMode" [ref=e20] [cursor=pointer]: + - img [ref=e21] + - button "common.aria.userMenu" [ref=e24] [cursor=pointer]: + - img [ref=e25] + - generic [ref=e28]: + - navigation "Claude Code Workflow" [ref=e29]: + - navigation [ref=e30]: + - list [ref=e31]: + - listitem [ref=e32]: + - link "navigation.main.home" [ref=e33] [cursor=pointer]: + - /url: / + - img [ref=e34] + - generic [ref=e37]: navigation.main.home + - listitem [ref=e38]: + - link "navigation.main.sessions" [ref=e39] [cursor=pointer]: + - /url: /sessions + - img [ref=e40] + - generic [ref=e42]: navigation.main.sessions + - listitem [ref=e43]: + - link "navigation.main.liteTasks" [ref=e44] [cursor=pointer]: + - /url: /lite-tasks + - img [ref=e45] + - generic [ref=e47]: navigation.main.liteTasks + - listitem [ref=e48]: + - link "navigation.main.project" [ref=e49] [cursor=pointer]: + - /url: /project + - img [ref=e50] + - generic [ref=e55]: navigation.main.project + - listitem [ref=e56]: + - link "navigation.main.history" [ref=e57] [cursor=pointer]: + - /url: /history + - img [ref=e58] + - generic [ref=e61]: navigation.main.history + - listitem [ref=e62]: + - link "navigation.main.orchestrator" [ref=e63] [cursor=pointer]: + - /url: /orchestrator + - img [ref=e64] + - generic [ref=e68]: navigation.main.orchestrator + - listitem [ref=e69]: + - link "navigation.main.loops" [ref=e70] [cursor=pointer]: + - /url: /loops + - img [ref=e71] + - generic [ref=e76]: navigation.main.loops + - listitem [ref=e77]: + - link "navigation.main.issues" [ref=e78] [cursor=pointer]: + - /url: /issues + - img [ref=e79] + - generic [ref=e81]: navigation.main.issues + - listitem [ref=e82]: + - link "navigation.main.skills" [ref=e83] [cursor=pointer]: + - /url: /skills + - img [ref=e84] + - generic [ref=e86]: navigation.main.skills + - listitem [ref=e87]: + - link "navigation.main.commands" [ref=e88] [cursor=pointer]: + - /url: /commands + - img [ref=e89] + - generic [ref=e91]: navigation.main.commands + - listitem [ref=e92]: + - link "navigation.main.memory" [ref=e93] [cursor=pointer]: + - /url: /memory + - img [ref=e94] + - generic [ref=e104]: navigation.main.memory + - listitem [ref=e105]: + - link "navigation.main.settings" [ref=e106] [cursor=pointer]: + - /url: /settings + - img [ref=e107] + - generic [ref=e110]: navigation.main.settings + - listitem [ref=e111]: + - link "navigation.main.help" [ref=e112] [cursor=pointer]: + - /url: /help + - img [ref=e113] + - generic [ref=e116]: navigation.main.help + - button "navigation.sidebar.collapseAria" [ref=e118] [cursor=pointer]: + - img [ref=e119] + - generic [ref=e122]: navigation.sidebar.collapse + - main [ref=e123]: + - generic [ref=e124]: + - generic [ref=e125]: + - heading "settings.title" [level=1] [ref=e126]: + - img [ref=e127] + - text: settings.title + - paragraph [ref=e130]: settings.description + - generic [ref=e131]: + - heading "settings.sections.appearance" [level=2] [ref=e132]: + - img [ref=e133] + - text: settings.sections.appearance + - generic [ref=e136]: + - generic [ref=e137]: + - paragraph [ref=e138]: settings.appearance.theme + - paragraph [ref=e139]: settings.appearance.description + - generic [ref=e140]: + - button "settings.appearance.themeOptions.light" [ref=e141] [cursor=pointer]: + - img [ref=e142] + - text: settings.appearance.themeOptions.light + - button "settings.appearance.themeOptions.dark" [ref=e148] [cursor=pointer]: + - img [ref=e149] + - text: settings.appearance.themeOptions.dark + - button "settings.appearance.themeOptions.system" [ref=e151] [cursor=pointer] + - generic [ref=e152]: + - heading "settings.sections.language" [level=2] [ref=e153]: + - img [ref=e154] + - text: settings.sections.language + - generic [ref=e159]: + - generic [ref=e160]: + - paragraph [ref=e161]: settings.language.displayLanguage + - paragraph [ref=e162]: settings.language.chooseLanguage + - combobox "Select language" [ref=e163] [cursor=pointer]: + - generic: + - generic: + - generic: 🇨🇳 + - generic: 中文 + - img [ref=e164] + - generic [ref=e166]: + - heading "settings.sections.cliTools" [level=2] [ref=e167]: + - img [ref=e168] + - text: settings.sections.cliTools + - paragraph [ref=e171]: + - text: settings.cliTools.description + - strong [ref=e172]: gemini + - generic [ref=e173]: + - generic [ref=e175] [cursor=pointer]: + - generic [ref=e176]: + - generic [ref=e177]: + - img [ref=e179] + - generic [ref=e182]: + - generic [ref=e183]: + - generic [ref=e184]: gemini + - generic [ref=e185]: settings.cliTools.default + - generic [ref=e186]: builtin + - paragraph [ref=e187]: gemini-2.5-pro + - generic [ref=e188]: + - button "settings.cliTools.enabled" [ref=e189]: + - img [ref=e190] + - text: settings.cliTools.enabled + - img [ref=e192] + - generic [ref=e194]: + - generic [ref=e195]: analysis + - generic [ref=e196]: debug + - generic [ref=e199] [cursor=pointer]: + - generic [ref=e200]: + - img [ref=e202] + - generic [ref=e205]: + - generic [ref=e206]: + - generic [ref=e207]: qwen + - generic [ref=e208]: builtin + - paragraph [ref=e209]: coder-model + - generic [ref=e210]: + - button "settings.cliTools.enabled" [ref=e211]: + - img [ref=e212] + - text: settings.cliTools.enabled + - img [ref=e214] + - generic [ref=e218] [cursor=pointer]: + - generic [ref=e219]: + - img [ref=e221] + - generic [ref=e224]: + - generic [ref=e225]: + - generic [ref=e226]: codex + - generic [ref=e227]: builtin + - paragraph [ref=e228]: gpt-5.2 + - generic [ref=e229]: + - button "settings.cliTools.enabled" [ref=e230]: + - img [ref=e231] + - text: settings.cliTools.enabled + - img [ref=e233] + - generic [ref=e237] [cursor=pointer]: + - generic [ref=e238]: + - img [ref=e240] + - generic [ref=e243]: + - generic [ref=e244]: + - generic [ref=e245]: claude + - generic [ref=e246]: builtin + - paragraph [ref=e247]: sonnet + - generic [ref=e248]: + - button "settings.cliTools.enabled" [ref=e249]: + - img [ref=e250] + - text: settings.cliTools.enabled + - img [ref=e252] + - generic [ref=e254]: + - heading "settings.dataRefresh.title" [level=2] [ref=e255]: + - img [ref=e256] + - text: settings.dataRefresh.title + - generic [ref=e261]: + - generic [ref=e262]: + - generic [ref=e263]: + - paragraph [ref=e264]: settings.dataRefresh.autoRefresh + - paragraph [ref=e265]: settings.dataRefresh.autoRefreshDesc + - button "settings.dataRefresh.enabled" [ref=e266] [cursor=pointer] + - generic [ref=e267]: + - generic [ref=e268]: + - paragraph [ref=e269]: settings.dataRefresh.refreshInterval + - paragraph [ref=e270]: settings.dataRefresh.refreshIntervalDesc + - generic [ref=e271]: + - button "15s" [ref=e272] [cursor=pointer] + - button "30s" [ref=e273] [cursor=pointer] + - button "60s" [ref=e274] [cursor=pointer] + - button "120s" [ref=e275] [cursor=pointer] + - generic [ref=e276]: + - heading "settings.notifications.title" [level=2] [ref=e277]: + - img [ref=e278] + - text: settings.notifications.title + - generic [ref=e281]: + - generic [ref=e282]: + - generic [ref=e283]: + - paragraph [ref=e284]: settings.notifications.enableNotifications + - paragraph [ref=e285]: settings.notifications.enableNotificationsDesc + - button "settings.dataRefresh.enabled" [ref=e286] [cursor=pointer] + - generic [ref=e287]: + - generic [ref=e288]: + - paragraph [ref=e289]: settings.notifications.soundEffects + - paragraph [ref=e290]: settings.notifications.soundEffectsDesc + - button "settings.notifications.off" [ref=e291] [cursor=pointer] + - generic [ref=e292]: + - heading "settings.sections.display" [level=2] [ref=e293]: + - img [ref=e294] + - text: settings.sections.display + - generic [ref=e298]: + - generic [ref=e299]: + - paragraph [ref=e300]: settings.display.showCompletedTasks + - paragraph [ref=e301]: settings.display.showCompletedTasksDesc + - button "settings.display.show" [ref=e302] [cursor=pointer] + - generic [ref=e303]: + - generic [ref=e304]: + - heading "settings.sections.hooks" [level=2] [ref=e305]: + - img [ref=e306] + - text: settings.sections.hooks + - generic [ref=e312]: 0/0 cliHooks.stats.enabled + - generic [ref=e313]: + - img [ref=e314] + - textbox "cliHooks.filters.searchPlaceholder" [ref=e317] + - generic [ref=e323]: + - generic [ref=e324]: + - heading "settings.sections.rules" [level=2] [ref=e325]: + - img [ref=e326] + - text: settings.sections.rules + - generic [ref=e331]: 0/0 cliRules.stats.enabled + - generic [ref=e332]: + - img [ref=e333] + - textbox "cliRules.filters.searchPlaceholder" [ref=e336] + - generic [ref=e342]: + - heading "common.actions.reset" [level=2] [ref=e343]: + - img [ref=e344] + - text: common.actions.reset + - paragraph [ref=e347]: settings.reset.description + - button "common.actions.resetToDefaults" [ref=e348] [cursor=pointer]: + - img [ref=e349] + - text: common.actions.resetToDefaults +``` \ No newline at end of file diff --git a/ccw/frontend/playwright-report/index.html b/ccw/frontend/playwright-report/index.html new file mode 100644 index 00000000..bd062616 --- /dev/null +++ b/ccw/frontend/playwright-report/index.html @@ -0,0 +1,85 @@ + + + + +
+ + + +