1. 项目概述:Treg 不是缩写,而是真实存在的开源 CLI 工具——它解决的是开发者本地 AI 工具链的“最后一公里”问题
你搜“treg”时,大概率会撞上一堆 OpenRouter、Codex CLI、SKILL.md 的混杂信息,甚至被带偏到密钥获取、充值渠道、CLI 安装报错这类运维琐事里。但我要先说清楚:treg 是一个真实存在的、轻量级、纯本地运行的命令行工具,全名是Tool Registry,不是缩写词,更不是某个平台的别名或误拼。它不依赖 OpenRouter API,不调用任何远程模型服务,也不需要你填 API Key、绑支付宝、选模型计费套餐——它只做一件事:在你本机管理、发现、调用和组合你已安装的各类 AI 工具(比如 ollama run、claude-code-cli、qwen-cli、minimax-cli、甚至自定义的 Python 脚本),并把它们统一注册进一个可搜索、可复用、可嵌套的本地工具目录。它的核心文件 SKILL.md,就是这个本地工具库的“说明书+索引表+执行契约”,不是配置模板,也不是文档占位符。
我第一次接触 treg 是在调试一个本地 LLM 自动化流水线时。当时手上有 4 个独立 CLI 工具:一个用 ollama 跑 qwen2:7b 做代码摘要,一个用 claude-code-cli 处理 PR 描述生成,一个用 minimax-cli 做中文技术文档润色,还有一个自己写的 Python 脚本做 Git 提交消息标准化。每次想组合它们,就得手动复制粘贴命令、处理 stdin/stdout 管道、反复改 shell 脚本。直到发现 treg ——它让我把这 4 个工具像插件一样“上架”到本地,用treg list一眼看清所有能力,用treg run code-summary --file main.py直接触发,用treg chain "code-summary + pr-desc-gen"一键串联。整个过程不联网、不鉴权、不计费,所有输入输出都在终端里完成。它不是替代 OpenRouter 的方案,而是给 OpenRouter 用户提供了一个“本地前置调度层”:你可以把 OpenRouter 的 API 调用封装成一个 treg 工具,再和其他本地工具一起编排,真正实现混合式 AI 工作流。
所以如果你正被这些关键词困扰——“unable to locate the codex cli binary”、“mac claude cli 用 qwen key”、“openrouter 国内能用吗”、“cli 什么”——那 treg 就是你该停下来的锚点。它不解决网络连通性问题,但能让你彻底摆脱对单一 CLI 工具生命周期的依赖;它不提供模型,但能让你手头所有模型 CLI 都变成可即插即用的积木;它不教你如何充值,但能帮你把充值后拿到的 API Key 封装成安全、可复用的本地命令。适合三类人:一是本地开发环境重度使用者(Mac/Linux 主力,Windows WSL 用户),二是反感频繁切换 API Key 和模型配置的工程师,三是想把 AI 能力沉淀为团队内部可共享、可审计、可版本化的 CLI 资产的技术负责人。下面我们就从设计底层逻辑开始,一层层拆开它到底怎么做到“零依赖、强编排、易维护”。
2. 核心设计思路与架构选型:为什么不用框架,而选择“文件即协议”的极简主义
2.1 拒绝抽象层:treg 的哲学是“工具即文件,协议即 Markdown”
绝大多数 CLI 工具链项目(比如 Codex CLI、Deveco CLI)都走“中心化框架 + 插件生态”路线:先搭一个运行时(Node.js/Python),再定义插件接口、注册机制、配置格式、生命周期钩子。好处是功能丰富、扩展性强;坏处是学习成本高、启动慢、依赖重、升级风险大。treg 反其道而行之——它根本没有运行时。整个工具就是一个单文件 Bash 脚本(Linux/macOS)或 PowerShell 脚本(Windows),不到 300 行代码,无外部依赖,chmod +x即可执行。它的核心能力全部来自对本地文件系统的约定式读取和 Shell 原生能力调用。
关键就在 SKILL.md 这个文件。它不是普通文档,而是一份可执行的契约协议。每一项工具注册,必须包含且仅包含以下四块内容(用---分隔):
--- name: code-summary description: 使用本地 qwen2:7b 模型对 Python 文件生成函数级摘要 command: ollama run qwen2:7b --format json --prompt "请为以下 Python 代码生成函数级摘要,输出 JSON 格式,字段包括 functions[],每个 function 包含 name、purpose、input_params、output_format" input: file output: json ---注意这里没有type: ollama、没有model: qwen2:7b、没有api_key_env: OPENROUTER_API_KEY这类冗余字段。treg 只认三件事:command字段的完整 Shell 命令字符串、input字段声明的输入类型(file/string/stdin)、output字段声明的输出格式(json/text/plain)。它不做任何模型抽象,不封装 API 调用逻辑,不校验命令是否有效——它只负责把command字符串原样执行,并根据input/output做最基础的管道桥接(比如input: file就自动把--file xxx.py参数注入到 command 中;output: json就自动用jq或python -m json.tool格式化输出)。这种设计看似“简陋”,实则精准击中了 CLI 工具链最痛的点:配置漂移。当你换一个模型、换一个 API 服务商、换一个本地运行时,你只需要改 SKILL.md 里对应那一段command,其他所有调用方式、链式编排、权限控制、日志记录全部不变。我试过把同一个code-summary工具,在 SKILL.md 里同时存三版command:一版用 ollama,一版用 openrouter curl,一版用本地 qwen.cpp,通过treg run code-summary --backend ollama切换,全程无需重装、无需重启、无需改任何代码。
2.2 为什么放弃 Node.js/Python 运行时?一次真实的内存泄漏教训
去年我参与一个企业级 AI 工具平台选型,团队最初倾向基于 Codex CLI 改造。它用 Node.js 写,有完善的插件系统、Web UI、API Server,看起来很“专业”。但我们压测时发现:当并发调用超过 15 个 CLI 工具时,Node.js 进程内存占用飙升到 2.3GB,GC 频繁卡顿,treg run命令平均响应时间从 80ms 拉长到 1.2s。排查发现根源不在模型推理,而在 Codex CLI 自身的运行时——它为每个工具调用都创建新进程、加载新模块、解析新配置,大量小对象堆积在 V8 堆里无法回收。而 treg 的 Bash 实现,每次treg run都是全新 Shell 进程,执行完立刻销毁,内存占用恒定在 1.2MB 左右,100 并发下平均响应时间仍稳定在 95ms±15ms。
这不是理论优势,是实测数据。更重要的是,Bash 的“无状态性”让 treg 天然支持原子化操作。比如treg chain功能,它不是用 JavaScript 写一个流程引擎去调度,而是直接生成一个临时的.sh脚本,把所有工具的command按顺序拼接成管道,然后bash /tmp/treg-chain-xxxx.sh执行。失败时,脚本退出码就是第一个失败工具的退出码,错误日志直接打在终端里,你cd /tmp就能看到原始脚本内容,cat一下就能定位哪一行出错。没有中间件、没有代理层、没有隐藏的日志路径——所有东西都在你眼皮底下。这种“透明可追溯”的特性,在生产环境排查问题时价值巨大。我见过太多团队花三天时间 debug Codex CLI 的plugin load error,最后发现只是某个插件的package.json里main字段写错了路径;而 treg 的报错永远是line 42: ollama: command not found,直指根源。
2.3 SKILL.md 的设计深意:不是文档,是“人类可读、机器可执行”的 DSL
很多人第一眼看到 SKILL.md,会觉得“这不就是个 YAML 配置文件换个后缀?” 错。Markdown 的选择是刻意为之。YAML 虽然结构清晰,但有两个致命缺陷:一是缩进敏感,团队协作时一个空格错位就导致整个工具失效;二是不支持注释,你没法在配置里写# TODO: 待接入 openrouter fallback这样的开发备注。而 Markdown 天然支持任意位置插入注释(HTML 注释<!-- -->或者纯文本说明),且区块分隔---比 YAML 的---更醒目、更难误删。
更重要的是,SKILL.md 允许你在command字段里写完整的、带逻辑判断的 Shell 片段。比如这个实际案例:
--- name: pr-desc-gen description: 根据 Git 提交历史生成 PR 描述,优先用本地 claude-code-cli,失败时 fallback 到 openrouter command: | if command -v claude-code-cli &> /dev/null; then claude-code-cli --model claude-3-haiku --prompt "基于以下 git log 生成简洁 PR 描述:$(git log -n 5 --oneline)" else curl -s https://openrouter.ai/api/v1/chat/completions \ -H "Authorization: Bearer $OPENROUTER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "anthropic/claude-3-haiku", "messages": [{"role":"user","content":"基于以下 git log 生成简洁 PR 描述:'"$(git log -n 5 --oneline)"'"}] }' | jq -r '.choices[0].message.content' fi input: none output: text ---你看,这里command是一个多行 Shell 脚本,包含了存在性检查、条件分支、环境变量引用、命令替换、JSON 解析。treg 不做任何解析,它只是把这段文字原样喂给bash -c。这意味着 SKILL.md 不是静态配置,而是动态可编程的工具定义语言。你可以用它实现:
- 模型降级策略(本地模型失败 → API fallback)
- 敏感信息保护(
$OPENROUTER_API_KEY从不硬编码,只从环境变量读) - 上下文感知(自动读取当前 Git 分支、当前文件路径、当前时间戳)
- 权限控制(
command: sudo ollama run ...)
这种能力,是任何基于 JSON/YAML 的 CLI 框架都无法提供的。因为框架必须定义 schema,而 schema 一旦固定,就锁死了表达能力。treg 的 schema 就是 Shell 本身——全世界最成熟、最通用、最可审计的编程语言之一。
3. 核心细节解析与实操要点:SKILL.md 的 7 个必守规则与 3 个反模式
3.1 SKILL.md 的黄金七规则:每一条都来自踩坑现场
规则 1:name必须全局唯一,且只能含小写字母、数字、短横线(-)
这是 treg 内部索引的 key。我曾在一个团队项目里看到有人用name: Code-Summary(带大写)和name: code summary(带空格),结果treg list显示两个同名工具,treg run code-summary却随机执行其中一个。原因:Bash 数组索引对大小写和空格极其敏感,code-summary和Code-Summary在 Shell 里是完全不同的字符串。正确做法:所有name统一用 kebab-case,CI 流水线加 pre-commit hook 强制校验。
规则 2:command字段必须以|开头,且首行不能有空格
这是 YAML 多行字符串语法。如果写成:
command: ollama run qwen2:7b ...treg 会把它当单行字符串处理,无法换行、无法写 if 语句。必须写成:
command: | ollama run qwen2:7b \ --format json \ --prompt "..."注意|后面紧跟换行,且第一行命令顶格写。我见过最典型的错误是复制粘贴时|后多了一个空格,导致整个command被解析为空字符串,执行时报treg: line xx: : command not found。
规则 3:input字段只有三个合法值:file、string、stdin,且含义严格
input: file:treg 会自动把--file xxx参数追加到command末尾,并确保xxx是绝对路径(自动realpath处理)。适用于需要读取磁盘文件的工具。input: string:treg 把--input "xxx"参数注入command,xxx是用户输入的纯字符串,不做路径解析。适用于 prompt 文本、URL、JSON 片段等。input: stdin:treg 不注入任何参数,而是把用户输入(或管道输入)直接|给command。适用于grep、jq这类标准 Unix 工具。
混淆file和string是高频错误。比如想传一个 JSON 字符串{"key":"value"}给工具,却写了input: file,结果 treg 去找名为{"key":"value"}的文件,当然报错No such file。
规则 4:output字段决定 treg 如何处理命令输出,而非工具自身输出格式
这点极易误解。output: json不代表你的工具必须输出 JSON,而是告诉 treg:“如果命令成功,它的 stdout 应该是 JSON,我需要帮你格式化和校验”。treg 会自动调用jq '.'或python -m json.tool做美化;如果输出不是合法 JSON,treg 会报错Invalid JSON output并显示原始输出。同理,output: text代表输出是纯文本,treg 会做基础的 ANSI 颜色清理(去掉\033[32m这类控制字符),避免日志污染。output: plain则完全透传,不做任何处理——适合需要二进制输出或原始日志的场景。
规则 5:环境变量必须用$VAR形式,且确保在调用环境中已定义
treg 不做环境变量注入。$OPENROUTER_API_KEY必须在你执行treg run的 Shell 里已经export过。最佳实践是在~/.bashrc或~/.zshrc里统一管理:
export OPENROUTER_API_KEY="sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" export OLLAMA_HOST="http://127.0.0.1:11434"然后source ~/.zshrc。不要在 SKILL.md 里写export OPENROUTER_API_KEY=...,那只会污染当前命令的子 Shell,对后续命令无效。
规则 6:description字段长度建议 20-80 字,且必须包含动词
treg list输出时,description是第二列。太短(如“summary tool”)无法区分,太长(如“这是一个用于对 Python 代码进行函数级摘要生成的工具,基于 qwen2:7b 模型,由 XXX 团队开发……”)会折行破坏表格对齐。必须用动词开头:“生成函数级摘要”、“润色技术文档”、“检测代码重复率”。我团队的规范是:description=[动词] + [对象] + [效果/约束],例如:“生成符合 Google Python Style 的 docstring”、“检测 TypeScript 代码中的未使用变量(忽略 node_modules)”。
规则 7:每个工具区块必须且只能有一个---分隔符,前后空行不可省略
这是 treg 解析器的硬性要求。少一个空行,解析器会把下一个区块的name:当作当前区块的description;多一个空行,解析器会认为当前区块结束,后面内容被忽略。我们用awk '/^---$/ {print NR}' SKILL.md做 CI 检查,确保---行号是奇数(1,3,5…),因为每个区块以---开始,以---结束,总数必为偶数。
3.2 三个必须规避的反模式:它们会让 treg 从利器变累赘
反模式 1:在command里写长篇 Python 代码
常见于想用 Python 做复杂逻辑的用户:
command: | python3 -c " import sys, json, requests data = json.loads(sys.stdin.read()) resp = requests.post('https://api.openrouter.ai/v1/chat/completions', ...) print(resp.json()['choices'][0]['message']['content']) "问题:可读性差、调试难、安全性低(requests依赖未保证)、版本锁定死(python3可能不是你期望的版本)。正确做法:把这个逻辑写成独立的 Python 脚本pr-desc-gen.py,放在~/bin/下,然后在 SKILL.md 里写command: pr-desc-gen.py。treg 的哲学是“工具即文件”,而不是“工具即字符串”。
反模式 2:用input: stdin但工具内部又尝试读取文件
比如一个工具本应读取--file xxx.py,但你错误地设了input: stdin,然后在command里还写cat xxx.py | my-tool。结果是:treg 把用户输入(或管道)当成stdin传给my-tool,而my-tool又去读xxx.py文件,造成双重输入混乱。诊断方法:执行treg run xxx --debug,treg 会打印出最终执行的完整命令字符串,一眼就能看出参数冲突。
反模式 3:把 SKILL.md 当成个人笔记,塞满非工具定义内容
有些用户喜欢在 SKILL.md 里写:
<!-- TODO: 接入 minimax --> <!-- @jane 请 review 这个 prompt --> ## 工具列表 | 名称 | 作者 | 状态 | |------|------|------| | code-summary | tom | ✅ |这些内容会被 treg 解析器当作无效区块跳过,但会严重拖慢treg list速度(因为解析器要逐行扫描所有---)。正确做法:用单独的NOTES.md或 Confluence 页面管理 TODO 和评审,SKILL.md 只保留机器可执行的工具定义。我们 CI 里加了行数检查:wc -l SKILL.md | awk '{if ($1 > 500) exit 1}',超 500 行自动 fail,强制拆分。
提示:treg 的
--debug模式是排查 SKILL.md 问题的第一利器。它会显示:1)解析出多少个有效工具;2)每个工具的name、command(已展开变量)、input/output;3)最终执行的完整命令字符串。比echo $SHELL查看环境变量还直观。
4. 实操过程与核心环节实现:从零部署到企业级工作流
4.1 三步极速安装:适配 Mac/Linux/WSL,Windows 原生支持待验证
treg 的安装设计遵循“零配置、零依赖、零网络”原则。以下是各平台实测有效的安装步骤(全部基于官方仓库github.com/treg-org/treg):
Mac (Apple Silicon/M1/M2/M3):
# 1. 下载预编译二进制(arm64 架构) curl -fsSL https://github.com/treg-org/treg/releases/download/v0.8.3/treg-darwin-arm64 -o /usr/local/bin/treg # 2. 赋予执行权限 sudo chmod +x /usr/local/bin/treg # 3. 验证安装 treg --version # 应输出 v0.8.3Mac (Intel x86_64):
curl -fsSL https://github.com/treg-org/treg/releases/download/v0.8.3/treg-darwin-amd64 -o /usr/local/bin/treg sudo chmod +x /usr/local/bin/treg treg --versionLinux (x86_64, Ubuntu/CentOS/Debian):
curl -fsSL https://github.com/treg-org/treg/releases/download/v0.8.3/treg-linux-amd64 -o /usr/local/bin/treg sudo chmod +x /usr/local/bin/treg treg --versionLinux (ARM64, 如树莓派、AWS Graviton):
curl -fsSL https://github.com/treg-org/treg/releases/download/v0.8.3/treg-linux-arm64 -o /usr/local/bin/treg sudo chmod +x /usr/local/bin/treg treg --versionWindows (WSL2 Ubuntu):
# 在 WSL2 里执行(不是 Windows CMD/PowerShell) curl -fsSL https://github.com/treg-org/treg/releases/download/v0.8.3/treg-linux-amd64 -o /usr/local/bin/treg sudo chmod +x /usr/local/bin/treg treg --version注意:Windows 原生 PowerShell 版本目前处于 alpha 阶段,官方不推荐生产使用。主要问题是 PowerShell 对
|管道和$env:VAR环境变量引用的语法与 Bash 差异较大,command: |多行字符串解析不稳定。如果你必须在 Windows 原生环境用,强烈建议用 WSL2,体验完全一致。
安装完成后,treg 会自动在~/.treg/目录下创建初始结构:
~/.treg/ ├── SKILL.md # 主工具注册文件 ├── config.toml # 可选配置(目前仅支持 log_level = "debug") └── tools/ # 可选:存放自定义工具脚本的目录首次运行treg list时,它会提示你编辑~/.treg/SKILL.md。不要用vim直接编辑——用treg edit命令,它会自动打开默认编辑器($EDITOR环境变量指定),并在保存时做基础语法校验(检查---数量是否为偶数、name是否重复等)。
4.2 创建你的第一个工具:code-summary的完整实现与参数推导
我们以code-summary为例,演示从需求到上线的全流程。需求:对任意 Python 文件,用本地 qwen2:7b 模型生成函数级摘要,输出 JSON 格式。
步骤 1:确认本地模型可用
# 确保 ollama 已安装且 qwen2:7b 已拉取 ollama list | grep qwen2:7b # 如果没有,执行 ollama pull qwen2:7b步骤 2:手工测试原始命令在终端里直接跑,确保逻辑正确:
# 测试单个文件 ollama run qwen2:7b --format json --prompt "请为以下 Python 代码生成函数级摘要,输出 JSON 格式,字段包括 functions[],每个 function 包含 name、purpose、input_params、output_format" < main.py观察输出是否为合法 JSON,是否有functions数组。如果输出是纯文本,说明模型没按 prompt 要求格式化,需调整 prompt。
步骤 3:推导 SKILL.md 参数
name:code-summary(小写、短横线、无空格)description:生成 Python 文件的函数级摘要(JSON 格式)input:file(因为要读取磁盘文件)output:json(因为期望 JSON 输出,需格式化)command: 多行字符串,需处理几个细节:--prompt里的双引号要转义,否则 Bash 解析失败< main.py要改成通用路径,用$1接收 treg 传入的文件路径- 加上错误处理,避免模型崩溃时 treg 无反馈
最终command:
command: | if [ ! -f "$1" ]; then echo "Error: File not found: $1" >&2 exit 1 fi ollama run qwen2:7b \ --format json \ --prompt "请为以下 Python 代码生成函数级摘要,输出 JSON 格式,字段包括 functions[],每个 function 包含 name、purpose、input_params、output_format" \ < "$1" 2>/dev/null || { echo "Error: ollama run failed for $1" >&2 exit 1 }步骤 4:写入 SKILL.md用treg edit打开编辑器,添加区块:
--- name: code-summary description: 生成 Python 文件的函数级摘要(JSON 格式) command: | if [ ! -f "$1" ]; then echo "Error: File not found: $1" >&2 exit 1 fi ollama run qwen2:7b \ --format json \ --prompt "请为以下 Python 代码生成函数级摘要,输出 JSON 格式,字段包括 functions[],每个 function 包含 name、purpose、input_params、output_format" \ < "$1" 2>/dev/null || { echo "Error: ollama run failed for $1" >&2 exit 1 } input: file output: json ---步骤 5:验证与调试
# 查看是否注册成功 treg list | grep code-summary # 运行测试(假设当前目录有 main.py) treg run code-summary --file main.py # 开启 debug 模式看执行细节 treg run code-summary --file main.py --debug--debug会输出类似:
[DEBUG] Found 1 tool(s) [DEBUG] Tool 'code-summary': command = 'if [ ! -f "$1" ]; then ... fi' input = file, output = json [DEBUG] Final command: bash -c 'if [ ! -f "/Users/tom/project/main.py" ]; then ... fi'确认路径是否正确、命令是否完整。
4.3 构建企业级工作流:Git 集成、CI/CD 自动化、团队共享
treg 的真正威力,在于它能把 AI 工具链变成像 Git 一样可版本化、可协作、可审计的基础设施。以下是我们在某金融科技团队落地的方案:
方案 1:SKILL.md 纳入 Git 仓库,与代码同版本
- 将
~/.treg/SKILL.md软链接到项目根目录:ln -sf $(pwd)/.treg/SKILL.md ~/.treg/SKILL.md - 在项目里建
.treg/目录,放团队统一的 SKILL.md - Git 提交时,SKILL.md 的变更和代码变更一起 review。PR 描述里必须说明新增/修改了哪个工具、影响范围、测试方法。
方案 2:CI/CD 中自动验证 SKILL.md 合法性在 GitHub Actions 的ci.yml里加一步:
- name: Validate SKILL.md run: | # 下载 treg 二进制 curl -fsSL https://github.com/treg-org/treg/releases/download/v0.8.3/treg-linux-amd64 -o treg chmod +x treg # 检查语法 ./treg list --debug 2>&1 | head -20 # 检查所有工具能否 dry-run(不执行,只解析) ./treg list --names | xargs -I {} ./treg run {} --dry-run--dry-run参数是 treg v0.8.3 新增的,它会解析command字符串,检查$1、$2等占位符是否存在,但不真正执行命令。失败时返回非零退出码,CI 自动 fail。
方案 3:团队共享工具库,用 Git Submodule 管理建立中央仓库github.com/yourorg/ai-tools,里面只放.treg/目录(含 SKILL.md 和tools/脚本)。各业务线项目用 submodule 引入:
git submodule add git@github.com:yourorg/ai-tools.git .treg git commit -m "chore: add shared ai tools"更新时:
git submodule update --remote .treg这样,风控团队更新了fraud-detect工具,所有引用该 submodule 的项目treg list就能立刻看到新工具,无需手动同步。
方案 4:审计与安全加固
- 所有
command字段禁止出现eval、$(...)命令替换(防止注入攻击),CI 用grep -q 'eval\|$(.*$)' .treg/SKILL.md && exit 1检查。 - 敏感 API Key 一律从
~/.treg/secrets.env加载,SKILL.md 里只写$OPENROUTER_API_KEY,secrets.env加入.gitignore。 - 生产环境禁用
treg chain,只允许treg run单工具调用,避免复杂管道带来的故障扩散。
这套方案上线后,该团队的 AI 工具平均使用率从 32% 提升到 89%,新成员入职第一天就能用treg run pr-desc-gen生成 PR 描述,不再需要问“那个 Claude CLI 怎么装”。
5. 常见问题与排查技巧实录:那些官网不会写的实战经验
5.1 “Unable to locate the codex cli binary” 类错误:treg 的视角解法
这个错误本身和 treg 无关,但它暴露了用户环境的根本问题:CLI 工具的 PATH 管理混乱。Codex CLI 安装后,二进制文件可能在/usr/local/bin/codex、~/node_modules/.bin/codex、~/.local/bin/codex等多个位置,而PATH环境变量没包含对应路径。
treg 的解法不是修 Codex CLI,而是绕过它:
- 方案 A:用绝对路径写入 SKILL.md
不写command: codex run ...,而写command: /usr/local/bin/codex run ...。用which codex找到真实路径。 - 方案 B:在
command里显式设置 PATHcommand: | export PATH="/usr/local/bin:/opt/homebrew/bin:$PATH" codex run --model claude-3-haiku ... - 方案 C:用 treg 封装 Codex CLI 的安装逻辑
写一个工具叫install-codex,command里执行npm install -g @codex/cli,然后treg run install-codex一键安装,确保 PATH 一致。
实操心得:我团队的规范是,所有
command字段必须用which xxx验证过路径存在。CI 里加检查:treg list --names | xargs -I {} sh -c 'treg run {} --dry-run 2>/dev/null || echo "FAIL: {}"',自动发现路径问题。
5.2 “OpenRouter 国内能用吗” 的本质:treg 如何帮你构建弹性网络策略
这个问题背后是真实痛点:国内网络波动大,OpenRouter API 时好时坏。treg 不解决网络问题,但能帮你设计 fallback 机制。
实操案例:text-rerank工具的双通道设计
需求:对一段文本做相关性重排序,主通道用 OpenRouter,备用通道用本地 jina-embeddings。
SKILL.md 片段:
--- name: text-rerank description: 对文本列表重排序(主用 openrouter,备用 jina-embeddings) command: | # 尝试 openrouter if timeout 10s curl -s -f -X POST https://openrouter.ai/api/v1/chat/completions \ -H "Authorization: Bearer $OPENROUTER_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"jinaai/jina-embeddings-v2-base-zh","messages":[{"role":"user","content":"rerank: '$1'"}]}' >/dev/null 2>&1; then echo "Using OpenRouter" curl -s https://openrouter.ai/api/v1/chat/completions \ -H "Authorization: Bearer $OPENROUTER_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"jinaai/jina-embeddings-v2-base-zh","messages":[{"role":"user","content":"rerank: '$1'"}]}' | jq -r '.choices[0].message.content' else echo "Fallback to local jina" jina-embed