Files
claude/skills/profile/SKILL.md
T
bastien f83f8f755b feat(profiles): prune the gstack catalog, add max, honor a removed denylist
Nine gstack skills leave every profile (ship is trunk-based on Gitea,
land-and-deploy auto-merges and deploys, setup-deploy, autoplan reads
paths that do not exist here, context-save has no restore, learn is an
unused parallel store, careful and guard hooks never fired, design-shotgun
needs an absent OpenAI key). lib/gstack-removed.sh is the single denylist;
profile.sh gstack on and toggle-external.sh enable gstack skip it.

full now carries everything every other profile carries (user rule), minus
the parked make-pdf, diagram and 21st-ai/ui-explore/ui-review, which live
in the new max profile together with pr-review-toolkit. The 21st trio also
leaves web, web-full and design (redundant with impeccable + ui-ux-pro-max).

lib/tests/profile-census.test.sh asserts the invariants live and on a
baseline fixture plus one mutant per invariant; gstack-removed.test.sh
covers both restore paths.
2026-09-28 11:48:44 +02:00

8.1 KiB

name, description, argument-hint, allowed-tools
name description argument-hint 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 | gstack on|off | diff <a> <b>
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
full Default — everything the other profiles carry, minus broken or doctrine-breaking gstack
max Everything — full + parked tools (make-pdf, diagram, 21st generation trio) + pr-review-toolkit
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 advisory — prints manual claude mcp add … command (no server is managed today: MANAGED_MCPS is empty since 21st.dev moved to a CLI)
cli advisory only — reports installed/not-installed

Always-on plugins (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. Managed externals (emil-design-eng, frontend-design, design-motion-principles, impeccable, and the five 21st design skills 21st-ui-build, 21st-ui-explore, 21st-ui-review, 21st-cli-use, 21st-ai) follow the same symmetry (BDR-079): set enables them when the profile lists them (from parked state, or from skills-external/ if the symlink never existed) and parks them when it does not — e.g. set backend after design work turns emil and the 21st pack off. darwin-skill, 21st-registry, 21st-design-sync and any other unlisted external are never auto-touched. gstack works the same all the way down: a profile listing gstack skills while the whole pack is off (via toggle-external.sh) re-enables JUST those skills on demand.

Default profile: full is in force whenever .active-profile is absent, empty, or the legacy none (statusline, current, gstack off, reset all resolve it the same way). reset applies it (set full, exclusive); a fresh make plugin applies it too when nothing has ever been selected.

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>

# Report the active profile (label + match %)
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>

# Go to the default profile (full) — exclusive, same as `set full`
bash "$HOME/.claude/lib/profile.sh" reset

# Toggle gstack only, keeping the active-profile label intact
bash "$HOME/.claude/lib/profile.sh" gstack on    # restore parked gstack skills on top of the current profile
bash "$HOME/.claude/lib/profile.sh" gstack off   # disable gstack skills not in the active profile

# 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

Failure modes

Trigger First move If still stuck
lib/profile.sh absent (foreign machine, links broken) test -f "$HOME/.claude/lib/profile.sh" before any verb; missing → propose bash link.sh from the config repo STOP — never hand-move symlinks to emulate the script
Unknown profile name (rc=1, ✗ Profile not found) Show list output + the closest existing name ("desing → did you mean design?") Let the user pick — never guess-and-set
Unknown verb (rc=1 + usage) Re-map the request to the argument-hint verbs, retry once Show usage, ask
set/apply exits nonzero MID-TOGGLE (permission, plugin CLI failure) State may be PARTIAL. Run current to show what actually took; name the failed item from the script's output run current, then re-run set <name> or reset (both are full exclusive applies, not an always-safe undo)
Plugin/MCP leg fails (marketplace/network) while symlink leg succeeded Report the split state explicitly + print the manual claude plugin/claude mcp command for the failed leg —
current names a profile other than the one just set Cache (.active-profile) was written by another tool or hand-edited — show the raw script output to the user Never hand-patch .active-profile — re-run set <name> (or reset) to force it back

Output policy

  • After set / apply / reset / gstack on|off: 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 %; default — not applied yet means the default profile is in force but not yet applied — point the user at reset.
  • After show: render the grouped output 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 toggle the managed Claude Code plugins (ui-ux-pro-max, plugin-dev, pr-review-toolkit) and the managed external packs (emil-design-eng, frontend-design, design-motion-principles, impeccable, the 21st design skills) — in BOTH directions: set enables what the profile lists and disables the managed leftovers it doesn't (BDR-008, BDR-079). Anything outside those allowlists stays manual: claude plugin enable|disable, bash lib/toggle-external.sh enable|disable <tool>.
  • set is destructive in the sense that it disables non-listed gstack skills. Use apply if the user wants additive behavior.