[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BYWRSGDXH6PJMNQVR4R5Z7":3,"skill-same:01M6BYWRSGDXH6PJMNQVR4R5Z7":97},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":51,"linkOnly":52,"markdownContent":53,"markdownBody":54,"frontMatter":55,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":62,"ownerHtmlUrl":63,"ownerBlogUrl":64,"ownerDescription":65,"updatedAt":66,"install":67,"resources":80},"01M6BYWRSGDXH6PJMNQVR4R5Z7","testing-skill",null,"Record, rewrite, and debug VCR cassettes for HTTP recordings. Use when running tests with --record-mode, verifying cassette playback, or inspecting request\u002Fresponse bodies in YAML cassettes.","pydantic\u002Fpydantic-ai","pydantic","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F110818415?v=4","01M6BYVCCAN7VAVS8DFHJF4GY1","Pydantic","01M6BYVCGHJCX3C0VZF6J7BA7V",21145,"MIT","https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftesting-skill\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"testing skill","testing","uv","running","when","parse","for","mode","with","rewrite","env","tests","record","uv run","diff","use","Bash","yaml","running tests","git","run","http","debug","python","2026-11-10 10:12:30",false,"---\nname: testing-skill\ndescription: Record, rewrite, and debug VCR cassettes for HTTP recordings. Use when running tests with --record-mode, verifying cassette playback, or inspecting request\u002Fresponse bodies in YAML cassettes.\nallowed-tools: Bash(uv run pytest *), Bash(uv run python .claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py *), Bash(source .env && uv run pytest *), Bash(git diff *)\n---\n\n# Pytest VCR Workflow\n\nUse this skill when recording or re-recording VCR cassettes for tests, or when debugging cassette contents.\n\n## Prerequisites\n\n- Verify `.env` exists: `test -f .env && echo 'ok' || echo 'missing'`\n- Missing API keys will cause clear test errors at runtime\n\n## Important flags\n- `--record-mode=rewrite` : Record cassettes (works for both new and existing)\n- `--lf` : Run only the last failed tests\n- `-vv` : Verbose output\n- `--tb=line` : Short traceback output\n- `-k=\"\"` : Run tests matching the given substring expression\n\n## Recording Cassettes\n\n### Step 1: Record cassettes\n\n```bash\nsource .env && uv run pytest path\u002Fto\u002Ftest.py::test_function_name -v --tb=line --record-mode=rewrite\n```\n\nMultiple tests can be specified:\n```bash\nsource .env && uv run pytest path\u002Fto\u002Ftest.py::test_one path\u002Fto\u002Ftest.py::test_two -v --tb=line --record-mode=rewrite\n```\n\n### Step 2: Verify recordings\n\nRun the same tests WITHOUT `--record-mode` to verify cassettes play back correctly:\n```bash\nsource .env && uv run pytest path\u002Fto\u002Ftest.py::test_function_name -vv --tb=line\n```\n\n### Step 3: Review snapshots\n\nIf tests use [`snapshot()`](https:\u002F\u002Fgithub.com\u002F15r10nk\u002Finline-snapshot) assertions:\n- The test run in Step 2 auto-fills snapshot content\n- Review the generated snapshot files to ensure they match expected output\n- You only review - don't manually write snapshot contents\n- Snapshots capture what the test actually produced, additional to explicit assertions\n\n## Parsing Cassettes\n\nParse VCR cassette YAML files to inspect request\u002Fresponse bodies without dealing with raw YAML.\n\n### Usage\n\n```bash\nuv run python .claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py \u003Ccassette_path> [--interaction N]\n```\n\n### Examples\n\n```bash\n# Parse all interactions in a cassette\nuv run python .claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py tests\u002Fmodels\u002Fcassettes\u002Ftest_foo\u002Ftest_bar.yaml\n\n# Parse only interaction 1 (0-indexed)\nuv run python .claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py tests\u002Fmodels\u002Fcassettes\u002Ftest_foo\u002Ftest_bar.yaml --interaction 1\n```\n\n### Output\n\nFor each interaction, shows:\n- Request: method, URI, parsed body (truncated base64)\n- Response: status code, parsed body (truncated base64)\n\nBase64 strings longer than 100 chars are truncated for readability.\n\n\n## Full Workflow Example\n\n```bash\n# 1. Record cassette\nsource .env && uv run pytest tests\u002Fmodels\u002Ftest_openai.py::test_chat_completion -v --tb=line --record-mode=rewrite\n\n# 2. Verify playback and fill snapshots\nsource .env && uv run pytest tests\u002Fmodels\u002Ftest_openai.py::test_chat_completion -vv --tb=line\n\n# 3. Review test code diffs (excludes cassettes)\ngit diff tests\u002F -- ':!**\u002Fcassettes\u002F**'\n\n# 4. List new\u002Fchanged cassettes (name only - use parse_cassette.py to inspect)\ngit diff --name-only tests\u002F -- '**\u002Fcassettes\u002F**'\n\n# 5. Inspect cassette contents if needed\nuv run python .claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py tests\u002Fmodels\u002Fcassettes\u002Ftest_openai\u002Ftest_chat_completion.yaml\n```\n","# Pytest VCR Workflow\n\nUse this skill when recording or re-recording VCR cassettes for tests, or when debugging cassette contents.\n\n## Prerequisites\n\n- Verify `.env` exists: `test -f .env && echo 'ok' || echo 'missing'`\n- Missing API keys will cause clear test errors at runtime\n\n## Important flags\n- `--record-mode=rewrite` : Record cassettes (works for both new and existing)\n- `--lf` : Run only the last failed tests\n- `-vv` : Verbose output\n- `--tb=line` : Short traceback output\n- `-k=\"\"` : Run tests matching the given substring expression\n\n## Recording Cassettes\n\n### Step 1: Record cassettes\n\n```bash\nsource .env && uv run pytest path\u002Fto\u002Ftest.py::test_function_name -v --tb=line --record-mode=rewrite\n```\n\nMultiple tests can be specified:\n```bash\nsource .env && uv run pytest path\u002Fto\u002Ftest.py::test_one path\u002Fto\u002Ftest.py::test_two -v --tb=line --record-mode=rewrite\n```\n\n### Step 2: Verify recordings\n\nRun the same tests WITHOUT `--record-mode` to verify cassettes play back correctly:\n```bash\nsource .env && uv run pytest path\u002Fto\u002Ftest.py::test_function_name -vv --tb=line\n```\n\n### Step 3: Review snapshots\n\nIf tests use [`snapshot()`](https:\u002F\u002Fgithub.com\u002F15r10nk\u002Finline-snapshot) assertions:\n- The test run in Step 2 auto-fills snapshot content\n- Review the generated snapshot files to ensure they match expected output\n- You only review - don't manually write snapshot contents\n- Snapshots capture what the test actually produced, additional to explicit assertions\n\n## Parsing Cassettes\n\nParse VCR cassette YAML files to inspect request\u002Fresponse bodies without dealing with raw YAML.\n\n### Usage\n\n```bash\nuv run python .claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py \u003Ccassette_path> [--interaction N]\n```\n\n### Examples\n\n```bash\n# Parse all interactions in a cassette\nuv run python .claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py tests\u002Fmodels\u002Fcassettes\u002Ftest_foo\u002Ftest_bar.yaml\n\n# Parse only interaction 1 (0-indexed)\nuv run python .claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py tests\u002Fmodels\u002Fcassettes\u002Ftest_foo\u002Ftest_bar.yaml --interaction 1\n```\n\n### Output\n\nFor each interaction, shows:\n- Request: method, URI, parsed body (truncated base64)\n- Response: status code, parsed body (truncated base64)\n\nBase64 strings longer than 100 chars are truncated for readability.\n\n\n## Full Workflow Example\n\n```bash\n# 1. Record cassette\nsource .env && uv run pytest tests\u002Fmodels\u002Ftest_openai.py::test_chat_completion -v --tb=line --record-mode=rewrite\n\n# 2. Verify playback and fill snapshots\nsource .env && uv run pytest tests\u002Fmodels\u002Ftest_openai.py::test_chat_completion -vv --tb=line\n\n# 3. Review test code diffs (excludes cassettes)\ngit diff tests\u002F -- ':!**\u002Fcassettes\u002F**'\n\n# 4. List new\u002Fchanged cassettes (name only - use parse_cassette.py to inspect)\ngit diff --name-only tests\u002F -- '**\u002Fcassettes\u002F**'\n\n# 5. Inspect cassette contents if needed\nuv run python .claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py tests\u002Fmodels\u002Fcassettes\u002Ftest_openai\u002Ftest_chat_completion.yaml\n```\n",{"name":5,"description":7,"allowed-tools":56},"Bash(uv run pytest *), Bash(uv run python .claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py *), Bash(source .env && uv run pytest *), Bash(git diff *)","main","133a75127f7b938567b8af7da1d59b95fe5a92fd",".claude\u002Fskills\u002Ftesting-skill",3149,"https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai","https:\u002F\u002Fpydantic.dev\u002Fpydantic-ai","https:\u002F\u002Fgithub.com\u002Fpydantic","https:\u002F\u002Fpydantic.dev","Pydantic, Pydantic Logfire and Pydantic AI","2026-11-12 03:34:41",{"source":8,"skillName":5,"commands":68,"prompt":78,"zipAvailable":79},[69,72,75],{"tool":70,"command":71},"npx","npx skills add pydantic\u002Fpydantic-ai --skill testing-skill",{"tool":73,"command":74},"bunx","bunx skills add pydantic\u002Fpydantic-ai --skill testing-skill",{"tool":76,"command":77},"pnpm","pnpm dlx skills add pydantic\u002Fpydantic-ai --skill testing-skill","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftesting-skill\u002FSKILL.md",true,[81,87,93],{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"agents\u002Fopenai.yaml","REFERENCE","参考文档",137,"https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fplugins\u002Fmatt-pocock\u002Fskills\u002Fask-matt\u002Fagents\u002Fopenai.yaml",{"path":88,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":91,"sourceHtmlUrl":92},"parse_cassette.py","SCRIPT","脚本",3524,"https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftesting-skill\u002Fparse_cassette.py",{"path":94,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":95,"sourceHtmlUrl":96},"PHASE-BOUNDARIES.md",4249,"https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fplugins\u002Fmatt-pocock\u002Fskills\u002Fask-matt\u002FPHASE-BOUNDARIES.md",[98,124,134,154,172,188],{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":51},"01M6BYX16NP31D2ACFSNDNNJEV","migrating-agno-to-pydantic-ai","Migrate Python Agno applications to Pydantic AI and, only when needed, Pydantic AI Harness. Use when source code imports `agno` or relies on Agno agents, teams, workflows, sessions, memory, knowledge, tools, hooks, guardrails, approvals, skills, streaming, or AgentOS.","https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai\u002Fblob\u002Fmain\u002Fpydantic_ai_slim\u002Fpydantic_ai\u002F.agents\u002Fskills\u002Fmigrating-agno-to-pydantic-ai\u002FSKILL.md",[],[105,12,106,107,108,109,110,111,50,112,113,114,115,116,117,118,119,120,121,122,42,31,123],"pydantic ai","migrating agno to pydantic ai","agno","harness","memory","applications","Guardrails","sessions","teams","knowledge","workflows","migrate","Tools","code","streaming","hooks","only","ai harness","pydantic ai harness",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":51},"01M6BYY08B7335R8J3EKFM2GX7","reviewer","Review changes.","https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai\u002Fblob\u002Fmain\u002Ftests\u002Fharness\u002Fskills\u002Ftemporal_workspace\u002Fskills\u002Freviewer\u002FSKILL.md",[],[126,131,132,133],"review changes","review","changes",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":144,"publishedAt":51},"01M6BYXW6FV6Z0BB3ARTAJ0VKM","pydantic-ai-harness","Extend Pydantic AI agents with capabilities from pydantic-ai-harness -- the Coder coding agent, file and shell tools in local or sandboxed workspaces (Modal, E2B, Render, Sprites, Daytona, boxd, smolvm, BoxLite), Code Mode, sub-agents and planning, memory and skills, context compaction, guardrails and spend limits, web research and browsers, hosted SaaS integrations, step persistence, and background agents on Render Workflows. Use when the user mentions pydantic-ai-harness or pydantic_ai_harness, imports a harness capability such as Coder, CodeMode, FileSystem, Shell, SubAgents, Memory, or ToolGuardrail, or wants a Pydantic AI agent that edits files, runs commands or agent-written Python, delegates, remembers, manages long context, stays within limits, or runs model and tool operations as chained Render task runs.","https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai\u002Fblob\u002Fmain\u002Fsrc\u002Fpydantic_ai_harness\u002Fpydantic_ai_harness\u002F.agents\u002Fskills\u002Fpydantic-ai-harness\u002FSKILL.md",[140,143],{"categoryNo":141,"categoryName":142,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[108,105,123,12,122,145,109,111,146,115,118,147,148,149,150,151,152,153,34,31],"model","ai agent","e2b","workspaces","render","local","files","smolvm","render workflows",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":51},"01M6BYXS3HEQYWXFJXYACRCA4H","migrating-deep-agents-to-pydantic-ai-harness","Migrate Python LangChain Deep Agents applications to Pydantic AI and Pydantic AI Harness. Use when the source uses the upstream `deepagents` package or demonstrably reproduces its middleware, backends, skills, memory, subagents, or sandbox contracts. Use `migrating-langchain-to-pydantic-ai` for plain LangChain, LangGraph, or LCEL migrations and `pydantic-ai-harness` for greenfield Harness usage.","https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai\u002Fblob\u002Fmain\u002Fsrc\u002Fpydantic_ai_harness\u002Fpydantic_ai_harness\u002F.agents\u002Fskills\u002Fmigrating-deep-agents-to-pydantic-ai-harness\u002FSKILL.md",[],[108,105,12,161,162,122,163,123,109,164,110,50,165,166,167,116,168,33,169,170,171,42,31],"migrating deep agents to pydantic ai harness","deep","deep agents","langgraph","sandbox","package","langchain","usage","deepagents","middleware","upstream",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":51},"01M6BYXP4FFSW83DR07RZ789DR","migrating-vercel-ai-sdk-and-eve-to-pydantic-ai","Migrate TypeScript Vercel AI SDK or Eve applications to Python with Pydantic AI and, only when needed, Pydantic AI Harness. Use when source code imports `ai`, `@ai-sdk\u002F*`, or `eve`, or relies on `generateText`, `streamText`, `ToolLoopAgent`, `useChat`, Eve agents, tools, skills, subagents, approvals, sessions, channels, schedules, or sandboxes.","https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai\u002Fblob\u002Fmain\u002Fpydantic_ai_slim\u002Fpydantic_ai\u002F.agents\u002Fskills\u002Fmigrating-vercel-ai-sdk-and-eve-to-pydantic-ai\u002FSKILL.md",[],[105,12,179,180,181,182,183,184,108,110,50,185,112,116,117,118,186,121,122,42,187,31,123],"sdk","ai sdk","eve","migrating vercel ai sdk and eve to pydantic ai","vercel","vercel ai sdk","typescript","sandboxes","schedules",{"skillNo":189,"name":190,"nameZh":6,"description":191,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":192,"categories":193,"keywords":194,"publishedAt":51},"01M6BYXJXKEK0384TZNH0R1ZVY","migrating-pi-to-pydantic-ai","Migrate TypeScript Pi coding-agent applications, extensions, or packages to Python with Pydantic AI and Pydantic AI Harness. Use when source code imports `@earendil-works\u002Fpi-*`, calls `createAgentSession`, registers Pi extensions, or relies on Pi tools, hooks, skills, sessions, compaction, providers, TUI, RPC, or packages.","https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai\u002Fblob\u002Fmain\u002Fpydantic_ai_slim\u002Fpydantic_ai\u002F.agents\u002Fskills\u002Fmigrating-pi-to-pydantic-ai\u002FSKILL.md",[],[105,12,195,196,108,197,110,50,185,112,198,116,117,118,199,200,120,31,201,123,202,203,204,205,206],"migrating pi to pydantic ai","pi","packages","rpc","coding","Providers","pi extensions","imports","source","Coding-Agent","source code","compaction"]