定制 Workflow
.trellis/workflow.md 定义 Trellis 的开发流程:Phase 定义、skill 路由、每轮提醒、task.py 命令参考都在这一个文件里。Fork 工作流 = 改一个 markdown 文件,不用动 Python、不用改 hook、不用重发包。
0.5 之前,工作流行为分散在三处:hook Python 脚本、configurator TypeScript、命令 markdown;想 fork 一份”自己的工作流”得同时改三处才能自洽。0.5 把这三处收敛到 workflow.md 一个文件。
workflow.md 控制了哪些东西
所有注入路径都在运行时读
workflow.md——改完不用重 build。
改每轮面包屑
每轮注入的<workflow-state> 块根据当前任务 status 提醒 AI 下一步该做什么。块本身和每个 phase 一起放在 ## Phase Index 下面,原地改即可。Hook 脚本只解析、不嵌内容,没有”内置兜底文案”可以漂移。
- 标签
STATUS对应task.json.status。默认:planning/in_progress/completed,没活跃任务时走no_task。 - 标签名短横线和下划线都支持(
blocked/in-review/needs_qa等)。 - 某个状态没有匹配标签块时,hook 输出固定一行
Refer to workflow.md for current step.,AI 自己回去读 workflow 契约。用不到的块可以删。 task.py create在写status=planning的同时也设置当前 session 的 active-task pointer,所以[workflow-state:planning]从下一轮就开始生效——brainstorm 和 planning artifact 阶段就能看到,不必等到task.py start。- 每个块保持简短(≈200 字节)。这是每轮都注入的,写长了 AI 每条消息都要付注意力代价。
加一个自定义状态
想要一个blocked 状态,提醒 AI 不要硬猜而是先上报?
task.json 把状态设成 blocked:
blocked 面包屑。改回 in_progress 就恢复正常流。
task.py 的子命令只做默认状态流转(start → in_progress、archive → completed)。自定义状态在 task.json.status 里就是普通字符串——面包屑系统不要求预注册,task.py list --status <name> 也能按任意字符串过滤。
改 skill 路由表
### Skill Routing 下面的表是 AI 决定要不要加载 auto-trigger skill 时查的。
加 / 改 Phase
Phase 段落都是普通 markdown。你可以:- 加一个 Phase 4: Review —— 定义 4.1、4.2 … step 和 how-to;再从面包屑引用(
[workflow-state:in_review])。 - 把 Plan 拆成 A/B 两条分支 —— 把 step 编号改成 1A.1 / 1B.1;AI 按正文内容走。
- 压缩 Finish —— 删你不关心的 step(比如去掉 3.2 debug retrospective)。
get_context.py --mode phase --step X.Y 解析 ## Phase X 标题 + #### X.Y step
标题来提取正文。改名或改结构时,确保 step 锚点仍可解析(标题层级有语义)。哪些东西不要改
有几处约定被脚本依赖,改了会坏:
其他——措辞、顺序、加段、重写 how-to 正文——都可以随便改。
改动什么时候生效
Fork 不用重发包。把改过的
workflow.md commit 进仓库,团队下个会话就自动拿到新版。