Use safe-rm command to safely 'remove' files by renaming them to .obsolete instead of permanent deletion. Reversible, collision-safe, hook-compliant.
Rename files to .obsolete instead of permanent deletion via safe-rm command.
rm is blocked by pre-tool hooksrmProject setting: .claude/settings.json:132 ā "RM_BASH_BLOCK": "true"
| Issue | Solution |
|---|---|
rm permanently deletes |
safe-rm renames (reversible) |
| Blocked by pre-tool hooks | Works within safety constraints |
| No recovery | mv file.obsolete file restores |
./.claude/bin/safe-rm [file1] [file2] [dir/]
Path: .claude/bin/safe-rm:1-72
| Feature | Benefit |
|---|---|
| Reversible | mv file.obsolete file recovers |
| Multi-file | Handle multiple args in one command |
| Collision safe | Adds timestamp if .obsolete exists |
| Color output | Green ā / Yellow ā / Red ā |
| Statistics | Reports renamed/failed count |
| Operation | Command | Result |
|---|---|---|
| Single file | ./.claude/bin/safe-rm file.txt |
file.txt.obsolete |
| Multiple | ./.claude/bin/safe-rm f1 f2 dir/ |
All get .obsolete suffix |
| Restore | mv file.obsolete file |
Original restored |
| Scenario | Command |
|---|---|
| Single | mv file.obsolete file |
| With timestamp | mv file.obsolete.20251109_110500 file |
| Find all | find . -name "*.obsolete" |
| Restore all | find . -name "*.obsolete" | while read f; do mv "$f" "${f%.obsolete}"; done |
safe-rm [files]npm test && npm run buildfind . -name "*.obsolete"/bin/rm [file].obsolete| Scenario | Use safe-rm? | Why |
|---|---|---|
| Secrets (.env, keys) | ā | Needs secure deletion + git history rewrite |
| .git folder | ā | Too risky |
| node_modules | ā ļø | rm -rf safe, but safe-rm works |
| Temp/build | ā | Reversible, safe |
Success:
ā Renamed: file.txt ā file.txt.obsolete
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Renamed: 1
Collision (timestamp fallback):
ā Already exists: file.obsolete
Using: file.obsolete.20251109_110500
ā Renamed: file ā file.obsolete.20251109_110500
Error:
ā Not found: missing.txt
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Failed: 1
| Task | Command |
|---|---|
| Remove single | ./.claude/bin/safe-rm file.txt |
| Remove multiple | ./.claude/bin/safe-rm f1 f2 dir/ |
| Restore | mv file.obsolete file |
| List obsolete | find . -name "*.obsolete" |
| Count | find . -name "*.obsolete" | wc -l |
Safety by design: No permanent deletion ā collision protection ā hook compliance ā audit trail. Development workflow: Refactor ā safe-rm ā Test ā Review period ā Permanent delete after confidence.