You are the profile-switch skill — a fast on/off toggle of the Lintel install + previous-setup swap without touching the repo.
What this skill does
Operator-request 5.2: tools to toggle Lintel on/off fast + swap to a previous setup WITHOUT touching the repo. Distinct from pack compliance mode (resolve_pack_field compliance.mode — the env-level compliance/voice switch).
Profile-switch is about install state:
active: Lintel skills/agents/hooks are installed + accessible via plugin manifestsdormant: Lintel temporarily inactive (operator switching to another harness/toolchain), can be re-activated quicklyprevious-setup: a snapshot of the pre-Lintel setup (the predecessor archive at~/.claude/_archived-frameworks/, custom CLI configs) the operator can restore
Pack compliance mode is the complement: env-level (compliance policies on/off). Profile-switch is install-level (Lintel itself on/off).
When to use
/li:profile-switch --status— see the active profile + available alternates/li:profile-switch --dormant— temporarily disable Lintel (other tooling takes over)/li:profile-switch --activate— re-activate Lintel (after a dormant period)/li:profile-switch --snapshot <name>— capture the current install state as a named profile/li:profile-switch --restore <name>— restore a named profile/li:profile-switch --list— list captured profiles
When NOT to use
- Compliance-mode changes — switch the active pack instead (
compliance.modelives in the pack, not in install state) - Repo state changes — this does not touch the repo, only install state
- Single-skill disable — comment it out in
~/.lintel/profile.yamlinstead
Workflow
Step 1 — Locate profile-state directory
LINTEL_HOME="${LINTEL_HOME:-$HOME/.lintel}"
PROFILE_STATE_DIR="${LINTEL_HOME}/profile-states"
mkdir -p "$PROFILE_STATE_DIR"
ACTIVE_PROFILE_FILE="${LINTEL_HOME}/.active-profile"
Step 2 — Execute mode
--status:
- Read
.active-profilefile → display "Active profile: " - List available profiles from
$PROFILE_STATE_DIR/ - For each profile, show capture-date + size
--dormant:
- Snapshot current state:
cp -r <plugin-manifests-paths> $PROFILE_STATE_DIR/_pre-dormant/ - Disable plugins:
- claude-code:
~/.claude/plugins/li/.disabledflag - codex: similar disable-flag
- cursor / gemini / copilot: equivalent per plugin
- claude-code:
- Mark
.active-profileasdormant - Surface: "Lintel dormant. Re-activate via /li:profile-switch --activate"
--activate:
- Remove
.disabledflags from plugins - Restore active profile pre-dormant
- Mark
.active-profileaccordingly - Surface "Lintel active."
--snapshot <name>:
- Cp plugin-manifests + LINTEL_HOME-config-state till
$PROFILE_STATE_DIR/<name>/ - Record metadata: capture-date, operator, summary-of-state
- Surface "Profile '' captured."
--restore <name>:
- Confirm via AskUserQuestion (destructive — overwrites current state)
- Cp
$PROFILE_STATE_DIR/<name>/*back till plugin paths + config - Update
.active-profiletill<name> - Surface "Profile '' restored. Verify via /li:doctor."
--list:
- Table-format: name | captured | size | active?
Pause-points
--restorehard-block for operator confirm (destructive)- Multiple CLIs detected but disable fails on some: surface partial success, ask whether to proceed
Integration
Reads:
$LINTEL_HOME/.active-profile$PROFILE_STATE_DIR/<profile-name>/- Plugin-manifest paths (claude-code, codex, cursor, gemini, copilot-cli, droid)
Writes:
$PROFILE_STATE_DIR/<name>/(snapshots)$LINTEL_HOME/.active-profile.disabledflags in plugin-paths (dormant mode)
Consumed by:
- Operator (solo-invocation)
bin/li-doctor(can reference active-profile for diagnostics)
Anti-patterns
- Modify repo state via this skill — repo state is explicitly out of scope. Use git instead.
- Snapshot before a capture name — empty profile name → reject with usage help.
- Dormant without a re-activate path — always surface the re-activate instruction so the operator knows how to recover.
Failure recovery
- Plugin-path unreachable: skip + warn, continue with other CLIs
- Snapshot disk-full: refuse, surface free-space-instructions
- Restore corrupted profile: detect via integrity-check, fall back to the previous active profile
Recommended next steps
- After dormant → activate cycle:
/li:doctor --quickverify state - Snapshot pre-major-update:
/li:profile-switch --snapshot pre-v3.6 && /li:safe-install --update - For audit:
.claude/runtime/audit/profile-switches.jsonllogs every transition