Files and audits incoming invoices — OCR, duplicate checks, VAT splits, and a searchable local archive.
Coding
Files
Safely organize, deduplicate, and analyze files with intelligent bulk operations and full undo support.
What it does
**YES:** Organize existing files, find duplicates, analyze disk usage, batch rename/move, clean up clutter **NO:** Open files, create files/folders, copy files, extract archives, basic file browsing — use standard file operations for those
The skill document
What This Skill Does (and Doesn't)
YES: Organize existing files, find duplicates, analyze disk usage, batch rename/move, clean up clutter NO: Open files, create files/folders, copy files, extract archives, basic file browsing — use standard file operations for those
This is a power tool for reorganization, not a replacement for basic file commands.
Path Security (Non-Negotiable)
- Canonicalize ALL paths before any operation: resolve
..,~, symlinks, then validate - After canonicalization, reject if path is outside user's home or explicitly allowed directories
- NEVER follow symlinks during traversal — report them as "symlink to X, skipped" and let user decide
- Block these paths absolutely:
/,/etc,/var,/usr,/System,/Library,C:\Windows,C:\Program Files - Paths containing
..after canonicalization = reject with explanation
Fast Path vs Safe Path
Fast path (1-9 files): Execute immediately with brief confirmation: "Move 3 files to Archive? [Y/n]" Safe path (10+ files): Create manifest, show summary, require explicit "yes" or review
This prevents confirmation fatigue for simple operations while protecting bulk actions.
Trash Handling
- Use the operating system's native trash:
trashCLI on macOS/Linux, Recycle Bin API on Windows - If OS trash unavailable, move to
~/.local/share/file-organizer-trash/with metadata sidecar - Metadata sidecar (JSON): original path, deletion timestamp, operation ID — NOT path-in-filename
- Never permanently delete without explicit "permanently delete" or "empty trash" command
Undo System
- Every operation creates an undo record in
~/.local/share/file-organizer/undo/TIMESTAMP.json - Record contains: operation type, source paths, destination paths, checksums of moved files
- "Undo last" reverses the most recent operation using the record
- Undo records expire after 30 days — warn user before expiry
- NO shell scripts for undo — JSON metadata only, executed by the agent
Symlink Policy
- During directory traversal: skip symlinks, report them separately
- "This folder contains 12 symlinks pointing outside — review before proceeding?"
- Never follow symlinks automatically — they're a classic attack vector
- User can explicitly request "follow symlinks" but must confirm each external target
Duplicate Detection (Scalable)
- Phase 1: Group by exact size (instant, no I/O)
- Phase 2: Hash first 4KB of same-size files (fast filter)
- Phase 3: Full hash only for files matching phase 2
- For >10,000 files, require confirmation: "This will take ~15 minutes. Proceed?"
- Cache hashes in
~/.local/share/file-organizer/hash-cache.db(SQLite) with mtime invalidation
Bulk Operations
- Batch rename: Preview ALL transformations if <50 files, first/last 10 if more, always show total count
- Batch move: Verify destination has space before starting, atomic per-file with rollback on error
- Progress: Update every 5% or 30 seconds, whichever is less frequent — not per-file spam
- Error handling: On ANY error, stop, report what succeeded/failed, offer "continue skipping errors" or "rollback completed"
Organization Proposals
- Analyze directory contents FIRST, then propose: "80% images, 15% videos, 5% docs — organize by date or type?"
- Always show concrete examples: "vacation-photo.jpg → 2024/06-June/vacation-photo.jpg"
- Preserve original filenames unless user requests rename pattern
- Create
.file-organizer-manifest.jsonin destination documenting the reorganization for future reference
Size Analysis
- Top consumers by directory, not individual files — users think in folders
- Flag known safe-to-delete: node_modules, pycache, .gradle, build/, target/, Pods/
- Calculate actual vs apparent size (sparse files, hardlinks)
- For cleanup suggestions, always state recoverability: "Deleting node_modules: fully recoverable with npm install"
Platform Specifics
- macOS: Respect .app bundles (they're directories), use
trashvia Homebrew if available - Windows: Use long path prefix
\\?\for paths >260 chars, use shell API for Recycle Bin - Linux: XDG trash spec (
~/.local/share/Trash/), handle different filesystem capabilities
Limits and Failures
- Refuse operations on >100,000 files without explicit override: "This affects 250K files. Type 'I understand' to proceed"
- If manifest would exceed 10MB, paginate: "Showing batch 1 of 15 (page through with 'next')"
- Network drives: detect by response time, warn about reliability, suggest local copy first
- Disk full: check before starting, reserve 1% headroom, fail gracefully with partial completion report
Related skills
Get Markdown that renders correctly in GitHub, MDX, Pandoc, docs sites, Slack, Notion, and other parsers.
Publish a web app via a curl-based JSON-RPC API and get a hosted URL.
Encrypted OpenClaw backups to S3-compatible buckets with staged restore and opt-in scheduling.
Read and mutate Linear issues, projects, and comments through a bundled Node CLI.
BOOK BRAIN — LYGO 3-Brain filesystem helper. Scaffold memory/reference/state layouts, .ref.txt outer links, daily indexes; pairs with lyra-brain. Additive on...
More from Iván
Browse all skillsRun Git operations — commits, branches, merges, rebases, conflict resolution, and recovery — with safety rules enforced.
Create and critique visual artifacts with quantified rules for hierarchy, spacing, type scale, color, and layout.
Debug CSS mechanics and write component stylesheets grounded in named mechanisms, not trial-and-error.
Plans and runs self-directed learning as a system: exit test, spaced review, deliberate practice, and transfer proof.
Get Azure architecture, debugging, security, and cost reviews grounded in a live inventory of your subscription.
Diagnoses Java and JVM issues from exception messages to container OOM-kills, and writes Java code matching the configured JDK.