No description
Find a file
loki5512344 9dda5f4562
feat: fix engine (Phase 1.6) + git-aware mv + windows-safe path output
- Edit engine: generic span edits (replace/insert/delete) with stale-index
  guard; mv and fix share one atomic apply/rollback/diff/--json pipeline
- jmove mv|check|fix commands; java rules: unused-import, missing-import
  (unique-FQN insert, ambiguous -> candidates for agents), import-order
  (google style; cross-rule byte conflicts prune by severity and converge)
- mv of tracked files goes through git mv (staged rename, --no-git opt-out,
  moved_via/would_move_via in --json, GIT_ERROR code)
- fix java extract_package losing single-segment packages (bare identifier,
  not scoped_identifier) — broke the FQN index for 'package p;' projects
- core::rel_str: project-relative paths rendered with '/' on every platform
  (human/JSON/diff headers/git pathspecs), Path::display() no longer used
  for output; e2e fixtures: java/fix, java/fix_missing, java/order
2026-09-15 16:10:04 +02:00
docs feat(java): Phase 1.5 — tree-sitter Java frontend, package-aware mv, e2e fixtures 2026-09-13 17:29:07 +02:00
src feat: fix engine (Phase 1.6) + git-aware mv + windows-safe path output 2026-09-15 16:10:04 +02:00
tests feat: fix engine (Phase 1.6) + git-aware mv + windows-safe path output 2026-09-15 16:10:04 +02:00
.gitignore chore: project skeleton — module contracts, docs plan, GPLv3 2026-09-09 21:43:42 +02:00
Cargo.lock feat(java): Phase 1.5 — tree-sitter Java frontend, package-aware mv, e2e fixtures 2026-09-13 17:29:07 +02:00
Cargo.toml feat(java): Phase 1.5 — tree-sitter Java frontend, package-aware mv, e2e fixtures 2026-09-13 17:29:07 +02:00
LICENSE chore: project skeleton — module contracts, docs plan, GPLv3 2026-09-09 21:43:42 +02:00
README.md docs: Phase 1.6 fix-engine plan + guava real-world Java smoke test results 2026-09-13 17:55:55 +02:00
todo.md docs: Phase 1.6 fix-engine plan + guava real-world Java smoke test results 2026-09-13 17:55:55 +02:00

jmove

Move source files. Keep every import intact.

jmove is a fast, single-binary CLI that moves/renames source files in a project and rewrites all import statements that reference them — no IDE, no language server, no runtime dependencies. Built for humans and AI agents.

Why

git mv moves the file but breaks every relative import pointing at it. IDE renames fix imports but need an IDE. Existing CLI alternatives either shell out to heavy language servers (bun/ts-morph, Rope, gopls, rust-analyzer) or refuse to preview what they will change.

jmove's answer:

  • Dry-run + unified diff — see every change before it hits disk.
  • Atomic apply with rollback — imports are rewritten first, the file moves last; any failure restores everything.
  • AI-agent mode — --json everywhere, stable error codes, exit codes, and a machine-readable skill doc (docs/SKILL.md).
  • Pure Rust, one binary — no external toolchains to install.
  • Java support — the package/directory coupling nobody else automates outside IntelliJ.

Install

cargo install jmove

Usage

# Preview what a move would change
jmove mv src/utils/parser.ts src/core/parser.ts --dry-run

# Apply it
jmove mv src/utils/parser.ts src/core/parser.ts

# Java: jmove updates `package`, all `import`s and moves the file
jmove mv src/com/example/utils/Parser.java src/com/example/core/Parser.java

# Find broken imports (exit code 2 if any)
jmove check

# AI-agent workflow
jmove mv src/foo.ts src/bar/foo.ts --dry-run --json
jmove mv src/foo.ts src/bar/foo.ts --json
jmove check --json

See docs/EXAMPLES.md for more, and docs/SKILL.md if you are an AI agent.

Roadmap

TypeScript/JavaScript and Java (the open niche) are in — real-world tested on google/guava. Next: a fix command reusing the same dry-run/atomic engine to auto-repair small breakages (unused/missing/misordered imports), then Python, Go. split (automatic file decomposition) is planned — no tool does it. Full plan: docs/PLAN.md.

License

GPL-3.0-only. See LICENSE.