jmove/todo.md
loki5512344 55670030c3
feat: MVP — move files, rewrite imports, atomically
- core: gitignore-aware index (ignore crate), forward/reverse import graph,
  relative-specifier math, pure-data move plans
- apply: rewrite-first + rename-last with fsync, temp+rename, full rollback
  (incl. stale-plan detection before any write); unified diff for dry-run
- cli: mv + check commands, human output, --json envelope with stable error
  codes (SOURCE_NOT_FOUND, TARGET_EXISTS, ...) and hints; exit codes 0/1/2
- parser/core split into submodules to keep files <=250 lines
- tests: 37 unit + 10 e2e + 2 doctests; fixtures tests/typescript/{basic,normal,complex}
- docs: SKILL.md synced (no --force in Phase 1), EXAMPLES.md
- plan: AI/agent support done; Phase 1.5 = Java niche
2026-09-10 11:41:03 +02:00

4.2 KiB
Raw Blame History

jmove — TODO

Правила

  • KISS — simplest solution that works; no speculative abstractions.
  • DRY — no duplicated logic; extract into a function/module instead.
  • SOLID — single responsibility per module (cli/core/parser/cache), open for extension (new languages) via the parser trait, no deps on implementation details.
  • Max 250 lines per file — split when exceeded.
  • Max 4 files per folder (module) — split the module when exceeded.
  • Каждый коммит проходит cargo fmt --check и cargo clippy -- -D warnings.
  • Запрещён mёртвый код: unused code удаляется или реализуется; #[allow(dead_code)] не использовать.

MVP (Phase 1)

  • CLI skeleton (clap) — команды: mv, check, --dry-run, --json
  • Сканер файлов проекта (уважать .gitignore через ignore крейт)
  • Парсер импортов для TypeScript/JS через tree-sitter
  • Разрешение путей: extension guessing (.ts/.tsx/.js/...), index.* (в MVP — без этого инструмент игрушка)
  • Построение графа зависимостей (файл → что импортирует)
  • Инвертированный граф (файл → кто его импортирует)
  • Вычисление нового относительного пути после mv
  • Rewrite импортов в файлах (трогаем только specifier-строку, никогда не реформатим statement)
  • Атомарный apply (сначала rewrite, потом mv) + rollback при ошибке
  • Dry-run режим с diff выводом
  • Команда check (битые импорты, exit code 2) — self-test инструмента
  • Тесты: unit (parser, core) + e2e (CLI на фикстурах)

AI / Agent support

  • --json флаг на всех командах (status ok|dry_run|error)
  • --dry-run + --json (preview без записи на диск)
  • Стабильные error codes (TARGET_EXISTS, SOURCE_NOT_FOUND, ...) + hint поле
  • Exit codes: 0 ok / 1 error / 2 broken imports
  • docs/SKILL.md — машиночитаемая документация для AI агентов
  • docs/EXAMPLES.md — примеры для людей и агентов

Phase 1.5 — Java (наша ниша, аналогов в CLI нет)

  • tree-sitter Java грамматика: package + import extraction
  • Детект source root (src/main/java, src/) и соответствие package ⇄ директория
  • mv = три синхронных правки: package, все import в проекту, физический перенос
  • e2e фикстуры tests/java/

Phase 2

  • Кэш индекса на диске (bincode/rkyv) → .jmove/index
  • Инкрементальная переиндексация (только изменённые файлы)
  • Поддержка tsconfig paths / алиасов (@/...)
  • Параллельная индексация через rayon
  • --git интеграция (git mv для stage/истории)
  • Перенос директорий целиком (mv папки)
  • Предупреждения о не-import ссылках: package.json exports, jest mocks, tsconfig includes, markdown links
  • prettier интеграция после rewrite (по желанию)

Phase 3

  • Поддержка Python (from/import, относительные точки)
  • Поддержка Go (per-file, НЕ whole-package как refac)
  • Команда split (авто-разбивка файла на несколько)
  • Windows-пути (camino/normalize) — CI matrix

Идеи на потом

  • LSP интеграция (jmove сам как LSP server)
  • Watch mode
  • VS Code расширение как обёртка над CLI

Конкуренты (см. docs/PLAN.md)

  • refac / ai_refac (jav-ed): TS/Py/Rust/Go/Dart, но без dry-run, лимит 30 файлов в TS, Go = весь пакет, Java нет. Наш edge: dry-run+атомарность, Java, split, скорость (без LSP), UX.