flower-trellis 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +113 -0
  2. package/bin/flower-trellis.js +4 -0
  3. package/enhancements/0.5/.agents/skills/trellis-analyze-task/SKILL.md +142 -0
  4. package/enhancements/0.5/.agents/skills/trellis-check-all/SKILL.md +324 -0
  5. package/enhancements/0.5/.agents/skills/trellis-create-command/SKILL.md +258 -0
  6. package/enhancements/0.5/.agents/skills/trellis-create-prd/SKILL.md +197 -0
  7. package/enhancements/0.5/.agents/skills/trellis-draw-uml/SKILL.md +148 -0
  8. package/enhancements/0.5/.agents/skills/trellis-migrate-skill/SKILL.md +216 -0
  9. package/enhancements/0.5/.agents/skills/trellis-plan-version/SKILL.md +140 -0
  10. package/enhancements/0.5/.agents/skills/trellis-push/SKILL.md +240 -0
  11. package/enhancements/0.5/.agents/skills/trellis-re-implement/SKILL.md +166 -0
  12. package/enhancements/0.5/.agents/skills/trellis-route/SKILL.md +159 -0
  13. package/enhancements/0.5/.agents/skills/trellis-run-full-chain/SKILL.md +402 -0
  14. package/enhancements/0.5/.agents/skills/trellis-sync-prd/SKILL.md +150 -0
  15. package/enhancements/0.5/.agents/skills/trellis-verify-prd/SKILL.md +217 -0
  16. package/enhancements/0.5/.claude/skills/trellis-analyze-task/SKILL.md +142 -0
  17. package/enhancements/0.5/.claude/skills/trellis-check-all/SKILL.md +324 -0
  18. package/enhancements/0.5/.claude/skills/trellis-create-command/SKILL.md +258 -0
  19. package/enhancements/0.5/.claude/skills/trellis-create-prd/SKILL.md +197 -0
  20. package/enhancements/0.5/.claude/skills/trellis-draw-uml/SKILL.md +148 -0
  21. package/enhancements/0.5/.claude/skills/trellis-migrate-skill/SKILL.md +216 -0
  22. package/enhancements/0.5/.claude/skills/trellis-plan-version/SKILL.md +140 -0
  23. package/enhancements/0.5/.claude/skills/trellis-push/SKILL.md +240 -0
  24. package/enhancements/0.5/.claude/skills/trellis-re-implement/SKILL.md +166 -0
  25. package/enhancements/0.5/.claude/skills/trellis-route/SKILL.md +159 -0
  26. package/enhancements/0.5/.claude/skills/trellis-run-full-chain/SKILL.md +402 -0
  27. package/enhancements/0.5/.claude/skills/trellis-sync-prd/SKILL.md +150 -0
  28. package/enhancements/0.5/.claude/skills/trellis-verify-prd/SKILL.md +217 -0
  29. package/enhancements/0.5/overrides/trellis-route.md +52 -0
  30. package/enhancements/0.6/.agents/skills/trellis-check-all/SKILL.md +342 -0
  31. package/enhancements/0.6/.agents/skills/trellis-create-command/SKILL.md +293 -0
  32. package/enhancements/0.6/.agents/skills/trellis-draw-uml/SKILL.md +148 -0
  33. package/enhancements/0.6/.agents/skills/trellis-extract-prd/SKILL.md +197 -0
  34. package/enhancements/0.6/.agents/skills/trellis-plan-version/SKILL.md +140 -0
  35. package/enhancements/0.6/.agents/skills/trellis-push/SKILL.md +316 -0
  36. package/enhancements/0.6/.agents/skills/trellis-route/SKILL.md +159 -0
  37. package/enhancements/0.6/.agents/skills/trellis-run-full-chain/SKILL.md +402 -0
  38. package/enhancements/0.6/.agents/skills/trellis-verify-task/SKILL.md +360 -0
  39. package/enhancements/0.6/.claude/skills/trellis-check-all/SKILL.md +342 -0
  40. package/enhancements/0.6/.claude/skills/trellis-create-command/SKILL.md +293 -0
  41. package/enhancements/0.6/.claude/skills/trellis-draw-uml/SKILL.md +148 -0
  42. package/enhancements/0.6/.claude/skills/trellis-extract-prd/SKILL.md +197 -0
  43. package/enhancements/0.6/.claude/skills/trellis-plan-version/SKILL.md +140 -0
  44. package/enhancements/0.6/.claude/skills/trellis-push/SKILL.md +316 -0
  45. package/enhancements/0.6/.claude/skills/trellis-route/SKILL.md +159 -0
  46. package/enhancements/0.6/.claude/skills/trellis-run-full-chain/SKILL.md +402 -0
  47. package/enhancements/0.6/.claude/skills/trellis-verify-task/SKILL.md +360 -0
  48. package/enhancements/0.6/overrides/workflow-states/in_progress-inline.md +5 -0
  49. package/enhancements/0.6/overrides/workflow-states/in_progress.md +7 -0
  50. package/enhancements/0.6/overrides/workflow-states/no_task.md +6 -0
  51. package/enhancements/0.6/overrides/workflow-states/planning.md +6 -0
  52. package/enhancements/0.6/overrides/workflow.md +53 -0
  53. package/enhancements/MANIFEST.json +109 -0
  54. package/enhancements/old/.agents/skills/analyze-task/SKILL.md +143 -0
  55. package/enhancements/old/.agents/skills/check-all/SKILL.md +128 -0
  56. package/enhancements/old/.agents/skills/check-impl/SKILL.md +159 -0
  57. package/enhancements/old/.agents/skills/check-prd/SKILL.md +219 -0
  58. package/enhancements/old/.agents/skills/check-prd-impl/SKILL.md +190 -0
  59. package/enhancements/old/.agents/skills/create-prd/SKILL.md +154 -0
  60. package/enhancements/old/.agents/skills/draw-uml/SKILL.md +148 -0
  61. package/enhancements/old/.agents/skills/plan-version/SKILL.md +140 -0
  62. package/enhancements/old/.agents/skills/push/SKILL.md +191 -0
  63. package/enhancements/old/.agents/skills/re-implement/SKILL.md +166 -0
  64. package/enhancements/old/.agents/skills/sync-prd/SKILL.md +146 -0
  65. package/enhancements/old/.claude/commands/trellis/analyze-task.md +139 -0
  66. package/enhancements/old/.claude/commands/trellis/check-all.md +124 -0
  67. package/enhancements/old/.claude/commands/trellis/check-impl.md +154 -0
  68. package/enhancements/old/.claude/commands/trellis/check-prd-impl.md +186 -0
  69. package/enhancements/old/.claude/commands/trellis/check-prd.md +215 -0
  70. package/enhancements/old/.claude/commands/trellis/create-prd.md +150 -0
  71. package/enhancements/old/.claude/commands/trellis/draw-uml.md +144 -0
  72. package/enhancements/old/.claude/commands/trellis/plan-version.md +136 -0
  73. package/enhancements/old/.claude/commands/trellis/push.md +187 -0
  74. package/enhancements/old/.claude/commands/trellis/re-implement.md +162 -0
  75. package/enhancements/old/.claude/commands/trellis/sync-prd.md +142 -0
  76. package/package.json +39 -0
  77. package/src/cli.js +151 -0
  78. package/src/commands/init.js +66 -0
  79. package/src/commands/uninstall.js +85 -0
  80. package/src/commands/update.js +42 -0
  81. package/src/constants.js +50 -0
  82. package/src/lib/apply-enhancements.js +133 -0
  83. package/src/lib/banner.js +45 -0
  84. package/src/lib/codex-tweaks.js +112 -0
  85. package/src/lib/copy-skills.js +91 -0
  86. package/src/lib/fs-utils.js +60 -0
  87. package/src/lib/legacy-blocks.js +70 -0
  88. package/src/lib/manifest.js +32 -0
  89. package/src/lib/paths.js +16 -0
  90. package/src/lib/pick-platforms.js +57 -0
  91. package/src/lib/trellis-runner.js +190 -0
  92. package/src/lib/variant.js +40 -0
  93. package/src/lib/versions.js +30 -0
  94. package/src/lib/workflow-inject.js +193 -0
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: trellis-plan-version
3
+ description: "Generate a version development plan from a source requirements doc: requirements list, effort estimate, and team assignment."
4
+ ---
5
+ # 版本开发计划 — 从需求文档到任务拆分
6
+
7
+ 从原始需求文档出发,生成版本开发计划(需求清单 + 工时评估 + 人员分工),内置覆盖度校验确保不遗漏需求。
8
+
9
+ ---
10
+
11
+ ## 核心原则
12
+
13
+ 1. **需求文档是唯一真相** — 需求清单必须从文档全文提取,不能只看目录/总表
14
+ 2. **先扫后拆** — 先完成覆盖度扫描,确认无遗漏后再做工时评估和分工
15
+ 3. **可追溯** — 每个任务可追溯到原始文档的具体位置(行号/章节)
16
+
17
+ ---
18
+
19
+ ## 输入
20
+
21
+ 用户需提供:
22
+ - **原始需求文档路径**
23
+ - **版本号或迭代标识**
24
+ - **开发团队信息**(人数、角色分工模式)
25
+
26
+ ---
27
+
28
+ ## 执行步骤
29
+
30
+ ### Step 1: 理解文档结构 + 全文扫描
31
+
32
+ #### 1.0 先读后扫
33
+
34
+ 读取文档,识别其组织方式:
35
+ - 需求的划分单元是什么?(编号体系 / 章节 / 功能模块 / 用户故事)
36
+ - 有无需求总表或变更日志?
37
+ - 版本变更如何标记?(显式标记 / 总表版本列 / 变更日志章节 / 无标记)
38
+
39
+ > **不要假设文档有特定格式**,先读再判断。
40
+
41
+ #### 1.1 多策略识别本版本变更
42
+
43
+ 根据文档实际结构,组合使用以下策略:
44
+
45
+ | 策略 | 方法 |
46
+ |------|------|
47
+ | **标记扫描** | grep 搜索版本相关标记,**包括段落中间嵌入的** |
48
+ | **需求总表** | 读取需求列表中版本相关列,提取本版本的条目 |
49
+ | **全文通读** | 逐章扫描「新增」「变更」「调整」等动作词 |
50
+
51
+ #### 1.2 归组到需求单元
52
+
53
+ 每个变更点定位到所属的需求单元,记录:
54
+ - 需求单元标识(编号、名称或章节)
55
+ - 变更内容摘要
56
+ - 在文档中的位置
57
+ - 变更类型:整体新增 / 局部变更 / 字段级嵌入
58
+
59
+ > **[!] 关键:必须识别出「字段级嵌入变更」。**
60
+ > 有些需求单元整体是旧版本的,但内部某个字段/段落属于新版本变更。
61
+ > 仅看需求单元标题会遗漏这类变更。
62
+
63
+ #### 1.3 识别散射型变更
64
+
65
+ 检查是否有同一功能点散布在多个需求单元中:
66
+ - 同一字段在不同页面的展示/编辑/导出
67
+ - 同一业务规则在不同入口的复用
68
+ - 标记每组散射变更,确保后续分工时归同一人
69
+
70
+ ### Step 2: 输出需求清单 — 覆盖度确认
71
+
72
+ 输出完整的需求清单,请用户确认无遗漏:
73
+
74
+ ```markdown
75
+ ## <版本> 需求清单
76
+
77
+ ### 扫描统计
78
+ - 需求总表中本版本条目: X 个
79
+ - 全文扫描发现的变更: Y 个
80
+ - 去重后独立需求单元: Z 个
81
+
82
+ ### 需求列表
83
+
84
+ | # | 需求单元 | 功能点 | 变更类型 | 变更摘要 | 文档位置 |
85
+ |---|---------|--------|---------|---------|---------|
86
+
87
+ ### 散射型变更(同一功能点跨多个需求单元)
88
+
89
+ | 功能点 | 涉及的需求单元 | 建议处理 |
90
+ |--------|--------------|---------|
91
+
92
+ ### 需求总表 vs 全文扫描差异
93
+
94
+ | 来源 | 仅在总表 | 仅在全文 | 两者都有 |
95
+ |------|---------|---------|---------|
96
+
97
+ > 仅在全文中的变更 = 总表未收录的嵌入式变更,最易遗漏。
98
+ ```
99
+
100
+ **等待用户确认后再继续。**
101
+
102
+ ### Step 3: 工时评估
103
+
104
+ 基于确认后的需求清单,评估每个需求的工时。
105
+
106
+ 输出表格的列结构**根据项目实际的角色分工来定**(如前端/后端/全栈/测试等),不要预设。
107
+
108
+ 评估原则:
109
+ - 如有 AI 编程辅助,标注基准(AI 辅助 vs 纯人工)
110
+ - 复用关系明确标注
111
+ - 优先级以需求文档为准
112
+
113
+ ### Step 4: 人员分工
114
+
115
+ 按模块边界分工,遵循:
116
+ - 复用链归同一人
117
+ - 散射型变更归同一人
118
+ - 尽量无交集
119
+
120
+ 输出分工表和排期建议。
121
+
122
+ ### Step 5: 生成产物文件
123
+
124
+ 在 `doc/` 目录下生成:
125
+
126
+ ```
127
+ doc/
128
+ ├── <版本>-需求清单.md # Step 2 的完整输出(含覆盖度校验)
129
+ ├── <版本>-开发计划-工时评估.md # Step 3 + Step 4
130
+ ```
131
+
132
+ ---
133
+
134
+ ## 反模式
135
+
136
+ - ❌ 只从需求总表提取需求(会漏掉嵌入式变更)
137
+ - ❌ 跳过覆盖度确认直接做工时评估
138
+ - ❌ 散射型变更分给不同的人
139
+ - ❌ 假设文档有特定格式或特定的角色分工模式
140
+ - ❌ 当多个来源的优先级冲突时不明确说明以哪个为准
@@ -0,0 +1,316 @@
1
+ ---
2
+ name: trellis-push
3
+ description: "Commit + push across configured repos with optional merge-to-target."
4
+ ---
5
+ # Push — 提交并推送(可选合并到目标分支)
6
+
7
+ 一键完成 commit → push → 可选 merge 到目标分支(通常是测试线)→ push 目标分支 → 切回。
8
+
9
+ 支持多仓库(frontend / backend),merge 目标分支记录在 `.trellis/config.yaml` 的 `packages.<name>.merge_target` 中。
10
+
11
+ ---
12
+
13
+ ## 配置
14
+
15
+ 目标分支存储在 `.trellis/config.yaml` 的 packages 配置中:
16
+
17
+ ```yaml
18
+ packages:
19
+ frontend:
20
+ path: iqs-front-human
21
+ git: true
22
+ merge_target: test # 首次 push 时询问后自动写入
23
+ backend:
24
+ path: iqs
25
+ git: true
26
+ merge_target: test
27
+ ```
28
+
29
+ > 首次运行时如果 `merge_target` 不存在,会在 merge 步骤询问目标分支并回写到 `config.yaml`。
30
+ > 如需修改,直接编辑 `config.yaml` 或通过 `/trellis-push` 传入 `--reconfigure` 语义。
31
+
32
+ ---
33
+
34
+ ## 执行步骤
35
+
36
+ ### Step 0: 读取配置
37
+
38
+ 读取 `.trellis/config.yaml` 中的 `packages` 配置,识别所有 `git: true` 的仓库及其 `merge_target`(如果已配置)。
39
+
40
+ ### Step 0.5: 读取活动任务上下文(可选)
41
+
42
+ 为后续 Step 3「写入任务进度快照」准备输入。本步骤**不阻塞**主流程:任何读取失败都按"无任务上下文"继续,不要中断 push。
43
+
44
+ ```bash
45
+ # 在仓库根目录(含 .trellis/ 的项目根,不是 package 子目录)
46
+ python3 ./.trellis/scripts/task.py current
47
+ ```
48
+
49
+ - **无活动任务**(命令退出码非 0 或输出为空):在内存里标记 `active_task=None`,**跳过 Step 3**,把本次 push 当作纯 chore push 处理。
50
+ - **有活动任务**:解析输出拿到 task 路径(形如 `.trellis/tasks/MM-DD-name/`),并读取下列内容供 Step 3 使用:
51
+ - `<task_dir>/implement.md`(如有)— 步骤清单,AI 推断进度的主依据
52
+ - `<task_dir>/task.json` 的 `last_push_snapshot` 字段(如有)— 上次推送时的进度基线
53
+ - `<task_dir>/task.json` 的 `base_branch` 字段 — 用于 `git log <base_branch>..HEAD` 圈定本任务的 commit 范围
54
+
55
+ > 本步骤只读不写。如果读取异常(task.json 损坏、implement.md 缺失等),Step 3 退化为"完全靠用户口述进度",不影响 push 主流程。
56
+
57
+ ### Step 1: 检测变更
58
+
59
+ 读取 `.trellis/config.yaml` 中的 `packages` 配置,对每个 git 仓库检测变更:
60
+
61
+ ```bash
62
+ # 对每个 package
63
+ cd <package_path>
64
+ git status --short
65
+ ```
66
+
67
+ 列出有变更的仓库。如果所有仓库都没有变更,提示用户并终止。
68
+
69
+ 如果只有部分仓库有变更,只处理有变更的仓库。
70
+
71
+ ### Step 2: 逐仓库处理
72
+
73
+ 对每个有变更的仓库,依次执行以下操作:
74
+
75
+ #### 2.1 展示变更摘要
76
+
77
+ ```bash
78
+ cd <package_path>
79
+ git diff --stat
80
+ git diff --name-only
81
+ ```
82
+
83
+ #### 2.2 暂存文件
84
+
85
+ 展示要暂存的文件列表,**获得用户确认后**再暂存。
86
+
87
+ ```bash
88
+ git add <具体文件列表>
89
+ ```
90
+
91
+ > **[!] 禁止使用 `git add -A` 或 `git add .`**
92
+ > 必须明确列出文件,避免误提交敏感文件(.env、credentials 等)。
93
+
94
+ #### 2.3 生成 commit message 并提交
95
+
96
+ 分析变更内容,生成符合项目风格的 commit message:
97
+ - 读取最近 5 条 commit 参考风格
98
+ - 类型前缀:`feat` / `fix` / `chore` / `refactor` 等
99
+ - 简短描述变更内容
100
+ - 使用中文描述
101
+
102
+ ```bash
103
+ git commit -m "<type>(<scope>): <description>"
104
+ ```
105
+
106
+ #### 2.4 Push 当前分支
107
+
108
+ ```bash
109
+ git push origin <current_branch>
110
+ ```
111
+
112
+ 如果远程没有该分支,使用 `-u` 建立跟踪:
113
+
114
+ ```bash
115
+ git push -u origin <current_branch>
116
+ ```
117
+
118
+ #### 2.5 询问是否 Merge 到目标分支(可选)
119
+
120
+ Push 完成后,检查该 package 是否已配置 `merge_target`:
121
+
122
+ **已配置 `merge_target`**:
123
+
124
+ ```markdown
125
+ <package> 已推送到 <current_branch>。是否合并到 <merge_target>?
126
+
127
+ 1. 是,合并到 <merge_target>
128
+ 2. 否,跳过
129
+ ```
130
+
131
+ **未配置 `merge_target`(首次)**:
132
+
133
+ ```markdown
134
+ <package> 已推送到 <current_branch>。是否需要合并到其他分支(如测试线)?
135
+
136
+ 1. 是,请输入目标分支名
137
+ 2. 否,跳过
138
+ ```
139
+
140
+ 如果用户输入了目标分支名,**将其回写到 `.trellis/config.yaml`** 对应 package 的 `merge_target` 字段,下次自动使用。
141
+
142
+ **如果用户选择合并**:
143
+
144
+ ```bash
145
+ # 切换到目标分支并拉取最新
146
+ git checkout <target_branch>
147
+ git pull origin <target_branch>
148
+
149
+ # 合并当前开发分支
150
+ git merge <current_branch> --no-edit
151
+
152
+ # Push 目标分支
153
+ git push origin <target_branch>
154
+
155
+ # 切回开发分支
156
+ git checkout <current_branch>
157
+ ```
158
+
159
+ > **[!] 如果 merge 出现冲突:**
160
+ > 1. 立即停止,展示冲突文件列表
161
+ > 2. 询问用户:手动解决 / 中止 merge
162
+ > 3. **绝对不能** `git merge --abort` 后静默跳过
163
+
164
+ **如果用户选择跳过**:直接进入下一个仓库或输出结果。
165
+
166
+ ### Step 3: 写入任务进度快照(可选)
167
+
168
+ 仅当 Step 0.5 识别到活动任务时执行;否则跳过本步直接进入 Step 4。
169
+
170
+ **目的**:让下次新会话进来时能感知"任务做到哪一步了"。配套机制由 `.trellis/workflow.md` 的 `[workflow-state:no_task]` 块里的 `push-progress-recovery` guard 触发(见 3.4)。
171
+
172
+ **架构说明**:`.trellis/tasks/<task>/task.json` 在**父仓**(含 `.trellis/` 的项目根目录)的 git 跟踪范围内,与子仓(frontend / backend)独立。因此本 Step 完成后必须**额外 commit + push 父仓**(见 3.3),才能让 snapshot 真正落到 remote,跨机器恢复有效,且不留脏工作区。
173
+
174
+ #### 3.1 AI 推断进度
175
+
176
+ 收集以下信号:
177
+
178
+ - Step 0.5 读到的 `implement.md` 步骤清单(如缺失则只能靠 commit history 粗略推断)
179
+ - 各子仓 `git log <base_branch>..HEAD --oneline`(任务分支自分叉以来的所有 commit,含本次刚 push 的)
180
+ - 上次 `last_push_snapshot`(如有)— 作为基线,重点判断"上次之后又做了什么"
181
+
182
+ 基于以上信号,AI **主动给出一个 draft**(不要让用户从零列步骤),例如:
183
+
184
+ ```markdown
185
+ 任务进度推断(请确认):
186
+
187
+ - ✅ Step 1-3 已完成(frontend abc1234 / backend def5678 覆盖了对应改动)
188
+ - 🟡 Step 4 部分完成 — 看到 README.md 改了 2 处,implement.md 写要改 4 处
189
+ - ⬜ Step 5 未跑
190
+
191
+ 本次 push 后停在 **Step 4(部分)**,下一步 **Step 5(校验)**。
192
+
193
+ 确认(yes)/ 调整(说明具体改动)/ 跳过快照(skip)
194
+ ```
195
+
196
+ #### 3.2 写入 task.json
197
+
198
+ 用户确认(yes 或调整后的版本)→ 在 `<task_dir>/task.json` 写入 / 更新 `last_push_snapshot` 字段:
199
+
200
+ ```json
201
+ "last_push_snapshot": {
202
+ "snapshot_at": "<ISO 8601 时间戳>",
203
+ "branch": "<任务分支名>",
204
+ "pushed_commits": {
205
+ "frontend": "abc1234",
206
+ "backend": "def5678"
207
+ },
208
+ "completed_steps": ["Step 1", "Step 2", "Step 3"],
209
+ "partial_step": "Step 4 (README 改了 2/4 处)",
210
+ "next_step": "Step 5 (校验)",
211
+ "notes": "<可选:用户补充说明>"
212
+ }
213
+ ```
214
+
215
+ 字段语义:
216
+ - `snapshot_at`:写快照的时间戳(必填)
217
+ - `branch`:任务分支名(必填,多仓不同分支时改成字典 `{"frontend": "...", "backend": "..."}`)
218
+ - `pushed_commits`:本次刚 push 的最新 commit 短 hash,按 package 名分键(必填)
219
+ - `completed_steps`:implement.md 中已完成的 step 名数组(必填)
220
+ - `partial_step` / `next_step` / `notes`:可选
221
+
222
+ 写入方式:读 `task.json` → 解析 JSON → 设置 `last_push_snapshot` 字段 → 保留其它字段原样 → 写回(保持原有 indent,通常 2 空格)。**不要**覆盖整个 task.json,只更新一个字段。
223
+
224
+ > 用户回复 `skip` 时不写入 task.json,**整个 Step 3 终止**(包括跳过 3.3 父仓提交),直接进 Step 4。
225
+
226
+ #### 3.3 父仓 commit + push(同步到 remote)
227
+
228
+ 写完 task.json 后,**必须**把这个改动 commit + push 到父仓 remote,否则:
229
+ - 工作区残留脏 task.json
230
+ - 跨机器 / 重新 clone 时拿不到 snapshot
231
+ - 父仓 git log 缺失任务进度的演进记录
232
+
233
+ ```bash
234
+ # 切到父仓根目录(含 .trellis/ 的目录,不是 package 子目录)
235
+ cd <project_root>
236
+
237
+ # 先看父仓 status,确认变更只有 task.json
238
+ git status --short
239
+ ```
240
+
241
+ **[!] 如果父仓 status 显示 task.json 之外还有其他改动**:停下来询问用户:是否一并提交 / 拆分 / 暂存?不要静默打包。
242
+
243
+ ```bash
244
+ # 仅 stage 这一个文件,避免误带父仓其他改动
245
+ git add .trellis/tasks/<task_dir>/task.json
246
+
247
+ # commit(message 参考项目现有风格,如 chore(task): / [UPDATE] 等)
248
+ git commit -m "chore(task): update <task_name> push snapshot"
249
+ ```
250
+
251
+ 检查父仓是否配置 remote:
252
+
253
+ ```bash
254
+ git remote -v | grep -E "^origin\s+"
255
+ ```
256
+
257
+ - **有 remote**:`git push origin <current_branch>`(首次用 `git push -u origin <current_branch>`)
258
+ - **无 remote**:仅本地 commit,跳过 push 步骤,提示用户"父仓未配 remote,snapshot 仅本地保存"
259
+
260
+ #### 3.4 新会话恢复(被动机制,无需在本步操作)
261
+
262
+ 写入并 push 后,下次新会话进来时:
263
+
264
+ 1. SessionStart 检测到无 active task pointer → 输出 `<task-status>Status: NO ACTIVE TASK</task-status>`
265
+ 2. UserPromptSubmit 每轮注入 `[workflow-state:no_task]` 块,含 skill-garden 的 `push-progress-recovery` guard
266
+ 3. AI 看到 guard → 扫描 `.trellis/tasks/*/task.json` 找 `status=in_progress` 的任务 → 读 `last_push_snapshot` → 主动告诉用户「发现未完成任务 X,上次 push 完成到 Step Y,下一步 Z」并建议 `task.py start <task>` 恢复
267
+
268
+ ### Step 4: 输出结果
269
+
270
+ ```markdown
271
+ ## Push 结果
272
+
273
+ | 仓库 | 分支 | 目标 | commit | 状态 |
274
+ |------|------|------|--------|------|
275
+ | frontend | v1.3 | test | abc1234 feat(...): ... | ✅ 已合并 |
276
+ | backend | v1.3 | test | def5678 fix(...): ... | ⏭️ 跳过合并 |
277
+
278
+ 所有变更已推送到目标分支。
279
+ ```
280
+
281
+ 若 Step 3 写入了 `last_push_snapshot`,在结果末尾追加一行:
282
+
283
+ ```markdown
284
+ 任务进度快照已写入 `<task_dir>/task.json`:完成 Step 1-3,下一步 Step 5。
285
+ ```
286
+
287
+ ---
288
+
289
+ ## 语义参数(通过自然语 / skill args 传入)
290
+
291
+ | 语义 | 说明 | 用户怎么说 |
292
+ |------|------|-----------|
293
+ | 默认 | 自动检测所有有变更的仓库并处理 | `/trellis-push` |
294
+ | 指定仓库 | 只处理指定仓库 | 「只 push 前端」/「push frontend」 |
295
+ | 重新配置 | 重新询问目标分支 | 「重新配置 push 目标分支」/「reconfigure push」 |
296
+ | 临时目标 | 临时指定目标分支(不修改配置) | 「push 到 hotfix 分支」 |
297
+
298
+ ---
299
+
300
+ ## 安全机制
301
+
302
+ 1. **暂存确认** — 每个仓库暂存前展示文件列表,用户确认
303
+ 2. **commit message 确认** — 展示生成的 message,用户可修改
304
+ 3. **merge 冲突处理** — 冲突时暂停,不静默跳过
305
+ 4. **不碰主分支** — 如果目标分支是 `master` / `main`,额外警告确认
306
+ 5. **不使用 force push** — 始终使用普通 push
307
+
308
+ ---
309
+
310
+ ## 反模式(避免)
311
+
312
+ - ❌ `git add -A`(可能误提交敏感文件)
313
+ - ❌ merge 冲突后静默 abort(用户需要知道)
314
+ - ❌ 未经确认直接 commit(必须让用户看到 message)
315
+ - ❌ force push 到目标分支
316
+ - ❌ 在目标分支上直接开发(只 merge,不在目标分支上改代码)
@@ -0,0 +1,159 @@
1
+ ---
2
+ name: trellis-route
3
+ description: |
4
+ Route trellis-implement / trellis-check execution mode by asking the user to choose inline or subagent.
5
+ For check, additionally choose between trellis-check (lightweight) and trellis-check-all (comprehensive,
6
+ default pre-commit). Invoked from Phase 2.1 / 2.2 of the routing-aware workflow. Skip in non-trellis
7
+ projects (no .trellis/). Not for other subagents (trellis-research / trellis-debug).
8
+ ---
9
+
10
+ # Trellis 路由器:implement / check 执行模式选择
11
+
12
+ 主 agent 进入 Phase 2.1 / 2.2 时调用本 skill,询问用户选择执行模式(inline / subagent / check-all)后输出执行指令。implement 支持本会话偏好(4h 内连续 dispatch 不重复问)。
13
+
14
+ ---
15
+
16
+ ## Step 1.5: 检查会话偏好(仅 target=implement)
17
+
18
+ 读 `.trellis/.route-prefs.tmp`(4h mtime 内有效):
19
+
20
+ ```bash
21
+ PREF_FILE=".trellis/.route-prefs.tmp"
22
+ if [ -f "$PREF_FILE" ]; then
23
+ MTIME=$(stat -c %Y "$PREF_FILE" 2>/dev/null || stat -f %m "$PREF_FILE" 2>/dev/null)
24
+ if [ -n "$MTIME" ] && [ $(( $(date +%s) - MTIME )) -lt 14400 ]; then
25
+ cat "$PREF_FILE"
26
+ else
27
+ rm -f "$PREF_FILE"
28
+ fi
29
+ fi
30
+ ```
31
+
32
+ 输出 `inline` 或 `subagent` → **跳过 Step 2**,直接 Step 3 按记忆走,输出指令前加一行 `📌 来自本会话偏好(4h 内不再问;rm .trellis/.route-prefs.tmp 可重置)`。
33
+
34
+ target=check **跳过本步**,每次都询问。
35
+
36
+ ## Step 1.7: 上下文判断与推荐(无偏好命中时强制执行)
37
+
38
+ Step 1.5 未命中偏好时,主 agent 在调用 `AskUserQuestion` **之前**必须基于当前任务上下文做一次判断,**自己**挑出最合适的选项并写 1-2 句中文推荐理由。**SKILL.md 不硬编码"哪个是推荐项"也不限定判断维度——主 agent 用自己的判断力。**
39
+
40
+ 将推荐选项编号 + 1-2 句中文理由作为 Step 2 `question` 字段的**首句**,例如:
41
+
42
+ - implement: "任务只改 1 个 vue 文件且 PRD 清晰,建议 #1 inline。本次 implement 走哪种模式?"
43
+ - check: "改动跨前后端 + DB 且即将提交,建议 #1 check-all inline。本次 check 走哪种模式?"
44
+
45
+ option label 里**不写"(推荐)"后缀**——推荐落点通过 question 文案体现,用户能看到判断依据并否决。
46
+
47
+ ## Step 2: 询问用户
48
+
49
+ 优先调用 `AskUserQuestion`。**选项 label 前缀 1/2/3/4,方便用户直接打数字快速选**。`question` 字段首句必须是 Step 1.7 输出的推荐理由(1-2 句中文),**不可省略**。
50
+
51
+ 如果当前平台或模式没有 `AskUserQuestion` / `request_user_input`,不要选择 inline 或 subagent 继续。改用普通聊天消息原样呈现同一组编号选项,并停止等待用户回复;用户回复数字后再进入 Step 2.5 / 2.6 / 3。禁止写"request_user_input 当前不可用,所以记录为 inline/subagent 路径并继续"。
52
+
53
+ ### target = implement(4 选项)
54
+
55
+ - **question**: "[Step 1.7 推荐理由 1-2 句] 本次 implement 走哪种模式?"
56
+ - **header**: "Impl 模式"
57
+ - **options**:
58
+ 1. label "1. Inline", description "本次主 agent 直接执行,更快,共享上下文"
59
+ 2. label "2. Subagent", description "本次 dispatch 子 agent,隔离独立思考"
60
+ 3. label "3. Inline 本会话", description "本次 + 4h 内所有 implement 都 inline,不再问"
61
+ 4. label "4. Subagent 本会话", description "本次 + 4h 内所有 implement 都 dispatch 子 agent,不再问"
62
+
63
+ ### target = check(4 选项)
64
+
65
+ - **question**: "[Step 1.7 推荐理由 1-2 句] 本次 check 走哪种模式?"
66
+ - **header**: "Check 模式"
67
+ - **options**:
68
+ 1. label "1. Check-all inline", description "全面检查(PRD 对照 + 5 维 + spec),主 agent 执行"
69
+ 2. label "2. Check-all subagent", description "全面检查,dispatch 子 agent"
70
+ 3. label "3. Check inline", description "轻量检查(lint/type/spec),主 agent 执行"
71
+ 4. label "4. Check subagent", description "轻量检查,dispatch 子 agent"
72
+
73
+ ## Step 2.5: 读 subagent_skip_compile(仅 implement + subagent 时)
74
+
75
+ ```bash
76
+ if [ -f .trellis/config.yaml ]; then
77
+ grep -E "^\s*subagent_skip_compile:\s*true\b" .trellis/config.yaml > /dev/null && echo true || echo false
78
+ fi
79
+ ```
80
+
81
+ 为 `true` 时,Step 3 的 implement subagent 指令会附加"跳过编译"prompt 段。其他路径不读此配置。
82
+
83
+ ## Step 2.6: 持久化偏好(仅 implement 选项 3/4 时)
84
+
85
+ ```bash
86
+ mkdir -p .trellis
87
+ # 选项 3 (Inline 本会话)
88
+ echo "inline" > .trellis/.route-prefs.tmp
89
+
90
+ # 选项 4 (Subagent 本会话)
91
+ echo "subagent" > .trellis/.route-prefs.tmp
92
+ ```
93
+
94
+ 文件名 `.tmp` 后缀被 trellis `.gitignore` 默认 `*.tmp` 规则自动忽略,无需额外配置。选项 1/2 不写文件。
95
+
96
+ ## Step 3: 输出执行指令
97
+
98
+ 本 skill 不调用 Skill / Agent 工具,而是输出指令让主 agent 在下一轮执行。
99
+
100
+ ### 路由表
101
+
102
+ | 用户选择 | 主 agent 应执行 |
103
+ |---------|----------------|
104
+ | **inline implement**(选项 1 或 3,或来自偏好) | `Skill({skill: "trellis-before-dev"})` 加载 spec → 读 prd.md → 主线程实施 → 跑 lint/type-check |
105
+ | **subagent implement**(选项 2 或 4,或来自偏好) | `Agent({subagent_type: "trellis-implement"})`;若 `subagent_skip_compile=true`,dispatch prompt 附加"跳过 mvn install / npm run build / tsc 等耗时编译类检查(已由主 agent 验证或最终统一执行)" |
106
+ | **inline check**(选项 3) | `Skill({skill: "trellis-check"})` |
107
+ | **inline check-all**(选项 1) | `Skill({skill: "trellis-check-all"})` |
108
+ | **subagent check**(选项 4) | `Agent({subagent_type: "trellis-check"})` |
109
+ | **subagent check-all**(选项 2) | 优先 `Agent({subagent_type: "trellis-check-all"})`;不存在时 fallback `Agent({subagent_type: "trellis-check"})` + dispatch prompt 含 trellis-check-all 全流程要求(PRD 对照 → 5 维断言 → 跨层 → 委托 trellis-check 收尾) |
110
+
111
+ ### 输出模板
112
+
113
+ ```markdown
114
+ 路由决定:<inline/subagent> <implement | check | check-all>
115
+ [📌 来自本会话偏好(4h 内不再问;rm .trellis/.route-prefs.tmp 可重置)]
116
+
117
+ 接下来主 agent 应当:
118
+ - <路由表里对应的工具调用形式>
119
+ - [若 implement subagent 且 subagent_skip_compile=true:附加"跳过编译"prompt 段]
120
+
121
+ 不要:
122
+ - <要避免的工具调用>
123
+ ```
124
+
125
+ 中括号内行为条件性出现:仅命中本会话偏好时显示第二行;仅 implement subagent + skip_compile=true 时附加"跳过编译"段。
126
+
127
+ ---
128
+
129
+ ## 核心原则
130
+
131
+ 1. **决策与执行分离**:本 skill 只输出指令,下一轮由主 agent 调工具
132
+ 2. **严格执行用户选择**:路由结论一旦输出,主 agent 必须按指令执行,不可"出于谨慎"再换路径
133
+ 3. **无偏好命中必问,无自动 fallback**:Step 1.5 未命中偏好时,Step 2 询问是强制步骤;缺工具/权限时必须退化为普通聊天询问并等待用户回复,**不是**绕过询问或自行选择路径的合法理由
134
+ 4. **推荐由主 agent 上下文判断生成**(Step 1.7),不在 SKILL.md 里硬编码"哪个是推荐项"——避免静态偏好和当下任务实际不匹配
135
+ 5. **本会话偏好仅 implement 适用**:check 每次询问(避免累积偏好导致提交前漏跑 check-all)
136
+ 6. **config 联动仅 implement subagent 路径**:`subagent_skip_compile` 仅在 target=implement + 选 subagent 时读取并注入 prompt
137
+
138
+ ---
139
+
140
+ ## 反模式
141
+
142
+ - ❌ 本 skill 内部直接调用 `Agent` / `Skill` 工具(违反"决策与执行分离")
143
+ - ❌ 自行编造"工具/权限/平台不支持子代理"等理由跳过 Step 2 询问(**无偏好命中时必须询问用户**;交互工具不可用时用普通聊天询问并等待,不能绕过路由)
144
+ - ❌ `AskUserQuestion` / `request_user_input` 不可用时,记录为 inline 或 subagent 路径并继续
145
+ - ❌ Step 1.7 推荐理由空着、随便写一句敷衍、或不放进 question 文案(推荐必须基于当前任务的具体上下文,给用户可判断依据)
146
+ - ❌ check 端默认降级到轻量 trellis-check,特别是 pre-commit Phase 3.1(除非 Step 1.7 已显式说明"改动仅 lint/重命名级别"才走 check)
147
+ - ❌ check-all 选项被错误降级为普通 trellis-check(必须优先 trellis-check-all skill / subagent)
148
+ - ❌ 给 check 任何模式附加"跳过编译"指令(check 的核心职责就是跑编译/typecheck)
149
+ - ❌ 询问后忽视用户答案默认 subagent
150
+ - ❌ check 端读 `.route-prefs.tmp`(仅 implement 适用本会话偏好)
151
+ - ❌ implement 偏好命中后还询问用户(违反"4h 内不再问"承诺)
152
+
153
+ ---
154
+
155
+ ## 边界
156
+
157
+ - **非 trellis 项目**(无 `.trellis/`):输出"非 trellis 项目,跳过路由",不阻断流程
158
+ - **config.yaml 缺失或字段缺失**:视为 false,不附加跳过编译指令
159
+ - **.route-prefs.tmp 内容损坏**(非 inline/subagent):忽略偏好,删除文件,正常询问