[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C5JFN8V431K0JECWSZFSWT":3,"skill-same:01M6C5JFN8V431K0JECWSZFSWT":78},{"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":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":6,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":62,"updatedAt":63,"install":64,"resources":77},"01M6C5JFN8V431K0JECWSZFSWT","attributes-collect",null,"Collect codebase health attributes as structured JSON. Use when assessing project health before routing to specialized agents via attributes-route.","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\u002Fcodebase-attributes-plugin\u002Fskills\u002Fattributes-collect\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],"collect","attributes","attributes collect","use","when","wc","categories","output","via","as","project","route","codebase health","test","project health","list","read","specialized","grep","json","Bash","health","routing","2026-11-10 10:12:30",false,"---\nname: attributes-collect\ndescription: Collect codebase health attributes as structured JSON. Use when assessing project health before routing to specialized agents via attributes-route.\nallowed-tools: Bash(test *), Bash(wc *), Read, Glob, Grep, TodoWrite\nargs: \"[--output \u003Cpath>] [--categories \u003Clist>]\"\nargument-hint: \"[--output .claude\u002Fattributes.json]\"\ncreated: 2026-03-15\nmodified: 2026-03-15\nreviewed: 2026-03-15\n---\n\n# \u002Fattributes:collect\n\nCollect structured codebase health attributes with severity and remediation actions.\n\n## When to Use This Skill\n\n| Use this skill when... | Use another approach when... |\n|------------------------|------------------------------|\n| Need structured health assessment before routing | Quick health score only (use `\u002Fhealth:check`) |\n| Want machine-readable attribute JSON | Human-readable report (use `\u002Fattributes:dashboard`) |\n| Planning which agents to invoke | Already know what needs fixing |\n| Comparing health across repos | Checking specific component only |\n\n## Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `--output \u003Cpath>` | Write JSON to file (default: stdout) |\n| `--categories \u003Clist>` | Comma-separated categories to check: docs,tests,security,quality,ci |\n\n## Execution\n\nPerform these checks and output structured JSON.\n\n### Step 1: Documentation Attributes\n\nCheck for these files and emit attributes:\n\n| Check | Attribute ID | Severity |\n|-------|-------------|----------|\n| README.md exists | `missing-readme` | high |\n| README.md > 200 chars | `short-readme` | low |\n| CLAUDE.md exists | `missing-claude-md` | medium |\n| docs\u002F directory exists | `no-docs-directory` | low |\n| LICENSE file exists | `missing-license` | low |\n\nScore: Start at 0, add points per check (max 20).\n\n### Step 2: Testing Attributes\n\n| Check | Attribute ID | Severity |\n|-------|-------------|----------|\n| tests\u002F or test\u002F directory exists | `no-test-directory` | high |\n| Test config file exists (vitest, jest, pytest, etc.) | `no-test-config` | medium |\n| CI workflow runs tests | `no-ci-tests` | high |\n\nTest configs to look for: `vitest.config.{ts,js}`, `jest.config.{js,ts}`, `pytest.ini`, `conftest.py`, `playwright.config.ts`\n\n### Step 3: Security Attributes\n\n| Check | Attribute ID | Severity |\n|-------|-------------|----------|\n| .gitignore exists | `missing-gitignore` | high |\n| .env file NOT committed | `env-file-committed` | critical |\n| Pre-commit hooks configured | `no-pre-commit-hooks` | medium |\n| Security scanning in CI | `no-security-scanning` | high |\n| Dependabot configured | `no-dependabot` | low |\n\n### Step 4: Code Quality Attributes\n\n| Check | Attribute ID | Severity |\n|-------|-------------|----------|\n| Linter configured (eslint, biome, ruff) | `no-linter-configured` | medium |\n| Formatter configured (prettier, biome, ruff) | `no-formatter` | medium |\n| Type checking (tsconfig, pyright, mypy) | `no-type-checking` | low |\n\n### Step 5: CI\u002FCD Attributes\n\n| Check | Attribute ID | Severity |\n|-------|-------------|----------|\n| CI workflows exist | `no-ci-workflows` | high |\n| Workflows dir has files | `empty-workflows-dir` | medium |\n\n### Step 6: Output\n\nOutput JSON matching this schema:\n\n```json\n{\n  \"version\": \"1\",\n  \"repo\": \"\u003Cpath>\",\n  \"timestamp\": \"\u003CISO 8601>\",\n  \"attributes\": [\n    {\n      \"id\": \"missing-readme\",\n      \"category\": \"docs\",\n      \"severity\": \"high\",\n      \"description\": \"Missing README.md\",\n      \"source\": \"attributes-collect\",\n      \"actions\": [\n        {\"type\": \"agent\", \"target\": \"docs\", \"args\": \"create README.md\", \"auto_fixable\": true}\n      ]\n    }\n  ],\n  \"scores\": {\n    \"overall\": 72,\n    \"grade\": \"C\",\n    \"max_score\": 100,\n    \"categories\": {\"docs\": 15, \"tests\": 12, \"security\": 8, \"quality\": 17, \"ci\": 20}\n  }\n}\n```\n\nIf `--output` is specified, write the JSON to that file.\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| Full attribute collection | `\u002Fattributes:collect` |\n| Save to file | `\u002Fattributes:collect --output .claude\u002Fattributes.json` |\n| Specific categories | `\u002Fattributes:collect --categories security,tests` |\n| Check README exists | `test -f README.md && echo exists \\|\\| echo missing` |\n| Check test dir | `test -d tests \\|\\| test -d test && echo exists \\|\\| echo missing` |\n| Count README chars | `wc -c \u003C README.md 2>\u002Fdev\u002Fnull \\|\\| echo 0` |\n","# \u002Fattributes:collect\n\nCollect structured codebase health attributes with severity and remediation actions.\n\n## When to Use This Skill\n\n| Use this skill when... | Use another approach when... |\n|------------------------|------------------------------|\n| Need structured health assessment before routing | Quick health score only (use `\u002Fhealth:check`) |\n| Want machine-readable attribute JSON | Human-readable report (use `\u002Fattributes:dashboard`) |\n| Planning which agents to invoke | Already know what needs fixing |\n| Comparing health across repos | Checking specific component only |\n\n## Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `--output \u003Cpath>` | Write JSON to file (default: stdout) |\n| `--categories \u003Clist>` | Comma-separated categories to check: docs,tests,security,quality,ci |\n\n## Execution\n\nPerform these checks and output structured JSON.\n\n### Step 1: Documentation Attributes\n\nCheck for these files and emit attributes:\n\n| Check | Attribute ID | Severity |\n|-------|-------------|----------|\n| README.md exists | `missing-readme` | high |\n| README.md > 200 chars | `short-readme` | low |\n| CLAUDE.md exists | `missing-claude-md` | medium |\n| docs\u002F directory exists | `no-docs-directory` | low |\n| LICENSE file exists | `missing-license` | low |\n\nScore: Start at 0, add points per check (max 20).\n\n### Step 2: Testing Attributes\n\n| Check | Attribute ID | Severity |\n|-------|-------------|----------|\n| tests\u002F or test\u002F directory exists | `no-test-directory` | high |\n| Test config file exists (vitest, jest, pytest, etc.) | `no-test-config` | medium |\n| CI workflow runs tests | `no-ci-tests` | high |\n\nTest configs to look for: `vitest.config.{ts,js}`, `jest.config.{js,ts}`, `pytest.ini`, `conftest.py`, `playwright.config.ts`\n\n### Step 3: Security Attributes\n\n| Check | Attribute ID | Severity |\n|-------|-------------|----------|\n| .gitignore exists | `missing-gitignore` | high |\n| .env file NOT committed | `env-file-committed` | critical |\n| Pre-commit hooks configured | `no-pre-commit-hooks` | medium |\n| Security scanning in CI | `no-security-scanning` | high |\n| Dependabot configured | `no-dependabot` | low |\n\n### Step 4: Code Quality Attributes\n\n| Check | Attribute ID | Severity |\n|-------|-------------|----------|\n| Linter configured (eslint, biome, ruff) | `no-linter-configured` | medium |\n| Formatter configured (prettier, biome, ruff) | `no-formatter` | medium |\n| Type checking (tsconfig, pyright, mypy) | `no-type-checking` | low |\n\n### Step 5: CI\u002FCD Attributes\n\n| Check | Attribute ID | Severity |\n|-------|-------------|----------|\n| CI workflows exist | `no-ci-workflows` | high |\n| Workflows dir has files | `empty-workflows-dir` | medium |\n\n### Step 6: Output\n\nOutput JSON matching this schema:\n\n```json\n{\n  \"version\": \"1\",\n  \"repo\": \"\u003Cpath>\",\n  \"timestamp\": \"\u003CISO 8601>\",\n  \"attributes\": [\n    {\n      \"id\": \"missing-readme\",\n      \"category\": \"docs\",\n      \"severity\": \"high\",\n      \"description\": \"Missing README.md\",\n      \"source\": \"attributes-collect\",\n      \"actions\": [\n        {\"type\": \"agent\", \"target\": \"docs\", \"args\": \"create README.md\", \"auto_fixable\": true}\n      ]\n    }\n  ],\n  \"scores\": {\n    \"overall\": 72,\n    \"grade\": \"C\",\n    \"max_score\": 100,\n    \"categories\": {\"docs\": 15, \"tests\": 12, \"security\": 8, \"quality\": 17, \"ci\": 20}\n  }\n}\n```\n\nIf `--output` is specified, write the JSON to that file.\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| Full attribute collection | `\u002Fattributes:collect` |\n| Save to file | `\u002Fattributes:collect --output .claude\u002Fattributes.json` |\n| Specific categories | `\u002Fattributes:collect --categories security,tests` |\n| Check README exists | `test -f README.md && echo exists \\|\\| echo missing` |\n| Check test dir | `test -d tests \\|\\| test -d test && echo exists \\|\\| echo missing` |\n| Count README chars | `wc -c \u003C README.md 2>\u002Fdev\u002Fnull \\|\\| echo 0` |\n",{"args":52,"name":5,"created":53,"modified":53,"reviewed":53,"description":7,"allowed-tools":54,"argument-hint":55},"[--output \u003Cpath>] [--categories \u003Clist>]",1773532800000,"Bash(test *), Bash(wc *), Read, Glob, Grep, TodoWrite","[--output .claude\u002Fattributes.json]","main","bdd0582f1a2ba53d21061835bfd72d45f2f954f4","codebase-attributes-plugin\u002Fskills\u002Fattributes-collect",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":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add laurigates\u002Fclaude-plugins --skill attributes-collect",{"tool":70,"command":71},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill attributes-collect",{"tool":73,"command":74},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill attributes-collect","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcodebase-attributes-plugin\u002Fskills\u002Fattributes-collect\u002FSKILL.md",true,[],[79,104,125,141,164,194],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":88,"publishedAt":47},"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",[85],{"categoryNo":86,"categoryName":87,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[89,90,91,92,93,94,95,96,97,98,27,28,44,99,100,101,102,32,103,40],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","file","text","with","xdg","2026",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":47},"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",[],[92,111,112,113,114,115,28,44,116,117,118,103,40,119,120,121,122,123,124,27],"kitty session persistence","session","persistence","false","snapshots","uname","reboot","terminal","write","edit","snapshot","macos","sessions","restore",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":47},"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",[],[132,133,92,134,135,94,136,137,95,138,139,27,28,140,44,100,101,118,103,40],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":47},"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",[],[148,149,150,151,152,153,154,155,156,157,27,28,44,158,99,159,160,161,162,163],"docs reference check","check","reference check","reference","docs","links","python3","repo","files","auto","drift","lint","wiring","chezmoi","references","cp",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":179,"publishedAt":47},"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",[170,173,174],{"categoryNo":171,"categoryName":172,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":86,"categoryName":87,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":175,"categoryName":176,"taxonomyType":177,"taxonomyTypeDesc":178},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[180,181,182,183,154,184,40,185,120,186,187,188,27,44,99,189,190,28,191,192,193,32,103],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":198,"categories":199,"keywords":203,"publishedAt":47},"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",[200],{"categoryNo":201,"categoryName":202,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[204,205,206,207,182,183,208,209,210,211,212,40,213,214,215,216,27,217,28,101,218,103],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]