[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C5GTT5P55FP0P9Q63PQP6N":3,"skill-same:01M6C5GTT5P55FP0P9Q63PQP6N":91},{"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":18,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":6,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M6C5GTT5P55FP0P9Q63PQP6N","ast-grep-search",null,"Find and replace code patterns structurally with ast-grep. Use when matching code by AST structure, finding functions with specific signatures, or detecting anti-patterns regex cannot match.","laurigates\u002Fclaude-plugins","laurigates","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13014001?v=4","01M6C59YHWS9C7KMXKSRX1YXNP","Lauri Gates","01M6C59YP2APG9YAM4DWYQYGFJ",60,"MIT","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcode-quality-plugin\u002Fskills\u002Fast-grep-search\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"search","ast grep","grep","ast","ast grep search","2026","code","when","detecting","find and replace","code patterns","2025","sep","false","structure","signatures","patterns","anti-patterns","use","read","find","Bash","2026-11-10 10:12:30",false,"---\ncreated: 2025-12-16\nmodified: 2026-09-25\nreviewed: 2026-04-25\nname: ast-grep-search\ndescription: Find and replace code patterns structurally with ast-grep. Use when matching code by AST structure, finding functions with specific signatures, or detecting anti-patterns regex cannot match.\nuser-invocable: false\nallowed-tools: Bash(sg *), Bash(ast-grep *), Read, Grep, Glob\neffort: low\n---\n\n# ast-grep Structural Code Search & Refactoring\n\nStructural code search and refactoring using `ast-grep` — matches code by its AST (abstract syntax tree) rather than text patterns.\n\n## When to Use This Skill\n\n| Use this skill when... | Use something else instead when... |\n|------------------------|------------------------------------|\n| The pattern depends on AST structure (function shape, call form, argument count) | Searching plain text or regex matches → `tools-plugin:rg-code-search` |\n| Refactoring API call sites across many files while preserving captured variables | Running a one-shot anti-pattern scan with a report → `code-antipatterns` |\n| Hand-written structural search\u002Freplace for an ad-hoc migration | Functional refactors of a known file\u002Fdirectory → `code-refactor` |\n| Building a new ast-grep rule for a codebase-specific smell | Looking up agentic flags for an existing linter → `code-lint` |\n\n## When to Use ast-grep vs Grep\u002Fripgrep\n\n| Use ast-grep when... | Use grep\u002Frg when... |\n|---------------------|---------------------|\n| Pattern depends on code structure | Simple text or regex match |\n| Need to match any number of arguments | Searching logs, docs, config |\n| Refactoring across many files | One-off literal string search |\n| Finding anti-patterns (empty catch, etc.) | Language doesn't matter |\n| Replacing while preserving variables | Quick filename\u002Fline check |\n\n**Decision rule**: If your search pattern contains wildcards for \"any expression,\" \"any arguments,\" or \"any function name,\" use ast-grep.\n\n## Find References With the Sharpest Instrument\n\nPromoted from `~\u002F.claude\u002Frules\u002Ftool-use-patterns.md`. `Edit` refuses on a file\nunread this session, so \"read it first\" is already a harness invariant. The\n**uncovered** half is checking what *else* depends on what you're changing, and\nthe reflex there is `grep`, which cannot tell a call from a comment, a\ndefinition from a mention, or `foo()` from `\"foo\"` in a string. Measured across\n282 local sessions: ~2,400 code-symbol searches went through `grep`\u002F`rg`,\nagainst **6** `ast-grep` calls and **6** `LSP` calls.\n\nLadder, sharpest first. Falling back down it is normal; starting at the bottom\nfor a code symbol is the miss.\n\n| Reach for | When |\n|---|---|\n| `LSP` — `findReferences`, `incomingCalls`, `goToDefinition` | A language server is running for that filetype. Exact: no comment\u002Fstring hits, and it follows imports and re-exports that no text pattern can. |\n| `ast-grep -p '$FN($$$ARGS)'` | No LSP, or the target is a *shape* rather than a name — a call with a given arity, a decorator, an un-awaited async call. Cross-language, bash included. |\n| `rg` | Non-code: markdown rules, chezmoi templates, config keys, justfile recipes, workflow YAML. The right tool there, not a fallback — most of a dotfiles or plugins repo is prose. |\n\nTwo things that make the middle rung less automatic than it looks. A **bare\nidentifier pattern matches the definition too** (`ast-grep --lang bash -p 'foo'`\nreturns `foo() { … }` alongside every call), so an unshaped pattern is just\n`grep` with extra syntax. And a language server has to be **on `PATH`**, not\nmerely installed — `bash-language-server` sitting in `~\u002F.local\u002Fshare\u002Fnvim\u002Fmason\u002Fbin`\nis invisible to the `LSP` tool, which silently drops shell to the middle rung.\n\nStructural tools carry their own empty-result trap: an `ast-grep` pattern that\nfails to parse returns no matches and exit 0, indistinguishable from a clean\ntree. Control-test the negative against a term you know is present, in the tool\nyou are actually using (`agent-patterns-plugin:tool-result-traps`).\n\n## Pattern Syntax\n\n| Pattern | Matches | Example |\n|---------|---------|---------|\n| `$VAR` | Single AST node | `console.log($MSG)` |\n| `$$$ARGS` | Zero or more nodes | `func($$$ARGS)` |\n| `$_` | Single node (no capture) | `$_ == $_` |\n| `$A == $A` | Same node repeated | Finds `x == x` (not `x == y`) |\n\n## Essential Commands\n\n### Search for Patterns\n\n```bash\n# Find structural patterns\nast-grep -p 'console.log($$$)' --lang js\nast-grep -p 'def $FUNC($$$): $$$' --lang py\nast-grep -p 'fn $NAME($$$) -> $RET { $$$ }' --lang rs\n\n# Search in specific directory\nast-grep -p 'import $PKG' --lang js src\u002F\n\n# JSON output for parsing\nast-grep -p 'pattern' --lang js --json=compact\n```\n\n### Search and Replace\n\n```bash\n# Preview changes (default - shows matches)\nast-grep -p 'var $V = $X' -r 'const $V = $X' --lang js\n\n# Apply changes to all files\nast-grep -p 'var $V = $X' -r 'const $V = $X' --lang js -U\n\n# Interactive review\nast-grep -p 'oldAPI($$$ARGS)' -r 'newAPI($$$ARGS)' --lang py -i\n\n# Convert function syntax\nast-grep -p 'function($$$ARGS) { return $EXPR }' \\\n         -r '($$$ARGS) => $EXPR' --lang js -U\n\n# Update import paths\nast-grep -p \"import $NAME from '@old\u002F$PATH'\" \\\n         -r \"import $NAME from '@new\u002F$PATH'\" --lang ts -U\n```\n\n### Language Codes\n\n| Code | Language | Code | Language |\n|------|----------|------|----------|\n| `js` | JavaScript | `py` | Python |\n| `ts` | TypeScript | `rs` | Rust |\n| `jsx` | JSX | `go` | Go |\n| `tsx` | TSX | `java` | Java |\n| `cpp` | C++ | `rb` | Ruby |\n| `c` | C | `php` | PHP |\n\n## Common Patterns by Language\n\n### JavaScript\u002FTypeScript\n\n```bash\n# Find React hooks\nast-grep -p 'const [$STATE, $SETTER] = useState($INIT)' --lang jsx\n\n# Find async functions\nast-grep -p 'async function $NAME($$$) { $$$ }' --lang js\n\n# Find type assertions\nast-grep -p '$EXPR as $TYPE' --lang ts\n\n# Find empty catch blocks\nast-grep -p 'try { $$$ } catch ($E) { }' --lang js\n\n# Find eval usage (security)\nast-grep -p 'eval($$$)' --lang js\n\n# Find innerHTML (XSS risk)\nast-grep -p '$ELEM.innerHTML = $$$' --lang js\n\n# Find specific imports\nast-grep -p \"import { $$$IMPORTS } from '$PKG'\" --lang js\n```\n\n### Python\n\n```bash\n# Find class definitions\nast-grep -p 'class $NAME($$$BASES): $$$' --lang py\n\n# Find decorated functions\nast-grep -p '@$DECORATOR\\ndef $FUNC($$$): $$$' --lang py\n\n# Find dangerous shell calls\nast-grep -p 'os.system($$$)' --lang py\n\n# Find SQL concatenation (injection risk)\nast-grep -p '\"SELECT * FROM \" + $VAR' --lang py\n```\n\n### Rust\n\n```bash\n# Find unsafe blocks\nast-grep -p 'unsafe { $$$ }' --lang rs\n\n# Find impl blocks\nast-grep -p 'impl $TRAIT for $TYPE { $$$ }' --lang rs\n\n# Find public functions\nast-grep -p 'pub fn $NAME($$$) { $$$ }' --lang rs\n```\n\n### Go\n\n```bash\n# Find goroutines\nast-grep -p 'go $FUNC($$$)' --lang go\n\n# Find defer statements\nast-grep -p 'defer $FUNC($$$)' --lang go\n\n# Find error handling\nast-grep -p 'if err != nil { $$$ }' --lang go\n```\n\n## Common Refactoring Recipes\n\n```bash\n# Replace deprecated API calls\nast-grep -p 'oldAPI.$METHOD($$$)' -r 'newAPI.$METHOD($$$)' --lang js -U\n\n# Rename a function across files\nast-grep -p 'oldName($$$ARGS)' -r 'newName($$$ARGS)' --lang py -U\n\n# Remove console.log statements\nast-grep -p 'console.log($$$)' -r '' --lang js -U\n\n# Convert require to import\nast-grep -p 'const $NAME = require($PKG)' \\\n         -r 'import $NAME from $PKG' --lang js -i\n\n# Add error handling wrapper\nast-grep -p 'await $EXPR' \\\n         -r 'await $EXPR.catch(handleError)' --lang ts -i\n```\n\n## Command-Line Flags\n\n| Flag | Purpose |\n|------|---------|\n| `-p, --pattern` | Search pattern |\n| `-r, --rewrite` | Replacement pattern |\n| `-l, --lang` | Target language |\n| `-i, --interactive` | Review changes one by one |\n| `-U, --update-all` | Apply all changes |\n| `--json` | JSON output (`compact`, `stream`, `pretty`) |\n| `-A N` | Lines after match |\n| `-B N` | Lines before match |\n| `-C N` | Lines around match |\n| `--debug-query` | Debug pattern parsing |\n\n## YAML Rules (Scan Mode)\n\nFor reusable rules, use `ast-grep scan` with YAML configuration:\n\n```bash\n# Scan with config\nast-grep scan -c sgconfig.yml\n\n# Run specific rule\nast-grep scan -r rule-name\n\n# Initialize a rules project\nast-grep new project my-linter\nast-grep new rule no-console-log\n```\n\nMinimal rule file:\n```yaml\nid: no-empty-catch\nlanguage: JavaScript\nseverity: warning\nmessage: Empty catch block hides errors\nrule:\n  pattern: try { $$$ } catch ($E) { }\nfix: |\n  try { $$$ } catch ($E) { console.error($E) }\n```\n\nFor comprehensive YAML rule syntax, constraints, transformations, and testing, see [REFERENCE.md](REFERENCE.md).\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| Quick structural search | `ast-grep -p 'pattern' --lang js --json=compact` |\n| Count matches | `ast-grep -p 'pattern' --lang js --json=stream \\| wc -l` |\n| File list only | `ast-grep -p 'pattern' --json=stream \\| jq -r '.file' \\| sort -u` |\n| Batch refactor | `ast-grep -p 'old' -r 'new' --lang js -U` |\n| Scan with rules | `ast-grep scan --json` |\n| Debug pattern | `ast-grep -p 'pattern' --debug-query --lang js` |\n\n## Quick Reference\n\n```bash\n# 1. Search for pattern\nast-grep -p 'pattern' --lang js src\u002F\n\n# 2. Preview rewrite\nast-grep -p 'old' -r 'new' --lang js\n\n# 3. Apply rewrite\nast-grep -p 'old' -r 'new' --lang js -U\n\n# 4. Scan with rules\nast-grep scan -c sgconfig.yml\n\n# 5. Debug pattern\nast-grep -p 'pattern' --debug-query --lang js\n```\n","# ast-grep Structural Code Search & Refactoring\n\nStructural code search and refactoring using `ast-grep` — matches code by its AST (abstract syntax tree) rather than text patterns.\n\n## When to Use This Skill\n\n| Use this skill when... | Use something else instead when... |\n|------------------------|------------------------------------|\n| The pattern depends on AST structure (function shape, call form, argument count) | Searching plain text or regex matches → `tools-plugin:rg-code-search` |\n| Refactoring API call sites across many files while preserving captured variables | Running a one-shot anti-pattern scan with a report → `code-antipatterns` |\n| Hand-written structural search\u002Freplace for an ad-hoc migration | Functional refactors of a known file\u002Fdirectory → `code-refactor` |\n| Building a new ast-grep rule for a codebase-specific smell | Looking up agentic flags for an existing linter → `code-lint` |\n\n## When to Use ast-grep vs Grep\u002Fripgrep\n\n| Use ast-grep when... | Use grep\u002Frg when... |\n|---------------------|---------------------|\n| Pattern depends on code structure | Simple text or regex match |\n| Need to match any number of arguments | Searching logs, docs, config |\n| Refactoring across many files | One-off literal string search |\n| Finding anti-patterns (empty catch, etc.) | Language doesn't matter |\n| Replacing while preserving variables | Quick filename\u002Fline check |\n\n**Decision rule**: If your search pattern contains wildcards for \"any expression,\" \"any arguments,\" or \"any function name,\" use ast-grep.\n\n## Find References With the Sharpest Instrument\n\nPromoted from `~\u002F.claude\u002Frules\u002Ftool-use-patterns.md`. `Edit` refuses on a file\nunread this session, so \"read it first\" is already a harness invariant. The\n**uncovered** half is checking what *else* depends on what you're changing, and\nthe reflex there is `grep`, which cannot tell a call from a comment, a\ndefinition from a mention, or `foo()` from `\"foo\"` in a string. Measured across\n282 local sessions: ~2,400 code-symbol searches went through `grep`\u002F`rg`,\nagainst **6** `ast-grep` calls and **6** `LSP` calls.\n\nLadder, sharpest first. Falling back down it is normal; starting at the bottom\nfor a code symbol is the miss.\n\n| Reach for | When |\n|---|---|\n| `LSP` — `findReferences`, `incomingCalls`, `goToDefinition` | A language server is running for that filetype. Exact: no comment\u002Fstring hits, and it follows imports and re-exports that no text pattern can. |\n| `ast-grep -p '$FN($$$ARGS)'` | No LSP, or the target is a *shape* rather than a name — a call with a given arity, a decorator, an un-awaited async call. Cross-language, bash included. |\n| `rg` | Non-code: markdown rules, chezmoi templates, config keys, justfile recipes, workflow YAML. The right tool there, not a fallback — most of a dotfiles or plugins repo is prose. |\n\nTwo things that make the middle rung less automatic than it looks. A **bare\nidentifier pattern matches the definition too** (`ast-grep --lang bash -p 'foo'`\nreturns `foo() { … }` alongside every call), so an unshaped pattern is just\n`grep` with extra syntax. And a language server has to be **on `PATH`**, not\nmerely installed — `bash-language-server` sitting in `~\u002F.local\u002Fshare\u002Fnvim\u002Fmason\u002Fbin`\nis invisible to the `LSP` tool, which silently drops shell to the middle rung.\n\nStructural tools carry their own empty-result trap: an `ast-grep` pattern that\nfails to parse returns no matches and exit 0, indistinguishable from a clean\ntree. Control-test the negative against a term you know is present, in the tool\nyou are actually using (`agent-patterns-plugin:tool-result-traps`).\n\n## Pattern Syntax\n\n| Pattern | Matches | Example |\n|---------|---------|---------|\n| `$VAR` | Single AST node | `console.log($MSG)` |\n| `$$$ARGS` | Zero or more nodes | `func($$$ARGS)` |\n| `$_` | Single node (no capture) | `$_ == $_` |\n| `$A == $A` | Same node repeated | Finds `x == x` (not `x == y`) |\n\n## Essential Commands\n\n### Search for Patterns\n\n```bash\n# Find structural patterns\nast-grep -p 'console.log($$$)' --lang js\nast-grep -p 'def $FUNC($$$): $$$' --lang py\nast-grep -p 'fn $NAME($$$) -> $RET { $$$ }' --lang rs\n\n# Search in specific directory\nast-grep -p 'import $PKG' --lang js src\u002F\n\n# JSON output for parsing\nast-grep -p 'pattern' --lang js --json=compact\n```\n\n### Search and Replace\n\n```bash\n# Preview changes (default - shows matches)\nast-grep -p 'var $V = $X' -r 'const $V = $X' --lang js\n\n# Apply changes to all files\nast-grep -p 'var $V = $X' -r 'const $V = $X' --lang js -U\n\n# Interactive review\nast-grep -p 'oldAPI($$$ARGS)' -r 'newAPI($$$ARGS)' --lang py -i\n\n# Convert function syntax\nast-grep -p 'function($$$ARGS) { return $EXPR }' \\\n         -r '($$$ARGS) => $EXPR' --lang js -U\n\n# Update import paths\nast-grep -p \"import $NAME from '@old\u002F$PATH'\" \\\n         -r \"import $NAME from '@new\u002F$PATH'\" --lang ts -U\n```\n\n### Language Codes\n\n| Code | Language | Code | Language |\n|------|----------|------|----------|\n| `js` | JavaScript | `py` | Python |\n| `ts` | TypeScript | `rs` | Rust |\n| `jsx` | JSX | `go` | Go |\n| `tsx` | TSX | `java` | Java |\n| `cpp` | C++ | `rb` | Ruby |\n| `c` | C | `php` | PHP |\n\n## Common Patterns by Language\n\n### JavaScript\u002FTypeScript\n\n```bash\n# Find React hooks\nast-grep -p 'const [$STATE, $SETTER] = useState($INIT)' --lang jsx\n\n# Find async functions\nast-grep -p 'async function $NAME($$$) { $$$ }' --lang js\n\n# Find type assertions\nast-grep -p '$EXPR as $TYPE' --lang ts\n\n# Find empty catch blocks\nast-grep -p 'try { $$$ } catch ($E) { }' --lang js\n\n# Find eval usage (security)\nast-grep -p 'eval($$$)' --lang js\n\n# Find innerHTML (XSS risk)\nast-grep -p '$ELEM.innerHTML = $$$' --lang js\n\n# Find specific imports\nast-grep -p \"import { $$$IMPORTS } from '$PKG'\" --lang js\n```\n\n### Python\n\n```bash\n# Find class definitions\nast-grep -p 'class $NAME($$$BASES): $$$' --lang py\n\n# Find decorated functions\nast-grep -p '@$DECORATOR\\ndef $FUNC($$$): $$$' --lang py\n\n# Find dangerous shell calls\nast-grep -p 'os.system($$$)' --lang py\n\n# Find SQL concatenation (injection risk)\nast-grep -p '\"SELECT * FROM \" + $VAR' --lang py\n```\n\n### Rust\n\n```bash\n# Find unsafe blocks\nast-grep -p 'unsafe { $$$ }' --lang rs\n\n# Find impl blocks\nast-grep -p 'impl $TRAIT for $TYPE { $$$ }' --lang rs\n\n# Find public functions\nast-grep -p 'pub fn $NAME($$$) { $$$ }' --lang rs\n```\n\n### Go\n\n```bash\n# Find goroutines\nast-grep -p 'go $FUNC($$$)' --lang go\n\n# Find defer statements\nast-grep -p 'defer $FUNC($$$)' --lang go\n\n# Find error handling\nast-grep -p 'if err != nil { $$$ }' --lang go\n```\n\n## Common Refactoring Recipes\n\n```bash\n# Replace deprecated API calls\nast-grep -p 'oldAPI.$METHOD($$$)' -r 'newAPI.$METHOD($$$)' --lang js -U\n\n# Rename a function across files\nast-grep -p 'oldName($$$ARGS)' -r 'newName($$$ARGS)' --lang py -U\n\n# Remove console.log statements\nast-grep -p 'console.log($$$)' -r '' --lang js -U\n\n# Convert require to import\nast-grep -p 'const $NAME = require($PKG)' \\\n         -r 'import $NAME from $PKG' --lang js -i\n\n# Add error handling wrapper\nast-grep -p 'await $EXPR' \\\n         -r 'await $EXPR.catch(handleError)' --lang ts -i\n```\n\n## Command-Line Flags\n\n| Flag | Purpose |\n|------|---------|\n| `-p, --pattern` | Search pattern |\n| `-r, --rewrite` | Replacement pattern |\n| `-l, --lang` | Target language |\n| `-i, --interactive` | Review changes one by one |\n| `-U, --update-all` | Apply all changes |\n| `--json` | JSON output (`compact`, `stream`, `pretty`) |\n| `-A N` | Lines after match |\n| `-B N` | Lines before match |\n| `-C N` | Lines around match |\n| `--debug-query` | Debug pattern parsing |\n\n## YAML Rules (Scan Mode)\n\nFor reusable rules, use `ast-grep scan` with YAML configuration:\n\n```bash\n# Scan with config\nast-grep scan -c sgconfig.yml\n\n# Run specific rule\nast-grep scan -r rule-name\n\n# Initialize a rules project\nast-grep new project my-linter\nast-grep new rule no-console-log\n```\n\nMinimal rule file:\n```yaml\nid: no-empty-catch\nlanguage: JavaScript\nseverity: warning\nmessage: Empty catch block hides errors\nrule:\n  pattern: try { $$$ } catch ($E) { }\nfix: |\n  try { $$$ } catch ($E) { console.error($E) }\n```\n\nFor comprehensive YAML rule syntax, constraints, transformations, and testing, see [REFERENCE.md](REFERENCE.md).\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| Quick structural search | `ast-grep -p 'pattern' --lang js --json=compact` |\n| Count matches | `ast-grep -p 'pattern' --lang js --json=stream \\| wc -l` |\n| File list only | `ast-grep -p 'pattern' --json=stream \\| jq -r '.file' \\| sort -u` |\n| Batch refactor | `ast-grep -p 'old' -r 'new' --lang js -U` |\n| Scan with rules | `ast-grep scan --json` |\n| Debug pattern | `ast-grep -p 'pattern' --debug-query --lang js` |\n\n## Quick Reference\n\n```bash\n# 1. Search for pattern\nast-grep -p 'pattern' --lang js src\u002F\n\n# 2. Preview rewrite\nast-grep -p 'old' -r 'new' --lang js\n\n# 3. Apply rewrite\nast-grep -p 'old' -r 'new' --lang js -U\n\n# 4. Scan with rules\nast-grep scan -c sgconfig.yml\n\n# 5. Debug pattern\nast-grep -p 'pattern' --debug-query --lang js\n```\n",{"name":5,"effort":46,"created":47,"modified":48,"reviewed":49,"description":7,"allowed-tools":50,"user-invocable":42},"low",1765843200000,1790294400000,1777075200000,"Bash(sg *), Bash(ast-grep *), Read, Grep, Glob","main","bdd0582f1a2ba53d21061835bfd72d45f2f954f4","code-quality-plugin\u002Fskills\u002Fast-grep-search",6,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Flaurigates","Linux enthusiast, cloud engineer, neovim addict, electronics hobbyist.","2026-11-13 20:24:11",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add laurigates\u002Fclaude-plugins --skill ast-grep-search",{"tool":65,"command":66},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill ast-grep-search",{"tool":68,"command":69},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill ast-grep-search","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcode-quality-plugin\u002Fskills\u002Fast-grep-search\u002FSKILL.md",true,[73,79,83,87],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"REFERENCE.md","REFERENCE","参考文档",6677,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcode-quality-plugin\u002Fskills\u002Fast-grep-search\u002FREFERENCE.md",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"references\u002Fapi.md",7160,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fai-research\u002Fmechanistic-interpretability-nnsight\u002Freferences\u002Fapi.md",{"path":84,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":85,"sourceHtmlUrl":86},"references\u002FREADME.md",1913,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fai-research\u002Fmechanistic-interpretability-nnsight\u002Freferences\u002FREADME.md",{"path":88,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":89,"sourceHtmlUrl":90},"references\u002Ftutorials.md",7970,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fai-research\u002Fmechanistic-interpretability-nnsight\u002Freferences\u002Ftutorials.md",[92,119,139,155,178,208],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":103,"publishedAt":41},"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",[98],{"categoryNo":99,"categoryName":100,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[104,105,106,107,108,109,110,111,112,113,37,26,40,114,115,116,117,118,24,38],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","file","text","with","xdg","via",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":41},"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",[],[107,126,127,128,32,129,26,40,130,131,132,24,38,133,134,135,136,137,138,37],"kitty session persistence","session","persistence","snapshots","uname","reboot","terminal","write","edit","snapshot","macos","sessions","restore",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":41},"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",[],[146,147,107,148,149,109,150,151,110,152,153,37,26,154,40,115,116,132,24,38],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":41},"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",[],[162,163,164,165,166,167,168,169,170,171,37,26,40,172,114,173,174,175,176,177],"docs reference check","check","reference check","reference","docs","links","python3","repo","files","auto","drift","lint","wiring","chezmoi","references","cp",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":193,"publishedAt":41},"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",[184,187,188],{"categoryNo":185,"categoryName":186,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":99,"categoryName":100,"taxonomyType":101,"taxonomyTypeDesc":102},{"categoryNo":189,"categoryName":190,"taxonomyType":191,"taxonomyTypeDesc":192},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[194,195,196,197,168,198,38,199,134,200,201,202,37,40,114,203,204,26,205,206,207,118,24],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":209,"name":210,"nameZh":6,"description":211,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":212,"categories":213,"keywords":217,"publishedAt":41},"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",[214],{"categoryNo":215,"categoryName":216,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000023","Skill与智能体开发",[218,219,220,221,196,197,222,223,224,225,226,38,227,228,229,230,37,231,26,116,232,24],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]