From b90bc1ccb149be86c129814ed1e5dba8b545b6d9 Mon Sep 17 00:00:00 2001 From: jiangnan <1394485448@qq.com> Date: Thu, 23 Apr 2026 00:10:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20npx=20=E5=AE=89=E8=A3=85=20CC=20?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E6=97=B6=E8=A1=A5=E4=B8=8A=20CLAUDE.md=20boo?= =?UTF-8?q?tstrap=EF=BC=88skill=20=E4=B8=8D=E8=A7=A6=E5=8F=91=E6=A0=B9?= =?UTF-8?q?=E5=9B=A0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前 installForTarget 对 Trae/Gemini/Aider/Antigravity/Hermes 都会自动生成 bootstrap 规则(写到各自的 rules 文件),让模型知道"任何任务前先查 skill"。 唯独 .claude/ 分支只复制 skills 和 agents,不写 CLAUDE.md 引导。 结果:用户 npx superpowers-zh 装到 .claude/ 后,skill 文件都在,但模型 完全没被告知要主动用——提"加个导出功能"直接写代码,不会走 brainstorming → writing-plans 的方法论流程。手动 /brainstorming 能触发,自动不触发。 本次改动: - 新增 generateClaudeCodeBootstrap(),对齐 Gemini/Aider 的追加/创建逻辑 - installForTarget 的 .claude/ 分支调用它 - 默认回退分支(未检测到任何工具)也调用它 - 幂等:已包含 superpowers-zh 引用则跳过 - 已有 CLAUDE.md 则追加,保留用户原内容 本地验证四个场景:空项目 / 已有 CLAUDE.md / 二次装 / --tool claude,全部通过。 version bump: 1.1.8 -> 1.1.9 --- bin/superpowers-zh.js | 56 +++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/bin/superpowers-zh.js b/bin/superpowers-zh.js index 3403733..4727353 100755 --- a/bin/superpowers-zh.js +++ b/bin/superpowers-zh.js @@ -299,6 +299,49 @@ ${skillList} } } +function generateClaudeCodeBootstrap(projectDir) { + const skillEntries = scanSkillEntries(SKILLS_SRC); + const skillList = skillEntries.map(s => `- **${s.name}**: ${s.desc}`).join('\n'); + + const content = `# Superpowers-ZH 中文增强版 + +本项目已安装 superpowers-zh 技能框架(${skillEntries.length} 个 skills)。 + +## 核心规则 + +1. **收到任务时,先检查是否有匹配的 skill** — 哪怕只有 1% 的可能性也要检查 +2. **设计先于编码** — 收到功能需求时,先用 brainstorming skill 做需求分析 +3. **测试先于实现** — 写代码前先写测试(TDD) +4. **验证先于完成** — 声称完成前必须运行验证命令 + +## 可用 Skills + +Skills 位于 \`.claude/skills/\` 目录,每个 skill 有独立的 \`SKILL.md\` 文件。 + +${skillList} + +## 如何使用 + +当任务匹配某个 skill 时,使用 \`Skill\` 工具加载对应 skill 并严格遵循其流程。绝不要用 Read 工具读取 SKILL.md 文件。 + +如果你认为哪怕只有 1% 的可能性某个 skill 适用于你正在做的事情,你必须调用该 skill 检查。 +`; + + const mdPath = resolve(projectDir, 'CLAUDE.md'); + if (existsSync(mdPath)) { + const existing = readFileSync(mdPath, 'utf8'); + if (!existing.includes('superpowers-zh')) { + writeFileSync(mdPath, existing + '\n\n' + content, 'utf8'); + console.log(` ✅ Claude Code: 追加 skills 引用 -> ${mdPath}`); + } else { + console.log(` ✅ Claude Code: CLAUDE.md 已包含 superpowers-zh 引用`); + } + } else { + writeFileSync(mdPath, content, 'utf8'); + console.log(` ✅ Claude Code: bootstrap -> ${mdPath}`); + } +} + // 工具名称别名映射(用户输入 -> TARGETS.name) const TOOL_ALIASES = { 'claude': 'Claude Code', @@ -390,10 +433,13 @@ function installForTarget(target) { generateHermesBootstrap(PROJECT_DIR); } - if (target.name === 'Claude Code' && existsSync(AGENTS_SRC)) { - const agentsDest = resolve(PROJECT_DIR, '.claude', 'agents'); - mkdirSync(agentsDest, { recursive: true }); - copyDirSync(AGENTS_SRC, agentsDest); + if (target.name === 'Claude Code') { + generateClaudeCodeBootstrap(PROJECT_DIR); + if (existsSync(AGENTS_SRC)) { + const agentsDest = resolve(PROJECT_DIR, '.claude', 'agents'); + mkdirSync(agentsDest, { recursive: true }); + copyDirSync(AGENTS_SRC, agentsDest); + } } } @@ -445,6 +491,8 @@ function install(forceToolName) { copyDirSync(SKILLS_SRC, dest); console.log(` ✅ 默认安装: ${countDirs(dest)} 个 skills -> ${dest}`); + generateClaudeCodeBootstrap(PROJECT_DIR); + if (existsSync(AGENTS_SRC)) { const agentsDest = resolve(PROJECT_DIR, '.claude', 'agents'); mkdirSync(agentsDest, { recursive: true }); diff --git a/package.json b/package.json index 044fb1f..bdf143c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "superpowers-zh", - "version": "1.1.8", + "version": "1.1.9", "engines": { "node": ">=20.0.0" },