CommandCodeAI / CommandCodeAI/command-code
bug: skills add fails with EPERM on macOS 26 -- giget cache in shared ~/.cache collides with app-data protection
還沒有人認領這個 Issue。
- 主要語言
- 沒有語言資料
- 星號
- 4k
- 分支
- 350
- PR 合併指標
- 30 天內沒有已合併 PR
描述
Problem
cmd skills add downloads repos via giget, which defaults its cache to the shared ~/.cache/giget. On macOS 26 (Tahoe), this breaks with a confusing error:
$ cmd skills add owner/repo/path --global -f
✘ Failed to fetch "owner/repo": EPERM: operation not permitted, mkdir '/Users/callsen/.cache/giget'
Root cause: macOS Tahoe stamps directories with a com.apple.provenance xattr identifying the creating app, and denies access to processes attributed to other apps -- reportedly even when the app has Full Disk Access (see Apple Community discussion on 26.4 third-party app stamps: https://discussions.apple.com/thread/256294444). ~/.cache is shared by many CLIs across many host apps (terminal emulators, IDEs, other agents), so whichever app first created ~/.cache/giget effectively owns it. Run cmd from a different terminal app and the mkdir/stat gets EPERM. The kernel returns EPERM rather than EEXIST, so the error misleadingly suggests a local permissions problem.
Observed on v1.5.0, macOS 26 (Darwin 25.3), where ~/.cache contained a dozen subdirs unreadable by the invoking terminal (giget, codex-runtimes, huggingface, starship, ...), all created by tools running under other host apps.
Workaround (confirmed working)
giget honors XDG_CACHE_HOME:
XDG_CACHE_HOME="$HOME/.commandcode/cache" cmd skills add owner/repo/path --global -f
This works because ~/.commandcode is created by cmd itself, so the invoking app owns its provenance stamp.
Proposal
- Point giget's download cache at a directory Command Code already owns --
~/.commandcode/cache/giget-- instead of the shared~/.cache/giget. SettingXDG_CACHE_HOMEfor the giget call (or using its cache-dir option if available) is sufficient. - Fix the related hardcoded path:
clearGigetCache()in the skills installer rm-rf's~/.cache/giget/gh/<owner>-<repo>unconditionally. If the cache moves (or a user setsXDG_CACHE_HOMEthemselves), the corrupted-archive recovery path clears the wrong directory and the retry loop can never self-heal. - Optionally: on EPERM from the cache path, surface a hint about macOS app-data protection rather than the raw errno, since the failure reads like a filesystem permissions bug and is not.
On macOS 26 this is a correctness issue, not a preference: any user who installs skills from a different terminal app than the one that first populated ~/.cache/giget hits a hard failure.
Related: #602 (skills update/provenance).
貢獻指南
這個儲存庫沒有索引到貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
從 skills 安裝器中的 clearGigetCache() 開始,追蹤 giget 的下載呼叫,以查看其快取目錄是如何選擇的。重現回報中的 cmd skills add 命令,然後確認下載使用 ~/.commandcode/cache/giget,且損毀封存檔的清理會針對相同位置,包括設定 XDG_CACHE_HOME 時也是如此。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- macos
- 領域
- cli, operating-systems
- Issue 類型
- 缺陷
- 難度
- 3/5
- 預估耗時
- 1-2 天
- 活躍度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 55/100