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>
- BDR-007: Skill profiles partition gstack by usage (v1, skill-only).
Decision to ship lib/profile.sh + symlink-based toggle for skills,
with plugin/MCP entries advisory in v1. Rationale: the existing
toggle-external.sh enable|disable gstack is too coarse — it
disables checkpoint/ship/learn alongside design skills. Profiles
hide the irrelevant skills without uninstalling the gstack repo.
Alternatives rejected: forking SKILL.md to strip the gstack
preamble (re-fork on every upgrade — preamble already degrades
gracefully via `|| true`); per-skill toggle via claude plugin
enable/disable (gstack skills are not marketplace plugins);
removing symlinks (lossy if user has local edits).
- BDR-008: Profile system v2 — extend to plugins + MCPs + CLIs.
Reverses the "advisory only" stance from BDR-007 alternative #4.
User feedback: pure-skill toggling left ui-ux-pro-max/magic always
loaded regardless of profile, so passive token cost didn't drop
enough on profile switch. Solution: real claude plugin enable/
disable for an explicit MANAGED_PLUGINS allowlist (3 entries) +
PROTECTED_PLUGINS denylist for always-on (caveman, security-
guidance, superpowers). MCP magic delegated to toggle-external.sh.
Other MCPs stay advisory because each needs specific config. Adds
4 new profiles: web, seo, web-full, backend.
- Journal: 2026-05-04 entry summarizing the v1 ship, then a follow-up
block for the v2 extension (new profiles, plugin auto-toggle, tie-
breaker for `current`).
- TODO.md: marked done — v1 (Skill profiles) section and v2 (Profile
system v2 — extension plugins/MCPs/CLIs) section, both with their
full subtask lists.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Move tasks/ into .claude/tasks/ and create .claude/memory/ with 5
persistent registries (decisions/learnings/blockers/journal/evals) plus
.claude/audits/ for audit reports. Also seed templates/memory/ for
onboarder to copy into user projects.
- tasks/TODO.md, tasks/rtk-upstream-issue.md → .claude/tasks/
- tasks/LESSONS.md deleted (empty template; superseded by learnings.md)
- .claude/memory/: 5 append-only registries with YAML schema + seed entries
- templates/memory/: 5 empty-index templates for new projects
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>