Skip to content

Commit b01a91c

Browse files
committed
fix(installer): Qwen Code 缺 bootstrap(skill 是死重)+ 文档把产品搞混了
核查第五款。路径本身是对的 —— 这是查过的几款里第一个没装错地方的。但另有 两个问题。 ## ① 我们把产品搞混了 docs 标题写「Qwen Code (通义灵码)」,链接指向 tongyi.aliyun.com;README 里 把它标成「IDE 插件」。 实际:Qwen Code 是 QwenLM/qwen-code 这个**命令行工具**(Gemini CLI 的 fork), 跑在终端里。通义灵码是阿里的 IDE 插件,**是另一个产品**,配置路径完全不同。 照着我们的文档去配通义灵码是配不通的。 这跟 #119 的 Qoder 表「没标产品面」是同一类错误:把两个不同产品面的东西 混成一份说明。docs 与简繁 README 一并更正(类型也从「IDE 插件」改回 CLI)。 ## ② 只装 skills、不写 bootstrap —— skill 是死重 实测装完项目里只有 .qwen/skills/,一个引导文件都没写。而 Claude 写 CLAUDE.md、 Gemini 写 GEMINI.md,Qwen Code 的对应物 QWEN.md 我们完全没用。 按上游的原则:没有 bootstrap,skill 就是死重 —— 文件在磁盘上但很少被调用。 两套机制都查了官方文档: - skills:qwenlm.github.io/.../features/skills/ 确认 .qwen/skills/ 与 ~/.qwen/skills/ 自动发现,无需配置 - QWEN.md:分层记忆的默认上下文文件就是 QWEN.md,从 cwd 逐层向上到项目根、 以及全局 ~/.qwen/ 都会被扫描并拼接(可用 contextFileName 改名) 已补 generateQwenBootstrap,复用 Gemini 那套结构:项目级写 ./QWEN.md,全局写 ~/.qwen/QWEN.md;已有文件则用哨兵注释追加而不覆盖。 顺带补上全局卸载的缺口:qwen 在 GLOBAL_OK 里,--global 会写 ~/.qwen/QWEN.md, 原来 GLOBAL_BOOTSTRAP_CLEAN_SECTION 只有 .claude/CLAUDE.md,装卸一轮会在用户 主目录留残留。 ## 验证 - 项目级:已有 QWEN.md 时追加,卸载后逐字节恢复用户内容 - 全局:写 ~/.qwen/QWEN.md,卸载后 HOME 下残留 0 个文件 - verify-release 新增 Qwen 段(bootstrap 写入 / 不覆盖用户内容 / 指向 .qwen/skills/ / 卸载切除干净 / 不误删用户内容 / 全局零残留),101 -> 108 pass - audit.sh 166 pass / 0 warn / 0 fail ## 范围 installer、docs、简繁 README、verify-release 均为 fork 自有,零上游偏离。
1 parent d83d3f9 commit b01a91c

5 files changed

Lines changed: 154 additions & 39 deletions

File tree

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ AI:在开始实现之前,我需要了解几个关键问题:
115115
| ⭐ Star 数 | 250k+ ||
116116
| 📦 Skills 总数 | 14 | **20**(14 翻译 + 4 国产原创 + 2 上游历史保留) |
117117
| 🌐 语言 | 英文 | 中文(技术术语保留英文) |
118-
| 🤖 **支持工具** | **6 款**:Claude Code / Cursor / Codex / OpenCode / Copilot CLI / Gemini CLI | **23 款**:上述 6 款 + Hermes Agent / Trae / Kiro / Qwen Code(通义灵码)/ OpenClaw / Claw Code / Antigravity / DeerFlow / VS Code / Windsurf / Aider / Qoder / CodeBuddy(腾讯) / CodeArts(华为云码道) / Cline / Kilo Code / Crush |
118+
| 🤖 **支持工具** | **6 款**:Claude Code / Cursor / Codex / OpenCode / Copilot CLI / Gemini CLI | **23 款**:上述 6 款 + Hermes Agent / Trae / Kiro / Qwen Code / OpenClaw / Claw Code / Antigravity / DeerFlow / VS Code / Windsurf / Aider / Qoder / CodeBuddy(腾讯) / CodeArts(华为云码道) / Cline / Kilo Code / Crush |
119119
|**安装方式** | 按工具分别装(每款一条不同的 plugin marketplace 命令) | **`npx superpowers-zh` 一条命令自动识别项目里的工具并安装**;识别不出可 `--tool <name>` 显式指定 |
120120
| 🇨🇳 Git 平台 | GitHub 为主 | GitHub + Gitee + Coding + 极狐 GitLab + **CNB(腾讯云原生构建)** |
121121
| 🇨🇳 CI/CD 示例 | GitHub Actions | GitHub Actions + Gitee Go + Coding CI + 极狐 CI + `.cnb.yml` |
@@ -150,7 +150,7 @@ AI:在开始实现之前,我需要了解几个关键问题:
150150
| [DeerFlow 2.0](https://github.com/bytedance/deer-flow) | Agent 框架 | `npx superpowers-zh` | `skills/custom/` |
151151
| [OpenCode](https://opencode.ai) | CLI | `npx superpowers-zh` | `.opencode/skills/` |
152152
| [OpenClaw](https://github.com/anthropics/openclaw) | CLI | `npx superpowers-zh` | `skills/` |
153-
| [Qwen Code](https://tongyi.aliyun.com/lingma) (通义灵码) | IDE 插件 | `npx superpowers-zh` | `.qwen/skills/` |
153+
| [Qwen Code](https://github.com/QwenLM/qwen-code) | CLI | `npx superpowers-zh` | `.qwen/skills/` + `QWEN.md` |
154154
| [Antigravity](https://github.com/anthropics/antigravity) | CLI | `npx superpowers-zh` | `.agents/skills/` |
155155
| [Claw Code](https://github.com/ultraworkers/claw-code) | CLI (Rust) | `npx superpowers-zh` | `.claw/skills/` |
156156
| [Qoder](https://qoder.com) (阿里 AI IDE) | IDE | `npx superpowers-zh` | `.qoder/skills/` + `.qoder/rules/` |
@@ -311,7 +311,7 @@ cp -r superpowers-zh/skills /your/project/.qoder/skills # Qoder(阿里 AI
311311
| Aider | `.aider/skills/*/SKILL.md` | 项目级 skills 目录 |
312312
| OpenCode | `.opencode/skills/*/SKILL.md` | 项目级 skills 目录 |
313313
| Hermes Agent | `.hermes/skills/*/SKILL.md` | 项目级 skills 目录 |
314-
| Qwen Code | `.qwen/skills/*/SKILL.md` | 项目级 skills 目录 |
314+
| Qwen Code | `.qwen/skills/*/SKILL.md` + `QWEN.md` | skills 自动发现;QWEN.md 是官方分层记忆的默认上下文文件 |
315315
| Claw Code | `.claw/skills/*/SKILL.md` | Rust 版 CLI agent,兼容 Claude Code 的 SKILL.md 格式 |
316316
| Qoder | `.qoder/skills/*/SKILL.md` + `.qoder/rules/superpowers-zh.md` | 阿里 AI IDE,自动生成 `trigger: always_on` 的 bootstrap rule |
317317

README.zh-Hant.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ AI:在開始實作之前,我需要了解幾個關鍵問題:
115115
| ⭐ Star 數 | 250k+ ||
116116
| 📦 Skills 總數 | 14 | **20**(14 翻譯 + 4 國產原創 + 2 上游歷史保留) |
117117
| 🌐 語言 | 英文 | 中文(技術術語保留英文) |
118-
| 🤖 **支援工具** | **6 款**:Claude Code / Cursor / Codex / OpenCode / Copilot CLI / Gemini CLI | **23 款**:上述 6 款 + Hermes Agent / Trae / Kiro / Qwen Code(通義靈碼)/ OpenClaw / Claw Code / Antigravity / DeerFlow / VS Code / Windsurf / Aider / Qoder / CodeBuddy(騰訊) / CodeArts(華為雲碼道) / Cline / Kilo Code / Crush |
118+
| 🤖 **支援工具** | **6 款**:Claude Code / Cursor / Codex / OpenCode / Copilot CLI / Gemini CLI | **23 款**:上述 6 款 + Hermes Agent / Trae / Kiro / Qwen Code / OpenClaw / Claw Code / Antigravity / DeerFlow / VS Code / Windsurf / Aider / Qoder / CodeBuddy(騰訊) / CodeArts(華為雲碼道) / Cline / Kilo Code / Crush |
119119
|**安裝方式** | 按工具分別裝(每款一條不同的 plugin marketplace 命令) | **`npx superpowers-zh` 一條命令自動識別專案裡的工具並安裝**;識別不出可 `--tool <name>` 顯式指定 |
120120
| 🇨🇳 Git 平台 | GitHub 為主 | GitHub + Gitee + Coding + 極狐 GitLab + **CNB(騰訊雲原生建置)** |
121121
| 🇨🇳 CI/CD 範例 | GitHub Actions | GitHub Actions + Gitee Go + Coding CI + 極狐 CI + `.cnb.yml` |
@@ -150,7 +150,7 @@ AI:在開始實作之前,我需要了解幾個關鍵問題:
150150
| [DeerFlow 2.0](https://github.com/bytedance/deer-flow) | Agent 框架 | `npx superpowers-zh` | `skills/custom/` |
151151
| [OpenCode](https://opencode.ai) | CLI | `npx superpowers-zh` | `.opencode/skills/` |
152152
| [OpenClaw](https://github.com/anthropics/openclaw) | CLI | `npx superpowers-zh` | `skills/` |
153-
| [Qwen Code](https://tongyi.aliyun.com/lingma) (通義靈碼) | IDE 外掛 | `npx superpowers-zh` | `.qwen/skills/` |
153+
| [Qwen Code](https://github.com/QwenLM/qwen-code) | CLI | `npx superpowers-zh` | `.qwen/skills/` + `QWEN.md` |
154154
| [Antigravity](https://github.com/anthropics/antigravity) | CLI | `npx superpowers-zh` | `.agents/skills/` |
155155
| [Claw Code](https://github.com/ultraworkers/claw-code) | CLI (Rust) | `npx superpowers-zh` | `.claw/skills/` |
156156
| [Qoder](https://qoder.com) (阿里 AI IDE) | IDE | `npx superpowers-zh` | `.qoder/skills/` + `.qoder/rules/` |

bin/superpowers-zh.js

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ const TARGETS = [
8888
// 写 `read: CONVENTIONS.md`。所以装完必须打印激活方式,否则又是「装了不生效」。
8989
{ name: 'Aider', dir: '.aider/skills', detect: ['.aider.conf.yml', '.aider.chat.history.md', '.aider.tags.cache.v3', '.aider'] },
9090
{ name: 'OpenCode', dir: '.opencode/skills', detect: '.opencode', global: { dir: '.config/opencode/skills', detect: '.config/opencode' } },
91+
// Qwen Code = QwenLM/qwen-code 这个 CLI(Gemini CLI 的 fork),**不是**通义灵码
92+
// (通义灵码是阿里的 IDE 插件,另一个产品,路径完全不同)。旧文档写混过。
93+
// 路径经官方文档核实:项目 .qwen/skills/、用户 ~/.qwen/skills/,自动发现无需配置。
9194
{ name: 'Qwen Code', dir: '.qwen/skills', detect: '.qwen', global: { dir: '.qwen/skills', detect: '.qwen' } },
9295
// Hermes 官方文档:只自动加载 ~/.hermes/skills/("the primary directory and
9396
// source of truth"),项目级目录不被自动发现,外部目录必须写进
@@ -525,6 +528,57 @@ ${skillList}
525528
}
526529
}
527530

531+
// Qwen Code 与 Gemini CLI 同源(前者是后者的 fork),两套机制都对得上:
532+
// - skills:官方文档确认自动发现 .qwen/skills/ 与 ~/.qwen/skills/,无需配置
533+
// (qwenlm.github.io/qwen-code-docs/en/users/features/skills/)
534+
// - bootstrap:分层记忆系统的默认上下文文件就是 QWEN.md,从 cwd 逐层向上到项目根
535+
// 发现并拼接(可用 contextFileName 改名,默认 QWEN.md);全局在 ~/.qwen/QWEN.md
536+
// v1.7.10 及更早只装 skills、不写 bootstrap —— skills 能被发现,但没有引导就不会
537+
// 在恰当时机自动触发,等于死重。
538+
function generateQwenBootstrap(baseDir, isGlobal) {
539+
const skillEntries = scanSkillEntries(SKILLS_SRC);
540+
const skillList = skillEntries.map(s => `- **${s.name}**: ${s.desc}`).join('\n');
541+
const scope = isGlobal ? '已全局安装 superpowers-zh 技能框架,所有项目共享' : '本项目已安装 superpowers-zh 技能框架';
542+
const skillsRef = isGlobal ? '~/.qwen/skills/' : '.qwen/skills/';
543+
544+
const content = `# Superpowers-ZH 中文增强版
545+
546+
${scope}${skillEntries.length} 个 skills)。
547+
548+
## 核心规则
549+
550+
1. **收到任务时,先检查是否有匹配的 skill** — 哪怕只有 1% 的可能性也要检查
551+
2. **设计先于编码** — 收到功能需求时,先用 brainstorming skill 做需求分析
552+
3. **测试先于实现** — 写代码前先写测试(TDD)
553+
4. **验证先于完成** — 声称完成前必须运行验证命令
554+
555+
## 可用 Skills
556+
557+
Skills 位于 \`${skillsRef}\` 目录,每个 skill 有独立的 \`SKILL.md\` 文件。
558+
559+
${skillList}
560+
561+
## 如何使用
562+
563+
当任务匹配某个 skill 时,读取对应的 \`${skillsRef}<skill-name>/SKILL.md\` 并严格遵循其流程。
564+
`;
565+
566+
const qwenPath = isGlobal ? resolve(baseDir, '.qwen', 'QWEN.md') : resolve(baseDir, 'QWEN.md');
567+
mkdirSync(dirname(qwenPath), { recursive: true });
568+
if (existsSync(qwenPath)) {
569+
const existing = readFileSync(qwenPath, 'utf8');
570+
if (!existing.includes('superpowers-zh')) {
571+
writeFileSync(qwenPath, existing.replace(/\s+$/, '') + '\n\n' + wrapWithSentinel(content), 'utf8');
572+
console.log(` ✅ Qwen Code: 追加 skills 引用 -> ${qwenPath}`);
573+
} else {
574+
console.log(` ✅ Qwen Code: QWEN.md 已包含 superpowers-zh 引用`);
575+
}
576+
} else {
577+
writeFileSync(qwenPath, wrapWithSentinel(content), 'utf8');
578+
console.log(` ✅ Qwen Code: bootstrap -> ${qwenPath}`);
579+
}
580+
}
581+
528582
function generateHermesBootstrap(projectDir, isGlobal) {
529583
// 全局模式不写 bootstrap:Hermes 的用户级指令文件约定未在 docs 证实,
530584
// 往 $HOME 根目录写 HERMES.md 是猜路径 + 污染主目录。~/.hermes/skills/ 里的
@@ -854,6 +908,10 @@ function installForTarget(target, baseDir, isGlobal) {
854908
generateGeminiBootstrap(baseDir, isGlobal);
855909
}
856910

911+
if (target.name === 'Qwen Code') {
912+
generateQwenBootstrap(baseDir, isGlobal);
913+
}
914+
857915
if (target.name === 'Hermes Agent') {
858916
generateHermesBootstrap(baseDir, isGlobal);
859917
}
@@ -904,6 +962,7 @@ const LEGACY_SKILL_DIRS = ['.kiro/steering'];
904962
const BOOTSTRAP_CLEAN_SECTION = [
905963
'CLAUDE.md',
906964
'GEMINI.md',
965+
'QWEN.md',
907966
'HERMES.md',
908967
'CONVENTIONS.md',
909968
'CODEBUDDY.md',
@@ -987,7 +1046,9 @@ function cleanBootstrapSection(filePath) {
9871046
// 仅 Claude Code(~/.claude/CLAUDE.md,全局记忆已证实)和 Qoder(~/.qoder/rules/,镜像其项目机制)
9881047
// 会写全局 bootstrap;其余全局工具靠 skill 自动发现,无 bootstrap 需清理。
9891048
const GLOBAL_BOOTSTRAP_DELETE = ['.qoder/rules/superpowers-zh.md'];
990-
const GLOBAL_BOOTSTRAP_CLEAN_SECTION = ['.claude/CLAUDE.md'];
1049+
// qwen 在 GLOBAL_OK 里,--global 会写 ~/.qwen/QWEN.md,全局卸载必须清掉它,
1050+
// 否则 --global 装卸一轮会在用户主目录留残留。
1051+
const GLOBAL_BOOTSTRAP_CLEAN_SECTION = ['.claude/CLAUDE.md', '.qwen/QWEN.md'];
9911052

9921053
function uninstallForTarget(target, srcSkillNames, baseDir, isGlobal) {
9931054
const relDir = isGlobal ? (target.global && target.global.dir) : target.dir;

docs/README.qwen.md

Lines changed: 66 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,94 @@
11
# Superpowers 中文版 — Qwen Code 安装指南
22

3-
[Qwen Code](https://tongyi.aliyun.com/qianwen) (通义灵码) 中使用 superpowers-zh 的完整指南。
3+
[Qwen Code](https://github.com/QwenLM/qwen-code) 中使用 superpowers-zh 的完整指南。
44

5-
## 自动安装
5+
## ⚠️ 先说清楚是哪个产品
66

7-
```bash
8-
cd /your/project
9-
npx superpowers-zh
10-
```
7+
**Qwen Code 是 [`QwenLM/qwen-code`](https://github.com/QwenLM/qwen-code) 这个命令行工具**(Gemini CLI 的 fork),跑在终端里。
118

12-
安装脚本会自动检测 `.qwen/` 目录并将 skills 复制到 `.qwen/skills/` 目录
9+
**不是**通义灵码 —— 通义灵码是阿里的 IDE 插件,是另一个产品,配置路径完全不同
1310

14-
## 手动安装
11+
> 📌 v1.7.10 及更早版本的本文档把两者写混了(标题写「Qwen Code (通义灵码)」、链接指向 `tongyi.aliyun.com`)。照着那份文档去配通义灵码是配不通的。这是我们的错误,v1.7.11 起更正。
12+
13+
## 安装
1514

1615
```bash
17-
git clone https://github.com/jnMetaCode/superpowers-zh.git
18-
cp -r superpowers-zh/skills /your/project/.qwen/skills
16+
cd /your/project
17+
npx superpowers-zh --tool qwen
1918
```
2019

21-
或全局安装
20+
全局(所有项目共享)
2221

2322
```bash
24-
mkdir -p ~/.qwen/skills
25-
cp -r superpowers-zh/skills/* ~/.qwen/skills/
23+
npx superpowers-zh --global --tool qwen
2624
```
2725

28-
## Skill 加载优先级
26+
装两样东西:
2927

30-
| 位置 | 优先级 | 说明 |
31-
|------|--------|------|
32-
| `.qwen/skills/` | 最高 | 项目级,仅当前项目 |
33-
| `~/.qwen/skills/` | | 用户级,所有项目共享 |
28+
| 位置 | 内容 |
29+
|---|---|
30+
| `.qwen/skills/<name>/SKILL.md`(全局为 `~/.qwen/skills/`| 20 个 skill 正文 |
31+
| `QWEN.md`(全局为 `~/.qwen/QWEN.md` | bootstrap:核心规则 + skill 清单,引导 AI 在恰当时机去读对应 SKILL.md |
3432

35-
## 使用
33+
> 📌 v1.7.10 及更早**只装 skills、不写 bootstrap**。skills 能被 Qwen Code 发现,但没有引导就不会在恰当时机自动触发 —— 文件在磁盘上,实际很少被调用。v1.7.11 起补上。
3634
37-
安装完成后重启 Qwen Code,skills 会自动生效。
35+
## 工作原理
3836

39-
Qwen Code 中可以通过以下方式调用 skills
37+
Qwen Code 两套机制我们都用上了,各自的出处
4038

41-
```
42-
请使用 brainstorming skill 来分析这个需求
43-
```
39+
**① Skills —— 自动发现,无需配置**
4440

41+
[官方 Skills 文档](https://qwenlm.github.io/qwen-code-docs/en/users/features/skills/):Qwen Code 从 `~/.qwen/skills/`(个人)和 `.qwen/skills/`(项目)自动发现 skill,每个 skill 是一个含 `SKILL.md` 的子目录,走 Agent Skills 开放标准(与 Claude Code、Gemini CLI 同一套)。
42+
43+
**② QWEN.md —— 分层记忆,自动拼接**
44+
45+
Qwen Code 的分层记忆系统默认上下文文件就是 `QWEN.md`,从当前目录逐层向上到项目根、以及全局 `~/.qwen/` 都会被扫描并拼接进上下文。文件名可用 `contextFileName` 设置改,默认 `QWEN.md`
46+
47+
所以 bootstrap 写在 `QWEN.md` 里,每次会话自动加载;skill 正文留在 `.qwen/skills/` 按需读取,不占常驻开销。
48+
49+
### 已有 QWEN.md 怎么办
50+
51+
**追加,不覆盖。** 我们把内容包在哨兵注释之间,你自己写的部分原样保留;卸载时只切除我们那一段。已实测:装完再卸,你的 `QWEN.md` 逐字节恢复原状。
52+
53+
## Skill 加载优先级
54+
55+
| 位置 | 范围 |
56+
|------|------|
57+
| `.qwen/skills/` | 项目级,仅当前项目 |
58+
| `~/.qwen/skills/` | 用户级,所有项目共享 |
59+
60+
同名时项目级优先。
61+
62+
## 手动安装
63+
64+
```bash
65+
git clone https://github.com/jnMetaCode/superpowers-zh.git
66+
mkdir -p /your/project/.qwen/skills
67+
cp -r superpowers-zh/skills/* /your/project/.qwen/skills/
4568
```
46-
按照 test-driven-development skill 的方法来实现这个功能
47-
```
4869

49-
## 故障排查
70+
> 手动复制不会生成 `QWEN.md` bootstrap,skill 会被发现但不会自动触发。建议优先用 `npx superpowers-zh --tool qwen`
71+
72+
## 使用
73+
74+
装好重启 Qwen Code:
5075

51-
### Skills 未生效
76+
- 直接描述任务,bootstrap 会引导它匹配 skill:「帮我加一个导出功能」应先触发 brainstorming 做需求分析,而不是直接写代码
77+
- 也可以点名:「用 brainstorming 分析这个需求」
78+
-`/memory show` 可以查看当前拼接进上下文的内容,确认 bootstrap 是否被加载
79+
80+
## 卸载
81+
82+
```bash
83+
npx superpowers-zh --uninstall # 项目级
84+
npx superpowers-zh --global --uninstall # 全局
85+
```
5286

53-
1. 确认 `.qwen/skills/` 目录存在且包含 skill 文件夹
54-
2. 每个 skill 需要包含有效 YAML frontmatter 的 `SKILL.md` 文件
55-
3. 重启 Qwen Code 或刷新会话
87+
会删除装过的 skill 目录,并从 `QWEN.md` 中精确切除 superpowers-zh 段(保留你自己写的内容)。实测全局卸载后 `~/` 下零残留。
5688

5789
## 获取帮助
5890

5991
- 提交 Issue:https://github.com/jnMetaCode/superpowers-zh/issues
60-
- 项目主页:https://github.com/jnMetaCode/superpowers-zh
61-
- 通义灵码文档:https://tongyi.aliyun.com/lingma
92+
- Qwen Code 仓库:https://github.com/QwenLM/qwen-code
93+
- Qwen Code Skills 文档:https://qwenlm.github.io/qwen-code-docs/en/users/features/skills/
94+
- Qwen Code 记忆文档:https://qwenlm.github.io/qwen-code-docs/en/users/features/memory/

scripts/verify-release.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,27 @@ node "$INS" --tool kiro >/dev/null 2>&1
177177
[ -f "$T/.kiro/steering/my-own.md" ] && ok || bad "Kiro 升级误删了用户自己的 steering 文件"
178178
cd /; rm -rf "$T"
179179

180+
# Qwen Code:bootstrap 必须写 QWEN.md(官方分层记忆的默认上下文文件),
181+
# 且项目级/全局装卸都不能留残留。v1.7.10 及更早只装 skills 不写 bootstrap。
182+
T=$(mktemp -d); cd "$T"
183+
printf '# 用户自己的上下文\n' > QWEN.md
184+
node "$INS" --tool qwen >/dev/null 2>&1
185+
grep -q 'superpowers-zh' QWEN.md && ok || bad "Qwen: QWEN.md 未写入 bootstrap"
186+
grep -q '用户自己的上下文' QWEN.md && ok || bad "Qwen: 覆盖了用户已有的 QWEN.md"
187+
grep -q '\.qwen/skills/' QWEN.md && ok || bad "Qwen: bootstrap 未指向 .qwen/skills/"
188+
node "$INS" --uninstall >/dev/null 2>&1
189+
grep -q 'superpowers-zh' QWEN.md && bad "Qwen: 卸载后 QWEN.md 仍残留 superpowers-zh 段" || ok
190+
grep -q '用户自己的上下文' QWEN.md && ok || bad "Qwen: 卸载误删了用户自己的 QWEN.md 内容"
191+
cd /; rm -rf "$T"
192+
193+
H=$(mktemp -d)
194+
HOME="$H" node "$INS" --global --tool qwen >/dev/null 2>&1
195+
[ -f "$H/.qwen/QWEN.md" ] && ok || bad "Qwen --global: 未写 ~/.qwen/QWEN.md"
196+
HOME="$H" node "$INS" --global --uninstall >/dev/null 2>&1
197+
left=$(find "$H" -type f 2>/dev/null | wc -l | tr -d ' ')
198+
[ "$left" = "0" ] && ok || bad "Qwen --global 卸载后 HOME 残留 $left 个文件"
199+
rm -rf "$H"
200+
180201
echo ""
181202
echo "─── F. PATH 探测健壮性(issue #48 新代码)───"
182203
T=$(mktemp -d); cd "$T"

0 commit comments

Comments
 (0)