Skip to content

fix(mt): worktree lifecycle і mt run резолвлять головний корінь репо, не linked worktree - #20

Merged
vitaliytv merged 1 commit into
mainfrom
fix/worktree-git-root-and-linked-worktree-scope
Jul 30, 2026
Merged

fix(mt): worktree lifecycle і mt run резолвлять головний корінь репо, не linked worktree#20
vitaliytv merged 1 commit into
mainfrom
fix/worktree-git-root-and-linked-worktree-scope

Conversation

@vitaliytv

Copy link
Copy Markdown
Member

Summary

  • mt worktree create|remove|list|prune більше не вимагають MT task graph (.mt.json/mt/) — лише Git-репозиторій. inventory без графа задач повертає список worktree без task-асоціації замість помилки.
  • mt worktree create повертає стабільний JSON contract (name/branch/path) і робить rollback щойно створеного worktree/branch, якщо крок --description провалюється.
  • Виправлено нюанс: gix::discover(cwd).workdir() повертав корінь поточного linked worktree замість спільного головного репо, коли команда викликалась зсередини dev-worktree — новий worktree/run-worktree вкладався рекурсивно (.worktrees/devwork/.worktrees/...) замість того, щоб лягти поруч під головним .worktrees/. Виправлено через GitRepository::main_worktree_root() (gix Repository::main_repo()) + discover_main_worktree_root(), підключено до:
    • mt worktree create|remove|list|prune,
    • mt check's stale-worktree scan,
    • mt run/mt auto's розміщення ephemeral run-worktree,
    • napi-біндінгів worktree_create/remove/status.
  • Команди, для яких per-checkout scope є навмисним (plan/fact/verify/done/audit/status/scan — кожен linked worktree має власний checkout mt/-файлів задач), лишились незмінними.

Test plan

  • cargo test -p mt-core worktree — зелено
  • cargo test -p mt --test cli — зелено
  • cargo test --workspace — 142 тести в mt-core (+1 новий regression), усі решта — зелено
  • cargo fmt --all -- --check / cargo clippy --all-targets --all-features -- -D warnings — чисто
  • Ручний smoke-тест в ізольованому git-репо без .mt.json/mt/: create → JSON з branch: "mt/smoke" і реальним path → list знаходить → remove --forcegit worktree list --porcelain/git show-ref підтверджують повне прибирання
  • Ручна перевірка nested-сценарію: worktree create зсередини лінкованого worktree тепер кладе новий worktree поруч під головним .worktrees/, а не вкладено
  • Regression-тест на mt run, викликаний зсередини лінкованого worktree — підтверджено, що тест ловить регресію (тимчасово повернув баг, тест почервонів)
  • npx @7n/rules lint changelog — exit 0 (зміни лише в Rust crates поза JS/Python workspaces — changelog не потрібен за конвенцією репо)

🤖 Generated with Claude Code

…nked worktree

`mt worktree create|remove|list|prune` required an MT task graph
(`.mt.json`/`mt/`) even though only Git access is needed, and both they and
`mt run`/`mt auto` resolved the repo root via `gix::discover(cwd).workdir()`
— which returns the *current* linked worktree's own root instead of the
shared main root when invoked from inside a dev-worktree, silently nesting
new worktrees under the one you're standing in.

- worktree create|remove|list|prune no longer require .mt.json/mt/; inventory
  falls back to an empty task association when no task graph exists.
- `mt worktree create` returns a stable JSON contract (name/branch/path) and
  rolls back the worktree/branch if the description step fails.
- Added `GitRepository::main_worktree_root()` (via gix's `main_repo()`) and
  `discover_main_worktree_root()`, and wired it into worktree
  create/remove/list/prune, `mt check`'s stale-worktree scan, `mt run`'s
  ephemeral run-worktree placement, and the mt-napi worktree bindings.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@vitaliytv
vitaliytv merged commit 29e261f into main Jul 30, 2026
2 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant