资讯动态

【实战】Claude Code + Superpowers:从零开发一个完整项目

发布时间:2026/10/9 1:37:23 来源:尧图企业网站定制
1. 为什么我劝你别急着写第一行代码Claude Code 是 Anthropic 出的命令行编程助手能读你整个仓库、改文件、跑命令Superpowers 是给它加装的一套 Skills 插件把「需求分析 → 计划 → 执行 → 测试 → 收尾」这套工程流程固化下来。两者组合起来适合谁适合那种「脑子里有个项目雏形但一想到从零搭目录、写配置、补测试就头大」的独立开发者和小团队。我见过太多人拿到 Claude Code 的第一反应是打开终端敲一句「帮我写个 Todo API」然后看着它哗哗生成一堆文件跑起来报错再让它修修完又报错来回几轮之后人已经麻了。问题不在模型能力而在于你把「想清楚要做什么」这一步完全跳过了。Superpowers 的价值就在这它逼你在动手前先走一遍 brainstorming把端点、表结构、边界情况列清楚再进入 writing-plans 拆步骤最后 executing-plans 一步步落地。这篇实战我选的项目是「待办事项 API 服务」Todo API技术栈 Node.js Express SQLite Jest。选它的理由很实在需求边界清晰增删改查加统计涉及数据库、API 设计、测试、文档四个层面做完之后你还能顺手加用户系统、加标签、加团队协作扩展性够。目标只有一个——从零跑通一个能npm start起来、npm test全绿、curl 能打通的完整项目。整条链路里还有一个容易被忽略的环节模型通道。Claude Code 默认走 Anthropic 官方接口国内直连经常超时或者 401。我的做法是用 TaoToken 统一 Key 和 API 通道把 Base URL 指过去Claude Code、Cline、Codex 这些工具共用一个 Key省得每个工具配一遍。下面会给出可复制的配置片段。2. 前置准备TaoToken 通道 Claude Code Superpowers 安装2.1 先把模型通道打通Claude Code 本质是个 CLI 客户端它需要一个能响应 Anthropic Messages API 格式的端点。TaoToken 提供的就是这个统一入口官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台生成 API Key。拿到 Key 之后Claude Code 的配置有两种方式环境变量或者 settings 文件。我推荐用 settings 文件因为可以跟着项目走换机器不用重新 export。Claude Code 的配置文件路径是~/.claude/settings.json全局或者项目根目录的.claude/settings.json项目级。内容长这样{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的TaoToken密钥, ANTHROPIC_MODEL: claude-sonnet-4-5-20250929 } }注意三个字段缺一不可Base URL 指向https://taotoken.net/api不要加 UTM 后缀那是给网页链接用的AUTH_TOKEN 填你控制台生成的 KeyMODEL 填你要用的模型 ID。如果你用的是 Claude Code 的 OAuth 登录流程它会优先读~/.claude/.credentials.json这时候你需要先退出登录再改 settings否则配置不生效。配完之后验证一下claude --version claude -p 回复 OK 两个字如果第二条命令返回 OK说明通道通了。如果报 401往下看第 5 节的排查。2.2 安装 SuperpowersSuperpowers 的安装方式取决于你用的客户端。Claude Code 用户直接跑claude plugin marketplace add obra/superpowers-marketplace claude plugin install superpowerssuperpowers-marketplace装完之后在 Claude Code 里输入/superpowers应该能看到 Skills 列表。如果你用的是 Cline 或者别的支持 MCP 的编辑器Superpowers 也提供了 MCP server 模式配置片段如下以 Cline 的cline_mcp_settings.json为例{ mcpServers: { superpowers: { command: npx, args: [-y, superpowers-mcp], env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoToken密钥 } } } }这里同样把 Base URL 和 Key 写全三件套Base URL Key Model ID一个都不能少。Model ID 在 MCP 模式下通过ANTHROPIC_MODEL环境变量传或者在你的客户端模型选择里指定。2.3 项目目录初始化mkdir todo-api cd todo-api npm init -y npm install express sqlite3 npm install --save-dev jest supertest装完检查一下package.json把scripts改成{ scripts: { start: node src/app.js, test: jest --runInBand } }--runInBand是让 Jest 串行跑测试因为 SQLite 文件锁在并行下容易出问题这个坑我踩过。3. 可复制配置Superpowers 六步开发流程3.1 brainstorming需求分析在 Claude Code 里输入/superpowers.brainstorming 我要开发一个待办事项 API 服务Node.js Express SQLite请帮我分析需求输出 1. RESTful API 端点设计 2. 数据库表结构 3. 需要处理的边缘情况 4. 推荐的开发顺序Superpowers 会返回一份结构化清单。核心端点设计如下方法端点说明GET/api/todos获取所有任务支持 ?completedtrue 筛选POST/api/todos创建新任务body: { title }PUT/api/todos/:id更新任务body: { title, completed }DELETE/api/todos/:id删除任务GET/api/stats统计已完成/未完成数量数据库表结构CREATE TABLE IF NOT EXISTS todos ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, completed BOOLEAN DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP );边缘情况清单里Superpowers 列了四条必须处理的title 为空返回 400、更新/删除不存在的任务返回 404、数据库连接失败返回 500 并记日志、并发更新同一任务用事务保证一致性。这一步花 5 分钟能省掉后面至少一小时的返工。3.2 writing-plans制定计划/superpowers.writing-plans 根据上面的需求分析制定详细的开发计划包括每个步骤的具体任务、预期产出、验收标准。按顺序列出步骤。输出会是一份带验收标准的步骤清单大致是项目初始化 → 数据库封装 → API 端点实现 → 错误处理 → 单元测试 → 文档编写。每一步都有明确的「产出」和「验收」两栏比如步骤 3 的验收标准是「每个端点返回正确的 HTTP 状态码和 JSON」。3.3 executing-plans执行计划/superpowers.executing-plans 开始执行计划从步骤 1 项目初始化开始。每完成一个步骤向我确认后再继续下一步。Superpowers 会逐步生成文件。核心的src/app.js长这样const express require(express); const sqlite3 require(sqlite3).verbose(); const app express(); const PORT process.env.PORT || 3000; app.use(express.json()); const db new sqlite3.Database(./todos.db); db.run(CREATE TABLE IF NOT EXISTS todos ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, completed BOOLEAN DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP )); app.get(/api/todos, (req, res) { const { completed } req.query; let sql SELECT * FROM todos ORDER BY created_at DESC; const params []; if (completed ! undefined) { sql SELECT * FROM todos WHERE completed ? ORDER BY created_at DESC; params.push(completed true ? 1 : 0); } db.all(sql, params, (err, rows) { if (err) return res.status(500).json({ error: err.message }); res.json({ data: rows }); }); }); app.post(/api/todos, (req, res) { const { title } req.body; if (!title || !title.trim()) { return res.status(400).json({ error: title 不能为空 }); } db.run(INSERT INTO todos (title) VALUES (?), [title.trim()], function(err) { if (err) return res.status(500).json({ error: err.message }); res.status(201).json({ id: this.lastID, title: title.trim(), completed: false }); }); }); app.put(/api/todos/:id, (req, res) { const { id } req.params; const { title, completed } req.body; const updates []; const params []; if (title ! undefined) { updates.push(title ?); params.push(title); } if (completed ! undefined) { updates.push(completed ?); params.push(completed ? 1 : 0); } if (updates.length 0) { return res.status(400).json({ error: 没有要更新的字段 }); } updates.push(updated_at CURRENT_TIMESTAMP); params.push(id); db.run(UPDATE todos SET ${updates.join(, )} WHERE id ?, params, function(err) { if (err) return res.status(500).json({ error: err.message }); if (this.changes 0) return res.status(404).json({ error: 任务不存在 }); res.json({ message: 更新成功 }); }); }); app.delete(/api/todos/:id, (req, res) { const { id } req.params; db.run(DELETE FROM todos WHERE id ?, [id], function(err) { if (err) return res.status(500).json({ error: err.message }); if (this.changes 0) return res.status(404).json({ error: 任务不存在 }); res.json({ message: 删除成功 }); }); }); app.get(/api/stats, (req, res) { db.get(SELECT COUNT(*) as total, SUM(CASE WHEN completed 1 THEN 1 ELSE 0 END) as completed, SUM(CASE WHEN completed 0 THEN 1 ELSE 0 END) as pending FROM todos, [], (err, row) { if (err) return res.status(500).json({ error: err.message }); res.json(row); }); }); app.listen(PORT, () { console.log(Todo API 服务已启动端口: ${PORT}); });3.4 using-tdd测试驱动/superpowers.using-tdd 为当前的 API 编写完整的单元测试要求使用 Jest Supertest测试正常情况和边界情况覆盖率 100%生成的tests/app.test.js覆盖了 GET/POST/PUT/DELETE/stats 五个端点包括空 title 返回 400、更新不存在任务返回 404 这些边界。跑npm test应该看到 10 个用例全绿。3.5 dispatching-parallel-agents并行扩展假设要给项目加两个新功能JWT 用户认证和任务标签。用并行 Agent/superpowers.dispatching-parallel-agents 同时开发两个功能 1. 添加 JWT 用户认证注册/登录/鉴权 2. 为任务添加标签功能支持一个任务打多个标签Superpowers 会启动两个并行 Agent一个写 auth 中间件和端点一个改数据库表加 tags 表最后自动合并代码、解决冲突、跑完整测试套件。3.6 finishing-a-development-branch收尾/superpowers.finishing-a-development-branch 项目开发完成请帮我 1. 编写 README.md 文档 2. 添加 .gitignore 3. 初始化 Git 仓库并提交 4. 输出一份快速上手指南这一步会生成完整的 README、.gitignore并帮你把代码提交到 Git。4. 验证请求从 curl 到完整联调4.1 启动服务npm start # 输出Todo API 服务已启动端口: 30004.2 逐个端点验证先测空列表curl http://localhost:3000/api/todos # 输出{data:[]}创建任务curl -X POST http://localhost:3000/api/todos \ -H Content-Type: application/json \ -d {title:用 Superpowers 开发第一个项目} # 输出{id:1,title:用 Superpowers 开发第一个项目,completed:false}更新任务curl -X PUT http://localhost:3000/api/todos/1 \ -H Content-Type: application/json \ -d {completed:true} # 输出{message:更新成功}查统计curl http://localhost:3000/api/stats # 输出{total:1,completed:1,pending:0}测边界——空 titlecurl -X POST http://localhost:3000/api/todos \ -H Content-Type: application/json \ -d {title:} # 输出{error:title 不能为空}测边界——更新不存在的任务curl -X PUT http://localhost:3000/api/todos/99999 \ -H Content-Type: application/json \ -d {completed:true} # 输出{error:任务不存在}4.3 跑测试套件npm test预期输出PASS tests/app.test.js GET /api/todos ✓ 应该返回空数组初始状态 ✓ 应该返回已创建的任务 ✓ 支持按完成状态筛选 POST /api/todos ✓ 创建任务成功 ✓ title 为空时返回 400 PUT /api/todos/:id ✓ 更新任务成功 ✓ 更新不存在的任务返回 404 DELETE /api/todos/:id ✓ 删除任务成功 GET /api/stats ✓ 返回正确的统计数据 Tests: 10 passed, 10 total4.4 最终项目结构todo-api/ ├── src/ │ ├── app.js # Express 主应用 │ └── db.js # 数据库封装 ├── tests/ │ └── app.test.js # Jest 单元测试 ├── package.json ├── .gitignore ├── README.md └── todos.db # SQLite 数据库自动生成5. 常见报错排查401、local proxy failed、reading choices5.1 401 Unauthorized这是最常见的。报错长这样API Error: 401 {type:error,error:{type:authentication_error,message:invalid x-api-key}}三个原因Key 填错、Base URL 没改、settings 文件没生效。排查顺序先cat ~/.claude/settings.json确认ANTHROPIC_BASE_URL是https://taotoken.net/api再确认ANTHROPIC_AUTH_TOKEN是完整的sk-开头字符串。如果你之前用 OAuth 登录过~/.claude/.credentials.json会覆盖 settings先删掉它再重启 Claude Code。5.2 local proxy failedError: local proxy failed: dial tcp 127.0.0.1:7890: connect: connection refused这个报错说明你的系统里有个代理配置指向了本地端口但那个端口没有服务在跑。检查HTTP_PROXY/HTTPS_PROXY环境变量echo $HTTP_PROXY echo $HTTPS_PROXY如果有值unset掉再重启终端。Claude Code 走 TaoToken 通道不需要额外代理直连即可。5.3 reading choices 报错Error: reading choices - Cannot read properties of undefined这个通常出现在你用 OpenAI 兼容格式去请求 Anthropic 端点的时候。Claude Code 走的是 Anthropic Messages API响应体里是content数组不是choices。如果你在 Cline 里配了 OpenAI 格式的 Base URL改成 Anthropic 格式或者确认 TaoToken 的/api路径支持你要用的协议。三件套再核对一遍Base URL 是https://taotoken.net/apiKey 是sk-开头Model ID 是claude-sonnet-4-5-20250929这种完整格式。5.4 OAuth 相关报错Error: OAuth token expired, please re-authenticateClaude Code 的 OAuth 流程和 API Key 流程是互斥的。如果你在 settings 里配了ANTHROPIC_AUTH_TOKEN就不需要再走 OAuth。报这个错说明它还在尝试读旧的 OAuth 凭证。删掉~/.claude/.credentials.json确认 settings 里的 AUTH_TOKEN 有效重启即可。5.5 SQLite 文件锁报错Error: SQLITE_BUSY: database is locked跑 Jest 的时候如果没加--runInBand多个测试文件并行会抢同一个todos.db文件锁。改package.json的 test 脚本加上--runInBand或者每个测试文件用独立的数据库路径。6. 把通道固定下来项目才能持续跑项目跑通之后真正影响效率的不是代码写得多快而是通道稳不稳。我现在的做法是把 TaoToken 的 Key 写进项目级的.claude/settings.json跟着仓库走换机器 clone 下来就能用。API Key 在控制台生成和管理地址是 https://taotoken.net/api-keys 接入文档在 https://taotoken.net/doc 里面有 Claude Code、Cline、Codex 各自的配置示例。如果你只是偶尔验证一下模型输出用模型对话页面就够了https://taotoken.net/model-chat 。但如果你像我一样长期用 Claude Code 写项目、跑 Agent建议直接上 Coding Planhttps://taotoken.net/coding-plan 按量计费比单次调用划算而且 Key 可以跨工具复用。最后留一个实用技巧Superpowers 的 Skills 是可以自定义的。你可以在~/.claude/plugins/superpowers/skills/下面新建自己的 Skill 目录写一个SKILL.md描述触发条件和执行步骤下次/superpowers.你的skill名就能调用。我给自己加了一个「生成 API 文档」的 Skill每次项目收尾直接跑省得手写 README。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑