@gavin-hjw/sddflow 0.3.2

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.
@@ -0,0 +1,136 @@
1
+ ---
2
+ name: sddflow/amend
3
+ description: Revise active OpenSpec requirements during build, regenerate plan-ready.md, and append implementation tasks without archiving the change
4
+ ---
5
+
6
+ # Amend: 需求变更修订
7
+
8
+ ## 目标
9
+
10
+ 在 active change 已经进入 spec/build 后,发现需求遗漏或规格需要改变时,受控修改 OpenSpec 文档和执行计划,然后回到 `/sddflow build` 继续实现。
11
+
12
+ ## 适用场景
13
+
14
+ - build 过程中发现原需求漏了一个功能、边界或验收条件
15
+ - 用户明确说“修改需求”“补充 spec”“重新生成规格”“需求变更”
16
+ - close 前发现规格本身不完整,而不是代码没有按现有规格实现
17
+
18
+ 不适用:
19
+ - 只是代码没有实现现有 spec → 继续 `/sddflow build`
20
+ - 变更已经 close/archive → 开新的 `/sddflow proposal` 或 `/sddflow brainstorming`
21
+ - 只是文案、注释或实现细节调整,且不改变行为 → 继续当前实现阶段
22
+
23
+ ## 前置条件
24
+
25
+ - `openspec/changes/<变更名>/` 下存在 active change
26
+ - 至少存在 `proposal.md`
27
+ - 通常应已存在 `plan-ready.md`;如果没有,优先回到 `/sddflow spec`
28
+
29
+ 如果没有 active change,提示:
30
+ > "还没有活跃变更。请先用 /sddflow proposal 或 /sddflow brainstorming 创建需求。"
31
+
32
+ 如果变更已归档,提示:
33
+ > "该变更已经归档。归档后的需求调整应开启新的 /sddflow proposal。"
34
+
35
+ ## 流程
36
+
37
+ ### 1. 确认当前变更
38
+
39
+ 检查 `openspec/changes/` 下的 active change。
40
+
41
+ 如果有多个,列出并让用户选择:
42
+ > "检测到多个活跃变更:[列表]。要修订哪个变更?"
43
+
44
+ 读取当前变更的文档:
45
+ - `proposal.md`
46
+ - `design.md`(如果存在)
47
+ - `specs/**/spec.md`
48
+ - `tasks.md`(如果存在)
49
+ - `plan-ready.md`(如果存在)
50
+ - `docs/superpowers/plans/` 下对应实现计划(如果存在)
51
+
52
+ ### 2. 判断是 amend 还是 build
53
+
54
+ 先判断用户描述属于哪类:
55
+
56
+ | 情况 | 处理 |
57
+ |------|------|
58
+ | 现有 spec 已覆盖,只是代码未完成 | 回到 `/sddflow build` |
59
+ | 新增/修改行为、验收条件、边界、非目标 | 继续 amend |
60
+ | 技术方案受影响 | 修改 `design.md` 并追加任务 |
61
+ | 不确定是否改变需求 | 问 1 个澄清问题 |
62
+
63
+ ### 3. 修改 OpenSpec 文档
64
+
65
+ 按影响范围更新:
66
+
67
+ - `proposal.md`:追加 `## Amendments`,记录本次需求变更的日期、原因和摘要
68
+ - `design.md`:仅当技术方案或约束变化时修改
69
+ - `specs/<capability>/spec.md`:使用 `ADDED`、`MODIFIED`、`REMOVED` 或 `RENAMED Requirements` 表达 delta
70
+ - `tasks.md`:追加新任务;不要重写或删除已完成任务
71
+
72
+ 要求:
73
+ - 每个新增或修改的 requirement 必须至少有一个 `#### Scenario:`
74
+ - `MODIFIED Requirements` 必须包含完整的新 requirement 文本,不只写差异片段
75
+ - 已完成任务保留原 checkbox 状态
76
+
77
+ ### 4. 校验 OpenSpec
78
+
79
+ 如果 OpenSpec CLI 可用,运行:
80
+
81
+ ```bash
82
+ openspec validate <变更名> --strict
83
+ ```
84
+
85
+ 校验失败时,修正文档后重新校验。
86
+
87
+ ### 5. 重新生成 plan-ready.md
88
+
89
+ 根据修订后的 OpenSpec 文档更新 `plan-ready.md`。
90
+
91
+ 规则:
92
+ - 保留原 `## 来源`
93
+ - 追加 `## Amendments`,记录本次修订来源和影响
94
+ - 保留已完成实现步骤的历史上下文
95
+ - 追加新的实现步骤,按执行依赖排序
96
+ - 不删除已经完成或正在执行的步骤,除非用户明确要求废弃并说明迁移方式
97
+
98
+ 建议追加格式:
99
+
100
+ ```markdown
101
+ ## Amendments
102
+
103
+ ### YYYY-MM-DD: <简短标题>
104
+ - 原因:<为什么需要改>
105
+ - 影响规格:<spec 路径>
106
+ - 影响任务:<tasks.md 条目>
107
+
108
+ ## 追加实现步骤
109
+
110
+ ### Task N: <任务名>
111
+ - 目标:<做什么>
112
+ - 改动文件:<哪些文件>
113
+ - 验证方式:<怎么验证>
114
+ ```
115
+
116
+ ### 6. 同步详细实现计划
117
+
118
+ 如果 `docs/superpowers/plans/YYYY-MM-DD-<变更名>.md` 已存在:
119
+ - 已勾选任务不动
120
+ - 未完成任务可按新需求调整
121
+ - 追加新 task,保留 checkbox
122
+ - 记录本次 amend 来源路径
123
+
124
+ 如果详细实现计划还不存在:
125
+ - 不创建代码实现计划,提示下一步用 `/sddflow build`
126
+
127
+ ### 7. 提示下一步
128
+
129
+ > "需求变更已写入 OpenSpec,plan-ready.md 已更新。接下来继续 `/sddflow build`。"
130
+
131
+ ## 关键原则
132
+
133
+ - amend 阶段只允许修改规格、任务、plan-ready.md 和实现计划文档,不直接修改代码
134
+ - amend 是 close/archive 前的受控需求变更入口,不用于修代码
135
+ - 不把 build 中的自然语言补充直接当作实现指令;只要改变需求或验收条件,先 amend
136
+ - 已归档变更不可 amend,必须开启新 change
@@ -0,0 +1,72 @@
1
+ ---
2
+ name: sddflow/brainstorming
3
+ description: Deep design — multi-round exploration to confirm architecture and approach
4
+ ---
5
+
6
+ # Brainstorming: 深度设计
7
+
8
+ ## 目标
9
+
10
+ 通过多轮对话,深入探索需求、方案取舍和架构决策。产出比 proposal 更完整的需求描述和设计方向。
11
+
12
+ ## 中断续接规则
13
+
14
+ 如果用户在本阶段被打断后继续回复、补充范围、回答确认问题、或修正边界,仍然停留在 brainstorming 阶段。继续收敛设计并更新 `openspec/changes/**/proposal.md`,不要因为用户明确了范围就直接进入实现或修改任何代码。
15
+
16
+ 典型错误:在确认“只改企业端?”后,用户回复“运营端也要做回显”,这只是范围修正,必须继续记录需求和方案,不得直接修改任何代码或实现文件。
17
+
18
+ ## 流程
19
+
20
+ ### 1. 理解背景
21
+
22
+ 先快速检查项目上下文:
23
+ - 最近的相关 git 提交
24
+ - 现有代码结构
25
+ - 相关文档
26
+
27
+ ### 2. 逐个提问
28
+
29
+ 一次只问一个问题,逐步深入。问题类型:
30
+
31
+ - **目的** — "这个功能的核心用户场景是什么?"
32
+ - **取舍** — "A 方案更简单但扩展性差,B 方案更灵活但复杂。你倾向哪个?"
33
+ - **边界** — "如果 X 情况发生,期望的行为是什么?"
34
+ - **优先级** — "这几个需求里,哪个最重要?"
35
+
36
+ ### 3. 提出 2-3 种方案
37
+
38
+ 基于讨论,提出 2-3 种实现方案,附上取舍分析。推荐一种并说明理由。
39
+
40
+ ### 4. 确认设计
41
+
42
+ 用户选定方案后,整理设计要点并与用户确认:
43
+
44
+ > "确认的设计方向:[方案名]。核心决策:[2-3 条]。这样对吗?"
45
+
46
+ ### 5. 创建 OpenSpec 变更目录
47
+
48
+ 用户确认后,按 OpenSpec 目录约定创建变更。`<变更名>` 使用 kebab-case、动词开头(如 `add-user-login`):
49
+
50
+ ```bash
51
+ mkdir -p openspec/changes/<变更名>/specs
52
+ ```
53
+
54
+ 将确认的需求描述和设计方向写入 `openspec/changes/<变更名>/proposal.md`。
55
+
56
+ 如果 OpenSpec CLI 可用,可用以下命令检查当前变更列表:
57
+
58
+ ```bash
59
+ openspec list
60
+ ```
61
+
62
+ ### 6. 提示下一步
63
+
64
+ > "需求已记录。接下来可以用 `/sddflow spec` 生成完整规格。"
65
+
66
+ ## 注意
67
+
68
+ - 不要写代码
69
+ - 本阶段只允许写 OpenSpec 需求/设计方向文档,禁止修改任何代码或实现文件
70
+ - 不要跳过取舍讨论直接给答案
71
+ - 如果项目很大,建议先拆分成独立的子项目
72
+ - 允许用户改变方向,不要过早锁定
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: sddflow/build
3
+ description: Call Superpowers to execute implementation, supports checkpoint recovery
4
+ ---
5
+
6
+ # Build: Superpowers 执行
7
+
8
+ ## 目标
9
+
10
+ 读取 plan-ready.md,调用 Superpowers 的 writing-plans 生成详细实现计划,然后按 TDD 铁律执行。
11
+
12
+ ## 中断续接规则
13
+
14
+ 如果用户在 build 阶段被打断后继续回复、说“继续”、或补充实现细节,保持 build 阶段并从实现计划/checkbox 状态恢复。不要回到 proposal、brainstorming 或 spec。
15
+
16
+ 如果用户明确要求修改需求、补充 spec、改变验收条件、改变功能边界或重新生成规格,停止实现并切到 `/sddflow amend`。amend 完成后再回到 `/sddflow build`。
17
+
18
+ ## 前置条件
19
+
20
+ - `openspec/changes/<变更名>/plan-ready.md` 存在
21
+
22
+ 如果不满足,提示:
23
+ > "还没生成 plan-ready.md。请先完成 /sddflow spec。"
24
+
25
+ ## 流程
26
+
27
+ ### 1. 检测状态
28
+
29
+ 检查以下文件确定当前状态:
30
+
31
+ | 检查 | 怎么查 | 结果 |
32
+ |------|--------|------|
33
+ | 有活跃变更? | `openspec/changes/` 下非 archive 子目录 | 找到变更名 |
34
+ | 有 plan-ready.md? | 变更目录下是否存在 | 不存在→提示先 spec |
35
+ | 实现已开始? | `docs/superpowers/plans/` 下是否有对应计划文件 | 已开始→断点恢复 |
36
+
37
+ 如果有多个活跃变更,列出并让用户选择。
38
+
39
+ ### 2. 断点恢复(如适用)
40
+
41
+ 如果检测到已有计划文件,检查其中 checkbox 状态:
42
+
43
+ - 全部勾选 → 提示实现已完成,建议 /sddflow close
44
+ - 部分勾选 → 从未完成的 task 继续执行
45
+ - 无勾选 → 从头开始
46
+
47
+ ### 3. 生成详细实现计划
48
+
49
+ 调用 Superpowers 的 `writing-plans` skill,以 `plan-ready.md` 为输入,生成符合 Superpowers 格式的详细实现计划。
50
+
51
+ 每个步骤:
52
+ - 2-5 分钟工作量
53
+ - 包含代码、文件路径、验证命令
54
+ - 使用 checkbox 语法 `- [ ]` 跟踪
55
+
56
+ 将实现计划保存到:
57
+ ```
58
+ docs/superpowers/plans/YYYY-MM-DD-<变更名>.md
59
+ ```
60
+
61
+ ### 4. 执行实现
62
+
63
+ 按照 Superpowers 的执行流程:
64
+
65
+ 1. **TDD 铁律**:先写失败测试,再写实现代码
66
+ 2. **每个 task 一个 commit**
67
+ 3. 多任务可派子代理并行(参见 subagent-driven-development skill)
68
+ 4. 编译/测试不通过不让提交
69
+
70
+ ### 5. 执行完成
71
+
72
+ 所有 task 完成后,提示用户:
73
+
74
+ > "所有实现任务已完成。接下来可以用 /sddflow close 验证一致性并归档。"
75
+
76
+ ## 关键原则
77
+
78
+ - **不允许在 build 阶段修改规格文档** — 发现需求遗漏或规格错误时切到 `/sddflow amend`
79
+ - build 是唯一默认允许修改代码或实现文件的阶段;如果上一阶段不是 build,不要因为用户确认范围而自动写代码
80
+ - plan-ready.md 是锁定的设计决策,Superpowers 按计划展开执行,不重新理解需求
81
+ - 断点恢复依赖文件系统状态,不依赖 AI 的会话记忆
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: sddflow/close
3
+ description: Verify implementation consistency and archive
4
+ ---
5
+
6
+ # Close: 验证归档
7
+
8
+ ## 目标
9
+
10
+ 验证代码实现与设计文档一致,确认规格变更全部体现,然后归档。
11
+
12
+ ## 中断续接规则
13
+
14
+ 如果用户在 close 阶段被打断后继续回复、说“继续”、或要求完成归档,保持 close 阶段并继续验证/归档。close 阶段不允许顺手修代码;发现差异只记录到 `close-issues.md`。
15
+
16
+ ## 前置条件
17
+
18
+ - `docs/superpowers/plans/` 下的实现计划全部 checkbox 已勾选
19
+ - `openspec/changes/<变更名>/plan-ready.md` 存在
20
+
21
+ ## 流程
22
+
23
+ ### 1. 确认实现状态
24
+
25
+ 检查 `docs/superpowers/plans/` 下对应的计划文件,确认所有 checkbox 已勾选。
26
+
27
+ 如果有未完成的 task:
28
+ > "还有 N 个任务未完成。请先用 /sddflow build 完成实现。"
29
+
30
+ ### 2. 验证设计一致性
31
+
32
+ 读取 `openspec/changes/<变更名>/design.md`,逐项检查代码实现:
33
+
34
+ - design.md 中的技术决策是否在代码中体现?
35
+ - 标记的架构选择是否与代码结构一致?
36
+
37
+ 对每一项,给出判定:✅ 一致 / ❌ 不一致(附具体差异)
38
+
39
+ ### 3. 验证规格完整性
40
+
41
+ 读取 `openspec/changes/<变更名>/specs/` 目录,检查每个规格变更:
42
+
43
+ - 标记为"新增"的功能是否已实现?
44
+ - 标记为"修改"的行为是否已更新?
45
+ - 标记为"删除"的旧逻辑是否已移除?
46
+
47
+ 对每一项,给出判定:✅ 已体现 / ❌ 未体现(附具体缺失)
48
+
49
+ ### 4. 处理不一致
50
+
51
+ 如果发现不一致:
52
+ - **不在 close 阶段改代码**
53
+ - 将不一致项记录到 `openspec/changes/<变更名>/close-issues.md`
54
+ - 提示用户:
55
+ > "发现 N 处不一致,已记录到 close-issues.md。是否需要开启新的变更来修复?"
56
+
57
+ ### 5. 归档
58
+
59
+ 全部一致(或用户接受不一致项)后,先校验变更:
60
+
61
+ ```bash
62
+ openspec validate <变更名> --strict
63
+ ```
64
+
65
+ 校验通过后执行归档:
66
+
67
+ ```bash
68
+ openspec archive <变更名> --yes
69
+ ```
70
+
71
+ 如果 OpenSpec CLI 不可用,手动归档:
72
+
73
+ ```bash
74
+ mkdir -p openspec/changes/archive
75
+ mv openspec/changes/<变更名> openspec/changes/archive/$(date +%Y-%m-%d)-<变更名>/
76
+ ```
77
+
78
+ 归档后确认:
79
+ - 规格增量已合并到主规格库(如适用)
80
+ - 变更记录已移到 archive 目录
81
+
82
+ ### 6. 完成提示
83
+
84
+ > "变更 '<变更名>' 已验证并归档。可以开始下一个变更了。"
85
+
86
+ ## 关键原则
87
+
88
+ - close 阶段不做代码修改,只做验证和归档
89
+ - 本阶段只允许写归档、验证记录或 `close-issues.md`;禁止修改任何代码或实现文件
90
+ - 不一致先记录,不现场修复
91
+ - 防止边写代码边改需求的恶性循环
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: sddflow/proposal
3
+ description: Lightweight requirement capture — 3-5 questions to quickly converge on requirements
4
+ ---
5
+
6
+ # Proposal: 轻量需求捕获
7
+
8
+ ## 目标
9
+
10
+ 用最少的提问,把用户脑子里的需求变成可执行的变更描述。不做深度设计,不生成代码。
11
+
12
+ ## 中断续接规则
13
+
14
+ 如果用户在本阶段被打断后继续回复、补充范围、回答确认问题、或修正边界,仍然停留在 proposal 阶段。继续更新 `openspec/changes/**/proposal.md`,不要因为用户说“就这样做”“继续”“范围改成 X”而写任何代码或实现文件。
15
+
16
+ 典型错误:proposal 阶段确认“只改企业端?”后,用户回复“运营端也要做回显”。这只是需求范围补充,必须继续更新 proposal,不得直接修改任何代码或实现文件。
17
+
18
+ ## 流程
19
+
20
+ ### 1. 提出关键问题
21
+
22
+ 一次性提出以下 3-5 个核心问题(根据上下文调整措辞):
23
+
24
+ 1. **做什么** — 你想实现什么功能/变更?
25
+ 2. **为什么** — 解决什么问题?给谁用的?
26
+ 3. **成功标准** — 怎样算做完了?验收条件是什么?
27
+ 4. **边界** — 什么不在范围内?
28
+ 5. **现有约束** — 有没有技术栈、兼容性、时间上的限制?
29
+
30
+ ### 2. 确认需求
31
+
32
+ 用户回答后,整理成一段简洁的需求描述,与用户确认:
33
+
34
+ > "我理解的需求是:[一句话概括]。具体来说:[2-3 条要点]。这样理解对吗?"
35
+
36
+ ### 3. 创建 OpenSpec 变更目录
37
+
38
+ 用户确认后,按 OpenSpec 目录约定创建变更。`<变更名>` 使用 kebab-case、动词开头(如 `add-user-login`):
39
+
40
+ ```bash
41
+ mkdir -p openspec/changes/<变更名>/specs
42
+ ```
43
+
44
+ 将确认的需求描述写入 `openspec/changes/<变更名>/proposal.md`。
45
+
46
+ 如果 OpenSpec CLI 可用,可用以下命令检查当前变更列表:
47
+
48
+ ```bash
49
+ openspec list
50
+ ```
51
+
52
+ ### 4. 提示下一步
53
+
54
+ > "需求已记录。接下来可以用 `/sddflow spec` 生成完整规格,或继续补充细节。"
55
+
56
+ ## 注意
57
+
58
+ - 不要做技术设计,那是 spec 和 brainstorming 的事
59
+ - 不要写代码
60
+ - 本阶段只允许写 OpenSpec 需求文档,禁止修改任何代码或实现文件
61
+ - 问题要具体,不要泛泛而谈
62
+ - 如果用户的需求很大(跨多个独立子系统),建议拆分
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: sddflow/spec
3
+ description: Call OpenSpec to generate specs, auto-translate to plan-ready.md after user confirmation
4
+ ---
5
+
6
+ # Spec: 生成规格并翻译
7
+
8
+ ## 目标
9
+
10
+ 调用 OpenSpec 生成完整的规格文档(proposal.md, design.md, specs/, tasks.md),用户确认后自动翻译成 Superpowers 可执行的 plan-ready.md。
11
+
12
+ ## 中断续接规则
13
+
14
+ 如果用户在本阶段被打断后继续回复、补充范围、要求调整规格、或确认规格摘要,仍然停留在 spec 阶段。只更新 `openspec/changes/**` 与 `plan-ready.md`,不要修改任何代码或实现文件。
15
+
16
+ ## 前置条件
17
+
18
+ - `openspec/changes/` 下存在活跃变更目录(由 proposal 或 brainstorming 阶段创建)
19
+ - 变更目录下至少有 `proposal.md`
20
+
21
+ ## 流程
22
+
23
+ ### 1. 确认活跃变更
24
+
25
+ 检查 `openspec/changes/` 下是否有活跃变更(非 archive 子目录)。
26
+
27
+ 如果没有,提示用户:
28
+ > "还没有活跃变更。请先用 /sddflow proposal 或 /sddflow brainstorming 创建需求。"
29
+
30
+ 如果有多个,列出并让用户选择:
31
+ > "检测到多个活跃变更:[列表]。要对哪个生成规格?"
32
+
33
+ ### 2. 生成 OpenSpec 规格文件
34
+
35
+ 根据 proposal.md 的内容生成或补齐以下文件:
36
+
37
+ - `openspec/changes/<变更名>/proposal.md` — 已存在,可补充
38
+ - `openspec/changes/<变更名>/design.md` — 技术方案
39
+ - `openspec/changes/<变更名>/specs/` — 具体规格变更(标记新增/修改/删除)
40
+ - `openspec/changes/<变更名>/tasks.md` — 实现任务清单
41
+
42
+ 如果 OpenSpec CLI 可用,生成后运行校验:
43
+
44
+ ```bash
45
+ openspec validate <变更名> --strict
46
+ ```
47
+
48
+ 如果校验失败,根据错误修正上述文件后重新校验。
49
+
50
+ ### 3. 与用户确认规格
51
+
52
+ 展示规格摘要,逐项确认:
53
+
54
+ > "以下是规格摘要:
55
+ > - **提案**:[proposal.md 核心内容]
56
+ > - **设计**:[design.md 核心决策]
57
+ > - **任务**:[tasks.md 任务列表]
58
+ >
59
+ > 有需要调整的地方吗?"
60
+
61
+ 用户确认后才进入翻译步骤。
62
+
63
+ ### 4. 自动生成 plan-ready.md(翻译层)
64
+
65
+ 用户确认后,自动将 OpenSpec 四文件翻译为 Superpowers 可执行的格式。
66
+
67
+ **翻译规则:**
68
+ 1. 每个 OpenSpec Task 拆成 2-5 个细粒度步骤(对应 2-5 分钟工作量)
69
+ 2. 每个步骤必须指明改哪个文件
70
+ 3. 每个步骤必须有验证方式
71
+ 4. **按执行依赖排序,不是按功能模块排序**
72
+ 5. 记录来源路径,方便回溯
73
+
74
+ 读取以下文件作为翻译输入:
75
+ - `openspec/changes/<变更名>/proposal.md`
76
+ - `openspec/changes/<变更名>/design.md`
77
+ - `openspec/changes/<变更名>/specs/` 目录下所有文件
78
+ - `openspec/changes/<变更名>/tasks.md`
79
+
80
+ 生成 `openspec/changes/<变更名>/plan-ready.md`,格式如下:
81
+
82
+ ```markdown
83
+ # 实现计划:<变更名>
84
+
85
+ ## 来源
86
+ - 提案:openspec/changes/<变更名>/proposal.md
87
+ - 设计:openspec/changes/<变更名>/design.md
88
+ - 规格:openspec/changes/<变更名>/specs/
89
+ - 任务:openspec/changes/<变更名>/tasks.md
90
+
91
+ ## 实现步骤
92
+
93
+ ### Task 1: <任务名>
94
+ - 目标:<做什么>
95
+ - 改动文件:<哪些文件>
96
+ - 验证方式:<怎么验证>
97
+
98
+ ### Task 2: ...
99
+ ```
100
+
101
+ ### 5. 提示下一步
102
+
103
+ > "规格已确认,plan-ready.md 已生成。接下来可以用 `/sddflow build` 开始实现。"
104
+
105
+ ## 关键原则
106
+
107
+ - **一条代码都不许写** — spec 阶段只产出文档
108
+ - 本阶段只允许写 `openspec/changes/**` 与 `plan-ready.md`,禁止修改任何代码或实现文件
109
+ - 翻译必须在用户确认后自动生成,不需要用户手动触发
110
+ - plan-ready.md 的 ## 来源 部分必须写明路径,方便 Superpowers 执行时回溯
111
+ - 按执行依赖排序是翻译的关键步骤:先依赖后依赖方