---
description: Removes files installed by /optimus:init and /optimus:permissions from the project. Compares each file against plugin templates and classifies as unmodified, likely generated, or user-modified. Always asks before deleting. Git-tracked files are noted as recoverable. Tests are never touched. Monorepo and multi-repo aware. Use for clean reinstall or to stop using optimus.
disable-model-invocation: true
---

# Reset — Remove optimus-generated files

Remove files installed by `/optimus:init` and `/optimus:permissions` from the project. Does NOT uninstall the plugin itself — only removes files from the project's `.claude/` directory (and subproject docs for monorepos).

## Safety Rules

These rules are absolute and override all other instructions:

- **NEVER** touch test files, test directories, or test configuration — even if created by `/optimus:unit-test`
- **NEVER** touch files outside `.claude/`, subproject `CLAUDE.md`, subproject `docs/`, and workspace root `CLAUDE.md`
- **NEVER** delete `.claude/settings.json` without first extracting user-added content (use surgical removal — Step 4)
- **ALWAYS** show the categorized file list and get user confirmation before removing anything

## Workflow

### Step 1 — Detect project context

#### Multi-repo workspace detection

Read `$CLAUDE_PLUGIN_ROOT/skills/init/references/multi-repo-detection.md` and run the detection algorithm.

Determine project type:

- **Multi-repo workspace** — root has no `.git/`, 2+ child directories have `.git/` directories. Each child repo has its own `.claude/` directory. Workspace root may have a local `CLAUDE.md` (not version-controlled)
- **Monorepo** — single git repo with multiple subproject directories (e.g., `packages/`, `apps/`). Root has `.claude/`, subprojects may have their own `CLAUDE.md` and `docs/` directories
- **Single project** — standard single repo with `.claude/` directory

#### Check for optimus files

For **multi-repo workspaces**: enumerate all child repos and check each for `.claude/` directories. Also check for a workspace root `CLAUDE.md`. If no child repo has `.claude/` and no workspace root `CLAUDE.md` exists → inform the user "Nothing to reset — no optimus files found" → stop.

For **single project / monorepo**: check if `.claude/` directory exists. If not → inform the user "Nothing to reset — no optimus files found" → stop.

If `.claude/.optimus-version` does not exist, warn that the project may not have been initialized by optimus, but proceed with template comparison anyway.

#### Inventory optimus-managed files

Scan for all files that optimus skills may have created. Only list files that actually exist:

**Root `.claude/` directory:**
- `.claude/CLAUDE.md`
- `.claude/.optimus-version`
- `.claude/settings.json`
- `.claude/docs/coding-guidelines.md`
- `.claude/docs/testing.md`
- `.claude/docs/styling.md`
- `.claude/docs/architecture.md`
- `.claude/docs/skill-writing-guidelines.md`
- `.claude/agents/code-simplifier.md` *(legacy — from previous optimus versions)*
- `.claude/agents/test-guardian.md` *(legacy — from previous optimus versions)*
- `.claude/hooks/format-python.py`
- `.claude/hooks/format-node.js`
- `.claude/hooks/format-rust.sh`
- `.claude/hooks/format-go.sh`
- `.claude/hooks/format-csharp.sh`
- `.claude/hooks/format-java.sh`
- `.claude/hooks/format-cpp.sh`
- `.claude/hooks/format-dart.sh`
- `.claude/hooks/restrict-paths.sh`

**Monorepo subprojects** (scan for these patterns):
- `<subproject>/CLAUDE.md` — subproject overview files
- `<subproject>/docs/testing.md` — subproject testing docs
- `<subproject>/docs/styling.md` — subproject styling docs
- `<subproject>/docs/architecture.md` — subproject architecture docs

**Multi-repo workspace root:**
- `CLAUDE.md` at workspace root (local-only file)

### Step 2 — Classify each file

For each file found in Step 1, determine two things:
1. **Origin classification** — was it generated by optimus, and has it been modified?
2. **Git tracking** — is it tracked by git? (recoverable via `git checkout` if deleted)

Check git tracking by running `git ls-files --error-unmatch <file>` for each file. Note: in multi-repo workspaces, run this from the correct repo directory.

#### Classification by comparison strategy

**Verbatim templates (exact content match):**

For these files, read both the project file and the corresponding template from the plugin. If content is identical → classify as `UNMODIFIED`. If different → classify as `MODIFIED`.

| Project file | Template source |
|---|---|
| `.claude/agents/code-simplifier.md` | `$CLAUDE_PLUGIN_ROOT/agents/code-simplifier.md` *(legacy — agents now live at plugin level)* |
| `.claude/agents/test-guardian.md` | `$CLAUDE_PLUGIN_ROOT/agents/test-guardian.md` *(legacy — agents now live at plugin level)* |
| `.claude/hooks/format-python.py` | `$CLAUDE_PLUGIN_ROOT/skills/init/templates/hooks/format-python.py` |
| `.claude/hooks/format-node.js` | `$CLAUDE_PLUGIN_ROOT/skills/init/templates/hooks/format-node.js` |
| `.claude/hooks/format-rust.sh` | `$CLAUDE_PLUGIN_ROOT/skills/init/templates/hooks/format-rust.sh` |
| `.claude/hooks/format-go.sh` | `$CLAUDE_PLUGIN_ROOT/skills/init/templates/hooks/format-go.sh` |
| `.claude/hooks/format-csharp.sh` | `$CLAUDE_PLUGIN_ROOT/skills/init/templates/hooks/format-csharp.sh` |
| `.claude/hooks/format-java.sh` | `$CLAUDE_PLUGIN_ROOT/skills/init/templates/hooks/format-java.sh` |
| `.claude/hooks/format-cpp.sh` | `$CLAUDE_PLUGIN_ROOT/skills/init/templates/hooks/format-cpp.sh` |
| `.claude/hooks/format-dart.sh` | `$CLAUDE_PLUGIN_ROOT/skills/init/templates/hooks/format-dart.sh` |
| `.claude/hooks/restrict-paths.sh` | `$CLAUDE_PLUGIN_ROOT/skills/permissions/templates/hooks/restrict-paths.sh` |

**Near-exact template (coding-guidelines.md):**

The template body (everything after line 1) is verbatim — only line 1 has `[PROJECT NAME]` substituted by init. Compare the project file's content from line 2 onward against the template's content from line 2 onward. If identical → `UNMODIFIED`. If different → `MODIFIED`.

Template: `$CLAUDE_PLUGIN_ROOT/skills/init/templates/docs/coding-guidelines.md`

**Generated docs (heuristic — content filled in by init):**

These files have ALL content filled in by init from project analysis — no template comparison is possible. Use heuristic fingerprinting:

| Project file | Template fingerprint (line 1 HTML comment) | Template section headings |
|---|---|---|
| `.claude/CLAUDE.md` | `<!-- Keep this file and .claude/docs/ updated when project structure, conventions, or tooling changes -->` | `Conventions`, `Commands`, `Project Structure`, `Before Writing Code`, `Documentation` |
| `.claude/docs/testing.md` | *(no comment — check heading)* First line: `# Testing` | `Test Runner`, `Running Tests`, `Test Structure`, `Writing Tests`, `Workflow`, `Coverage` |
| `.claude/docs/skill-writing-guidelines.md` | *(no comment — check heading)* First line: `# Skill-writing guidelines for` | `Foundation`, `Writing Style`, `Degrees of Freedom`, `Description Quality (frontmatter)`, `Progressive Disclosure`, `Directory Layout`, `Shared References`, `Workflows and Feedback Loops`, `Common Patterns`, `Evaluation and Iteration`, `Anti-patterns`, `Documentation` |
| `.claude/docs/styling.md` | *(no comment — check heading)* First line: `# Styling` | `Stack`, `Conventions`, `File Organization`, `Adding New Components` |
| `.claude/docs/architecture.md` | *(no comment — check heading)* First line: `# Architecture` | ANY of these heading sets: (1) code-only: `Overview`, `Directory Map`, `Data Flow`, `Key Patterns`, `Dependencies Between Modules` (2) skill-authoring: `Overview`, `Directory Map`, `Skill Organization`, `Agent Boundaries`, `Reference Hierarchy`, `Orchestration Patterns` (3) hybrid: `Overview`, `Directory Map`, `Code Architecture`, `Skill Architecture` |

For CLAUDE.md: check if line 1 matches the template comment. Also check for monorepo variant: `<!-- Keep this file, .claude/docs/, and subproject CLAUDE.md files updated when project structure changes -->`.

For subproject CLAUDE.md files: check for `<!-- Keep this file and docs/ updated when this subproject's conventions change -->`.

For workspace root CLAUDE.md: check for `<!-- Local workspace file — not version-controlled. Each repo has its own .claude/CLAUDE.md. -->`.

For docs (testing.md, skill-writing-guidelines.md, styling.md, architecture.md): check if the `##` section headings match the template's headings in the same order.

If fingerprints match → classify as `LIKELY_GENERATED`. If fingerprints don't match → classify as `MODIFIED`.

**Always safe:**

`.claude/.optimus-version` — pure version tracking file with no user content → always classify as `UNMODIFIED`.

**Complex (settings.json):**

`.claude/settings.json` → classify as `COMPLEX`. This file is handled separately in Step 4 via surgical key removal.

#### Classification summary

Each file gets one of:
- `UNMODIFIED` — exact match with plugin template (safe to remove)
- `LIKELY_GENERATED` — has optimus fingerprints, content was filled in by init
- `MODIFIED` — differs from template or lacks optimus fingerprints (user customized)
- `COMPLEX` — settings.json (surgical removal in Step 4)

### Step 3 — Present reset plan and ask user

Present the full categorized file list to the user. For each file, show:
- The file path
- Its classification (UNMODIFIED / LIKELY_GENERATED / MODIFIED)
- Whether it is git-tracked (if yes, note: "recoverable via `git checkout`")

Group by classification. Example format:

```
## Unmodified (exact match with plugin template)
- .claude/agents/code-simplifier.md (git-tracked)
- .claude/hooks/format-node.js (git-tracked)
- .claude/.optimus-version (git-tracked)

## Likely generated by optimus
- .claude/CLAUDE.md (git-tracked)
- .claude/docs/testing.md (git-tracked)

## Modified by user
- .claude/docs/coding-guidelines.md (git-tracked) — user added custom rules

## settings.json
- .claude/settings.json — will remove optimus entries, preserve user config
```

For multi-repo workspaces, group files by repo (e.g., `### repo-name/`).

Then ask the user using AskUserQuestion:
- Header: "Reset"
- Question: "Review the files above. Which should be removed?"
- Options:
  1. "Remove all" (Recommended) — remove all optimus files (UNMODIFIED + LIKELY_GENERATED + MODIFIED). Safe when git-tracked
  2. "Keep modified" — remove UNMODIFIED + LIKELY_GENERATED, keep MODIFIED files
  3. "Unmodified only" — remove only UNMODIFIED (most conservative)
  4. "Abort" — cancel reset, do not remove anything

If user selects "Abort" → inform the user that no files were removed → stop.

### Step 4 — Clean settings.json (surgical removal)

If `.claude/settings.json` exists, do NOT delete it outright. Surgically remove optimus-contributed entries:

1. Read the current `.claude/settings.json`
2. Read the init template: `$CLAUDE_PLUGIN_ROOT/skills/init/templates/settings.json`
3. Read the permissions template: `$CLAUDE_PLUGIN_ROOT/skills/permissions/templates/settings.json`

**Remove PostToolUse hooks from init:**
In `hooks.PostToolUse`, remove any entry whose `hooks` array contains commands referencing `.claude/hooks/format-` (init's formatter hooks). If the `PostToolUse` array becomes empty after removal, remove the `PostToolUse` key.

**Remove PreToolUse hooks from permissions:**
In `hooks.PreToolUse`, remove any entry whose `hooks` array contains commands referencing `.claude/hooks/restrict-paths.sh` (permissions hook). If the `PreToolUse` array becomes empty after removal, remove the `PreToolUse` key.

**Remove permissions entries from permissions:**
Compare `permissions.allow` against the permissions template's `permissions.allow` list. Remove entries that match. Also remove any `mcp__*` entries — but only if a `.mcp.json` file exists in the relevant project root (for multi-repo workspaces, check each child repo's root independently; for single projects and monorepos, check the project root). If no `.mcp.json` exists, leave `mcp__*` entries untouched (they may have been manually added by the user). If `permissions.allow` becomes empty, remove the key.

Compare `permissions.deny` against the permissions template's `permissions.deny` list. Remove entries that match. If `permissions.deny` becomes empty, remove the key.

If `permissions` object becomes empty, remove it. If `hooks` object becomes empty, remove it.

**Final check:**
If the entire JSON object is empty (`{}`), delete the file entirely. Otherwise, write the cleaned JSON back with proper formatting (2-space indentation).

### Step 5 — Execute removals

Based on the user's choice from Step 3:

1. Delete the selected files (using `rm` for each file)
2. Clean `settings.json` per Step 4 (always — regardless of user's choice, since surgical removal preserves user content)

**Multi-repo workspace handling:**
- Process each child repo independently
- Delete workspace root `CLAUDE.md` if it was classified and selected for removal

**Monorepo handling:**
- Process root `.claude/` directory (same as single project)
- Delete subproject `CLAUDE.md` files that were classified and selected for removal
- Delete subproject `docs/` files (testing.md, styling.md, architecture.md) that were classified and selected for removal

### Step 6 — Clean empty directories

After file removal, check these directories and remove any that are now empty:

- `.claude/hooks/`
- `.claude/agents/`
- `.claude/docs/`
- `.claude/` (only if completely empty — no files or subdirectories remain)

For monorepos: also check subproject `docs/` directories.

For multi-repo workspaces: check each repo's `.claude/hooks/`, `.claude/agents/`, `.claude/docs/`, and `.claude/` directories.

### Step 7 — Report results

Present a summary to the user:

- **Files removed** — count and list
- **Files kept** — count and list with reason (user-modified, user chose to keep, etc.)
- **settings.json** — entries removed, or file deleted, or "no changes needed"
- **Directories cleaned** — empty directories that were removed

### Step 8 — Next step

Recommend the next step based on intent:

- To reinstall optimus project files → `/optimus:init` (and `/optimus:permissions` for safety guardrails)
- To uninstall the plugin itself → `/plugin uninstall optimus@optimus-claude` (Claude Code command, not an optimus skill)

Tell the user: **Tip:** for best results, start a fresh conversation for the next skill — each skill gathers its own context from scratch.
