[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C698GXCX4YG30RXMNQMCZX":3,"skill-same:01M6C698GXCX4YG30RXMNQMCZX":139},{"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":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6C698GXCX4YG30RXMNQMCZX","vault-wikilinks",null,"Broken Obsidian wikilink detection and repair. Use when fixing `[[Target]]` links, rewriting renamed-note refs, or resolving Zettelkasten\u002Fwork-namespace paths.","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\u002Fobsidian-plugin\u002Fskills\u002Fvault-wikilinks\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"vault","vault wikilinks","2026","obsidian","when","zettelkasten","links","note","paths","false","repair","use","edit","read","broken","work","grep","detection","2026-11-10 10:12:30",false,"---\ncreated: 2026-04-17\nmodified: 2026-06-28\nreviewed: 2026-06-28\nname: vault-wikilinks\ndescription: \"Broken Obsidian wikilink detection and repair. Use when fixing `[[Target]]` links, rewriting renamed-note refs, or resolving Zettelkasten\u002Fwork-namespace paths.\"\nuser-invocable: false\nallowed-tools: Read, Edit, Grep, Glob\n---\n\n# Wikilink Integrity\n\n## When to Use This Skill\n\n| Use this skill when... | Use the alternative instead when... |\n|---|---|\n| Repairing broken `[[Target]]` wikilinks after a note rename or move | Discovering which links Obsidian flags as unresolved in the first place — use `search-discovery` |\n| Resolving cross-namespace ambiguity between `Zettelkasten\u002F` and `work\u002Fz\u002F` notes | Reorganising or merging the work-namespace stub itself — use `vault-stubs` |\n| Unqualifying path-prefixed `[[Kanban\u002FX]]` links to bare basenames | Reconnecting orphan notes that have no links at all — use `vault-orphans` |\n\nObsidian resolves `[[Target]]` by looking for a note whose basename is `Target.md` anywhere in the vault. Links break silently when a note is renamed, moved, or was never created. Ambiguity arises when two notes share a basename.\n\n## Link Syntax\n\n```markdown\n[[Note Name]]                      # basename resolution\n[[Note Name|Alias]]                # custom display text\n[[Note Name#Section heading]]      # deep link to heading\n[[folder\u002FNote Name]]               # path-qualified (usually unnecessary)\n![[Image.png]]                     # embed (image, note, PDF)\n```\n\n## Resolution Rules\n\n1. **Unqualified target** (`[[Docker]]`) resolves to any note with basename `Docker.md`. If two exist (e.g. `Zettelkasten\u002FDocker.md` and `work\u002Fz\u002FDocker.md`), Obsidian picks one non-deterministically — ambiguous.\n2. **Path-qualified target** (`[[Kanban\u002FMain]]`) resolves to `Kanban\u002FMain.md` exactly — no basename fallback.\n3. **Embeds** (`![[X]]`) follow the same resolution. Image embeds typically target files under `Files\u002F`.\n\n## Common Breakage Patterns\n\n| Pattern | Fix |\n|---------|-----|\n| `[[OldTopic]]` × many → note doesn't exist | Rewrite to `[[Topic]]` (the actual note) |\n| `[[Development MOC]]` → note was renamed | Rewrite to `[[Development Workflows and Tools MOC]]` |\n| `[[Kanban\u002FX]]` → works but path-qualified is brittle | Rewrite to `[[X]]` when basename is unique |\n| `[[code]]`, `[[project]]` → never were real notes | These were inline-tag syntax errors; delete the link and leave plain text |\n| `[[Gen AI  Some Idea]]` (double space) | Fix the extra whitespace in the link |\n\n## Cross-Namespace Ambiguity\n\nWhen two notes share a basename (e.g. `Docker.md` in both `Zettelkasten\u002F` and `work\u002Fz\u002F`), every `[[Docker]]` in the vault becomes ambiguous. Options:\n\n1. **Rename one** so they stop colliding (`work\u002Fz\u002FDocker.md` → keep as redirect stub; content lives in `Zettelkasten\u002FDocker.md`).\n2. **Path-qualify the links** that should resolve to the non-canonical copy: `[[work\u002Fz\u002FDocker]]`.\n3. **Never use bare `[[Docker]]`** going forward; always path-qualify.\n\nThe preferred pattern is #1: keep canonical content in `Zettelkasten\u002F`, make `work\u002Fz\u002F` a tiny redirect stub.\n\n## Detection\n\n```bash\n# Build a set of note basenames\nfd -e md -x basename {} .md\n\n# Find all wikilinks\nrg -o '\\[\\[([^\\]|#]+)' --no-filename --glob '*.md'\n\n# Broken links: pipe the above through comm(1) against the basename set\n```\n\nA more accurate scan uses the `links.analyze_links` analyzer in vault-agent, which handles aliases, sections, and embeds correctly.\n\n## Offline Fallback (App Closed)\n\nThe detection methodology above is unchanged — only the **data source** changes when Obsidian (and its `obsidian` CLI \u002F live link index) is closed. The `obsidian` CLI and `vault-agent` analyzers are the **live-index** path; parsing the `.md` corpus directly with the `rg`\u002F`fd` Detection snippet above is the **deterministic headless default**, and for batch\u002Fscheduled audits it is often the better choice (reproducible, free of app\u002Findex state). `vault-frontmatter` already operates this way.\n\nParse the corpus directly:\n\n- **Frontmatter** — read each note's YAML block between the leading `---` fences; extract `tags`, `aliases`, `context`. See `vault-frontmatter` for YAML-block mechanics.\n- **Wikilinks** — match `[[Target]]`, `[[Target|Alias]]`, `[[Target#Heading]]`, `[[folder\u002FTarget]]`, and `![[embed]]`. Resolve each target to a note by **basename**, then **relative path**, then **alias** (from frontmatter), all **case-insensitive**. Resolve `![[embed]]` against attachments as well as notes — the attachment folder is per-vault configurable, so read it from `.obsidian\u002Fapp.json` (`attachmentFolderPath`) and fall back to the vault root \u002F `Files\u002F` only when that key is unset.\n\nA link is **broken** when its target resolves to no note after the basename → relpath → alias (case-insensitive) cascade — embeds against attachments included. A target is **ambiguous** when its basename matches 2+ notes (the cross-namespace case above). Feed the Detection snippet's output through this resolution cascade to reproduce the `unresolved` audit headlessly.\n\n## Rewriting Strategy\n\nFor a known-broken target with many references, rewrite in one commit:\n\n```\nfix(links): rewrite 44 × [[OldTopic]] → [[Topic]]\n```\n\nUse `Edit` with `replace_all=True` for the target string within each note. Don't use shell `sed` — it doesn't handle the frontmatter \u002F codeblock boundary correctly, and Edit's per-file atomicity makes the commit review straightforward.\n\nFor small-count broken targets (1–2 references each), report them and let the user decide whether to delete the link, create the note, or redirect.\n\n## Ambiguous-Target Handling\n\nNever auto-rewrite an ambiguous link. Report the ambiguity with both candidates and ask the user which resolution they want:\n\n```\n[[Docker]] in Zettelkasten\u002FKubernetes.md → candidates:\n  a) Zettelkasten\u002FDocker.md\n  b) work\u002Fz\u002FDocker.md (redirect stub)\n```\n\n## Safety\n\n- Never rewrite links inside code blocks or YAML frontmatter.\n- Never auto-create missing target notes — that's a content decision, not a maintenance one.\n- Preserve the alias form: `[[Ansible|my ansible]]` → `[[Ansible|my ansible]]`, not `[[Ansible]]`.\n\n## Related Skills\n\n- **vault-orphans** — notes with no links at all\n- **vault-mocs** — structured outgoing-link hubs\n- **search-discovery** — runtime link traversal via Obsidian CLI\n","# Wikilink Integrity\n\n## When to Use This Skill\n\n| Use this skill when... | Use the alternative instead when... |\n|---|---|\n| Repairing broken `[[Target]]` wikilinks after a note rename or move | Discovering which links Obsidian flags as unresolved in the first place — use `search-discovery` |\n| Resolving cross-namespace ambiguity between `Zettelkasten\u002F` and `work\u002Fz\u002F` notes | Reorganising or merging the work-namespace stub itself — use `vault-stubs` |\n| Unqualifying path-prefixed `[[Kanban\u002FX]]` links to bare basenames | Reconnecting orphan notes that have no links at all — use `vault-orphans` |\n\nObsidian resolves `[[Target]]` by looking for a note whose basename is `Target.md` anywhere in the vault. Links break silently when a note is renamed, moved, or was never created. Ambiguity arises when two notes share a basename.\n\n## Link Syntax\n\n```markdown\n[[Note Name]]                      # basename resolution\n[[Note Name|Alias]]                # custom display text\n[[Note Name#Section heading]]      # deep link to heading\n[[folder\u002FNote Name]]               # path-qualified (usually unnecessary)\n![[Image.png]]                     # embed (image, note, PDF)\n```\n\n## Resolution Rules\n\n1. **Unqualified target** (`[[Docker]]`) resolves to any note with basename `Docker.md`. If two exist (e.g. `Zettelkasten\u002FDocker.md` and `work\u002Fz\u002FDocker.md`), Obsidian picks one non-deterministically — ambiguous.\n2. **Path-qualified target** (`[[Kanban\u002FMain]]`) resolves to `Kanban\u002FMain.md` exactly — no basename fallback.\n3. **Embeds** (`![[X]]`) follow the same resolution. Image embeds typically target files under `Files\u002F`.\n\n## Common Breakage Patterns\n\n| Pattern | Fix |\n|---------|-----|\n| `[[OldTopic]]` × many → note doesn't exist | Rewrite to `[[Topic]]` (the actual note) |\n| `[[Development MOC]]` → note was renamed | Rewrite to `[[Development Workflows and Tools MOC]]` |\n| `[[Kanban\u002FX]]` → works but path-qualified is brittle | Rewrite to `[[X]]` when basename is unique |\n| `[[code]]`, `[[project]]` → never were real notes | These were inline-tag syntax errors; delete the link and leave plain text |\n| `[[Gen AI  Some Idea]]` (double space) | Fix the extra whitespace in the link |\n\n## Cross-Namespace Ambiguity\n\nWhen two notes share a basename (e.g. `Docker.md` in both `Zettelkasten\u002F` and `work\u002Fz\u002F`), every `[[Docker]]` in the vault becomes ambiguous. Options:\n\n1. **Rename one** so they stop colliding (`work\u002Fz\u002FDocker.md` → keep as redirect stub; content lives in `Zettelkasten\u002FDocker.md`).\n2. **Path-qualify the links** that should resolve to the non-canonical copy: `[[work\u002Fz\u002FDocker]]`.\n3. **Never use bare `[[Docker]]`** going forward; always path-qualify.\n\nThe preferred pattern is #1: keep canonical content in `Zettelkasten\u002F`, make `work\u002Fz\u002F` a tiny redirect stub.\n\n## Detection\n\n```bash\n# Build a set of note basenames\nfd -e md -x basename {} .md\n\n# Find all wikilinks\nrg -o '\\[\\[([^\\]|#]+)' --no-filename --glob '*.md'\n\n# Broken links: pipe the above through comm(1) against the basename set\n```\n\nA more accurate scan uses the `links.analyze_links` analyzer in vault-agent, which handles aliases, sections, and embeds correctly.\n\n## Offline Fallback (App Closed)\n\nThe detection methodology above is unchanged — only the **data source** changes when Obsidian (and its `obsidian` CLI \u002F live link index) is closed. The `obsidian` CLI and `vault-agent` analyzers are the **live-index** path; parsing the `.md` corpus directly with the `rg`\u002F`fd` Detection snippet above is the **deterministic headless default**, and for batch\u002Fscheduled audits it is often the better choice (reproducible, free of app\u002Findex state). `vault-frontmatter` already operates this way.\n\nParse the corpus directly:\n\n- **Frontmatter** — read each note's YAML block between the leading `---` fences; extract `tags`, `aliases`, `context`. See `vault-frontmatter` for YAML-block mechanics.\n- **Wikilinks** — match `[[Target]]`, `[[Target|Alias]]`, `[[Target#Heading]]`, `[[folder\u002FTarget]]`, and `![[embed]]`. Resolve each target to a note by **basename**, then **relative path**, then **alias** (from frontmatter), all **case-insensitive**. Resolve `![[embed]]` against attachments as well as notes — the attachment folder is per-vault configurable, so read it from `.obsidian\u002Fapp.json` (`attachmentFolderPath`) and fall back to the vault root \u002F `Files\u002F` only when that key is unset.\n\nA link is **broken** when its target resolves to no note after the basename → relpath → alias (case-insensitive) cascade — embeds against attachments included. A target is **ambiguous** when its basename matches 2+ notes (the cross-namespace case above). Feed the Detection snippet's output through this resolution cascade to reproduce the `unresolved` audit headlessly.\n\n## Rewriting Strategy\n\nFor a known-broken target with many references, rewrite in one commit:\n\n```\nfix(links): rewrite 44 × [[OldTopic]] → [[Topic]]\n```\n\nUse `Edit` with `replace_all=True` for the target string within each note. Don't use shell `sed` — it doesn't handle the frontmatter \u002F codeblock boundary correctly, and Edit's per-file atomicity makes the commit review straightforward.\n\nFor small-count broken targets (1–2 references each), report them and let the user decide whether to delete the link, create the note, or redirect.\n\n## Ambiguous-Target Handling\n\nNever auto-rewrite an ambiguous link. Report the ambiguity with both candidates and ask the user which resolution they want:\n\n```\n[[Docker]] in Zettelkasten\u002FKubernetes.md → candidates:\n  a) Zettelkasten\u002FDocker.md\n  b) work\u002Fz\u002FDocker.md (redirect stub)\n```\n\n## Safety\n\n- Never rewrite links inside code blocks or YAML frontmatter.\n- Never auto-create missing target notes — that's a content decision, not a maintenance one.\n- Preserve the alias form: `[[Ansible|my ansible]]` → `[[Ansible|my ansible]]`, not `[[Ansible]]`.\n\n## Related Skills\n\n- **vault-orphans** — notes with no links at all\n- **vault-mocs** — structured outgoing-link hubs\n- **search-discovery** — runtime link traversal via Obsidian CLI\n",{"name":5,"created":42,"modified":43,"reviewed":43,"description":7,"allowed-tools":44,"user-invocable":38},1776384000000,1782604800000,"Read, Edit, Grep, Glob","main","bdd0582f1a2ba53d21061835bfd72d45f2f954f4","obsidian-plugin\u002Fskills\u002Fvault-wikilinks",6,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Flaurigates","Linux enthusiast, cloud engineer, neovim addict, electronics hobbyist.","2026-11-15 03:36:11",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add laurigates\u002Fclaude-plugins --skill vault-wikilinks",{"tool":59,"command":60},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill vault-wikilinks",{"tool":62,"command":63},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill vault-wikilinks","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fobsidian-plugin\u002Fskills\u002Fvault-wikilinks\u002FSKILL.md",true,[67,73,77,81,85,89,93,97,101,105,109,113,119,123,127,131,135],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"evals\u002Fevals.json","REFERENCE","参考文档",4065,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Fevals.json",{"path":74,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":75,"sourceHtmlUrl":76},"evals\u002Ffiles\u002Fcache-refresh-repo\u002FAGENTS.md",351,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ffiles\u002Fcache-refresh-repo\u002FAGENTS.md",{"path":78,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":79,"sourceHtmlUrl":80},"evals\u002Ffiles\u002Fcache-refresh-repo\u002Fbrain\u002Findex.md",53,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ffiles\u002Fcache-refresh-repo\u002Fbrain\u002Findex.md",{"path":82,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":83,"sourceHtmlUrl":84},"evals\u002Ffiles\u002Fcache-refresh-repo\u002Fbrain\u002Fplans\u002Findex.md",23,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ffiles\u002Fcache-refresh-repo\u002Fbrain\u002Fplans\u002Findex.md",{"path":86,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":87,"sourceHtmlUrl":88},"evals\u002Ffiles\u002Fcache-refresh-repo\u002FREADME.md",471,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ffiles\u002Fcache-refresh-repo\u002FREADME.md",{"path":90,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":91,"sourceHtmlUrl":92},"evals\u002Ffiles\u002Fduplicate-avoidance\u002Fbrain\u002Fsagas\u002Flabel-copy\u002FPROGRESS.md",228,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ffiles\u002Fduplicate-avoidance\u002Fbrain\u002Fsagas\u002Flabel-copy\u002FPROGRESS.md",{"path":94,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":95,"sourceHtmlUrl":96},"evals\u002Ffiles\u002Fduplicate-avoidance\u002Fbrain\u002Fsagas\u002Flabel-copy\u002FSAGA.md",459,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ffiles\u002Fduplicate-avoidance\u002Fbrain\u002Fsagas\u002Flabel-copy\u002FSAGA.md",{"path":98,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":99,"sourceHtmlUrl":100},"evals\u002Ffiles\u002Fduplicate-avoidance\u002FREADME.md",224,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ffiles\u002Fduplicate-avoidance\u002FREADME.md",{"path":102,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":103,"sourceHtmlUrl":104},"evals\u002Ffiles\u002Fresume-saga\u002Fbrain\u002Fsagas\u002Fcache-refresh-20261105\u002FPROGRESS.md",640,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ffiles\u002Fresume-saga\u002Fbrain\u002Fsagas\u002Fcache-refresh-20261105\u002FPROGRESS.md",{"path":106,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":107,"sourceHtmlUrl":108},"evals\u002Ffiles\u002Fresume-saga\u002Fbrain\u002Fsagas\u002Fcache-refresh-20261105\u002FSAGA.md",616,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ffiles\u002Fresume-saga\u002Fbrain\u002Fsagas\u002Fcache-refresh-20261105\u002FSAGA.md",{"path":110,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":111,"sourceHtmlUrl":112},"evals\u002Ffiles\u002Fresume-saga\u002Fgit-state.txt",322,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ffiles\u002Fresume-saga\u002Fgit-state.txt",{"path":114,"resourceType":115,"resourceTypeDesc":116,"sizeBytes":117,"sourceHtmlUrl":118},"evals\u002Fgrade_evals.py","SCRIPT","脚本",10580,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Fgrade_evals.py",{"path":120,"resourceType":115,"resourceTypeDesc":116,"sizeBytes":121,"sourceHtmlUrl":122},"evals\u002Ftest_grade_evals.py",8441,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Fevals\u002Ftest_grade_evals.py",{"path":124,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":125,"sourceHtmlUrl":126},"README.md",5457,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002FREADME.md",{"path":128,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":129,"sourceHtmlUrl":130},"references\u002Fcontinuing-a-saga.md",3999,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Freferences\u002Fcontinuing-a-saga.md",{"path":132,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":133,"sourceHtmlUrl":134},"references\u002Fsaga-spec-template.md",6618,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Freferences\u002Fsaga-spec-template.md",{"path":136,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":137,"sourceHtmlUrl":138},"references\u002Fvalidation-strategies.md",4782,"https:\u002F\u002Fgithub.com\u002Fjapurcell\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdefault\u002Fsaga\u002Freferences\u002Fvalidation-strategies.md",[140,168,187,203,225,255],{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":151,"publishedAt":37},"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",[146],{"categoryNo":147,"categoryName":148,"taxonomyType":149,"taxonomyTypeDesc":150},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[152,153,154,155,156,157,158,159,160,161,30,23,162,163,164,165,166,167,21,32],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","Bash","file","text","with","xdg","via",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":174,"publishedAt":37},"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",[],[155,175,176,177,28,178,23,162,179,180,181,21,32,182,31,183,184,185,186,30],"kitty session persistence","session","persistence","snapshots","uname","reboot","terminal","write","snapshot","macos","sessions","restore",{"skillNo":188,"name":189,"nameZh":6,"description":190,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":191,"categories":192,"keywords":193,"publishedAt":37},"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",[],[194,195,155,196,197,157,198,199,158,200,201,30,23,202,162,164,165,181,21,32],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":204,"name":205,"nameZh":6,"description":206,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":207,"categories":208,"keywords":209,"publishedAt":37},"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",[],[210,211,212,213,214,25,215,216,217,218,30,23,162,219,163,220,221,222,223,224],"docs reference check","check","reference check","reference","docs","python3","repo","files","auto","drift","lint","wiring","chezmoi","references","cp",{"skillNo":226,"name":227,"nameZh":6,"description":228,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":229,"categories":230,"keywords":240,"publishedAt":37},"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",[231,234,235],{"categoryNo":232,"categoryName":233,"taxonomyType":149,"taxonomyTypeDesc":150},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":147,"categoryName":148,"taxonomyType":149,"taxonomyTypeDesc":150},{"categoryNo":236,"categoryName":237,"taxonomyType":238,"taxonomyTypeDesc":239},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[241,242,243,244,215,245,32,246,31,247,248,249,30,162,163,250,251,23,252,253,254,167,21],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":256,"name":257,"nameZh":6,"description":258,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":259,"categories":260,"keywords":264,"publishedAt":37},"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",[261],{"categoryNo":262,"categoryName":263,"taxonomyType":149,"taxonomyTypeDesc":150},"01JBSEEDCAT000000000000023","Skill与智能体开发",[265,266,267,268,243,244,269,270,271,272,273,32,274,275,276,277,30,278,23,165,279,21],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]