feat(worktree): symlink repoRoot node_modules into job worktrees #26

Merged
janpeter merged 2 commits from fix/mcp-worktree-node-modules-symlink into main 2026-05-28 20:37:08 +02:00
Owner

Probleem (de 127-helft)

Een git-worktree start met een lege, gitignored node_modules. De runner draait géén npm install in de worktree, dus npm run verify (eslint/tsc/vitest) vindt niets → sh: 1: eslint: not found (exit 127). De agent gaat dan zelf deps installeren en loopt vast.

Fix

createWorktreeForJob symlinkt na git worktree add <worktree>/node_modules → <repoRoot>/node_modules (best-effort, faalt nooit de worktree-creatie). TASK- én SPRINT-jobs lopen allebei door createWorktreeForJob, dus deze ene plek dekt alle verify-draaiende kinds; IDEA-product-worktrees bewust niet (die linten/testen niet).

  • linkNodeModules helper: skip als de repoRoot geen node_modules heeft; absoluut symlink-target (worktrees staan buiten de repoRoot, onder SCRUM4ME_AGENT_WORKTREE_DIR); EEXIST genegeerd; overige fouten gelogd, niet gegooid.

Test

__tests__/git/worktree.test.ts (real-git harness): symlink-when-present (resolve dóór de link), skip-when-absent, en een removal-safety regressietest die vastlegt dat het verwijderen van een worktree de gedeelde repoRoot/node_modules niet wist (git worktree remove/fs.rm ontkoppelen de symlink, niet het target). 14/14 groen, tsc --noEmit clean.

Hangt samen met

  • B2 (scrum4me-docker): repo-bootstrap.sh installeert de deps één keer in ~/Projects/<repo> (volledige npm ci, incl. dev+optional) — deze symlink wijst daarnaar.
  • Precondition (noexec): de repoRoot/worktree-fs moet exec toestaan; op een noexec-mount falen de gelinkte binaries nog steeds met 126 / ERR_DLOPEN. Wordt apart aangepakt (exec-fs fix).
## Probleem (de 127-helft) Een git-worktree start met een lege, gitignored `node_modules`. De runner draait géén `npm install` in de worktree, dus `npm run verify` (eslint/tsc/vitest) vindt niets → `sh: 1: eslint: not found` (exit 127). De agent gaat dan zelf deps installeren en loopt vast. ## Fix `createWorktreeForJob` symlinkt na `git worktree add` `<worktree>/node_modules → <repoRoot>/node_modules` (best-effort, faalt nooit de worktree-creatie). TASK- én SPRINT-jobs lopen allebei door `createWorktreeForJob`, dus deze ene plek dekt alle verify-draaiende kinds; IDEA-product-worktrees bewust niet (die linten/testen niet). - `linkNodeModules` helper: skip als de repoRoot geen `node_modules` heeft; absoluut symlink-target (worktrees staan buiten de repoRoot, onder `SCRUM4ME_AGENT_WORKTREE_DIR`); EEXIST genegeerd; overige fouten gelogd, niet gegooid. ## Test `__tests__/git/worktree.test.ts` (real-git harness): symlink-when-present (resolve dóór de link), skip-when-absent, en een **removal-safety** regressietest die vastlegt dat het verwijderen van een worktree de gedeelde `repoRoot/node_modules` niet wist (`git worktree remove`/`fs.rm` ontkoppelen de symlink, niet het target). 14/14 groen, `tsc --noEmit` clean. ## Hangt samen met - **B2 (scrum4me-docker):** `repo-bootstrap.sh` installeert de deps één keer in `~/Projects/<repo>` (volledige `npm ci`, incl. dev+optional) — deze symlink wijst daarnaar. - **Precondition (noexec):** de repoRoot/worktree-fs moet exec toestaan; op een `noexec`-mount falen de gelinkte binaries nog steeds met 126 / `ERR_DLOPEN`. Wordt apart aangepakt (exec-fs fix).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/scrum4me-mcp!26
No description provided.