Centralize gstack toggling in the `profile` command without losing the
active-profile label.
- `gstack on` re-enables ALL parked gstack skills (moves
skills-disabled/gstack__* back) but does NOT touch .active-profile,
so the user layers full gstack on top of their current profile and
the statusline label is preserved. Unlike `reset`, which clears the
label to "none".
- `gstack off` disables gstack skills not listed in the active profile;
errors cleanly when no profile is active (needs one to know what to
keep).
Refactor (behavior-preserving): extract three shared helpers
`enable_all_gstack`, `disable_gstack_not_in`, `parked_gstack_count` and
rewire `cmd_reset` + `cmd_set` to reuse them instead of duplicating the
symlink-toggle loops. Wire `gstack` into main() dispatch, usage(), and the
header usage block.
Docs: SKILL.md argument-hint, examples, and output-policy updated. The
generic `make profile cmd="gstack on"` target already covers Make usage.
Verified: shellcheck CLEAN, `bash -n` OK, 6-case test (help, bad-action,
off-with-no-profile, on, off-trim, on-cycle) with final assertion that the
live symlink state was restored exactly to its pre-test value.
Memory: capitalize BDR-018 (decision), LRN-024 (DRY helper-extraction
pattern), BLK-007 (6 gstack source skills ios-*/spec unlinked post
submodule bump — open follow-up), EVAL-002 (self-eval, false "full.profile
bug" flag corrected pre-edit). Backfill index drift: BDR-017, BLK-005/006.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.2 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 | gstack on|off | diff <a> <b> | false |
|
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 |
Maximum — web-full + plan + dev for /init-project MVP pipeline |
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) — resets active label to "none"
bash "$HOME/.claude/lib/profile.sh" reset
# Toggle gstack only, keeping the active-profile label intact
bash "$HOME/.claude/lib/profile.sh" gstack on # re-enable ALL gstack on top of 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
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 scansskills/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|disableandclaude mcp add|removemanually. setis destructive in the sense that it disables non-listed gstack skills. Useapplyif the user wants additive behavior.