mirror of
https://github.com/jnMetaCode/superpowers-zh.git
synced 2026-09-02 22:54:06 +08:00
refactor(skills): fork 增量改为外挂式并强制声明,保证上游各节不被改动
按维护者决定:保留翻译 skill 内的 fork 增量,但必须做到「不影响上游部分」。 原来的做法做不到这一点 —— 增量是**插在上游步骤序列中间**的。 ## 问题 executing-plans 把「处理常见异常」插成了步骤 3,于是上游的 Step 3: Complete Development 被挤成了我们的「步骤 4」。这就不是「不影响上游」, 而是改了上游的结构编号;Remember 也被多加了一条,从上游的 6 条变成 7 条。 ## 改法:外挂式 - 「处理常见异常」移出步骤序列,改为独立小节,挂在「何时停下来求助」之后 (它本就是那一节里「缺少依赖、测试失败、指令不清」三种情形的展开) - 步骤编号恢复为 1/2/3,与上游逐条对应 - Remember 恢复为上游的 6 条;被多加的「每个任务单独提交」并入外挂节 - 节内首行显式标注:本节是 superpowers-zh 的增量内容,上游没有 using-superpowers 的「中国特色技能路由」同样加上该标注。 现在 14 个翻译 skill 里,上游各节全部逐节对应;多出的 2 节都带标注。 ## 让纪律可执行:audit 新增 3c-bis 光靠 README 声明会漂移。新增检查:翻译 skill 的标题数必须等于 「上游标题数 + 本文件里带标注的增量节数」。标注与内容同处一文件,不会各自漂移。 未标注就多出章节 = 隐性分叉,下次同步会被误当成漏译 —— 直接 FAIL。 已双向验证:给 brainstorming 偷偷加一节会被拦下并给出可操作提示, 加上标注后放行。 ## 修掉一个让守卫从未生效的 bug(我自己写的) 3c-bis 第一次测试没拦住。查出原因:`grep -c` 匹配到 0 个时输出 "0" 但 **退出码为 1**,写成 `$(grep -c ... || echo 0)` 会拼出 "0\n0",后续整数比较 直接报错、检查静默失效。改用 `; true` 只吞退出码。 全仓扫同一模式,发现测试辅助里也有 3 处(上游同样有这个 bug): - tests/claude-code/test-helpers.sh:77 assert_count 的实际值 - test-subagent-driven-development-integration.sh 的 task_count / todo_count 这个 bug 的后果是断言**永远无法正常失败** —— 模式没匹配到时比较报错而非判定失败。 三处一并修掉并加注释说明原因。(tests/ 不进 npm 包,仅开发使用。) 修复后 audit 由 154 升到 166 pass —— 因为 3c-bis 现在真的对 14 个 skill 都跑了。 ## README 简繁对比表新增一行「翻译 skill 内的增量」,写明仅 2 处、都带标注、 上游各节不被改动、audit 会强制未标注的增量报错。 验证:audit.sh 166 pass / 0 warn / 0 fail、verify-release.sh 90 pass / 0 fail
This commit is contained in:
@@ -118,6 +118,7 @@ AI:在开始实现之前,我需要了解几个关键问题:
|
||||
| 🇨🇳 中文文档规范 | 无 | 中文排版 + 中英混排规则 + 告别机翻味 |
|
||||
| ➕ MCP 服务器构建 | 无 | 独立 `mcp-builder` skill |
|
||||
| ➕ 工作流执行器 | 无 | 独立 `workflow-runner` skill(多角色 YAML 编排) |
|
||||
| ➕ 翻译 skill 内的增量 | — | 仅 2 处,均在正文显式标注「本节是 superpowers-zh 的增量内容」:`executing-plans` 的「常见异常处理」、`using-superpowers` 的「中国特色技能路由」。**上游各节均为逐节翻译,不被改动**;audit 会强制未标注的增量报错 |
|
||||
| 🔄 版本跟进 | 独立迭代 | **同步上游 + 国产增量叠加** |
|
||||
| 🤝 接受新 skill PR | 一般不接受(原文:*"we don't generally accept contributions of new skills"*) | 欢迎 PR(中国开发者痛点优先) |
|
||||
| 💬 社区 | Discord | 微信公众号「AI不止语」+ 微信群 + QQ 群 |
|
||||
|
||||
@@ -118,6 +118,7 @@ AI:在開始實作之前,我需要了解幾個關鍵問題:
|
||||
| 🇨🇳 中文文件規範 | 無 | 中文排版 + 中英混排規則 + 告別機翻味 |
|
||||
| ➕ MCP 伺服器建置 | 無 | 獨立 `mcp-builder` skill |
|
||||
| ➕ 工作流執行器 | 無 | 獨立 `workflow-runner` skill(多角色 YAML 編排) |
|
||||
| ➕ 翻譯 skill 內的增量 | — | 僅 2 處,均在正文顯式標註「本節是 superpowers-zh 的增量內容」:`executing-plans` 的「常見異常處理」、`using-superpowers` 的「中國特色技能路由」。**上游各節均為逐節翻譯,不被改動**;audit 會強制未標註的增量報錯 |
|
||||
| 🔄 版本跟進 | 獨立迭代 | **同步上游 + 國產增量疊加** |
|
||||
| 🤝 接受新 skill PR | 一般不接受(原文:*"we don't generally accept contributions of new skills"*) | 歡迎 PR(中國開發者痛點優先) |
|
||||
| 💬 社群 | Discord | 微信公眾號「AI不止語」+ 微信群 + QQ 群 |
|
||||
|
||||
@@ -180,6 +180,28 @@ else
|
||||
fi
|
||||
done
|
||||
|
||||
# 3c-bis. fork 增量必须显式声明
|
||||
#
|
||||
# 翻译 skill 的标题数应等于「上游标题数 + 本文件里声明的 fork 增量节数」。
|
||||
# 增量节靠正文里的一行标记声明(见下方 FORK_MARK),标记与内容同处一文件,
|
||||
# 不会各自漂移。没打标记就多出章节 = 隐性分叉,下次同步时会被误当成漏译。
|
||||
FORK_MARK='本节是 superpowers-zh 的增量内容'
|
||||
for s in "${SKILLS[@]}"; do
|
||||
up=$(git show upstream/main:skills/$s/SKILL.md 2>/dev/null | count_headings || echo 0)
|
||||
our=$(count_headings < "skills/$s/SKILL.md" 2>/dev/null || echo 0)
|
||||
# 注意:grep -c 找到 0 个时输出 "0" 但退出码为 1,写成 `|| echo 0` 会拼出
|
||||
# "0\n0",后续整数比较直接报错、检查静默失效。用 `; true` 只吞退出码。
|
||||
declared=$(grep -c "$FORK_MARK" "skills/$s/SKILL.md" 2>/dev/null; true)
|
||||
declared=${declared:-0}
|
||||
delta=$((our - up))
|
||||
if [ "$delta" = "$declared" ]; then
|
||||
ok
|
||||
elif [ "$delta" -gt "$declared" ]; then
|
||||
bad "未声明的 fork 增量: ${s} 比上游多 ${delta} 节,但只声明了 ${declared} 节 —— 给增量节加上「${FORK_MARK}」标记,或回归上游"
|
||||
fi
|
||||
# delta < declared 由 3c 的漂移检查覆盖,此处不重复报
|
||||
done
|
||||
|
||||
# 3d. requesting-code-review/code-reviewer.md 结构(v5.1.0 self-contained)
|
||||
up=$(git show upstream/main:skills/requesting-code-review/code-reviewer.md 2>/dev/null | count_headings || echo 0)
|
||||
our=$(count_headings < skills/requesting-code-review/code-reviewer.md)
|
||||
|
||||
@@ -90,29 +90,7 @@ $ git commit -m "feat: 添加用户输入验证(任务 2/5)"
|
||||
- 执行过程中持续留意:整体方向还对吗?有没有偏离计划?
|
||||
- 如果发现前面的实现有问题,先修复再继续,不要带着问题往下走
|
||||
|
||||
### 步骤 3:处理常见异常
|
||||
|
||||
**测试失败:**
|
||||
1. 读错误信息,定位失败原因
|
||||
2. 区分:是实现 bug?还是测试本身有问题?还是计划描述有误?
|
||||
3. 实现 bug → 修复并重跑
|
||||
4. 测试有问题 → 修复测试,向伙伴说明
|
||||
5. 计划有误 → 停下来,向伙伴报告并建议修正
|
||||
|
||||
**依赖缺失:**
|
||||
```
|
||||
任务 3 需要 Redis 连接,但计划中没有提及 Redis 配置。
|
||||
→ 停止执行
|
||||
→ 向伙伴报告:"任务 3 需要 Redis,计划中未包含配置步骤。
|
||||
建议:在任务 3 前插入 '配置 Redis 连接' 步骤。"
|
||||
```
|
||||
|
||||
**指令不清:**
|
||||
- 不要猜测意图,不要"合理推断"
|
||||
- 列出你的理解和困惑,让伙伴澄清
|
||||
- 等待回复后再继续
|
||||
|
||||
### 步骤 4:完成开发
|
||||
### 步骤 3:完成开发
|
||||
|
||||
所有任务完成并验证后:
|
||||
- 宣布:"我正在使用 finishing-a-development-branch 技能来完成此工作。"
|
||||
@@ -156,6 +134,35 @@ $ git commit -m "feat: 添加用户输入验证(任务 2/5)"
|
||||
|
||||
**不确定时就问,不要猜测。**
|
||||
|
||||
## 常见异常处理
|
||||
|
||||
> 🇨🇳 **本节是 superpowers-zh 的增量内容,上游 obra/superpowers 没有。**
|
||||
> 它展开的是上一节「遇到阻塞(缺少依赖、测试失败、指令不清)」的三种具体情形。
|
||||
> 上游的步骤 1–3 与其余各节均为逐节翻译,未被本节改动。
|
||||
|
||||
|
||||
**测试失败:**
|
||||
1. 读错误信息,定位失败原因
|
||||
2. 区分:是实现 bug?还是测试本身有问题?还是计划描述有误?
|
||||
3. 实现 bug → 修复并重跑
|
||||
4. 测试有问题 → 修复测试,向伙伴说明
|
||||
5. 计划有误 → 停下来,向伙伴报告并建议修正
|
||||
|
||||
**依赖缺失:**
|
||||
```
|
||||
任务 3 需要 Redis 连接,但计划中没有提及 Redis 配置。
|
||||
→ 停止执行
|
||||
→ 向伙伴报告:"任务 3 需要 Redis,计划中未包含配置步骤。
|
||||
建议:在任务 3 前插入 '配置 Redis 连接' 步骤。"
|
||||
```
|
||||
|
||||
**指令不清:**
|
||||
- 不要猜测意图,不要"合理推断"
|
||||
- 列出你的理解和困惑,让伙伴澄清
|
||||
- 等待回复后再继续
|
||||
|
||||
**提交粒度:** 每个任务单独提交,commit message 引用任务编号。
|
||||
|
||||
## 何时回到之前的步骤
|
||||
|
||||
**回到审查(步骤 1)当:**
|
||||
@@ -168,7 +175,6 @@ $ git commit -m "feat: 添加用户输入验证(任务 2/5)"
|
||||
- 先批判性审查计划
|
||||
- 严格按照计划步骤执行
|
||||
- 不要跳过验证
|
||||
- 每个任务单独提交,commit message 引用任务编号
|
||||
- 计划要求时引用相应技能
|
||||
- 遇到阻塞时停下来,不要猜测
|
||||
- 未经用户明确同意,绝不在 main/master 分支上开始实现
|
||||
|
||||
@@ -69,6 +69,9 @@ Gemini CLI 用户通过 GEMINI.md 自动获得 `references/gemini-tools.md` 的
|
||||
|
||||
## 中国特色技能路由
|
||||
|
||||
> 🇨🇳 **本节是 superpowers-zh 的增量内容,上游 obra/superpowers 没有。**
|
||||
> 用于把中文场景路由到本 fork 原创的 chinese-* 系列 skill。其余各节均为逐节翻译。
|
||||
|
||||
当检测到以下场景时,**必须**优先调用对应的中国特色技能:
|
||||
|
||||
| 场景 | 调用技能 |
|
||||
|
||||
@@ -74,7 +74,10 @@ assert_count() {
|
||||
local expected="$3"
|
||||
local test_name="${4:-test}"
|
||||
|
||||
local actual=$(echo "$output" | grep -c "$pattern" || echo "0")
|
||||
# grep -c 匹配到 0 个时输出 "0" 但退出码为 1;写成 `|| echo "0"` 会拼出
|
||||
# "0\n0",下面的 -eq 比较直接报错、这条断言从此静默失效。用 `; true` 只吞退出码。
|
||||
local actual=$(echo "$output" | grep -c "$pattern"; true)
|
||||
actual=${actual:-0}
|
||||
|
||||
if [ "$actual" -eq "$expected" ]; then
|
||||
echo " [PASS] $test_name (found $actual instances)"
|
||||
|
||||
@@ -196,7 +196,8 @@ echo ""
|
||||
|
||||
# Test 2: Subagents were used (Task tool)
|
||||
echo "Test 2: Subagents dispatched..."
|
||||
task_count=$(grep -c '"name":"Task"' "$SESSION_FILE" || echo "0")
|
||||
# 见 test-helpers.sh 注释:grep -c 无匹配时退出码为 1,不能用 || echo
|
||||
task_count=$(grep -c '"name":"Task"' "$SESSION_FILE"; true); task_count=${task_count:-0}
|
||||
if [ "$task_count" -ge 2 ]; then
|
||||
echo " [PASS] $task_count subagents dispatched"
|
||||
else
|
||||
@@ -207,7 +208,7 @@ echo ""
|
||||
|
||||
# Test 3: TodoWrite was used for tracking
|
||||
echo "Test 3: Task tracking..."
|
||||
todo_count=$(grep -c '"name":"TodoWrite"' "$SESSION_FILE" || echo "0")
|
||||
todo_count=$(grep -c '"name":"TodoWrite"' "$SESSION_FILE"; true); todo_count=${todo_count:-0}
|
||||
if [ "$todo_count" -ge 1 ]; then
|
||||
echo " [PASS] TodoWrite used $todo_count time(s) for task tracking"
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user