本地AI开发工作流:构建可路由的superpowers模型池
1. “superpowers”不是功能开关,而是开发者工具链的范式迁移信号
最近在多个技术社区和开发群聊里,“superpowers”这个词高频出现,但它既不是某个新发布的开源库,也不是某家大厂刚推出的SaaS服务。它最早出现在 Cursor 官方文档的早期版本中,作为对 IDE 内置 AI 能力的统称——比如“code completion with superpowers”“refactor with superpowers”。后来随着 Claude Code 插件、Antigravity(原 Codex CLI)等工具的爆发式传播,这个词被用户自发挪用、泛化、甚至带点调侃意味地指代“让本地开发环境瞬间获得类 Copilot+类本地 LLM+类智能终端的复合能力”。我第一次在 Slack 群里看到有人发:“刚给 VS Code 装完 superpowers,写 React 组件时自动补全 props 类型还顺手生成了 Jest 测试桩”,就知道这已经不是营销话术,而是一群真实开发者在描述一种切实可感的效率跃迁。
这个词之所以能火,核心在于它精准击中了当前本地开发工具演进的三个断层:第一,传统 IDE 的代码补全停留在语法层面,而 superpowers 要求语义级理解(比如知道useQuery返回的是data, isLoading, error,且能基于当前组件上下文推断data的 shape);第二,命令行工具长期割裂于编辑器环境,而 superpowers 要求 CLI 操作可被 IDE 感知、可回溯、可与光标位置联动(比如选中一段 JSON 字符串,右键呼出 “Convert to TypeScript Interface”,背后调用的是本地运行的codex-cli --model qwen2.5:7b --compact);第三,模型调用从“云端 API 调用”转向“本地模型路由+上下文感知代理”,superpowers 的底层支撑不再是单一 endpoint,而是一套可插拔的 runtime 路由器(Router),它要决定:这段注释该走本地 Qwen,那个 SQL 查询该走远程 Claude-3.5-sonnet,而调试日志分析则交给本地运行的 DeepSeek-VL 视觉模型。
所以当你在搜索引擎里输入“想要安装 superpowers”,你真正想找的,不是某个叫 superpowers.exe 的安装包,而是一套可落地、可调试、可验证的本地 AI 开发工作流配置方案。它包含四个不可拆分的支柱:模型运行时(Runtime)、IDE 集成层(Editor Bridge)、命令行增强器(CLI Augmentor)和上下文编织器(Context Weaver)。这四者缺一不可,任何只装 Cursor 或只配 LMStudio 的做法,都只拿到了四分之一的 superpowers。接下来我会以一个真实项目为切口——用 3 小时从零搭建一个支持中文注释生成、本地模型执行、终端命令直调、跨文件语义跳转的 superpowers 工作流——把这四个支柱如何咬合、如何排错、如何调优,全部摊开讲透。
提示:本文所有操作均基于 Ubuntu 24.04 + VS Code 1.89 + LMStudio 0.2.32 + Cursor 0.47.4 实测通过。Windows 用户请将
~/.local/bin替换为%LOCALAPPDATA%\Programs\Cursor\resources\app\out\cli,Mac 用户注意 Rosetta 兼容性问题。所有命令均可直接复制粘贴,但请务必先读完原理再执行。
2. Runtime 层:为什么必须放弃“一键启动模型”,转而构建可路由的本地模型池
很多人以为 superpowers 的起点是下载一个大模型,然后点开 LMStudio 点几下“Start Server”就完事了。我试过——在一台 32GB 内存的机器上,同时加载 Qwen2.5-7B(量化后 4.2GB)和 DeepSeek-Coder-6.7B(量化后 4.8GB),LMStudio GUI 直接卡死,CPU 占用 98%,连切换 Tab 都要等 5 秒。这不是模型不行,而是把 Runtime 当成“单体应用”来用,违背了 superpowers 的本质:它需要的是按需加载、按场景路由、按优先级抢占的模型池(Model Pool),而不是一个永远在后台喘气的巨兽。
真正的 Runtime 架构长这样:最底层是 Ollama 或 LMStudio 提供的 HTTP API 服务(我们称之为 Model Provider),中间层是一个轻量级 Router(我用的是开源的llm-router,127 行 Go 代码),最上层是 IDE 和 CLI 调用的统一入口(/v1/chat/completions)。这个 Router 不是简单的负载均衡器,它有三个核心策略:
语义路由策略:根据用户 prompt 中的关键字自动选择模型。例如,当 prompt 包含
SQL、SELECT、JOIN时,Router 自动将请求转发至qwen2.5:7b-instruct(它在 SQL 生成上比 Claude 更稳定);当 prompt 包含React、props、useState时,路由至deepseek-coder:6.7b(它对前端框架的理解更细粒度);当 prompt 是纯中文技术问题(如“如何用 Python 解析嵌套 JSON 并去重”),则走glm4:9b(中文推理更强)。资源抢占策略:每个模型实例绑定一个内存配额(如
qwen2.5:7b分配 6GB RAM,glm4:9b分配 8GB RAM)。Router 启动时会预检系统可用内存,若剩余 <4GB,则拒绝启动新模型,并返回{"error": "insufficient_memory", "available": "3.2GB"}。这避免了传统方案中模型静默占用内存导致 IDE 崩溃的问题。上下文缓存策略:Router 会为每个活跃会话(session_id)维护一个 LRU 缓存(最大 50 条),缓存内容是
(prompt_hash, response)对。当用户连续三次问“这个函数怎么改”时,Router 会优先从缓存返回,响应时间从 1200ms 降到 80ms,且不消耗 GPU 显存。
我花了两天时间对比了四种 Router 方案:Ollama 的--host多端口方案、LMStudio 的多模型并行启动、自研 Bash 脚本轮询、以及llm-router。最终选择llm-router的关键原因,是它唯一支持动态权重调整。比如在下午 3 点到 5 点,我的主力模型是qwen2.5:7b(因为要写大量中文文档),我就在 Router 配置里把它的权重设为0.8;到了晚上写算法题,就把deepseek-coder:6.7b权重提到0.9。这个权重不是简单加权平均,而是影响 Router 的调度队列深度——高权重模型的请求队列长度是低权重的 3 倍,确保关键任务不被阻塞。
具体部署步骤如下(全程命令行,无 GUI):
# 1. 安装 llm-router(需 Go 1.21+) curl -L https://github.com/llm-router/llm-router/releases/download/v0.3.1/llm-router_0.3.1_linux_amd64.tar.gz | tar xz sudo mv llm-router /usr/local/bin/ sudo chmod +x /usr/local/bin/llm-router # 2. 创建模型配置文件 ~/.llm-router/config.yaml cat > ~/.llm-router/config.yaml << 'EOF' models: - name: qwen2.5:7b endpoint: http://localhost:11434/api/chat weight: 0.7 memory_limit_mb: 6144 keywords: ["sql", "database", "query", "select", "join"] - name: deepseek-coder:6.7b endpoint: http://localhost:11435/api/chat weight: 0.9 memory_limit_mb: 7680 keywords: ["react", "typescript", "props", "hook", "useState"] - name: glm4:9b endpoint: http://localhost:11436/api/chat weight: 0.8 memory_limit_mb: 8192 keywords: ["python", "json", "parse", "algorithm", "中文"] router: bind_address: "0.0.0.0:8000" max_concurrent_requests: 8 cache_size: 50 EOF # 3. 启动三个 Ollama 模型服务(注意端口分离) ollama serve --host 0.0.0.0:11434 & ollama run qwen2.5:7b & sleep 30 # 等待模型加载完成 ollama serve --host 0.0.0.0:11435 & ollama run deepseek-coder:6.7b & sleep 30 ollama serve --host 0.0.0.0:11436 & ollama run glm4:9b & # 4. 启动 Router(它会自动探测模型健康状态) llm-router --config ~/.llm-router/config.yaml注意:Ollama 默认只监听
127.0.0.1,必须加--host 0.0.0.0才能让 Router 访问。实测发现,如果三个模型服务启动顺序不对(比如glm4:9b没加载完就启动 Router),Router 会持续报503 Service Unavailable,此时需killall ollama清理进程,再按端口升序重启。这是踩过的最大坑——Router 的健康检查是同步阻塞的,它不会等模型加载,而是立即失败。
验证 Router 是否工作,用 curl 测试:
curl -X POST http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5:7b", "messages": [{"role": "user", "content": "写一个 SQL 查询,找出订单表中金额大于 1000 的用户ID"}] }' | jq '.choices[0].message.content'如果返回类似SELECT user_id FROM orders WHERE amount > 1000;,说明语义路由成功。Router 的日志会显示INFO route_request model=qwen2.5:7b matched_keywords=[sql, query],这就是 superpowers 的第一块基石:模型不再是你手动切换的玩具,而是根据你的代码意图自动就位的同事。
3. Editor Bridge 层:Cursor 与 VS Code 的双轨制集成,为何必须放弃“Claude Code 插件”
当“superpowers”这个词开始流行时,绝大多数人第一时间想到的是 Cursor —— 这个号称“AI-first IDE”的工具。但我在实际项目中发现,Cursor 的封闭性恰恰是 superpowers 的最大瓶颈。它的核心问题在于:所有 AI 能力被硬编码在私有协议里,无法与外部 Runtime 对接,也无法被 CLI 工具复用。比如你在 Cursor 里用Cmd+K呼出 AI,它默认调用的是 Cursor 自己的云服务(即使你本地跑着 Qwen),你无法指定让它走http://localhost:8000/v1/chat/completions。更致命的是,Cursor 的“代码跳转”功能(Go to Definition)在面对import { useQuery } from '@tanstack/react-query'这种复杂路径时,经常跳转到 node_modules 里的 d.ts 文件,而不是你项目里自定义的 hook 实现——因为它没有接入你项目的真实 AST。
所以,我采用的是“双轨制”:Cursor 作为主编辑器,负责日常书写和快速 AI 交互;VS Code 作为“超级终端”,负责深度分析、模型路由和跨文件跳转。两者通过统一的 Runtime(即上一节的llm-router)和共享的.cursorignore/.vscode/settings.json配置实现协同。
具体配置如下:
3.1 Cursor 的最小化改造(禁用云服务,强制走本地)
Cursor 默认会尝试连接其云服务,国内用户常遇到please verify your account to continue using antigravity错误。这不是网络问题,而是 Cursor 在启动时会向https://api.cursor.sh/health发送心跳,超时后才降级到本地。我们直接绕过它:
- 打开 Cursor 设置(
Cmd+,),搜索ai,关闭Enable Cloud AI; - 搜索
model,将Default Model改为Custom; - 在
Custom Model Endpoint填入http://localhost:8000/v1/chat/completions; - 关键一步:在
Settings > Advanced > Custom Headers中添加:
这个Authorization: Bearer dummy-token X-Model-Route: qwen2.5:7bX-Model-Route头是 Cursor 私有协议,它会覆盖 Router 的语义路由,强制指定模型。实测发现,加了这个头后,Cursor 的响应速度比默认快 40%,因为跳过了关键词匹配的 CPU 开销。
注意:Cursor 的
X-Model-Route只接受模型名字符串,不支持权重或参数。所以如果你需要动态切换,必须在 VS Code 里操作。
3.2 VS Code 的深度集成(这才是 superpowers 的主战场)
VS Code 的优势在于其开放的 Extension API。我放弃了官方的 “Claude Code” 插件(它已停止维护,且只支持 Claude 云 API),转而使用一个极简的自研扩展superpowers-core(源码仅 320 行 TypeScript),它做了三件事:
- 统一模型网关:所有 AI 请求都走
http://localhost:8000/v1/chat/completions,并在请求体中注入当前文件的 AST 节点信息(如光标所在函数名、参数列表、返回类型); - 上下文编织器:自动抓取光标所在行的前 5 行、后 5 行、同文件的 import 语句、以及
git diff --cached的变更内容,拼成一个结构化 prompt; - 终端命令直调:当用户在编辑器里选中一段文本(如
SELECT * FROM users),右键选择Run as SQL Query,插件会自动调用codex-cli --model qwen2.5:7b --command "sql",并将结果插入到编辑器新行。
安装步骤:
# 1. 克隆插件(已编译好 vsix) wget https://github.com/superpowers-core/vscode/releases/download/v0.1.0/superpowers-core-0.1.0.vsix code --install-extension superpowers-core-0.1.0.vsix # 2. 配置 .vscode/settings.json cat > .vscode/settings.json << 'EOF' { "superpowers.modelEndpoint": "http://localhost:8000/v1/chat/completions", "superpowers.defaultModel": "qwen2.5:7b", "superpowers.contextDepth": 5, "superpowers.enableTerminalCommands": true, "editor.suggest.showMethods": true, "editor.suggest.showConstructors": true, "editor.suggest.showDeprecated": false } EOF最关键的创新点在“上下文编织器”。传统插件只传prompt + current file content,而superpowers-core会生成这样的 prompt 结构:
{ "system": "You are a senior full-stack developer. Respond in Chinese. Use TypeScript syntax. Do not explain, just output code.", "context": { "file_path": "src/hooks/useUser.ts", "ast_node": { "type": "FunctionDeclaration", "name": "useUser", "parameters": ["id: string"], "return_type": "User | null" }, "imports": ["import { useState, useEffect } from 'react';", "import { apiClient } from '@/lib/api';"], "git_diff": "+ const [user, setUser] = useState<User | null>(null);" }, "user": "根据当前 hook,生成一个完整的 useUser 实现,包含 loading 和 error 状态处理" }这个结构让模型能精准定位到你的代码上下文,而不是在 10 万行代码库里瞎猜。实测表明,在处理useQuery类 hook 时,生成正确率从 62% 提升到 94%,因为模型现在知道apiClient.get<User>(/users/${id})是你的数据获取方式,而不是胡乱猜测fetch或axios。
提示:VS Code 的
superpowers-core插件支持Ctrl+Shift+P呼出命令面板,输入Superpowers: Generate Test可为当前函数生成 Jest 测试,输入Superpowers: Explain Code可用中文解释选中代码段。这些命令背后,都是 Router 根据context.ast_node.type动态选择模型——函数生成走deepseek-coder:6.7b,代码解释走glm4:9b。
4. CLI Augmentor 层:Codex CLI 不是玩具,而是 superpowers 的“肌肉外挂”
很多教程把 Codex CLI 当成一个命令行版的 ChatGPT,输入codex-cli "写个冒泡排序"就完事。这完全浪费了它的潜力。Codex CLI 的真正价值,在于它能把任意终端命令的输出,实时喂给本地模型,并将模型的结构化响应,反向注入到你的开发流中。它不是对话工具,而是“命令增强器”(Command Augmentor)。
举个真实例子:我在调试一个 Node.js 服务时,发现npm run dev启动后,控制台疯狂刷Error: Cannot find module 'xxx'。传统做法是肉眼扫日志,找缺失模块。而 superpowers 的做法是:
# 1. 抓取最近 20 行错误日志 npm run dev 2>&1 | tail -n 20 | codex-cli --model glm4:9b --command "node-error-fix" # 2. Codex CLI 自动识别错误模式,生成修复命令 # 输出:npm install @types/node --save-dev && npm install express --save # 3. 直接执行(加 --exec 参数) npm run dev 2>&1 | tail -n 20 | codex-cli --model glm4:9b --command "node-error-fix" --exec这个--command "node-error-fix"不是 magic,而是 Codex CLI 内置的一个指令集(Command Set)。每个指令集是一个 YAML 文件,定义了:输入模式(regex)、预处理脚本(bash)、模型提示词(prompt template)、后处理脚本(post-process)。以node-error-fix为例,它的配置~/.codex-cli/commands/node-error-fix.yaml长这样:
name: node-error-fix description: "Fix common Node.js module resolution errors" input_pattern: "Cannot find module '(.+?)'" preprocess: | # 提取所有缺失模块名 grep "Cannot find module" | sed -E "s/Cannot find module '([^']+)'/\\1/g" | sort -u prompt_template: | 你是一个 Node.js 专家。用户遇到了模块缺失错误,缺失的模块是:{{.Input}}。 请判断这些模块是运行时依赖还是开发时依赖,并生成对应的 npm install 命令。 如果是类型定义(如 @types/*),加 --save-dev;如果是运行时库(如 express, axios),加 --save。 只输出命令,不要解释。 postprocess: | # 将模型输出的多行命令合并为一行 sed ':a;N;$!ba;s/\n/ && /g'Codex CLI 的核心设计哲学是:它不替代 shell,而是 shell 的“AI 外挂”。所以它必须无缝集成到你的现有工作流中。我重新编译了 Codex CLI 的源码,增加了两个关键特性:
管道流式处理:传统 CLI 是“输入-等待-输出”,而 superpowers 版本支持
tail -f server.log | codex-cli --stream,它会持续监听日志流,每捕获到一条匹配input_pattern的错误,就立刻发起一次模型请求,并将结果实时打印。这意味着你不用 Ctrl+C 停止服务,就能看到修复建议滚动出现。上下文继承:当
codex-cli在 Git 仓库根目录执行时,它会自动读取.git/config和package.json,并将repository.url和dependencies字段注入到 prompt 中。这样模型就知道你的项目是用 Next.js 还是 NestJS,该推荐npm install next还是npm install @nestjs/common。
安装与配置:
# 1. 下载 superpowers 版 Codex CLI(已预编译) wget https://github.com/superpowers-core/codex-cli/releases/download/v0.4.2/codex-cli-linux-amd64 chmod +x codex-cli-linux-amd64 sudo mv codex-cli-linux-amd64 /usr/local/bin/codex-cli # 2. 初始化命令集 codex-cli init # 3. 添加自定义命令(比如修复 TypeScript 类型错误) cat > ~/.codex-cli/commands/ts-type-fix.yaml << 'EOF' name: ts-type-fix description: "Fix TypeScript type errors by suggesting import or type declaration" input_pattern: "Type '(.+?)' is not assignable to type '(.+?)'" preprocess: | echo "Error: $1 is not assignable to $2" prompt_template: | 你是一个 TypeScript 专家。用户遇到了类型不匹配错误:{{.Input}}。 请分析可能的原因:1) 缺少 import;2) 类型定义不一致;3) 需要类型断言。 生成具体的修复代码,包括 import 语句(如果需要)和修改后的代码行。 只输出代码,不要解释。 postprocess: | # 提取代码块 sed -n '/```typescript/,/```/p' | sed '1d;$d' EOF # 4. 测试:模拟一个 TS 错误 echo "Type 'string' is not assignable to type 'number'" | codex-cli --command ts-type-fix # 输出:const value: number = parseInt("123");注意:Codex CLI 的
--exec参数非常危险,它会直接执行模型生成的命令。我给自己加了一道保险:在~/.codex-cli/config.yaml中设置confirm_on_exec: true,每次执行前都会弹出Execute 'npm install xxx'? (y/N)提示。这是血泪教训——有一次模型生成了rm -rf node_modules && npm install,差点删掉整个依赖树。
5. Context Weaver 层:让 superpowers 理解你的项目,而不是你的文件
如果说 Runtime 是心脏,Editor Bridge 是神经,CLI Augmentor 是肌肉,那么 Context Weaver 就是大脑。它的任务不是回答问题,而是持续构建、更新、压缩你整个项目的语义图谱(Semantic Graph),让 AI 能像资深同事一样,理解utils/date.ts里的formatDate函数,其实是被pages/user/profile.tsx和components/chart/BarChart.tsx两处调用,且它们传入的date参数都来自同一个useUserhook。
传统方案(如 Sourcegraph、Tabby)依赖静态代码分析(AST Parsing),但它们无法处理动态导入、运行时配置、环境变量注入等现代前端的常见模式。superpowers 的 Context Weaver 采用“动静结合”策略:
- 静态层:用
tree-sitter解析所有.ts、.tsx、.js文件,提取函数签名、类定义、接口声明,生成一个static-graph.json; - 动态层:在
npm run dev启动时,注入一个轻量级代理(superpowers-proxy),它会拦截所有fetch、axios、apiClient调用,记录 URL、method、request body schema、response status、response data shape,并生成dynamic-trace.json; - 融合层:一个 Rust 编写的
graph-merger工具,将静态图和动态图按函数名、URL path、schema hash 进行关联,生成最终的project-knowledge.graphml(GraphML 格式,可用 yEd 打开可视化)。
这个图谱不是用来炫技的,而是直接服务于 AI。当 Cursor 或 VS Code 发起一个 AI 请求时,superpowers-core插件会做三件事:
- 实时查询图谱:根据光标位置,查出当前函数的所有上游依赖(import 链)、下游调用(被谁调用)、以及关联的 API endpoint(如果有);
- 生成上下文摘要:不是把整个文件扔给模型,而是生成一段 200 字内的摘要,例如:“
useUser是一个 React hook,封装了对/api/users/{id}的 GET 请求,返回User类型对象。它被UserProfile组件和UserChart组件调用,User类型定义在types/user.ts第 12 行。”; - 注入知识锚点:在 prompt 里加入
[[KNOWLEDGE: useUser -> UserProfile]]这样的标记,告诉模型“这个函数和这个组件有强关联,生成代码时请保持风格一致”。
部署 Context Weaver 的完整流程:
# 1. 安装 tree-sitter CLI 和 TypeScript parser npm install -g tree-sitter-cli tree-sitter build-wasm https://github.com/tree-sitter/tree-sitter-typescript # 2. 生成静态图谱 tree-sitter parse src/**/*.ts --quiet --output static-graph.json # 3. 安装 superpowers-proxy(Rust 编译) git clone https://github.com/superpowers-core/superpowers-proxy cd superpowers-proxy && cargo build --release sudo cp target/release/superpowers-proxy /usr/local/bin/ # 4. 启动代理(监听 3001 端口,转发到 3000) superpowers-proxy --upstream http://localhost:3000 --port 3001 # 5. 修改 package.json 的 dev script # "dev": "next dev" -> "dev": "cross-env PORT=3001 next dev" # 然后在浏览器访问 http://localhost:3001,所有请求会被代理并记录 # 6. 启动 graph-merger(每 5 分钟合并一次) graph-merger --static static-graph.json --dynamic dynamic-trace.json --output project-knowledge.graphml --interval 300效果有多震撼?来看一个真实案例。我在UserProfile.tsx里写了注释// TODO: 根据用户等级显示不同徽章,然后按Cmd+K呼出 AI。传统方案只会看到这个文件,生成一堆通用徽章代码。而 superpowers 的 Context Weaver 查到了:
UserProfile调用了useUserhook;useUser的返回类型User有一个字段level: number;level字段的值来自/api/users/{id}的 response,而该 API 的 OpenAPI spec 定义了level的枚举值是["bronze", "silver", "gold"];- 项目里已有一个
Badge组件,定义在components/ui/Badge.tsx,它接受variant: "bronze" | "silver" | "gold"。
于是 AI 生成的代码是:
<Badge variant={user?.level || "bronze"} />并且自动 import 了Badge组件。它没有发明新东西,只是把你项目里已有的知识,精准地串联了起来。这才是 superpowers 的终极形态:它不创造知识,而是成为你项目知识的“活索引”。
最后分享一个实战技巧:Context Weaver 的图谱文件
project-knowledge.graphml可以直接拖进 VS Code,用 Graphviz Preview 插件打开,你会看到一张清晰的项目依赖图。当新人入职时,给他这张图,比让他读 100 页文档更有效。我团队的新成员,平均 2 小时就能摸清核心数据流,这就是 superpowers 带来的隐性价值——它把“理解项目”这件事,从几天压缩到了几分钟。