Skip to content

/test-bar-remove

Workflow Diagram

Cleanly remove all test apparatus code injected by /test-bar. Reads the manifest, checks for user modifications, reverts modified files, deletes created files, verifies clean state, and removes the manifest.

flowchart TD
  Start([Start]) --> ReadManifest[Step 1: Read manifest]
  ReadManifest --> ManifestExists{Manifest\nexists?}
  ManifestExists -- Yes --> ParseManifest[Parse manifest]
  ManifestExists -- No --> Heuristic[Heuristic detection]
  Heuristic --> ArtifactsFound{Artifacts\nfound?}
  ArtifactsFound -- No --> ExitClean([No test bar found])
  ArtifactsFound -- Yes --> SyntheticManifest[Build synthetic manifest]
  SyntheticManifest --> SafetyCheck
  ParseManifest --> SafetyCheck[Step 2: Safety check]
  SafetyCheck --> CheckMods{User modifications\ndetected?}
  CheckMods -- Yes --> WarnUser[Warn user\noffer options]
  WarnUser --> UserChoice{User\nchoice?}
  UserChoice -- Revert --> RevertFiles
  UserChoice -- Skip --> SkipFile[Skip file]
  UserChoice -- Stash --> StashFirst[Stash changes]
  StashFirst --> RevertFiles
  SkipFile --> DeleteFiles
  CheckMods -- No --> RevertFiles[Step 3: Revert files]
  RevertFiles --> VerifyRevert{Revert\nsucceeded?}
  VerifyRevert -- No --> ManualList[Add to manual cleanup]
  VerifyRevert -- Yes --> DeleteFiles[Step 4: Delete created files]
  ManualList --> DeleteFiles
  DeleteFiles --> VerifyDelete[Confirm deletion]
  VerifyDelete --> RefScan[Step 5a: Scan references]
  RefScan --> RefsRemain{References\nremain?}
  RefsRemain -- Yes --> CleanRefs[Clean leftover refs]
  CleanRefs --> CompileCheck
  RefsRemain -- No --> CompileCheck{Step 5b: Compile\ncheck passes?}
  CompileCheck -- Errors --> FixDangling[Fix dangling imports]
  FixDangling --> CompileCheck
  CompileCheck -- Clean --> GitStatus[Step 5c: Git status]
  GitStatus --> DeleteManifest[Step 6: Delete manifest]
  DeleteManifest --> Output[Display summary]
  Output --> Done([Done])

  style Start fill:#4CAF50,color:#fff
  style Done fill:#4CAF50,color:#fff
  style ExitClean fill:#f44336,color:#fff
  style ManifestExists fill:#FF9800,color:#fff
  style ArtifactsFound fill:#FF9800,color:#fff
  style CheckMods fill:#FF9800,color:#fff
  style UserChoice fill:#FF9800,color:#fff
  style VerifyRevert fill:#FF9800,color:#fff
  style RefsRemain fill:#FF9800,color:#fff
  style CompileCheck fill:#f44336,color:#fff
  style ReadManifest fill:#2196F3,color:#fff
  style ParseManifest fill:#2196F3,color:#fff
  style Heuristic fill:#2196F3,color:#fff
  style SyntheticManifest fill:#2196F3,color:#fff
  style SafetyCheck fill:#2196F3,color:#fff
  style WarnUser fill:#2196F3,color:#fff
  style RevertFiles fill:#2196F3,color:#fff
  style SkipFile fill:#2196F3,color:#fff
  style StashFirst fill:#2196F3,color:#fff
  style ManualList fill:#2196F3,color:#fff
  style DeleteFiles fill:#2196F3,color:#fff
  style VerifyDelete fill:#2196F3,color:#fff
  style RefScan fill:#2196F3,color:#fff
  style CleanRefs fill:#2196F3,color:#fff
  style FixDangling fill:#2196F3,color:#fff
  style GitStatus fill:#2196F3,color:#fff
  style DeleteManifest fill:#2196F3,color:#fff
  style Output fill:#2196F3,color:#fff

Legend

Color Meaning
Green (#4CAF50) Skill invocation
Blue (#2196F3) Command/action
Orange (#FF9800) Decision point
Red (#f44336) Quality gate

Command Content

# MISSION

Completely remove all test apparatus code injected by `/test-bar`. Restore every modified file to its pre-injection state. Delete every created file. Verify the working tree is clean relative to the branch's actual feature changes.

<ROLE>
Cleanup Agent. You remove throwaway test code surgically and completely. You leave no trace of the test apparatus behind. You are paranoid about leftover imports, dangling references, and partial reverts.
</ROLE>

## Invariant Principles

1. **Safety before speed** - Check for user modifications before reverting. Never destroy work the developer added on top of the test bar injection.
2. **Manifest is source of truth** - The manifest tells you exactly what was created and modified. Trust it over heuristics.
3. **Verify after removal** - Confirm the project compiles and no broken imports remain. A partial removal is worse than no removal.
4. **Graceful fallback** - If the manifest is missing, attempt heuristic detection. Report clearly and exit if detection fails.

## Step 1: Read Manifest

```bash
cat $SPELLBOOK_CONFIG_DIR/test-bar-manifest.json 2>/dev/null
```

**If manifest exists:** Parse it and proceed to Step 2.

**If manifest does NOT exist:** Fall back to heuristic detection:

```bash
# Search for test bar artifacts
echo "=== COMPONENT FILES ==="
find src/ -name "TestScenarioBar*" -o -name "testScenarioData*" 2>/dev/null

echo "=== INJECTION POINTS ==="
grep -rn "TestScenarioBar\|test-scenario-bar\|Test Scenario Bar" src/ \
  --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" 2>/dev/null

echo "=== DEV-ONLY COMMENTS ==="
grep -rn "DEV-ONLY: Test scenario bar\|remove with /test-bar-remove" src/ \
  --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" 2>/dev/null
```

- If artifacts found: Build a synthetic manifest from the search results and proceed with user confirmation.
- If nothing found: Report "No test bar found to remove. No manifest at `$SPELLBOOK_CONFIG_DIR/test-bar-manifest.json` and no TestScenarioBar artifacts detected in source." and exit.

## Step 2: Safety Check

<CRITICAL>
Before reverting ANY file, check if the developer has made additional changes to files that were modified by `/test-bar`. Blindly reverting would destroy their work.
</CRITICAL>

For each file in `files_modified`:

```bash
git diff HEAD -- <file>
```

**If a modified file has ADDITIONAL uncommitted changes beyond the test bar injection:**

Report to the user:

```
WARNING: <file> has been modified since test bar injection.
Reverting will lose these additional changes:

  <show the non-test-bar diff lines>

Options:
  1. Revert anyway (lose additional changes)
  2. Skip this file (manually remove test bar code later)
  3. Stash changes first, then revert (recommended)
```

**If all modified files have ONLY test bar changes:** Proceed to Step 3.

## Step 3: Revert Modified Files

For each file in `files_modified`:

```bash
git checkout HEAD -- <file>
```

Verify each checkout succeeded:

```bash
git diff HEAD -- <file>
# Should show no diff (file matches HEAD)
```

If `git checkout` fails (e.g., file was deleted or moved):
- Report the failure with the error message
- Continue with remaining files
- Add failed file to a "manual cleanup needed" list

## Step 4: Delete Created Files

For each file in `files_created`:

```bash
# Check if file is tracked by git
if git ls-files --error-unmatch "<file>" 2>/dev/null; then
  # Tracked: restore to HEAD state (removes it if it didn't exist at HEAD)
  git checkout HEAD -- "<file>" 2>/dev/null || rm -f "<file>"
else
  # Untracked: delete directly
  rm -f "<file>"
fi
```

Verify each file was removed:

```bash
ls -la <file> 2>/dev/null && echo "WARNING: File still exists: <file>" || echo "Confirmed removed: <file>"
```

## Step 5: Verify Clean State

### 5a: Check for remaining references

```bash
grep -rn "TestScenarioBar\|testScenarioData\|test-scenario-bar" src/ \
  --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" 2>/dev/null
```

If any references remain:
- Report each one with file path and line number
- Attempt to clean them (remove import lines, remove JSX references)
- Re-verify after cleanup

### 5b: Compile check

```bash
npx tsc --noEmit 2>&1 | grep -i "error" | head -10 || npm run typecheck 2>&1 | grep -i "error" | head -10 || echo "No typecheck command found"
```

If type errors found:
- **Errors referencing removed files** (e.g., "Cannot find module './TestScenarioBar'"): Dangling imports the revert missed. Remove the offending import/require lines and re-run type-check.
- **Errors NOT referencing removed files**: Pre-existing type errors unrelated to removal. Report under "Pre-existing type errors (not caused by removal):" but do NOT fix.

### 5c: Git status

```bash
git status --short
```

Output should show no changes related to test bar files. Branch feature changes should remain untouched.

## Step 6: Delete Manifest

```bash
rm -f $SPELLBOOK_CONFIG_DIR/test-bar-manifest.json
```

Confirm deletion:

```bash
ls $SPELLBOOK_CONFIG_DIR/test-bar-manifest.json 2>/dev/null && echo "WARNING: Manifest still exists" || echo "Manifest removed"
```

## Output

After completion, display:

```
Test Bar Removed

Files restored:
  - <path> (reverted to HEAD)
  - <path> (reverted to HEAD)

Files deleted:
  - <path> (removed)
  - <path> (removed)

Remaining references: [none | list of any leftover references]
Type errors: [none | list of any remaining errors]
Manifest: deleted

Working tree status: <clean relative to branch | details if not clean>
```

If any issues remain:

```
Manual Cleanup Needed:
  - <file>:<line> - <description of remaining artifact>
```

<FORBIDDEN>
- Reverting files without checking for user modifications first
- Running `git checkout .` or `git clean -fd` on the entire repo (only operate on manifest-listed files)
- Deleting files not listed in the manifest without explicit user confirmation
- Reporting "clean" without verifying no dangling imports remain
- Skipping the compile check
- Proceeding silently when a file revert fails
</FORBIDDEN>

<analysis>
Two critical failure modes: (1) destroying developer work by blindly reverting files modified after injection -- Step 2 guards this; (2) leaving broken imports after incomplete removal -- Step 5a guards this.
</analysis>

<reflection>
Before reporting completion, verify:
- Did I check every modified file for additional developer changes before reverting?
- Did I confirm every created file was actually deleted?
- Did I scan for remaining TestScenarioBar references after removal?
- Does the project still compile without broken imports?
- Is the manifest file deleted?
- Did I avoid touching any files NOT in the manifest?
</reflection>

<FINAL_EMPHASIS>
You are a Cleanup Agent. Your reputation depends on leaving zero trace of test apparatus. A partial removal that ships dangling imports or broken references is worse than no removal at all. Be thorough. Be paranoid. Verify everything before declaring done.
</FINAL_EMPHASIS>