实战指南:用 Tree-sitter 精炼代码结构、降低 LLM Token 消耗)
Repomix 代码压缩--compress实战指南用 Tree-sitter 精炼代码结构、降低 LLM 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代码压缩Code Compression是 Repomix 的一项实验性核心能力它基于 Tree-sitter 语法解析在保留 imports、exports、类、函数、接口等关键结构的同时剥离函数体、循环与条件逻辑等实现细节从而显著降低打包输出中的 Token 数量。本文以官方指南为主体结合仓库源码fileProcessContent.ts、parseFile.ts、TypeScriptParseStrategy.ts 等逐层剖析其原理、用法、配置与边界读完后你将能熟练用--compress为 LLM 生成骨架级代码包并理解其内部为何能做到尽力而为、永不崩溃。[!NOTE] 代码压缩属于实验性功能Repomix 官方声明它将基于用户反馈与真实使用场景持续改进见 code-compress.md。基本用法一条命令开启压缩启用代码压缩只需在 CLI 中添加--compress标志repomix --compress该标志在 CLI 定义中的完整说明是使用 Tree-sitter 解析提取核心代码结构类、函数、接口位于 cliRun.ts 的 Repomix Output Options 分组下。压缩对远程仓库同样生效可与--remote组合使用repomix --remote user/repo --compress默认输出文件名仍为repomix-output.xml可通过-o, --output file覆盖因此压缩前后除内容密度不同外其余输出流程完全一致。压缩的工作原理留下骨架删去血肉压缩算法使用 Tree-sitter 将源码解析为抽象语法树AST再通过针对每种语言的查询query与解析策略parse strategy提取并保留必要的结构元素、剔除实现细节。压缩后保留的元素函数与方法的签名参数、返回类型等接口与类型定义类结构与类属性其他关键结构元素如枚举、导入语句、装饰注释压缩后移除的元素函数与方法的实现体循环与条件语句的逻辑细节内部变量声明一切与实现相关的代码一个直观的示例原始 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语句原样保留calculateTotal的完整签名连同上方 JSDoc 注释被保留但函数体被截断interface Item因属于类型定义而完整保留。不同结构块之间以⋮----分隔。源码级原理Tree-sitter 压缩管线是如何工作的为什么选择 web-tree-sitterWASMparseFile.ts 的头部注释解释了选用 WASM 版 Tree-sitter 而非原生绑定的四个理由跨平台一致WASM 在所有平台行为一致无需原生编译零构建工具不需要 Python、C 编译器或 node-gyp任何环境npm install即可使用依赖更少所有语言解析器统一打包在repomix/tree-sitter-wasms一个包中而非 15 个独立原生包可靠性更高原生模块在部分 Node.js 版本如 Node.js v23存在已知构建问题。官方同时承认 WASM 存在一定性能开销但对压缩这一场景而言可接受。压缩在打包管线中的位置压缩并非独立于打包之外的功能而是嵌入文件内容处理管线。在 fileProcessContent.ts 中每个文件的内容处理顺序为若配置了output.removeComments先由fileManipulate的语言操纵器执行注释移除再依据该文件解析出的包含级别inclusion level判断是否执行压缩compress级别才调用parseFileparseFile返回undefined语言不支持、解析失败或 WASM 异常中止时回退使用未压缩的原始内容单个文件的失败绝不影响整个打包任务。值得注意的是压缩属于 CPU 密集型转换与注释移除一样在 worker 线程中执行而truncateBase64、removeEmptyLines、trim、showLineNumbers等轻量转换则在主线程的processFiles()中处理。一次压缩的完整数据流parseFile.ts 中parseFile的核心流程如下将文件内容按\n切分为行数组通过单例LanguageParser懒初始化失败会重试而非缓存坏实例根据文件扩展名猜测语言语言不支持则静默返回undefined取对应语言的 query 与 parser将文件解析为 AST将 query 应用到根节点获得 captures并按起始行号排序对每个 capture 调用对应语言的parseStrategy.parseCapture(...)提取结构块经filterDuplicatedChunks去重同一起始行只保留内容最长者、mergeAdjacentChunks合并相邻块用数组累积拼接避免 O(k²) 的字符串复制后以CHUNK_SEPARATOR ⋮----连接输出。整条成功路径被完整包裹在 try/catch 中任何失败语言准备、解析、WASM 运行时中止都会降级为返回undefined由调用方回退到未压缩内容确保尽力而为的语义。支持的语言与逐语言解析策略languageConfig.ts 注册了 16 种支持的语言javascript、typescript、python、go、rust、java、c_sharp、ruby、php、swift、c、cpp、css、solidity、vue、dart。每种语言都配置了扩展名列表、Tree-sitter 查询串与解析策略工厂函数例如javascriptjs/jsx/cjs/mjs/mjsx与typescriptts/tsx/mts/mtsx/cts共用TypeScriptParseStrategypython使用PythonParseStrategygo使用GoParseStrategyvue使用VueParseStrategycss使用CssParseStrategyrust、java、c_sharp、ruby、php、swift、c、cpp、solidity、dart使用通用的DefaultParseStrategy。以 TypeScript 为例看结构提取细节TypeScriptParseStrategy.ts 定义了七类捕获comment、definition.interface、definition.type、definition.enum、definition.class、definition.import、definition.function、definition.method。其关键处理逻辑包括函数/方法用正则/(?:export\s)?(?:const|let|var)\s([a-zA-Z0-9_$])\s*/提取函数名用于跨捕获去重通过findSignatureEnd定位签名结束行)后跟{、或;的行再用cleanFunctionSignature将{或之后的实现部分截掉类仅保留声明行若下一行含extends/implements则一并保留继承信息接口/类型/枚举/导入整段原样保留。查询串方面queryTypescript.ts 定义了definition.import、definition.function、definition.method、definition.class、definition.interface、definition.type、definition.enum、comment等捕获模式覆盖import_statement、function_declaration、method_definition、class_declaration、interface_declaration、type_alias_declaration、enum_declaration及箭头函数赋值lexical_declaration/variable_declaration/assignment_expressionarrow_function等节点类型——这正是前文示例中const calculateTotal (...) {...}能被识别为函数定义的原因。另外BaseParseStrategy.ts 特别强调策略实例在同语言的所有文件间共享因此解析策略必须保持无状态所有数据只能来自方法参数这保证了多文件场景下的线程安全与结果一致。通过配置文件开启压缩--compress标志等同于在配置文件中设置output.compress: true{ output: { compress: true } }在 configSchema.ts 中output.compress的类型为v.optional(v.boolean(), false)即默认值为false——不显式开启时所有文件都以原始内容打包。逐文件覆盖output.patterns配置还支持比全局开关更精细的逐文件控制。configSchema.ts 中的output.patterns允许按 glob 匹配规则为指定文件覆盖全局compress设置规则按数组顺序求值、首个匹配生效{ output: { compress: true, patterns: [ { pattern: src/**/*.ts, compress: true }, { pattern: tests/**, compress: false }, { pattern: legacy/**, directoryStructureOnly: true } ] } }注意directoryStructureOnly仅在目录结构中列出、不输出内容块优先级高于compress。这些逐文件级别会在主线程预先计算并贯穿到 worker 线程同时兼顾output.patterns覆盖与全局output.compress设置见 fileProcessContent.ts。适用场景代码压缩在以下场景中尤其有价值代码结构与架构分析快速概览整个代码库的骨架聚焦模块边界与依赖关系为 LLM 处理降低 Token 数在信息密度与上下文长度之间取得平衡让模型在有限的上下文窗口内看到更多文件高层文档撰写基于结构而非实现生成架构文档、模块说明理解代码模式与签名快速扫描 API 形状、函数参数与类型约束分享 API 与接口设计只公开契约隐藏实现便于评审与协作。与其他选项的组合使用压缩可与以下选项组合进一步控制输出密度选项作用--remove-comments移除代码注释comment-removal.md与压缩叠加可进一步减少 Token在管线中先于压缩执行--remove-empty-lines移除所有空行--output-show-line-numbers在输出中为每行添加行号例如最小化 Token 包的组合用法repomix --compress --remove-comments --remove-empty-lines需要说明的是由于压缩会截断函数体并移除实现细节它更适合作为结构快照而非完整代码交付当需要保留全部实现时如代码审查、精确调试应关闭compress并使用原始输出。注意事项与已知边界实验性官方明确标注为实验性功能输出格式与行为可能随版本演进尽力而为best-effort语义语言不支持、解析失败或 WASM 异常中止时对应文件会静默回退到未压缩内容见 fileProcessContent.ts并通过日志提示极端文件的 WASM 中止某个病态文件可能触发 WASM 运行时中止导致同一 worker 后续文件也降级为未压缩输出该影响按 worker 隔离并有日志告警见 parseFile.ts 注释策略共享约束解析策略实例被同语言所有文件共享必须在实现上保持无状态。相关资源注释移除指南通过移除注释进一步降低 Token 数配置指南在配置文件中使用output.compress与output.patterns命令行选项参考完整的 CLI 选项清单压缩核心实现压缩入口、去重与相邻块合并逻辑语言配置注册表16 种支持语言与解析策略映射TypeScript 解析策略函数/类/接口提取的具体实现内容处理管线注释移除与压缩在打包流程中的位置【免费下载链接】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),仅供参考