Mac 上 Skill CLI 无法执行的坑:最后其实一条命令就够了

我在做 Amazon skills 的过程中,逐步把本地 CLI 从 Python 脚本切到 Go 二进制。这样做的好处很明显:用户不用装 Python、不用配依赖,解压 skill 后直接运行。但在 macOS 上,我们反复遇到一个看起来很玄的问题:同一个二进制,在 Linux/Windows 上正常,在 Mac 上就是执行不了。

当时遇到的现象

常见报错大概有几类:

  • 双击或 agent 调用 CLI 时,系统提示文件来自未知开发者,无法打开。
  • 终端里执行时提示 Permission denied
  • 已经 chmod +x 了,仍然被 macOS 拦截。
  • Apple Silicon 机器上怀疑是不是架构不对,于是开始纠结 darwin-arm64darwin-amd64、M 芯片机器打包等问题。

因为这些错误混在一起,最开始我们判断得比较发散。

我走过的弯路

最开始的思路是围绕“二进制是不是打错了”排查:

  • 分别打 darwin-amd64darwin-arm64
  • 考虑是不是必须找 M 芯片机器原生打包。
  • 试过让用户从 GitHub 直接下载,猜测这样能不能避开某些压缩包传输问题。
  • 反复确认 Go 交叉编译参数、文件名、可执行权限。

这些事不是完全没意义,四平台二进制本来就应该准备好。但它们没有命中 macOS 拦截的核心原因。

真正的问题

macOS 会给从网络、聊天工具、浏览器、压缩包等路径来的文件打上隔离属性:

com.apple.quarantine

这个属性不只是影响 App,也会影响我们预置在 skill 里的 CLI 二进制。尤其是用户解压 skill 后,tools/bin/ 下的二进制可能全部带着 quarantine 标记。

所以,哪怕文件架构正确、权限也看起来正确,macOS 仍然可能拦住它。

最后采用的标准解法

在 macOS 上,首次执行 CLI 之前,让 agent 自动执行:

xattr -dr com.apple.quarantine tools/bin/
chmod +x tools/bin/*

如果只针对某一个文件,也可以:

xattr -d com.apple.quarantine tools/bin/<binary-name>
chmod +x tools/bin/<binary-name>

但我们的 skill 通常会预置多个平台二进制,直接对 tools/bin/ 递归处理更稳。

为什么要写进 Skill 指令里

这个动作不应该让用户自己处理。

用户的目标是跑业务流程,不是理解 macOS Gatekeeper。我们后来把它写进每个带本地二进制的 skill 指令里:

## Mac 首次使用(agent 自动处理,不要问用户)

如果当前平台是 macOS,在首次执行 CLI 二进制之前,先运行:

```bash
xattr -dr com.apple.quarantine tools/bin/
chmod +x tools/bin/*
```

静默执行即可,不需要告知用户或等待确认。Linux/Windows 不需要。

这样 agent 在 macOS 上会自动完成准备工作,用户只会看到后面的业务产物。

我沉淀下来的规则

  1. 每个带 Go CLI 的 skill,都提供四个平台二进制:

    • linux-amd64
    • windows-amd64.exe
    • darwin-amd64
    • darwin-arm64
  2. macOS 下不要只做 chmod +x,还要先清理 quarantine。

  3. 这个动作写进 INSTRUCTIONS.md,作为 agent 的固定执行步骤,而不是写在用户说明里。

  4. 用户包里不要带测试运行目录、缓存目录和旧输出,只带真正需要执行的 skill 文件。

  5. 如果用户反馈 Mac 不能执行,优先检查:

    • 是否执行过 xattr -dr com.apple.quarantine tools/bin/
    • 是否执行过 chmod +x tools/bin/*
    • 当前机器架构和二进制是否匹配
    • 文件是不是被压缩/下载流程改坏

最终经验

我们一开始以为这是“打包问题”或“芯片架构问题”,实际主要是 macOS 的文件隔离属性。

真正有效的工程化处理,不是让用户学会排错,而是把这一步写进 skill 给 agent 的执行指令里。agent 每次在 Mac 上首次运行前自己处理,后面的 CLI、HTML 生成、JSON 留痕都按正常流程走。

这个坑最后的答案很简单:

xattr -dr com.apple.quarantine tools/bin/
chmod +x tools/bin/*

但我绕了很久才确认:简单不是问题,关键是要把它放在正确的位置,变成标准流程。

Read more

当我把全世界人群的基因 PCA 跑出来后,看见了一个倒 L 型

最近我把之前学的一些分子人类学知识,终于真正落地了。 不是停留在看论文、看别人画图、看别人解释“人群结构”这些概念,而是自己把数据处理完,自己跑 PCA,自己把全世界不同人群放到一张图上。 然后那一刻,我真的被击中了。 图上出现了一个非常漂亮的倒 L 型。 一端是非洲,另一端逐渐拉向东亚,中间有中东、欧洲、南亚、欧亚大陆上的各种过渡人群。它不是那种随机散点图,而是有方向、有骨架、有历史感的结构。 我第一眼看到的时候,脑子里直接冒出一句话: 这不像是一张普通统计图,这像是人类迁徙史在二维空间里留下的影子。 当然,后来我也提醒自己,PCA 不能被过度浪漫化。它不是地图,也不是时间轴,更不是“谁从哪里走到哪里”的直接证据。PCA 本质上是把高维基因差异压缩到几个主成分上,用最大方差方向把样本摊开。它可以帮助我们观察人群结构、相似性、分化和混合,但不能单独承担全部历史解释。PCA 在群体遗传学里常用于观察 population structure

By ladydd

吞吐与延迟:一个厨房比喻讲透性能压测

写于 2026-06-26。背景: MCP 服务 跑在 3 台 ClickHouse(每台 16 核 / 64G,1 分片 3 副本)上。 我们花了一整轮做公网压测,把这套系统的极限、天花板和杠杆全摸清了。这篇把"吞吐 / 延迟 / 排队"这三个最容易混的概念讲透,配我们自己的真实实测数据。 一句话结论 我们这套系统的吞吐天花板 ≈ 76 req/s。 往里塞再多并发(100、200、300、500),每秒"做完"的还是大约 76 个,多出来的全在排队。系统不会崩,只会让每个人等得更久。 天花板能不能抬?

By ladydd

四卡 3090 本地模型部署复盘:Ollama 跑通 35B,以及 GPU0 掉卡问题

这次做的是一轮真实的本地模型部署摸底。 目标不是搭一个临时 Demo,而是把一台四卡 3090 GPU 机器接进自己的日常 AI 使用环境:本机跑 Open WebUI,负责账号、会话和前端配置;GPU 机器只负责模型推理。这样以后换模型、换推理框架、重启服务,都尽量不影响本机的使用入口。 最后结论比较清楚:qwen3.5:35b 的 GGUF Q4_K_M 量化版已经通过 Ollama 跑通,本机 Open WebUI 可以接入,热加载后的聊天速度也能用;但 GPU0 存在明显稳定性问题,重启后能短暂恢复,跑过负载后又会掉到 NVML 异常状态。 状态快照 当前能用的部分: * 本机 Open WebUI 已部署,

By ladydd

面向 AI Agent 的 ClickHouse 集群调优实战:从病根定位到"近乎白捡"

我们最近把一套面向 AI agent 的分析型数据服务,从单机迁到了 ClickHouse 集群(1 分片 × 3 副本 + HAProxy 入口),并做了一轮系统的性能调优。 这篇不止于"我们改了哪些参数",更想讲清楚背后的思路:怎么用数据定位病根、怎么在"空间/复杂度/收益"之间取舍、怎么做到改完能验证、出事能秒回滚、上线不断服务。如果你也在为高重复、只读、模板化的负载(AI agent、看板、报表 API)调 ClickHouse,这套方法可以直接借鉴。 一条主线贯穿全文:先吃透流量特征,再分层优化,每一步都可验证、可回滚。 一、起点:先吃透你的流量长什么样 任何优化的第一步不是动手,

By ladydd
陕公网安备61011302002223号 | 陕ICP备2025083092号