多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Trellis 工作流收官指南:EcoPaste 项目中 finish-work 命令的任务归档与会话日志实践

Trellis 工作流收官指南:EcoPaste 项目中 finish-work 命令的任务归档与会话日志实践 桌面应用开发工具【免费下载链接】EcoPaste跨平台的剪贴板管理工具 | Cross-platform clipboard management tool项目地址https://gitcode.com/gh_mirrors/ec/EcoPaste点击查看免费下载导读Trellis 是一套以.trellis/目录为状态存储的 AI 开发工作流框架它将一次开发任务划分为 Plan / Execute / Finish 三个阶段。/trellis:finish-work命令正是 Finish 阶段的收官入口它负责把已完成的活跃任务归档、清理本轮会话产生的状态文件并记录会话日志session journal让仓库的 git 历史以「工作提交 → 归档提交 → 日志提交」的干净顺序收尾。本文以 EcoPaste 仓库中实际随附的 finish-work 命令文档 为主线逐条拆解其四步执行流程、脏路径分类启发式与决策规则并结合仓库内.opencode/的插件与子 Agent 源码讲清这套收官机制为何这样设计、每一步背后由哪些代码在支撑。一、定位finish-work 在 Trellis 工作流中的位置在深入命令细节前先明确它与相邻命令的分工。EcoPaste 仓库在 .opencode/commands/trellis/ 下共提供三个会话级命令start.md初始化会话加载当前状态、Phase 索引与 spec 指南索引continue.md根据活跃任务的状态字段planning/in_progress/completed与产物prd.md、design.md、implement.md、implement.jsonl、check.jsonl路由到正确的 Phase/Step 续跑finish-work.md收官。它不做代码提交——文档开头明确强调Code commits are NOT done here — those happen in workflow Phase 3.4 before you invoke this command.也就是说finish-work 的调用时机被严格固定在 Phase 3.4 的批量化提交完成之后。从 trellis-implement 的 Agent 定义 可以印证这一点Implement Agent 的 Forbidden Operations 明确禁止git commit/git push/git merge而 continue.md 的状态路由中in_progress check passed之后必须先走3.3spec 更新→ 3.4提交最后才进入本命令的归档流程。这种「提交在别处、这里只管归档与记账」的设计保证了任务收尾的原子性与可审计性。二、Step 1盘点当前状态--mode recordfinish-work 的第一步不是直接归档而是先「看清楚再动手」执行python3 ./.trellis/scripts/get_context.py --mode record该命令一次性输出三块信息输出项用途My active tasks审查除当前任务外是否还有其他实际已完成代码已合并、AC 已满足且应在本轮一并归档的任务Git status快速目视当前工作区有哪些脏文件Recent commitsStep 4 中--commit参数需要用到这些提交的哈希值这里有一个容易踩坑的细节--mode record如果暴露了不属于当前会话的其他已完成任务不要擅自归档而是向用户做一次性确认These N tasks look done — archive them too in this round? [y/N]确认默认值是No不归档而当前活跃任务无论确认结果如何都会在 Step 3 中被无条件归档。这套「默认保守、显式确认」的策略避免了一次会话顺手把别的并行窗口的任务也清理掉。三、Step 2脏路径体检——区分当前任务与并行工作归档会触发脚本的自动提交因此必须先把工作区「洗干净」。执行git status --porcelain随后按两条过滤/分类规则处理3.1 先过滤受管路径.trellis/workspace/与.trellis/tasks/下的路径不需要人工处理——它们由add_session.py和task.py archive的自动提交托管在本次收官过程中出现脏状态属于该 skill 自身工作的正常副产物。3.2 再按归属分类剩余脏路径对过滤后剩下的每个脏路径判断它属于当前任务还是其他并行工作例如另一个终端窗口在编辑同一仓库启发式如下当前任务的prd.md/implement.jsonl/check.jsonl中引用过的路径 →当前任务位于任务声明范围内、或本会话确实编辑过的代码区域 →当前任务位于无关区域、且本会话毫无印象触碰过的路径 →其他并行工作3.3 按分类结果路由分类结果处理方式存在疑似当前任务的未提交改动中止执行。输出提示Working tree has uncommitted code changes from this task:list. Return to workflow Phase 3.4 to commit them before running/trellis:finish-work.——此时不得就地git commit不得提示用户提交而是让用户回到 Phase 3.4由 AI 驱动批量提交全部属于并行窗口一次性汇报后继续 Step 3FYI, dirty files outside this tasks scope — leaving them for the other window:list.无法确定只问一次Arelistthis tasks work I forgot to commit, or another windows? (commit / ignore)再按用户回答路由这条「宁可中止、不可误清」的路由逻辑是整份文档的防错核心它用明确的 bail-out 提示把「未提交的工作」与「本命令的归档动作」之间的竞态风险压到最低。四、Step 3归档任务对确认过的任务执行归档python3 ./.trellis/scripts/task.py archive task-name要点如下最低限度归档当前活跃任务如果有再加 Step 1 中用户确认的额外任务自动提交每次归档都会由脚本产生一个chore(task): archive ...提交无需手工 commit空任务则跳过若没有活跃任务、且用户也未确认任何清理归档则整个 Step 3 跳过。归档动作对应的状态迁移在仓库的 OpenCode 集成层有直接体现session-utils.js 的 getTaskStatus 在读到task.json中status completed时输出的 Next 提示正是Archive with python3 ./.trellis/scripts/task.py archive dir or start a new task——完成态任务的唯一出路就是归档或开新任务这与本命令 Step 3 完全对应。五、Step 4记录会话日志最后一步是为本轮会话「记账」执行python3 ./.trellis/scripts/add_session.py \ --title Session Title \ --commit hash1,hash2 \ --summary Brief summary三个参数的含义参数取值来源--title本会话的主题建议与活跃任务标题保持一致--commitPhase 3.4 产生的工作提交哈希多个用逗号分隔。可从 Step 1 的Recent commits列表或git log --oneline中取得--summary会话摘要两个容易混淆的约束一是--commit只能填工作提交严禁混入 Step 3 的归档提交哈希二是该命令最终产生一个chore: record journal提交。收官后的理想 git 顺序文档给出了最终的提交序这是验证收官是否成功的黄金标准Phase 3.4 的工作提交 → chore(task): archive ...一个或多个→ chore: record journal如果git log --oneline呈现的正是这条链说明任务状态、工作区与日志三者已经对齐若顺序错乱例如日志提交出现在归档之前说明收官流程未按序执行。六、源码佐证OpenCode 集成层如何支撑收官流程finish-work 命令文档面向 Trellis 的 Python 脚本层.trellis/scripts/而 EcoPaste 仓库同时随附了完整的OpenCode 平台适配层其中多处代码直接支撑本命令的前置状态与后续语义6.1 会话上下文解析trellis-context.js.opencode/lib/trellis-context.js 中的TrellisContext类负责把「当前会话」映射到「活跃任务」它按TRELLIS_CONTEXT_ID→OPENCODE_RUN_ID→session_id→conversation_id→transcript_path的优先级计算上下文键然后到.trellis/.runtime/sessions/key.json读取current_task若命中不到且本地恰好只有一个会话运行时文件则走_resolveSingleSessionFallback()单文件回退。这一「多窗口隔离、拒绝猜谜」的设计0 个或多个运行时文件时一律返回 null正是 Step 2 中「其他并行窗口的脏路径归它所有」这一分类得以成立的前提。6.2 每轮工作流面包屑inject-workflow-state.js.opencode/plugins/inject-workflow-state.js 在每个chat.message事件上为活跃任务注入一段workflow-state面包屑。它从.trellis/workflow.md中按[workflow-state:STATUS]标签块解析提示文本workflow.md 是唯一事实源标签缺失时宁可降级为一句Refer to workflow.md for current step.也不内置兜底表——这样用户在收官时能立刻发现状态定义被破坏而不是被插件悄悄掩盖。此外它通过isTrellisSubagent正则/^trellis-(implement|check|research)$/跳过子 Agent 轮次保证面包屑只面向主会话。6.3 子 Agent 的提交禁令trellis-implement.mdtrellis-implement 的 Agent 定义 在 Forbidden Operations 中明确禁止 Implement Agent 执行git commit/git push/git merge。这解释了 finish-work 文档「Do NOT run git commit here」的必然性从实现到收官之间提交动作被硬编码为只允许发生在 Phase 3.4 的主会话批量提交Implement 子 Agent 与 finish-work 命令都无权越俎代庖从而保证每一笔提交都经过 Check Agent 的质量校验见 trellis-check.md 的 Self-Fix 与验证流程。七、实操要点速查把上述四步压缩为一份可直接对照执行的清单盘点python3 ./.trellis/scripts/get_context.py --mode record确认活跃任务与近期提交哈希体检git status --porcelain过滤.trellis/workspace/与.trellis/tasks/若有疑似当前任务的未提交改动中止并返回 Phase 3.4归档python3 ./.trellis/scripts/task.py archive task-name等待脚本自动产生chore(task): archive ...提交记账用 Phase 3.4 的工作提交哈希执行add_session.py --title/--commit/--summary产生chore: record journal提交校验用git log --oneline核对终序工作提交 → 归档提交 → 日志提交。最后提醒finish-work 命令本身及它调用的get_context.py、task.py、add_session.py位于完整的 Trellis 安装.trellis/scripts/中EcoPaste 当前镜像仓库未随附该目录但命令的完整语义与配套的 OpenCode 适配层命令、Agent、插件、工具库均已在 .opencode/ 下完整可查可作为任何 Trellis 化项目落地收官流程的参考蓝本。赞分享桌面应用开发工具【免费下载链接】EcoPaste跨平台的剪贴板管理工具 | Cross-platform clipboard management tool项目地址https://gitcode.com/gh_mirrors/ec/EcoPaste点击查看免费下载相关推荐EcoPaste 仓库 Trellis 工作流收尾命令finish-work实战指南任务归档与会话日志记录的完整流程EcoPaste 仓库 Trellis 工作流收尾命令finish work实战指南任务归档与会话日志记录的完整流程 导读 Trellis 是一套面向 A桌面应用Home Manager 发布说明编写指南rl-*.md 文档规范与迁移影响评估Home Manager 发布说明编写指南rl .md 文档规范与迁移影响评估 发布说明Release Notes是 Home Manager 面向用户在桌面应用开发工具5 步装好 .NET 10 SDK.NET 10 LTS 环境搭建完整指南5 步装好 .NET 10 SDK.NET 10 LTS 环境搭建完整指南 给 .NET 10 装环境时人最容易卡在三个问题上装哪个包、走什么安装通道、缺桌面应用开发工具上一篇DLSS Swapper免费一键给老游戏换新 DLSS、FSR、XeSS 的开源工具下一篇解决多场景微信访问限制的浏览器插件方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表