fix(installer): Aider 支持有两个都会导致「装了不生效」的错(#45 同类)

顺着 #45(Hermes 装错目录)和 #119(Qoder 映射表是编的)这条线,系统查了
我们自己那层工具支持。Aider 查出两处,都实测坐实,都是「装完看着成功、
实际不生效」。

## ① 真实 Aider 项目从来没被自动检测到过

detect 写的是 '.aider',即要求存在一个 `.aider/` 目录 —— 而 **Aider 不创建
这个目录**。它在项目根留下的是 `.aider.` 前缀的产物:

  .aider.conf.yml / .aider.chat.history.md / .aider.tags.cache.v3/

实测:造一个含这三样的目录跑 `npx superpowers-zh`,输出「未检测到任何已知
AI 编程工具」。而 docs/README.aider.md 一直写着「会自动检测 .aider.conf.yml
文件」—— 文档描述的是意图,代码做的是另一回事。

改为认这四个标记(保留 '.aider' 兼容)。

## ② CONVENTIONS.md 不会被 Aider 自动加载

代码注释和文档都写着「Aider 原生支持自动加载此文件」。官方文档
(aider.chat/docs/usage/conventions.html)说的是反的:必须
`aider --read CONVENTIONS.md`,或在 .aider.conf.yml 里写 `read: CONVENTIONS.md`。

最糟的是 docs 的「Skills 未生效」排障第 3 条写着「Aider 会自动读取
CONVENTIONS.md,无需额外配置」—— 用户卡住时来查文档,看到的正好是让他
继续卡住的那句。

改法照搬 #45 的做法:装完打印可直接用的两种激活方式,**不替用户改
.aider.conf.yml**(那是他们的文件)。docs 开头重写,把「还需一步」放最前面,
并注明 v1.7.9 及更早的说法是错的。

## 测试的盲区

verify-release.sh 的检测测试是 `mkdir .aider` 然后断言认出 Aider —— 拿代码
测代码,真实标记一个都没测。已补三个真实标记;顺带修了 case 分支:.yml 也
要按文件建,用目录冒充文件等于测了个假场景。

verify-release 90 -> 93 pass。

## 验证

- 只有 .aider.conf.yml 的目录:正确识别为 Aider,并打印激活提示
- 已有自写 CONVENTIONS.md:追加而不覆盖;卸载后逐字节恢复原内容
- 卸载:.aider 下残留 0 项
- audit.sh 166 pass / 0 warn / 0 fail、verify-release.sh 93 pass / 0 fail

## 范围

bin/superpowers-zh.js、docs/README.aider.md、scripts/verify-release.sh 均为
fork 自有(上游没有 installer 与 docs),零上游偏离。
This commit is contained in:
AI不止语
2026-08-12 18:03:28 +08:00
parent d544eb5505
commit be6dc8c252
3 changed files with 91 additions and 27 deletions

View File

@@ -71,7 +71,14 @@ const TARGETS = [
// Gemini 无 global其全局加载是「扩展目录」~/.gemini/extensions/*/skills/ + gemini-extension.json
// 不是简单复制到 ~/.gemini/skills通用 --global 覆盖不了。见 docs/README.gemini-cli.md。
{ name: 'Gemini CLI', dir: '.gemini/skills', detect: 'GEMINI.md' },
{ name: 'Aider', dir: '.aider/skills', detect: '.aider' },
// Aider 两点都跟直觉相反,都是实测确认的:
// 1) Aider 不创建 `.aider/` 目录,它在项目根留下的是 `.aider.` 前缀的产物
// .aider.conf.yml / .aider.chat.history.md / .aider.tags.cache.v3/)。
// 原来 detect 写 '.aider' 永远匹配不上 —— 真实 Aider 项目从来没被自动检测到过。
// 2) CONVENTIONS.md **不会**被 Aider 自动加载。官方文档aider.chat/docs/usage/
// conventions.html明确要 `aider --read CONVENTIONS.md` 或在 .aider.conf.yml
// 写 `read: CONVENTIONS.md`。所以装完必须打印激活方式,否则又是「装了不生效」。
{ name: 'Aider', dir: '.aider/skills', detect: ['.aider.conf.yml', '.aider.chat.history.md', '.aider.tags.cache.v3', '.aider'] },
{ name: 'OpenCode', dir: '.opencode/skills', detect: '.opencode', global: { dir: '.config/opencode/skills', detect: '.config/opencode' } },
{ name: 'Qwen Code', dir: '.qwen/skills', detect: '.qwen', global: { dir: '.qwen/skills', detect: '.qwen' } },
// Hermes 官方文档:只自动加载 ~/.hermes/skills/"the primary directory and
@@ -373,7 +380,8 @@ ${skillList}
当任务匹配某个 skill 时,读取对应的 \`.aider/skills/<skill-name>/SKILL.md\` 并严格遵循其流程。
`;
// 写入 CONVENTIONS.mdAider 原生支持自动加载此文件)
// 写入 CONVENTIONS.md。注意:Aider **不会**自动加载这个文件(见 TARGETS 里的
// Aider 注释),所以写完必须告诉用户怎么激活,否则装了等于没装。
// 如果已有 CONVENTIONS.md追加而不覆盖
const convPath = resolve(projectDir, 'CONVENTIONS.md');
if (existsSync(convPath)) {
@@ -388,6 +396,18 @@ ${skillList}
writeFileSync(convPath, wrapWithSentinel(content), 'utf8');
console.log(` ✅ Aider: bootstrap -> ${convPath}`);
}
// 激活提示。不替用户改 .aider.conf.yml —— 那是他们的配置文件。
console.log('');
console.log(' ⚠️ Aider 不会自动加载 CONVENTIONS.md还需一步才生效');
console.log('');
console.log(' 每次启动时带上:');
console.log(' aider --read CONVENTIONS.md');
console.log('');
console.log(' 或写进 .aider.conf.yml 一劳永逸:');
console.log('');
console.log(' read: CONVENTIONS.md');
console.log('');
}
function generateGeminiBootstrap(baseDir, isGlobal) {