vt-t-skill-demote¶
Demote a global toolkit skill to product scope, regenerate its paths block, remove the global symlink (AD-2), and commit. Use when a global skill actually belongs to one product only.
Plugin: vt-toolkit
Category: Other
Command: /vt-t-skill-demote
Skill Demote¶
Restricts a global toolkit skill to a specific product scope.
When to Use¶
/vt-t-toolkit-reviewflagged a skill for product mismatch.- A skill marked
scope: globalshould only appear in one product's repos. - Demoting removes the
~/.claude/skills/symlink so the skill no longer auto-loads outside product repos (per AD-2).
Prerequisites¶
- Skill exists in
plugins/<plugin>/skills/<slug>/(--plugin, defaultvt-base). - Target product is registered in
intake/projects.yaml products:. - You are in the toolkit repo (or
TOOLKIT_ROOTis set).
Execution¶
Run from the toolkit repo root:
# Default plugin is vt-base:
bash plugins/vt-toolkit/skills/skill-demote/scripts/demote.sh \
vt-c-<skill-name> --to-product <ProductName>
# Any other plugin — the prefix must be that plugin's skill_prefix:
bash plugins/vt-toolkit/skills/skill-demote/scripts/demote.sh \
--plugin vt-office vt-o-<skill-name> --to-product <ProductName>
demote.sh takes --plugin <name> (default vt-base) and reads that plugin's skill_prefix
from its plugin.json, erroring if it declares none. The prefix itself is optional in the
skill-name argument. This page previously hardcoded vt-base/vt-c-, so an agent following it
never passed --plugin and could only demote base skills. The script:
1. Validates <ProductName> against intake/projects.yaml products:
2. Sets scope: product:[<ProductName>] in frontmatter
3. Runs regenerate-skill-paths.sh --write — writes the product paths block
4. Removes ~/.claude/skills/<prefix><slug> symlink (AD-2)
5. Removes <prefix><slug> -> <slug> from that plugin's manifest
6. Commits with message feat: demote <prefix><slug> to scope: product:[<ProductName>]
Edge Cases¶
- Unknown product: script aborts — add the product to
intake/projects.yaml products:first. - Symlink already absent: treated as a no-op for the remove step; commit still produced.
- Re-promote: run
/vt-t-skill-promoteagain if the skill should return to global scope.
Integration Points¶
plugins/vt-toolkit/skills/skill-promote/— forward operationplugins/vt-base/bin/regenerate-skill-paths.sh— builds paths block from projects.yamlplugins/<plugin>/.claude-plugin/skill-symlinks.manifest— entry removed- Pre-commit hook: verifies resulting paths block is current after demote
Anti-patterns¶
- Never hand-edit the AUTO-GENERATED paths block — the pre-commit hook blocks the commit. Use
--writemode to regenerate. - Don't delete skills — demote preserves history; deletion is destructive and irreversible.
Success Criteria¶
scope: product:[<ProductName>]in SKILL.md frontmatter.- AUTO-GENERATED block present with correct product glob patterns.
- No
~/.claude/skills/<prefix><slug>symlink (AD-2). - Manifest entry removed.
git log -1shows the demote commit.