llm-externalizer
Offload expensive code-scan work to cheap LLMs. Keep the fix loop local in Claude Code.
______________________________________________________________________
它做什么
此插件可帮助您使用廉价模型查看代码库,然后使用正常的Claude Code会话修复发现的问题。
这项工作分为两半:
- 扫描 --读取文件并列出出现的问题(错误、规范违规、重复代码、导入错误)。这一半被发送到您选择的廉价模型:免费的远程模型、三个模型的付费远程集成,或在您自己的机器上运行的本地模型。
- 修复 --实际编辑代码以解决每个发现。这一半保留在Claude Code中,由Claude Sonnet或Opus完成,因此您可以保持已用于任何编辑的相同审核和批准流程。
将修复部分保持在本地意味着昂贵的模型只在实际需要时才接触代码。扫描部分在廉价方面完成了所有缓慢的读取工作。
______________________________________________________________________
目录
- 运作原理
- 特性
- 需求
- 安装
- 首次运行
- 插件命令 (
/llm-externalizer:*--您在Claude Code中键入的内容) - MCP工具 (直接工具调用——用于技能、自定义代理、脚本)
- 代理 (内部,由命令派遣)
- 配置
- 故障排除
- 插件结构
- 贡献
- 许可证
______________________________________________________________________
运作原理
┌─────────────────────────────────────────────────────────────────────────┐
│ YOUR CLAUDE CODE SESSION (local — Sonnet / Opus / Haiku) │
│ │
│ /llm-externalizer:llm-externalizer-scan-and-fix │
│ │ │
│ │ 1. auto-discover codebase via git ls-files │
│ │ 2. call MCP tool "scan_folder" or "code_task" ───────┐ │
│ │ │ │
│ │ ▼ │
│ │ ┌─────────────────────────────────────────────────┐ │
│ │ │ MCP SERVER (bundled with plugin) │ │
│ │ │ │ │
│ │ │ FFD-batches files into ~400 KB payloads │ │
│ │ │ Streams each batch to the configured backend: │ │
│ │ │ • OpenRouter ensemble (3 models in parallel) │ │
│ │ │ • OpenRouter single model │ │
│ │ │ • LM Studio / Ollama / vLLM / llama.cpp │ │
│ │ │ • Nemotron free tier │ │
│ │ │ │ │
│ │ │ Writes per-file / per-group / merged reports │ │
│ │ │ to ./reports/llm-externalizer/*.md │ │
│ │ └─────────────────────────────────────────────────┘ │
│ │ │ │
│ │ 3. receive report paths (only paths — never bodies) │ │
│ │ 4. dispatch FIXER SUBAGENTS (local Claude Sonnet/Opus) │
│ │ • parallel: up to 15 concurrent, one per report │
│ │ • serial: one bug at a time from an aggregated list │
│ │ │
│ │ EACH FIXER subagent: │
│ │ a. reads ONE report from disk │
│ │ b. verifies every finding against the real source │
│ │ c. rejects false positives / hallucinations │
│ │ d. applies a minimal Edit only on REAL defects │
│ │ e. runs the language linter, re-verifies │
│ │ f. writes a .fixer.*.md summary │
│ │ │
│ │ 5. join-script merges all fixer summaries into one report │
└─────────────────────────────────────────────────────────────────────────┘一行总结。 MCP服务器是扫描引擎;您的Claude Code会话是修复引擎。只有文件路径越过边界——编排器上下文从不读取报告正文。
______________________________________________________________________
特性
- 扫描外部化 --31个MCP工具,用于代码审查、重复搜索、导入/引用验证、规范合规性检查和批量LLM驱动的结构化输出提取(大规模侦察),所有这些都由您选择的本地或远程LLM支持。
- 修复循环保持本地 --修复程序由您的Claude Code Sonnet/Opus会话应用,而不是由外部LLM应用。你可以在不放弃编辑控制权的情况下获得乐团的第二意见。
- 假阳性感知修复器 --每个修复程序子代理在编辑之前都会运行一个验证过程(文件读取+流跟踪)。根据经验,约15-30%的总体发现是假阳性;修理工用键入的理由拒绝了他们。
- 17个插件命令 --9基地(
discover,configure,change-model,benchmark,search-existing-implementations,scan-and-fix,scan-and-fix-serially,fix-report,fix-found-bugs)+8名群众侦察员(mass-scout-register,mass-scout-preclassify,mass-scout-estimate,mass-scout,mass-scout-search,mass-scout-search-xjob,mass-scout-get,mass-scout-export).完整列表在 插件命令. - 31个MCP工具 --15基地(
chat,code_task,scan_folder,compare_files,check_references,check_imports,check_against_specs,search_existing_implementations,batch_check,discover,reset,get_settings,or_model_info,or_model_info_table,or_model_info_json)+16名群众侦察员(mass_scout_register,mass_scout_preclassify,mass_scout_estimate,mass_scout,mass_scout_search,mass_scout_search_xjob,mass_scout_get,mass_scout_export,mass_scout_jobs_list,mass_scout_audit_sample,mass_scout_body_get,mass_scout_build_fieldset,mass_scout_propose_fieldset,mass_scout_list_bundled_fieldsets,mass_scout_diff,mass_scout_chain).完整列表在 MCP工具. - 5内部代理人 --审阅者+4个修复器变体(并行/串行×Sonnet/Opus)。由命令调度,从不直接调用。看 代理.
- 3种后端模式 —
local(顺序),remote(并行、单一模型),remote-ensemble(平行,三个模型→ 合并报告)。 - 6个后端预设 --LM工作室、Ollama、vLLM、llama.cpp、通用本地、OpenRouter。
- 自动配料 --First Fit Reducing垃圾箱打包每个LLM请求1-5个文件(每批约400 KB)。LLM永远不会一次看到整个代码库。
- 文件分组 —
---GROUP:---文件列表中的标记将相关文件打包到一个请求中,并为每个组生成一个报告。 - 秘密处理 —
scan_secrets: true + redact_secrets: true是修复运行时的默认设置。任何检测到的密钥/令牌/密码都将被替换为[REDACTED:LABEL]并且扫描继续。选择退出--no-secrets. - 基于文件的输出 --每份报告都在
./reports/llm-externalizer/。只有路径流过编排器上下文(每个报告≤200字节)。 - 跨平台 --macOS、Linux、Windows。MCP服务器是一个捆绑的Node可执行文件;辅助脚本是纯Python 3.12+。
______________________________________________________________________
需求
这些是 用户 从市场上安装的要求。 下面列出了从源代码构建的其他工具 贡献→ 开发人员要求.
| 工具 | 最小值 | 为什么 |
|---|---|---|
| 克劳德代码 | 2.0+ | 插件主机 |
| Node.js+npm | 节点≥18 | 安装挂钩重建捆绑的MCP服务器 |
| python | ≥3.12 | 安装吊钩 scripts/setup.py;statusline是Python |
| 版本控制系统 | 最近有没有 | git ls-files / git rev-parse 驱动器代码库自动发现 |
| 一个后端 | - | 任一个OpenRouter API密钥 或 本地模型服务器(LM Studio、Ollama、vLLM、llama.cpp) |
______________________________________________________________________
安装
下面的每一步都是 单层可粘贴块.在终端中运行它们,而不是在Claude Code会话中运行。
1·添加市场
macOS / Linux (bash / zsh)
# Add the marketplace that hosts this plugin
claude plugin marketplace add Emasoft/emasoft-pluginsWindows (PowerShell)
# Add the marketplace that hosts this plugin
claude plugin marketplace add Emasoft/emasoft-plugins2·安装插件
# Install llm-externalizer from the Emasoft marketplace
claude plugin install llm-externalizer@emasoft-plugins然后重新启动Claude Code(或 /reload-plugins 在跑步过程中)。
3·(稍后)更新插件
# Pull the newest version published in the marketplace
claude plugin update llm-externalizer@emasoft-plugins4·(可选)卸载
# Remove the plugin
claude plugin uninstall llm-externalizer@emasoft-plugins从Claude Code内部安装
如果你喜欢对话式安装,请将此repo URL粘贴到Claude中,并要求它安装插件:
https://github.com/Emasoft/llm-externalizer-plugin______________________________________________________________________
首次运行
1·配置后端
挑选 一 以下四个选项。
A. OpenRouter (ensemble — recommended for best quality, paid)
你有 三种方式 为插件提供OpenRouter密钥。它们是按优先顺序列出的——第一个是 强烈推荐.
1.外壳环境变量(推荐)
出口 OPENROUTER_API_KEY 在您的shell rc文件中。 每 此插件中的消费者会自动拾取它:MCP服务器、状态线(🏦 剩余信用面板) llm-externalizer CLI和任何子进程Claude代码生成。没有其他配置。
macOS / Linux (bash / zsh / fish)
# Put this in ~/.zshrc, ~/.bashrc, or ~/.config/fish/config.fish
export OPENROUTER_API_KEY="sk-or-v1-..."Windows (PowerShell — persistent)
# Persist for your user account (survives reboot and new terminals)
[Environment]::SetEnvironmentVariable("OPENROUTER_API_KEY", "sk-or-v1-...", "User")Windows (cmd.exe — persistent)
setx OPENROUTER_API_KEY "sk-or-v1-..."2.设置.yaml api_key 字段(支持,不推荐)
您可以在内部的配置文件中硬编码密钥(或不同的env-var引用) ~/.llm-externalizer/settings.yaml:
profiles:
remote-ensemble-geminigrok:
mode: remote-ensemble
api: openrouter-remote
api_key: sk-or-v1-... # literal — do NOT commit this file
# api_key: $MY_CUSTOM_VAR # or a different env-var name为什么会这样 不 建议:statusline和任何其他不解析settings.yaml的子进程(CLI调用、ad-hoc脚本)将看不到密钥,因此🏦 剩余的信用面板保持空白。另外:YAML文件中的文字键是粗心的 git add 远离泄漏。
3.Claude Code插件钥匙链(支持,不推荐)
通过Claude Code将密钥存储在操作系统钥匙链中:
# Opens an interactive TUI; paste the key when prompted
claude plugin configure llm-externalizerClaude Code将值导出到MCP服务器 CLAUDE_PLUGIN_OPTION_OPENROUTER_API_KEY;服务器的 resolveEnvValue() 透明地将其映射到 OPENROUTER_API_KEY. 但是 这种映射只发生在MCP服务器进程树内部——statusline子进程和ad-hoc CLI调用在树外部运行,不会看到密钥,因此🏦 面板保持空白。
身份验证优先级
当设置了多个源时,分辨率顺序为:
- 壳牌环境
OPENROUTER_API_KEY(或配置文件的任何env变量api_keyvia点$VAR语法) - 中的文字值
settings.yaml::profiles..api_key - 克劳德代码钥匙链(
userConfig.openrouter_api_key)
默认配置文件 remote-ensemble-geminigrok 一旦其中任何一个设置好,它就会开箱即用。
B. OpenRouter free tier (Nemotron — free, single model)
与选项A相同的OpenRouter密钥(任何免费帐户都可以使用)。在中将活动配置文件切换到空闲配置文件 ~/.llm-externalizer/settings.yaml:
active: remote-free看 配置→ B.远程免费(Nemotron) 对于完整的配置文件块。
\[!警告\] 免费提供商会记录您的提示。仅在开源代码上使用。
C. LM Studio (local — free, offline)
- 从以下位置安装LM Studio ,启动它并加载模型。
- 启动本地服务器: 开发者 → 服务器 → 启动服务器.
- 通过编辑将插件切换到LM Studio配置文件
settings.yaml--看 配置.
D. Ollama (local — free, offline)
拉取一个模型并启动守护进程:
# One-time: pull the model weights (~17 GB for Qwen3.5 27B)
ollama pull qwen3.5:27b
# Start Ollama (or launch the tray app)
ollama serve然后将插件配置文件切换到 local-ollama --看 配置.
2·验证健康状况
内部克劳德代码:
/llm-externalizer:llm-externalizer-discover您应该看到您的活动配置文件、型号ID、身份验证状态和 ONLINE.
3·运行第一次扫描+修复
/llm-externalizer:llm-externalizer-scan-and-fix该命令将自动发现您的代码库,显示文件列表以供确认,运行扫描,然后在编辑前派遣本地Claude fixer子代理验证每个发现。
______________________________________________________________________
插件命令
命令在Claude Code中被斜线调用。格式为 /llm-externalizer:llm-externalizer-.
基本命令(9)
| 命令 | 目的 | 生产 |
|---|---|---|
/llm-externalizer:llm-externalizer-discover | 打印活动配置文件、模型、身份验证、上下文窗口、健康状况 | 文本摘要 |
/llm-externalizer:llm-externalizer-configure | 只读配置文件检查器(编辑 settings.yaml 更改) | 配置文件表 |
/llm-externalizer:llm-externalizer-change-model | 切换活动配置文件的型号 | 确认+新的活动型号 |
/llm-externalizer:llm-externalizer-benchmark | 在示例上运行OpenRouter模型选择工具以比较候选对象 | 基准报告 |
/llm-externalizer:llm-externalizer-search-existing-implementations | PR重复检查——“此功能是否已在任何地方实现?” | 详尽无遗 NO / YES symbol= lines= 每个文件 |
/llm-externalizer:llm-externalizer-scan-and-fix | 扫描整个代码库→ 按文件报告→ 并行固定子代理(≤15个并发)→ 已加入报告 | 按文件扫描报告+修复程序摘要+已加入报告 |
/llm-externalizer:llm-externalizer-scan-and-fix-serially | 相同扫描;在串行循环中一次修复一个错误(修复触摸共享状态时更安全) | 每个文件报告+规范错误列表+串行修复程序摘要 |
/llm-externalizer:llm-externalizer-fix-report | 在已生成的扫描报告上分派一个修复程序子代理 | 一个 .fixer.-标记摘要 |
/llm-externalizer:llm-externalizer-fix-found-bugs | 汇总中所有报告的未修复发现 ./reports/llm-externalizer/ 并连续修复 | 规范错误列表+连续摘要 |
大规模侦察司令部(8)
| 命令 | 目的 | 生产 |
|---|---|---|
/llm-externalizer:llm-externalizer-mass-scout-register | 浏览文件夹/获取文件列表,并将每个文件存储在SQLite缓存中(荣誉 .gitignore; --git-diff 增量) | 计数器行 registered=N already=M skipped_too_big=K … |
/llm-externalizer:llm-externalizer-mass-scout-preclassify | 仅脚本桶标记器 | 每个桶的计数行 |
/llm-externalizer:llm-externalizer-mass-scout-estimate | 字段集的成本/时间/上限跳过数字;荣誉 --budget-usd; --live-context 向OpenRouter查询真实的提供商上限 | 数字+每个桶的细分 |
/llm-externalizer:llm-externalizer-mass-scout | 全程运行LLM侦察;发射MCP notifications/progress 每个文件 | Markdown报告下 reports/mass_scouting/ +计数器线 |
/llm-externalizer:llm-externalizer-mass-scout-search | 每次求职(正则表达式绕过/FTS5/结构化/组合) | 点击列表(文本或 --json) |
/llm-externalizer:llm-externalizer-mass-scout-search-xjob | 跨作业联合搜索 | 合并的命中列表 |
/llm-externalizer:llm-externalizer-mass-scout-get | 按以下方式打印一行 short_id (每个作业的结果可选) | JSON行 |
/llm-externalizer:llm-externalizer-mass-scout-export | 将作业的每个结果行转储到JSONL或CSV reports/mass_scouting/ | 文件路径 |
MCP专用大规模侦察工具(8个,无斜线命令包装器): mass_scout_jobs_list, mass_scout_audit_sample, mass_scout_body_get, mass_scout_build_fieldset, mass_scout_propose_fieldset, mass_scout_list_bundled_fieldsets, mass_scout_diff, mass_scout_chain。技能和代理人直接通过以下方式解决这些问题 mcp__plugin_llm-externalizer_llm-externalizer__CLI还将它们公开为 bin/llm-externalizer mass-scout --看 --help 查看完整的旗帜列表。插件附带的捆绑字段集: code-audit, skill-audit, security-audit, pr-review (传递为 --fields-file bundled:).
Parameter reference — click to expand
/llm-externalizer:llm-externalizer-discover
没有参数。
/llm-externalizer:llm-externalizer-configure
没有参数。只读;编辑 ~/.llm-externalizer/settings.yaml 然后直接呼叫MCP reset 或重新启动。
/llm-externalizer:llm-externalizer-search-existing-implementations
| 参数 | 类型 | 必填 | 默认 | 含义 |
|---|---|---|---|---|
| `` | 位置字符串 | yes | -- | 要搜索的特征的自然语言描述 |
| `` | 位置路径 | yes | -- | 要扫描的根文件夹(方面 .gitignore 在git repos中)。接受多个根 |
| `--source-files | ||||
| ...` | 重复 | 否 | -- | 显示该功能的引用源文件。按批次上下文传递;自动排除在扫描之外 |
| `--diff | ||||
| ` | 文件路径 | no | -- | 统一差异文件以缩小范围。相互排斥 --base |
--base | git ref | no | 自动检测 origin/HEAD → main → master | 通过自动生成差异 git diff ...HEAD |
--max-files | 整数 | 否 | 10000 | 文件上限--高于 scan_folder2500是因为重复的搜索会扫描整个代码库 |
--free | flag | no | off | 使用免费的Nemotron模型。提供程序日志提示——避免在专有代码上出现 |
/llm-externalizer:llm-externalizer-scan-and-fix
| 参数 | 类型 | 必填 | 默认 | 含义 |
|---|---|---|---|---|
[target] | 位置路径 | 否 | 自动发现整个代码库 | 如果两者都有 [target] 和 --file-list 省略: git rev-parse --show-toplevel → git ls-files → 过滤器docs/examples/fixtures/binary/锁文件→ 展示精心策划的列表以供确认 |
| `--file-list | ||||
| ` | 文件路径 | no | -- | .txt 每条线有一条绝对路径,或 ---GROUP:--- / ---/GROUP:--- 标记线。 [target] 设置时忽略 |
| `--instructions | ||||
| ` | .md path | no | 内置的REAL-BUGS-ONLY量规 | 替换默认的审计量规 |
| `--specs | ||||
| ` | .md path | no | -- | Spec文件。每个批次都会看到源代码+规范,因此参考文献会根据权威列表进行验证 |
--free | flag | no | off | 免费Nemotron模型(提供程序日志提示) |
--no-secrets | 标志 | 否 | 关闭 | 默认设置为扫描+编校。 此标志同时关闭(无检测,无编辑)。仅在将秘密转移到以下位置后使用 .env |
--text | 标志 | 否 | 关闭 | 包括 .md .txt .json .yml .yaml .toml .ini .cfg .conf .xml .html .rst .csv.搭配 --instructions |
/llm-externalizer:llm-externalizer-scan-and-fix-serially
参数与 scan-and-fix修复阶段不同:一次一个修复器子代理,一次修复一个bug。
/llm-externalizer:llm-externalizer-fix-report
| 参数 | 类型 | 必填 | 默认 | 含义 |
|---|---|---|---|---|
@ 或裸路径 | 位置路径 | yes | -- | 一个扫描报告的路径。 @ 前缀被删除。路径包含 .fixer. 或 .final-report. 被拒绝 |
/llm-externalizer:llm-externalizer-fix-found-bugs
| 参数 | 类型 | 必填 | 默认 | 含义 |
|---|---|---|---|---|
@ 或裸路径 | 位置路径 | 否 | 聚合中的所有报告 ./reports/llm-externalizer/ | 如果省略,则每份没有 .fixer. 兄弟姐妹被聚合到一个规范的bug列表中 |
大规模侦察参数说明
这 mass-scout 家族经营着一家廉价的LLM(默认 qwen/qwen-2.5-7b-instruct)从数百到数百万个文件中提取每个调用定义的形状相同的结构化有效载荷。管道: 注册→ 预分类→ 估计→ 侦察员→ 搜索。参见 skills/llm-externalizer-mass-scouting/SKILL.md (及其 references/)了解完整的演练,包括故障排除流程图、样例、字段集方言和术语表。
常见的每个命令标志突出显示:
- `--db
` --每个大规模侦察分队都需要。相同的SQLite注册表在各个阶段共享。
- `--fields-file
--接受绝对路径或 bundled: 速记法(code-audit, skill-audit, security-audit, pr-review`).
--budget-usd上estimate--硬门;当预测超出预算时,拒绝安排。--live-context上estimate和mass-scout--查询OpenRouter以获取活动提供商的真实信息context_length并覆盖KNOWN_PRICING(KNOWN_PRICING中烘焙的架构上限是模型的最大值,而不是提供商的实际上限)。--no-smoke-test上mass-scout--跳过5英里的连续飞行前训练,在破碎的场地上提前中止跑步。--no-resume上mass-scout--重新处理文件,即使它们已经有了结果行--job-id.--json上search,search-xjob,get,jobs-list,audit-sample,diff,list-bundled-fieldsets--下游脚本的结构化输出。- 筛选器语法
search/search-xjob/chain:'$.path:OP:value'哪里OP ∈ {=, !=, >, >=,对于每个命令,运行任何一个命令--help(或者只是bin/llm-externalizer mass-scout --help)查看完整的旗帜列表。
______________________________________________________________________
MCP工具
这些是 直接MCP工具调用 --可通过技能、自定义代理或脚本进行寻址,如 mcp__plugin_llm-externalizer_llm-externalizer__终端用户通常不会直接呼叫这些;他们使用上面的斜线命令。此处列出了用于编写自定义工作流的高级用户的工具。
分析工具
| 工具 | 目的 |
|---|---|
chat | 通用目的:总结、比较、翻译、生成 |
code_task | 使用代码审查系统提示进行代码优化分析 |
scan_folder | 递归目录扫描;按扩展名自动发现文件 |
compare_files | 配对/批量/git差异比较;LLM总结了差异 |
check_references | 自动解析本地导入,验证符号引用 |
check_imports | LLM提取进口;服务器验证磁盘上是否存在每个 |
check_against_specs | 将源代码与规范文件进行比较;报告偏差 |
search_existing_implementations | FFD批量重复狩猎;彻底的 NO / YES symbol= lines= 每个文件 |
batch_check | 多文件健全性检查包装器 |
大规模侦察工具(16)
基本的8个工具管道加上8个后续工具,用于字段集创作、作业自检和作业到作业操作。
| 工具 | 目的 |
|---|---|
mass_scout_register | 浏览文件夹/明确 file_paths;将每个body缓存在SQLite中(幂等)。荣誉 .gitignore 默认情况下; --git-diff 对于增量 |
mass_scout_preclassify | 纯脚本bucket标记器(二进制/源代码/配置/文档/日志/规则/未知) |
mass_scout_estimate | 字段集的成本/时间/上限跳过数字;荣誉 budget_usd. live_context 向OpenRouter查询真实的提供商上限 |
mass_scout | 编译字段集→ JSON 模式→ 按文件调用LLM→ 修复+验证→ 坚持;发射MCP notifications/progress 每个文件 |
mass_scout_search | 每次求职(正则表达式绕过/FTS5/结构化/组合) |
mass_scout_search_xjob | 跨岗位联合搜索;按bm25合并每个作业 |
mass_scout_get | 按以下方式打印一行 short_id (每个作业的结果可选) |
mass_scout_export | 将作业的每个结果行转储到JSONL或CSV |
mass_scout_jobs_list | 列出数据库中的每个侦察任务 |
mass_scout_audit_sample | 从作业中随机抽取N行结果进行抽查验证 |
mass_scout_body_get | 按以下方式打印缓存的文件正文 short_id (LLM看到了什么) |
mass_scout_build_fieldset | 从以下位置编写JSON字段集 name:type=desc 速记标记 |
mass_scout_propose_fieldset | LLM为自然语言目标编写了一个字段集JSON+可选示例文件 |
mass_scout_list_bundled_fieldsets | 列出接受的4个插件附带字段集 bundled::代码审计、技能审计、安全审计、公关审查 |
mass_scout_diff | 逐行比较两个作业;计数only _ a/only _ in _ b/已更改(带已更改的键) |
mass_scout_chain | 使用新的字段集重新搜索与JSON提取过滤器匹配的现有作业结果的SUBSET |
CLI将每个子命令公开为 bin/llm-externalizer mass-scout 上面列出的8个斜线命令是围绕基本8个子命令的1:1包装;其余8个仅为MCP,由技能/代理解决。这 llm-externalizer-mass-scouting skill遍历了整个流程,包括捆绑的字段集、故障排除流程图和工作示例。
实用工具
| 工具 | 目的 |
|---|---|
discover | 运行状况、配置文件、模型、身份验证令牌状态、上下文窗口、并发性 |
reset | 软重启——等待正在运行的请求,重新加载 settings.yaml,清除缓存 |
get_settings | 复制 settings.yaml 到输出目录进行只读检查 |
or_model_info / or_model_info_table / or_model_info_json | OpenRouter模型参数/定价/延迟/正常运行时间——三种格式 |
answer_mode (每个多文件分析工具)
| 模式 | 名称 | 输出 |
|---|---|---|
0 | 每个文件一份报告 | 一份 .md 每个输入文件 |
1 | 每组一份报告 | 一份 .md 每组(明确 ---GROUP:id--- 或自动分组) |
2 | 单一报告 | 合并一份 .md |
默认值。 scan_folder → 0. chat / code_task / check_* / search_existing_implementations → 2.
\[!重要\] 分批处理。 每个多文件工具都将文件打包为LLM请求,每个LLM请求包含1-5个文件(每批约400 KB)。LLM 从不 一次查看整个代码库--answer_mode仅控制报告在磁盘上的组织方式。对于跨文件分析,请使用search_existing_implementations或check_against_specs--他们的每批设计实际上与权威参考进行了验证。
高级参数(大多数工具)
| 参数 | 默认值 | 说明 |
|---|---|---|
output_dir | ./reports/llm-externalizer/ | 报告的绝对路径 |
max_retries | 1 | 在模式0下按文件重试。集 3 用于并联+重试+断路器 |
redact_regex | -- | JavaScript正则表达式--匹配变为 [REDACTED:USER_PATTERN] |
scan_secrets | true | 在发送到LLM之前,对每个输入文件运行秘密检测器 |
redact_secrets | true | 将检测到的机密替换为 [REDACTED:LABEL] 而不是中止(与 scan_secrets) |
free | false | 使用免费的Nemotron模型 |
max_payload_kb | 400 | 每个LLM请求的最大有效载荷 |
______________________________________________________________________
代理
这五名特工都是 内部的 --用户通过斜线命令而不是直接发送它们。每个任务生成都是新的(零父对话上下文);用户/项目 CLAUDE.md 以相同的方式加载 claude -p修复程序命令显示一个双选项菜单(Sonnet默认, Opus可选)发货前;以下四种修复程序变体存在,因此所选模型是预烘焙的,可以在没有 model: 以(权力)否决
| 代理 | 型号 | 角色 | 派遣人 |
|---|---|---|---|
llm-externalizer-reviewer-agent | sonnet | 只读代码审阅器。继承完整的刀具表面(SERENA、TLDR、Grepika、LSP)。仅返回报告路径 | llm-externalizer-scan 技能 |
llm-externalizer-parallel-fixer-sonnet-agent | sonnet | 验证并修复一份扫描报告中的所有发现。无国籍;写一个 .fixer.-标记摘要;最多可并行发送15个 | scan-and-fix, fix-report --当用户选择 十四行诗 在菜单上 |
llm-externalizer-parallel-fixer-opus-agent | opus | opus中的同一角色 | scan-and-fix, fix-report --当用户选择 作品 |
llm-externalizer-serial-fixer-sonnet-agent | sonnet | 从聚合列表中每次调用只修复一个错误。磁盘上有状态(更改列表)。一次一个 | scan-and-fix-serially, fix-found-bugs --当用户选择 十四行诗 |
llm-externalizer-serial-fixer-opus-agent | opus | opus中的同一角色 | scan-and-fix-serially, fix-found-bugs --当用户选择 作品 |
\[!注意\] 每个修复程序代理都运行一个强制验证通行证 在编辑任何源文件之前:打开引用行,跟踪流程,拒绝幻觉/样式建议/编辑工件/已修复的声明。无编辑的“假阳性”判决被视为成功的结果。
______________________________________________________________________
配置
设置文件位于:
- macOS/Linux:
~/.llm-externalizer/settings.yaml - 窗户:
%USERPROFILE%\.llm-externalizer\settings.yaml
该插件在首次安装时使用四个启动器配置文件创建它。用任何文本编辑器编辑它,保存,然后重新启动Claude Code——或者调用MCP reset 工具无需重新启动即可重新加载。
配置文件模式
| 模式 | 并发 | 输出 |
|---|---|---|
local | 顺序 | 一个模型 |
remote | 并行 | 一个模型 |
remote-ensemble | 并行 | 三个模型,组合报表 |
A.远程合奏(推荐)
# ~/.llm-externalizer/settings.yaml (or %USERPROFILE%\.llm-externalizer\settings.yaml)
active: remote-ensemble
profiles:
remote-ensemble:
mode: remote-ensemble
api: openrouter-remote
model: "google/gemini-2.5-flash"
second_model: "x-ai/grok-4.1-fast"
third_model: "qwen/qwen3.6-plus"
api_key: $OPENROUTER_API_KEY每个文件都由所有三个模型并行审查;这份报告综合了他们的回答。交换任何一行以尝试不同的模型——请参阅 .
B.远程免费(Nemotron)
只需在OpenRouter上调用NVIDIA的免费Nemotron层即可。一个模型,没有整体,没有成本。
active: remote-free
profiles:
remote-free:
mode: remote
api: openrouter-remote
model: "nvidia/nemotron-3-super-120b-a12b:free"
api_key: $OPENROUTER_API_KEY\[!警告\] 免费层在提供商端记录您的提示。 仅在开源代码或您不介意被记录的代码上使用此功能。对于专有代码,使用集成(选项A)或本地模型(选项C/D/E)。
C.当地——LM工作室(Qwen 3.5 27B)
active: local-lmstudio
profiles:
local-lmstudio:
mode: local
api: lmstudio-local
# Apple Silicon → use the MLX build (much faster than GGUF):
model: "mlx-community/Qwen3.5-27B-Instruct-4bit"
# Windows / Linux → use the GGUF build:
# model: "bartowski/Qwen3.5-27B-Instruct-GGUF"D.当地-Ollama
active: local-ollama
profiles:
local-ollama:
mode: local
api: ollama-local
model: "qwen3.5:27b"
# Default URL is http://localhost:11434 — override only for remote/custom hosts:
# url: "http://192.168.1.42:11434"
# Ollama needs no auth, so api_token is omitted.首次使用前,拉动模型:
# One-time — downloads ~17 GB of model weights
ollama pull qwen3.5:27bE.本地-vLLM或llama.cpp
形状与奥利玛积木相同;更改 api: 预设:
profiles:
local-vllm:
mode: local
api: vllm-local # default URL: http://localhost:8000 — auth: $VLLM_API_KEY
model: "Qwen/Qwen3.5-27B-Instruct"
local-llamacpp:
mode: local
api: llamacpp-local # default URL: http://localhost:8080 — no auth
model: "Qwen3.5-27B-Instruct"集 model: 无论您的服务器在其上发布什么ID /v1/models 终点。
后端预设
| 预设 | 协议 | 默认URL | 身份验证环境变量 |
|---|---|---|---|
openrouter-remote | OpenRouter | https://openrouter.ai/api | OPENROUTER_API_KEY |
lmstudio-local | LM工作室原生 | http://localhost:1234 | LM_API_TOKEN |
ollama-local | OpenAI兼容 | http://localhost:11434 | — |
vllm-local | OpenAI兼容 | http://localhost:8000 | VLLM_API_KEY |
llamacpp-local | OpenAI兼容 | http://localhost:8080 | — |
generic-local | OpenAI兼容 | (需要url) | LM_API_TOKEN |
环境变量
| 变量 | 由使用 |
|---|---|
OPENROUTER_API_KEY | openrouter-remote 预设 |
LM_API_TOKEN | lmstudio-local, generic-local 预设 |
VLLM_API_KEY | vllm-local 预设 |
\[!注意\] 这 推荐使用shell环境变量 提供上面列出的每个密钥。MCP服务器和statusline子进程都会自动继承它llm-externalizerCLI在没有额外管道的情况下看到相同的值。配置文件级别api_key/api_token字段和克劳德代码密钥链(userConfig.openrouter_api_key)作为后备支持,但只有MCP服务器可以看到它们——状态线🏦 面板保持空白,ad-hoc CLI调用不会拾取密钥。看 首次运行§A.OpenRouter 对于完整的优先级列表和权衡。
可选:状态线
添加一个多层状态栏,包括:模型名称、上下文窗口栏、, 实时OpenRouter信用余额、MCP代币和成本、git分支和Claude Code 5小时/7天使用限制。宽度感知(1行≥184 cols→ 6 65列以下的行),每节错误隔离,没有外部依赖关系。
最简单的方法——从Claude Code内部调用捆绑的斜线命令:
/llm-externalizer:llm-externalizer-install-statusline手动安装(跨平台Python):
macOS / Linux
# Default 3-second refresh cadence (re-tiers within 3 s of a terminal resize)
python3 "$CLAUDE_PLUGIN_ROOT/scripts/install_statusline.py"
# Or override the refresh cadence
REFRESH_INTERVAL=5 python3 "$CLAUDE_PLUGIN_ROOT/scripts/install_statusline.py"
# Bash-only equivalent (same behaviour, identical settings.json output)
bash "$CLAUDE_PLUGIN_ROOT/scripts/statusline/install.sh"Windows (PowerShell)
python3 "$env:CLAUDE_PLUGIN_ROOT\scripts\install_statusline.py"\[!注意\] OpenRouter剩余信用面板(🏦) 仅在以下情况下渲染OPENROUTER_API_KEY在您的shell环境中导出。每次刷新时,statusline都会作为一个新的子进程运行,因此插件的密钥链(userConfig.openrouter_api_key)以及每个配置文件api_key领域settings.yaml是 不可见 看吧 首次运行§A.OpenRouter 为什么shell env是让每个消费者(MCP、statusline、CLI)共享同一密钥的唯一方法。
看 scripts/statusline/README.md 查看完整的特征矩阵和宽度分层细节。
______________________________________________________________________
故障排除
跑 /llm-externalizer:llm-externalizer-discover 首先,输出会立即识别出大多数问题。
开放路由
| 症状 | 原因/修复 |
|---|---|
discover 显示 $OPENROUTER_API_KEY (NOT SET) | MCP服务器进程Env中缺少Env-var。在shell rc中设置它并重新启动Claude Code——或者通过以下方式存储它 claude plugin configure llm-externalizer |
| 令牌已解析,但扫描返回401 | 密钥已撤销或作用域不正确。检查 并再生 |
| 令牌已解决,但扫描返回429 | 已用尽信用或达到RPS上限。检查 .AIMD回退会自动恢复——只需等待 |
model not found | 型号ID settings.yaml 在上游被重命名/弃用。看看 |
| Ensemble报告仅显示1-2个模型 | 一个模型超过了其每个文件的大小限制或被临时删除。报告仍在发表,只是章节较少 |
LM 工作室
| 症状 | 原因/修复 |
|---|---|
discover 显示 service offline | LM Studio未运行,或其服务器选项卡未启动。 开发者 → 服务器 → 启动服务器 (默认端口1234) |
| 每个文件的扫描超时 | 型号太大,无法容纳RAM→ 交换。切换到较小的量子(例如。 -4bit 而不是 -8bit) |
model not loaded /错误输出 | model: 在 settings.yaml 与LM Studio在其广告中的ID不匹配 服务器 选项卡 |
| 结构化输出错误 | 更新LM Studio——旧版本不支持 response_format: json_schema |
奥拉玛
| 症状 | 原因/修复 |
|---|---|
discover 显示 service offline | Ollama守护进程未运行。从...开始 ollama serve 或启动托盘应用程序 |
model not found | 模型未被拉动。跑 ollama pull (确切的ID在 settings.yaml) |
| 第一个请求非常缓慢 | Ollama正在装载重物。后续请求命中缓存 |
| 错误的主机/端口 | 添加 url: "http://..." 到配置文件(默认为 localhost:11434) |
通用
| 症状 | 原因/修复 |
|---|---|
/llm-externalizer:... 命令不自动完成 | 插件未安装或未加载。 claude plugin list 核实; /reload-plugins 重新扫描 |
discover 可以工作,但扫描不会生成报告 | 查看最后一条助理消息 [FAILED] 原因--写入前扫描中止 |
| 预扫描秘密检测器中止运行 | 在当前版本(9.0.1+)上,默认值为 修订,而不是中止。如果你看到中止,运行 claude plugin update llm-externalizer@emasoft-plugins |
______________________________________________________________________
插件结构
Expand tree
llm-externalizer-plugin/
├── .claude-plugin/plugin.json # Plugin manifest
├── .mcp.json # MCP server launcher
├── bin/ # MCP launcher + CLI wrapper
├── commands/ # 7 slash commands
├── agents/ # 5 internal agents (reviewer + fixers)
├── skills/ # 5 auto-discovered skills
├── rules/ # Canonical usage rules bundled for users
├── mcp-server/ # Bundled TypeScript MCP server
├── scripts/ # Python: setup, publish, validators, helpers
└── docs/ # Banner, cost-comparison image, OpenRouter refs______________________________________________________________________
贡献
\[!重要\] 所有者唯一的边界。 为上游回购所有者保留了三件事 不得 由贡献者管理: 1.scripts/publish.py--更新插件版本,重新生成CHANGELOG.md、标记和推送。版本冲突属于发布经理,而不是单个PR。 1. 这.githooks/pre-push钩子 --这个钩子的存在是为了迫使主人通过publish.py当向上游推进时。在叉子上,它挡住了所有正常的东西git push并且是无用的。 1. 这.github/workflows/notify-marketplace.ymlCI --此工作流通知emasoft-plugins市场上有新版本可用。在叉子上,它要么会失败(否MARKETPLACE_PAT秘密)或试图通知市场你的分叉——两者都不需要。 下面的设置禁用了叉子上的所有三个,这样你就可以干净地推PR了。
开发人员要求
除了上述用户要求外,您还需要:
uv--Python依赖管理(uv venv --python 3.12,uv run ...)gh(GitHub CLI)-用于在您的fork上打开PR和管理工作流
1·在GitHub上分叉,然后克隆你的分叉
# Fork at https://github.com/Emasoft/llm-externalizer-plugin/fork
# Then clone — replace
git clone https://github.com//llm-externalizer-plugin.git
cd llm-externalizer-plugin# Track upstream so you can pull in new releases later
git remote add upstream https://github.com/Emasoft/llm-externalizer-plugin.git2·在叉子上禁用仅限所有者的自动化
在克隆之后,在第一次推之前,这样做一次。跳过此步骤将使您的推送拒绝或触发中断的CI运行。
2a·局部禁用预推钩
回购随附 core.hooksPath = .githooks 在其提交的配置中。在叉子上,你需要松开它。
macOS / Linux (bash / zsh)
# Unset the repo's hooksPath so git uses the default .git/hooks/ (which is empty)
git config --local --unset core.hooksPath# Verify — should print nothing (no active hooks path)
git config --local --get core.hooksPathWindows (PowerShell)
# Unset the repo's hooksPath so git uses the default .git\hooks\ (empty)
git config --local --unset core.hooksPath# Verify — should print nothing
git config --local --get core.hooksPath这pre-push脚本本身在磁盘上没有变化(它在.githooks/).你只是说说而已 *你的* git不要运行它。
2b·在你的fork上禁用GitHub Actions工作流
这 notify-marketplace.yml 每次推送时都会触发工作流 main 并且需要a MARKETPLACE_PAT 只有主人才有的秘密。这 ci.yml 工作流还运行所有者期望的gates。在分叉上禁用这两个选项,这样PR就不会发送红色CI运行。
选项A——通过 gh CLI(最快):
# Disable the workflow that notifies the marketplace (owner-only)
gh workflow disable "Notify Marketplace" --repo /llm-externalizer-plugin# (optional) Also disable CI on your fork — the upstream PR will run CI instead
gh workflow disable "CI" --repo /llm-externalizer-plugin选项B——通过GitHub web UI:
首选 https://github.com//llm-externalizer-plugin/actions,单击左侧边栏中列出的每个工作流→ ... menu → 禁用工作流.
选项C——删除fork分支(核)上的工作流文件:
如果你不希望这些工作流在你的分支上的任何地方运行,请向你的分支提交删除。不要这样做 main --它会出现在你的公关差异中。
# Only if you really want to remove the workflows from your fork's main.
# This changes the diff — don't include in a PR.
git checkout -b chore/disable-fork-ci
git rm .github/workflows/notify-marketplace.yml .github/workflows/ci.yml
git commit -m "chore: disable owner-only workflows on fork"3·构建捆绑的MCP服务器
# Installs npm deps and compiles TypeScript
python3 scripts/setup.py4·安装您的工作副本以进行本地测试
# Point Claude Code at your cloned checkout
claude plugin install "$PWD"5·创建特征分支
git checkout -b feat/6·提交前验证
# Fast local validation
claude plugin validate .# (optional) deeper CPV remote validator
uvx --from git+https://github.com/Emasoft/claude-plugins-validation --with pyyaml \
cpv-remote-validate plugin "$PWD"7·使用常规提交前缀进行提交
# The maintainer's release pipeline uses the prefix to classify changes.
# feat: — new feature (minor bump)
# fix: — bug fix (patch bump)
# docs: — documentation
# refactor: / chore: — other housekeeping
# BREAKING CHANGE: … — major bump (body or footer)
git commit -m "feat: "\[!小心\] 请勿碰撞version在plugin.json,mcp-server/package.json,或pyproject.toml在您的PR中。不要编辑CHANGELOG.md请勿奔跑scripts/publish.py合并后,所有版本工作均由维护人员完成。
8·推叉打开PR
# Push the feature branch to your fork
git push origin feat/# Open PR against Emasoft/llm-externalizer-plugin main
gh pr create --repo Emasoft/llm-externalizer-plugin --base main______________________________________________________________________
发布管道(仅限维护人员——不得作为贡献者运行)
本节记录了上游维护人员在合并PR后运行的命令。贡献者应该忽略它。上游克隆上的预推挂钩(贡献者通过步骤2a禁用)专门用于强制使用这些脚本。
仅限维护人员使用的额外工具:
git-cliff--自动计算下一个版本并重新生成CHANGELOG.md来自常规承诺(由publish.py)
# Auto-bump version from Conventional Commits, run all gates, push tag + release
python3 scripts/publish.py# Force a specific bump
python3 scripts/publish.py --patch
python3 scripts/publish.py --minor
python3 scripts/publish.py --major# Dry-run preview (still runs all checks)
python3 scripts/publish.py --dry-run# Used by the pre-push hook — runs checks, exits, no mutations
python3 scripts/publish.py --check-onlypublish.py 跑 9个强制性验证门 在任何标记或推送之前: npm ci, npm run typecheck, npm run lint, npm run build, npm test, ruff check, shellcheck, plugin.json 模式, claude plugin validate。所有操作都必须零错误通过。
______________________________________________________________________
许可证
麻省理工学院——见 许可证.
______________________________________________________________________
链接
- 市场:
- 来源:
- 问题:
