关于 Paths-LE
Paths-LE 从代码、配置文件和文本中提取文件路径,供开发者检查导入、资源引用和路径配置。除编辑器和命令行提取外,它还可扫描工作区,并由 CLI 检查路径在文件系统中的状态。
主要功能
- 01提取代码与配置中的文件路径
- 02解析导入、HTML 属性和 CSS 引用
- 03提供路径类别及源位置
- 04扫描工作区并汇总重复路径
- 05CLI 可检查路径的文件系统状态
适用场景
- 01检查项目中的本地导入路径
- 02盘点 HTML 与 CSS 的资源引用
- 03查找工作区中缺失或越界的路径
MCP 相关
MCP 服务通过 stdio 提供 extract_paths 工具,接收内容并返回路径类别和位置。它按原样报告路径,不解析工作区路径或访问磁盘。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| dedupe | boolean | 否 | 将重复路径折叠为首次出现的路径。 |
| format | enum | 否 | 文档格式。接受常见扩展名和别名。省略此项和 `filename` 时,将通用扫描文本。csv | tsv | toml | dotenv | javascript | typescript | json | html | css | yaml | markdown |
| content | string | 是 | 要扫描的文档文本。 |
| filename | string | 否 | 用于推断格式的文件名(当 `format` 未提供时),例如 "tsconfig.json"。 |
| maxResults | integer | 否 | 返回路径数量上限(默认值为 500)。meta.truncated 报告是否有结果被丢弃。 |
详细介绍
Paths-LE:轻松提取路径
一键提取当前文件中的所有文件路径
JavaScript、TypeScript、JSON、YAML、HTML、CSS、TOML、CSV 和 Environment 文件——以及通过文本扫描处理的其他所有文件
觉得有用? 点赞或评分可以让其他开发者找到它—— ★ GitHub · ★ Open VSX · ★ Marketplace
功能
打开文件,运行 Paths-LE: Extract Paths,文档中的每个文件路径都会出现在新的编辑器中——然后可在其中去重和排序。适用于 VS Code,以及 Cursor 和 VSCodium 等基于 VS Code 的编辑器(可从 Open VSX 安装)。
- 导入分析 — 提取 JS/TS 中的本地导入,包括多行导入语句;会过滤掉 npm 包名称
- 资源审查 — 提取 HTML/CSS 中所有的
src、href、srcset、url()和@import - 配置审查 — 提取 JSON/JSONC、YAML、TOML、CSV 和
.env文件中的类路径值 - 其他文件 — Python、Go、Markdown、XML、Dockerfile 等:无需解析器,通过文本扫描查找带引号的文件名以及任何包含路径分隔符的字符串
安装
| 位置 | 可用功能 | 安装 |
|---|---|---|
| VS Code | 在编辑器中一键提取路径 | Marketplace |
| Cursor、VSCodium、Windsurf | 同一扩展 | Open VSX |
| 终端或 CI 步骤 | 对整个目录树执行同样的操作,并返回退出码 | npx paths-le · npm 或 cargo install paths-le · crates.io |
| 任何 MCP Agent,通过 Node 使用 | 通过标准输入/输出调用 extract_paths——与此二进制程序提供的工具相同 | npx paths-le-mcp · npm |
在 AI Agent 中使用
同一引擎也可作为 MCP 服务运行,因此 Agent 可以直接调用它,无需你运行命令。
| 编辑器 | 方法 |
|---|---|
| VS Code 1.101+ | 无需安装 — 扩展会在 Agent 模式下注册 extract_paths |
| Claude Code | claude mcp add paths-le -- npx -y paths-le-mcp |
| Cursor、Windsurf 及其他工具 | 将其指向 npx paths-le-mcp |
extract_paths(content, format?, filename?, dedupe?, maxResults?)
返回归类为文件、相对路径、绝对路径或 URL 的所有路径,并标注其从 1 开始计数的行号和列号。路径会按原样报告 — 不会根据工作区解析,也不会访问磁盘。
服务接收内容并返回数据 — 不会读取任何文件,也不会自行发起网络请求。该服务以 paths-le-mcp 的名称发布在 npm 上,并以 io.github.nolindnaidoo/paths-le 的名称发布在 MCP 注册表中。
手动配置 — 适用于任何带有 MCP 配置文件的宿主
大多数宿主都读取 JSON 配置。添加一个条目:
{
"mcpServers": {
"paths-le": {
"command": "npx",
"args": ["-y", "paths-le-mcp"]
}
}
}
-y 会跳过首次运行时的安装提示。如果你不想跟踪版本更新,可以固定版本 — [email protected]。
不想每次启动时都通过 npx 运行?安装一次,然后指向二进制文件:
npm install -g paths-le-mcp
{
"mcpServers": {
"paths-le": { "command": "paths-le-mcp" }
}
}
它通过标准输入输出流使用 MCP,无需环境变量、API 密钥或自行配置。要在接入任何内容前进行检查:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y paths-le-mcp
这会打印工具列表并退出 — 如果看到 extract_paths,说明服务运行正常。
Extract 会读取当前打开的文档。扫描会读取磁盘上的许多文件,并生成一份报告。
- 整个工作区:从命令面板运行
Paths-LE: Extract Paths from Workspace。 - 一个文件夹:在资源管理器中右键单击该文件夹,然后选择
Extract Paths from Folder;或者运行Paths-LE: Extract Paths from Folder并选择一个文件夹。
项目中同一路径可能会出现在许多位置,因此报告会列出所有不同的路径,使用最广泛的排在前面,并显示每条路径出现的次数和位置:
# Paths-LE workspace report
`my-project` · 4 file(s) read · 2 distinct path(s), 4 occurrence(s) in 3 file(s)
| Path | Occurrences | Files |
|---|---|---|
| `./lib/util` | 3 | 2 |
| `./config/app.json` | 1 | 1 |
## `./lib/util` (3)
- `src/a.ts` · **1:20**, **2:20**
- `src/b.ts` · **1:20**
## `./config/app.json` (1)
- `deploy.json` · **2:14**
## Could not be read (1)
- `bad.csv`: Invalid CSV: quoted field is never closed (row 1, cell 2)
这是在启用 paths-le.showPositions 时的显示方式。默认情况下该设置处于关闭状态,此时每行显示文件名和路径在该文件中出现的次数:src/a.ts (2)。剪贴板中的内容遵循 paths-le.clipboardIncludesPositions 设置,与 Extract 的行为相同。
如果文件的格式读取器无法读取该文件,报告会列出该文件及原因,不会略过。包含路径的格式错误 CSV 文件,与不包含路径的文件并不相同。
扫描会按路径原本的写法逐条报告。无论 resolution 设置为何,扫描都不会解析符号链接或相对于工作区的路径:这些设置描述的是一台计算机上的单个文档。
扫描会读取哪些内容。 文件从磁盘读取,因此不会看到未保存的编辑内容。超过安全大小限制的文件或非 UTF-8 文本文件不会被读取。扫描最多处理 5,000 个文件或 10,000 条路径记录。报告末尾会逐条列出未处理的内容,避免将一份简短报告误认为项目没有问题。
会跳过哪些内容,以及如何更改。 默认情况下,有三个开关处于开启状态,可以在设置中分别关闭:
| 开关 | 跳过的内容 |
|---|---|
scanUseDefaultExcludes | 依赖项文件夹、构建输出、工具缓存和锁文件。完整列表见下文 |
scanRespectGitignore | 项目的 .gitignore 文件中指定跳过的内容 |
scanSkipBinaryFiles | 图像、字体、归档文件及其他非文本文件 |
有两个列表可以调整扫描结果,而无需关闭开关。若要跳过更多内容,请在 scanExcludes 中添加模式。若要读取开关会跳过的内容,请将其添加到 scanAlwaysInclude:
{
// Also skip the test fixtures.
"paths-le.workspace.scanExcludes": ["**/fixtures/**"],
// Read the vendored code, though the built-in list skips it.
"paths-le.workspace.scanAlwaysInclude": ["**/vendor/**"]
}
Paths-LE: Open Settings 会在设置编辑器中打开所有这些设置。
内置列表
任何位置的文件夹:
.git、.hg、.svn、node_modules、bower_components、jspm_packages、.pnpm-store、.yarn、vendor、site-packages、Pods、Carthage、dist、build、out、target、_build、_site、dist-newstyle、zig-out、storybook-static、cdk.out、DerivedData、CMakeFiles、.next、.nuxt、.output、.svelte-kit、.angular、.astro、.docusaurus、.vuepress、.expo、.turbo、.parcel-cache、.cache、.sass-cache、.jekyll-cache、.dart_tool、.pub-cache、.gradle、.kotlin、.cxx、.externalNativeBuild、captures、ephemeral、.symlinks、.swiftpm、.build、.bundle、.stack-work、.zig-cache、.godot、elm-stuff、.vercel、.netlify、.serverless、.aws-sam、.terraform、.venv、venv、__pycache__、.tox、.nox、.mypy_cache、.pytest_cache、.ruff_cache、.ipynb_checkpoints、.eggs、coverage、htmlcov、.nyc_output、.vscode-test、.idea、.vs、xcuserdata、*.egg-info
任何位置的文件:
*.min.js、*.min.css、*.map、*.snap、*.lock、package-lock.json、pnpm-lock.yaml、npm-shrinkwrap.json、go.sum、*.pbxproj、*.iml、local.properties、output-metadata.json、.flutter-plugins、.flutter-plugins-dependencies、.packages、Generated.xcconfig、flutter_export_environment.sh、GeneratedPluginRegistrant.*、fastlane/report.xml、fastlane/test_output/**、doc/api/**
以下内容未列入其中,因为它们在许多项目中都是普通文件夹:bin、obj、tmp、logs、public、generated。生成这些内容的项目会在 git 中忽略它们,而扫描会读取 .gitignore。
影响扫描的设置位于设置下。
命令行工具
同样的提取功能也可在终端或 Agent 循环中运行:本仓库 crate/ 中的 Rust CLI 与扩展共享同一语料库——crate/fixtures/——因此,如果两者读取文档的方式有任何不同,CI 就会失败。可通过 npm 使用 npm install -g paths-le 安装(或使用 npx paths-le 运行),也可通过 crates.io 使用 cargo install paths-le 安装。两种方式安装的是同一个命令,并且输出必须逐字节完全一致。
它还能完成编辑器做不到的那一半工作:**根据当前所在的文件系统,解析它找到的内容。**每个路径都会得到一个判定——存在、缺失、超出审计目录、非规范路径,或符号链接(并注明目标)。
可通过 npm(paths-le)或 crates.io(paths-le)**安装。**两种方式安装的都是同一个 paths-le 命令。
npm install -g paths-le # or run it once: npx paths-le
cargo install paths-le
paths-le . # audit a tree; summary on stderr, JSON on stdout when piped
paths-le --strict . # count sloppily-written paths too
paths-le --no-resolve src/ # just list what is written, touch nothing
paths-le mcp # the same audit over MCP on stdio
退出代码就是答案:0 表示无问题 · 1 表示发现问题 · 2 表示问题格式错误——因此,paths-le --strict . 可直接作为 CI 步骤使用。
支持的格式
| 格式 | 语言 ID | 提取内容 |
|---|---|---|
| JavaScript / TypeScript | javascript、javascriptreact、typescript、typescriptreact | import/export … from、副作用导入、动态 import()、require()——仅文件路径,不包括包名 |
| JSON / JSONC | json、jsonc | 类似路径的字符串值(支持注释和尾随逗号) |
| HTML | html | src、href、srcset(每个条目)、action、poster 及类似属性 |
| CSS / SCSS / LESS | css、scss、less | url() 和 @import |
| TOML | toml | 类似路径的值和键 |
| CSV | csv | 类似路径的单元格 |
| 环境变量 | dotenv、env | 类似路径的变量值和名称 |
| YAML | yaml | 类似路径的标量值和键,涵盖文件中的每个文档 |
| 其他所有格式 | 任何其他语言 ID | 文本扫描:带引号的词元,以及包含路径分隔符的无分隔符字符串 |
对于 JS/TS、JSON/JSONC、HTML、CSS 和文本扫描,位置均为真实源代码位置(路径所在的准确行和列);TOML 和 YAML 的位置根据源文本确定,对于重复的相同值可能只是近似位置;CSV 的位置则是行/单元格坐标。版本字符串(1.8.1)和 IP 地址绝不会被当作路径,HTML/CSS 提取也会排除 data:/javascript: URL。裸域名(example.com、www.example.org)不算路径;以国家代码扩展名结尾的名称(例如 docs.rs)仍算路径。
文本扫描只会在引号内识别裸 name.ext。Python 文件中的 os.path 和 main.py 形式相同,除了字典外,没有规则能将它们区分开——但源代码会给文件名加引号,不会给属性访问加引号,因此引号可以起到区分作用。保存 shell 命令的 YAML 标量(run: node ./scripts/build.js)是一个包含空格的词元,因此不会从中识别出路径,这与 JSON 和 TOML 中的情况完全相同。
命令
| 命令 | 描述 |
|---|---|
Paths-LE: Extract Paths | 从当前文档中提取所有路径 |
Paths-LE: Extract Paths from Workspace | 列出工作区中每个文件里的不同路径及其所在位置 |
Paths-LE: Extract Paths from Folder | 对某个文件夹执行相同操作。也可在资源管理器中的文件夹上使用 |
Paths-LE: Deduplicate Paths | 从结果中删除重复行 |
Paths-LE: Sort Paths | 按字母顺序或长度对结果排序 |
Paths-LE: Open Settings | 打开 Paths-LE 设置 |
Paths-LE: Help | 内置文档 |
默认情况下,没有命令绑定快捷键。可在编辑器的 Keyboard Shortcuts 中为任意命令设置快捷键。
设置
| 设置 | 默认值 | 描述 |
|---|---|---|
paths-le.openResultsSideBySide | true | 在当前编辑器旁打开结果 |
paths-le.postProcess.openInNewFile | true | 在新文件中打开结果(不并排显示时) |
paths-le.showPositions | false | 显示每个路径所在的行和列 |
paths-le.copyToClipboardEnabled | false | 同时将结果复制到剪贴板 |
paths-le.clipboardIncludesPositions | false | 复制内容中包含行和列 |
paths-le.notificationsLevel | silent | all = 所有通知,important = 警告 + 错误,silent = 仅错误 |
paths-le.workspace.scanPatterns | ["**/*"] | 文件夹或工作区扫描时读取的文件 |
paths-le.workspace.scanUseDefaultExcludes | true | 跳过依赖文件夹、构建输出、缓存和锁文件 |
paths-le.workspace.scanRespectGitignore | true | 跳过项目 .gitignore 文件所排除的内容 |
paths-le.workspace.scanSkipBinaryFiles | true | 跳过图像、字体、压缩包及其他非文本文件 |
paths-le.workspace.scanExcludes | [] | 以 glob 模式指定更多要跳过的文件 |
paths-le.workspace.scanAlwaysInclude | [] | 即使上述三项规则会跳过,也要读取这些文件 |
paths-le.workspace.scanMaxFiles | 5000 | 单次扫描读取的文件数量上限 |
paths-le.workspace.scanMaxResults | 10000 | 停止读取前,单次扫描列出的出现次数上限 |
paths-le.safety.enabled | true | 对超大文件启用安全限制 |
paths-le.safety.fileSizeWarnBytes | 1000000 | 文件大小超过此值时拒绝提取 |
paths-le.safety.largeOutputLinesThreshold | 50000 | 行数超过此值时发出警告 |
paths-le.statusBar.enabled | true | 显示状态栏项目 |
paths-le.telemetryEnabled | false | 仅保存在本地的事件日志(参见隐私) |
paths-le.resolution.resolveSymlinks | false | ⚠️ 将符号链接解析为规范路径 |
paths-le.resolution.resolveWorkspaceRelative | false | ⚠️ 根据工作区文件夹解析路径 |
语言
除英语外,支持 12 种语言:
德语 · 西班牙语 · 法语 · 印度尼西亚语 · 意大利语 · 日语 · 韩语 · 葡萄牙语(巴西)· 俄语 · 乌克兰语 · 越南语 · 中文(简体)
涵盖两部分:清单(命令标题、设置名称和描述),以及扩展运行时显示的所有内容(通知、状态栏、快速选取项和提示词)。扩展会采用 VS Code 的显示语言,与编辑器当前设置的语言一致;它没有单独的语言设置。
隐私与安全
- 不访问网络。 此扩展绝不会向任何地方发送数据。
telemetryEnabled设置只会将事件写入可供你查看的本地输出通道(Paths-LE Telemetry)。 - 规范路径解析默认关闭,并会发出警告。 解析符号链接或相对于工作区的路径,可能会将绝对文件系统路径写入结果文档;首次使用前,扩展会发出警告。除非有需要,否则请将两个
resolution.*设置都保持为关闭状态。 - MCP 服务也遵循同一原则。 它接收内容作为参数并返回数据:不访问文件系统、不进行网络调用,也不收集遥测数据。你的 Agent 已有文件读取工具,因此在服务中重复实现这些工具,只会增加路径遍历攻击面,却不会带来任何新能力。如果服务导入了任何可能访问文件系统或网络的内容,
check:mcp-bundle就会导致构建失败。 - 错误通知会对主目录和类似凭据的字符串片段进行脱敏。
- 评分提示最多出现两次。 第 3 次成功使用时,扩展会询问你是否愿意评分;如果你选择了 稍后 或关闭提示,第 20 次使用时还会再询问一次。选择 不再询问 后,提示就会永久结束。将
notificationsLevel设置为important或silent也会关闭提示。计数保存在 VS Code 的扩展存储中,不会发送到任何地方;选择 评分 会在浏览器中打开你安装扩展的平台页面——VS Code Marketplace 或 Open VSX。
文档
| 内容 | 位置 |
|---|---|
| 此工具允许说明的内容——范围、输出约定、拒绝事项、非目标 | crate/SPEC.md |
| 扩展的构建与内部机制——架构、不变量、工具链、发布 | AGENTS.md |
| CLI 的构建与内部机制 | crate/AGENTS.md |
| 变更内容 | CHANGELOG.md · crate/CHANGELOG.md |
| 此工具的页面及另外十五款工具 | letools.dev/tools/paths-le |
性能
| 输入 | 大小 | 找到数量 | 耗时 | 速率 | 扫描速度 |
|---|---|---|---|---|---|
| TypeScript 导入项 | 2.10 MB | 40,000 | 19.85 ms | 2,015,130/秒 | 105.9 MB/s |
| JSON 配置 | 1.17 MB | 40,001 | 23.17 ms | 1,726,103/秒 | 50.6 MB/s |
| HTML 文档 | 1.27 MB | 40,000 | 18.64 ms | 2,146,436/秒 | 67.9 MB/s |
| CSS 样式表 | 1.57 MB | 40,000 | 16.47 ms | 2,428,210/秒 | 95.3 MB/s |
| CSV 数据 | 2.09 MB | 60,000 | 67.22 ms | 892,581/秒 | 31.1 MB/s |
在 Apple M5 Pro、24 GB RAM、Node 24.3.0 上预热后运行 7 次所得的中位数。输入由 scripts/benchmark.ts 生成,而非签入仓库,因此上方列出的大小与实际测量值完全一致。运行 bun run benchmark 可复现。
这些数据因机器而异,不会在 CI 中断言——用基准测试阻止构建,只能说明运行器当时有多忙。
测试
| 指标 | 覆盖率 |
|---|---|
| 语句 | 81.44% |
| 分支 | 72.12% |
| 函数 | 90.02% |
| 行 | 83.20% |
38 个文件中共有 537 个测试用例,另有一个在真实 VS Code 扩展宿主中运行的集成测试套件,以及一个将构建好的 .vsix 安装到干净配置文件中的端到端测试。
数据由真实运行生成的 coverage/coverage-summary.json 和 coverage/test-results.json 通过 scripts/coverage-readme.js 提取;如果本节内容发生偏差,CI 会失败。运行 bun run test:coverage 可复现;用例数以 vitest 输出为准。
LE 系列的更多工具
为每个模型眼前的工作打造的 16 款单一用途工具。每款都附带一个 Rust CLI 和一个 MCP 服务。一页尽览:letools.dev
提取
- String-LE — 提取代码库中的所有字符串,方便人工阅读
- Numbers-LE — 提取代码库中所有硬编码数字,方便人工检查
- Units-LE — 提取所有带单位的数量并统一格式,遇到含义不明确的数量时会按名称拒绝处理
- Dates-LE — 提取所有日期和时间戳,并给出每个日期和时间戳解析出的确切时刻
- IDs-LE — 提取所有 UUID、ULID、NanoID、ObjectId 和 Snowflake,并解码其中的时间
- IPs-LE — 提取所有 IP 地址、CIDR 网段和 MAC 地址,统一格式并按范围分类
- URLs-LE — 提取代码库中的所有 URL,并给出协议和确切位置
- Paths-LE — 提取代码库中的所有文件路径,并说明它们是否仍指向实际内容
- Colors-LE — 提取代码库中的所有颜色,并指出哪些颜色不在你的调色板中
检查
- Regex-LE — 查找代码库中的所有正则表达式,并报告哪些可能导致灾难性回溯
- Versions-LE — 查找某个依赖项在仓库的各个清单文件中受到不同约束的位置
- i18n-LE — 识别项目使用的 i18n 库,然后依据该库的规则审查其目录
- Scrape-LE — 在编写抓取器之前检查网页能否抓取,并说明何时无法判断
防护
- Secrets-LE — 查找代码库中的硬编码凭据,绝不在报告中打印凭据
- EnvSync-LE — 比较目录树中的 dotenv 文件,并指出哪些文件缺少哪些键
- Unicode-LE — 查找那些隐藏含义的 Unicode 字符——双向控制字符、不可见字符、同形异义字符、混合文字系统
每款工具都独立运行:没有共享的 crate,也没有发布的核心库。若有两款工具得出相同结论,那是因为这个答案经得起两次验证。
联系 — nolindnaidoo.com · GitHub · LinkedIn
nolindnaidoo 的其他项目
Rust — pixelcoords 和 pixelactions 构成一个工作循环:pixelcoords 回答 位置,pixelactions 在那里执行操作。它们有各自的工具、各自的风格——不属于 LE 系列。
- pixelcoords — 冻结屏幕,标记区域,获取像素级精确的坐标和裁剪图像 pixelcoords.dev · crates.io · docs.rs
- pixelactions — 使用经过人工验证的坐标执行交互,并确认操作已生效 pixelactions.dev · crates.io · docs.rs
许可证
MIT © nolindnaidoo
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。