fix(#2383): untrack node_modules — accidentally committed as a hardcoded absolute-path symlink (#2385)

* fix(#2383): untrack node_modules — accidentally committed as a hardcoded absolute-path symlink

cf004df67 (#2360/#2364) swept node_modules into git as a tracked
120000 (symlink) blob pointing at /Users/trekkie/projects/gsd-core/node_modules
— a path specific to one contributor's machine. .gitignore already
lists node_modules/, so this was almost certainly a broad `git add`
run while node_modules happened to be a symlink at that path, not
intentional (git add on an explicitly-added path isn't blocked by
.gitignore).

Two concrete problems this caused: (1) anyone else cloning the repo,
or any CI runner, checks out a symlink pointing at a path that does
not exist on their machine; (2) it silently self-heals for most
people (npm ci detects the checked-out symlink is "not a directory"
and replaces it), but anyone who runs a tool directly against
node_modules/.bin/* before ever running npm ci hits ENOENT/ELOOP
failures that read as environment corruption and are expensive to
diagnose — exactly what happened while preparing PR #2380 before this
tracked entry was found to be the actual root cause.

git rm --cached only, no working-tree content touched. .gitignore
already covers node_modules/ going forward; confirmed via
`git show cf004df67 --stat` that no other file was swept into that
same commit by the same mistake.

Closes #2383

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#2383): gitignore node_modules regardless of file type

node_modules/ (trailing slash) only matches directories, so it never
suppressed the worktree-sharing symlink some worktrees use to point
node_modules back at the main checkout — every such worktree showed a
perpetual, un-ignorable "?? node_modules" in git status, exactly the
noise that trains people to stop reading git status output. Dropping
the trailing slash matches node_modules regardless of whether it's a
real directory, a file, or a symlink, which is what every other repo's
node_modules ignore rule actually needs to do. Found while directly
verifying #2383's untrack fix was complete, not assumed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* chore: regenerate cursor golden-install-parity fixture after rebase

next advanced again during rebase — #2386 (fix #2341, "de-dup Cursor
menu by marking skills user-invocable:false") landed and legitimately
changed every cursor SKILL.md's content. Confirmed via git log that
this is the explanation before committing: all 71 changed hash entries
are isolated to cursor.json, matching a runtime-specific skill-output
change, not noise.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix: regenerate cursor golden fixture from a clean clone (worktree was stale)

Local worktree regeneration didn't match CI's clean-room result despite
multiple attempts; a fresh clone + npm ci + regenerate in isolation
produced a different, correct result. Using that.

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Tom Boucher
2026-07-17 17:56:28 -04:00
committed by GitHub
parent f15eb5f5c9
commit d91e32b3ce
2 changed files with 1 additions and 2 deletions

2
.gitignore vendored
View File

@@ -1,4 +1,4 @@
node_modules/
node_modules
.DS_Store
# ESLint cache

View File

@@ -1 +0,0 @@
/Users/trekkie/projects/gsd-core/node_modules