{"id":"4a798d02-3bed-4912-8078-db30d1aeb3ce","entityType":"agent","slug":"clawhub-xuxuclassmate-ai-testcase-generator","name":"AI Test Case Generator","canonicalUrl":"https://www.xpersona.co/agent/clawhub-xuxuclassmate-ai-testcase-generator","canonicalPath":"/agent/clawhub-xuxuclassmate-ai-testcase-generator","generatedAt":"2026-10-11T15:14:49.169Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T11:55:14.168Z","emptyReason":null},"description":"Use when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow. Skill: AI Test Case Generator Owner: xuxuclassmate Summary: Use when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow. Tags: ai:1.0.1, automation:1.0.1, latest:1.0.1, qa:1.0.1, review:1.0.1, testcases:1.0.1, testing:1.0.1 Version history: v1.0.1 | 2026-04-22T05:44:06.209Z | user Replace risky plugin metadata with an English documentatio","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17ev136gszam5rsp8hcgkksex83gbfy:ai-testcase-generator","sourceUrl":"https://clawhub.ai/xuxuclassmate/ai-testcase-generator","homepage":"https://clawhub.ai/xuxuclassmate/skills/ai-testcase-generator","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/xuxuclassmate/ai-testcase-generator","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/xuxuclassmate/skills/ai-testcase-generator","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Use when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow. Skill: AI Test Case"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:55:14.168Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:55:14.168Z","emptyReason":null},"stars":null,"forks":null,"downloads":1071,"packageName":null,"latestVersion":"1.0.1","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:55:13.716Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T11:55:14.168Z","lastCrawledAt":"2026-10-11T11:55:13.716Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T11:55:13.716Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.1","createdAt":"2026-04-22T05:44:06.209Z","changelog":"Replace risky plugin metadata with an English documentation-only skill so the package can clear security scanning.","fileCount":3,"zipByteSize":2293},{"version":"1.0.0","createdAt":"2026-04-03T05:48:25.979Z","changelog":"Revert to version 1.0.0 to match GitHub release version. Added SECURITY.md for VirusTotal false positive explanation.","fileCount":5,"zipByteSize":5945},{"version":"2.3.0","createdAt":"2026-04-03T04:41:17.292Z","changelog":"ai-testcase-generator-pro v2.3.0 - Major refactor: migrated from implementation and development files to a streamlined, documentation-focused skill package. - All source code and configuration files removed, leaving only metadata and comprehensive usage documentation. - New SKILL.md offers concise skill summary, usage scenarios, parameters, output description, scoring breakdown, and examples. - Documentation now emphasizes invocation guidance and review loop process for end users.","fileCount":5,"zipByteSize":5943},{"version":"2.2.0","createdAt":"2026-04-02T15:02:30.081Z","changelog":"**Major documentation overhaul for setup, usage, and configuration** - Expanded and reorganized SKILL.md with clear step-by-step installation, setup, and usage instructions for OpenClaw users. - Added detailed configuration examples, environment variables, and supported AI provider references. - Clarified all input methods (chat commands, file upload, tool invocation) and advanced usage options. - Included persona review process, output formats, contribution guidelines, and support links. - No changes to skill functionality or code—documentation update only.","fileCount":19,"zipByteSize":75355},{"version":"2.1.0","createdAt":"2026-04-02T14:56:22.898Z","changelog":"Version 2.1.0 - Updated review loop logic in skill prompts (prompts.ts). - SKILL.md documentation refreshed; no parameter or usage changes. - Improved scoring and review persona descriptions for better clarity.","fileCount":19,"zipByteSize":74033},{"version":"2.0.3","createdAt":"2026-04-02T14:52:00.555Z","changelog":"- Updated the OpenClaw environment variable requirement from multiple API keys to only ANTHROPIC_API_KEY. - Removed support for specifying alternate AI providers in the environment setup. - No user-facing feature changes; all modifications are in skill metadata configuration.","fileCount":19,"zipByteSize":76239},{"version":"2.0.2","createdAt":"2026-04-02T14:49:43.710Z","changelog":"- Updated required environment variable from individual API keys to a unified AI_PROVIDER. - Adjusted metadata to reflect the new environment variable requirement. - No changes to user-facing features or functionality.","fileCount":19,"zipByteSize":76291},{"version":"2.0.1","createdAt":"2026-04-02T14:36:45.718Z","changelog":"Version 2.0.1 - Added MIT license and category metadata to SKILL.md. - Expanded environment variable requirements to include provider-specific API keys. - Updated metadata to specify safety level, manual audit, and safer API usage notes. - Enhanced tags for better discoverability. - General metadata structure improved for compatibility and clarity.","fileCount":19,"zipByteSize":76291}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17ev136gszam5rsp8hcgkksex83gbfy:ai-testcase-generator","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xuxuclassmate-ai-testcase-generator/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xuxuclassmate-ai-testcase-generator/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xuxuclassmate-ai-testcase-generator/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-xuxuclassmate-ai-testcase-generator/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-xuxuclassmate-ai-testcase-generator/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-xuxuclassmate-ai-testcase-generator/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T15:14:49.166Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xuxuclassmate-ai-testcase-generator/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xuxuclassmate-ai-testcase-generator/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xuxuclassmate-ai-testcase-generator/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-xuxuclassmate-ai-testcase-generator/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T11:55:14.168Z","emptyReason":null},"readme":"Skill: AI Test Case Generator\n\nOwner: xuxuclassmate\n\nSummary: Use when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow.\n\nTags: ai:1.0.1, automation:1.0.1, latest:1.0.1, qa:1.0.1, review:1.0.1, testcases:1.0.1, testing:1.0.1\n\nVersion history:\n\nv1.0.1 | 2026-04-22T05:44:06.209Z | user\n\nReplace risky plugin metadata with an English documentation-only skill so the package can clear security scanning.\n\nv1.0.0 | 2026-04-03T05:48:25.979Z | user\n\nRevert to version 1.0.0 to match GitHub release version. Added SECURITY.md for VirusTotal false positive explanation.\n\nv2.3.0 | 2026-04-03T04:41:17.292Z | auto\n\nai-testcase-generator-pro v2.3.0\n\n- Major refactor: migrated from implementation and development files to a streamlined, documentation-focused skill package.\n- All source code and configuration files removed, leaving only metadata and comprehensive usage documentation.\n- New SKILL.md offers concise skill summary, usage scenarios, parameters, output description, scoring breakdown, and examples.\n- Documentation now emphasizes invocation guidance and review loop process for end users.\n\nv2.2.0 | 2026-04-02T15:02:30.081Z | auto\n\n**Major documentation overhaul for setup, usage, and configuration**\n\n- Expanded and reorganized SKILL.md with clear step-by-step installation, setup, and usage instructions for OpenClaw users.\n- Added detailed configuration examples, environment variables, and supported AI provider references.\n- Clarified all input methods (chat commands, file upload, tool invocation) and advanced usage options.\n- Included persona review process, output formats, contribution guidelines, and support links.\n- No changes to skill functionality or code—documentation update only.\n\nv2.1.0 | 2026-04-02T14:56:22.898Z | auto\n\nVersion 2.1.0\n\n- Updated review loop logic in skill prompts (prompts.ts).\n- SKILL.md documentation refreshed; no parameter or usage changes.\n- Improved scoring and review persona descriptions for better clarity.\n\nv2.0.3 | 2026-04-02T14:52:00.555Z | auto\n\n- Updated the OpenClaw environment variable requirement from multiple API keys to only ANTHROPIC_API_KEY.\n- Removed support for specifying alternate AI providers in the environment setup.\n- No user-facing feature changes; all modifications are in skill metadata configuration.\n\nv2.0.2 | 2026-04-02T14:49:43.710Z | auto\n\n- Updated required environment variable from individual API keys to a unified AI_PROVIDER.\n- Adjusted metadata to reflect the new environment variable requirement.\n- No changes to user-facing features or functionality.\n\nv2.0.1 | 2026-04-02T14:36:45.718Z | auto\n\nVersion 2.0.1\n\n- Added MIT license and category metadata to SKILL.md.\n- Expanded environment variable requirements to include provider-specific API keys.\n- Updated metadata to specify safety level, manual audit, and safer API usage notes.\n- Enhanced tags for better discoverability.\n- General metadata structure improved for compatibility and clarity.\n\nv2.0.0 | 2026-04-02T14:11:57.910Z | auto\n\nAI Test Case Generator Pro 2.0.0 features major improvements focusing on multi-format support and automated quality review.\n\n- Introduces multi-model review with Test Manager, Dev Manager, and Product Manager personas.\n- Supports generating test cases from PDFs, Word documents, images, video, and plain text.\n- Exports results to Excel, Markdown, and XMind formats.\n- Implements a review loop ensuring test case quality ≥ 90/100, with reviewer comments and scoring across multiple dimensions.\n- Enhanced parameter options for targeted test case generation and language support (English, Chinese).\n\nArchive index:\n\nArchive v1.0.1: 3 files, 2293 bytes\n\nFiles: skill-card.md (1708b), SKILL.md (1791b), _meta.json (140b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: ai-testcase-generator\ndescription: Use when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow.\ntags: [testing, qa, testcases, ai, automation, review]\nversion: 1.0.1\n---\n\n# AI Test Case Generator\n\nThis ClawHub package is documentation-only. It does not embed runtime binaries, install scripts, or package manifests.\n\n## When to use\n\n- A user wants test cases from a PRD, specification, screenshot, or plain text brief.\n- You need a structured review loop for QA coverage before implementation or release.\n- You want a checklist for turning requirements into executable test work.\n\n## Inputs to collect\n\n- Requirement text or a file path\n- Product stage: requirement review, implementation, or pre-release\n- Preferred output language\n- Any focus area such as security, edge cases, compatibility, or accessibility\n\n## Recommended workflow\n\n1. Extract the core flows.\n   Identify user journeys, rules, dependencies, and constraints.\n2. Group coverage by module.\n   Organize cases by feature area, API, UI surface, or role.\n3. Add negative and edge paths.\n   Include invalid input, permission boundaries, failures, and concurrency where relevant.\n4. Run a review pass.\n   Check coverage, clarity, execution readiness, and security impact.\n\n## Recommended outputs\n\n- Test scope summary\n- Test points grouped by module\n- Detailed cases with steps and expected results\n- Priority or severity labels\n- Open questions for product or engineering\n\n## Guardrails\n\n- Keep uploaded requirements confidential.\n- State clearly when a case depends on missing product detail.\n- Do not claim that spreadsheet, XMind, or binary exports were produced unless an actual generator runtime was used outside this skill bundle.\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7a6qzk16ny6zj2a6ge10exrn82q9qp\",\n  \"slug\": \"ai-testcase-generator\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1776836646209\n}\n\nFile v1.0.1:skill-card.md\n\n## Description:\n\nUse when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[xuxuclassmate](https://clawhub.ai/user/xuxuclassmate)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nQA engineers, product teams, and developers use this skill to turn requirements, screenshots, specifications, or brief text into structured test coverage, review questions, and execution-ready cases.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Requirements or screenshots may contain confidential product details.\n\nMitigation: Share only information intended for agent processing and keep uploaded requirements confidential.\n\nRisk: Generated test cases can miss context or become misleading if product details are incomplete.\n\nMitigation: Review generated cases before using them as release criteria and state dependencies on missing product detail.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, guidance]\n\n**Output Format:** [Markdown or structured text]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include test scope summaries, module-grouped test points, detailed steps with expected results, priorities, and open questions.]\n\n## Skill Version(s):\n\n1.0.1 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.0: 5 files, 5945 bytes\n\nFiles: openclaw.plugin.json (2412b), package.json (2056b), README.md (4991b), SKILL.md (2884b), _meta.json (140b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: ai-testcase-generator-pro\nversion: 1.0.0\ndescription: AI-powered test case generator with three-persona review loop. Supports PDF, Word, TXT, images, video. Exports Excel, Markdown, XMind.\nauthor: XuXuClassMate\nlicense: MIT\ntags: [testing, qa, testcases, ai-testing, automation, openclaw]\ncategory: Development\nmetadata:\n  openclaw:\n    requires:\n      env:\n        - ANTHROPIC_API_KEY\n      bins:\n        - node\n        - npm\n    primaryEnv: ANTHROPIC_API_KEY\n    emoji: 🧪\n    homepage: https://github.com/XuXuClassMate/testcase-generator\n---\n\n# AI Test Case Generator Skill\n\n## What this skill does\n\nAutomatically generates structured test cases from requirement documents, UI screenshots, videos, or plain text. Supports a multi-model review loop where **Test Manager**, **Dev Manager**, and **Product Manager** personas review and score the output iteratively until quality ≥ 90/100.\n\n## Trigger phrases\n\nUse this skill when the user says anything like:\n\n- \"generate test cases for …\"\n- \"write test cases / QA cases / test suite for …\"\n- \"create test plan from this requirement\"\n- \"review my test cases\"\n- \"需求评审 / 测试用例 / 生成用例\"\n- Uploads a `.pdf`, `.docx`, `.txt`, image, or video file and asks about testing\n\n## Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `text` | string | — | Requirement description text |\n| `file_path` | string | — | Path to uploaded requirement file |\n| `prompt` | string | — | Custom focus hint, e.g. \"focus on security\" |\n| `stage` | enum | `development` | `requirement` \\| `development` \\| `prerelease` |\n| `language` | enum | `en` | `en` \\| `zh` |\n| `enable_review` | boolean | `true` | Run multi-model review loop |\n\n## Output\n\nReturns a Markdown-formatted test case report including:\n- Test points grouped by module\n- Full test cases with ID, steps, expected results, priority\n- Quality score (0–100) after review loop\n- Review comments from 3 reviewer personas\n\nAlso saves:\n- `.xlsx` — Excel test suite (3 sheets: cases / points / stats)\n- `.xmind` — XMind mind map of test points\n- `.md` — Markdown report\n\n## Example invocations\n\n```\nGenerate test cases for user login:\n- Phone + password login\n- OAuth (GitHub, Google)\n- Lock account after 5 failed attempts\n- Remember me (7-day token)\n```\n\n```\n/testgen /uploads/requirements.pdf --prompt focus on edge cases and security\n```\n\n```\nGenerate Chinese test cases for the pre-release stage from this PRD\n[attaches file]\n```\n\n## Review loop scoring (100 pts)\n\n| Dimension | Max | Reviewer Focus |\n|-----------|-----|----------------|\n| Coverage | 30 | Test Manager |\n| Logic Integrity | 20 | Dev Manager |\n| Executability | 20 | Test Manager |\n| Clarity | 15 | Product Manager |\n| Security | 15 | Dev Manager |\n\nTerminates when: score ≥ 90 · OR · no new issues · OR · 5 rounds max\n\nFile v1.0.0:README.md\n\n# testcase-generator\n\n<div align=\"center\">\n\n**AI-powered test case generation for PRDs, specifications, and multimodal QA inputs**\n\n[![Version](https://img.shields.io/github/v/release/XuXuClassMate/testcase-generator?label=version)](https://github.com/XuXuClassMate/testcase-generator/releases)\n[![Docker Pulls](https://img.shields.io/docker/pulls/xuxuclassmate/testcase-generator)](https://hub.docker.com/r/xuxuclassmate/testcase-generator)\n[![npm](https://img.shields.io/npm/v/%40classmatexuxu%2Ftestcase-generator?label=npm)](https://www.npmjs.com/package/@classmatexuxu/testcase-generator)\n\n[GitHub](https://github.com/XuXuClassMate/testcase-generator) • [Docker Hub](https://hub.docker.com/r/xuxuclassmate/testcase-generator) • [npm](https://www.npmjs.com/package/@classmatexuxu/testcase-generator) • [Detailed Docs](./docs/README.md)\n\n</div>\n\n---\n\n## What It Does\n\nTestcase Generator turns requirement documents and multimodal inputs into structured QA deliverables.\n\n- Accepts PDF, Word, TXT, images, and video\n- Runs a three-persona review loop:\n  Test Manager\n  Dev Manager\n  Product Manager\n- Exports Excel, Markdown, and XMind\n- Supports English and Chinese output\n- Runs in four supported modes:\n  Docker\n  Local source run\n  npm global install\n  OpenClaw plugin\n\n## Docker Quick Start\n\n### 1. Pull the image\n\n```bash\ndocker pull xuxuclassmate/testcase-generator:latest\n```\n\n### 2. Prepare your environment file\n\n```bash\ncurl -O https://raw.githubusercontent.com/XuXuClassMate/testcase-generator/main/.env.example\ncp .env.example .env\n```\n\nEdit `.env` and fill at least one API key:\n\n```bash\nAI_PROVIDER=anthropic\nANTHROPIC_API_KEY=sk-ant-...\nLANGUAGE=en\nENABLE_REVIEW=true\nREVIEW_THRESHOLD=90\nMAX_REVIEW_ROUNDS=5\nPORT=3456\nOUTPUT_DIR=./testcase-output\n```\n\n### 3. Run the container\n\n```bash\ndocker run -d \\\n  --name testcase-generator \\\n  -p 3456:3456 \\\n  -e AI_PROVIDER=anthropic \\\n  -e ANTHROPIC_API_KEY=sk-ant-... \\\n  -e LANGUAGE=en \\\n  -e ENABLE_REVIEW=true \\\n  -e REVIEW_THRESHOLD=90 \\\n  -e MAX_REVIEW_ROUNDS=5 \\\n  -e OUTPUT_DIR=/data/testcase-output \\\n  -v testcase-generator-output:/data/testcase-output \\\n  xuxuclassmate/testcase-generator:latest\n```\n\nOpen [http://localhost:3456](http://localhost:3456).\n\n### 4. Useful container commands\n\n```bash\ndocker logs -f testcase-generator\ndocker stop testcase-generator\ndocker rm testcase-generator\n```\n\n## Docker Compose\n\nIf you are running from the repository source:\n\n```bash\ngit clone https://github.com/XuXuClassMate/testcase-generator.git\ncd testcase-generator\ncp .env.example .env\ndocker compose up -d --build\n```\n\nStop it with:\n\n```bash\ndocker compose down\n```\n\n## Environment Variables\n\n| Variable | Default | Description |\n| --- | --- | --- |\n| `AI_PROVIDER` | `anthropic` | Primary provider for env-based standalone startup |\n| `ANTHROPIC_API_KEY` | empty | Anthropic API key |\n| `OPENAI_API_KEY` | empty | OpenAI API key |\n| `DEEPSEEK_API_KEY` | empty | DeepSeek API key |\n| `LANGUAGE` | `en` | UI, generation, and export language (`en` or `zh`) |\n| `ENABLE_REVIEW` | `true` | Enable reviewer loop |\n| `REVIEW_THRESHOLD` | `90` | Minimum review score before stopping |\n| `MAX_REVIEW_ROUNDS` | `5` | Maximum review iterations |\n| `PORT` | `3456` | Standalone web server port |\n| `OUTPUT_DIR` | `./testcase-output` | Output directory for generated files |\n\n## Outputs\n\nGenerated sessions can export:\n\n- Excel\n- Markdown\n- XMind\n\nThe page language controls both the generated content language and the exported file language in standalone mode.\n\n## Alternative Run Modes\n\n### npm global install\n\n```bash\nnpm install -g @classmatexuxu/testcase-generator\n\nexport AI_PROVIDER=anthropic\nexport ANTHROPIC_API_KEY=sk-ant-...\nexport PORT=3456\n\ntestcase-generator --standalone\n```\n\n### Local source run\n\n```bash\ngit clone https://github.com/XuXuClassMate/testcase-generator.git\ncd testcase-generator\nnpm install\ncp .env.example .env\nnpm run build\nnpm run start\n```\n\n### OpenClaw plugin\n\n```bash\nopenclaw plugins install -l /path/to/testcase-generator\nopenclaw gateway restart\nopenclaw plugins list\n```\n\nThen configure `models[]` in your OpenClaw config. A full example lives in [docs/README.md](./docs/README.md).\n\n## Release and Distribution\n\nGitHub Actions currently automates:\n\n- npm publishing\n- npm package README publishing from `docs/npm-readme.md`\n- Docker Hub publishing\n- GHCR publishing\n- Docker Hub overview sync from `docs/dockerhub-overview.md`\n- GitHub Releases asset publishing\n- free code scanning and dependency/security checks on merges to `main`\n\nRelease publishing is triggered by pushing a tag like `v1.0.0`, and the tag must match `package.json`'s version.\n\n## Links\n\n- GitHub: https://github.com/XuXuClassMate/testcase-generator\n- Docker Hub: https://hub.docker.com/r/xuxuclassmate/testcase-generator\n- npm: https://www.npmjs.com/package/@classmatexuxu/testcase-generator\n- Releases: https://github.com/XuXuClassMate/testcase-generator/releases\n- Detailed docs: [docs/README.md](./docs/README.md)\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7a6qzk16ny6zj2a6ge10exrn82q9qp\",\n  \"slug\": \"ai-testcase-generator\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1775195305979\n}\n\nFile v1.0.0:openclaw.plugin.json\n\n{\n  \"id\": \"testcase-generator\",\n  \"name\": \"AI Test Case Generator\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Generate high-quality test cases from docs/images/video with multi-model review loop (Test Manager · Dev Manager · Product Manager).\",\n  \"author\": \"XuXuClassMate\",\n  \"license\": \"MIT\",\n  \"entry\": \"./dist/index.js\",\n  \"skill\": \"./SKILL.md\",\n  \"securityNote\": \"⚠️ VirusTotal may flag this project as 'Suspicious' - this is a FALSE POSITIVE. See SECURITY.md for details.\",\n  \"securityDocs\": \"https://github.com/XuXuClassMate/testcase-generator/blob/main/SECURITY.md\",\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"models\": {\n        \"type\": \"array\",\n        \"description\": \"List of AI model configurations. See README § Model Configuration.\",\n        \"items\": {\n          \"type\": \"object\",\n          \"required\": [\"id\", \"vendor\", \"model\", \"apiKey\", \"role\"],\n          \"properties\": {\n            \"id\":      { \"type\": \"string\", \"description\": \"Unique slot ID\" },\n            \"label\":   { \"type\": \"string\", \"description\": \"Display name\" },\n            \"vendor\":  { \"type\": \"string\", \"enum\": [\"anthropic\",\"openai\",\"deepseek\",\"minimax\",\"qwen\",\"gemini\",\"moonshot\",\"zhipu\",\"custom\"] },\n            \"model\":   { \"type\": \"string\", \"description\": \"Model name, e.g. claude-opus-4-5\" },\n            \"baseUrl\": { \"type\": \"string\", \"description\": \"Custom API base URL (optional for standard vendors)\" },\n            \"apiKey\":  { \"type\": \"string\", \"description\": \"API key for this model\" },\n            \"role\":    { \"type\": \"string\", \"enum\": [\"generator\",\"reviewer\",\"both\"] },\n            \"params\":  { \"type\": \"object\", \"description\": \"Extra params, e.g. { temperature: 0.2 }\" }\n          }\n        }\n      },\n      \"language\":             { \"type\": \"string\", \"enum\": [\"en\",\"zh\"], \"default\": \"en\" },\n      \"enableReviewLoop\":     { \"type\": \"boolean\", \"default\": true },\n      \"reviewScoreThreshold\": { \"type\": \"number\",  \"default\": 90,   \"description\": \"Stop review when score >= this\" },\n      \"maxReviewRounds\":      { \"type\": \"number\",  \"default\": 5 },\n      \"standalonePort\":       { \"type\": \"number\",  \"default\": 3456 },\n      \"outputDir\":            { \"type\": \"string\", \"default\": \"./testcase-output\" }\n    }\n  },\n  \"commands\": { \"enabled\": true, \"prefix\": \"/testgen\" },\n  \"tools\": [{ \"name\": \"generate_test_cases\", \"description\": \"Generate and review test cases from requirements\" }]\n}\n\nFile v1.0.0:package.json\n\n{\n  \"name\": \"@classmatexuxu/testcase-generator\",\n  \"version\": \"1.0.0\",\n  \"description\": \"AI-powered test case generation for PRDs, specs, and multimodal QA inputs\",\n  \"main\": \"./dist/index.js\",\n  \"bin\": {\n    \"testcase-generator\": \"./dist/index.js\"\n  },\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/XuXuClassMate/testcase-generator.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/XuXuClassMate/testcase-generator/issues\"\n  },\n  \"homepage\": \"https://github.com/XuXuClassMate/testcase-generator#readme\",\n  \"keywords\": [\n    \"openclaw\",\n    \"testing\",\n    \"testcase\",\n    \"qa\",\n    \"openai\",\n    \"anthropic\"\n  ],\n  \"files\": [\n    \"dist\",\n    \"public\",\n    \"README.md\",\n    \"docs\",\n    \"openclaw.plugin.json\",\n    \"SKILL.md\",\n    \".env.example\",\n    \"scripts/install.sh\"\n  ],\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"dev\": \"ts-node src/index.ts\",\n    \"dev:standalone\": \"ts-node src/index.ts --standalone\",\n    \"start\": \"node dist/index.js --standalone\",\n    \"standalone\": \"ts-node src/standalone.ts\",\n    \"standalone:build\": \"tsc && node dist/standalone.js\",\n    \"prepare:npm-package\": \"node scripts/prepare-npm-package.js\",\n    \"prepack\": \"npm run build\",\n    \"clean\": \"rm -rf dist\"\n  },\n  \"dependencies\": {\n    \"@anthropic-ai/sdk\": \"^0.39.0\",\n    \"openai\": \"^4.98.0\",\n    \"express\": \"^4.18.2\",\n    \"express-rate-limit\": \"^7.5.0\",\n    \"multer\": \"^2.0.2\",\n    \"exceljs\": \"^4.4.0\",\n    \"pdf-parse\": \"^1.1.1\",\n    \"mammoth\": \"^1.6.0\",\n    \"sharp\": \"^0.33.2\",\n    \"cors\": \"^2.8.5\",\n    \"archiver\": \"^6.0.1\",\n    \"uuid\": \"^9.0.0\",\n    \"fs-extra\": \"^11.2.0\"\n  },\n  \"devDependencies\": {\n    \"@types/express\": \"^4.17.21\",\n    \"@types/multer\": \"^2.0.0\",\n    \"@types/cors\": \"^2.8.17\",\n    \"@types/uuid\": \"^9.0.8\",\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/node\": \"^20.11.0\",\n    \"typescript\": \"^5.3.3\",\n    \"ts-node\": \"^10.9.2\"\n  },\n  \"openclaw\": {\n    \"extensions\": [\"./dist/index.js\"]\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n\nArchive v2.3.0: 5 files, 5943 bytes\n\nFiles: openclaw.plugin.json (2412b), package.json (2056b), README.md (4991b), SKILL.md (2884b), _meta.json (140b)\n\nFile v2.3.0:SKILL.md\n\n---\nname: ai-testcase-generator-pro\nversion: 2.3.0\ndescription: AI-powered test case generator with three-persona review loop. Supports PDF, Word, TXT, images, video. Exports Excel, Markdown, XMind.\nauthor: XuXuClassMate\nlicense: MIT\ntags: [testing, qa, testcases, ai-testing, automation, openclaw]\ncategory: Development\nmetadata:\n  openclaw:\n    requires:\n      env:\n        - ANTHROPIC_API_KEY\n      bins:\n        - node\n        - npm\n    primaryEnv: ANTHROPIC_API_KEY\n    emoji: 🧪\n    homepage: https://github.com/XuXuClassMate/testcase-generator\n---\n\n# AI Test Case Generator Skill\n\n## What this skill does\n\nAutomatically generates structured test cases from requirement documents, UI screenshots, videos, or plain text. Supports a multi-model review loop where **Test Manager**, **Dev Manager**, and **Product Manager** personas review and score the output iteratively until quality ≥ 90/100.\n\n## Trigger phrases\n\nUse this skill when the user says anything like:\n\n- \"generate test cases for …\"\n- \"write test cases / QA cases / test suite for …\"\n- \"create test plan from this requirement\"\n- \"review my test cases\"\n- \"需求评审 / 测试用例 / 生成用例\"\n- Uploads a `.pdf`, `.docx`, `.txt`, image, or video file and asks about testing\n\n## Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `text` | string | — | Requirement description text |\n| `file_path` | string | — | Path to uploaded requirement file |\n| `prompt` | string | — | Custom focus hint, e.g. \"focus on security\" |\n| `stage` | enum | `development` | `requirement` \\| `development` \\| `prerelease` |\n| `language` | enum | `en` | `en` \\| `zh` |\n| `enable_review` | boolean | `true` | Run multi-model review loop |\n\n## Output\n\nReturns a Markdown-formatted test case report including:\n- Test points grouped by module\n- Full test cases with ID, steps, expected results, priority\n- Quality score (0–100) after review loop\n- Review comments from 3 reviewer personas\n\nAlso saves:\n- `.xlsx` — Excel test suite (3 sheets: cases / points / stats)\n- `.xmind` — XMind mind map of test points\n- `.md` — Markdown report\n\n## Example invocations\n\n```\nGenerate test cases for user login:\n- Phone + password login\n- OAuth (GitHub, Google)\n- Lock account after 5 failed attempts\n- Remember me (7-day token)\n```\n\n```\n/testgen /uploads/requirements.pdf --prompt focus on edge cases and security\n```\n\n```\nGenerate Chinese test cases for the pre-release stage from this PRD\n[attaches file]\n```\n\n## Review loop scoring (100 pts)\n\n| Dimension | Max | Reviewer Focus |\n|-----------|-----|----------------|\n| Coverage | 30 | Test Manager |\n| Logic Integrity | 20 | Dev Manager |\n| Executability | 20 | Test Manager |\n| Clarity | 15 | Product Manager |\n| Security | 15 | Dev Manager |\n\nTerminates when: score ≥ 90 · OR · no new issues · OR · 5 rounds max\n\nFile v2.3.0:README.md\n\n# testcase-generator\n\n<div align=\"center\">\n\n**AI-powered test case generation for PRDs, specifications, and multimodal QA inputs**\n\n[![Version](https://img.shields.io/github/v/release/XuXuClassMate/testcase-generator?label=version)](https://github.com/XuXuClassMate/testcase-generator/releases)\n[![Docker Pulls](https://img.shields.io/docker/pulls/xuxuclassmate/testcase-generator)](https://hub.docker.com/r/xuxuclassmate/testcase-generator)\n[![npm](https://img.shields.io/npm/v/%40classmatexuxu%2Ftestcase-generator?label=npm)](https://www.npmjs.com/package/@classmatexuxu/testcase-generator)\n\n[GitHub](https://github.com/XuXuClassMate/testcase-generator) • [Docker Hub](https://hub.docker.com/r/xuxuclassmate/testcase-generator) • [npm](https://www.npmjs.com/package/@classmatexuxu/testcase-generator) • [Detailed Docs](./docs/README.md)\n\n</div>\n\n---\n\n## What It Does\n\nTestcase Generator turns requirement documents and multimodal inputs into structured QA deliverables.\n\n- Accepts PDF, Word, TXT, images, and video\n- Runs a three-persona review loop:\n  Test Manager\n  Dev Manager\n  Product Manager\n- Exports Excel, Markdown, and XMind\n- Supports English and Chinese output\n- Runs in four supported modes:\n  Docker\n  Local source run\n  npm global install\n  OpenClaw plugin\n\n## Docker Quick Start\n\n### 1. Pull the image\n\n```bash\ndocker pull xuxuclassmate/testcase-generator:latest\n```\n\n### 2. Prepare your environment file\n\n```bash\ncurl -O https://raw.githubusercontent.com/XuXuClassMate/testcase-generator/main/.env.example\ncp .env.example .env\n```\n\nEdit `.env` and fill at least one API key:\n\n```bash\nAI_PROVIDER=anthropic\nANTHROPIC_API_KEY=sk-ant-...\nLANGUAGE=en\nENABLE_REVIEW=true\nREVIEW_THRESHOLD=90\nMAX_REVIEW_ROUNDS=5\nPORT=3456\nOUTPUT_DIR=./testcase-output\n```\n\n### 3. Run the container\n\n```bash\ndocker run -d \\\n  --name testcase-generator \\\n  -p 3456:3456 \\\n  -e AI_PROVIDER=anthropic \\\n  -e ANTHROPIC_API_KEY=sk-ant-... \\\n  -e LANGUAGE=en \\\n  -e ENABLE_REVIEW=true \\\n  -e REVIEW_THRESHOLD=90 \\\n  -e MAX_REVIEW_ROUNDS=5 \\\n  -e OUTPUT_DIR=/data/testcase-output \\\n  -v testcase-generator-output:/data/testcase-output \\\n  xuxuclassmate/testcase-generator:latest\n```\n\nOpen [http://localhost:3456](http://localhost:3456).\n\n### 4. Useful container commands\n\n```bash\ndocker logs -f testcase-generator\ndocker stop testcase-generator\ndocker rm testcase-generator\n```\n\n## Docker Compose\n\nIf you are running from the repository source:\n\n```bash\ngit clone https://github.com/XuXuClassMate/testcase-generator.git\ncd testcase-generator\ncp .env.example .env\ndocker compose up -d --build\n```\n\nStop it with:\n\n```bash\ndocker compose down\n```\n\n## Environment Variables\n\n| Variable | Default | Description |\n| --- | --- | --- |\n| `AI_PROVIDER` | `anthropic` | Primary provider for env-based standalone startup |\n| `ANTHROPIC_API_KEY` | empty | Anthropic API key |\n| `OPENAI_API_KEY` | empty | OpenAI API key |\n| `DEEPSEEK_API_KEY` | empty | DeepSeek API key |\n| `LANGUAGE` | `en` | UI, generation, and export language (`en` or `zh`) |\n| `ENABLE_REVIEW` | `true` | Enable reviewer loop |\n| `REVIEW_THRESHOLD` | `90` | Minimum review score before stopping |\n| `MAX_REVIEW_ROUNDS` | `5` | Maximum review iterations |\n| `PORT` | `3456` | Standalone web server port |\n| `OUTPUT_DIR` | `./testcase-output` | Output directory for generated files |\n\n## Outputs\n\nGenerated sessions can export:\n\n- Excel\n- Markdown\n- XMind\n\nThe page language controls both the generated content language and the exported file language in standalone mode.\n\n## Alternative Run Modes\n\n### npm global install\n\n```bash\nnpm install -g @classmatexuxu/testcase-generator\n\nexport AI_PROVIDER=anthropic\nexport ANTHROPIC_API_KEY=sk-ant-...\nexport PORT=3456\n\ntestcase-generator --standalone\n```\n\n### Local source run\n\n```bash\ngit clone https://github.com/XuXuClassMate/testcase-generator.git\ncd testcase-generator\nnpm install\ncp .env.example .env\nnpm run build\nnpm run start\n```\n\n### OpenClaw plugin\n\n```bash\nopenclaw plugins install -l /path/to/testcase-generator\nopenclaw gateway restart\nopenclaw plugins list\n```\n\nThen configure `models[]` in your OpenClaw config. A full example lives in [docs/README.md](./docs/README.md).\n\n## Release and Distribution\n\nGitHub Actions currently automates:\n\n- npm publishing\n- npm package README publishing from `docs/npm-readme.md`\n- Docker Hub publishing\n- GHCR publishing\n- Docker Hub overview sync from `docs/dockerhub-overview.md`\n- GitHub Releases asset publishing\n- free code scanning and dependency/security checks on merges to `main`\n\nRelease publishing is triggered by pushing a tag like `v1.0.0`, and the tag must match `package.json`'s version.\n\n## Links\n\n- GitHub: https://github.com/XuXuClassMate/testcase-generator\n- Docker Hub: https://hub.docker.com/r/xuxuclassmate/testcase-generator\n- npm: https://www.npmjs.com/package/@classmatexuxu/testcase-generator\n- Releases: https://github.com/XuXuClassMate/testcase-generator/releases\n- Detailed docs: [docs/README.md](./docs/README.md)\n\nFile v2.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn7a6qzk16ny6zj2a6ge10exrn82q9qp\",\n  \"slug\": \"ai-testcase-generator\",\n  \"version\": \"2.3.0\",\n  \"publishedAt\": 1775191277292\n}\n\nFile v2.3.0:openclaw.plugin.json\n\n{\n  \"id\": \"testcase-generator\",\n  \"name\": \"AI Test Case Generator\",\n  \"version\": \"2.3.0\",\n  \"description\": \"Generate high-quality test cases from docs/images/video with multi-model review loop (Test Manager · Dev Manager · Product Manager).\",\n  \"author\": \"XuXuClassMate\",\n  \"license\": \"MIT\",\n  \"entry\": \"./dist/index.js\",\n  \"skill\": \"./SKILL.md\",\n  \"securityNote\": \"⚠️ VirusTotal may flag this project as 'Suspicious' - this is a FALSE POSITIVE. See SECURITY.md for details.\",\n  \"securityDocs\": \"https://github.com/XuXuClassMate/testcase-generator/blob/main/SECURITY.md\",\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"models\": {\n        \"type\": \"array\",\n        \"description\": \"List of AI model configurations. See README § Model Configuration.\",\n        \"items\": {\n          \"type\": \"object\",\n          \"required\": [\"id\", \"vendor\", \"model\", \"apiKey\", \"role\"],\n          \"properties\": {\n            \"id\":      { \"type\": \"string\", \"description\": \"Unique slot ID\" },\n            \"label\":   { \"type\": \"string\", \"description\": \"Display name\" },\n            \"vendor\":  { \"type\": \"string\", \"enum\": [\"anthropic\",\"openai\",\"deepseek\",\"minimax\",\"qwen\",\"gemini\",\"moonshot\",\"zhipu\",\"custom\"] },\n            \"model\":   { \"type\": \"string\", \"description\": \"Model name, e.g. claude-opus-4-5\" },\n            \"baseUrl\": { \"type\": \"string\", \"description\": \"Custom API base URL (optional for standard vendors)\" },\n            \"apiKey\":  { \"type\": \"string\", \"description\": \"API key for this model\" },\n            \"role\":    { \"type\": \"string\", \"enum\": [\"generator\",\"reviewer\",\"both\"] },\n            \"params\":  { \"type\": \"object\", \"description\": \"Extra params, e.g. { temperature: 0.2 }\" }\n          }\n        }\n      },\n      \"language\":             { \"type\": \"string\", \"enum\": [\"en\",\"zh\"], \"default\": \"en\" },\n      \"enableReviewLoop\":     { \"type\": \"boolean\", \"default\": true },\n      \"reviewScoreThreshold\": { \"type\": \"number\",  \"default\": 90,   \"description\": \"Stop review when score >= this\" },\n      \"maxReviewRounds\":      { \"type\": \"number\",  \"default\": 5 },\n      \"standalonePort\":       { \"type\": \"number\",  \"default\": 3456 },\n      \"outputDir\":            { \"type\": \"string\", \"default\": \"./testcase-output\" }\n    }\n  },\n  \"commands\": { \"enabled\": true, \"prefix\": \"/testgen\" },\n  \"tools\": [{ \"name\": \"generate_test_cases\", \"description\": \"Generate and review test cases from requirements\" }]\n}\n\nFile v2.3.0:package.json\n\n{\n  \"name\": \"@classmatexuxu/testcase-generator\",\n  \"version\": \"2.3.0\",\n  \"description\": \"AI-powered test case generation for PRDs, specs, and multimodal QA inputs\",\n  \"main\": \"./dist/index.js\",\n  \"bin\": {\n    \"testcase-generator\": \"./dist/index.js\"\n  },\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/XuXuClassMate/testcase-generator.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/XuXuClassMate/testcase-generator/issues\"\n  },\n  \"homepage\": \"https://github.com/XuXuClassMate/testcase-generator#readme\",\n  \"keywords\": [\n    \"openclaw\",\n    \"testing\",\n    \"testcase\",\n    \"qa\",\n    \"openai\",\n    \"anthropic\"\n  ],\n  \"files\": [\n    \"dist\",\n    \"public\",\n    \"README.md\",\n    \"docs\",\n    \"openclaw.plugin.json\",\n    \"SKILL.md\",\n    \".env.example\",\n    \"scripts/install.sh\"\n  ],\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"dev\": \"ts-node src/index.ts\",\n    \"dev:standalone\": \"ts-node src/index.ts --standalone\",\n    \"start\": \"node dist/index.js --standalone\",\n    \"standalone\": \"ts-node src/standalone.ts\",\n    \"standalone:build\": \"tsc && node dist/standalone.js\",\n    \"prepare:npm-package\": \"node scripts/prepare-npm-package.js\",\n    \"prepack\": \"npm run build\",\n    \"clean\": \"rm -rf dist\"\n  },\n  \"dependencies\": {\n    \"@anthropic-ai/sdk\": \"^0.39.0\",\n    \"openai\": \"^4.98.0\",\n    \"express\": \"^4.18.2\",\n    \"express-rate-limit\": \"^7.5.0\",\n    \"multer\": \"^2.0.2\",\n    \"exceljs\": \"^4.4.0\",\n    \"pdf-parse\": \"^1.1.1\",\n    \"mammoth\": \"^1.6.0\",\n    \"sharp\": \"^0.33.2\",\n    \"cors\": \"^2.8.5\",\n    \"archiver\": \"^6.0.1\",\n    \"uuid\": \"^9.0.0\",\n    \"fs-extra\": \"^11.2.0\"\n  },\n  \"devDependencies\": {\n    \"@types/express\": \"^4.17.21\",\n    \"@types/multer\": \"^2.0.0\",\n    \"@types/cors\": \"^2.8.17\",\n    \"@types/uuid\": \"^9.0.8\",\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/node\": \"^20.11.0\",\n    \"typescript\": \"^5.3.3\",\n    \"ts-node\": \"^10.9.2\"\n  },\n  \"openclaw\": {\n    \"extensions\": [\"./dist/index.js\"]\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n\nArchive v2.2.0: 19 files, 75355 bytes\n\nFiles: docker-compose.yml (1300b), openclaw.plugin.json (2184b), package-lock.json (132595b), package.json (2056b), README.md (9276b), SKILL.md (6607b), src/ai-adapter.ts (6133b), src/archiver.d.ts (27b), src/exporter.ts (10329b), src/generator.ts (10701b), src/index.ts (11720b), src/parser.ts (4945b), src/prompts.ts (2949b), src/reviewer.ts (13793b), src/standalone.ts (13345b), src/types.ts (10435b), src/video-parser.ts (5150b), tsconfig.json (445b), _meta.json (140b)\n\nFile v2.2.0:SKILL.md\n\n---\nname: ai-testcase-generator-pro\nversion: 2.1.0\ndescription: AI-powered test case generator with three-persona review loop. Supports PDF, Word, TXT, images, video. Exports Excel, Markdown, XMind.\nauthor: XuXuClassMate\nlicense: MIT\ntags: [testing, qa, testcases, ai-testing, automation, openclaw]\ncategory: Development\nmetadata:\n  openclaw:\n    requires:\n      env:\n        - ANTHROPIC_API_KEY\n      bins:\n        - node\n        - npm\n    primaryEnv: ANTHROPIC_API_KEY\n    emoji: 🧪\n    homepage: https://github.com/XuXuClassMate/testcase-generator\n    safety:\n      level: safe\n      audit: manual\n      notes: Uses OpenClaw exec API for ffmpeg calls. All LLM calls use official SDKs. No shell execution.\n---\n\n# AI Test Case Generator Skill\n\n🧪 AI-powered test case generator with three-persona review loop for OpenClaw.\n\n---\n\n## 🚀 Quick Start for OpenClaw Users\n\n### Step 1: Install the Skill\n\n```bash\n# Install from ClawHub (recommended)\nopenclaw skills install xuxuclassmate/ai-testcase-generator-pro\n\n# Or install from local source (development mode)\ngit clone https://github.com/XuXuClassMate/testcase-generator\ncd testcase-generator\nopenclaw skills install -l .\n```\n\n### Step 2: Configure API Keys\n\nEdit your OpenClaw config (`~/.openclaw/config.yaml`):\n\n```yaml\nplugins:\n  entries:\n    ai-testcase-generator-pro:\n      enabled: true\n      config:\n        models:\n          - id: claude-generator\n            vendor: anthropic\n            model: claude-opus-4-5\n            apiKey: \"sk-ant-...\"  # Your Anthropic API key\n            role: generator\n          - id: gpt4o-reviewer\n            vendor: openai\n            model: gpt-4o\n            apiKey: \"sk-...\"      # Your OpenAI API key\n            role: reviewer\n        language: en              # or 'zh' for Chinese\n        enableReviewLoop: true\n        reviewScoreThreshold: 90\n        maxReviewRounds: 5\n```\n\n**Minimum config** (just one API key):\n\n```yaml\nplugins:\n  entries:\n    ai-testcase-generator-pro:\n      enabled: true\n      config:\n        models:\n          - vendor: anthropic\n            model: claude-opus-4-5\n            apiKey: \"sk-ant-...\"\n```\n\n### Step 3: Restart OpenClaw Gateway\n\n```bash\nopenclaw gateway restart\n```\n\n### Step 4: Verify Installation\n\n```bash\nopenclaw skills list\n# You should see: ai-testcase-generator-pro ✅\n```\n\n---\n\n## 💬 How to Use\n\n### Method 1: Chat Commands\n\nIn your OpenClaw chat (Feishu, Telegram, Discord, etc.):\n\n```\n/testgen User login: phone+password, OAuth, lock after 5 failed attempts\n```\n\nOr with file attachments:\n\n```\n/testgen [attach your PDF/Word/image/video files]\n```\n\n### Method 2: As an AI Tool\n\nThe skill automatically registers as a tool. Just ask your AI assistant:\n\n> \"Generate test cases for the checkout flow: add to cart → payment → order confirmation\"\n\nThe AI will automatically invoke the `generate_test_cases` tool.\n\n### Method 3: Advanced Options\n\n```\n/testgen /path/to/requirements.pdf --prompt \"Focus on security testing\" --stage development --language zh\n```\n\n**Options:**\n- `--prompt`: Custom focus hint (e.g., \"Focus on performance\", \"Add edge cases\")\n- `--stage`: `requirement` | `development` | `prerelease` (default: `requirement`)\n- `--language`: `en` | `zh` (default: `en`)\n- `--enableReview`: `true` | `false` (default: `true`)\n\n---\n\n## 📦 What You Get\n\n### Output Formats\n\nAfter generation, you can download test cases in:\n\n1. **Excel (.xlsx)** - Professional test case format with columns:\n   - Test Case ID\n   - Title\n   - Preconditions\n   - Test Steps\n   - Expected Result\n   - Priority (P0/P1/P2)\n   - Tags\n\n2. **Markdown (.md)** - Clean, readable format for documentation\n\n3. **XMind (.xmind)** - Mind map for visual test planning\n\n### Three-Persona Review Loop\n\nEvery test case is reviewed by three AI personas:\n\n| Persona | Focus Area |\n|---------|------------|\n| 🎯 Test Manager | Coverage, executability, boundary scenarios |\n| 💻 Dev Manager | Technical feasibility, API tests, security |\n| 📋 Product Manager | Business logic, user journey, requirements alignment |\n\nEach persona scores the test cases (0-100). The loop continues until the average score meets your threshold (default: 90).\n\n---\n\n## ⚙️ Configuration Reference\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ANTHROPIC_API_KEY` | - | Anthropic API key (required) |\n| `OPENAI_API_KEY` | - | OpenAI API key (optional) |\n| `DEEPSEEK_API_KEY` | - | DeepSeek API key (optional) |\n| `QWEN_API_KEY` | - | Qwen (Aliyun) API key (optional) |\n| `LANGUAGE` | `en` | Output language (`en` / `zh`) |\n| `ENABLE_REVIEW` | `true` | Enable review loop |\n| `REVIEW_THRESHOLD` | `90` | Score threshold to stop review |\n| `MAX_REVIEW_ROUNDS` | `5` | Maximum review iterations |\n\n### Supported AI Providers\n\n| Provider | Vendor ID | Recommended Model |\n|----------|-----------|-------------------|\n| Anthropic | `anthropic` | claude-opus-4-5 |\n| OpenAI | `openai` | gpt-4o |\n| DeepSeek | `deepseek` | deepseek-chat |\n| Qwen | `qwen` | qwen-max |\n| Gemini | `gemini` | gemini-2.0-flash |\n\n---\n\n## 🔧 Development & Contributing\n\nThis is an **open source project** under the MIT License. Contributions are welcome!\n\n### Ways to Contribute\n\n- 🐛 **Report bugs**: Open an issue on GitHub\n- 💡 **Request features**: Suggest new features or improvements\n- 🔧 **Submit PRs**: Fix bugs, add features, improve docs\n- 📝 **Improve docs**: Better examples, translations, tutorials\n\n### Development Workflow\n\n```bash\n# Fork and clone\ngit clone https://github.com/YOUR_USERNAME/testcase-generator\ncd testcase-generator\n\n# Install dependencies\nnpm install\n\n# Make your changes\n# ...\n\n# Test locally\nnpm run build\nnpm run standalone\n\n# Commit and push\ngit commit -m \"feat: add new feature\"\ngit push origin main\n\n# Open a Pull Request on GitHub\n```\n\n---\n\n## 📞 Support & Links\n\n- **📂 GitHub Repository**: https://github.com/XuXuClassMate/testcase-generator\n- **🐳 Docker Hub**: https://hub.docker.com/r/xuxuclassmate/testcase-generator\n- **📦 npm Package**: https://www.npmjs.com/package/@classmatexuxu/ai-testcase-generator-pro\n- **🌐 ClawHub**: https://clawhub.ai/xuxuclassmate/ai-testcase-generator-pro\n- **📖 Documentation**: https://xuxuclassmate.github.io/testcase-generator/\n- **🐛 Issues**: https://github.com/XuXuClassMate/testcase-generator/issues\n\n**Found a bug? Have a feature request?** Open an issue on GitHub — we love contributions! 🎉\n\n---\n\n## 📄 License\n\nMIT License — feel free to use, modify, and distribute.\n\nMade with ❤️ by [XuXuClassMate](https://github.com/XuXuClassMate)\n\nFile v2.2.0:README.md\n\n# AI Test Case Generator Pro 🧪\n\n**AI-powered test case generator with three-persona review loop.**\n\nSupports PDF, Word, TXT, images, and video input. Exports to Excel, Markdown, and XMind mind maps.\n\nBuilt for OpenClaw — runs as a plugin or standalone web service.\n\n---\n\n## 🚀 Quick Start for OpenClaw Users\n\n### Prerequisites\n\n- OpenClaw installed and running\n- Node.js ≥ 18 and npm\n- At least one AI API key (Anthropic, OpenAI, DeepSeek, or Qwen)\n\n### Step 1: Install the Skill\n\n```bash\n# Install from ClawHub\nopenclaw skills install xuxuclassmate/ai-testcase-generator-pro\n\n# Or install from local source (development mode)\ngit clone https://github.com/XuXuClassMate/testcase-generator\ncd testcase-generator\nopenclaw skills install -l .\n```\n\n### Step 2: Configure API Keys\n\nEdit your OpenClaw config (`~/.openclaw/config.yaml`):\n\n```yaml\nplugins:\n  entries:\n    ai-testcase-generator-pro:\n      enabled: true\n      config:\n        models:\n          - id: claude-generator\n            vendor: anthropic\n            model: claude-opus-4-5\n            apiKey: \"sk-ant-...\"  # Your Anthropic API key\n            role: generator\n          - id: gpt4o-reviewer\n            vendor: openai\n            model: gpt-4o\n            apiKey: \"sk-...\"      # Your OpenAI API key\n            role: reviewer\n          - id: deepseek-reviewer\n            vendor: deepseek\n            model: deepseek-chat\n            apiKey: \"sk-...\"      # Your DeepSeek API key\n            role: reviewer\n        language: en              # or 'zh' for Chinese\n        enableReviewLoop: true\n        reviewScoreThreshold: 90\n        maxReviewRounds: 5\n```\n\n### Step 3: Restart OpenClaw Gateway\n\n```bash\nopenclaw gateway restart\n```\n\n### Step 4: Verify Installation\n\n```bash\nopenclaw skills list\n# You should see: ai-testcase-generator-pro ✅\n```\n\n---\n\n## 💬 How to Use\n\n### Method 1: Chat Commands\n\nIn your OpenClaw chat (Feishu, Telegram, Discord, etc.):\n\n```\n/testgen User login: phone+password, OAuth, lock after 5 failed attempts\n```\n\nOr with file attachments:\n\n```\n/testgen [attach your PDF/Word/image/video files]\n```\n\n### Method 2: As an AI Tool\n\nThe skill automatically registers as a tool. Just ask your AI assistant:\n\n> \"Generate test cases for the checkout flow: add to cart → payment → order confirmation\"\n\nThe AI will automatically invoke the `generate_test_cases` tool.\n\n### Method 3: Advanced Options\n\n```\n/testgen /path/to/requirements.pdf --prompt \"Focus on security testing\" --stage development --language zh\n```\n\n**Options:**\n- `--prompt`: Custom focus hint (e.g., \"Focus on performance\", \"Add edge cases\")\n- `--stage`: `requirement` | `development` | `prerelease` (default: `requirement`)\n- `--language`: `en` | `zh` (default: `en`)\n- `--enableReview`: `true` | `false` (default: `true`)\n\n---\n\n## 🎯 What You Get\n\n### Output Formats\n\nAfter generation, you can download test cases in:\n\n1. **Excel (.xlsx)** - Professional test case format with columns:\n   - Test Case ID\n   - Title\n   - Preconditions\n   - Test Steps\n   - Expected Result\n   - Priority (P0/P1/P2)\n   - Tags\n\n2. **Markdown (.md)** - Clean, readable format for documentation\n\n3. **XMind (.xmind)** - Mind map for visual test planning\n\n### Three-Persona Review Loop\n\nEvery test case is reviewed by three AI personas:\n\n| Persona | Focus Area |\n|---------|------------|\n| 🎯 Test Manager | Coverage, executability, boundary scenarios |\n| 💻 Dev Manager | Technical feasibility, API tests, security |\n| 📋 Product Manager | Business logic, user journey, requirements alignment |\n\nEach persona scores the test cases (0-100). The loop continues until the average score meets your threshold (default: 90).\n\n---\n\n## 📦 Installation Options\n\n### Option 1: ClawHub (Recommended)\n\n```bash\nopenclaw skills install xuxuclassmate/ai-testcase-generator-pro\n```\n\n### Option 2: npm (Global Install)\n\n```bash\nnpm install -g @classmatexuxu/ai-testcase-generator-pro\n\n# Set environment variables\nexport AI_PROVIDER=anthropic\nexport ANTHROPIC_API_KEY=sk-ant-...\nexport PORT=3456\n\n# Run standalone\nai-testcase-generator-pro --standalone\n```\n\n### Option 3: Docker\n\n```bash\n# Pull the image\ndocker pull xuxuclassmate/testcase-generator:latest\n\n# Run with environment variables\ndocker run -d \\\n  --name testcase-generator \\\n  -p 3456:3456 \\\n  -e AI_PROVIDER=anthropic \\\n  -e ANTHROPIC_API_KEY=sk-ant-... \\\n  -e LANGUAGE=en \\\n  -e ENABLE_REVIEW=true \\\n  xuxuclassmate/testcase-generator:latest\n```\n\nThen open `http://localhost:3456` for the web UI.\n\n### Option 4: Docker Compose\n\nCreate a `.env` file:\n\n```bash\nAI_PROVIDER=anthropic\nANTHROPIC_API_KEY=sk-ant-...\nLANGUAGE=en\nENABLE_REVIEW=true\nREVIEW_THRESHOLD=90\nPORT=3456\n```\n\nThen run:\n\n```bash\ndocker compose up -d\n```\n\n### Option 5: Local Source (Development)\n\n```bash\ngit clone https://github.com/XuXuClassMate/testcase-generator\ncd testcase-generator\nnpm install\nnpm run build\n\n# Set environment variables\nexport AI_PROVIDER=anthropic\nexport ANTHROPIC_API_KEY=sk-ant-...\n\n# Run standalone web server\nnpm run standalone\n```\n\n---\n\n## ⚙️ Configuration Reference\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `AI_PROVIDER` | `anthropic` | Primary AI provider |\n| `ANTHROPIC_API_KEY` | - | Anthropic API key |\n| `OPENAI_API_KEY` | - | OpenAI API key |\n| `DEEPSEEK_API_KEY` | - | DeepSeek API key |\n| `QWEN_API_KEY` | - | Qwen (Aliyun) API key |\n| `LANGUAGE` | `en` | Output language (`en` / `zh`) |\n| `ENABLE_REVIEW` | `true` | Enable review loop |\n| `REVIEW_THRESHOLD` | `90` | Score threshold to stop review |\n| `MAX_REVIEW_ROUNDS` | `5` | Maximum review iterations |\n| `PORT` | `3456` | Web server port (standalone mode) |\n| `OUTPUT_DIR` | `./testcase-output` | Output directory for files |\n\n### Supported AI Providers\n\n| Provider | Vendor ID | Recommended Model |\n|----------|-----------|-------------------|\n| Anthropic | `anthropic` | claude-opus-4-5 |\n| OpenAI | `openai` | gpt-4o |\n| DeepSeek | `deepseek` | deepseek-chat |\n| Qwen | `qwen` | qwen-max |\n| Gemini | `gemini` | gemini-2.0-flash |\n| MiniMax | `minimax` | MiniMax-Text-01 |\n| Moonshot | `moonshot` | moonshot-v1-8k |\n| Zhipu | `zhipu` | glm-4 |\n\n---\n\n## 📁 Project Structure\n\n```\ntestcase-generator/\n├── SKILL.md                   # ClawHub skill descriptor\n├── openclaw.plugin.json       # OpenClaw plugin manifest\n├── package.json               # Node.js dependencies\n├── tsconfig.json              # TypeScript config\n├── docker-compose.yml         # Docker Compose config\n├── Dockerfile                 # Docker build instructions\n├── src/\n│   ├── index.ts               # OpenClaw plugin entry\n│   ├── standalone.ts          # Express web server\n│   ├── generator.ts           # Core generation logic\n│   ├── reviewer.ts            # Three-persona review loop\n│   ├── exporter.ts            # Excel/Markdown/XMind export\n│   ├── parser.ts              # PDF/Word/TXT parser\n│   ├── video-parser.ts        # Video frame extraction (ffmpeg)\n│   ├── ai-adapter.ts          # Multi-provider AI adapter\n│   ├── prompts.ts             # Stage-based prompt templates\n│   └── types.ts               # TypeScript types\n└── docs/\n    ├── README.md              # This file\n    └── index.html             # GitHub Pages documentation\n```\n\n---\n\n## 🔒 Security\n\n- **No shell execution**: Uses OpenClaw's `exec` API for ffmpeg calls\n- **Isolated execution**: Runs in OpenClaw's sandboxed environment\n- **No credential leakage**: API keys stored in OpenClaw config, not in code\n- **Clean dependencies**: All dependencies from official npm registry\n\n---\n\n## 🤝 Contributing\n\nThis is an **open source project** under the MIT License. Contributions are welcome!\n\n### Ways to Contribute\n\n- 🐛 **Report bugs**: Open an issue on GitHub\n- 💡 **Request features**: Suggest new features or improvements\n- 🔧 **Submit PRs**: Fix bugs, add features, improve docs\n- 📝 **Improve docs**: Better examples, translations, tutorials\n\n### Development Workflow\n\n```bash\n# Fork and clone\ngit clone https://github.com/YOUR_USERNAME/testcase-generator\ncd testcase-generator\n\n# Install dependencies\nnpm install\n\n# Make your changes\n# ...\n\n# Test locally\nnpm run build\nnpm run standalone\n\n# Commit and push\ngit commit -m \"feat: add new feature\"\ngit push origin main\n\n# Open a Pull Request on GitHub\n```\n\n---\n\n## 📞 Support\n\n- **GitHub Issues**: https://github.com/XuXuClassMate/testcase-generator/issues\n- **ClawHub Page**: https://clawhub.ai/xuxuclassmate/ai-testcase-generator-pro\n- **Email**: Open an issue for faster response\n\n---\n\n## 🔗 Links\n\n- **📂 GitHub Repository**: https://github.com/XuXuClassMate/testcase-generator\n- **🐳 Docker Hub**: https://hub.docker.com/r/xuxuclassmate/testcase-generator\n- **📦 npm Package**: https://www.npmjs.com/package/@classmatexuxu/ai-testcase-generator-pro\n- **🌐 ClawHub**: https://clawhub.ai/xuxuclassmate/ai-testcase-generator-pro\n- **📖 Documentation**: https://xuxuclassmate.github.io/testcase-generator/\n\n---\n\n## 📄 License\n\nMIT License — feel free to use, modify, and distribute.\n\nMade with ❤️ by [XuXuClassMate](https://github.com/XuXuClassMate)\n\nFile v2.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn7a6qzk16ny6zj2a6ge10exrn82q9qp\",\n  \"slug\": \"ai-testcase-generator\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1775142150081\n}\n\nFile v2.2.0:openclaw.plugin.json\n\n{\n  \"id\": \"testcase-generator\",\n  \"name\": \"AI Test Case Generator\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Generate high-quality test cases from docs/images/video with multi-model review loop (Test Manager · Dev Manager · Product Manager).\",\n  \"author\": \"XuXuClassMate\",\n  \"license\": \"MIT\",\n  \"entry\": \"./dist/index.js\",\n  \"skill\": \"./SKILL.md\",\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"models\": {\n        \"type\": \"array\",\n        \"description\": \"List of AI model configurations. See README § Model Configuration.\",\n        \"items\": {\n          \"type\": \"object\",\n          \"required\": [\"id\", \"vendor\", \"model\", \"apiKey\", \"role\"],\n          \"properties\": {\n            \"id\":      { \"type\": \"string\", \"description\": \"Unique slot ID\" },\n            \"label\":   { \"type\": \"string\", \"description\": \"Display name\" },\n            \"vendor\":  { \"type\": \"string\", \"enum\": [\"anthropic\",\"openai\",\"deepseek\",\"minimax\",\"qwen\",\"gemini\",\"moonshot\",\"zhipu\",\"custom\"] },\n            \"model\":   { \"type\": \"string\", \"description\": \"Model name, e.g. claude-opus-4-5\" },\n            \"baseUrl\": { \"type\": \"string\", \"description\": \"Custom API base URL (optional for standard vendors)\" },\n            \"apiKey\":  { \"type\": \"string\", \"description\": \"API key for this model\" },\n            \"role\":    { \"type\": \"string\", \"enum\": [\"generator\",\"reviewer\",\"both\"] },\n            \"params\":  { \"type\": \"object\", \"description\": \"Extra params, e.g. { temperature: 0.2 }\" }\n          }\n        }\n      },\n      \"language\":             { \"type\": \"string\", \"enum\": [\"en\",\"zh\"], \"default\": \"en\" },\n      \"enableReviewLoop\":     { \"type\": \"boolean\", \"default\": true },\n      \"reviewScoreThreshold\": { \"type\": \"number\",  \"default\": 90,   \"description\": \"Stop review when score >= this\" },\n      \"maxReviewRounds\":      { \"type\": \"number\",  \"default\": 5 },\n      \"standalonePort\":       { \"type\": \"number\",  \"default\": 3456 },\n      \"outputDir\":            { \"type\": \"string\",  \"default\": \"./testcase-output\" }\n    }\n  },\n  \"commands\": { \"enabled\": true, \"prefix\": \"/testgen\" },\n  \"tools\": [{ \"name\": \"generate_test_cases\", \"description\": \"Generate and review test cases from requirements\" }]\n}\n\nFile v2.2.0:package-lock.json\n\n{\n  \"name\": \"@classmatexuxu/testcase-generator\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"@classmatexuxu/testcase-generator\",\n      \"version\": \"1.0.0\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@anthropic-ai/sdk\": \"^0.39.0\",\n        \"archiver\": \"^6.0.1\",\n        \"cors\": \"^2.8.5\",\n        \"exceljs\": \"^4.4.0\",\n        \"express\": \"^4.18.2\",\n        \"express-rate-limit\": \"^7.5.0\",\n        \"fs-extra\": \"^11.2.0\",\n        \"mammoth\": \"^1.6.0\",\n        \"multer\": \"^2.0.2\",\n        \"openai\": \"^4.98.0\",\n        \"pdf-parse\": \"^1.1.1\",\n        \"sharp\": \"^0.33.2\",\n        \"uuid\": \"^9.0.0\"\n      },\n      \"bin\": {\n        \"testcase-generator\": \"dist/index.js\"\n      },\n      \"devDependencies\": {\n        \"@types/cors\": \"^2.8.17\",\n        \"@types/express\": \"^4.17.21\",\n        \"@types/fs-extra\": \"^11.0.4\",\n        \"@types/multer\": \"^2.0.0\",\n        \"@types/node\": \"^20.11.0\",\n        \"@types/uuid\": \"^9.0.8\",\n        \"ts-node\": \"^10.9.2\",\n        \"typescript\": \"^5.3.3\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@anthropic-ai/sdk\": {\n      \"version\": \"0.39.0\",\n      \"resolved\": \"https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.39.0.tgz\",\n      \"integrity\": \"sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^18.11.18\",\n        \"@types/node-fetch\": \"^2.6.4\",\n        \"abort-controller\": \"^3.0.0\",\n        \"agentkeepalive\": \"^4.2.1\",\n        \"form-data-encoder\": \"1.7.2\",\n        \"formdata-node\": \"^4.3.2\",\n        \"node-fetch\": \"^2.6.7\"\n      }\n    },\n    \"node_modules/@anthropic-ai/sdk/node_modules/@types/node\": {\n      \"version\": \"18.19.130\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz\",\n      \"integrity\": \"sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~5.26.4\"\n      }\n    },\n    \"node_modules/@anthropic-ai/sdk/node_modules/undici-types\": {\n      \"version\": \"5.26.5\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz\",\n      \"integrity\": \"sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@cspotcode/source-map-support\": {\n      \"version\": \"0.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz\",\n      \"integrity\": \"sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jridgewell/trace-mapping\": \"0.3.9\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@emnapi/runtime\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz\",\n      \"integrity\": \"sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.4.0\"\n      }\n    },\n    \"node_modules/@fast-csv/format\": {\n      \"version\": \"4.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz\",\n      \"integrity\": \"sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^14.0.1\",\n        \"lodash.escaperegexp\": \"^4.1.2\",\n        \"lodash.isboolean\": \"^3.0.3\",\n        \"lodash.isequal\": \"^4.5.0\",\n        \"lodash.isfunction\": \"^3.0.9\",\n        \"lodash.isnil\": \"^4.0.0\"\n      }\n    },\n    \"node_modules/@fast-csv/format/node_modules/@types/node\": {\n      \"version\": \"14.18.63\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz\",\n      \"integrity\": \"sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@fast-csv/parse\": {\n      \"version\": \"4.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz\",\n      \"integrity\": \"sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^14.0.1\",\n        \"lodash.escaperegexp\": \"^4.1.2\",\n        \"lodash.groupby\": \"^4.6.0\",\n        \"lodash.isfunction\": \"^3.0.9\",\n        \"lodash.isnil\": \"^4.0.0\",\n        \"lodash.isundefined\": \"^3.0.1\",\n        \"lodash.uniq\": \"^4.5.0\"\n      }\n    },\n    \"node_modules/@fast-csv/parse/node_modules/@types/node\": {\n      \"version\": \"14.18.63\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz\",\n      \"integrity\": \"sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@img/sharp-darwin-arm64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz\",\n      \"integrity\": \"sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-darwin-arm64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-darwin-x64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz\",\n      \"integrity\": \"sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-darwin-x64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-darwin-arm64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz\",\n      \"integrity\": \"sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-darwin-x64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz\",\n      \"integrity\": \"sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linux-arm\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz\",\n      \"integrity\": \"sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linux-arm64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz\",\n      \"integrity\": \"sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linux-s390x\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz\",\n      \"integrity\": \"sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linux-x64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz\",\n      \"integrity\": \"sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linuxmusl-arm64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz\",\n      \"integrity\": \"sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linuxmusl-x64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz\",\n      \"integrity\": \"sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-linux-arm\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz\",\n      \"integrity\": \"sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linux-arm\": \"1.0.5\"\n      }\n    },\n    \"node_modules/@img/sharp-linux-arm64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz\",\n      \"integrity\": \"sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linux-arm64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-linux-s390x\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz\",\n      \"integrity\": \"sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linux-s390x\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-linux-x64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz\",\n      \"integrity\": \"sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linux-x64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-linuxmusl-arm64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz\",\n      \"integrity\": \"sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linuxmusl-arm64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-linuxmusl-x64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz\",\n      \"integrity\": \"sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linuxmusl-x64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-wasm32\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz\",\n      \"integrity\": \"sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==\",\n      \"cpu\": [\n        \"wasm32\"\n      ],\n      \"license\": \"Apache-2.0 AND LGPL-3.0-or-later AND MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@emnapi/runtime\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-win32-ia32\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz\",\n      \"integrity\": \"sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"license\": \"Apache-2.0 AND LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-win32-x64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz\",\n      \"integrity\": \"sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"Apache-2.0 AND LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n      \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n      \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.9\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz\",\n      \"integrity\": \"sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.0.3\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n      }\n    },\n    \"node_modules/@tsconfig/node10\": {\n      \"version\": \"1.0.12\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz\",\n      \"integrity\": \"sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@tsconfig/node12\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz\",\n      \"integrity\": \"sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@tsconfig/node14\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz\",\n      \"integrity\": \"sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@tsconfig/node16\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz\",\n      \"integrity\": \"sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/body-parser\": {\n      \"version\": \"1.19.6\",\n      \"resolved\": \"https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz\",\n      \"integrity\": \"sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/connect\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/connect\": {\n      \"version\": \"3.4.38\",\n      \"resolved\": \"https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz\",\n      \"integrity\": \"sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/cors\": {\n      \"version\": \"2.8.19\",\n      \"resolved\": \"https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz\",\n      \"integrity\": \"sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/express\": {\n      \"version\": \"4.17.25\",\n      \"resolved\": \"https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz\",\n      \"integrity\": \"sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/body-parser\": \"*\",\n        \"@types/express-serve-static-core\": \"^4.17.33\",\n        \"@types/qs\": \"*\",\n        \"@types/serve-static\": \"^1\"\n      }\n    },\n    \"node_modules/@types/express-serve-static-core\": {\n      \"version\": \"4.19.8\",\n      \"resolved\": \"https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz\",\n      \"integrity\": \"sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\",\n        \"@types/qs\": \"*\",\n        \"@types/range-parser\": \"*\",\n        \"@types/send\": \"*\"\n      }\n    },\n    \"node_modules/@types/fs-extra\": {\n      \"version\": \"11.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz\",\n      \"integrity\": \"sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/jsonfile\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/http-errors\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz\",\n      \"integrity\": \"sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/jsonfile\": {\n      \"version\": \"6.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz\",\n      \"integrity\": \"sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/mime\": {\n      \"version\": \"1.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz\",\n      \"integrity\": \"sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/multer\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/multer/-/multer-2.1.0.tgz\",\n      \"integrity\": \"sha512-zYZb0+nJhOHtPpGDb3vqPjwpdeGlGC157VpkqNQL+UU2qwoacoQ7MpsAmUptI/0Oa127X32JzWDqQVEXp2RcIA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/express\": \"*\"\n      }\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"20.19.37\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz\",\n      \"integrity\": \"sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/@types/node-fetch\": {\n      \"version\": \"2.6.13\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz\",\n      \"integrity\": \"sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\",\n        \"form-data\": \"^4.0.4\"\n      }\n    },\n    \"node_modules/@types/qs\": {\n      \"version\": \"6.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz\",\n      \"integrity\": \"sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/range-parser\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz\",\n      \"integrity\": \"sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/send\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz\",\n      \"integrity\": \"sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/serve-static\": {\n      \"version\": \"1.15.10\",\n      \"resolved\": \"https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz\",\n      \"integrity\": \"sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/http-errors\": \"*\",\n        \"@types/node\": \"*\",\n        \"@types/send\": \"<1\"\n      }\n    },\n    \"node_modules/@types/serve-static/node_modules/@types/send\": {\n      \"version\": \"0.17.6\",\n      \"resolved\": \"https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz\",\n      \"integrity\": \"sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/mime\": \"^1\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/uuid\": {\n      \"version\": \"9.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz\",\n      \"integrity\": \"sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@xmldom/xmldom\": {\n      \"version\": \"0.8.12\",\n      \"resolved\": \"https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz\",\n      \"integrity\": \"sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/abort-controller\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz\",\n      \"integrity\": \"sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"event-target-shim\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.5\"\n      }\n    },\n    \"node_modules/accepts\": {\n      \"version\": \"1.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz\",\n      \"integrity\": \"sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-types\": \"~2.1.34\",\n        \"negotiator\": \"0.6.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.16.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz\",\n      \"integrity\": \"sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/acorn-walk\": {\n      \"version\": \"8.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz\",\n      \"integrity\": \"sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"acorn\": \"^8.11.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/agentkeepalive\": {\n      \"version\": \"4.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz\",\n      \"integrity\": \"sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"humanize-ms\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8.0.0\"\n      }\n    },\n    \"node_modules/append-field\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz\",\n      \"integrity\": \"sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/archiver\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/archiver/-/archiver-6.0.2.tgz\",\n      \"integrity\": \"sha512-UQ/2nW7NMl1G+1UnrLypQw1VdT9XZg/ECcKPq7l+STzStrSivFIXIp34D8M5zeNGW5NoOupdYCHv6VySCPNNlw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"archiver-utils\": \"^4.0.1\",\n        \"async\": \"^3.2.4\",\n        \"buffer-crc32\": \"^0.2.1\",\n        \"readable-stream\": \"^3.6.0\",\n        \"readdir-glob\": \"^1.1.2\",\n        \"tar-stream\": \"^3.0.0\",\n        \"zip-stream\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.0.0\"\n      }\n    },\n    \"node_modules/archiver-utils\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz\",\n      \"integrity\": \"sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"glob\": \"^8.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"lazystream\": \"^1.0.0\",\n        \"lodash\": \"^4.17.15\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^3.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.0.0\"\n      }\n    },\n    \"node_modules/arg\": {\n      \"version\": \"4.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/arg/-/arg-4.1.3.tgz\",\n      \"integrity\": \"sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"1.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz\",\n      \"integrity\": \"sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"sprintf-js\": \"~1.0.2\"\n      }\n    },\n    \"node_modules/array-flatten\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz\",\n      \"integrity\": \"sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/async\": {\n      \"version\": \"3.2.6\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-3.2.6.tgz\",\n      \"integrity\": \"sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/asynckit\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\n      \"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/b4a\": {\n      \"version\": \"1.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz\",\n      \"integrity\": \"sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"react-native-b4a\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"react-native-b4a\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/bare-events\": {\n      \"version\": \"2.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz\",\n      \"integrity\": \"sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-fs\": {\n      \"version\": \"4.5.6\",\n      \"resolved\": \"https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.6.tgz\",\n      \"integrity\": \"sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.5.4\",\n        \"bare-path\": \"^3.0.0\",\n        \"bare-stream\": \"^2.6.4\",\n        \"bare-url\": \"^2.2.2\",\n        \"fast-fifo\": \"^1.3.2\"\n      },\n      \"engines\": {\n        \"bare\": \">=1.16.0\"\n      },\n      \"peerDependencies\": {\n        \"bare-buffer\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-buffer\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-os\": {\n      \"version\": \"3.8.6\",\n      \"resolved\": \"https://registry.npmjs.org/bare-os/-/bare-os-3.8.6.tgz\",\n      \"integrity\": \"sha512-l8xaNWWb/bXuzgsrlF5jaa5QYDJ9S0ddd54cP6CH+081+5iPrbJiCfBWQqrWYzmUhCbsH+WR6qxo9MeHVCr0MQ==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"bare\": \">=1.14.0\"\n      }\n    },\n    \"node_modules/bare-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-os\": \"^3.0.1\"\n      }\n    },\n    \"node_modules/bare-stream\": {\n      \"version\": \"2.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-stream/-/bare-stream-2.12.0.tgz\",\n      \"integrity\": \"sha512-w28i8lkBgREV3rPXGbgK+BO66q+ZpKqRWrZLiCdmmUlLPrQ45CzkvRhN+7lnv00Gpi2zy5naRxnUFAxCECDm9g==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"streamx\": \"^2.25.0\",\n        \"teex\": \"^1.0.1\"\n      },\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\",\n        \"bare-buffer\": \"*\",\n        \"bare-events\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        },\n        \"bare-buffer\": {\n          \"optional\": true\n        },\n        \"bare-events\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-url\": {\n      \"version\": \"2.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz\",\n      \"integrity\": \"sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-path\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/base64-js\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz\",\n      \"integrity\": \"sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/big-integer\": {\n      \"version\": \"1.6.52\",\n      \"resolved\": \"https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz\",\n      \"integrity\": \"sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==\",\n      \"license\": \"Unlicense\",\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/binary\": {\n      \"version\": \"0.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/binary/-/binary-0.3.0.tgz\",\n      \"integrity\": \"sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"buffers\": \"~0.1.1\",\n        \"chainsaw\": \"~0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/bl\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/bl/-/bl-4.1.0.tgz\",\n      \"integrity\": \"sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"buffer\": \"^5.5.0\",\n        \"inherits\": \"^2.0.4\",\n        \"readable-stream\": \"^3.4.0\"\n      }\n    },\n    \"node_modules/bluebird\": {\n      \"version\": \"3.4.7\",\n      \"resolved\": \"https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz\",\n      \"integrity\": \"sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/body-parser\": {\n      \"version\": \"1.20.4\",\n      \"resolved\": \"https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz\",\n      \"integrity\": \"sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"bytes\": \"~3.1.2\",\n        \"content-type\": \"~1.0.5\",\n        \"debug\": \"2.6.9\",\n        \"depd\": \"2.0.0\",\n        \"destroy\": \"~1.2.0\",\n        \"http-errors\": \"~2.0.1\",\n        \"iconv-lite\": \"~0.4.24\",\n        \"on-finished\": \"~2.4.1\",\n        \"qs\": \"~6.14.0\",\n        \"raw-body\": \"~2.5.3\",\n        \"type-is\": \"~1.6.18\",\n        \"unpipe\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\",\n        \"npm\": \"1.2.8000 || >= 1.4.16\"\n      }\n    },\n    \"node_modules/brace-expansion\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz\",\n      \"integrity\": \"sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/buffer\": {\n      \"version\": \"5.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz\",\n      \"integrity\": \"sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.1.13\"\n      }\n    },\n    \"node_modules/buffer-crc32\": {\n      \"version\": \"0.2.13\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz\",\n      \"integrity\": \"sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/buffer-from\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz\",\n      \"integrity\": \"sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/buffer-indexof-polyfill\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz\",\n      \"integrity\": \"sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10\"\n      }\n    },\n    \"node_modules/buffers\": {\n      \"version\": \"0.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz\",\n      \"integrity\": \"sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==\",\n      \"engines\": {\n        \"node\": \">=0.2.0\"\n      }\n    },\n    \"node_modules/busboy\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz\",\n      \"integrity\": \"sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==\",\n      \"dependencies\": {\n        \"streamsearch\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10.16.0\"\n      }\n    },\n    \"node_modules/bytes\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz\",\n      \"integrity\": \"sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/chainsaw\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz\",\n      \"integrity\": \"sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==\",\n      \"license\": \"MIT/X11\",\n      \"dependencies\": {\n        \"traverse\": \">=0.3.0 <0.4\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/color\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/color/-/color-4.2.3.tgz\",\n      \"integrity\": \"sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\",\n        \"color-string\": \"^1.9.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12.5.0\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/color-string\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz\",\n      \"integrity\": \"sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"^1.0.0\",\n        \"simple-swizzle\": \"^0.2.2\"\n      }\n    },\n    \"node_modules/combined-stream\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\n      \"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"delayed-stream\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/compress-commons\": {\n      \"version\": \"5.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.3.tgz\",\n      \"integrity\": \"sha512-/UIcLWvwAQyVibgpQDPtfNM3SvqN7G9elAPAV7GM0L53EbNWwWiCsWtK8Fwed/APEbptPHXs5PuW+y8Bq8lFTA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"crc32-stream\": \"^5.0.0\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^3.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.0.0\"\n      }\n    },\n    \"node_modules/concat-map\": {\n      \"version\": \"0.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz\",\n      \"integrity\": \"sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/concat-stream\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz\",\n      \"integrity\": \"sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==\",\n      \"engines\": [\n        \"node >= 6.0\"\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"buffer-from\": \"^1.0.0\",\n        \"inherits\": \"^2.0.3\",\n        \"readable-stream\": \"^3.0.2\",\n        \"typedarray\": \"^0.0.6\"\n      }\n    },\n    \"node_modules/content-disposition\": {\n      \"version\": \"0.5.4\",\n      \"resolved\": \"https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz\",\n      \"integrity\": \"sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"5.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/content-type\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz\",\n      \"integrity\": \"sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/cookie\": {\n      \"version\": \"0.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz\",\n      \"integrity\": \"sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/cookie-signature\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz\",\n      \"integrity\": \"sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/core-util-is\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz\",\n      \"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/cors\": {\n      \"version\": \"2.8.6\",\n      \"resolved\": \"https://registry.npmjs.org/cors/-/cors-2.8.6.tgz\",\n      \"integrity\": \"sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"object-assign\": \"^4\",\n        \"vary\": \"^1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/crc-32\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz\",\n      \"integrity\": \"sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"crc32\": \"bin/crc32.njs\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/crc32-stream\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.1.tgz\",\n      \"integrity\": \"sha512-lO1dFui+CEUh/ztYIpgpKItKW9Bb4NWakCRJrnqAbFIYD+OZAwb2VfD5T5eXMw2FNcsDHkQcNl/Wh3iVXYwU6g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"readable-stream\": \"^3.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.0.0\"\n      }\n    },\n    \"node_modules/create-require\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz\",\n      \"integrity\": \"sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/dayjs\": {\n      \"version\": \"1.11.20\",\n      \"resolved\": \"https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz\",\n      \"integrity\": \"sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/delayed-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1\n\nFile v2.2.0:package.json\n\n{\n  \"name\": \"@classmatexuxu/testcase-generator\",\n  \"version\": \"1.0.0\",\n  \"description\": \"AI-powered test case generation for PRDs, specs, and multimodal QA inputs\",\n  \"main\": \"./dist/index.js\",\n  \"bin\": {\n    \"testcase-generator\": \"./dist/index.js\"\n  },\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/XuXuClassMate/testcase-generator.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/XuXuClassMate/testcase-generator/issues\"\n  },\n  \"homepage\": \"https://github.com/XuXuClassMate/testcase-generator#readme\",\n  \"keywords\": [\n    \"openclaw\",\n    \"testing\",\n    \"testcase\",\n    \"qa\",\n    \"openai\",\n    \"anthropic\"\n  ],\n  \"files\": [\n    \"dist\",\n    \"public\",\n    \"README.md\",\n    \"docs\",\n    \"openclaw.plugin.json\",\n    \"SKILL.md\",\n    \".env.example\",\n    \"scripts/install.sh\"\n  ],\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"dev\": \"ts-node src/index.ts\",\n    \"dev:standalone\": \"ts-node src/index.ts --standalone\",\n    \"start\": \"node dist/index.js --standalone\",\n    \"standalone\": \"ts-node src/standalone.ts\",\n    \"standalone:build\": \"tsc && node dist/standalone.js\",\n    \"prepare:npm-package\": \"node scripts/prepare-npm-package.js\",\n    \"prepack\": \"npm run build\",\n    \"clean\": \"rm -rf dist\"\n  },\n  \"dependencies\": {\n    \"@anthropic-ai/sdk\": \"^0.39.0\",\n    \"openai\": \"^4.98.0\",\n    \"express\": \"^4.18.2\",\n    \"express-rate-limit\": \"^7.5.0\",\n    \"multer\": \"^2.0.2\",\n    \"exceljs\": \"^4.4.0\",\n    \"pdf-parse\": \"^1.1.1\",\n    \"mammoth\": \"^1.6.0\",\n    \"sharp\": \"^0.33.2\",\n    \"cors\": \"^2.8.5\",\n    \"archiver\": \"^6.0.1\",\n    \"uuid\": \"^9.0.0\",\n    \"fs-extra\": \"^11.2.0\"\n  },\n  \"devDependencies\": {\n    \"@types/express\": \"^4.17.21\",\n    \"@types/multer\": \"^2.0.0\",\n    \"@types/cors\": \"^2.8.17\",\n    \"@types/uuid\": \"^9.0.8\",\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/node\": \"^20.11.0\",\n    \"typescript\": \"^5.3.3\",\n    \"ts-node\": \"^10.9.2\"\n  },\n  \"openclaw\": {\n    \"extensions\": [\"./dist/index.js\"]\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n\nFile v2.2.0:tsconfig.json\n\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"module\": \"commonjs\",\n    \"lib\": [\"ES2020\"],\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n\nFile v2.2.0:docker-compose.yml\n\nversion: \"3.9\"\n\nservices:\n  testcase-generator:\n    build: .\n    image: testcase-generator:latest\n    container_name: testcase-generator\n    restart: unless-stopped\n    ports:\n      - \"${PORT:-3456}:3456\"\n    environment:\n      # ── AI Provider ──────────────────────────────────────────────────────\n      AI_PROVIDER: ${AI_PROVIDER:-anthropic}        # anthropic | openai | deepseek\n      ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}\n      OPENAI_API_KEY: ${OPENAI_API_KEY:-}\n      DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n\n      # ── App config ───────────────────────────────────────────────────────\n      LANGUAGE: ${LANGUAGE:-en}                     # en | zh\n      ENABLE_REVIEW: ${ENABLE_REVIEW:-true}\n      REVIEW_THRESHOLD: ${REVIEW_THRESHOLD:-90}\n      MAX_REVIEW_ROUNDS: ${MAX_REVIEW_ROUNDS:-5}\n      OUTPUT_DIR: /data/testcase-output\n    volumes:\n      - testcase-output:/data/testcase-output\n    healthcheck:\n      test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:3456/api/health\"]\n      interval: 30s\n      timeout: 5s\n      retries: 3\n\nvolumes:\n  testcase-output:\n\nArchive v2.1.0: 19 files, 74033 bytes\n\nFiles: docker-compose.yml (1300b), openclaw.plugin.json (2184b), package-lock.json (132595b), package.json (2056b), README.md (9276b), SKILL.md (3041b), src/ai-adapter.ts (6133b), src/archiver.d.ts (27b), src/exporter.ts (10329b), src/generator.ts (10701b), src/index.ts (11720b), src/parser.ts (4945b), src/prompts.ts (2949b), src/reviewer.ts (13793b), src/standalone.ts (13345b), src/types.ts (10435b), src/video-parser.ts (5150b), tsconfig.json (445b), _meta.json (140b)\n\nFile v2.1.0:SKILL.md\n\n---\nname: ai-testcase-generator-pro\nversion: 2.1.0\ndescription: AI-powered test case generator with three-persona review loop. Supports PDF, Word, TXT, images, video. Exports Excel, Markdown, XMind.\nauthor: XuXuClassMate\nlicense: MIT\ntags: [testing, qa, testcases, ai-testing, automation, openclaw]\ncategory: Development\nmetadata:\n  openclaw:\n    requires:\n      env:\n        - ANTHROPIC_API_KEY\n      bins:\n        - node\n        - npm\n    primaryEnv: ANTHROPIC_API_KEY\n    emoji: 🧪\n    homepage: https://github.com/XuXuClassMate/testcase-generator\n    safety:\n      level: safe\n      audit: manual\n      notes: Uses OpenClaw exec API for ffmpeg calls. All LLM calls use official SDKs. No shell execution.\n---\n\n# AI Test Case Generator Skill\n\n## What this skill does\n\nAutomatically generates structured test cases from requirement documents, UI screenshots, videos, or plain text. Supports a multi-model review loop where **Test Manager**, **Dev Manager**, and **Product Manager** personas review and score the output iteratively until quality ≥ 90/100.\n\n## Trigger phrases\n\nUse this skill when the user says anything like:\n\n- \"generate test cases for …\"\n- \"write test cases / QA cases / test suite for …\"\n- \"create test plan from this requirement\"\n- \"review my test cases\"\n- \"需求评审 / 测试用例 / 生成用例\"\n- Uploads a `.pdf`, `.docx`, `.txt`, image, or video file and asks about testing\n\n## Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `text` | string | — | Requirement description text |\n| `file_path` | string | — | Path to uploaded requirement file |\n| `prompt` | string | — | Custom focus hint, e.g. \"focus on security\" |\n| `stage` | enum | `development` | `requirement` \\| `development` \\| `prerelease` |\n| `language` | enum | `en` | `en` \\| `zh` |\n| `enable_review` | boolean | `true` | Run multi-model review loop |\n\n## Output\n\nReturns a Markdown-formatted test case report including:\n- Test points grouped by module\n- Full test cases with ID, steps, expected results, priority\n- Quality score (0–100) after review loop\n- Review comments from 3 reviewer personas\n\nAlso saves:\n- `.xlsx` — Excel test suite (3 sheets: cases / points / stats)\n- `.xmind` — XMind mind map of test points\n- `.md` — Markdown report\n\n## Example invocations\n\n```\nGenerate test cases for user login:\n- Phone + password login\n- OAuth (GitHub, Google)\n- Lock account after 5 failed attempts\n- Remember me (7-day token)\n```\n\n```\n/testgen /uploads/requirements.pdf --prompt focus on edge cases and security\n```\n\n```\nGenerate Chinese test cases for the pre-release stage from this PRD\n[attaches file]\n```\n\n## Review loop scoring (100 pts)\n\n| Dimension | Max | Reviewer Focus |\n|-----------|-----|----------------|\n| Coverage | 30 | Test Manager |\n| Logic Integrity | 20 | Dev Manager |\n| Executability | 20 | Test Manager |\n| Clarity | 15 | Product Manager |\n| Security | 15 | Dev Manager |\n\nTerminates when: score ≥ 90 · OR · no new issues · OR · 5 rounds max\n\nFile v2.1.0:README.md\n\n# AI Test Case Generator Pro 🧪\n\n**AI-powered test case generator with three-persona review loop.**\n\nSupports PDF, Word, TXT, images, and video input. Exports to Excel, Markdown, and XMind mind maps.\n\nBuilt for OpenClaw — runs as a plugin or standalone web service.\n\n---\n\n## 🚀 Quick Start for OpenClaw Users\n\n### Prerequisites\n\n- OpenClaw installed and running\n- Node.js ≥ 18 and npm\n- At least one AI API key (Anthropic, OpenAI, DeepSeek, or Qwen)\n\n### Step 1: Install the Skill\n\n```bash\n# Install from ClawHub\nopenclaw skills install xuxuclassmate/ai-testcase-generator-pro\n\n# Or install from local source (development mode)\ngit clone https://github.com/XuXuClassMate/testcase-generator\ncd testcase-generator\nopenclaw skills install -l .\n```\n\n### Step 2: Configure API Keys\n\nEdit your OpenClaw config (`~/.openclaw/config.yaml`):\n\n```yaml\nplugins:\n  entries:\n    ai-testcase-generator-pro:\n      enabled: true\n      config:\n        models:\n          - id: claude-generator\n            vendor: anthropic\n            model: claude-opus-4-5\n            apiKey: \"sk-ant-...\"  # Your Anthropic API key\n            role: generator\n          - id: gpt4o-reviewer\n            vendor: openai\n            model: gpt-4o\n            apiKey: \"sk-...\"      # Your OpenAI API key\n            role: reviewer\n          - id: deepseek-reviewer\n            vendor: deepseek\n            model: deepseek-chat\n            apiKey: \"sk-...\"      # Your DeepSeek API key\n            role: reviewer\n        language: en              # or 'zh' for Chinese\n        enableReviewLoop: true\n        reviewScoreThreshold: 90\n        maxReviewRounds: 5\n```\n\n### Step 3: Restart OpenClaw Gateway\n\n```bash\nopenclaw gateway restart\n```\n\n### Step 4: Verify Installation\n\n```bash\nopenclaw skills list\n# You should see: ai-testcase-generator-pro ✅\n```\n\n---\n\n## 💬 How to Use\n\n### Method 1: Chat Commands\n\nIn your OpenClaw chat (Feishu, Telegram, Discord, etc.):\n\n```\n/testgen User login: phone+password, OAuth, lock after 5 failed attempts\n```\n\nOr with file attachments:\n\n```\n/testgen [attach your PDF/Word/image/video files]\n```\n\n### Method 2: As an AI Tool\n\nThe skill automatically registers as a tool. Just ask your AI assistant:\n\n> \"Generate test cases for the checkout flow: add to cart → payment → order confirmation\"\n\nThe AI will automatically invoke the `generate_test_cases` tool.\n\n### Method 3: Advanced Options\n\n```\n/testgen /path/to/requirements.pdf --prompt \"Focus on security testing\" --stage development --language zh\n```\n\n**Options:**\n- `--prompt`: Custom focus hint (e.g., \"Focus on performance\", \"Add edge cases\")\n- `--stage`: `requirement` | `development` | `prerelease` (default: `requirement`)\n- `--language`: `en` | `zh` (default: `en`)\n- `--enableReview`: `true` | `false` (default: `true`)\n\n---\n\n## 🎯 What You Get\n\n### Output Formats\n\nAfter generation, you can download test cases in:\n\n1. **Excel (.xlsx)** - Professional test case format with columns:\n   - Test Case ID\n   - Title\n   - Preconditions\n   - Test Steps\n   - Expected Result\n   - Priority (P0/P1/P2)\n   - Tags\n\n2. **Markdown (.md)** - Clean, readable format for documentation\n\n3. **XMind (.xmind)** - Mind map for visual test planning\n\n### Three-Persona Review Loop\n\nEvery test case is reviewed by three AI personas:\n\n| Persona | Focus Area |\n|---------|------------|\n| 🎯 Test Manager | Coverage, executability, boundary scenarios |\n| 💻 Dev Manager | Technical feasibility, API tests, security |\n| 📋 Product Manager | Business logic, user journey, requirements alignment |\n\nEach persona scores the test cases (0-100). The loop continues until the average score meets your threshold (default: 90).\n\n---\n\n## 📦 Installation Options\n\n### Option 1: ClawHub (Recommended)\n\n```bash\nopenclaw skills install xuxuclassmate/ai-testcase-generator-pro\n```\n\n### Option 2: npm (Global Install)\n\n```bash\nnpm install -g @classmatexuxu/ai-testcase-generator-pro\n\n# Set environment variables\nexport AI_PROVIDER=anthropic\nexport ANTHROPIC_API_KEY=sk-ant-...\nexport PORT=3456\n\n# Run standalone\nai-testcase-generator-pro --standalone\n```\n\n### Option 3: Docker\n\n```bash\n# Pull the image\ndocker pull xuxuclassmate/testcase-generator:latest\n\n# Run with environment variables\ndocker run -d \\\n  --name testcase-generator \\\n  -p 3456:3456 \\\n  -e AI_PROVIDER=anthropic \\\n  -e ANTHROPIC_API_KEY=sk-ant-... \\\n  -e LANGUAGE=en \\\n  -e ENABLE_REVIEW=true \\\n  xuxuclassmate/testcase-generator:latest\n```\n\nThen open `http://localhost:3456` for the web UI.\n\n### Option 4: Docker Compose\n\nCreate a `.env` file:\n\n```bash\nAI_PROVIDER=anthropic\nANTHROPIC_API_KEY=sk-ant-...\nLANGUAGE=en\nENABLE_REVIEW=true\nREVIEW_THRESHOLD=90\nPORT=3456\n```\n\nThen run:\n\n```bash\ndocker compose up -d\n```\n\n### Option 5: Local Source (Development)\n\n```bash\ngit clone https://github.com/XuXuClassMate/testcase-generator\ncd testcase-generator\nnpm install\nnpm run build\n\n# Set environment variables\nexport AI_PROVIDER=anthropic\nexport ANTHROPIC_API_KEY=sk-ant-...\n\n# Run standalone web server\nnpm run standalone\n```\n\n---\n\n## ⚙️ Configuration Reference\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `AI_PROVIDER` | `anthropic` | Primary AI provider |\n| `ANTHROPIC_API_KEY` | - | Anthropic API key |\n| `OPENAI_API_KEY` | - | OpenAI API key |\n| `DEEPSEEK_API_KEY` | - | DeepSeek API key |\n| `QWEN_API_KEY` | - | Qwen (Aliyun) API key |\n| `LANGUAGE` | `en` | Output language (`en` / `zh`) |\n| `ENABLE_REVIEW` | `true` | Enable review loop |\n| `REVIEW_THRESHOLD` | `90` | Score threshold to stop review |\n| `MAX_REVIEW_ROUNDS` | `5` | Maximum review iterations |\n| `PORT` | `3456` | Web server port (standalone mode) |\n| `OUTPUT_DIR` | `./testcase-output` | Output directory for files |\n\n### Supported AI Providers\n\n| Provider | Vendor ID | Recommended Model |\n|----------|-----------|-------------------|\n| Anthropic | `anthropic` | claude-opus-4-5 |\n| OpenAI | `openai` | gpt-4o |\n| DeepSeek | `deepseek` | deepseek-chat |\n| Qwen | `qwen` | qwen-max |\n| Gemini | `gemini` | gemini-2.0-flash |\n| MiniMax | `minimax` | MiniMax-Text-01 |\n| Moonshot | `moonshot` | moonshot-v1-8k |\n| Zhipu | `zhipu` | glm-4 |\n\n---\n\n## 📁 Project Structure\n\n```\ntestcase-generator/\n├── SKILL.md                   # ClawHub skill descriptor\n├── openclaw.plugin.json       # OpenClaw plugin manifest\n├── package.json               # Node.js dependencies\n├── tsconfig.json              # TypeScript config\n├── docker-compose.yml         # Docker Compose config\n├── Dockerfile                 # Docker build instructions\n├── src/\n│   ├── index.ts               # OpenClaw plugin entry\n│   ├── standalone.ts          # Express web server\n│   ├── generator.ts           # Core generation logic\n│   ├── reviewer.ts            # Three-persona review loop\n│   ├── exporter.ts            # Excel/Markdown/XMind export\n│   ├── parser.ts              # PDF/Word/TXT parser\n│   ├── video-parser.ts        # Video frame extraction (ffmpeg)\n│   ├── ai-adapter.ts          # Multi-provider AI adapter\n│   ├── prompts.ts             # Stage-based prompt templates\n│   └── types.ts               # TypeScript types\n└── docs/\n    ├── README.md              # This file\n    └── index.html             # GitHub Pages documentation\n```\n\n---\n\n## 🔒 Security\n\n- **No shell execution**: Uses OpenClaw's `exec` API for ffmpeg calls\n- **Isolated execution**: Runs in OpenClaw's sandboxed environment\n- **No credential leakage**: API keys stored in OpenClaw config, not in code\n- **Clean dependencies**: All dependencies from official npm registry\n\n---\n\n## 🤝 Contributing\n\nThis is an **open source project** under the MIT License. Contributions are welcome!\n\n### Ways to Contribute\n\n- 🐛 **Report bugs**: Open an issue on GitHub\n- 💡 **Request features**: Suggest new features or improvements\n- 🔧 **Submit PRs**: Fix bugs, add features, improve docs\n- 📝 **Improve docs**: Better examples, translations, tutorials\n\n### Development Workflow\n\n```bash\n# Fork and clone\ngit clone https://github.com/YOUR_USERNAME/testcase-generator\ncd testcase-generator\n\n# Install dependencies\nnpm install\n\n# Make your changes\n# ...\n\n# Test locally\nnpm run build\nnpm run standalone\n\n# Commit and push\ngit commit -m \"feat: add new feature\"\ngit push origin main\n\n# Open a Pull Request on GitHub\n```\n\n---\n\n## 📞 Support\n\n- **GitHub Issues**: https://github.com/XuXuClassMate/testcase-generator/issues\n- **ClawHub Page**: https://clawhub.ai/xuxuclassmate/ai-testcase-generator-pro\n- **Email**: Open an issue for faster response\n\n---\n\n## 🔗 Links\n\n- **📂 GitHub Repository**: https://github.com/XuXuClassMate/testcase-generator\n- **🐳 Docker Hub**: https://hub.docker.com/r/xuxuclassmate/testcase-generator\n- **📦 npm Package**: https://www.npmjs.com/package/@classmatexuxu/ai-testcase-generator-pro\n- **🌐 ClawHub**: https://clawhub.ai/xuxuclassmate/ai-testcase-generator-pro\n- **📖 Documentation**: https://xuxuclassmate.github.io/testcase-generator/\n\n---\n\n## 📄 License\n\nMIT License — feel free to use, modify, and distribute.\n\nMade with ❤️ by [XuXuClassMate](https://github.com/XuXuClassMate)\n\nFile v2.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7a6qzk16ny6zj2a6ge10exrn82q9qp\",\n  \"slug\": \"ai-testcase-generator\",\n  \"version\": \"2.1.0\",\n  \"publishedAt\": 1775141782898\n}\n\nFile v2.1.0:openclaw.plugin.json\n\n{\n  \"id\": \"testcase-generator\",\n  \"name\": \"AI Test Case Generator\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Generate high-quality test cases from docs/images/video with multi-model review loop (Test Manager · Dev Manager · Product Manager).\",\n  \"author\": \"XuXuClassMate\",\n  \"license\": \"MIT\",\n  \"entry\": \"./dist/index.js\",\n  \"skill\": \"./SKILL.md\",\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"models\": {\n        \"type\": \"array\",\n        \"description\": \"List of AI model configurations. See README § Model Configuration.\",\n        \"items\": {\n          \"type\": \"object\",\n          \"required\": [\"id\", \"vendor\", \"model\", \"apiKey\", \"role\"],\n          \"properties\": {\n            \"id\":      { \"type\": \"string\", \"description\": \"Unique slot ID\" },\n            \"label\":   { \"type\": \"string\", \"description\": \"Display name\" },\n            \"vendor\":  { \"type\": \"string\", \"enum\": [\"anthropic\",\"openai\",\"deepseek\",\"minimax\",\"qwen\",\"gemini\",\"moonshot\",\"zhipu\",\"custom\"] },\n            \"model\":   { \"type\": \"string\", \"description\": \"Model name, e.g. claude-opus-4-5\" },\n            \"baseUrl\": { \"type\": \"string\", \"description\": \"Custom API base URL (optional for standard vendors)\" },\n            \"apiKey\":  { \"type\": \"string\", \"description\": \"API key for this model\" },\n            \"role\":    { \"type\": \"string\", \"enum\": [\"generator\",\"reviewer\",\"both\"] },\n            \"params\":  { \"type\": \"object\", \"description\": \"Extra params, e.g. { temperature: 0.2 }\" }\n          }\n        }\n      },\n      \"language\":             { \"type\": \"string\", \"enum\": [\"en\",\"zh\"], \"default\": \"en\" },\n      \"enableReviewLoop\":     { \"type\": \"boolean\", \"default\": true },\n      \"reviewScoreThreshold\": { \"type\": \"number\",  \"default\": 90,   \"description\": \"Stop review when score >= this\" },\n      \"maxReviewRounds\":      { \"type\": \"number\",  \"default\": 5 },\n      \"standalonePort\":       { \"type\": \"number\",  \"default\": 3456 },\n      \"outputDir\":            { \"type\": \"string\",  \"default\": \"./testcase-output\" }\n    }\n  },\n  \"commands\": { \"enabled\": true, \"prefix\": \"/testgen\" },\n  \"tools\": [{ \"name\": \"generate_test_cases\", \"description\": \"Generate and review test cases from requirements\" }]\n}\n\nFile v2.1.0:package-lock.json\n\n{\n  \"name\": \"@classmatexuxu/testcase-generator\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"@classmatexuxu/testcase-generator\",\n      \"version\": \"1.0.0\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@anthropic-ai/sdk\": \"^0.39.0\",\n        \"archiver\": \"^6.0.1\",\n        \"cors\": \"^2.8.5\",\n        \"exceljs\": \"^4.4.0\",\n        \"express\": \"^4.18.2\",\n        \"express-rate-limit\": \"^7.5.0\",\n        \"fs-extra\": \"^11.2.0\",\n        \"mammoth\": \"^1.6.0\",\n        \"multer\": \"^2.0.2\",\n        \"openai\": \"^4.98.0\",\n        \"pdf-parse\": \"^1.1.1\",\n        \"sharp\": \"^0.33.2\",\n        \"uuid\": \"^9.0.0\"\n      },\n      \"bin\": {\n        \"testcase-generator\": \"dist/index.js\"\n      },\n      \"devDependencies\": {\n        \"@types/cors\": \"^2.8.17\",\n        \"@types/express\": \"^4.17.21\",\n        \"@types/fs-extra\": \"^11.0.4\",\n        \"@types/multer\": \"^2.0.0\",\n        \"@types/node\": \"^20.11.0\",\n        \"@types/uuid\": \"^9.0.8\",\n        \"ts-node\": \"^10.9.2\",\n        \"typescript\": \"^5.3.3\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@anthropic-ai/sdk\": {\n      \"version\": \"0.39.0\",\n      \"resolved\": \"https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.39.0.tgz\",\n      \"integrity\": \"sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^18.11.18\",\n        \"@types/node-fetch\": \"^2.6.4\",\n        \"abort-controller\": \"^3.0.0\",\n        \"agentkeepalive\": \"^4.2.1\",\n        \"form-data-encoder\": \"1.7.2\",\n        \"formdata-node\": \"^4.3.2\",\n        \"node-fetch\": \"^2.6.7\"\n      }\n    },\n    \"node_modules/@anthropic-ai/sdk/node_modules/@types/node\": {\n      \"version\": \"18.19.130\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz\",\n      \"integrity\": \"sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~5.26.4\"\n      }\n    },\n    \"node_modules/@anthropic-ai/sdk/node_modules/undici-types\": {\n      \"version\": \"5.26.5\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz\",\n      \"integrity\": \"sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@cspotcode/source-map-support\": {\n      \"version\": \"0.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz\",\n      \"integrity\": \"sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jridgewell/trace-mapping\": \"0.3.9\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@emnapi/runtime\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz\",\n      \"integrity\": \"sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.4.0\"\n      }\n    },\n    \"node_modules/@fast-csv/format\": {\n      \"version\": \"4.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz\",\n      \"integrity\": \"sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^14.0.1\",\n        \"lodash.escaperegexp\": \"^4.1.2\",\n        \"lodash.isboolean\": \"^3.0.3\",\n        \"lodash.isequal\": \"^4.5.0\",\n        \"lodash.isfunction\": \"^3.0.9\",\n        \"lodash.isnil\": \"^4.0.0\"\n      }\n    },\n    \"node_modules/@fast-csv/format/node_modules/@types/node\": {\n      \"version\": \"14.18.63\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz\",\n      \"integrity\": \"sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@fast-csv/parse\": {\n      \"version\": \"4.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz\",\n      \"integrity\": \"sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^14.0.1\",\n        \"lodash.escaperegexp\": \"^4.1.2\",\n        \"lodash.groupby\": \"^4.6.0\",\n        \"lodash.isfunction\": \"^3.0.9\",\n        \"lodash.isnil\": \"^4.0.0\",\n        \"lodash.isundefined\": \"^3.0.1\",\n        \"lodash.uniq\": \"^4.5.0\"\n      }\n    },\n    \"node_modules/@fast-csv/parse/node_modules/@types/node\": {\n      \"version\": \"14.18.63\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz\",\n      \"integrity\": \"sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@img/sharp-darwin-arm64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz\",\n      \"integrity\": \"sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-darwin-arm64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-darwin-x64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz\",\n      \"integrity\": \"sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-darwin-x64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-darwin-arm64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz\",\n      \"integrity\": \"sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-darwin-x64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz\",\n      \"integrity\": \"sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linux-arm\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz\",\n      \"integrity\": \"sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linux-arm64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz\",\n      \"integrity\": \"sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linux-s390x\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz\",\n      \"integrity\": \"sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linux-x64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz\",\n      \"integrity\": \"sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linuxmusl-arm64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz\",\n      \"integrity\": \"sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-linuxmusl-x64\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz\",\n      \"integrity\": \"sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-linux-arm\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz\",\n      \"integrity\": \"sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linux-arm\": \"1.0.5\"\n      }\n    },\n    \"node_modules/@img/sharp-linux-arm64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz\",\n      \"integrity\": \"sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linux-arm64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-linux-s390x\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz\",\n      \"integrity\": \"sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linux-s390x\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-linux-x64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz\",\n      \"integrity\": \"sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linux-x64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-linuxmusl-arm64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz\",\n      \"integrity\": \"sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linuxmusl-arm64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-linuxmusl-x64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz\",\n      \"integrity\": \"sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-linuxmusl-x64\": \"1.0.4\"\n      }\n    },\n    \"node_modules/@img/sharp-wasm32\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz\",\n      \"integrity\": \"sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==\",\n      \"cpu\": [\n        \"wasm32\"\n      ],\n      \"license\": \"Apache-2.0 AND LGPL-3.0-or-later AND MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@emnapi/runtime\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-win32-ia32\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz\",\n      \"integrity\": \"sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"license\": \"Apache-2.0 AND LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@img/sharp-win32-x64\": {\n      \"version\": \"0.33.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz\",\n      \"integrity\": \"sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"Apache-2.0 AND LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n      \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n      \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.9\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz\",\n      \"integrity\": \"sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.0.3\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n      }\n    },\n    \"node_modules/@tsconfig/node10\": {\n      \"version\": \"1.0.12\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz\",\n      \"integrity\": \"sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@tsconfig/node12\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz\",\n      \"integrity\": \"sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@tsconfig/node14\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz\",\n      \"integrity\": \"sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@tsconfig/node16\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz\",\n      \"integrity\": \"sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/body-parser\": {\n      \"version\": \"1.19.6\",\n      \"resolved\": \"https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz\",\n      \"integrity\": \"sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/connect\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/connect\": {\n      \"version\": \"3.4.38\",\n      \"resolved\": \"https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz\",\n      \"integrity\": \"sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/cors\": {\n      \"version\": \"2.8.19\",\n      \"resolved\": \"https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz\",\n      \"integrity\": \"sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/express\": {\n      \"version\": \"4.17.25\",\n      \"resolved\": \"https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz\",\n      \"integrity\": \"sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/body-parser\": \"*\",\n        \"@types/express-serve-static-core\": \"^4.17.33\",\n        \"@types/qs\": \"*\",\n        \"@types/serve-static\": \"^1\"\n      }\n    },\n    \"node_modules/@types/express-serve-static-core\": {\n      \"version\": \"4.19.8\",\n      \"resolved\": \"https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz\",\n      \"integrity\": \"sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\",\n        \"@types/qs\": \"*\",\n        \"@types/range-parser\": \"*\",\n        \"@types/send\": \"*\"\n      }\n    },\n    \"node_modules/@types/fs-extra\": {\n      \"version\": \"11.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz\",\n      \"integrity\": \"sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/jsonfile\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/http-errors\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz\",\n      \"integrity\": \"sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/jsonfile\": {\n      \"version\": \"6.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz\",\n      \"integrity\": \"sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/mime\": {\n      \"version\": \"1.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz\",\n      \"integrity\": \"sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/multer\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/multer/-/multer-2.1.0.tgz\",\n      \"integrity\": \"sha512-zYZb0+nJhOHtPpGDb3vqPjwpdeGlGC157VpkqNQL+UU2qwoacoQ7MpsAmUptI/0Oa127X32JzWDqQVEXp2RcIA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/express\": \"*\"\n      }\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"20.19.37\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz\",\n      \"integrity\": \"sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/@types/node-fetch\": {\n      \"version\": \"2.6.13\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz\",\n      \"integrity\": \"sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\",\n        \"form-data\": \"^4.0.4\"\n      }\n    },\n    \"node_modules/@types/qs\": {\n      \"version\": \"6.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz\",\n      \"integrity\": \"sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/range-parser\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz\",\n      \"integrity\": \"sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/send\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz\",\n      \"integrity\": \"sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/serve-static\": {\n      \"version\": \"1.15.10\",\n      \"resolved\": \"https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz\",\n      \"integrity\": \"sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/http-errors\": \"*\",\n        \"@types/node\": \"*\",\n        \"@types/send\": \"<1\"\n      }\n    },\n    \"node_modules/@types/serve-static/node_modules/@types/send\": {\n      \"version\": \"0.17.6\",\n      \"resolved\": \"https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz\",\n      \"integrity\": \"sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n   \n\nArchive v2.0.3: 19 files, 76239 bytes\n\nFiles: docker-compose.yml (1300b), openclaw.plugin.json (2184b), package-lock.json (132595b), package.json (2056b), README.md (9276b), SKILL.md (3041b), src/ai-adapter.ts (6133b), src/archiver.d.ts (27b), src/exporter.ts (10329b), src/generator.ts (10701b), src/index.ts (11720b), src/parser.ts (4945b), src/prompts.ts (8874b), src/reviewer.ts (13793b), src/standalone.ts (13345b), src/types.ts (10435b), src/video-parser.ts (5150b), tsconfig.json (445b), _meta.json (140b)\n\nArchive v2.0.2: 19 files, 76291 bytes\n\nFiles: docker-compose.yml (1300b), openclaw.plugin.json (2184b), package-lock.json (132595b), package.json (2056b), README.md (9276b), SKILL.md (3340b), src/ai-adapter.ts (6133b), src/archiver.d.ts (27b), src/exporter.ts (10329b), src/generator.ts (10701b), src/index.ts (11720b), src/parser.ts (4945b), src/prompts.ts (8874b), src/reviewer.ts (13793b), src/standalone.ts (13345b), src/types.ts (10435b), src/video-parser.ts (5150b), tsconfig.json (445b), _meta.json (140b)\n\nArchive v2.0.1: 19 files, 76291 bytes\n\nFiles: docker-compose.yml (1300b), openclaw.plugin.json (2184b), package-lock.json (132595b), package.json (2056b), README.md (9276b), SKILL.md (3340b), src/ai-adapter.ts (6133b), src/archiver.d.ts (27b), src/exporter.ts (10329b), src/generator.ts (10701b), src/index.ts (11720b), src/parser.ts (4945b), src/prompts.ts (8874b), src/reviewer.ts (13793b), src/standalone.ts (13345b), src/types.ts (10435b), src/video-parser.ts (5150b), tsconfig.json (445b), _meta.json (140b)\n\nArchive v2.0.0: 19 files, 74286 bytes\n\nFiles: docker-compose.yml (1300b), openclaw.plugin.json (2184b), package-lock.json (132595b), package.json (2056b), README.md (4991b), SKILL.md (2858b), src/ai-adapter.ts (6133b), src/archiver.d.ts (27b), src/exporter.ts (10329b), src/generator.ts (10701b), src/index.ts (11720b), src/parser.ts (4945b), src/prompts.ts (8874b), src/reviewer.ts (13793b), src/standalone.ts (13345b), src/types.ts (10435b), src/video-parser.ts (5150b), tsconfig.json (445b), _meta.json (140b)","readmeExcerpt":"Skill: AI Test Case Generator Owner: xuxuclassmate Summary: Use when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow. Tags: ai:1.0.1, automation:1.0.1, latest:1.0.1, qa:1.0.1, review:1.0.1, testcases:1.0.1, testing:1.0.1 Version history: v1.0.1 | 2026-04-22T05:44:06.209Z | user Replace risky plugin metadata with an English documentatio","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"Generate test cases for user login:\n- Phone + password login\n- OAuth (GitHub, Google)\n- Lock account after 5 failed attempts\n- Remember me (7-day token)"},{"language":"text","snippet":"/testgen /uploads/requirements.pdf --prompt focus on edge cases and security"},{"language":"text","snippet":"Generate Chinese test cases for the pre-release stage from this PRD\n[attaches file]"},{"language":"bash","snippet":"docker pull xuxuclassmate/testcase-generator:latest"},{"language":"bash","snippet":"curl -O https://raw.githubusercontent.com/XuXuClassMate/testcase-generator/main/.env.example"},{"language":"bash","snippet":"curl -O https://raw.githubusercontent.com/XuXuClassMate/testcase-generator/main/.env.example\ncp .env.example .env"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: ai-testcase-generator\ndescription: Use when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow.\ntags: [testing, qa, testcases, ai, automation, review]\nversion: 1.0.1\n---\n\n# AI Test Case Generator\n\nThis ClawHub package is documentation-only. It does not embed runtime binaries, install scripts, or package manifests.\n\n## When to use\n\n- A user wants test cases from a PRD, specification, screenshot, or plain text brief.\n- You need a structured review loop for QA coverage before implementation or release.\n- You want a checklist for turning requirements into executable test work.\n\n## Inputs to collect\n\n- Requirement text or a file path\n- Product stage: requirement review, implementation, or pre-release\n- Preferred output language\n- Any focus area such as security, edge cases, compatibility, or accessibility\n\n## Recommended workflow\n\n1. Extract the core flows.\n   Identify user journeys, rules, dependencies, and constraints.\n2. Group coverage by module.\n   Organize cases by feature area, API, UI surface, or role.\n3. Add negative and edge paths.\n   Include invalid input, permission boundaries, failures, and concurrency where relevant.\n4. Run a review pass.\n   Check coverage, clarity, execution readiness, and security impact.\n\n## Recommended outputs\n\n- Test scope summary\n- Test points grouped by module\n- Detailed cases with steps and expected results\n- Priority or severity labels\n- Open questions for product or engineering\n\n## Guardrails\n\n- Keep uploaded requirements confidential.\n- State clearly when a case depends on missing product detail.\n- Do not claim that spreadsheet, XMind, or binary exports were produced unless an actual generator runtime was used outside this skill bundle."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7a6qzk16ny6zj2a6ge10exrn82q9qp\",\n  \"slug\": \"ai-testcase-generator\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1776836646209\n}"},{"path":"skill-card.md","content":"## Description:\n\nUse when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[xuxuclassmate](https://clawhub.ai/user/xuxuclassmate)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nQA engineers, product teams, and developers use this skill to turn requirements, screenshots, specifications, or brief text into structured test coverage, review questions, and execution-ready cases.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Requirements or screenshots may contain confidential product details.\n\nMitigation: Share only information intended for agent processing and keep uploaded requirements confidential.\n\nRisk: Generated test cases can miss context or become misleading if product details are incomplete.\n\nMitigation: Review generated cases before using them as release criteria and state dependencies on missing product detail.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, guidance]\n\n**Output Format:** [Markdown or structured text]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include test scope summaries, module-grouped test points, detailed steps with expected results, priorities, and open questions.]\n\n## Skill Version(s):\n\n1.0.1 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Use when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow. Skill: AI Test Case Generator Owner: xuxuclassmate Summary: Use when turning requirements, screenshots, or other QA inputs into structured test cases and review questions with an AI-assisted workflow. Tags: ai:1.0.1, automation:1.0.1, latest:1.0.1, qa:1.0.1, review:1.0.1, testcases:1.0.1, testing:1.0.1 Version history: v1.0.1 | 2026-04-22T05:44:06.209Z | user Replace risky plugin metadata with an English documentatio","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1176,"uniquenessScore":50,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:55:14.168Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:55:14.168Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T15:14:49.169Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}