# jmove skill (for AI agents) ## What this tool does Moves or renames source files inside a project and updates every import statement referencing them. Never breaks imports. Supported: TypeScript, JavaScript; Java/Python/Go on the roadmap. Single binary, no LSP needed. ## When to use - The user asks to move/rename/reorganize source files or packages. - You refactored a directory layout and imports now point at nothing. - You need to verify the project has no broken imports (`check`). ## Commands ### mv — move a file and rewrite its importers ``` jmove mv [--root DIR] [--dry-run] [--json] [--force] ``` Always run `--dry-run` first and confirm the change set looks right. ### check — find broken imports ``` jmove check [--root DIR] [--json] ``` Run after any move (or any edit) to validate project consistency. ## Recommended agent workflow 1. `jmove mv --dry-run --json` — preview. 2. Inspect `affected_files`; if unexpected, abort and ask the user. 3. `jmove mv --json` — apply (atomic, rolls back on error). 4. `jmove check --json` — verify nothing is broken. ## Output format (--json) Every response: `{ "status": "ok" | "dry_run" | "error", "operation": "...", ... }`. Errors carry a stable `code` (`TARGET_EXISTS`, `SOURCE_NOT_FOUND`, ...) and a `hint` describing the next action. On success, `mv` reports `changed_files` with line-level `old`/`new` import diffs and counters (`moved`, `updated_imports`). ## Exit codes - `0` — success - `1` — operation failed (read `--json` error or stderr) - `2` — `check` found broken imports ## Rules of use - Never run `mv` without a prior `--dry-run` in the same session. - Never pass `--force` unless the user explicitly authorized overwriting. - After every successful `mv`, run `check`; treat exit code `2` as a failed refactor.