Repomix 二次开发指南:将仓库打包能力作为 Node.js 库集成到你的应用中
【免费下载链接】repomix📦 Repomix is a powerful tool that packs your entire repository into a single, AI-friendly file. Perfect for when you need to feed your codebase to Large Language Models (LLMs) or other AI tools like Claude, ChatGPT, DeepSeek, Perplexity, Gemini, Gemma, Llama, Grok, and more.项目地址: https://gitcode.com/GitHub_Trending/rep/repomix
Repomix 不仅能作为命令行工具将整个仓库打包成单个 AI 友好的文件,还对外暴露了完整的 Node.js API,允许你在自己的应用中直接复用文件收集、内容处理、Token 统计与远程仓库克隆等能力。本文以官方文档《作为库使用 Repomix》为骨架,结合当前仓库的源码实现,讲解runCli快捷入口、低层核心组件、远程仓库处理的安全机制,以及将 Repomix 打进自己应用时的打包注意事项,读完即可在自己的 Node.js 项目中落地这些能力。
安装
将 Repomix 安装为项目依赖即可开始使用:
npm install repomix安装完成后,你可以通过包入口文件 src/index.ts 中声明的导出符号(runCli、pack、searchFiles、collectFiles、processFiles、TokenCounter、loadFileConfig、mergeConfigs、setWasmBasePath等)按需引入对应能力。
基本用法:通过runCli复用 CLI 全部能力
与命令行等价的编程入口是runCli(directories, cwd, options),其实现位于 src/cli/cliRun.ts。它会完成与 CLI 完全相同的流程:校验参数、设置日志级别、路由到默认打包、远程仓库、监听模式等对应动作,最终返回包含打包结果的PackResult。
import { runCli, type CliOptions } from 'repomix'; // 使用自定义选项处理当前目录 async function packProject() { const options = { output: 'output.xml', style: 'xml', compress: true, quiet: true } as CliOptions; const result = await runCli(['.'], process.cwd(), options); return result.packResult; }参数说明:
directories:要处理的目录列表,对应 CLI 的位置参数(默认为['.']);cwd:基准工作目录,用于解析相对路径;options:CliOptions类型(定义见 src/cli/types.ts),字段与 CLI 选项一一对应。
options中除文档示例的output、style、compress、quiet外,还支持verbose、stdout、copy、include、ignore、tokenCountEncoding、tokenBudget、includeDiffs、includeLogs、remote、remoteBranch、remoteTrustConfig、watch等完整字段,凡是 CLI 支持的选项几乎都可以通过对象传入。从 cliRun.ts 的源码可以看到,runCli还会自动识别output: '-'并切换为 stdout 模式;若传入watch: true,则会先经过validateWatchOptions校验(cliRun.ts),watch与remote、stdout、stdin、copy、splitOutput等组合会被明确拒绝。
一个值得注意的细节:真正的 CLI 入口在调用runCli时会自动注入enableFileProcessors: true(见 cliRun.ts 的commanderActionEndpoint),而库调用方默认关闭文件处理器。因此,如果你通过库方式调用并希望使用input.processors中配置的外部命令处理管道,需要在选项中显式开启。
理解result.packResult
result.packResult的类型即PackResult,完整字段定义在 src/core/packager.ts,除文档列出的字段外还包括若干进阶字段:
| 字段 | 含义 |
|---|---|
totalFiles | 处理的文件数量 |
totalCharacters | 总字符数 |
totalTokens | 总 token 数(对判断 LLM 上下文是否超限很有用) |
fileCharCounts | 每个文件的字符数 |
fileTokenCounts | 每个文件的 token 数 |
gitDiffTokenCount/gitLogTokenCount | git diff / git log 部分占用的 token 数(使用--include-diffs/--include-logs时才有值) |
outputFiles | 实际写入磁盘的输出文件路径列表(启用分卷输出时为多个) |
suspiciousFilesResults | 安全扫描发现的疑似敏感信息文件结果 |
processedFiles | 处理后的文件内容与元数据 |
safeFilePaths/skippedFiles | 通过安全校验的文件路径 / 因二进制、超大等原因跳过的文件 |
处理远程仓库
runCli同样支持远程仓库:传入remote选项后,Repomix 会克隆仓库并执行打包:
import { runCli, type CliOptions } from 'repomix'; // 克隆并处理 GitHub 仓库 async function processRemoteRepo(repoUrl) { const options = { remote: repoUrl, output: 'output.xml', compress: true } as CliOptions; return await runCli(['.'], process.cwd(), options); }远程仓库的完整流程由 src/cli/actions/remoteAction.ts 驱动。除了remote选项外,还可以用remoteBranch指定分支、标签或提交,并用remoteTrustConfig控制是否信任远程仓库自带的配置文件。
远程配置信任机制
出于安全考虑,远程仓库中的repomix.config.*配置文件默认不会被加载——因为仓库内容不可信,其配置文件可能包含恶意指令。如需信任远程仓库的配置,有两种方式:
- 在选项中添加
remoteTrustConfig: true; - 或设置环境变量
REPOMIX_REMOTE_TRUST_CONFIG=true。
从 remoteAction.ts 的源码可以看到,trustRemoteConfig的判断正是cliOptions.remoteTrustConfig || process.env.REPOMIX_REMOTE_TRUST_CONFIG === 'true',两种方式等价。此外,remoteTrustConfig未开启时,CliOptions 中的skipLocalConfig、skipGlobalConfig、confineToBaseDir、skipMigration、enableFileProcessors等内部标志会被联动设置,确保不可信仓库既不能读取本机全局配置,也不能执行外部命令处理器。
使用核心组件:低层 API 自由组装
如果需要更细粒度的控制,可以绕过runCli,直接调用 Repomix 的流水线核心组件。这些函数均从包入口导出(见 src/index.ts):
import { searchFiles, collectFiles, processFiles, TokenCounter } from 'repomix'; async function analyzeFiles(directory) { // 查找并收集文件 const { filePaths } = await searchFiles(directory, { /* 配置 */ }); const rawFiles = await collectFiles(filePaths, directory); const processedFiles = await processFiles(rawFiles, { /* 配置 */ }); // 计算 token const tokenCounter = new TokenCounter('o200k_base'); // 返回分析结果 return processedFiles.map(file => ({ path: file.path, tokens: tokenCounter.countTokens(file.content) })); }各组件职责与实现要点
searchFiles(rootDir, config, explicitFiles?, confineToBaseDir?):负责按 include/ignore 规则发现文件,返回{ filePaths, emptyDirPaths }(定义见 src/core/file/fileSearch.ts)。它底层使用 globby,并按配置合并默认忽略列表、.gitignore、.ignore、.repomixignore以及.git/info/exclude等规则。注意它的第二个参数要求是完整的RepomixConfigMerged配置对象,而不是任意{}——可以先用loadFileConfig加载配置文件、再用mergeConfigs合并默认值得到。collectFiles(filePaths, rootDir, config, progressCallback?):并发读取文件内容(并发上限为 50,见 src/core/file/fileCollect.ts),返回{ rawFiles, skippedFiles },并受input.maxFileSize限制跳过超大文件。processFiles(rawFiles, config, progressCallback?):对原始文件内容做处理,包括按配置的output.patterns决定包含级别、执行--remove-comments注释剥离、--compress结构压缩等。TokenCounter:Token 统计器,构造时传入编码名(如o200k_base、cl100k_base),实现见 src/core/metrics/TokenCounter.ts。它的countTokens(content)基于gpt-tokenizer的 BPE 编码,且会将全部文本视为普通内容(不解析特殊 token)。注意countTokens调用前需要先await tokenCounter.init()完成编码数据加载。
更完整的低层流水线示例
把上述要点串起来,一个更严谨的低层用法是配合配置加载 API:
import { loadFileConfig, mergeConfigs, searchFiles, collectFiles, processFiles, TokenCounter } from 'repomix'; async function analyzeFiles(directory) { const { config: fileConfig } = await loadFileConfig(directory); const config = await mergeConfigs(fileConfig, { output: { filePath: 'output.xml', style: 'xml' }, input: { maxFileSize: 1_000_000 } }); const { filePaths } = await searchFiles(directory, config); const { rawFiles } = await collectFiles(filePaths, directory, config); const processedFiles = await processFiles(rawFiles, config); const tokenCounter = new TokenCounter('o200k_base'); await tokenCounter.init(); return processedFiles.map(file => ({ path: file.path, tokens: tokenCounter.countTokens(file.content) })); }进阶:直接调用pack()一站式打包
如果希望跳过 CLI 的日志与参数路由、以最纯粹的方式完成"搜索 → 收集 → 处理 → 生成输出 → 统计指标"全流程,可以直接使用pack(rootDirs, config, progressCallback?)(实现见 src/core/packager.ts)。它接收根目录数组与合并后的配置,返回与runCli相同的PackResult。从源码看,pack()内部还会并行启动 token 计数缓存加载与 git 变更排序预取(packager.ts),并将安全扫描与文件处理并发执行(packager.ts),是库集成场景下更贴合底层的高阶入口。
打包(Bundling)注意事项
当使用 Rolldown、esbuild 等工具把 repomix 打进你自己的应用(例如部署到 Cloudflare Workers、Serverless 环境)时,有些依赖不能被打包,且 WASM 资源需要随产物一起复制。
必须保持 external 的依赖:
tinypool——它通过文件路径生成 worker 线程,无法被静态打包。
需要复制的 WASM 文件:
web-tree-sitter.wasm→ 复制到与打包后 JS 相同的目录(--compress代码压缩功能依赖它);- Tree-sitter 各语言语法文件 → 复制到
REPOMIX_WASM_DIR环境变量指定的目录。
语言加载与 WASM 路径解析的逻辑位于 src/core/treeSitter/loadLanguage.ts,其中setWasmBasePath(basePath)以编程方式指定 WASM 目录,而REPOMIX_WASM_DIR环境变量是等效的运行期配置,两者优先级为:setWasmBasePath设置的自定义路径优先,其次才是环境变量。
仓库中有一个可直接参考的完整打包脚本:website/server/scripts/bundle.mjs。它演示了:
- 使用 Rolldown 同时打包
server与worker两个入口(对应 website/server/src/index.ts 与 website/server/src/worker-entry.ts); - 通过
external: ['tinypool']声明 external 依赖; - 将
node_modules/web-tree-sitter/web-tree-sitter.wasm复制到dist-bundled/根目录; - 将
node_modules/@repomix/tree-sitter-wasms/out下的全部语言 WASM 文件复制到dist-bundled/wasm/子目录。
实际示例:Repomix 网站的服务端集成
一个已经在生产环境落地的案例是 Repomix 官方网站本身:网站服务端将 Repomix 作为库来处理远程仓库,再通过 Worker 执行打包,最终把结果返回给浏览器端用户。相关实现分布在 website/server/src(服务端入口 index.ts、打包动作 src/actions/packAction.ts、请求处理与远程仓库逻辑位于 domains/pack),对应的行为契约可参考测试 website/server/tests/remoteRepo.test.ts 与 website/server/tests/processZipFile.test.ts。如果你正在设计"在线打包 / 代码分析平台"类的应用,这套"服务端作为库调用 + 后台 Worker 打包 + 结果透传"的架构可以直接借鉴。
小结
将 Repomix 作为库集成时,选择入口的优先级可以按如下思路:
- 最省事:用
runCli(directories, cwd, options),与 CLI 行为完全一致,适合快速复用; - 最可控:用
searchFiles→collectFiles→processFiles→TokenCounter组装自己的流水线,适合自定义中间环节(如插桩、上报进度); - 最完整:用
pack(rootDirs, config)直接获得完整打包结果与各项指标,适合服务端场景; - 部署时:牢记
tinypool保持 external、复制web-tree-sitter.wasm与语言 WASM 到指定目录,参考 bundle.mjs 即可避免最常见的打包失败。
处理不可信来源(远程仓库)时,务必保留默认的"不信任远程配置"行为,仅在明确需要时通过remoteTrustConfig: true或REPOMIX_REMOTE_TRUST_CONFIG=true放开。
【免费下载链接】repomix📦 Repomix is a powerful tool that packs your entire repository into a single, AI-friendly file. Perfect for when you need to feed your codebase to Large Language Models (LLMs) or other AI tools like Claude, ChatGPT, DeepSeek, Perplexity, Gemini, Gemma, Llama, Grok, and more.项目地址: https://gitcode.com/GitHub_Trending/rep/repomix
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考