[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C6DSKC93FKASC8WTMA8ASZ":3,"skill-same:01M6C6DSKC93FKASC8WTMA8ASZ":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":18,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6C6DSKC93FKASC8WTMA8ASZ","install-native-hooks",null,"Install opt-in taskwarrior native on-add\u002Fon-modify\u002Fon-exit hooks: auto-stamp project, enforce claims, batch GitHub sync, maintain coworker markers. Use when hardening a local taskwarrior store.","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\u002Ftaskwarrior-plugin\u002Fskills\u002Finstall-native-hooks\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"native","install","hooks","install native hooks","opt","uninstall","when","markers","project","local","preview","enforce","maintain","task","exit","auto","use","read","check","Bash","hardening","batch","sync","github","2026-11-10 10:12:30",false,"---\nname: install-native-hooks\ndescription: \"Install opt-in taskwarrior native on-add\u002Fon-modify\u002Fon-exit hooks: auto-stamp project, enforce claims, batch GitHub sync, maintain coworker markers. Use when hardening a local taskwarrior store.\"\nargs: \"[--check] [--uninstall]\"\nallowed-tools: Bash(task *), Bash(bash *), Read, TodoWrite\nargument-hint: optional --check (preview) or --uninstall\ncreated: 2026-06-20\nmodified: 2026-06-28\nreviewed: 2026-06-28\n---\n\n# \u002Ftaskwarrior:install-native-hooks\n\nInstall the plugin's **opt-in** taskwarrior native hooks into the user's\ntaskwarrior hooks directory (`\u003Cdata.location>\u002Fhooks\u002F`). These are taskwarrior's\nown `on-add` \u002F `on-modify` \u002F `on-exit` hooks — distinct from Claude Code hooks —\nand run on every local `task add` \u002F `task modify` \u002F `task` exit, regardless of\nwhether the change came from a plugin skill.\n\nThis skill writes to the user's global taskwarrior config and is **strictly\nopt-in**: it runs only when the user explicitly invokes it. Nothing else in the\nplugin (no SessionStart hook, no `chezmoi apply`) installs these.\n\n## When to Use This Skill\n\n| Use this skill when...                                                      | Use a sibling skill instead when...                              |\n| --------------------------------------------------------------------------- | ---------------------------------------------------------------- |\n| Hardening a local store so every `task add` gets auto-stamped + tag-checked | Closing stale issue\u002FPR trackers — use `task-reconcile`           |\n| You want the hyphenated-tag warning enforced outside the plugin skills      | Filing or claiming a single task — use `task-add` \u002F `task-claim` |\n\n## What gets installed\n\n| Hook | Fires on | Behaviour |\n| ---- | -------- | --------- |\n\n| `on-add-taskwarrior-plugin` | `task add` | Auto-stamps `project` from the git toplevel \u002F cwd basename when unset; auto-links the `ghid` UDA from a trailing `#N` in the description when unset (pure text, no network); warns (never rejects) on a hyphenated `+tag` in the description (the form taskwarrior mis-parses) |\n| `on-modify-taskwarrior-plugin` | `modify` \u002F `annotate` \u002F `done` \u002F `start` \u002F `stop` | Stamps claim identity (`agent`\u002F`host`\u002F`branch`\u002F`worktree`) when a task goes `+ACTIVE` without it (so a bare `task start` still carries the UDAs `\u002Fgit:coworker-check` reads); warns on a claim takeover (`agent` change); expires a stale claim (drops `+ACTIVE` + drains identity when `start` exceeds the TTL); warns on a hyphenated tag in the modified description |\n| `on-exit-taskwarrior-plugin` | every `task` exit (sees the whole changeset) | **Batches GitHub sync** — queues the UUID of each touched task carrying a `ghid`\u002F`ghpr` linkage UDA to `\u003Cdata>\u002Fclaude-plugin-ghsync.queue`; a SessionStart drain (`scripts\u002Fdrain-ghsync-queue.sh`, run by the drift probe) resolves them in one batched `task export`, busts the drift-probe TTL cache for the affected projects so the next stale-check re-polls in one batched `gh` pass, and clears the queue. **Maintains the coworker marker** — for a touched task carrying `pid`+`worktree`, writes `\u003Cgit-dir>\u002F.claude-session-\u003Cpid>` when it goes `+ACTIVE` without one (skip-if-exists, so the skill marker is never clobbered) and removes a now-stale marker after a raw stop\u002Fdone |\n\nAll three **fail open** — on any error (missing `jq`, bad JSON) they pass the\ntask through unchanged and exit 0, so a broken hook never blocks `task add`. The\non-exit hook's stdout is advisory feedback only; its exit code is ignored.\n\nThe on-modify stale-claim expiry is tunable from the environment (native hooks\ninherit the caller's shell):\n\n| Variable                             | Default   | Effect                                                                          |\n| ------------------------------------ | --------- | ------------------------------------------------------------------------------- |\n| `CLAUDE_TASKWARRIOR_CLAIM_TTL_HOURS` | `4`       | Age (hours) past which a still-`+ACTIVE` task is expired on next touch          |\n| `CLAUDE_TASKWARRIOR_NO_CLAIM_EXPIRY` | _(unset)_ | Set to `1` to disable stale-claim expiry entirely (stamping + warnings stay on) |\n\nExpiry is **opportunistic** — it fires when a stale claim is touched by any\nmodify, not as a guaranteed background sweep. The deterministic dead-PID release\n(laurigates\u002Fclaude-plugins#1792) and scheduled reconcile (#1793) cover the\nnot-touched case.\n\nThe on-exit hook is likewise tunable from the environment:\n\n| Variable                              | Default                                   | Effect                                                            |\n| ------------------------------------- | ----------------------------------------- | ---------------------------------------------------------------- |\n| `CLAUDE_TASKWARRIOR_GHSYNC_QUEUE`     | `\u003Cdata.location>\u002Fclaude-plugin-ghsync.queue` | Path of the batch gh-sync queue file                          |\n| `CLAUDE_TASKWARRIOR_NO_GHSYNC_QUEUE`  | _(unset)_                                 | Set to `1` to disable the gh-sync queue (and its drain) entirely |\n| `CLAUDE_TASKWARRIOR_NO_MARKER_UPKEEP` | _(unset)_                                 | Set to `1` to disable coworker-marker upkeep entirely            |\n\n> **on-exit has no before-image.** Unlike on-modify (which sees the original and\n> modified task), on-exit receives only the final state of each changed task. So\n> \"linkage changed\" is approximated as \"a touched task carries a `ghid`\u002F`ghpr`\",\n> and marker upkeep keys on the task's `pid` UDA (a taskwarrior subprocess has no\n> live agent PID of its own). A pure raw `task start` on a never-claimed task\n> carries no `pid`, so its marker is left to `\u002Ftaskwarrior:task-claim`.\n\n> **`task import` bypasses native hooks.** Taskwarrior does **not** run\n> `on-add`\u002F`on-modify` hooks during `task import`. So `\u002Ftaskwarrior:task-reconcile`'s\n> bulk close path (which uses `task import`) is unaffected by these hooks — they\n> complement reconciliation, they do not gate it.\n\n## Context\n\n- Task CLI available: !`task --version`\n\n## Parameters\n\nParse `$ARGUMENTS`:\n\n- `--check` — report which hooks are present without installing.\n- `--uninstall` — remove the plugin's hooks.\n\n## Execution\n\nExecute this install workflow:\n\n### Step 1: Preview\n\nRun the installer in check mode to show the resolved hooks directory and current\nstate:\n\n```bash\nbash \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Finstall-hooks.sh\" --check --templates-dir \"${CLAUDE_SKILL_DIR}\u002Ftemplates\"\n```\n\nRead `HOOKS_DIR=` and the per-hook `present`\u002F`absent` lines.\n\n### Step 2: Confirm\n\nBecause this writes to the user's global taskwarrior config, confirm with\n**AskUserQuestion** (not a freeform prompt — see\n`.claude\u002Frules\u002Fskill-execution-structure.md`): show the hooks dir and the three\nhooks, and offer install \u002F cancel. Skip the confirm only if `--check` or\n`--uninstall` was passed.\n\n### Step 3: Install (or uninstall)\n\nOn confirmation:\n\n```bash\nbash \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Finstall-hooks.sh\" --templates-dir \"${CLAUDE_SKILL_DIR}\u002Ftemplates\"\n```\n\nFor `--uninstall`:\n\n```bash\nbash \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Finstall-hooks.sh\" --uninstall --templates-dir \"${CLAUDE_SKILL_DIR}\u002Ftemplates\"\n```\n\n### Step 4: Verify and report\n\nConfirm the hooks are executable and exercise them safely in a scratch store —\nadd a throwaway task with no project and a hyphenated tag, confirm the project is\nstamped and the warning prints, then delete it.\n\n> Smoke test (blockquoted so the tag-lint skips the intentionally-broken tag):\n> `TASKDATA=\"$(mktemp -d)\" task add \"smoke +bad-tag test\"` — the on-add hook\n> stamps `project` and prints the hyphenated-tag warning. Remove the scratch dir\n> afterwards.\n\nReport `INSTALLED=` \u002F `REMOVED=`, the hooks dir, and a reminder that the hooks\nfail open and are bypassed by `task import`.\n\n## Agentic Optimizations\n\n| Context           | Command                                                               |\n| ----------------- | --------------------------------------------------------------------- |\n| Preview           | `bash scripts\u002Finstall-hooks.sh --check --templates-dir templates`     |\n| Install           | `bash scripts\u002Finstall-hooks.sh --templates-dir templates`             |\n| Uninstall         | `bash scripts\u002Finstall-hooks.sh --uninstall --templates-dir templates` |\n| Resolve hooks dir | `task _get rc.data.location` → `\u003Cthat>\u002Fhooks`                         |\n\n## Quick Reference\n\n| Flag          | Purpose                                     |\n| ------------- | ------------------------------------------- |\n| _(none)_      | Confirm, then install all three hooks       |\n| `--check`     | Report hooks dir + present\u002Fabsent, no write |\n| `--uninstall` | Remove the plugin's hooks                   |\n\n## Related\n\n- `\u002Ftaskwarrior:task-reconcile` — bulk close uses `task import`, which bypasses these native hooks (by design)\n- `\u002Ftaskwarrior:task-add` — the skill that already stamps project + warns on hyphenated tags; these hooks extend that to ad-hoc `task add`\n- `scripts\u002Flint-taskwarrior-tags.sh` — the docs-side guard for the same hyphenated-tag class\n- `.claude\u002Frules\u002Fskill-execution-structure.md` — AskUserQuestion confirmation gate\n","# \u002Ftaskwarrior:install-native-hooks\n\nInstall the plugin's **opt-in** taskwarrior native hooks into the user's\ntaskwarrior hooks directory (`\u003Cdata.location>\u002Fhooks\u002F`). These are taskwarrior's\nown `on-add` \u002F `on-modify` \u002F `on-exit` hooks — distinct from Claude Code hooks —\nand run on every local `task add` \u002F `task modify` \u002F `task` exit, regardless of\nwhether the change came from a plugin skill.\n\nThis skill writes to the user's global taskwarrior config and is **strictly\nopt-in**: it runs only when the user explicitly invokes it. Nothing else in the\nplugin (no SessionStart hook, no `chezmoi apply`) installs these.\n\n## When to Use This Skill\n\n| Use this skill when...                                                      | Use a sibling skill instead when...                              |\n| --------------------------------------------------------------------------- | ---------------------------------------------------------------- |\n| Hardening a local store so every `task add` gets auto-stamped + tag-checked | Closing stale issue\u002FPR trackers — use `task-reconcile`           |\n| You want the hyphenated-tag warning enforced outside the plugin skills      | Filing or claiming a single task — use `task-add` \u002F `task-claim` |\n\n## What gets installed\n\n| Hook | Fires on | Behaviour |\n| ---- | -------- | --------- |\n\n| `on-add-taskwarrior-plugin` | `task add` | Auto-stamps `project` from the git toplevel \u002F cwd basename when unset; auto-links the `ghid` UDA from a trailing `#N` in the description when unset (pure text, no network); warns (never rejects) on a hyphenated `+tag` in the description (the form taskwarrior mis-parses) |\n| `on-modify-taskwarrior-plugin` | `modify` \u002F `annotate` \u002F `done` \u002F `start` \u002F `stop` | Stamps claim identity (`agent`\u002F`host`\u002F`branch`\u002F`worktree`) when a task goes `+ACTIVE` without it (so a bare `task start` still carries the UDAs `\u002Fgit:coworker-check` reads); warns on a claim takeover (`agent` change); expires a stale claim (drops `+ACTIVE` + drains identity when `start` exceeds the TTL); warns on a hyphenated tag in the modified description |\n| `on-exit-taskwarrior-plugin` | every `task` exit (sees the whole changeset) | **Batches GitHub sync** — queues the UUID of each touched task carrying a `ghid`\u002F`ghpr` linkage UDA to `\u003Cdata>\u002Fclaude-plugin-ghsync.queue`; a SessionStart drain (`scripts\u002Fdrain-ghsync-queue.sh`, run by the drift probe) resolves them in one batched `task export`, busts the drift-probe TTL cache for the affected projects so the next stale-check re-polls in one batched `gh` pass, and clears the queue. **Maintains the coworker marker** — for a touched task carrying `pid`+`worktree`, writes `\u003Cgit-dir>\u002F.claude-session-\u003Cpid>` when it goes `+ACTIVE` without one (skip-if-exists, so the skill marker is never clobbered) and removes a now-stale marker after a raw stop\u002Fdone |\n\nAll three **fail open** — on any error (missing `jq`, bad JSON) they pass the\ntask through unchanged and exit 0, so a broken hook never blocks `task add`. The\non-exit hook's stdout is advisory feedback only; its exit code is ignored.\n\nThe on-modify stale-claim expiry is tunable from the environment (native hooks\ninherit the caller's shell):\n\n| Variable                             | Default   | Effect                                                                          |\n| ------------------------------------ | --------- | ------------------------------------------------------------------------------- |\n| `CLAUDE_TASKWARRIOR_CLAIM_TTL_HOURS` | `4`       | Age (hours) past which a still-`+ACTIVE` task is expired on next touch          |\n| `CLAUDE_TASKWARRIOR_NO_CLAIM_EXPIRY` | _(unset)_ | Set to `1` to disable stale-claim expiry entirely (stamping + warnings stay on) |\n\nExpiry is **opportunistic** — it fires when a stale claim is touched by any\nmodify, not as a guaranteed background sweep. The deterministic dead-PID release\n(laurigates\u002Fclaude-plugins#1792) and scheduled reconcile (#1793) cover the\nnot-touched case.\n\nThe on-exit hook is likewise tunable from the environment:\n\n| Variable                              | Default                                   | Effect                                                            |\n| ------------------------------------- | ----------------------------------------- | ---------------------------------------------------------------- |\n| `CLAUDE_TASKWARRIOR_GHSYNC_QUEUE`     | `\u003Cdata.location>\u002Fclaude-plugin-ghsync.queue` | Path of the batch gh-sync queue file                          |\n| `CLAUDE_TASKWARRIOR_NO_GHSYNC_QUEUE`  | _(unset)_                                 | Set to `1` to disable the gh-sync queue (and its drain) entirely |\n| `CLAUDE_TASKWARRIOR_NO_MARKER_UPKEEP` | _(unset)_                                 | Set to `1` to disable coworker-marker upkeep entirely            |\n\n> **on-exit has no before-image.** Unlike on-modify (which sees the original and\n> modified task), on-exit receives only the final state of each changed task. So\n> \"linkage changed\" is approximated as \"a touched task carries a `ghid`\u002F`ghpr`\",\n> and marker upkeep keys on the task's `pid` UDA (a taskwarrior subprocess has no\n> live agent PID of its own). A pure raw `task start` on a never-claimed task\n> carries no `pid`, so its marker is left to `\u002Ftaskwarrior:task-claim`.\n\n> **`task import` bypasses native hooks.** Taskwarrior does **not** run\n> `on-add`\u002F`on-modify` hooks during `task import`. So `\u002Ftaskwarrior:task-reconcile`'s\n> bulk close path (which uses `task import`) is unaffected by these hooks — they\n> complement reconciliation, they do not gate it.\n\n## Context\n\n- Task CLI available: !`task --version`\n\n## Parameters\n\nParse `$ARGUMENTS`:\n\n- `--check` — report which hooks are present without installing.\n- `--uninstall` — remove the plugin's hooks.\n\n## Execution\n\nExecute this install workflow:\n\n### Step 1: Preview\n\nRun the installer in check mode to show the resolved hooks directory and current\nstate:\n\n```bash\nbash \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Finstall-hooks.sh\" --check --templates-dir \"${CLAUDE_SKILL_DIR}\u002Ftemplates\"\n```\n\nRead `HOOKS_DIR=` and the per-hook `present`\u002F`absent` lines.\n\n### Step 2: Confirm\n\nBecause this writes to the user's global taskwarrior config, confirm with\n**AskUserQuestion** (not a freeform prompt — see\n`.claude\u002Frules\u002Fskill-execution-structure.md`): show the hooks dir and the three\nhooks, and offer install \u002F cancel. Skip the confirm only if `--check` or\n`--uninstall` was passed.\n\n### Step 3: Install (or uninstall)\n\nOn confirmation:\n\n```bash\nbash \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Finstall-hooks.sh\" --templates-dir \"${CLAUDE_SKILL_DIR}\u002Ftemplates\"\n```\n\nFor `--uninstall`:\n\n```bash\nbash \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Finstall-hooks.sh\" --uninstall --templates-dir \"${CLAUDE_SKILL_DIR}\u002Ftemplates\"\n```\n\n### Step 4: Verify and report\n\nConfirm the hooks are executable and exercise them safely in a scratch store —\nadd a throwaway task with no project and a hyphenated tag, confirm the project is\nstamped and the warning prints, then delete it.\n\n> Smoke test (blockquoted so the tag-lint skips the intentionally-broken tag):\n> `TASKDATA=\"$(mktemp -d)\" task add \"smoke +bad-tag test\"` — the on-add hook\n> stamps `project` and prints the hyphenated-tag warning. Remove the scratch dir\n> afterwards.\n\nReport `INSTALLED=` \u002F `REMOVED=`, the hooks dir, and a reminder that the hooks\nfail open and are bypassed by `task import`.\n\n## Agentic Optimizations\n\n| Context           | Command                                                               |\n| ----------------- | --------------------------------------------------------------------- |\n| Preview           | `bash scripts\u002Finstall-hooks.sh --check --templates-dir templates`     |\n| Install           | `bash scripts\u002Finstall-hooks.sh --templates-dir templates`             |\n| Uninstall         | `bash scripts\u002Finstall-hooks.sh --uninstall --templates-dir templates` |\n| Resolve hooks dir | `task _get rc.data.location` → `\u003Cthat>\u002Fhooks`                         |\n\n## Quick Reference\n\n| Flag          | Purpose                                     |\n| ------------- | ------------------------------------------- |\n| _(none)_      | Confirm, then install all three hooks       |\n| `--check`     | Report hooks dir + present\u002Fabsent, no write |\n| `--uninstall` | Remove the plugin's hooks                   |\n\n## Related\n\n- `\u002Ftaskwarrior:task-reconcile` — bulk close uses `task import`, which bypasses these native hooks (by design)\n- `\u002Ftaskwarrior:task-add` — the skill that already stamps project + warns on hyphenated tags; these hooks extend that to ad-hoc `task add`\n- `scripts\u002Flint-taskwarrior-tags.sh` — the docs-side guard for the same hyphenated-tag class\n- `.claude\u002Frules\u002Fskill-execution-structure.md` — AskUserQuestion confirmation gate\n",{"args":48,"name":5,"created":49,"modified":50,"reviewed":50,"description":7,"allowed-tools":51,"argument-hint":52},"[--check] [--uninstall]",1781913600000,1782604800000,"Bash(task *), Bash(bash *), Read, TodoWrite","optional --check (preview) or --uninstall","main","bdd0582f1a2ba53d21061835bfd72d45f2f954f4","taskwarrior-plugin\u002Fskills\u002Finstall-native-hooks",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":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add laurigates\u002Fclaude-plugins --skill install-native-hooks",{"tool":67,"command":68},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill install-native-hooks",{"tool":70,"command":71},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill install-native-hooks","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftaskwarrior-plugin\u002Fskills\u002Finstall-native-hooks\u002FSKILL.md",true,[75,81,85,89,93,99,103],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"scripts\u002Finstall-hooks.sh","SCRIPT","脚本",3170,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftaskwarrior-plugin\u002Fskills\u002Finstall-native-hooks\u002Fscripts\u002Finstall-hooks.sh",{"path":82,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":83,"sourceHtmlUrl":84},"scripts\u002Ftests\u002Ftest-on-add-hook.sh",3428,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftaskwarrior-plugin\u002Fskills\u002Finstall-native-hooks\u002Fscripts\u002Ftests\u002Ftest-on-add-hook.sh",{"path":86,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":87,"sourceHtmlUrl":88},"scripts\u002Ftests\u002Ftest-on-exit-hook.sh",7365,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftaskwarrior-plugin\u002Fskills\u002Finstall-native-hooks\u002Fscripts\u002Ftests\u002Ftest-on-exit-hook.sh",{"path":90,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":91,"sourceHtmlUrl":92},"scripts\u002Ftests\u002Ftest-on-modify-hook.sh",6547,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftaskwarrior-plugin\u002Fskills\u002Finstall-native-hooks\u002Fscripts\u002Ftests\u002Ftest-on-modify-hook.sh",{"path":94,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":97,"sourceHtmlUrl":98},"templates\u002Fon-add-taskwarrior-plugin","OTHER","其他",2979,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftaskwarrior-plugin\u002Fskills\u002Finstall-native-hooks\u002Ftemplates\u002Fon-add-taskwarrior-plugin",{"path":100,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":101,"sourceHtmlUrl":102},"templates\u002Fon-exit-taskwarrior-plugin",8352,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftaskwarrior-plugin\u002Fskills\u002Finstall-native-hooks\u002Ftemplates\u002Fon-exit-taskwarrior-plugin",{"path":104,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":105,"sourceHtmlUrl":106},"templates\u002Fon-modify-taskwarrior-plugin",6313,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftaskwarrior-plugin\u002Fskills\u002Finstall-native-hooks\u002Ftemplates\u002Fon-modify-taskwarrior-plugin",[108,136,157,173,194,224],{"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":119,"publishedAt":43},"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":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[120,121,122,123,124,125,126,127,128,129,35,25,38,130,131,132,133,134,135,36],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","file","text","with","xdg","via","2026",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":43},"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",[],[123,143,144,145,146,147,25,38,148,149,150,135,36,151,152,153,154,155,156,35],"kitty session persistence","session","persistence","false","snapshots","uname","reboot","terminal","write","edit","snapshot","macos","sessions","restore",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":163,"publishedAt":43},"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",[],[164,165,123,166,167,125,168,169,126,170,171,35,25,172,38,131,132,150,135,36],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":179,"publishedAt":43},"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",[],[180,37,181,182,183,184,185,186,187,34,35,25,38,188,130,189,190,191,192,193],"docs reference check","reference check","reference","docs","links","python3","repo","files","drift","lint","wiring","chezmoi","references","cp",{"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":209,"publishedAt":43},"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",[200,203,204],{"categoryNo":201,"categoryName":202,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":115,"categoryName":116,"taxonomyType":117,"taxonomyTypeDesc":118},{"categoryNo":205,"categoryName":206,"taxonomyType":207,"taxonomyTypeDesc":208},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[210,211,212,213,185,214,36,215,152,216,217,218,35,38,130,219,220,25,221,222,223,134,135],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":225,"name":226,"nameZh":6,"description":227,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":228,"categories":229,"keywords":233,"publishedAt":43},"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",[230],{"categoryNo":231,"categoryName":232,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000023","Skill与智能体开发",[234,235,236,237,212,213,238,239,240,241,242,36,243,244,245,246,35,247,25,132,248,135],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]