[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C6GS8QVR6FA3SMSHT53YTF":3,"skill-same:01M6C6GS8QVR6FA3SMSHT53YTF":107},{"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":23,"publishedAt":53,"linkOnly":54,"markdownContent":55,"markdownBody":56,"frontMatter":57,"refName":61,"commitSha":62,"skillDirectory":63,"forksCount":64,"repositoryHtmlUrl":65,"repositoryHomepageUrl":6,"ownerHtmlUrl":66,"ownerBlogUrl":6,"ownerDescription":67,"updatedAt":68,"install":69,"resources":82},"01M6C6GS8QVR6FA3SMSHT53YTF","vitest-testing",null,"Vitest test runner — Vite-native, ESM, watch\u002FUI mode, coverage, mocking, snapshots. Use when setting up tests for Vite projects, migrating from Jest, or needing fast execution.","laurigates\u002Fclaude-plugins","laurigates","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13014001?v=4","01M6C59YHWS9C7KMXKSRX1YXNP","Lauri Gates","01M6C59YP2APG9YAM4DWYQYGFJ",59,"MIT","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftesting-plugin\u002Fskills\u002Fvitest-testing\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],"vitest","vitest testing","testing","webfetch","2026","when","mode","websearch","2025","native","false","jest","runner","snapshots","up","vite","use","coverage","edit","write","read","grep","projects","Bash","execution","fast","ui","test runner","test","2026-11-10 10:12:30",false,"---\ncreated: 2025-12-16\nmodified: 2026-08-04\nreviewed: 2025-12-16\nname: vitest-testing\ndescription: \"Vitest test runner — Vite-native, ESM, watch\u002FUI mode, coverage, mocking, snapshots. Use when setting up tests for Vite projects, migrating from Jest, or needing fast execution.\"\nuser-invocable: false\nallowed-tools: Glob, Grep, Read, Bash, Edit, Write, TodoWrite, WebFetch, WebSearch\n---\n\n# Vitest Testing\n\nVitest is a modern test runner designed for Vite projects. It's fast, ESM-native, and provides a Jest-compatible API with better TypeScript support and instant HMR-powered watch mode.\n\n## When to Use This Skill\n\n| Use this skill when... | Use another skill instead when... |\n|------------------------|----------------------------------|\n| Setting up or configuring Vitest | Writing E2E browser tests (use playwright-testing) |\n| Writing unit\u002Fintegration tests in TS\u002FJS | Testing Python code (use python-testing) |\n| Migrating from Jest to Vitest | Analyzing test quality (use test-quality-analysis) |\n| Configuring coverage thresholds | Generating property-based tests (use property-based-testing) |\n| Using mocks, spies, or fake timers | Validating test effectiveness (use mutation-testing) |\n\n## Core Expertise\n\n- **Vite-native**: Reuses Vite config, transforms, and plugins\n- **Fast**: Instant feedback with HMR-powered watch mode\n- **Jest-compatible**: Drop-in replacement with similar API\n- **TypeScript**: First-class TypeScript support\n- **ESM**: Native ESM support, no transpilation needed\n- **jsdom DOM tests**: and the assertions that silently lie under it (see below)\n\n## Installation\n\n```bash\nbun add --dev vitest\nbun add --dev @vitest\u002Fcoverage-v8      # Coverage (recommended)\nbun add --dev happy-dom                # DOM testing (optional)\nbunx vitest --version                  # Verify\n```\n\n## Configuration (vitest.config.ts)\n\n```typescript\nimport { defineConfig } from 'vitest\u002Fconfig';\n\nexport default defineConfig({\n  test: {\n    globals: true,\n    environment: 'node',\n  },\n});\n```\n\n## Essential Commands\n\n```bash\nbunx vitest                            # Watch mode (default)\nbunx vitest run                        # Run once (CI mode)\nbunx vitest --coverage                 # With coverage\nbunx vitest src\u002Futils.test.ts          # Specific file\nbunx vitest -t \"should add numbers\"    # Filter by name\nbunx vitest related src\u002Futils.ts       # Related tests\nbunx vitest -u                         # Update snapshots\nbunx vitest bench                      # Benchmarks\nbunx vitest --ui                       # UI mode\n```\n\n## Writing Tests\n\n### Basic Test Structure\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { add, multiply } from '.\u002Fmath';\n\ndescribe('math utils', () => {\n  it('should add two numbers', () => {\n    expect(add(2, 3)).toBe(5);\n  });\n\n  it('should multiply two numbers', () => {\n    expect(multiply(2, 3)).toBe(6);\n  });\n});\n```\n\n### Key Assertions\n\n| Assertion | Description |\n|-----------|-------------|\n| `toBe(value)` | Strict equality |\n| `toEqual(value)` | Deep equality |\n| `toStrictEqual(value)` | Deep strict equality |\n| `toBeTruthy()` \u002F `toBeFalsy()` | Truthiness |\n| `toBeNull()` \u002F `toBeUndefined()` | Null checks |\n| `toBeGreaterThan(n)` \u002F `toBeLessThan(n)` | Numeric comparison |\n| `toBeCloseTo(n)` | Float comparison |\n| `toMatch(regex)` \u002F `toContain(str)` | String matching |\n| `toHaveLength(n)` | Array\u002Fstring length |\n| `toHaveProperty(key)` | Object property |\n| `toMatchObject(obj)` | Partial object match |\n| `toThrow(msg)` | Error throwing |\n\n### Async Tests\n\n```typescript\ntest('async test', async () => {\n  const data = await fetchData();\n  expect(data).toBe('expected');\n});\n\ntest('promise resolves', async () => {\n  await expect(fetchData()).resolves.toBe('expected');\n});\n\ntest('promise rejects', async () => {\n  await expect(fetchBadData()).rejects.toThrow('error');\n});\n```\n\n## DOM tests under jsdom — assertions that lie\n\n`environment: 'jsdom'` gives you a DOM without a **layout engine**, and its CSS\nparser is narrower than a browser's. Several natural-looking assertions are\ntherefore *vacuous*: they pass against the very bug they were written to catch,\nand read as coverage so nobody looks again.\n\n| Trap | Why it passes against the bug | Assert instead |\n|---|---|---|\n| `el.style.overflowY` for a style set by a stylesheet | Inline style is empty; the declaration lives in a class rule | `getComputedStyle(el).overflowY` — jsdom **does** resolve injected `\u003Cstyle>` rules |\n| `getComputedStyle(el).width` for `min()` \u002F `calc()` values | jsdom's parser silently **drops** the whole declaration, reporting `\"\"`\u002F`0` either way | the stylesheet **source text**, or defer to a real browser |\n| Anything about size or position | `getBoundingClientRect()` is all zeros; there is no layout | a real-browser tier |\n| Asserting right after clicking something that renders `async` | The panel is still empty, so \"no bad element found\" is trivially true | flush (`await new Promise(r => setTimeout(r, 0))`), then assert the container is **non-empty** *before* the real check |\n\nAlso: `Element.prototype.scrollIntoView` **does not exist** in jsdom, so any code\npath that centres an element throws on mount. Stub it (`Element.prototype.scrollIntoView = () => {}`)\n— that is a harness gap, not a behaviour change.\n\nAnd never write a conditional assertion:\n\n```typescript\n\u002F\u002F Passes silently in exactly the case it was meant to catch — a renamed class.\nif (found.length === 1) expect(found[0].textContent).toMatch(\u002Fx\u002F);\n\n\u002F\u002F Assert unconditionally.\nexpect(found).toHaveLength(1);\nexpect(found[0].textContent).toMatch(\u002Fx\u002F);\n```\n\n### Make it fail on purpose\n\nA regression test that has never failed has not been shown to test anything.\nBefore trusting one, force red and **read the message**:\n\n- Fix in this package → revert the fix in place, confirm red *for the right\n  reason*, restore.\n- Cross-package suite → re-pin the dependency to the release **before** the fix,\n  confirm red, restore the pin.\n\nRecord the observed failure output in the PR body. \"It goes red\" is a claim; the\nmessage is the evidence.\n\n### Loading a sibling package's source for a real integration test\n\nWhen a defect is a property of **two packages together**, testing each against a\nstand-in keeps both green while the pair is broken. To load a sibling's real\nsource:\n\n1. depend on it pinned to a **release tag** (e.g. a git dependency), so the suite\n   tests a published artifact rather than a moving branch;\n2. add it to `server.deps.inline` — vitest externalizes `node_modules` by default\n   and would hand Node raw TypeScript:\n\n```typescript\nexport default defineConfig({\n  test: { server: { deps: { inline: [\u002Fsibling-package\u002F] } } },\n});\n```\n\n3. export the host's real entry point, so the suite drives the actual code path\n   rather than a per-unit seam where the bug cannot appear.\n\n## Mocking (Essential Patterns)\n\n```typescript\nimport { vi, test, expect } from 'vitest';\n\n\u002F\u002F Mock function\nconst mockFn = vi.fn();\nmockFn.mockReturnValue(42);\n\n\u002F\u002F Mock module\nvi.mock('.\u002Fapi', () => ({\n  fetchUser: vi.fn(() => Promise.resolve({ id: 1, name: 'John' })),\n}));\n\n\u002F\u002F Mock timers\nvi.useFakeTimers();\nvi.advanceTimersByTime(1000);\nvi.restoreAllMocks();\n\n\u002F\u002F Spy on method\nconst spy = vi.spyOn(object, 'method');\n```\n\n## Snapshot Testing\n\n```typescript\ntest('snapshot test', () => {\n  expect(data).toMatchSnapshot();\n});\n\ntest('inline snapshot', () => {\n  expect(result).toMatchInlineSnapshot('5');\n});\n\u002F\u002F Update snapshots: bunx vitest -u\n```\n\n## Coverage\n\n```bash\nbun add --dev @vitest\u002Fcoverage-v8\nbunx vitest --coverage\n```\n\nKey config options: `provider`, `reporter`, `include`, `exclude`, `thresholds`.\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| Quick test | `bunx vitest --reporter=dot --bail=1` |\n| CI test | `bunx vitest run --reporter=junit` |\n| Coverage check | `bunx vitest --coverage --reporter=dot` |\n| Single file | `bunx vitest run src\u002Futils.test.ts --reporter=dot` |\n| Failed only | `bunx vitest --changed --bail=1` |\n\nFor detailed examples, advanced patterns, and best practices, see [REFERENCE.md](REFERENCE.md).\n\n## References\n\n- Official docs: https:\u002F\u002Fvitest.dev\n- Configuration: https:\u002F\u002Fvitest.dev\u002Fconfig\u002F\n- API reference: https:\u002F\u002Fvitest.dev\u002Fapi\u002F\n- Migration from Jest: https:\u002F\u002Fvitest.dev\u002Fguide\u002Fmigration.html\n- Coverage: https:\u002F\u002Fvitest.dev\u002Fguide\u002Fcoverage.html\n","# Vitest Testing\n\nVitest is a modern test runner designed for Vite projects. It's fast, ESM-native, and provides a Jest-compatible API with better TypeScript support and instant HMR-powered watch mode.\n\n## When to Use This Skill\n\n| Use this skill when... | Use another skill instead when... |\n|------------------------|----------------------------------|\n| Setting up or configuring Vitest | Writing E2E browser tests (use playwright-testing) |\n| Writing unit\u002Fintegration tests in TS\u002FJS | Testing Python code (use python-testing) |\n| Migrating from Jest to Vitest | Analyzing test quality (use test-quality-analysis) |\n| Configuring coverage thresholds | Generating property-based tests (use property-based-testing) |\n| Using mocks, spies, or fake timers | Validating test effectiveness (use mutation-testing) |\n\n## Core Expertise\n\n- **Vite-native**: Reuses Vite config, transforms, and plugins\n- **Fast**: Instant feedback with HMR-powered watch mode\n- **Jest-compatible**: Drop-in replacement with similar API\n- **TypeScript**: First-class TypeScript support\n- **ESM**: Native ESM support, no transpilation needed\n- **jsdom DOM tests**: and the assertions that silently lie under it (see below)\n\n## Installation\n\n```bash\nbun add --dev vitest\nbun add --dev @vitest\u002Fcoverage-v8      # Coverage (recommended)\nbun add --dev happy-dom                # DOM testing (optional)\nbunx vitest --version                  # Verify\n```\n\n## Configuration (vitest.config.ts)\n\n```typescript\nimport { defineConfig } from 'vitest\u002Fconfig';\n\nexport default defineConfig({\n  test: {\n    globals: true,\n    environment: 'node',\n  },\n});\n```\n\n## Essential Commands\n\n```bash\nbunx vitest                            # Watch mode (default)\nbunx vitest run                        # Run once (CI mode)\nbunx vitest --coverage                 # With coverage\nbunx vitest src\u002Futils.test.ts          # Specific file\nbunx vitest -t \"should add numbers\"    # Filter by name\nbunx vitest related src\u002Futils.ts       # Related tests\nbunx vitest -u                         # Update snapshots\nbunx vitest bench                      # Benchmarks\nbunx vitest --ui                       # UI mode\n```\n\n## Writing Tests\n\n### Basic Test Structure\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { add, multiply } from '.\u002Fmath';\n\ndescribe('math utils', () => {\n  it('should add two numbers', () => {\n    expect(add(2, 3)).toBe(5);\n  });\n\n  it('should multiply two numbers', () => {\n    expect(multiply(2, 3)).toBe(6);\n  });\n});\n```\n\n### Key Assertions\n\n| Assertion | Description |\n|-----------|-------------|\n| `toBe(value)` | Strict equality |\n| `toEqual(value)` | Deep equality |\n| `toStrictEqual(value)` | Deep strict equality |\n| `toBeTruthy()` \u002F `toBeFalsy()` | Truthiness |\n| `toBeNull()` \u002F `toBeUndefined()` | Null checks |\n| `toBeGreaterThan(n)` \u002F `toBeLessThan(n)` | Numeric comparison |\n| `toBeCloseTo(n)` | Float comparison |\n| `toMatch(regex)` \u002F `toContain(str)` | String matching |\n| `toHaveLength(n)` | Array\u002Fstring length |\n| `toHaveProperty(key)` | Object property |\n| `toMatchObject(obj)` | Partial object match |\n| `toThrow(msg)` | Error throwing |\n\n### Async Tests\n\n```typescript\ntest('async test', async () => {\n  const data = await fetchData();\n  expect(data).toBe('expected');\n});\n\ntest('promise resolves', async () => {\n  await expect(fetchData()).resolves.toBe('expected');\n});\n\ntest('promise rejects', async () => {\n  await expect(fetchBadData()).rejects.toThrow('error');\n});\n```\n\n## DOM tests under jsdom — assertions that lie\n\n`environment: 'jsdom'` gives you a DOM without a **layout engine**, and its CSS\nparser is narrower than a browser's. Several natural-looking assertions are\ntherefore *vacuous*: they pass against the very bug they were written to catch,\nand read as coverage so nobody looks again.\n\n| Trap | Why it passes against the bug | Assert instead |\n|---|---|---|\n| `el.style.overflowY` for a style set by a stylesheet | Inline style is empty; the declaration lives in a class rule | `getComputedStyle(el).overflowY` — jsdom **does** resolve injected `\u003Cstyle>` rules |\n| `getComputedStyle(el).width` for `min()` \u002F `calc()` values | jsdom's parser silently **drops** the whole declaration, reporting `\"\"`\u002F`0` either way | the stylesheet **source text**, or defer to a real browser |\n| Anything about size or position | `getBoundingClientRect()` is all zeros; there is no layout | a real-browser tier |\n| Asserting right after clicking something that renders `async` | The panel is still empty, so \"no bad element found\" is trivially true | flush (`await new Promise(r => setTimeout(r, 0))`), then assert the container is **non-empty** *before* the real check |\n\nAlso: `Element.prototype.scrollIntoView` **does not exist** in jsdom, so any code\npath that centres an element throws on mount. Stub it (`Element.prototype.scrollIntoView = () => {}`)\n— that is a harness gap, not a behaviour change.\n\nAnd never write a conditional assertion:\n\n```typescript\n\u002F\u002F Passes silently in exactly the case it was meant to catch — a renamed class.\nif (found.length === 1) expect(found[0].textContent).toMatch(\u002Fx\u002F);\n\n\u002F\u002F Assert unconditionally.\nexpect(found).toHaveLength(1);\nexpect(found[0].textContent).toMatch(\u002Fx\u002F);\n```\n\n### Make it fail on purpose\n\nA regression test that has never failed has not been shown to test anything.\nBefore trusting one, force red and **read the message**:\n\n- Fix in this package → revert the fix in place, confirm red *for the right\n  reason*, restore.\n- Cross-package suite → re-pin the dependency to the release **before** the fix,\n  confirm red, restore the pin.\n\nRecord the observed failure output in the PR body. \"It goes red\" is a claim; the\nmessage is the evidence.\n\n### Loading a sibling package's source for a real integration test\n\nWhen a defect is a property of **two packages together**, testing each against a\nstand-in keeps both green while the pair is broken. To load a sibling's real\nsource:\n\n1. depend on it pinned to a **release tag** (e.g. a git dependency), so the suite\n   tests a published artifact rather than a moving branch;\n2. add it to `server.deps.inline` — vitest externalizes `node_modules` by default\n   and would hand Node raw TypeScript:\n\n```typescript\nexport default defineConfig({\n  test: { server: { deps: { inline: [\u002Fsibling-package\u002F] } } },\n});\n```\n\n3. export the host's real entry point, so the suite drives the actual code path\n   rather than a per-unit seam where the bug cannot appear.\n\n## Mocking (Essential Patterns)\n\n```typescript\nimport { vi, test, expect } from 'vitest';\n\n\u002F\u002F Mock function\nconst mockFn = vi.fn();\nmockFn.mockReturnValue(42);\n\n\u002F\u002F Mock module\nvi.mock('.\u002Fapi', () => ({\n  fetchUser: vi.fn(() => Promise.resolve({ id: 1, name: 'John' })),\n}));\n\n\u002F\u002F Mock timers\nvi.useFakeTimers();\nvi.advanceTimersByTime(1000);\nvi.restoreAllMocks();\n\n\u002F\u002F Spy on method\nconst spy = vi.spyOn(object, 'method');\n```\n\n## Snapshot Testing\n\n```typescript\ntest('snapshot test', () => {\n  expect(data).toMatchSnapshot();\n});\n\ntest('inline snapshot', () => {\n  expect(result).toMatchInlineSnapshot('5');\n});\n\u002F\u002F Update snapshots: bunx vitest -u\n```\n\n## Coverage\n\n```bash\nbun add --dev @vitest\u002Fcoverage-v8\nbunx vitest --coverage\n```\n\nKey config options: `provider`, `reporter`, `include`, `exclude`, `thresholds`.\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| Quick test | `bunx vitest --reporter=dot --bail=1` |\n| CI test | `bunx vitest run --reporter=junit` |\n| Coverage check | `bunx vitest --coverage --reporter=dot` |\n| Single file | `bunx vitest run src\u002Futils.test.ts --reporter=dot` |\n| Failed only | `bunx vitest --changed --bail=1` |\n\nFor detailed examples, advanced patterns, and best practices, see [REFERENCE.md](REFERENCE.md).\n\n## References\n\n- Official docs: https:\u002F\u002Fvitest.dev\n- Configuration: https:\u002F\u002Fvitest.dev\u002Fconfig\u002F\n- API reference: https:\u002F\u002Fvitest.dev\u002Fapi\u002F\n- Migration from Jest: https:\u002F\u002Fvitest.dev\u002Fguide\u002Fmigration.html\n- Coverage: https:\u002F\u002Fvitest.dev\u002Fguide\u002Fcoverage.html\n",{"name":5,"created":58,"modified":59,"reviewed":58,"description":7,"allowed-tools":60,"user-invocable":54},1765843200000,1785801600000,"Glob, Grep, Read, Bash, Edit, Write, TodoWrite, WebFetch, WebSearch","main","bdd0582f1a2ba53d21061835bfd72d45f2f954f4","testing-plugin\u002Fskills\u002Fvitest-testing",6,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Flaurigates","Linux enthusiast, cloud engineer, neovim addict, electronics hobbyist.","2026-11-11 01:25:01",{"source":8,"skillName":5,"commands":70,"prompt":80,"zipAvailable":81},[71,74,77],{"tool":72,"command":73},"npx","npx skills add laurigates\u002Fclaude-plugins --skill vitest-testing",{"tool":75,"command":76},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill vitest-testing",{"tool":78,"command":79},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill vitest-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftesting-plugin\u002Fskills\u002Fvitest-testing\u002FSKILL.md",true,[83,89,93,99,103],{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"README.md","REFERENCE","参考文档",2022,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-api-webhook-signer\u002FREADME.md",{"path":90,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":91,"sourceHtmlUrl":92},"REFERENCE.md",9910,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftesting-plugin\u002Fskills\u002Fvitest-testing\u002FREFERENCE.md",{"path":94,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":97,"sourceHtmlUrl":98},"scripts\u002Fmain.py","SCRIPT","脚本",6134,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-api-webhook-signer\u002Fscripts\u002Fmain.py",{"path":100,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":101,"sourceHtmlUrl":102},"SOURCE.md",370,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-api-webhook-signer\u002FSOURCE.md",{"path":104,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":105,"sourceHtmlUrl":106},"TRUST.auto.yaml",2171,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fai-crypto\u002Fxspoonai-official-api-webhook-signer\u002FTRUST.auto.yaml",[108,133,150,166,189,219],{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":117,"publishedAt":53},"01M70PFHMH9ADY0CRE6047Y4B2","kitty-show-image","Show the user an image with a note on what to judge, via a file send or a labelled kitty tab. Use when the user must see an image, or icat fails with no \u002Fdev\u002Ftty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-show-image\u002FSKILL.md",[114],{"categoryNo":115,"categoryName":116,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[118,119,120,121,122,123,124,125,126,127,40,29,47,128,129,130,131,132,28,44],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","file","text","with","xdg","via",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":139,"publishedAt":53},"01M70PFEN18HKQ4RCQ1VPGMPTB","kitty-session-persistence","Snapshot and restore kitty terminal sessions on macOS. Use when surviving WindowServer hangs without losing tabs, configuring snapshots, or restoring after a force-reboot.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-session-persistence\u002FSKILL.md",[],[121,140,141,142,34,37,29,47,143,144,145,28,44,43,42,146,147,148,149,40],"kitty session persistence","session","persistence","uname","reboot","terminal","snapshot","macos","sessions","restore",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":53},"01M70PFC77XGXCVQ1543VGZHYR","kitty-remote-control","Safe kitty remote control from an agent — read panes with kitty @ ls\u002Fget-text, notify, and never mutate the live terminal unasked. Use when running inside kitty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-remote-control\u002FSKILL.md",[],[157,158,121,159,160,123,161,162,124,163,164,40,29,165,47,129,130,145,28,44],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":172,"publishedAt":53},"01M70P6WVMCT5JG4SACTM69AF9","docs-reference-check","Dangling doc-reference gate: flag markdown naming repo paths or relative links that no longer exist. Use when docs cite moved\u002Fdeleted files, or wiring a doc-drift lint.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fdocumentation-plugin\u002Fskills\u002Fdocs-reference-check\u002FSKILL.md",[],[173,174,175,176,177,178,179,180,181,182,40,29,47,183,128,184,185,186,187,188],"docs reference check","check","reference check","reference","docs","links","python3","repo","files","auto","drift","lint","wiring","chezmoi","references","cp",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":204,"publishedAt":53},"01M6C6NDE7DAQGNWSF22J5CJ0Z","youtube-upload","Upload a video to YouTube via the Data API v3 and edit its title, description, tags or thumbnail afterwards. Use when publishing or retitling a YouTube video.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-upload\u002FSKILL.md",[195,198,199],{"categoryNo":196,"categoryName":197,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":115,"categoryName":116,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":200,"categoryName":201,"taxonomyType":202,"taxonomyTypeDesc":203},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[205,206,207,208,179,209,44,210,42,211,212,213,40,47,128,214,215,29,216,217,218,132,28],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":223,"categories":224,"keywords":228,"publishedAt":53},"01M6C6NABWW1X58KJJM4F6GQMQ","youtube-studio-share","Share a private YouTube video with a whole Google Workspace organization by scripting YouTube Studio in the browser. Use when a video must be org-only.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-studio-share\u002FSKILL.md",[225],{"categoryNo":226,"categoryName":227,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[229,230,231,232,207,208,233,234,235,236,237,44,238,239,240,241,40,242,29,130,243,28],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]