Repomix 二次开发指南:将仓库打包能力作为 Node.js 库集成到你的应用中

Repomix 二次开发指南:将仓库打包能力作为 Node.js 库集成到你的应用中 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/repomixRepomix 不仅能作为命令行工具将整个仓库打包成单个 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基准工作目录用于解析相对路径optionsCliOptions类型定义见 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.tswatch与remote、stdout、stdin、copy、splitOutput等组合会被明确拒绝。一个值得注意的细节真正的 CLI 入口在调用runCli时会自动注入enableFileProcessors: true见 cliRun.ts 的commanderActionEndpoint而库调用方默认关闭文件处理器。因此如果你通过库方式调用并希望使用input.processors中配置的外部命令处理管道需要在选项中显式开启。理解result.packResultresult.packResult的类型即PackResult完整字段定义在 src/core/packager.ts除文档列出的字段外还包括若干进阶字段字段含义totalFiles处理的文件数量totalCharacters总字符数totalTokens总 token 数对判断 LLM 上下文是否超限很有用fileCharCounts每个文件的字符数fileTokenCounts每个文件的 token 数gitDiffTokenCount/gitLogTokenCountgit 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_CONFIGtrue。从 remoteAction.ts 的源码可以看到trustRemoteConfig的判断正是cliOptions.remoteTrustConfig || process.env.REPOMIX_REMOTE_TRUST_CONFIG true两种方式等价。此外remoteTrustConfig未开启时CliOptions 中的skipLocalConfig、skipGlobalConfig、confineToBaseDir、skipMigration、enableFileProcessors等内部标志会被联动设置确保不可信仓库既不能读取本机全局配置也不能执行外部命令处理器。使用核心组件低层 API 自由组装如果需要更细粒度的控制可以绕过runCli直接调用 Repomix 的流水线核心组件。这些函数均从包入口导出见 src/index.tsimport { 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结构压缩等。TokenCounterToken 统计器构造时传入编码名如o200k_base、cl100k_base实现见 src/core/metrics/TokenCounter.ts。它的countTokens(content)基于gpt-tokenizer的 BPE 编码且会将全部文本视为普通内容不解析特殊 token。注意countTokens调用前需要先await tokenCounter.init()完成编码数据加载。更完整的低层流水线示例把上述要点串起来一个更严谨的低层用法是配合配置加载 APIimport { 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_CONFIGtrue放开。【免费下载链接】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),仅供参考