bug: skills add fails with EPERM on macOS 26 -- giget cache in shared ~/.cache collides with app-data protection

未關閉
#603 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

評估

難度
3/5
預估耗時
1-2 天
新手友好度
55/100
Issue 類型
缺陷
描述清晰度
基本清楚
活躍度
冷清
技術堆疊
macos

研究方向

從 skills 安裝器中的 clearGigetCache() 開始,追蹤 giget 的下載呼叫,以查看其快取目錄是如何選擇的。重現回報中的 cmd skills add 命令,然後確認下載使用 ~/.commandcode/cache/giget,且損毀封存檔的清理會針對相同位置,包括設定 XDG_CACHE_HOME 時也是如此。

由索引模型根據 Issue 內容生成。

描述

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

  1. Point giget's download cache at a directory Command Code already owns -- ~/.commandcode/cache/giget -- instead of the shared ~/.cache/giget. Setting XDG_CACHE_HOME for the giget call (or using its cache-dir option if available) is sufficient.
  2. 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 sets XDG_CACHE_HOME themselves), the corrupted-archive recovery path clears the wrong directory and the retry loop can never self-heal.
  3. 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).

主要語言
沒有語言資料
星號
4k
分支
350
PR 合併指標
30 天內沒有已合併 PR

貢獻指南

這個儲存庫沒有索引到貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

CommandCodeAI/command-code 的其他 Issue

查看 CommandCodeAI/command-code 的全部 Issue

相似的 Issue

更多 CLI Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。