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,150 @@
1
+ # Create PRD — 基于原始需求文档
2
+
3
+ 从原始需求文档中提取指定需求的完整内容,结构化为 `prd.md`。**所有内容必须有据可依,禁止自行发挥。**
4
+
5
+ ---
6
+
7
+ ## 核心原则
8
+
9
+ 1. **原文优先** — Requirements 和 AC 必须引用原始文档原文,不得改写语义
10
+ 2. **文案原封不动** — 原始文档中出现的用户可见文案(按钮文字、提示语、Toast、弹窗内容、表头、placeholder 等)必须**逐字引用**,禁止改写、缩略或意译。这些文案是用户直接看到的内容,一个字的差异都会导致前端实现偏差
11
+ 3. **标注出处** — 每条需求标注来源位置(文档行号、章节编号或页码)
12
+ 4. **禁止发挥** — 不得添加原始文档中没有的需求、验收标准或业务规则
13
+ 5. **完整提取** — 该需求单元下的所有内容全部提取,不跳不漏
14
+ 6. **散射追踪** — 检查同一功能点是否在文档其他位置也有提及,一并收录
15
+
16
+ ---
17
+
18
+ ## 输入
19
+
20
+ 用户需提供:
21
+ - **需要提取的需求**(编号、名称或功能描述均可)
22
+ - **原始需求文档路径**(如未指定,在 `doc/` 下查找)
23
+
24
+ ---
25
+
26
+ ## 执行步骤
27
+
28
+ ### Step 1: 理解文档结构
29
+
30
+ 读取原始需求文档,识别其组织方式:
31
+
32
+ - 需求的划分单元是什么?(REQ 编号 / 章节 / 功能模块 / 用户故事卡片 / 其他)
33
+ - 每个需求单元包含哪些子结构?(如:用户故事、业务规则、字段说明、验收标准)
34
+ - 有无编号体系?(如 BR-01、AC-01,或无编号纯文本)
35
+
36
+ > **不要假设文档有特定格式**,先读再判断。
37
+
38
+ ### Step 2: 定位并完整提取
39
+
40
+ 在文档中定位用户指定的需求,**完整读取**该需求下的所有内容,直到下一个同级需求开始。
41
+
42
+ 提取时注意:
43
+ - 保留原始的编号、层级、表格结构
44
+ - 不要跳过任何子节(即使看起来不重要)
45
+ - 记录提取的起止位置(行号或章节号)
46
+
47
+ ### Step 3: 散射追踪
48
+
49
+ 提取目标需求中涉及的**关键实体**(字段名、功能点、业务概念),在全文中搜索这些关键词,检查是否在其他需求单元中也有相关内容:
50
+
51
+ - 同一字段在不同页面/模块的展示、编辑、导出规则
52
+ - 同一业务规则在不同入口的复用
53
+ - 跨需求的依赖或约束
54
+
55
+ 将发现的关联记录到 PRD 的「关联需求」部分。
56
+
57
+ ### Step 4: 生成 PRD
58
+
59
+ 将提取的内容结构化为 `prd.md`,结构分两层:
60
+
61
+ **第一层:来源原文(忠实摘录)**
62
+
63
+ ```markdown
64
+ # <需求标识> <需求名称>
65
+
66
+ > 来源:<文档名>,<位置范围>
67
+
68
+ ## Goal
69
+ <直接引用原文中的目标/用户故事描述>
70
+
71
+ ## 来源需求原文
72
+ <按原始文档的子结构组织,使用 blockquote 引用原文>
73
+ <保留原始编号和层级>
74
+ ```
75
+
76
+ **第二层:结构化提炼(每条标注来源)**
77
+
78
+ ```markdown
79
+ ## Requirements
80
+ - <需求描述> — 来源:<原文位置>
81
+ - ...
82
+
83
+ ## Acceptance Criteria
84
+ - [ ] <原文中的验收标准> — 来源:<原文位置>
85
+ - ...
86
+
87
+ ## 关联需求(散射追踪)
88
+ | 需求单元 | 关联内容 | 位置 | 影响 |
89
+ |---------|---------|------|------|
90
+
91
+ ## Out of Scope
92
+ - <原始文档中明确排除的内容>
93
+
94
+ ## Technical Notes
95
+ - 原始文档路径、提取范围、提取时间
96
+ ```
97
+
98
+ > Requirements 中的每一条都必须指向原文中的具体位置。
99
+ > 如果原始文档没有显式的验收标准,从业务规则中提炼,但必须标注「提炼自:<原文位置>」。
100
+
101
+ ### Step 5: 创建 task.json
102
+
103
+ PRD 写入后,调用框架脚本创建 `task.json`,使任务目录完整可用:
104
+
105
+ ```bash
106
+ python3 .trellis/scripts/task.py create "<PRD标题>" \
107
+ --slug "<任务目录名去掉日期前缀>" \
108
+ --priority P2 \
109
+ --description "<Goal 的一句话摘要>"
110
+ ```
111
+
112
+ > **注意**:
113
+ > - 如果任务目录已由用户手动创建(已有 `prd.md`),脚本会检测到目录已存在并在其中写入 `task.json`
114
+ > - `--slug` 必须与任务目录名的 slug 部分一致,确保 `task.json` 落在正确目录
115
+ > - 根据需求性质设置 `--priority`:紧急修复 P0/P1,常规需求 P2,小改动 P3
116
+ > - 创建完成后,根据 PRD 中的分析补充 `task.json` 中的字段:
117
+ > - `dev_type`:`frontend` / `backend` / `fullstack`
118
+ > - `relatedFiles`:PRD Technical Notes 中识别的关键文件路径
119
+
120
+ ### Step 6: 自检
121
+
122
+ | 检查项 | 方法 |
123
+ |--------|------|
124
+ | 原文完整性 | 原始文档中该需求的所有子节是否都出现在「来源需求原文」中 |
125
+ | AC 可追溯 | 每条 AC 是否都标注了来源位置 |
126
+ | 无自行发挥 | Requirements 中是否有任何一条找不到原文依据 |
127
+ | 文案逐字一致 | PRD 中的 UI 文案(按钮、提示语、Toast、弹窗、表头、placeholder)是否与原始文档**完全一致**,无改写/缩略/意译 |
128
+ | 散射完整 | 至少对 2-3 个关键实体做过全文搜索 |
129
+
130
+ ---
131
+
132
+ ## 反模式
133
+
134
+ - ❌ 用自己的话改写需求(应引用原文)
135
+ - ❌ 需求条目没有标注来源位置
136
+ - ❌ 添加原始文档中不存在的业务规则或验收标准
137
+ - ❌ 跳过某些子节不提取(即使觉得不重要)
138
+ - ❌ 不做散射追踪
139
+ - ❌ 假设文档有特定格式(每份文档先读结构再处理)
140
+
141
+ ---
142
+
143
+ ## 与其他命令的关系
144
+
145
+ | 命令 | 职责 | 时机 |
146
+ |------|------|------|
147
+ | `/trellis:plan-version` | 版本级需求扫描 + 覆盖度确认 | 版本规划阶段 |
148
+ | `/trellis:create-prd` | 单个需求的 PRD + task.json 生成(本命令) | 任务开发前 |
149
+ | `/trellis:check-prd` | 校验已有 PRD 的准确性 + 覆盖度 | PRD 生成后 |
150
+ | `/trellis:brainstorm` | 对话式需求发现(无原始文档时) | 需求模糊时 |
@@ -0,0 +1,144 @@
1
+ # PM 活动图梳理
2
+
3
+ 以**资深互联网产品经理 + 业务架构师**的身份,协助我用 **UML 活动图**厘清业务逻辑;信息不充分时**主动反问**,不得臆测。每次产出图后**必须渲染 PNG 并读图展示**,不要只扔代码。
4
+
5
+ ## 角色设定
6
+
7
+ - **身份**:资深互联网产品经理 & 业务架构师
8
+ - **职责**:把用户零散的想法 / 口头描述,结构化为清晰的业务流程
9
+ - **工具**:UML 活动图(Activity Diagram),必要时辅以泳道、判定节点、并行分支
10
+ - **原则**:需求不清先问,再画;**严禁虚构角色、系统或分支**
11
+
12
+ ## 交互步骤
13
+
14
+ ### 1. 接收输入
15
+ 读取用户提供的需求 / 场景描述(可能是一句话、一段聊天记录或一份粗略文档)。
16
+
17
+ ### 2. 澄清式反问(必要时)
18
+ 当下列任一要素缺失时,**先提问再动笔**:
19
+ - **主体角色**:谁发起?谁审批?谁执行?(用户 / 系统 / 第三方)
20
+ - **触发条件**:什么场景 / 事件进入此流程?
21
+ - **判定分支**:条件是什么?各分支的后续动作?
22
+ - **异常路径**:失败 / 超时 / 拒绝 如何处理?
23
+ - **终止状态**:流程成功 / 失败 各以什么状态结束?
24
+
25
+ 一次最多提 3~5 个最关键的问题,避免"问题轰炸"。
26
+
27
+ ### 3. 输出活动图(Mermaid 代码)
28
+
29
+ 使用 **Mermaid `flowchart` / `stateDiagram` 语法**(或 PlantUML `@startuml` 活动图语法),直接可渲染。
30
+
31
+ **Mermaid 示例**:
32
+ ````markdown
33
+ ```mermaid
34
+ flowchart TD
35
+ Start([开始]) --> A[用户提交申请]
36
+ A --> B{金额 > 1万?}
37
+ B -- 是 --> C[主管审批]
38
+ B -- 否 --> D[自动通过]
39
+ C --> E{审批通过?}
40
+ E -- 是 --> D
41
+ E -- 否 --> F[通知驳回]
42
+ D --> End([结束])
43
+ F --> End
44
+ ```
45
+ ````
46
+
47
+ ### 4. 渲染为 PNG(每次必做)
48
+
49
+ Mermaid 代码必须落盘并渲染为图片,否则用户可能看不到图。
50
+
51
+ **4.1 确定产物路径**
52
+
53
+ - 从流程名派生 `slug`(英文小写 + 连字符),例:`附件打包下载` → `attachment-zip-flow`
54
+ - 无法自动派生时,向用户确认 slug
55
+ - 输出目录:当前工作目录下 `doc/uml/`(不存在则 `mkdir -p`)
56
+ - 产物:`doc/uml/<slug>.mmd`(源码)+ `doc/uml/<slug>.png`(图)
57
+ - 同名已存在:直接覆盖(Mermaid 源码是真源,无需保留历史版本)
58
+
59
+ **4.2 写源码 + 在线渲染**
60
+
61
+ 用 `mermaid.ink` 渲染(零依赖、无需 key),标准 python3 即可:
62
+
63
+ ```bash
64
+ SLUG="<slug>"
65
+ mkdir -p doc/uml
66
+ cat > "doc/uml/${SLUG}.mmd" <<'EOF'
67
+ <把 Mermaid 源码粘到这里,结束行是独立的 EOF>
68
+ EOF
69
+
70
+ python3 - "$SLUG" <<'PY'
71
+ import base64, json, pathlib, sys, urllib.request
72
+ slug = sys.argv[1]
73
+ src = pathlib.Path(f'doc/uml/{slug}.mmd').read_text()
74
+ payload = {'code': src, 'mermaid': {'theme': 'default'}}
75
+ b64 = base64.urlsafe_b64encode(json.dumps(payload).encode('utf-8')).decode('ascii').rstrip('=')
76
+ url = f'https://mermaid.ink/img/{b64}?type=png&bgColor=FFFFFF'
77
+ req = urllib.request.Request(url, headers={'User-Agent': 'curl/8'})
78
+ with urllib.request.urlopen(req, timeout=30) as resp:
79
+ data = resp.read()
80
+ out = pathlib.Path(f'doc/uml/{slug}.png')
81
+ out.write_bytes(data)
82
+ print(f'saved: {out} ({len(data)} bytes)')
83
+ PY
84
+ ```
85
+
86
+ **4.3 读图展示**
87
+
88
+ 用 Read 工具读取 `doc/uml/<slug>.png`,让图片直接出现在对话里(Claude Code 多模态支持)。
89
+
90
+ **4.4 渲染失败降级**
91
+
92
+ 网络不通 / `mermaid.ink` 503 / Mermaid 语法报错时:
93
+ - 保留 `.mmd` 源码文件(已落盘)
94
+ - 明确告诉用户失败原因(HTTP 码或异常)
95
+ - 给两条本地兜底:
96
+ 1. `npx -p @mermaid-js/mermaid-cli mmdc -i doc/uml/<slug>.mmd -o doc/uml/<slug>.png`
97
+ 2. 贴到 <https://mermaid.live> 手动导出
98
+ - **不要假装成功**,也不要跳过这一步直接进入 Step 5
99
+
100
+ ### 5. 附随说明
101
+
102
+ 图下方补充:
103
+ - **产物路径**:`doc/uml/<slug>.png` + `doc/uml/<slug>.mmd`
104
+ - **角色清单**:列出图中涉及的所有角色 / 系统
105
+ - **关键判定**:每个菱形分支的业务含义
106
+ - **待确认项**:还存在哪些尚未澄清的点(如果有)
107
+
108
+ ### 6. 迭代优化
109
+
110
+ 用户反馈后,**只改动被指出的部分**,保持其余节点不变;大改前先口头确认修改范围。改完后**重新走 Step 4**(覆写 `.mmd` → 重新渲染 → 重新读图),保证图和代码同步。
111
+
112
+ ## 输出模板
113
+
114
+ ```markdown
115
+ ## 业务流程:<流程名>
116
+
117
+ ### 角色
118
+ - <角色 A>
119
+ - <系统 B>
120
+
121
+ ### 活动图
122
+ <Mermaid 代码块>
123
+
124
+ (此处应紧跟 Read 工具读出的 PNG 图像)
125
+
126
+ ### 产物
127
+ - 图:`doc/uml/<slug>.png`
128
+ - 源码:`doc/uml/<slug>.mmd`
129
+
130
+ ### 关键判定
131
+ - **<判定节点>**:<业务规则说明>
132
+
133
+ ### 待确认
134
+ - [ ] <悬而未决的问题>
135
+ ```
136
+
137
+ ## 禁止事项
138
+
139
+ - [X] 跳过澄清直接画图(除非需求已极其明确)
140
+ - [X] 虚构角色 / 系统 / 字段
141
+ - [X] 一次性把所有分支画出来却不标注业务含义
142
+ - [X] 用纯文字描述替代活动图(用户要的是"图")
143
+ - [X] 只贴 Mermaid 代码不渲染 PNG(除非 Step 4 明确失败并告知用户)
144
+ - [X] 渲染失败静默跳过,不告知用户
@@ -0,0 +1,136 @@
1
+ # 版本开发计划 — 从需求文档到任务拆分
2
+
3
+ 从原始需求文档出发,生成版本开发计划(需求清单 + 工时评估 + 人员分工),内置覆盖度校验确保不遗漏需求。
4
+
5
+ ---
6
+
7
+ ## 核心原则
8
+
9
+ 1. **需求文档是唯一真相** — 需求清单必须从文档全文提取,不能只看目录/总表
10
+ 2. **先扫后拆** — 先完成覆盖度扫描,确认无遗漏后再做工时评估和分工
11
+ 3. **可追溯** — 每个任务可追溯到原始文档的具体位置(行号/章节)
12
+
13
+ ---
14
+
15
+ ## 输入
16
+
17
+ 用户需提供:
18
+ - **原始需求文档路径**
19
+ - **版本号或迭代标识**
20
+ - **开发团队信息**(人数、角色分工模式)
21
+
22
+ ---
23
+
24
+ ## 执行步骤
25
+
26
+ ### Step 1: 理解文档结构 + 全文扫描
27
+
28
+ #### 1.0 先读后扫
29
+
30
+ 读取文档,识别其组织方式:
31
+ - 需求的划分单元是什么?(编号体系 / 章节 / 功能模块 / 用户故事)
32
+ - 有无需求总表或变更日志?
33
+ - 版本变更如何标记?(显式标记 / 总表版本列 / 变更日志章节 / 无标记)
34
+
35
+ > **不要假设文档有特定格式**,先读再判断。
36
+
37
+ #### 1.1 多策略识别本版本变更
38
+
39
+ 根据文档实际结构,组合使用以下策略:
40
+
41
+ | 策略 | 方法 |
42
+ |------|------|
43
+ | **标记扫描** | grep 搜索版本相关标记,**包括段落中间嵌入的** |
44
+ | **需求总表** | 读取需求列表中版本相关列,提取本版本的条目 |
45
+ | **全文通读** | 逐章扫描「新增」「变更」「调整」等动作词 |
46
+
47
+ #### 1.2 归组到需求单元
48
+
49
+ 每个变更点定位到所属的需求单元,记录:
50
+ - 需求单元标识(编号、名称或章节)
51
+ - 变更内容摘要
52
+ - 在文档中的位置
53
+ - 变更类型:整体新增 / 局部变更 / 字段级嵌入
54
+
55
+ > **[!] 关键:必须识别出「字段级嵌入变更」。**
56
+ > 有些需求单元整体是旧版本的,但内部某个字段/段落属于新版本变更。
57
+ > 仅看需求单元标题会遗漏这类变更。
58
+
59
+ #### 1.3 识别散射型变更
60
+
61
+ 检查是否有同一功能点散布在多个需求单元中:
62
+ - 同一字段在不同页面的展示/编辑/导出
63
+ - 同一业务规则在不同入口的复用
64
+ - 标记每组散射变更,确保后续分工时归同一人
65
+
66
+ ### Step 2: 输出需求清单 — 覆盖度确认
67
+
68
+ 输出完整的需求清单,请用户确认无遗漏:
69
+
70
+ ```markdown
71
+ ## <版本> 需求清单
72
+
73
+ ### 扫描统计
74
+ - 需求总表中本版本条目: X 个
75
+ - 全文扫描发现的变更: Y 个
76
+ - 去重后独立需求单元: Z 个
77
+
78
+ ### 需求列表
79
+
80
+ | # | 需求单元 | 功能点 | 变更类型 | 变更摘要 | 文档位置 |
81
+ |---|---------|--------|---------|---------|---------|
82
+
83
+ ### 散射型变更(同一功能点跨多个需求单元)
84
+
85
+ | 功能点 | 涉及的需求单元 | 建议处理 |
86
+ |--------|--------------|---------|
87
+
88
+ ### 需求总表 vs 全文扫描差异
89
+
90
+ | 来源 | 仅在总表 | 仅在全文 | 两者都有 |
91
+ |------|---------|---------|---------|
92
+
93
+ > 仅在全文中的变更 = 总表未收录的嵌入式变更,最易遗漏。
94
+ ```
95
+
96
+ **等待用户确认后再继续。**
97
+
98
+ ### Step 3: 工时评估
99
+
100
+ 基于确认后的需求清单,评估每个需求的工时。
101
+
102
+ 输出表格的列结构**根据项目实际的角色分工来定**(如前端/后端/全栈/测试等),不要预设。
103
+
104
+ 评估原则:
105
+ - 如有 AI 编程辅助,标注基准(AI 辅助 vs 纯人工)
106
+ - 复用关系明确标注
107
+ - 优先级以需求文档为准
108
+
109
+ ### Step 4: 人员分工
110
+
111
+ 按模块边界分工,遵循:
112
+ - 复用链归同一人
113
+ - 散射型变更归同一人
114
+ - 尽量无交集
115
+
116
+ 输出分工表和排期建议。
117
+
118
+ ### Step 5: 生成产物文件
119
+
120
+ 在 `doc/` 目录下生成:
121
+
122
+ ```
123
+ doc/
124
+ ├── <版本>-需求清单.md # Step 2 的完整输出(含覆盖度校验)
125
+ ├── <版本>-开发计划-工时评估.md # Step 3 + Step 4
126
+ ```
127
+
128
+ ---
129
+
130
+ ## 反模式
131
+
132
+ - ❌ 只从需求总表提取需求(会漏掉嵌入式变更)
133
+ - ❌ 跳过覆盖度确认直接做工时评估
134
+ - ❌ 散射型变更分给不同的人
135
+ - ❌ 假设文档有特定格式或特定的角色分工模式
136
+ - ❌ 当多个来源的优先级冲突时不明确说明以哪个为准
@@ -0,0 +1,187 @@
1
+ # Push — 提交并推送(可选合并到目标分支)
2
+
3
+ 一键完成 commit → push → 可选 merge 到目标分支(通常是测试线)→ push 目标分支 → 切回。
4
+
5
+ 支持多仓库(frontend / backend),merge 目标分支记录在 `.trellis/config.yaml` 的 `packages.<name>.merge_target` 中。
6
+
7
+ ---
8
+
9
+ ## 配置
10
+
11
+ 目标分支存储在 `.trellis/config.yaml` 的 packages 配置中:
12
+
13
+ ```yaml
14
+ packages:
15
+ frontend:
16
+ path: iqs-front-human
17
+ git: true
18
+ merge_target: test # 首次 push 时询问后自动写入
19
+ backend:
20
+ path: iqs
21
+ git: true
22
+ merge_target: test
23
+ ```
24
+
25
+ > 首次运行时如果 `merge_target` 不存在,会在 merge 步骤询问目标分支并回写到 `config.yaml`。
26
+ > 如需修改,直接编辑 `config.yaml` 或使用 `/trellis:push --reconfigure`。
27
+
28
+ ---
29
+
30
+ ## 执行步骤
31
+
32
+ ### Step 0: 读取配置
33
+
34
+ 读取 `.trellis/config.yaml` 中的 `packages` 配置,识别所有 `git: true` 的仓库及其 `merge_target`(如果已配置)。
35
+
36
+ ### Step 1: 检测变更
37
+
38
+ 读取 `.trellis/config.yaml` 中的 `packages` 配置,对每个 git 仓库检测变更:
39
+
40
+ ```bash
41
+ # 对每个 package
42
+ cd <package_path>
43
+ git status --short
44
+ ```
45
+
46
+ 列出有变更的仓库。如果所有仓库都没有变更,提示用户并终止。
47
+
48
+ 如果只有部分仓库有变更,只处理有变更的仓库。
49
+
50
+ ### Step 2: 逐仓库处理
51
+
52
+ 对每个有变更的仓库,依次执行以下操作:
53
+
54
+ #### 2.1 展示变更摘要
55
+
56
+ ```bash
57
+ cd <package_path>
58
+ git diff --stat
59
+ git diff --name-only
60
+ ```
61
+
62
+ #### 2.2 暂存文件
63
+
64
+ 展示要暂存的文件列表,**获得用户确认后**再暂存。
65
+
66
+ ```bash
67
+ git add <具体文件列表>
68
+ ```
69
+
70
+ > **[!] 禁止使用 `git add -A` 或 `git add .`**
71
+ > 必须明确列出文件,避免误提交敏感文件(.env、credentials 等)。
72
+
73
+ #### 2.3 生成 commit message 并提交
74
+
75
+ 分析变更内容,生成符合项目风格的 commit message:
76
+ - 读取最近 5 条 commit 参考风格
77
+ - 类型前缀:`feat` / `fix` / `chore` / `refactor` 等
78
+ - 简短描述变更内容
79
+ - 使用中文描述
80
+
81
+ ```bash
82
+ git commit -m "<type>(<scope>): <description>"
83
+ ```
84
+
85
+ #### 2.4 Push 当前分支
86
+
87
+ ```bash
88
+ git push origin <current_branch>
89
+ ```
90
+
91
+ 如果远程没有该分支,使用 `-u` 建立跟踪:
92
+
93
+ ```bash
94
+ git push -u origin <current_branch>
95
+ ```
96
+
97
+ #### 2.5 询问是否 Merge 到目标分支(可选)
98
+
99
+ Push 完成后,检查该 package 是否已配置 `merge_target`:
100
+
101
+ **已配置 `merge_target`**:
102
+
103
+ ```markdown
104
+ <package> 已推送到 <current_branch>。是否合并到 <merge_target>?
105
+
106
+ 1. 是,合并到 <merge_target>
107
+ 2. 否,跳过
108
+ ```
109
+
110
+ **未配置 `merge_target`(首次)**:
111
+
112
+ ```markdown
113
+ <package> 已推送到 <current_branch>。是否需要合并到其他分支(如测试线)?
114
+
115
+ 1. 是,请输入目标分支名
116
+ 2. 否,跳过
117
+ ```
118
+
119
+ 如果用户输入了目标分支名,**将其回写到 `.trellis/config.yaml`** 对应 package 的 `merge_target` 字段,下次自动使用。
120
+
121
+ **如果用户选择合并**:
122
+
123
+ ```bash
124
+ # 切换到目标分支并拉取最新
125
+ git checkout <target_branch>
126
+ git pull origin <target_branch>
127
+
128
+ # 合并当前开发分支
129
+ git merge <current_branch> --no-edit
130
+
131
+ # Push 目标分支
132
+ git push origin <target_branch>
133
+
134
+ # 切回开发分支
135
+ git checkout <current_branch>
136
+ ```
137
+
138
+ > **[!] 如果 merge 出现冲突:**
139
+ > 1. 立即停止,展示冲突文件列表
140
+ > 2. 询问用户:手动解决 / 中止 merge
141
+ > 3. **绝对不能** `git merge --abort` 后静默跳过
142
+
143
+ **如果用户选择跳过**:直接进入下一个仓库或输出结果。
144
+
145
+ ### Step 3: 输出结果
146
+
147
+ ```markdown
148
+ ## Push 结果
149
+
150
+ | 仓库 | 分支 | 目标 | commit | 状态 |
151
+ |------|------|------|--------|------|
152
+ | frontend | v1.3 | test | abc1234 feat(...): ... | ✅ 已合并 |
153
+ | backend | v1.3 | test | def5678 fix(...): ... | ⏭️ 跳过合并 |
154
+
155
+ 所有变更已推送到目标分支。
156
+ ```
157
+
158
+ ---
159
+
160
+ ## 参数
161
+
162
+ | 参数 | 说明 | 示例 |
163
+ |------|------|------|
164
+ | (无参数) | 自动检测所有有变更的仓库并处理 | `/trellis:push` |
165
+ | `--only <package>` | 只处理指定仓库 | `/trellis:push --only frontend` |
166
+ | `--reconfigure` | 重新配置目标分支 | `/trellis:push --reconfigure` |
167
+ | `--target <branch>` | 临时指定目标分支(不修改配置) | `/trellis:push --target hotfix` |
168
+
169
+ ---
170
+
171
+ ## 安全机制
172
+
173
+ 1. **暂存确认** — 每个仓库暂存前展示文件列表,用户确认
174
+ 2. **commit message 确认** — 展示生成的 message,用户可修改
175
+ 3. **merge 冲突处理** — 冲突时暂停,不静默跳过
176
+ 4. **不碰主分支** — 如果目标分支是 `master` / `main`,额外警告确认
177
+ 5. **不使用 force push** — 始终使用普通 push
178
+
179
+ ---
180
+
181
+ ## 反模式(避免)
182
+
183
+ - ❌ `git add -A`(可能误提交敏感文件)
184
+ - ❌ merge 冲突后静默 abort(用户需要知道)
185
+ - ❌ 未经确认直接 commit(必须让用户看到 message)
186
+ - ❌ force push 到目标分支
187
+ - ❌ 在目标分支上直接开发(只 merge,不在目标分支上改代码)