claude/skills/profile/SKILL.md
bastien 239d91db67 feat(profile): partition skills/plugins/MCPs/CLIs by usage profile
Ship lib/profile.sh + 9 profiles in lib/profiles/. A profile is a
plain-text file listing items + types (gstack | personal | external |
plugin@<marketplace> | mcp | cli). `profile set <name>` enables the
listed items and disables the rest:

  - gstack/personal/external skills: symlink toggle skills/ ↔
    skills-disabled/ (gstack__<name> prefix to avoid collisions; no
    prefix for personal/external).
  - plugins typed `plugin@<marketplace>`: actually toggled via
    `claude plugin enable|disable <name>@<marketplace>`. Allowlist:
    MANAGED_PLUGINS = ui-ux-pro-max, plugin-dev, pr-review-toolkit.
    Denylist: PROTECTED_PLUGINS = caveman, security-guidance,
    superpowers (always-on, never disabled even if absent from a
    profile).
  - mcp magic: delegated to lib/toggle-external.sh which already
    handles the MAGIC_API_KEY env lookup. Other MCPs stay advisory.
  - cli (rtk, gsd, ctx7, graphify): status-only, never auto-installed.

Profiles shipped:
  web        public website work — frontend + content + light dev
  seo        SEO + GEO + W3C audit (search/AI indexability + a11y)
  web-full   production website end-to-end (web ∪ seo ∪ qa-only/canary)
  backend    backend / API / system dev — no design, no SEO
  design     visual QA, design systems, mockups, polish
  dev        daily code work — features, fixes, refactor, ship
  qa         site testing, perf, canary, validation
  audit      comprehensive audit — security + SEO + perf + health
  minimal    strip all gstack skills (quiet session)

Commands:
  profile list / show <name> / current / apply <name> / set <name> /
  reset / diff <a> <b>

`current` heuristic returns "full" when nothing is disabled, otherwise
picks the profile with the highest available-ratio (counts both
"enabled" and "installed" — the latter for CLIs). Tiebreaker: larger
profile total wins, so web-full beats web at a 100% tie.

`reset` re-enables every gstack skill but does NOT touch plugins —
the user re-enables a managed plugin manually or via `apply <profile>`.
This is documented in the trailing info line.

Integration:
  - skills/profile/SKILL.md — `/profile` slash command, lists profiles,
    documents the per-type mechanism, points at lib/profile.sh.
  - agents/plugin-advisor.md — DETECT phase calls `profile current`,
    OUTPUT adds a PROFILE line, and TOGGLING EXTERNAL TOOLS gains a
    "Skill profiles" section with a signal → profile recommendation
    table.
  - lib/toggle-external.sh — header pointer to profile.sh for fine-
    grained activation (toggle-external still owns whole-gstack and
    magic-MCP toggles).
  - Makefile — `make profile cmd="set <name>"`, profile-list,
    profile-current, profile-reset.

Tested end-to-end: `set web` enables ui-ux-pro-max + magic; `set seo`
disables ui-ux-pro-max; `set minimal` disables ui-ux-pro-max but
spares always-on plugins; `reset` restores all 64 skills; shellcheck
clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 02:09:28 +02:00

4.8 KiB

name description argument-hint disable-model-invocation allowed-tools
profile Partition Claude skills by purpose: design, dev, qa, audit, minimal. Toggles symlinks between skills/ and skills-disabled/ to keep only the skills relevant to the current kind of work. Trigger: "profile", "skill profile", "design profile", "qa profile", "switch to design", "set profile", "active profile", "quel profil", "profil design", "active les skills design", "désactive gstack", "réduire le bruit gstack". list | show <name> | current | apply <name> | set <name> | reset | diff <a> <b> false
Bash
Read

profile

Activate a curated subset of skills for a specific kind of work — instead of carrying every gstack + personal skill in every session.

When to invoke

  • User asks to switch profile (set design, profile dev, quel profil actif).
  • User wants to see what's in a profile (profile show qa).
  • User wants to compare profiles (profile diff design qa).
  • User asks to "reduce gstack noise" or "only design skills".

Profiles available

Profile Use case
web Public website work — frontend + content + light dev
seo SEO + GEO + W3C audit — search/AI indexability + standards
web-full Production website end-to-end — web + seo combined
backend Backend / API / system dev — no design, no SEO
design Visual QA, design systems, mockups, polish
dev Daily code work — features, fixes, refactor, ship (any stack)
qa Site testing, perf, canary, validation
audit Comprehensive audit — security + SEO + GEO + W3C + perf + health
minimal Strip all gstack skills (quiet session)

Mechanism

Each profile is a plain-text file under lib/profiles/<name>.profile that lists items + types:

Type Toggle mechanism
gstack symlink move skills/ ↔ skills-disabled/gstack__<name>
personal symlink move skills/ ↔ skills-disabled/<name> (no prefix)
external symlink move skills/ ↔ skills-disabled/<name>
plugin@<marketplace> claude plugin enable|disable <name>@<marketplace> (auto)
mcp (known: magic) delegate to lib/toggle-external.sh (uses .env)
mcp (other) advisory — prints manual claude mcp add … command
cli advisory only — reports installed/not-installed

Always-on plugins (caveman, security-guidance, superpowers) are protected — set will refuse to disable them even if the profile omits them. Managed plugins that set may disable when not in profile: ui-ux-pro-max@ui-ux-pro-max-skill, plugin-dev@claude-code-plugins, pr-review-toolkit@claude-code-plugins. Other plugins are never auto-toggled.

Commands

# List available profiles
bash "$HOME/.claude/lib/profile.sh" list

# Show profile contents + per-skill status
bash "$HOME/.claude/lib/profile.sh" show <name>

# Detect which profile is currently active
bash "$HOME/.claude/lib/profile.sh" current

# Enable skills in profile (additive — keeps others enabled)
bash "$HOME/.claude/lib/profile.sh" apply <name>

# Enable only skills in profile (disables non-listed gstack skills)
bash "$HOME/.claude/lib/profile.sh" set <name>

# Re-enable every gstack skill (undo any set/apply)
bash "$HOME/.claude/lib/profile.sh" reset

# Compare two profiles
bash "$HOME/.claude/lib/profile.sh" diff <a> <b>

Execution

Run lib/profile.sh with the user's arguments. If user passed nothing, default to list. If user named a profile without a verb (e.g. "profile design"), treat it as set <name> — but confirm first because set disables other gstack skills.

bash "$HOME/.claude/lib/profile.sh" $ARGUMENTS

Output policy

  • After set / apply / reset: show the count of skills moved + tell the user to start a new Claude session to pick up the changes (Claude scans skills/ at session start).
  • After current: report the active profile + match percentage.
  • After show: render the table directly — no extra commentary unless the user asks.

Tradeoffs to mention if asked

  • gstack skills still depend on ~/.claude/skills/gstack/bin/ for telemetry, update-check, learnings — script doesn't touch that infra. Disabled skills are just hidden from Claude Code's scanner; the gstack repo stays installed.
  • Profile changes do NOT toggle Claude Code plugins (ui-ux-pro-max, etc.) or MCP servers — those are advisory only. The user runs claude plugin enable|disable and claude mcp add|remove manually.
  • set is destructive in the sense that it disables non-listed gstack skills. Use apply if the user wants additive behavior.