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
This commit is contained in:
loki5512344 2026-09-10 11:41:03 +02:00
parent 9d8f1e0bba
commit 55670030c3
Signed by: boba
GPG key ID: 253067914055423B
37 changed files with 1851 additions and 139 deletions

View file

@ -0,0 +1 @@
{ "name": "complex" }

View file

@ -0,0 +1,6 @@
// Fixture with one intentionally broken relative import.
export const flag = true;
import { ghost } from "./gone";
export const who = ghost;

View file

@ -0,0 +1,3 @@
import { trim } from "./util/../util/text";
export const DEFAULT = trim(" hi ");

View file

@ -0,0 +1,5 @@
import { trim } from "../util/text";
export function solve(input: string): string {
return trim(input);
}

View file

@ -0,0 +1,7 @@
import {
pad,
} from "../../../util/text";
export function render(value: string): string {
return pad(value);
}

View file

@ -0,0 +1,7 @@
export function trim(s: string): string {
return s.trim();
}
export function pad(s: string): string {
return ` ${s} `;
}