跳转到主要内容

Documentation Index

Fetch the complete documentation index at: https://docs.trytrellis.app/llms.txt

Use this file to discover all available pages before exploring further.

beta.18 重新设计了 workflow Phase 3:新增 Phase 3.4 Commit changes 步骤,让 AI 按本次 session 改动批量起草 commit;/trellis:finish-work 回归 archive + journal 语义,工作区还有未提交代码改动时拒绝执行。同时修复了子任务归档导致父任务进度回退的 bug、trellis update 期间 AGENTS.md 哈希追踪的问题,以及 OpenCode 在 Windows 下的 PowerShell context 注入。

Enhancements

Phase 3.4 Commit changes

workflow.md Phase 3 新增必选步骤 3.4 Commit changes,由 AI 主导 commit 节奏,不再丢给用户手动处理。
StepAI 的具体动作
1git status --porcelain 快照所有 dirty path
2git log --oneline -5 学习 repo 的 commit message 风格(前缀 / 语言 / 长度)
3把 dirty 文件分成 AI 本会话编辑过未识别 两组
4起草多 commit plan,每批一个语义内聚的改动
5一次性展示 plan 给用户 confirm
6用户确认后:每批跑 git add + git commit,不允许 --amend,不允许 git push
7用户拒绝(“不行” / “我自己来” / “manual” / 任何反对):退出 commit 编排,不做第二次 plan,无需 flag
3.4 的 Wrap-up reminder 顺移到 3.5[workflow-state:completed] breadcrumb(以及 inject-workflow-state.py / inject-workflow-state.js 的四份 hook fallback)现在统一指向 /trellis:finish-work,不再走老的 task.py finish + task.py archive 提示。

/trellis:finish-work 回归 survey + archive + journal

skill 删掉了原本的 “Remind user to commit” 步骤,加了一步 survey 帮你发现遗忘的已完成任务。新流程是:
Step动作
1get_context.py --mode record 输出 active tasks、git status 和 recent commits。如果除了当前 task 之外还有其它看起来已完成的 task,一次性问用户:“这 N 个一并归档吗?[y/N]“
2git status --porcelain,排除 .trellis/workspace/.trellis/tasks/(这两个路径由脚本 auto-commit 管理)。其它路径有 dirty 文件就拒绝执行。
3对当前 active task 跑 task.py archive <task>(一定归档)+ Step 1 用户确认的其它 task。每条产生一个 chore(task): archive ... commit
4add_session.py --commit <hashes> 写 session journal(产生 chore: record journal commit)。hash 取自 Step 1 的 Recent commits 输出
最终 git log 顺序固定为 <3.4 阶段的 work commits>chore(task): archive ...(可能多条)→ chore: record journal,bookkeeping commit 永远在 work commit 之后,不再交错。 common skill 模板用 {{CMD_REF:finish-work}} 占位符,每个平台按自己的 cmdRefPrefix 解析:Claude Code / OpenCode 是 /trellis:finish-work,Codex 是 $finish-work,Cursor 是 /trellis-finish-work

Bug Fixes

子任务归档不再让父任务进度倒退

task.py list 之前会在子任务被归档后从父任务的 [x/y done] 计数里把它丢掉。
场景beta.18 之前beta.18
6 个子任务,1 个完成并归档[0/5 done][1/6 done]
6 个子任务,2 个完成并归档[0/4 done][2/6 done]
cmd_archive 不再从父任务的 children 列表里移除归档过的子任务,children_progress 把”不在活跃状态表里的 child”视为已完成(cmd_archive 在移动目录前总会把状态改成 completed)。这个 invariant 已写入 .trellis/spec/cli/backend/script-conventions.md 的 “Parent-child invariant” 一节。

trellis update 期间 AGENTS.md 哈希追踪

beta.18 之前的项目写过 AGENTS.md 但没记录模板哈希,所以 update 时会被当成 “modified by you” 冲突。beta.18 引入:
机制行为
<!-- TRELLIS:START --> block标记 AGENTS.md 内的 Trellis 管理区域;update 只替换这个 block,外面的用户内容一律保留
LEGACY_UNTRACKED_AGENTS_MD_BLOCK_HASHES allowlist收录 beta.18 之前 pristine 状态下的 block hash(如 c1f511b1...),匹配中即静默通过,老项目不会被追问
Hash trackingtemplate-hash.ts 此后会记录新模板的哈希,后续 update 走正常分类流程
block 之外的用户自定义内容一律保留。

OpenCode 在 Windows 下的 PowerShell context 注入

inject-subagent-context.js 现在按 host.platform 选择正确的 shell 语法:
Platform注入的前缀
win32$env:TRELLIS_CONTEXT_ID = '<key>'; <command>
其它export TRELLIS_CONTEXT_ID='<key>'; <command>
显式赋值的去重检测器同时识别 POSIX 形式(TRELLIS_CONTEXT_ID=...export TRELLIS_CONTEXT_ID=...)和 PowerShell 形式($env:TRELLIS_CONTEXT_ID = ...),用户手动加过前缀的命令不会被二次包装。

Internal

Vitest 测试隔离:清掉 host shell 的 session env

packages/cli/test/setup.ts 通过 vitest.config.tssetupFiles 注册,在 vitest 进程启动时 delete process.env.TRELLIS_CONTEXT_IDprocess.env.OPENCODE_RUN_ID,这样 OpenCode resolver 的测试就不会被 Claude / OpenCode 宿主 session 的 env 漏进来 hijack 掉 platform-input 推导出的 contextKey。这个模式已写入 .trellis/spec/cli/unit-test/conventions.md 的 “Test Isolation” 一节。

Spec 更新

Spec 文件新增内容
.trellis/spec/cli/backend/script-conventions.md父子任务 children 列表 invariant —— 历史列表,归档时不剔除,children_progress 把缺失视为完成
.trellis/spec/cli/unit-test/conventions.mdTest Isolation 模式 —— 在 vitest setup 里清掉 host shell 的 session env vars

Upgrade

存量项目:
trellis update
本次 beta 不需要加 --migrate flag。