1. 命令与 Skill 参考
0.5.0 开始 Trellis 走 skill-first:大部分能力都做成 auto-trigger skill,平台自己根据上下文触发,不用你记命令。只保留会话边界入口:agent-capable 平台暴露finish-work 和 continue;没有自动会话注入的平台额外暴露 start。
1.1 总览
只有 3 个 slash 命令:
start、continue、finish-work。以前的 /before-backend-dev、/check-backend、/record-session、/onboard 等等都已经被折叠进 skill/sub-agent 或直接移除。
1.2 命令
1.2.1 三个版本:upgrade vs update
Trellis 同时追踪三个独立的版本。搞清楚谁是谁,就理解了为什么升级是两步:
- 已发布版 — npm 上的最新版本
- 本地 CLI — 你全局安装的
trellis命令 - 项目版 — 你 repo 里
.trellis/的模板版本
trellis upgrade把 ② → ①(升级全局 CLI 本体)trellis update把 ③ → ②(把当前项目同步到本地 CLI 的版本)
trellis upgrade(CLI)再 trellis update(项目)。trellis update 最多只能把项目抬到本地 CLI 的版本——CLI 自己旧了,得先升 CLI。
1.2.2 trellis upgrade:升级 CLI package
全局安装的 Trellis CLI 落后于已发布版本时使用:
trellis upgrade 是 CLI 0.6.0 才加的命令。如果你装的 CLI 是 0.5.x
或更早,这个命令还不存在——直接用 npm install -g @mindfoldhq/trellis@latest 升级本地
CLI,之后每次升级就能用 trellis upgrade 了。trellis upgrade 升级的是全局 CLI package,不会改当前项目里的文件。CLI 升级后,如果某个 Trellis 项目需要同步新的 workflow、hook、skill 或平台文件,再在该项目里运行 trellis update。
1.2.3 trellis update:把项目同步到 CLI 版本
升级完 CLI 后,在 Trellis 项目里运行。它把 .trellis/ 模板和平台文件(hook、skill、command)同步到本地 CLI 的版本:
trellis update 只碰你没改过的文件——自定义内容不会丢,改动前还会自动创建带时间戳的备份。
1.2.4 /trellis:start:开启会话
如果平台不自动注入上下文就手动跑一下。Hook 或 extension 可用的平台(Claude Code、Cursor、OpenCode、Gemini、Qoder、CodeBuddy、Copilot、Droid、Pi Agent,以及开了 features.hooks = true 的 Codex —— 旧版用 codex_hooks = true)有 SessionStart hook 或 extension,打开终端就自动执行,所以通常不会安装用户可见的 start 命令。
行为:
- 读
.trellis/workflow.md,让 AI 清楚工作流契约。 - 跑
get_context.py拿到开发者身份、git 状态、活跃任务。 - 读 spec 索引(monorepo 场景下按 package 读)。
- 汇报上下文并询问你想做什么。
用户拒绝复杂任务建 task 时,AI 应该澄清范围或建议拆小,而不是做大范围 inline 实现。
1.2.5 /trellis:finish-work:收尾 + 归档
前提:代码已经 commit。AI 在 workflow Phase 3.4(见 .trellis/workflow.md)里主导批量 commit —— 起草本次 session 改动的 commit 计划、参考 git log --oneline -5 学习 repo 的 commit message 风格、一次性展示计划让用户 confirm、确认后逐批 git commit。/finish-work 自身只做 archive + journal,工作区还有未提交代码改动时拒绝执行,保证 bookkeeping commit 永远在 work commit 之后。
步骤:
- 跑
get_context.py --mode record,列出 active tasks、git status 和 recent commits。用这一步发现除了当前 task 之外是否还有其它已完成但未归档的 task,并拿到 Step 4 要用的 work-commit hash。 - 跑
git status --porcelain,排除.trellis/workspace/和.trellis/tasks/(这两个路径由脚本 auto-commit 管理)。其它路径有 dirty 文件就拒绝执行,引导用户回到 Phase 3.4。 - 用
task.py archive <name>归档当前 active task(产生chore(task): archive ...commit)。如果 Step 1 暴露出其它已完成 task 且用户确认了清理,本轮一并归档。 - 用
add_session.py --title … --commit …追加一条 journal(产生chore: record journalcommit)。
<3.4 阶段的 work commits> → chore(task): archive ...(可能多条)→ chore: record journal。把本次经验沉淀进 trellis-update-spec 属于 workflow Phase 3.3 在 commit 之前的事,不在这个 skill 的职责里。
1.2.6 /trellis:continue:当前任务内推进下一步
continue 是单个任务内的 continue,不是跨任务的 continue。AI 根据当前 task 的 task.json.status 和每轮 hook 注入的 workflow-state breadcrumb,对照 workflow.md 判断当前在哪个 phase/step,然后推进到下一步。
典型一次 task 的对话:
- 你用自然语言描述需求 → AI 先分类请求;当 Trellis 有价值时,先询问是否创建 task。你同意后,
trellis-brainstorm创建 task 并起草prd.md。 prd.md跟你确认完,你输入continue→ 它判断任务是轻量任务,还是需要补design.md和implement.md。- Planning artifacts review 通过后再输入
continue→ 它 start task 并进入 implement/check。Sub-agent mode 会整理implement.jsonl/check.jsonl;inline mode 直接读取 artifacts/specs。 - sub-agent 跑完你再
continue→ 它知道该走trellis-update-spec,最后finish-work。
continue,几乎零学习成本就能跑完整个 trellis 工作流。
1.3 Auto-trigger Skills
Skill 不需要显式命令,平台根据用户意图自动匹配。匹配不中时手动触发就行(/skill trellis-brainstorm 之类)。
1.3.1 trellis-brainstorm
把已同意进入 planning 的请求转成具体 artifacts:
- 先检查代码、测试、配置、文档、现有 spec 和任务历史,再问用户问题。
- 产出任务名和 slug;需要时通过
task.py create创建 task。 - 起草并迭代
prd.md,记录需求和验收标准。 - 一次只问一个问题,并给出推荐答案。
- 复杂任务在实现前补齐
design.md和implement.md。
1.3.2 trellis-before-dev
编码前触发。读受影响 package 的 spec 索引,再读 Pre-Development Checklist 里引用的具体 guideline 文件。确保 AI 在动手前就知道约定,而不是之后。
1.3.3 trellis-check
实现完之后触发:
git diff --name-only HEAD找变更。- 确认哪些 spec 层适用。
- 对照每层 index 的 quality checklist 比对代码。
- 为受影响 package 跑
pnpm lint/pnpm typecheck/pnpm test(或等价命令)。 - 在有限循环内自修复违规,然后汇报修了什么、还剩什么。
trellis-check sub-agent 把这个 skill 包了一层,主会话把验证这事丢给它就行。sub-agent 自己有重试循环,不再需要外面套 Ralph Loop。
1.3.4 trellis-update-spec
把经验沉淀为 .trellis/spec/ 里的可执行契约。调试完、踩坑后、做了非显而易见的设计决策时用。会挑对应的 spec 文件,做一次聚焦更新(decision / convention / pattern / anti-pattern / gotcha),必要时更新索引。
1.3.5 trellis-break-loop
修完难 bug 后触发。产出 5 维分析:
- 根因分类(缺 spec / 契约违反 / 变更传播失败 / 测试缺口 / 隐式假设)。
- 之前修复尝试失败的原因。
- 预防机制(更新 spec、类型约束、lint 规则、测试、CR 清单、文档)。
- 系统化扩散:其他具备同样模式的地方。
- 知识固化:结果走
trellis-update-spec。
调试的价值不是修掉 这个 bug,而是确保这一类 bug 不再发生。
1.4 Sub-agents
Sub-agent 是独立的 AI 子进程,各自有 prompt 和(视平台而定)各自的 tool / hook 挂接。implement 和 check agent 通过 task 目录下的 JSONL 文件拿稳定的 spec/research 上下文;research agent 把发现写进任务的research/ 目录。
在 Claude Code、Cursor、OpenCode、CodeBuddy、Droid、Pi Agent 上,implement 和 check sub-agent 启动前会自动拿到对应 JSONL(
implement.jsonl、check.jsonl)。Pi 走 extension,不是 Python hook。其他平台由主会话自行读 JSONL 并把相关内容传给 sub-agent。research agent 把可持久化发现写到任务的 research/ 目录。
2. 任务管理全流程
2.1 任务生命周期
task.py create 会让任务从 planning 开始,创建默认 prd.md,并尽力把当前 AI session 指向新任务。它也会在检测到 sub-agent 平台(Claude / Cursor / Codex / Kiro / Pi 等)时 seed 出 implement.jsonl + check.jsonl;agent-less 平台(Kilo / Antigravity / Devin)跳过 seed,改由 Phase 2 的 trellis-before-dev skill 加载 spec。
2.2 task.py 子命令
2.2.1 创建任务
2.2.2 上下文配置
task.py add-context 只写 implement.jsonl / check.jsonl。调研发现放在 {TASK_DIR} /research/*.md;只有后续 sub-agent 工作前必须读取时,才把这些文件加入 implement/check manifest。2.2.3 任务控制
2.2.4 父子任务(subtasks)
一个任务可以有子任务。子任务是磁盘上独立的任务目录——有自己的prd.md、JSONL 文件、status;父任务只是引用它们做分组。
task.json 的影响:
- 父任务的
children: [<子任务目录名>, ...]追加子任务名。 - 子任务的
parent: "<父任务目录名>"被设置。 task.py list把子任务缩进显示在父任务下面,同时打[已完成/总数],方便一眼看进度。
父子关系走
parent 和 children 字段。task.json 里还有一个 subtasks
字段,和它们完全无关——subtasks 是单个任务内部的 todo checklist(name + status 对),主要由
bootstrap 任务使用。别混。2.2.5 任务管理
2.3 task.json Schema
task.py create 当前实际写出的结构(详见 .trellis/scripts/common/task_store.py):
dev_type/scope/package→ 通过task.py set-scope或直接编辑task.json写入;没有自动 setterbranch→task.py set-branch设置status→planning → in_progress → completedcompletedAt→task.py archive填上(archive 不回写 commit hash)parent/children→task.py create --parent或add-subtask设置
worktree_path / commit / pr_url 是 schema 占位字段,0.5 没有脚本主动写入。想记 commit 或 PR
URL,建议用 meta: {} 自定义键或写 after_archive hook 自己回写。package 支持前的任务没有 "package"),task.py 把缺失字段按 null 处理,不会出错。
状态流转:
planning / in_progress / completed 对应 workflow.md 的三个 Phase。task.py start 会自动把 planning 改写成 in_progress,其他状态不动(review 这类自定义状态重启不会被清零)。task.py list --status 还接受 review 作为过滤条件,如果你想要更多自定义状态,在 workflow.md 里加 [workflow-state:<name>] block 就行。
2.4 JSONL 上下文配置实战
2.4.1 create 时 seed,AI 在 Phase 1.3 curate
在 sub-agent 平台上,task.py create 会在两个 jsonl 里各写一行 seed:
file 字段,所有下游消费方(hook / prelude / validate / list-context)都会跳过,AI 读完就知道怎么填,在 Phase 1.3 把它替换成真实条目即可。
AI curate 之后的 implement.jsonl 样例(monorepo dev_type=backend):
- Spec 文件(
.trellis/spec/<pkg>/<layer>/index.md+ 具体 guideline 文件):和任务相关的规范 - Research 文件(
{TASK_DIR}/research/*.md):sub-agent 要参考的调研产出
- 代码文件(
src/**、packages/**/*.ts等)——代码在 Phase 2 实现时读,不在这里预注册 - 即将要改的文件——同上
task.py create 不 seed,改由 Phase 2.1 的 trellis-before-dev skill 加载 spec。
2.4.2 添加自定义上下文
2.5 任务生命周期 Hook
你可以配置 shell 命令,在任务生命周期事件上自动跑。用于对接 Linear、发 Slack、触发 CI 等。2.5.1 配置
在.trellis/config.yaml 加 hooks 块:
默认
config.yaml 里 hooks 段是注释掉的。取消注释并编辑即可激活。2.5.2 支持的事件
2.5.3 环境变量
每个 hook 收到:
其他环境变量从父进程继承。
2.5.4 执行行为
- 工作目录:仓库根
- Shell:命令通过系统 shell 运行(
shell=True) - 失败不阻断:失败的 hook 在 stderr 打印
[WARN],但不阻止任务操作完成 - 顺序:同一事件有多个 hook 按列表顺序执行;一个失败不跳过其他
- stdout 不显示:诊断输出用 stderr
2.5.5 示例:Linear Sync Hook
Trellis 原生带有.trellis/scripts/hooks/linear_sync.py 示例 hook,把任务生命周期事件同步到 Linear。
行为:
前置:
- 装
linearisCLI 并设置LINEAR_API_KEY - 创建
.trellis/hooks.local.json(gitignored)放团队配置:
task.json 的 meta.linear_issue(如 "ENG-123"),保证后续事件幂等。
3. 规范编写指南
3.1 Spec 目录结构和分层
3.1.1 trellis init 默认结构
trellis init 会写一个骨架:frontend/ + backend/ + guides/,里面全是空占位模板(标注 “(To be filled by the team)”)。这些模板原样注入 sub-agent 是没用的。
trellis init 同时创建一个 bootstrap 任务(00-bootstrap-guidelines)。第一次 Trellis 会话里,AI 会认出它、调 trellis-research 读你的实际代码,然后把占位模板按真实项目(技术栈、约定、目录结构)填起来。跳过这个任务就是把空壳喂给每个 sub-agent——别跳。
3.1.2 这套结构只是约定
frontend/ 和 backend/ 没有任何魔法。Trellis 扫描 .trellis/spec/ 下的一级目录,只要目录里有 index.md 就把它当作一个 spec 层注册。你按项目实际怎么切就怎么命名——按运行时、按 package、按职责都行,每层有自己的 index.md 就够。
Trellis 本身用的是另一种结构(monorepo、按 package):
frontend/ 或 backend/,因为仓库是按 package 切的。Trellis 唯一硬性约定就是”一层 = 带 index.md 的目录”,其他随你。
3.2 从空模板到完整规范
trellis init 会生成空模板,标记 “(To be filled by the team)“。填充步骤:
Step 1:从实际代码中提取模式
3.3 Spec 应该长什么样
trellis-update-spec skill 把 spec 当作可执行契约写,不是原则性文字。sub-agent 在 trellis-implement / trellis-check 时读到的每条都要能告诉它 怎样安全地实现——具体签名、契约、用例、测试。如果你写的只是”动手前该想到什么”,那东西属于 guides/。
3.3.1 Code-Spec vs Guide
如果你写的是”别忘了检查 X”——放 guide。如果你写的是”X 接受
{field: type, …},返回 {…},错误矩阵如下,必须覆盖这些测试”——放 code-spec。
3.3.2 选对更新形态
trellis-update-spec 原生带有几套模板,按你学到的是什么挑一个:
3.3.3 基础设施 / 跨层改动的强制 7 段式
改动涉及 命令 / API 签名、跨层 request-response 契约、DB schema、或 基础设施接线(存储、队列、缓存、密钥、env)时,skill 强制 7 段:- Scope / Trigger — 为什么要上 code-spec 深度
- Signatures — command / API / DB 签名
- Contracts — request 字段、response 字段、env key(名字、类型、约束)
- Validation & Error Matrix —
<条件> → <错误>表 - Good / Base / Bad Cases — 例输入 + 预期结果
- Tests Required — unit / integration / e2e,带断言点
- Wrong vs Correct — 至少一组反正例
3.3.4 对比示例
一条合格的 Convention(放在backend/database-guidelines.md):
3.4 Bootstrap 引导首次填充
trellis init 会同时建一个 bootstrap 任务(00-bootstrap-guidelines)。第一次 Trellis 会话里,AI 会认出它,调 trellis-research 扫一遍你的代码,然后把 frontend/ / backend/ / guides/ 下那堆空模板按你的真实项目填起来——技术栈、约定、目录结构都从代码里读出来。