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>
120 lines
4.8 KiB
Markdown
120 lines
4.8 KiB
Markdown
---
|
|
name: profile
|
|
description: |
|
|
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".
|
|
argument-hint: list | show <name> | current | apply <name> | set <name> | reset | diff <a> <b>
|
|
disable-model-invocation: false
|
|
allowed-tools:
|
|
- 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
|
|
|
|
```bash
|
|
# 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
|
|
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.
|