Skip to content

🐛 Fix Windows install by dropping tracked symlink and using source "./"#4

Merged
u-ichi merged 1 commit into
mainfrom
fix/windows-symlink-marketplace-source
Jul 7, 2026
Merged

🐛 Fix Windows install by dropping tracked symlink and using source "./"#4
u-ichi merged 1 commit into
mainfrom
fix/windows-symlink-marketplace-source

Conversation

@u-ichi

@u-ichi u-ichi commented Jul 7, 2026

Copy link
Copy Markdown
Owner

Summary

  • Windows で claude plugin marketplace add によるインストールが「成功表示なのに plugin cache が空」になる不具合を修正
  • 原因: plugins/compact-plus.. への symlink として repo に含めていたため、Windows の git は既定で「.. と書かれた通常テキストファイル」として checkout する。結果として marketplace.jsonsource: "./plugins/compact-plus" が non-directory を指し、claude plugin install は success を返しつつ空 cache を書く
  • 修正: marketplace.jsonsource"./" (marketplace root 自身) に変更し、追跡 symlink を削除。合わせて version 1.0.2 → 1.0.3 (3 slot) と、CI に "tracked symlink 禁止" guard を追加

Reported and workaround confirmed on Windows by @hinata_reira: https://x.com/hinata_reira/status/1941826018472849523

Related upstream issues (context): anthropics/claude-code#54967, #53948, #52435 (Windows symlink handling).

Changes

  • .claude-plugin/marketplace.json: source ./plugins/compact-plus./, metadata.versionplugins[0].version を 1.0.2 → 1.0.3
  • .claude-plugin/plugin.json: version 1.0.2 → 1.0.3
  • plugins/compact-plus: 追跡 symlink を削除
  • .github/workflows/test.yml: git ls-files -s | grep '^120000' で追跡 symlink を検出する step を追加 (project policy)

Test plan

  • standalone: python3 -m json.tool で plugin.json / marketplace.json / hooks.json validate、bash -n hooks/*.sh、version 3 slot 一致、git ls-files -s | grep '^120000' empty
  • guard 破損条件検出: main HEAD (symlink あり) に対し git ls-files -s | grep '^120000' が hit (guard は fail する)
  • system-integrated (壊れ再現): git clone -c core.symlinks=false --branch mainclaude plugin validateENOTDIR ... plugins/compact-plus/.claude-plugin/plugin.json で fail、隔離 CLAUDE_CONFIG_DIRinstall が exit 1、cache 空 (Windows 症状の間接再現成立)
  • system-integrated (修正済み): 同じ手順を本 branch に対し実行 → validate pass、install success、cache に hooks/skills/prompts/.claude-plugin/plugin.json 実在
  • regression: 通常 clone (symlink 有効) でも同経路で install 成功
  • 独立検証: 別 agent (verifier) が同一の 6 観点 + 見落としリスク 1 観点で再現し、全 pass、指摘なし
  • Windows 実機検証: 実機がないため未実施。core.symlinks=false clone による間接再現 + 報告者の Windows 実機による workaround 確認で代替

Notes

  • source: "./" により repo root 全体 (README / docs / .github 含む) が plugin cache へコピーされる。公式仕様通りで動作影響なし (許容事項)
  • version bump しないと plugin.json の version 固定仕様により既存インストール済みユーザーへ更新が配信されないため 1.0.3 は必須

🤖 Generated with Claude Code

Windows git checkout materializes tracked symlinks as text files unless
core.symlinks=true. The former plugins/compact-plus -> .. symlink became
a `..` text file on Windows, so source: "./plugins/compact-plus" resolved
to a non-directory and `claude plugin install` reported success while
writing an empty cache.

- .claude-plugin/marketplace.json: source ./plugins/compact-plus -> ./,
  metadata.version and plugins[0].version 1.0.2 -> 1.0.3
- .claude-plugin/plugin.json: version 1.0.2 -> 1.0.3
- plugins/compact-plus: remove the tracked symlink
- .github/workflows/test.yml: reject tracked symlinks (project policy) to
  prevent regression on Windows install

Verified by reproducing the failure with git clone -c core.symlinks=false
against main (validate/install fail with ENOTDIR, cache empty), then
confirming the same clone of this branch validates, installs, and
populates the cache with hooks/skills/prompts/.claude-plugin content.
Regression check with a normal clone also passes.
@u-ichi u-ichi merged commit 633e1af into main Jul 7, 2026
2 checks passed
@u-ichi u-ichi deleted the fix/windows-symlink-marketplace-source branch July 7, 2026 05:59
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