Skill-first 模板架构
命令和 skill 现在统一放在packages/cli/src/templates/common/(3 个命令 + 5 个 skill),作为单一事实源。13 个平台都从 common/ 经由各自的 adapter 派生。彻底消除了以前”同一内容在 N 个平台各存一份”造成的漂移 —— 以前某些命令在 A 平台更新了但 B 平台没更新的情况不再出现。
两个可复用 helper:
createTemplateReader()(在template-utils.ts)—— 工厂函数,6 个平台模板模块共用,替换掉之前各自的readFileSync样板代码。用fileURLToPath正确处理带空格 / Windows 路径。writeSharedHooks()+writeAgents()+writeSkills()(在configurators/shared.ts)—— 三行调用完成 configurator 的 hook / agent / skill 输出,不再需要各自写文件拷贝循环。
7 个新平台升级到 agent-capable
Qoder、CodeBuddy、Factory Droid、Cursor、Gemini CLI、Kiro、GitHub Copilot 从”仅命令”升级到完整的 agent-capable 平台。每个平台都配齐:- Sub-agent 定义(implement / check / research),使用各平台的原生格式
- Hook 配置基于
shared-hooks/Python 脚本(session-start、inject-subagent-context、statusline),单一实现 + 跨平台输出 adapter
AGENT_DEBUG、spec.jsonl/research.jsonl 读取、硬编码的 check-cross-layer.md 引用)。
Sub-agent 上下文注入:class-1 hook vs class-2 pull-based
Codex、Copilot、Gemini、Qoder(class-2)无法可靠地通过 hook 改写 sub-agent prompt:- Codex
PreToolUse只对 Bash 触发;CollabAgentSpawn未实现(#15486) - Copilot
preToolUse对 sub-agent 无效(#2392 / #2540) - Gemini
BeforeTool看不到调用方上下文(#18128) - Qoder 没有 Task tool + context isolation
.current-task + prd.md + implement.jsonl/check.jsonl。Class-1 平台(Claude / Cursor / OpenCode / Kiro / CodeBuddy / Droid)继续走 hook 推送注入。两种路径都在共享基础设施里(applyPullBasedPreludeMarkdown / applyPullBasedPreludeToml),以后加平台挑一种就能用。
Workflow enforcement v2:每轮面包屑 hook
新增inject-workflow-state.py 共享 hook,每次用户发消息触发(8 平台的 UserPromptSubmit;OpenCode Bun plugin 的 chat.message)。注入 ~200 字节的 <workflow-state> 块,根据当前任务的 status 提示 AI 下一步该做什么。
面包屑内容来自 workflow.md 里的 [workflow-state:STATUS]...[/workflow-state:STATUS] 区块 —— fork 工作流的用户只需改一个 markdown 文件,不用碰 hook Python 代码。覆盖 4 种状态:no_task / planning / in_progress / completed。自定义带连字符的状态(in-review、blocked-by-team)也能识别(STATUS 正则 [A-Za-z0-9_-]+)。未知状态输出通用 fallback,而不是静默退出 —— hook 绝不会把对话”漏过”。
三档容错(workflow.md 缺失 → tag 部分缺 → status 未知),hook 不会崩。
Kiro 是唯一降级的平台:它的 agentSpawn 只针对单 sub-agent 生命周期,上游没有主会话 per-turn 的等价入口。Sub-agent 上下文注入还在工作;每轮面包屑等上游支持。
SessionStart payload 重构
SessionStart 的<workflow> 块从 2.7 KB 增至 9.5 KB,inline 了 Phase 1/2/3 每个 step 的详细内容 —— AI 一开场就有 step 级 how-to,不再需要 lazy-load get_context.py --mode phase --step X.Y。腾出空间来自 <guidelines> 的精简(10.9 KB → 4.6 KB):跨包 guides/index.md 仍然内联,但其它 spec/<pkg>/<layer>/index.md 只列路径。理由:sub-agent 通过 jsonl 注入拿到具体 spec,主 agent 需要细节时按需读。
Session-start 总 payload:16.7 KB —— 在 Claude Code 的 ~20 KB additionalContext 截断阈值下。
workflow.md 本体从 17 KB 瘦到 14 KB:改为纯英文(原先中英混排),去掉 What is Trellis 介绍、File Structure 目录树、和别处重复的 Best Practices 段,task.py 命令表从 5 条扩到 16 条(按 PR #169 的 lifecycle / context / metadata / hierarchy / PR 分组),并加了 --help 指引以便未来扩展时命令表不用同步更新。
大规模清理(126 条 safe-file-delete 迁移)
本版本移除四类”已有更好替代”的老功能:- iFlow 平台 —— CLI 已不再维护;整个
.iflow/目录和模板源移除 - Multi-agent pipeline(
.trellis/scripts/multi_agent/+worktree.yaml)—— 主流 CLI 都有原生 worktree 支持,Trellis 不需要再自己实现 - Ralph Loop hook(
ralph-loop.py)—— SubagentStop + exit-code-2 强制跨平台不可移植;check sub-agent 自己的修复循环已经足够 - 6 个命令 + 3 个 sub-agent ——
parallel(被原生 worktree 取代)、onboard/create-command/integrate-skill(使用率低)、check-cross-layer(合并进check)、record-session(被/finish-work吸收);dispatch/debug/planagent(被 skill routing 取代)
allowed_hashes 从历史 git 版本中提取,确保任何 0.3.x / 0.4.x 版本的用户都能干净迁移)。
Command → Skill 迁移(新增 80 条 manifest)
5 个不再由用户手动触发的 skill(before-dev / brainstorm / break-loop / check / update-spec)在所有平台下都移动到 <platform>/skills/trellis-<name>/SKILL.md。如果不做迁移,用户从 0.4.x 升上来就会出现旧命令文件和新 skill 文件同时存在。manifest 完整处理:
- 65 条 rename(13 平台 × 5 命令)—— 用 mv 保留用户本地改动,再由后续 template-write prompt 让用户选择(不粗暴直接删)
- 3 条 rename 处理 skill-only 平台(
.kiro/.qoder/.agents共享层)的finish-work—— 也加上trellis-前缀 - 10 条 safe-file-delete 清理老版
start命令(agent-capable + skill-only 平台)—— session-start hook 已替代该命令 - 2 条 safe-file-delete 移除老
improve-ut(.agent/workflows/+.agents/skills/)
MigrationItem 新增 reason? 字段 —— 版本特定的上下文(比如”0.4.0 init 漏写这个路径的 hash,导致未改过的文件也显示 modified”)由 manifest 作者就地写入,在 confirm prompt 里渲染。不再把版本相关的硬编码塞进 update.ts 里慢慢烂掉。
breaking 版本现在强制 --migrate
如果项目当前版本到最新 CLI 之间跨越了 breaking: true + recommendMigrate: true 的 manifest,trellis update 会 exit 1 并明确提示用户加 --migrate。之前的行为是:安静跳过 rename/delete 条目但仍然推进 .version 戳,留下”半迁移”状态(老路径和新模板并存)。--dry-run 会绕过这个 gate,方便先预览。
Confirm prompt 重设计
当文件 hash 不匹配需要确认时,交互 prompt 现在显示:- What —— 这条迁移在做什么(取自 manifest 的
description) - Why prompted —— 每条的
reason(manifest 里写),没有就退化成通用文案 - 每个选项(Backup / Rename / Skip)的推荐使用场景 + 后果提示(比如 skip 会留下旧路径,未来 update 还会反复 flag)
skip 改为 backup-rename —— 一路 Enter 不会丢用户修改也不会留孤儿文件。
Bug 修复
- Backup 不再打包平台 worktree 目录。
createFullBackup排除任何/worktrees/或/worktree/路径,所以 Claude Code 的.claude/worktrees/、Cursor 的.cursor/worktrees/、Gemini CLI 的.gemini/worktrees/不会在每次trellis update时都被重复快照(用户开了 worktree 后,原来一次 backup 可能轻松膨胀到数百 MB)。 copy-templatesbuild 步骤残留旧模板。 build 链加上clean(clean && tsc && copy-templates),src/里删掉的模板不会在dist/残留、被打包发到 npm。修复前 safe-file-delete 会和 dist 里的旧模板反复打架:刚删就又被重写回去。
其它值得一提的改动
task.py create不再写 legacy 的current_phase/next_action字段。FP 分析结论:workflow.md 里的 Phase N.M 是文档分层,不是运行时状态 ——task.json.status才是任务级状态的单一事实源。inject-subagent-context.py的update_current_phase()函数删除 —— 它在每次 Task spawn 时回写 legacycurrent_phase,悄悄撤销了声明的废弃。- Codex hook 集成:
configureCodex现在自动写入 shared-hooks(之前跳过了);trellis init --codex在 stderr 打印警告提醒用户在~/.codex/config.toml里设置features.codex_hooks = true。 get_context.py --mode phase(不带--step)返回 Phase Index + Phase 1/2/3 所有 step body(以前只有 Phase Index)—— 这样 agent-less 平台(Kilo / Antigravity / Windsurf)手动跑/start时拿到的内容和 hook 平台一致。- Hook 路径 CWD 稳健性(部分):
inject-workflow-state.py从 CWD 向上查找.trellis/,修复了该 hook 在子目录 / submodule 里 CWD 漂移的问题。所有 hook 的完整覆盖留到 beta 之后的 task。
Spec 文档更新
- platform-integration.md —— 新章节:Workflow State Injection(每轮面包屑)、Subagent Context Injection: Hook-based vs Pull-based、Guidelines: Paths-only vs Inline、Per-Turn Hook 设计原则(不要静默退出)
- quality-guidelines.md —— 新章节:Schema 字段废弃时要审计所有 writer(来自一次 Codex cross-review:
cmd_create删了字段但 hook 每次 spawn 还在回写) - workflow.md —— 完整英文化;结构精简;task.py 16 子命令表
- directory-structure.md + script-conventions.md —— multi-agent 相关引用移除
测试
595 个 tests 全过,lint + typecheck 全绿。本周期共新加 41 个 tests:workflow-state per-turn 面包屑(7 个 case)、Phase Index 扩容、paths-only guidelines、update_current_phase 删除回归、UserPromptSubmit 平台接线 invariant、breaking-change gate(3 个 case:拦截 / dry-run 放行 / --migrate 放行)、0.5.0-beta.0 manifest 形状(65 条覆盖 / 各平台路径 invariant / breaking + recommendMigrate flag)、worktree backup 排除(12 个 case:各平台 worktree 惯例 + 用户数据 + 边界情况)。
延后到后续 beta / rc
- Kiro
agentSpawnhook 输出格式在真实环境验证 - Cursor / CodeBuddy / Droid sub-agent hook 注入真实环境测试
- 所有 hook 的完整 CWD 稳健性(含 Windows cmd / PowerShell)
- Submodule / 微服务仓库的父子 Trellis 配置(issue #172)
迁移
跑trellis update --migrate(本次 --migrate 必加 —— 68 条 rename 条目不加这个 flag 不会执行,新的 gate 也会 exit 1 提醒加上)。然后 138 条 safe-file-delete 会执行。你本地改过的文件会保留并给警告;只有原版 Trellis 写入的文件会被清理。想先预览可以先跑 trellis update --migrate --dry-run。
/trellis:record-session 用户: 这个命令被移除了。它原本唯一的职责(调 add_session.py 写 session journal)现在是 /trellis:finish-work 的 Step 3,同时 finish-work 还覆盖了 Quality Gate 和 Commit 提醒。如果你的 alias 或脚本引用了 record-session,请改成 finish-work。
Codex 用户: 在 ~/.codex/config.toml 里设置 features.codex_hooks = true 来启用 SessionStart + UserPromptSubmit 面包屑注入。不设置 flag 的话 hooks.json 会被 Codex 静默忽略。
iFlow 用户: .iflow/ 目录会被移除。如果想保留,先拷出来再跑 update。
安装:npm install -g @mindfoldhq/trellis@beta