【Trellis】跨 20+ Coding Agent 的元 Harness:4 阶段循环 + 共享事件日志深度拆解
一个反常识的结论:当下最被低估的 Harness 项目,不是 Claude Code、也不是 DeepAgents,而是
mindfold-ai/Trellis——13.1k⭐、AGPL-3.0、TypeScript 实现,同时挂在 20+ 个 Coding Agent 之上。它把”AI 写代码”这件事抽象成了一条 4 阶段流水线(Plan → Implement → Verify → Finish),并用一个 durable events.jsonl 日志 把主 Agent、Implement Sub-Agent、Check Sub-Agent、Research Sub-Agent 全部串在同一根时间线上。本文不是 README 翻译,而是从源码出发,拆它怎么用 Supervisor 进程桥接不同 Provider 的 stream-json、用 Context Trust + Path Traversal 防护来阻止 Sub-Agent 越权读.ssh/、以及用 OOM Guard 防止 Worker 进程无限增长。
前言:为什么在 14 个 Harness 横评之后又写 Trellis?
过去 14 天我把 Harness 6 件套的 Rule / Skill / Sub-Agent / Workflow / Script / MCP 都拆过一遍——jcode、aden-hive、OpenHarness、DeepAgents、plano、spec-kit、browser-use、oh-my-openagent、ECC、Dapr Agents、Helicone……每个项目都解决了一个非常具体的问题,但有一个共同的盲点:
它们每一个都假设你只用一套 Agent。
jcode 是 Rust 自己写的,aden-hive 围绕自家 Swarm API,DeepAgents 锁死 LangGraph,OpenHarness 围绕 Claude Code,plano 围绕 Envoy——你换一个 Provider,整个 Harness 就要推倒重来。
但真实的工程团队不是单 Agent 世界。一个项目可能同时跑 Claude Code(深度规划)+ Codex(代码生成)+ Cursor(IDE 内联修改)+ Aider(命令行 commit)+ OpenCode(多模型路由)——Harness 应该跨在它们之上,而不是绑定其中任何一个。
mindfold-ai/Trellis 恰好在做这件事。它把自己定位成 “an out-of-the-box engineering framework for AI coding”,并把这件事拆成了两层:
- Spec 层(
.trellis/spec/)—— 团队的工程标准 / Rule / Skill 用 markdown 写进仓库 - Channel 层(
trellis channel ...)—— 多 Agent 协作的事件日志 + Supervisor 桥接
下面从源码逐层拆开。
一、定位:一个跨 Provider 的「元 Harness」
1.1 Trellis 不是 Agent,是 Agent 之间的协议层
先看 README 第一句就划清了边界:
An out-of-the-box engineering framework for AI coding. AI writes code fast, but every session it starts from scratch — no memory of your project, your conventions, or your team’s requirements. Trellis persists specs, tasks, and memory into your repo, so any coding agent works to your engineering standards.
关键词是 “any coding agent”。Trellis 的 README 列出的 5 项能力是:
| 能力 | 它改了什么 |
|---|---|
| Auto-injected specs | 团队规范写一次在 .trellis/spec/,每次新会话自动注入相关上下文 |
| Task-centered workflow | PRD、设计稿、review context、任务状态都进 .trellis/tasks/ |
| Project memory | .trellis/workspace/ 里的日记保留上一次会话做了什么 |
| Team-shared standards | Spec 进仓库,一次写全团队受益 |
| Multi-platform setup | 同一份 Trellis 结构适配 20+ AI 编码平台 |
而相比 CLAUDE.md / AGENTS.md / .cursorrules,Trellis 自己在 README FAQ 里给了反对比:
Those files are useful entry points, but they tend to become monolithic. Trellis adds scoped specs, task PRDs, workflow gates, workspace memory, and platform-aware generated files around them.
1.2 调研快照(2026-07-24)
| 维度 | 数值 | 来源 |
|---|---|---|
| ⭐ Stars | 13,124 | GET /repos/mindfold-ai/Trellis |
| 📦 默认分支 | main | Repo API |
| 🛠️ 主语言 | TypeScript | Repo API(占比 88.4%) |
| 📜 许可证 | AGPL-3.0 | Repo API |
| 🧩 平台支持 | 20+ 平台 | packages/cli/src/templates/ 下的目录数 |
| 📦 npm 包名 | @mindfoldhq/trellis | README |
| 📅 最近 commit | 2026-07-24 14:54Z | Repo API |
| 📐 仓库大小 | 241 MB | Repo API |
| 🏷️ Topics | agentic-coding, ai-workflow, claudecode, codex, harness | Repo API |
关键事实:Trellis 的 CLI 同时给 Claude Code、Codex、Cursor、OpenCode、Qoder、CodeBuddy、Droid、Gemini CLI、Copilot、Kiro、Aider、Pi 等都生成对应的 .claude/、.codex/、.cursor/、.opencode/ 目录——一个 trellis init 命令把 Harness 注入 20 个 Provider。
二、架构总览:4 阶段循环 + 4 层目录
2.1 4 阶段循环
Trellis 的核心是 README 里一句话写死的 4 阶段循环:
graph LR
P["🧠 Phase 1<br/>Plan<br/>trellis-brainstorm"]
I["⚙️ Phase 2<br/>Implement<br/>trellis-implement"]
V["✅ Phase 3<br/>Verify<br/>trellis-check"]
F["🏁 Phase 4<br/>Finish<br/>trellis-finish-work"]
P -->|"prd.md<br/>design.md<br/>implement.jsonl"| I
I -->|"uncommitted diff"| V
V -->|"self-fixed diff<br/>+lint/typecheck/test"| F
F -.->|"archive task<br/>update spec"| P
style P fill:#C7CEEA,stroke:#9FA8DA,color:#333
style I fill:#E8D5F5,stroke:#CE93D8,color:#333
style V fill:#B5EAD7,stroke:#80CBC4,color:#333
style F fill:#FFDAB9,stroke:#FFAB76,color:#333每一阶段都有专门的 Skill + Sub-Agent:
| Phase | 触发 Skill | 派生的 Sub-Agent | 关键产物 |
|---|---|---|---|
| Plan | trellis-brainstorm | trellis-research | prd.md + research files + implement.jsonl |
| Implement | trellis-implement | (无 / 主 session 执行) | uncommitted diff |
| Verify | trellis-check | (无 / 主 session 执行) | self-fixed diff + lint / typecheck / test |
| Finish | trellis-finish-work | trellis-update-spec | archived task + updated .trellis/spec/ |
命名细节:Trellis 把 Sub-Agent 走主 Agent spawn 子进程叫
trellis-implement/trellis-check/trellis-research(与 Skill 同名),而.trellis/agents/里真正落盘的是plan.md/implement.md/check.md/research.md/architect.md五张 agent card。
2.2 仓库的 4 层目录结构
trellis init 在你的仓库里创建的结构:
graph TB
ROOT["📂 你的仓库根目录"]
ROOT --> S[".trellis/spec/<br/>📜 项目规范<br/>Rule / Skill / Guide"]
ROOT --> T[".trellis/tasks/<br/>📋 任务工作区<br/>prd.md + design.md + jsonl"]
ROOT --> W[".trellis/workspace/<br/>📓 团队日记<br/>per-developer"]
ROOT --> C[".trellis/config.yaml<br/>⚙️ 通道配置<br/>trusted_context_dirs"]
ROOT --> H1[".claude/"]
ROOT --> H2[".codex/"]
ROOT --> H3[".cursor/"]
ROOT --> H4[".opencode/"]
ROOT --> H5[".pi/, .omp/, ..."]
style ROOT fill:#F5F5F5,stroke:#999,color:#333
style S fill:#B5EAD7,stroke:#80CBC4,color:#333
style T fill:#E8D5F5,stroke:#CE93D8,color:#333
style W fill:#FFF9C4,stroke:#F9A825,color:#333
style C fill:#FFB3C6,stroke:#F48FB1,color:#333
style H1 fill:#C7CEEA,stroke:#9FA8DA,color:#333
style H2 fill:#FFDAB9,stroke:#FFAB76,color:#333
style H3 fill:#C7CEEA,stroke:#9FA8DA,color:#333
style H4 fill:#FFDAB9,stroke:#FFAB76,color:#333
style H5 fill:#C7CEEA,stroke:#9FA8DA,color:#333.trellis/ 是所有 Provider 共享的真相源;.claude/、.codex/、.cursor/ 这些是 trellis init 自动生成的 Provider 专用胶水(agents / commands / skills / hooks / settings.json / hooks.json)。
三、4 阶段循环的源码实现
3.1 Plan 阶段:trellis-brainstorm Skill
源码 .agents/skills/trellis-brainstorm/SKILL.md(共 201 行)开篇就抛出了两条不可违反的契约:
1 | ## Non-Negotiable Planning Contract |
接下来是 Evidence Rule:
1 | ## Non-Negotiable Evidence Rule |
这条规则决定 Trellis 不是简单的”问 10 个问题”——它是”先查代码、查 spec、查 task 历史,能查到的不问用户”。这是它和大多数 planning skill 最大的区别。
实际执行流:
1 | # Step 1: 创建任务目录(TASK_DIR 形如 .trellis/tasks/07-25-my-task) |
可运行示例:把”加 dark mode”变成可执行 PRD
下面是一个真实可运行的 5 行示例——用 Trellis CLI 创建一个任务,PR 都会被 task.py archive 自动 commit 进 .trellis/tasks/:
1 | # 安装 |
预期输出:
1 | ✓ Trellis installed for user alice |
3.2 Plan 阶段的 Research Sub-Agent
trellis-research Sub-Agent 不是简单的”上网搜”——它的核心规则写在 .trellis/agents/research.md 里:
1 | ## Step 3: External Research (SDKs, Libraries, GitHub Projects, APIs) |
然后是强制 fetch 规则:
| Target type | How to actually fetch it |
|---|---|
| GitHub repo | git clone --depth 1 https://github.com/<org>/<repo> /tmp/research-<slug> then read/grep the real files. Use --filter=blob:none for huge repos. |
| Single file from GitHub | curl -sSL https://raw.githubusercontent.com/<org>/<repo>/<ref>/<path> -o /tmp/<name> |
| Docs site / blog | web_search → pick the exact page → curl -sSL <url> | pandoc -f html -t gfm |
为什么这条规则重要:99% 的”research sub-agent”返回的是带链接的总结,implement agent 还要自己 clone 一遍。Trellis 把 research 拆成两段契约——research 负责把真源拉进 /tmp/,implement 负责读 /tmp/ 而不是 search——把 io-bound 集中到 research 阶段。
3.3 Implement 阶段:Agent Card + Manifest 注入
.trellis/agents/implement.md(共 60+ 行)的骨架:
1 |
|
三个细节值得拆:
provider: claude在 frontmatter——决定这个 agent 默认由哪个 Provider spawn;通过trellis channel spawn --provider codex可以 override。- Context 顺序硬编码在 agent prompt 里——
implement.jsonl是 curated 清单,prd.md/design.md是大文档,避免 LLM 一上来读 100KB 文档。 Forbidden Operations写明不能 commit——主 session 拥有提交权,Sub-Agent 永远只输出 diff 不动 git。
3.4 Verify 阶段:trellis-check 的 Self-Fix 机制
trellis-check 的差异化在Self-Fix 规则:
1 | ## Workflow |
也就是说 check agent 不只是一个评审员,它会把 lint nit / 缺失类型这种机械错误直接改了再返回——只有”design 决策类”问题才上报。
report format 也是硬编码的契约:
1 | ## Self-Check Complete |
主 session 看到这个 report 就能直接 commit / 退回——契约先于实现是 Trellis agent 设计最值得抄的一条。
四、Channel Runtime:跨 Provider 的多 Agent 协作
如果说 4 阶段循环是”AI 视角的工作流”,那 Channel Runtime 就是”系统视角的多 Agent 协议”。它藏在 packages/cli/src/commands/channel/(约 950+ 行 TypeScript)。
4.1 Channel 的本质:一条 durable events.jsonl
源码 packages/cli/src/commands/channel/index.ts 的入口注释:
1 | const channel = program |
关键词:shared event log。每个 channel 在磁盘上是一个目录,目录里有一条 events.jsonl——所有 agent 的发言(say)、工具调用(progress)、系统事件(spawned / done / killed / interrupted)全追加到这条文件里。
事件流的形状(简化):
1 | type ChannelEvent = |
4.2 Supervisor:Provider 适配器 + 三并发循环
源码 packages/cli/src/commands/channel/supervisor.ts(524 行)的注释直接画了架构:
1 | /** |
架构图:
graph TB
subgraph SUP["🧵 Supervisor 进程"]
LOOP1["🔵 stdout 读取循环<br/>解析 worker 输出 → adapter → 写 events.jsonl"]
LOOP2["🟣 inbox 监听循环<br/>监听 say events → encodeUserMessage → 写 worker stdin"]
LOOP3["🟡 信号处理循环<br/>SIGTERM 优雅退出 / SIGKILL 兜底"]
end
subgraph WORKER["🤖 Worker 子进程"]
CLAUDE["Claude stream-json<br/>--output-format stream-json"]
CODEX["Codex stream-json<br/>--output-format stream-json"]
end
EVENTLOG[("📜 events.jsonl<br/>durable event log")]
MAIN["👤 主 session / CLI"]
WORKER -->|"stdout"| LOOP1
LOOP1 -->|"append"| EVENTLOG
EVENTLOG -->|"tail"| LOOP2
LOOP2 -->|"stdin"| WORKER
MAIN -->|"kill/interrupt"| LOOP3
LOOP3 -->|"signal"| WORKER
style SUP fill:#E8D5F5,stroke:#CE93D8,color:#333
style LOOP1 fill:#C7CEEA,stroke:#9FA8DA,color:#333
style LOOP2 fill:#E8D5F5,stroke:#CE93D8,color:#333
style LOOP3 fill:#FFF9C4,stroke:#F9A825,color:#333
style WORKER fill:#B5EAD7,stroke:#80CBC4,color:#333
style CLAUDE fill:#C7CEEA,stroke:#9FA8DA,color:#333
style CODEX fill:#FFDAB9,stroke:#FFAB76,color:#333
style EVENTLOG fill:#F5F5F5,stroke:#999,color:#333
style MAIN fill:#FFB3C6,stroke:#F48FB1,color:#333三并发循环的设计价值:
- stdout 解析 + inbox 监听 解耦——即使 worker 在跑长 thinking,主 session 还能发
--kind interrupt让它停 - 优雅退出:先
close stdin让 worker 写完done,3 秒没动静再 SIGTERM,3 秒还没死 SIGKILL——避免 Anthropic API 收到半截 stdout - 每条事件都写盘——channel 死掉后还能
trellis channel messages回放完整对话
4.3 Provider Adapter:同一接口屏蔽 Claude 和 Codex
源码 packages/cli/src/commands/channel/adapters/claude.ts(259 行)展示了 Claude 的 stream-json 解析:
1 | /** |
Codex 的 adapter 在 adapters/codex.ts,统一暴露 AdapterEvent 类型(adapters/types.ts):
1 | export interface Adapter { |
核心解耦:supervisor 不关心 worker 是 claude 还是 codex——它只调 adapter.parse() 和 adapter.encodeUserMessage()。
4.4 Context 注入 + Path Traversal 防护
源码 packages/cli/src/commands/channel/context-loader.ts(377 行)展示了 --file / --jsonl 注入时的路径监狱:
1 | /** |
紧接着有大小限制:
1 | const MAX_PER_FILE_BYTES = 1_000_000; // 1MB hard cap per file |
为什么需要 realpath 而不是 path.resolve:攻击者可以建一个软链接 tasks/my-ctx → ~/.ssh/id_rsa,如果只做 lexical resolution,tasks/my-ctx 看起来在 cwd 内,但 realpath 跳到了 ~/.ssh/——Trellis 用 realpath + jailing 来阻止这种 symlink 逃逸。
真实可运行的最小注入示例:
1 | # 在仓库根目录创建一个任务,spawn 一个 implement worker,注入 prd.md |
预期输出:
1 | ✓ Channel cr-dark created (scope=project, type=chat) |
4.5 Context Trust:trusted_context_dirs + symlink auto-trust
源码 packages/cli/src/commands/channel/context-trust.ts(158 行)解决了”用户把 .trellis/tasks symlink 到外部目录”的边界 case:
1 | /** |
这个细节说明 Trellis 的安全模型不是简单”jail everything”,而是分三档:
| 路径类型 | 是否允许注入 | 依据 |
|---|---|---|
cwd 或 cwd 下的子目录 | ✅ | 默认 jailing |
.trellis/config.yaml 里 channel.trusted_context_dirs 列出的目录 | ✅ | 显式声明 |
.trellis/tasks / .trellis/workspace(本身是顶层 symlink 时) | ✅ | auto-trust |
其他 absolute path(如 /etc/passwd) | ❌ | jailing 拒绝 + stderr warn |
cwd 下的 .. 逃逸 | ❌ | realpath 检测 |
cwd 下的 symlink 指向 ~/.ssh/ | ❌ | realpath 检测 |
4.6 OOM Guard:Worker 数量 + 空闲超时
源码 packages/cli/src/commands/channel/guard.ts(658 行)的默认配置:
1 | /** Built-in default idle-cleanup TTL for spawned workers (5 minutes). */ |
spawn 时可覆盖:
1 | trellis channel spawn cr-dark --agent implement \ |
为什么这很重要:Claude / Codex worker 通常驻留 stdin/stdout 长连接和历史 buffer——多 spawn 几个不收尾能直接吃光内存。Trellis 在 spawn 时先扫一遍 live worker registry,超 budget 直接拒。
优先级链:
1 | CLI flag → 环境变量 → .trellis/config.yaml → 内置默认 |
五、Hook 层:Provider 之间的契约胶水
5.1 Trellis 的 4 个共享 Hook
源码 .claude/hooks/inject-subagent-context.py(977 行 Python)的开头注释:
1 | """ |
4 个共享 hook + 各自职责:
| Hook | 触发时机 | 职责 |
|---|---|---|
inject-subagent-context.py | PreToolUse(Task 工具调用前) | Sub-Agent spawn 时按 agent 类型注入对应 jsonl + prd/design/implement |
inject-workflow-state.py | UserPromptSubmit / BeforeAgent(每次用户输入) | 输出 <workflow-state>STATUS</workflow-state> 块,提醒主 AI 当前 task 和阶段 |
session-start.py | SessionStart | 恢复 active task 上下文,写 <system-reminder> |
inject-shell-session-context.py | PreToolUse(Bash 工具调用前) | Shell session 注入 active task 信息 |
5.2 inject-workflow-state 的 Provider 适配
源码 .claude/hooks/inject-workflow-state.py(404 行)解决了同一个 hook 在不同 Provider 下字段名不同的问题:
1 | """ |
这条注释透露一个被严重低估的工程现实:Anthropic 的 UserPromptSubmit 在 Gemini CLI 0.40.x 后被改名 BeforeAgent——所有想”跨 Provider”的 Harness 都必须处理这个 schema drift,Trellis 用 runtime detection 把差异点收到 30 行代码里。
六、Spec 系统:团队规则的真相源
6.1 Spec 目录结构
Trellis 的 .trellis/spec/ 目录被设计成两层索引 + 一层正文:
1 | .trellis/spec/ |
trellis-before-dev Skill 的指令(41 行):
1 | 1. Read current task artifacts (prd.md, design.md, implement.md) |
核心设计:index.md 只列清单不写内容——LLM 必须顺着清单去读具体文件,避免 index 膨胀成”什么都塞进 README.md”的反模式。
6.2 spec-system.md 的核心抽象
源码 packages/cli/src/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md 给出了 spec 的设计哲学:
| 原则 | 含义 |
|---|---|
| Scoped | spec 按 package × layer 隔离,不放一个全局大文件 |
| Indexed | 每个目录有 index.md 列出该目录的 spec 清单 |
| Traceable | spec 改动进 git history,可审计 |
| Discoverable | agent 先 get_context.py --mode packages 自动发现相关 spec |
| Promoted from learnings | trellis-update-spec 把这次任务学到的规则自动写回 spec |
七、和同类 Harness 的横评
Trellis 不是 Harness 6 件套里某一件的”极致实现”——它是少有的”一层额外的协议层”。横评表:
| 维度 | Trellis | DeepAgents | jcode | aden-hive | OpenHarness |
|---|---|---|---|---|---|
| 跨 Provider | ✅ 20+ | ❌ 锁 LangGraph | ❌ 自写 | ❌ 自写 | ⚠️ 主 Claude |
| Spec 系统 | ✅ scoped + indexed | ❌ CLAUDE.md 风格 | ⚠️ 简单 | ⚠️ YAML | ✅ spec 模板 |
| Task 制品 | ✅ prd/design/impl jsonl | ⚠️ middleware | ❌ | ❌ | ⚠️ |
| Sub-Agent 隔离 | ✅ Supervisor + Channel | ✅ SubAgent 字段 | ✅ Deep/Light | ✅ Pipeline | ✅ Tool |
| Hook | ✅ 4 类 Python hook | ✅ Middleware | ✅ Pre-Tool | ✅ EventBus | ✅ Hook |
| 安全防护 | ✅ Path jail + trust + OOM | ⚠️ 中等 | ⚠️ 中等 | ⚠️ 中等 | ⚠️ |
| 状态保存 | ✅ events.jsonl durable | ⚠️ LangGraph checkpointer | ❌ 内存 | ⚠️ | ⚠️ |
| 主语言 | TypeScript | Python | Rust | TypeScript | Python |
| ⭐ 数量 | 13.1k | ~6k(2026-07) | 8.3k | 10k+ | ~2k |
关键差异:
- Trellis 是”协议层”,DeepAgents 是”框架层”——Trellis 不写 LLM 循环,只调度 Provider;DeepAgents 自己实现完整的 agent loop
- jcode 是”嵌入式 Harness”——主打低 RAM;Trellis 是”CLI Harness”——主打跨 Provider
- OpenHarness 是”教育型 Harness”——展示 6 件套可以怎么写;Trellis 是”工程化 Harness”——20+ Provider 适配是为了真用
- aden-hive 是”多 Agent 协作 Harness”——在 TS 里写 Swarm API;Trellis 是”events.jsonl 协作”——多 Agent 通过共享事件日志通信
八、优缺点与适用场景
8.1 优点
| # | 优点 | 证据 |
|---|---|---|
| 1 | 跨 20+ Provider | README + packages/cli/src/templates/ 20 个目录 |
| 2 | 4 阶段循环契约先于实现 | agent.md 全部 hardcoded Workflow + Report Format |
| 3 | durable events.jsonl | Supervisor 持久化所有事件,可 messages --raw 回放 |
| 4 | Context 注入安全 | realpath jail + trusted_dirs + size cap |
| 5 | OOM Guard | idle-timeout + max-live-workers + env override |
| 6 | spec 系统 | scoped + indexed + auto-promoted learnings |
| 7 | 开源 + AGPL-3.0 | 可商用,可二次开发 |
| 8 | 有中文 README | README_CN.md 完整翻译 |
8.2 缺点
| # | 缺点 | 触发场景 |
|---|---|---|
| 1 | AGPL-3.0 传染性强 | 内部工具无所谓;SaaS 包装必须开源 |
| 2 | TypeScript + Python 双栈 | 团队需要同时维护两种语言 |
| 3 | Hook 复杂 | 4 个 Python hook + 5+ Provider 适配,调试成本高 |
| 4 | 依赖 events.jsonl 文件系统 | NFS / 容器 mount 异常时易卡 |
| 5 | 学习曲线 | skill / agent card / jsonl 三套约定,新人需 1-2 周适应 |
| 6 | 平台漂移 | Gemini CLI 改名 BeforeAgent 这类 schema drift 需持续适配 |
| 7 | 不擅长多模态 | 当前设计主要针对 code 任务,图像/音频 Sub-Agent 支持弱 |
8.3 适用 vs 不适用
✅ 适合用 Trellis 的场景:
- 团队同时用 Claude Code + Codex + Cursor + Aider 想统一规范
- 团队需要长期可审计的 task 历史(PR review 时可查
events.jsonl) - 你想用自然语言 + PRD 写 spec 而不是写 YAML/DSL
- 你愿意花 1-2 周搭骨架,换 6+ 月规范沉淀红利
❌ 不适合用 Trellis 的场景:
- 你只用 Claude Code 一套——直接 CLAUDE.md 就行
- 你的项目只有 1-2 个 dev——spec 系统的边际收益太低
- 你要做纯研究类多模态 agent——Trellis 强项在 code
- 你不能接受 AGPL-3.0——需要 fork 后改 MIT
九、风险评估
| 风险 | 等级 | 说明 | 缓解 |
|---|---|---|---|
| Provider schema drift | 🟡 中 | Anthropic / OpenAI / Google 升级 CLI 时改事件名 | Trellis 已有 _detect_platform runtime 适配;保持关注 release notes |
| AGPL 传染 | 🟡 中 | SaaS 包装会强制开源 | 自托管 + 不打包分发 |
| events.jsonl 膨胀 | 🟢 低 | 单任务百万事件级别 | trellis channel prune 按 channel 清理;archived task 单独目录 |
| Worker 进程泄漏 | 🟢 低 | idle-timeout + max-live-workers 双保险 | OOM Guard 已实现 |
| Hook Python 路径兼容 | 🟡 中 | Python 3.9+,Windows 下强制 UTF-8 stdout reconfigure | README 写明 Windows 兼容路径 |
| 平台胶水滞后 | 🟡 中 | 新 Provider 上线时 Trellis 可能慢半拍 | 关注 packages/cli/src/templates/ 新增目录 |
| spec 膨胀 | 🟢 低 | index.md 只列清单 | 设计上免疫 |
十、5 分钟自检:跑通 Trellis 最小闭环
下面这套命令在你装了 Trellis CLI 的本机就能跑通,跑完你就拿到了一个”完整 Trellis Harness”。
1 | # 0. 准备:装 CLI(已发布到 npm) |
预期最终状态:
1 | $ git status |
十一、结论 & 建议
11.1 一句话总结
Trellis 不是又一个 Coding Agent——它是 20+ Coding Agent 之上的工程化协议层,用 4 阶段循环 + 共享 events.jsonl + 多 Provider Supervisor 桥接 + scoped indexed spec 系统,把”AI 写代码”从单 Agent Demo 拉到了团队级可审计、可复用、可跨工具的工程常态。
11.2 不同读者的建议
| 你是谁 | 建议 |
|---|---|
| 独立开发者 | 不急着用——CLAUDE.md + 1 个 repo 已足够。等团队 > 3 人再考虑 |
| 小团队(3-10 人) | 优先试 Trellis——把 spec 沉淀进仓库,1-2 周投入换 6+ 月规范红利 |
| 大团队(10+ 人) | 把 Trellis 当规范收敛器——避免每个 Agent 各写一套 CLAUDE.md |
| AI 工具厂商 | 学 Trellis 的 Provider Adapter 设计——它是少有的”Protocol-Aware Harness”开源实现 |
| Harness 框架作者 | 抄 Trellis 的 4 个文件:supervisor.ts + context-loader.ts + context-trust.ts + guard.ts |
| 投资人 / 研究员 | 关注 Trellis 代表的趋势——“Harness-as-a-Protocol” 替代 “Harness-as-a-Product” |
11.3 三个值得跟踪的信号
@mindfoldhq/trellis周下载量——如果 > 50k/week 说明 npm 生态认可- Trellis 是否进 Linux Foundation(参考 block/goose 进了 AAIF)——决定生态扩展速度
packages/cli/src/templates/新增 Provider 数量——决定”跨平台”承诺是否兑现
写完这篇已经是 2026-07-25 早上 8:00 的发布时刻。把文章 commit 之前,先
trellis-finish-work自己走一遍:再读一遍自己写的 4 阶段循环有没有偷工、Context 注入代码块能不能跑、events.jsonl 字段名有没有抄错。然后让真实的 Claude / Codex 跑一遍 §十 的 9 步——Trellis 自己的 README 都强调”dogfooding”,我们写 Trellis 文章也得 dogfooding。
参考资源:
- 仓库:https://github.com/mindfold-ai/Trellis
- 文档:https://docs.trytrellis.app/
- npm:https://www.npmjs.com/package/@mindfoldhq/trellis
- 中文 README:https://github.com/mindfold-ai/Trellis/blob/main/README_CN.md
- 关联阅读:本文同步收录于
series: harness-engineering系列——上一篇是 【ECC】211k⭐ Harness OS 深度拆解,下一篇将拆 Pi Coding Agent 的 hash-anchored edits。