compile: write copies instead of symlinks so Windows checkouts install - #4
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
compile.mjswrites copies instead of symlinks — for the root marketplace manifests, every bundle's.claude-plugin/+.cursor-plugin/plugin.json, and every standalone skill'sskills/<slug>folder and manifest under.compiled/. File layout, discovery and marketplace generation are unchanged;ensureSymlinkbecameensureCopy(fs.cp, lstat-based replace so a stale symlink from an older checkout is removed too). Identical to Yesterday-AI/yesterday-skills#4 (which additionally hoistsagents/).Why
/plugin marketplace add Yesterday-AI/skillsfails on every Windows machine:.claude-plugin/marketplace.jsonwas a git symlink to../.compiled/marketplace.json. Git on Windows without Developer Mode (core.symlinks=false, the default) checks a symlink out as a 29-byte text file containing the target path — and Claude Code parses that as JSON. Reproduced with a fresh clone. The same defect sat one step behind every install: all 49 tracked symlinks (bundle manifests, standalone skill folders,.plugin.jsonlinks) would have failed the same way right after the marketplace loaded. This is the "check whatgit clonedoes with symlinks across platforms" item that.ytstack/STATE.mdhad listed as required evidence since May; the entry is now closed with it.Requirement (owner): the catalog must work for Windows users without enabling symlinks on their machines. Supersedes the 2026-05-08 "symlink source folder" decision; its reason — "copies would drift" — no longer holds because
compile.ymlregenerates the whole generated tree on every push tomain.Verified
node clean.mjs && node compile.mjscompletes on the Windows machine where the symlink version died withEPERM.git ls-files -s | grep ^120000→ empty; 38 mode changes120000 → 100644; every manifest is real JSON.paperclip.shrestored to100755like its source (a Windows-sidegit addrecords100644; documented in KNOWLEDGE.md).cmpspot-checks incl. the Excalidraw libraries); full-diff grep for secrets / OS junk / VCS dirs: nothing..ytstack/{DECISIONS,KNOWLEDGE,STATE,PROJECT,RUNTIME}.md.Size
~63k insertions, almost entirely the Excalidraw libraries copied under
.compiled/skill-plugins/excalidraw-diagram/— the cost of copies over symlinks. Read.compiled/as generated.After merge
CI's
compile.ymlshould produce no follow-up diff. If it commits something, that diff is the review item.