Repomix 代码压缩--compress深度指南基于 Tree-sitter 的结构化提取与 Token 优化实战【免费下载链接】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 提供的一项实验性功能它利用 Tree-sitter 对源码进行语法解析从每个文件中智能提取函数签名、类定义、接口与类型声明、导入语句等结构性骨架同时移除函数体、循环与条件逻辑、内部变量等实现细节从而在不丢失代码库结构信息的前提下大幅压缩体积、降低喂给 LLM 的 Token 数量。本指南将带你从 CLI 命令与配置文件两个入口启用压缩深入源码级实现原理AST 解析、查询捕获、分块去重合并并给出可复制的配置示例与组合用法帮助你针对结构分析、架构理解、API 设计分享等场景快速落地。[!NOTE] 这是一个实验性功能Repomix 团队会根据用户反馈和真实使用情况持续迭代改进见 配置文件 中compress默认关闭的设计。快速上手两条命令开启压缩压缩功能通过--compress标志启用与普通的打包流程完全兼容# 压缩当前目录下的代码 repomix --compress也可以直接处理远程仓库将压缩与远程拉取组合使用repomix --remote user/repo --compress此外从 CLI 预设配置cliRun.ts可以看到--minimize与--reduce两个预设同样包含--compress标志可以作为等价的快捷入口。命令行传入的--compress最终会在 defaultAction.ts 中被写入合并后的配置对象cliConfig.output.compress与配置文件中的设置以相同的方式生效。压缩的原理保留骨架删除血肉压缩算法的核心流程实现在 parseFile.ts将文件内容按行拆分并交给web-tree-sitterWASM 版 Tree-sitter解析成抽象语法树AST根据文件扩展名匹配语言配置加载对应的查询Query文件在 AST 上执行查询并收集所有捕获节点captures捕获节点按起始行排序后交给该语言对应的解析策略Parse Strategy逐一分块提取内容对提取出的分块做去重相同起始行只保留内容最长的块与相邻合并mergeAdjacentChunks会把行号连续的块拼接最终用⋮----分隔符连接后输出。压缩后保留的元素函数与方法的签名接口与类型定义类结构与类属性导入语句、注释、装饰器等其他结构性元素压缩后移除的元素函数与方法的实现体循环与条件逻辑等实现细节函数内部声明的局部变量与实现绑定的具体代码示例TypeScript 压缩前后对比压缩前的原始代码import { ShoppingItem } from ./shopping-item; /** * Calculate the total price of shopping items */ const calculateTotal ( items: ShoppingItem[] ) { let total 0; for (const item of items) { total item.price * item.quantity; } return total; } // Shopping item interface interface Item { name: string; price: number; quantity: number; }压缩后的输出import { ShoppingItem } from ./shopping-item; ⋮---- /** * Calculate the total price of shopping items */ const calculateTotal ( items: ShoppingItem[] ) { ⋮---- // Shopping item interface interface Item { name: string; price: number; quantity: number; }可以看到import语句、JSDoc 注释、函数签名const calculateTotal (items: ShoppingItem[]) {和interface Item的完整定义都被保留而for循环、total累加逻辑等实现体被替换为分隔符⋮----。这个分隔符是压缩输出的常量CHUNK_SEPARATORparseFile.ts用于标记被裁剪掉的内容位置。各语言的提取策略Repomix 为不同语言准备了差异化的解析策略全部位于 parseStrategies 目录TypeScriptParseStrategy专门处理函数/方法签名提取通过findSignatureEnd定位签名结束行cleanFunctionSignature去掉{或后的实现体、类定义保留extends/implements行、接口/类型/枚举/导入与注释。JavaScript 复用此策略见 languageConfig.ts。PythonParseStrategy额外提取函数与类的装饰器开头的连续行、docstring、类型别名并保留类继承信息。GoParseStrategy区分函数与方法方法会带上接收者类型、处理包声明、导入块、变量与常量声明块、struct/interface 类型定义。VueParseStrategy按捕获名与起始行生成唯一 ID 去重。DefaultParseStrategy通用兜底策略仅保留名称、注释与导入/require 相关的捕获。CssParseStrategy针对 CSS 的选择器等结构。所有策略继承自 BaseParseStrategy并通过processedChunks集合做内容去重避免同一签名被多次输出。策略实例在所有同语言文件间共享因此被设计为无状态。支持的语言清单从 languageConfig.ts 的SupportedLang类型与LANGUAGE_CONFIGS注册表languageConfig.ts可以确认当前支持 16 种语言的压缩语言文件扩展名解析策略JavaScriptjs, jsx, cjs, mjs, mjsxTypeScriptParseStrategyTypeScriptts, tsx, mts, mtsx, ctsTypeScriptParseStrategyPythonpyPythonParseStrategyGogoGoParseStrategyRustrsDefaultParseStrategyJavajavaDefaultParseStrategyC#csDefaultParseStrategyRubyrbDefaultParseStrategyPHPphpDefaultParseStrategySwiftswiftDefaultParseStrategyCc, hDefaultParseStrategyCcpp, hppDefaultParseStrategyCSScssCssParseStrategySoliditysolDefaultParseStrategyVuevueVueParseStrategyDartdartDefaultParseStrategy每种语言都配有一份 Tree-sitter 查询文件queries 目录如 queryTypescript.ts其中通过definition.function、definition.class、definition.interface、definition.import、comment等捕获名标记需要保留的结构节点。解析策略正是通过getCaptureTypesBaseParseStrategy.ts用includes()匹配这类层级化捕获名如name.definition.function命中definition.function来决定如何处理每个节点。为什么选择 WASM 版 Tree-sitterparseFile.ts 的注释说明了选择web-tree-sitterWASM而非原生node-tree-sitter的四点原因跨平台一致、无需 Python/C 编译器与 node-gyp 等构建工具、所有语言解析器统一打包在repomix/tree-sitter-wasms一个包中而不是 15 个原生包、避免某些 Node.js 版本上的原生模块编译问题。WASM 带来的性能开销在该功能的使用场景下是可接受的。配置文件全局与按文件两种开关在repomix.config.json中通过output.compress全局开启压缩{ output: { compress: true } }该配置项在 configSchema.ts 中定义为可选布尔值默认值为falseconfigSchema.ts即不开启压缩。按文件粒度控制output.patterns除了全局开关Repomix 还支持通过output.patterns对单个文件或目录做更精细的控制模式定义见 configSchema.ts{ output: { compress: false, patterns: [ { pattern: src/core/**/*.ts, compress: true }, { pattern: docs/**, directoryStructureOnly: true } ] } }其语义由 fileLevelResolve.ts 实现如下每个文件最终落在三种包含级别之一full完整内容默认、compress走 Tree-sitter 压缩管线、directory-only只出现在目录结构中内容块完全省略模式按数组顺序求值第一个匹配生效匹配项的compress标志会覆盖全局output.compressdirectoryStructureOnly优先于compress匹配但未设置任何标志时该文件强制输出完整内容glob 匹配规则与include/ignore一致使用 minimatch 且dot: true并基于正斜杠形式的路径Windows 反斜杠路径也能匹配见 fileLevelResolve.ts。与相关选项的组合用法原文档列出了三个可组合的选项这里结合源码补充各自的生效细节--remove-comments移除代码注释以进一步削减 Token。参见 注释移除指南。--remove-empty-lines移除空行。值得注意的是它在注释移除之后运行这样注释被删除后产生的空行也能被一并清理变换顺序见 fileProcess.ts。--output-show-line-numbers为输出添加行号。但源码明确约定压缩后的文件会抑制行号fileProcess.ts因为压缩输出是重组后的签名而非逐行忠实源码该抑制行为通过文件的包含级别判断对output.patterns按文件开启的压缩同样生效。完整的处理管线fileProcess.ts分两个阶段重变换阶段Worker 线程removeComments → compress。只有当存在压缩需求或需要移除注释时才启动 worker 池fileProcess.ts压缩由 fileProcessContent.ts 调用parseFile完成轻变换阶段主线程truncateBase64 → removeEmptyLines → trim → showLineNumbers。容错与降级机制压缩是尽力而为best-effort的parseFile设计为永不抛错parseFile.ts。当遇到不支持的扩展名、解析失败、或极端文件触发 WASM 运行时中止时它会返回undefined调用方 fileProcessContent.ts 会回退使用未压缩的原始内容确保单个文件的失败不会中断整个打包流程。因此个别文件压缩失败时你仍能获得完整输出只是该文件未做压缩。典型使用场景结合压缩保留结构、丢弃实现的特性它最适用的场景包括代码结构与架构分析让 LLM 在不受实现细节干扰的情况下看清模块划分、调用层级与依赖关系降低 LLM 处理成本大幅减少送入 LLM 的 Token 数量token 预算相关见 cliTokenBudget.ts其中也将压缩列为降低输出的手段之一生成高层级文档基于 API 骨架自动撰写架构说明、模块导读理解代码模式与签名快速盘点函数、方法、类型定义分享 API 设计与接口只暴露对外契约不泄露实现。相关资源注释移除指南 —— 在压缩基础上进一步删除注释、削减 Token配置指南 —— 了解如何在repomix.config.json中设置output.compress与其他输出选项命令行选项参考 ——--compress及全部 CLI 选项的完整说明压缩管线核心实现parseFile.ts、语言配置、TypeScript 解析策略相关测试parseFile.test.ts 验证了相邻分块的合并行为连续的注释函数签名被正确分组间隔的分块以⋮----分隔【免费下载链接】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),仅供参考
