资讯动态

Repomix 代码压缩(--compress)实战指南:基于 Tree-sitter 的结构化 Token 优化

发布时间:2026/9/12 15:23:27 来源:尧图企业网站定制
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 的实验性代码压缩Code Compression功能。该功能基于 Tree-sitter 语法解析在移除函数实现体、循环与条件细节、内部变量等应用层代码的同时完整保留函数签名、接口与类型定义、类结构等关键骨架从而大幅降低打包输出的 token 数量。读完本文你将掌握--compress的命令行用法、配置文件写法、逐文件覆盖规则以及压缩管线在源码中的真实实现原理能够在为 LLM 准备代码库时按需权衡信息密度与 token 开销。什么是代码压缩代码压缩是 Repomix 提供的一项强大特性它在剥离应用实现细节的同时智能地提取核心代码结构。对于需要将整个代码库喂给大型语言模型LLM的场景这一特性尤其有价值——它能保留关于代码库的重要结构信息同时显著削减 token 数量。[!NOTE] 这是一个实验性功能团队将根据用户反馈和真实世界使用情况持续迭代改进。从压缩语义看该功能保留以下结构函数与方法签名Function and method signatures接口与类型定义Interface and type definitions类结构与继承/实现关系Class structures and properties其他重要的结构化元素如 import 语句、注释同时移除以下内容函数与方法的具体实现体循环与条件逻辑细节函数体内部的局部变量声明与实现相关的业务代码快速上手启用代码压缩最简单的启用方式是使用--compress标志repomix --compress该标志同样适用于远程仓库的打包repomix --remote user/repo --compress在命令行定义中src/cli/cliRun.ts--compress的官方说明是“使用 Tree-sitter 解析提取必要的代码结构类、函数、接口”。值得注意的是CLI 还提供了两个便于记忆的别名minimize与reduce都会展开为--compress见 cliRun.ts即repomix --minimize与repomix --compress等价。工作原理Tree-sitter 解析管线压缩算法通过 Tree-sitter 语法解析处理代码先构建抽象语法树AST再通过语言查询query捕获结构化节点最后从捕获结果中重建压缩后的内容。整个管线的核心实现在 src/core/treeSitter/parseFile.ts其处理流程如下按文件扩展名猜测语言通过LanguageParser.guessTheLang(filePath)判定语言若文件类型不受支持则静默回退为未压缩内容。加载语言解析器与查询获取对应语言的 Tree-sitter parser 和查询规则将文件内容解析为 AST。执行查询捕获对 AST 根节点执行query.captures()得到形如name.definition.function、name.definition.interface等带语义的捕获节点。按策略提取内容按节点起始位置排序后交由该语言的解析策略ParseStrategy逐节点提取骨架内容。去重与合并filterDuplicatedChunks对同一起始行的多个捕获保留内容最长者mergeAdjacentChunks将行号相邻的捕获块合并为一个连续块。拼接输出各 chunk 之间以分隔符⋮----源码中的常量CHUNK_SEPARATOR见 parseFile.ts连接。为什么选择 WASM 版 tree-sitterparseFile.ts 的头部注释解释了采用web-tree-sitterWASM而非原生绑定node-tree-sitter的四个原因跨平台一致性无需原生编译、安装零门槛不需要 Python、C 编译器、node-gyp、依赖更少所有语言解析器打包在单一包repomix/tree-sitter-wasms中而非 15 个独立原生包、可靠性更高部分 Node.js 版本与原生模块存在已知兼容问题。对于压缩功能的场景WASM 的性能开销是可接受的。支持的语言与扩展名根据 src/core/treeSitter/languageConfig.ts当前共支持 16 种语言每种语言配有对应查询与解析策略语言扩展名解析策略JavaScriptjs, jsx, cjs, mjs, mjsxTypeScriptParseStrategyTypeScriptts, tsx, mts, mtsx, ctsTypeScriptParseStrategyPythonpyPythonParseStrategyGogoGoParseStrategyRustrsDefaultParseStrategyJavajavaDefaultParseStrategyC#csDefaultParseStrategyRubyrbDefaultParseStrategyPHPphpDefaultParseStrategySwiftswiftDefaultParseStrategyCc, hDefaultParseStrategyCcpp, hppDefaultParseStrategyCSScssCssParseStrategySoliditysolDefaultParseStrategyVuevueVueParseStrategyDartdartDefaultParseStrategy查询规则按语言独立存放于 src/core/treeSitter/queries 目录如 queryTypescript.ts、queryGo.ts、queryPython.ts 等其中捕获名采用层级式命名例如 TypeScript 查询中(function_declaration name: (identifier) name.definition.function) definition.function同时捕获声明节点与函数名节点。解析策略各语言如何取舍内容解析策略基类 BaseParseStrategy.ts 定义通用行为并明确要求策略实例必须无状态跨文件共享。其中getCaptureTypes使用includes()匹配层级捕获名例如name.definition.function能正确命中definition.function——这是刻意设计而非缺陷见 BaseParseStrategy.ts。以 TypeScriptParseStrategy.ts 为例它通过CaptureType枚举区分 8 类捕获Comment、Interface、Type、Enum、Class、Import、Function、Method、Property并分别处理函数/方法调用findSignatureEnd找到签名结束行行尾为{、或;且包含)再用cleanFunctionSignature去掉行内{或之后的内容只保留签名。例如function myFunction(param1: string, param2: number): void {会被清洗为function myFunction(param1: string, param2: number): void。类仅保留类声明行若下一行包含extends或implements则一并保留如class MyService implements IService同时剥离{之后的内容。接口/类型/枚举/导入整块原样保留。注释整段保留。此外策略内置去重机制同名函数通过func:${functionName}标记去重相同签名字符串通过processedChunks集合去重避免重复输出。尽力而为Best-effort的容错设计压缩是一条“尽力而为”的管线parseFile.ts 的设计约束是任何情况下都不抛异常——语言不受支持、解析失败、甚至 WASM 运行时崩溃都会返回undefined由调用方回退为未压缩内容确保单个文件的失败不会中断整个打包流程。调用侧 src/core/file/fileProcessContent.ts 中同样体现了这一策略parseFile返回undefined时保留processedContent原值并记录 trace 日志。该文件的注释也说明压缩与注释移除同属 CPU 密集型转换在 worker 线程中执行而removeEmptyLines、showLineNumbers等轻量转换在主线程完成。压缩效果示例原始 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/行注释与interface Item全部保留而calculateTotal函数体内的total变量声明、for 循环和return语句被移除被替换为⋮----分隔符。这正是压缩的典型效果——结构完整、实现清零。该行为在测试中得到充分验证。例如 tests/core/treeSitter/parseFile.test.ts 验证了相邻函数签名与注释 chunk 的合并输出被⋮----分割为 4 个块tests/core/treeSitter/parseFile.typescript.test.ts 则逐一断言了function myFunction(param1: string, param2: number): void、const arrowFunc (a: number, b: number): number 、class MyService implements IService、class ChildClass extends ParentClass、type RequestHandler (req: Request, res: Response) Promisevoid;、import { useState, useEffect } from react;等骨架内容的精确保留以及同名函数/重复内容的去重行为。配置文件中的压缩设置除了 CLI 标志压缩也可以在配置文件中开启。将以下内容写入repomix.config.json即可全局启用{ output: { compress: true } }在配置模式src/config/configSchema.ts中output.compress为布尔类型默认值为false——即默认情况下不进行压缩需要显式开启。仓库自带的 repomix.config.json 同样以compress: false为默认状态。逐文件覆盖output.patterns更精细的控制可通过output.patterns实现。该数组的每一条目outputPatternSchema包含三个字段pattern必填glob 模式匹配方式与include/ignore一致compress可选布尔是否对该模式命中的文件启用压缩directoryStructureOnly可选布尔命中文件仅出现在目录结构中其内容块从输出中整体省略。命中规则由 src/core/file/fileLevelResolve.ts 的resolveFileLevel实现其语义为按数组顺序逐个匹配首个命中的条目生效first match wins若命中的条目设置directoryStructureOnly: true则该文件级别为directory-only此优先级高于compress否则若设置compress: true级别为compress若命中但两个标志均未设置则该文件强制使用完整内容级别full没有任何 pattern 命中时回退到全局output.compress设置为true则压缩否则完整输出。示例——只压缩docs目录下的文件{ output: { compress: false, patterns: [ { pattern: docs/**/*, compress: true } ] } }此行为有专门测试覆盖tests/core/file/fileLevelResolve.test.ts 验证了“无 pattern 且全局 compress 关闭时返回 full”“有 pattern 时按首个匹配生效”等规则tests/config/configSchema.test.ts 则校验了patterns字段的合法性如拒绝非布尔值的compress。典型使用场景代码压缩在以下场景中尤其有用分析代码结构与架构当需要让 LLM 快速理解一个仓库的整体设计时压缩后的输出保留了架构骨架去除了干扰性的实现噪音为 LLM 处理缩减 token 数量在 token 预算受限配合tokenBudget等选项时用最小的 token 开销传递最多的结构信息生成高层级文档基于保留的签名、接口与类关系可高效产出 API 概览、模块说明等文档理解代码模式与签名快速扫描函数签名、类型定义与导入关系把握代码约定分享 API 与接口设计在不泄露实现细节的前提下例如对外分享或评审接口契约仅提交结构骨架。与其他选项的组合使用压缩可以与以下选项组合使用进一步优化输出--remove-comments在压缩前移除代码注释进一步降低 token 数参见注释移除指南。从源码看该操作在 fileProcessContent.ts 中先于压缩执行先按语言移除注释再对处理后的内容做 Tree-sitter 压缩--remove-empty-lines移除所有文件中的空行--output-show-line-numbers在输出中为每一行加上行号前缀。以上三个选项的 CLI 定义均可参见 cliRun.ts。建议按需组合例如分析架构时使用--compress --remove-comments追求极致的 token 效率而分享接口设计时可仅使用--compress保留注释中的文档性信息。相关资源注释移除指南——通过移除注释进一步缩减 token配置指南——在配置文件中设置output.compress命令行选项参考——完整的 CLI 参考文档源码入口src/core/treeSitter/parseFile.ts、src/core/file/fileLevelResolve.ts、src/config/configSchema.ts测试用例tests/core/treeSitter/parseFile.typescript.test.ts、tests/core/treeSitter/parseFile.test.ts、tests/core/file/fileLevelResolve.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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价