@mcptoolshop/venvkit 0.2.5 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.es.md +143 -132
  2. package/README.fr.md +143 -132
  3. package/README.hi.md +143 -136
  4. package/README.it.md +143 -132
  5. package/README.ja.md +143 -132
  6. package/README.md +15 -4
  7. package/README.pt-BR.md +143 -132
  8. package/README.zh.md +143 -132
  9. package/dist/doctorLite.d.ts +75 -0
  10. package/dist/doctorLite.d.ts.map +1 -0
  11. package/dist/doctorLite.js +705 -0
  12. package/dist/doctorLite.js.map +1 -0
  13. package/dist/doctorLite.test.d.ts +2 -0
  14. package/dist/doctorLite.test.d.ts.map +1 -0
  15. package/dist/doctorLite.test.js +268 -0
  16. package/dist/doctorLite.test.js.map +1 -0
  17. package/dist/index.d.ts +6 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +6 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/integration.test.d.ts +2 -0
  22. package/dist/integration.test.d.ts.map +1 -0
  23. package/dist/integration.test.js +245 -0
  24. package/dist/integration.test.js.map +1 -0
  25. package/dist/mapRender.d.ts +105 -0
  26. package/dist/mapRender.d.ts.map +1 -0
  27. package/dist/mapRender.js +718 -0
  28. package/dist/mapRender.js.map +1 -0
  29. package/dist/mapRender.test.d.ts +2 -0
  30. package/dist/mapRender.test.d.ts.map +1 -0
  31. package/dist/mapRender.test.js +571 -0
  32. package/dist/mapRender.test.js.map +1 -0
  33. package/dist/map_cli.d.ts +3 -0
  34. package/dist/map_cli.d.ts.map +1 -0
  35. package/dist/map_cli.js +278 -0
  36. package/dist/map_cli.js.map +1 -0
  37. package/dist/map_cli.test.d.ts +2 -0
  38. package/dist/map_cli.test.d.ts.map +1 -0
  39. package/dist/map_cli.test.js +320 -0
  40. package/dist/map_cli.test.js.map +1 -0
  41. package/dist/runLog.d.ts +71 -0
  42. package/dist/runLog.d.ts.map +1 -0
  43. package/dist/runLog.js +98 -0
  44. package/dist/runLog.js.map +1 -0
  45. package/dist/runLog.test.d.ts +2 -0
  46. package/dist/runLog.test.d.ts.map +1 -0
  47. package/dist/runLog.test.js +327 -0
  48. package/dist/runLog.test.js.map +1 -0
  49. package/dist/scanEnvPaths.d.ts +18 -0
  50. package/dist/scanEnvPaths.d.ts.map +1 -0
  51. package/dist/scanEnvPaths.js +177 -0
  52. package/dist/scanEnvPaths.js.map +1 -0
  53. package/dist/scanEnvPaths.test.d.ts +2 -0
  54. package/dist/scanEnvPaths.test.d.ts.map +1 -0
  55. package/dist/scanEnvPaths.test.js +250 -0
  56. package/dist/scanEnvPaths.test.js.map +1 -0
  57. package/dist/taskCluster.d.ts +62 -0
  58. package/dist/taskCluster.d.ts.map +1 -0
  59. package/dist/taskCluster.js +180 -0
  60. package/dist/taskCluster.js.map +1 -0
  61. package/dist/taskCluster.test.d.ts +2 -0
  62. package/dist/taskCluster.test.d.ts.map +1 -0
  63. package/dist/taskCluster.test.js +375 -0
  64. package/dist/taskCluster.test.js.map +1 -0
  65. package/dist/vitest.config.d.ts +3 -0
  66. package/dist/vitest.config.d.ts.map +1 -0
  67. package/dist/vitest.config.js +26 -0
  68. package/dist/vitest.config.js.map +1 -0
  69. package/dist/windows.test.d.ts +6 -0
  70. package/dist/windows.test.d.ts.map +1 -0
  71. package/dist/windows.test.js +121 -0
  72. package/dist/windows.test.js.map +1 -0
  73. package/package.json +6 -2
package/README.zh.md CHANGED
@@ -1,74 +1,74 @@
1
- <p align="center">
2
- <a href="README.md">English</a> | <a href="README.ja.md">日本語</a> | <a href="README.zh.md">中文</a> | <a href="README.es.md">Español</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
3
- </p>
4
-
1
+ <p align="center">
2
+ <a href="README.ja.md">日本語</a> | <a href="README.md">English</a> | <a href="README.es.md">Español</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
3
+ </p>
4
+
5
5
  <p align="center">
6
6
  <img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/venvkit/readme.png" alt="venvkit" width="400">
7
7
  </p>
8
-
9
- # venvkit
10
-
11
- > [MCP Tool Shop](https://mcptoolshop.com) 的一部分
12
-
8
+
9
+ # venvkit
10
+
11
+ > [MCP Tool Shop](https://mcptoolshop.com) 的一部分
12
+
13
13
  <p align="center">
14
14
  <a href="https://github.com/mcp-tool-shop-org/venvkit/actions/workflows/ci.yml"><img src="https://github.com/mcp-tool-shop-org/venvkit/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
15
15
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square" alt="License: MIT"></a>
16
16
  <a href="https://mcp-tool-shop-org.github.io/venvkit/"><img src="https://img.shields.io/badge/Landing_Page-live-blue?style=flat-square" alt="Landing Page"></a>
17
17
  <a href="https://www.npmjs.com/package/@mcptoolshop/venvkit"><img src="https://img.shields.io/npm/v/@mcptoolshop/venvkit?style=flat-square&color=cb3837" alt="npm version"></a>
18
18
  </p>
19
-
20
- **用于 Windows 机器学习工作流程的 Python 虚拟环境诊断工具包。**
21
-
22
- 该工具会扫描您的系统中的 Python 环境,诊断健康问题(SSL、DLL、ABI 不匹配、路径泄露),跟踪任务执行历史,检测不可靠的任务,并生成一个生态系统图。
23
-
24
- ## 30 秒快速入门
25
-
19
+
20
+ **适用于 Windows 机器学习工作流程的 Python 虚拟环境诊断工具包。**
21
+
22
+ 该工具会扫描您的系统中的 Python 环境,诊断健康问题(SSL、DLL、ABI 不匹配、路径泄露),跟踪任务执行历史记录,检测不可靠的任务,并生成一个生态系统地图。
23
+
24
+ ## 30 秒快速入门
25
+
26
26
  ```bash
27
27
  git clone https://github.com/mcp-tool-shop-org/venvkit && cd venvkit
28
28
  npm install && npm run build
29
29
  node dist/map_cli.js --root C:\projects --httpsProbe
30
30
  # Open .venvkit/venv-map.html in your browser
31
31
  ```
32
-
33
- ## 功能
34
-
35
- - **doctorLite** - 快速检查任何 Python 解释器的健康状况
36
- - SSL/TLS 验证
37
- - DLL 加载失败(常见于 PyTorch/CUDA)
38
- - ABI 不匹配(ARM 与 x86)
39
- - pip 检查
40
- - 用户站点和 PYTHONPATH 泄露检测
41
-
42
- - **scanEnvPaths** - 发现系统中的所有 Python 环境
43
- - 查找 venvs、conda 环境、pyenv 版本、基本解释器
44
- - 可配置的深度和过滤
45
-
46
- - **mapRender** - 可视化您的 Python 生态系统
47
- - 图形 JSON 输出,用于程序化使用
48
- - Mermaid 图表,用于文档
49
- - 基本解释器分组,并进行影响范围分析
50
- - 任务路由可视化
51
-
52
- - **runLog** - 跟踪任务执行历史
53
- - 仅追加的 JSONL 格式
54
- - 记录哪个环境运行了哪个任务
55
- - 记录成功/失败,并进行错误分类
56
-
57
- - **taskCluster** - 按签名聚合任务运行
58
- - 检测不可靠的任务(不一致的通过/失败)
59
- - 基于环境的不可靠性检测
60
- - 识别失败热点
61
- - 传染分析(共享的根本原因)
62
-
63
- ## 安装
64
-
32
+
33
+ ## 功能
34
+
35
+ - **doctorLite** - 快速检查任何 Python 解释器的健康状况
36
+ - SSL/TLS 验证
37
+ - DLL 加载失败(常见于 PyTorch/CUDA)
38
+ - ABI 不匹配(ARM 与 x86)
39
+ - pip 检查
40
+ - 检测用户站点和 PYTHONPATH 泄露
41
+
42
+ - **scanEnvPaths** - 发现系统中的所有 Python 环境
43
+ - 查找 venvs、conda 环境、pyenv 版本、基本解释器
44
+ - 可配置的深度和过滤
45
+
46
+ - **mapRender** - 可视化您的 Python 生态系统
47
+ - 图形 JSON 输出,用于程序化使用
48
+ - Mermaid 图表,用于文档
49
+ - 基本解释器分组,并进行影响范围分析
50
+ - 任务路由可视化
51
+
52
+ - **runLog** - 跟踪任务执行历史记录
53
+ - 仅追加的 JSONL 格式
54
+ - 记录哪个环境运行了哪个任务
55
+ - 记录成功/失败,并进行错误分类
56
+
57
+ - **taskCluster** - 按签名聚合任务运行
58
+ - 检测不可靠的任务(一致性不通过)
59
+ - 检测与环境相关的不可靠性
60
+ - 识别失败热点
61
+ - 传染分析(共享的根本原因)
62
+
63
+ ## 安装
64
+
65
65
  ```bash
66
66
  npm install
67
67
  npm run build
68
68
  ```
69
-
70
- ## 命令行用法
71
-
69
+
70
+ ## 命令行用法
71
+
72
72
  ```bash
73
73
  # Scan current directory and generate ecosystem map
74
74
  node dist/map_cli.js
@@ -82,33 +82,33 @@ node dist/map_cli.js --runlog .venvkit/runs.jsonl
82
82
  # Output options
83
83
  node dist/map_cli.js --out ./output --minScore 50 --strict --httpsProbe
84
84
  ```
85
-
86
- ### 命令行选项
87
-
88
- | Flag | 描述 |
89
- | ------ | ------------- |
90
- | `--root, -r` | 要扫描的目录(可以指定多个) |
91
- | `--out` | 输出目录(默认为:`.venvkit`) |
92
- | `--maxDepth` | 要扫描的最大目录深度(默认为:5) |
93
- | `--strict` | 启用严格模式检查 |
94
- | `--httpsProbe` | 测试 HTTPS 连接 |
95
- | `--minScore` | 过滤健康评分低于此值的环境 |
96
- | `--concurrency` | 并行检查(默认为:CPU 数量) |
97
- | `--runlog` | 任务运行日志的路径(JSONL) |
98
- | `--no-tasks` | 跳过任务可视化 |
99
-
100
- ### 输出
101
-
102
- | File | 描述 |
103
- | ------ | ------------- |
104
- | `venv-map.json` | 完整的图形数据(节点、边、摘要) |
105
- | `venv-map.mmd` | Mermaid 图表源代码 |
106
- | `venv-map.html` | 交互式查看器 |
107
- | `reports.json` | 原始的 doctorLite 报告 |
108
- | `insights.json` | 可操作的建议 |
109
-
110
- ## 程序化用法
111
-
85
+
86
+ ### 命令行选项
87
+
88
+ | 标志 | 描述 |
89
+ |------|-------------|
90
+ | `--root, -r` | 要扫描的目录(可以指定多个) |
91
+ | `--out` | 输出目录(默认为:`.venvkit`) |
92
+ | `--maxDepth` | 要扫描的最大目录深度(默认为:5) |
93
+ | `--strict` | 启用严格模式检查 |
94
+ | `--httpsProbe` | 测试 HTTPS 连接 |
95
+ | `--minScore` | 过滤健康评分低于此值的环境 |
96
+ | `--concurrency` | 并行检查(默认为:CPU 数量) |
97
+ | `--runlog` | 任务运行日志的路径(JSONL) |
98
+ | `--no-tasks` | 跳过任务可视化 |
99
+
100
+ ### 输出
101
+
102
+ | 文件 | 描述 |
103
+ |------|-------------|
104
+ | `venv-map.json` | 完整的图形数据(节点、边、摘要) |
105
+ | `venv-map.mmd` | Mermaid 图表源代码 |
106
+ | `venv-map.html` | 交互式查看器 |
107
+ | `reports.json` | 原始的 doctorLite 报告 |
108
+ | `insights.json` | 可操作的建议 |
109
+
110
+ ## 程序化用法
111
+
112
112
  ```typescript
113
113
  import { doctorLite, scanEnvPaths, mapRender, readRunLog } from 'venvkit';
114
114
 
@@ -143,11 +143,11 @@ const { graph, mermaid, insights } = mapRender(reports, runs, {
143
143
  includeHotEdgeLabels: true,
144
144
  });
145
145
  ```
146
-
147
- ## 运行日志模式
148
-
149
- 通过将事件追加到 JSONL 文件来跟踪任务执行:
150
-
146
+
147
+ ## 运行日志模式
148
+
149
+ 通过将事件追加到 JSONL 文件来跟踪任务执行:
150
+
151
151
  ```typescript
152
152
  import { appendRunLog, newRunId } from 'venvkit';
153
153
 
@@ -172,11 +172,11 @@ await appendRunLog('.venvkit/runs.jsonl', {
172
172
  },
173
173
  });
174
174
  ```
175
-
176
- ## 任务聚类
177
-
178
- 当您有许多任务运行时,venvkit 会根据签名对它们进行聚类:
179
-
175
+
176
+ ## 任务聚类
177
+
178
+ 当您有许多任务运行时,venvkit 会根据签名对它们进行聚类:
179
+
180
180
  ```typescript
181
181
  import { clusterRuns, isFlaky, getFailingEnvs } from 'venvkit';
182
182
 
@@ -192,11 +192,11 @@ for (const c of clusters) {
192
192
  }
193
193
  }
194
194
  ```
195
-
196
- ## 图形模式
197
-
198
- `mapRender` 输出遵循稳定的 JSON 模式:
199
-
195
+
196
+ ## 图形模式
197
+
198
+ `mapRender` 输出遵循稳定的 JSON 模式:
199
+
200
200
  ```typescript
201
201
  type GraphJSONv1 = {
202
202
  version: '1.0';
@@ -217,47 +217,58 @@ type GraphJSONv1 = {
217
217
  edges: GraphEdge[];
218
218
  };
219
219
  ```
220
-
221
- ### 节点类型
222
-
223
- | Type | 描述 |
224
- | ------ | ------------- |
225
- | `base` | 基本 Python 解释器(例如:`C:\Python311`) |
226
- | `venv` | 虚拟环境 |
227
- | `task` | 任务签名(聚类运行) |
228
-
229
- ### 边类型
230
-
231
- | Type | 描述 |
232
- | ------ | ------------- |
233
- | `USES_BASE` | venv → 基本关系 |
234
- | `ROUTES_TASK_TO` | 任务 → 环境路由 |
235
- | `FAILED_RUN` | 任务 → 环境失败(Mermaid 中以虚线表示) |
236
-
237
- ## 查找代码
238
-
239
- | Code | 严重性 | 描述 |
240
- | ------ | ---------- | ------------- |
241
- | `SSL_BROKEN` | bad | SSL 模块无法导入 |
242
- | `CERT_STORE_FAIL` | warn | HTTPS 证书验证失败 |
243
- | `DLL_LOAD_FAIL` | bad | 本机扩展 DLL 加载失败 |
244
- | `ABI_MISMATCH` | bad | 二进制不兼容(ARM/x86) |
245
- | `PIP_MISSING` | warn | pip 不可用 |
246
- | `PIP_CHECK_FAIL` | warn | 检测到依赖项冲突 |
247
- | `USER_SITE_LEAK` | warn | venv 环境中启用了用户 site-packages。 |
248
- | `PYTHONPATH_INJECTED` | warn | 已设置 PYTHONPATH 环境变量。 |
249
- | `ARCH_MISMATCH` | bad | 使用了 32 位的 Python,但需要 64 位。 |
250
- | `PYVENV_CFG_INVALID` | warn | pyvenv.cfg 文件损坏或缺失。 |
251
-
252
- ## 开发
253
-
220
+
221
+ ### 节点类型
222
+
223
+ | 类型 | 描述 |
224
+ |------|-------------|
225
+ | `base` | 基本 Python 解释器(例如:`C:\Python311`) |
226
+ | `venv` | 虚拟环境 |
227
+ | `task` | 任务签名(聚类运行) |
228
+
229
+ ### 边类型
230
+
231
+ | 类型 | 描述 |
232
+ |------|-------------|
233
+ | `USES_BASE` | venv → 基本关系 |
234
+ | `ROUTES_TASK_TO` | 任务 → 环境 路由 |
235
+ | `FAILED_RUN` | 任务 → 环境 失败(Mermaid 中为虚线) |
236
+
237
+ ## 错误代码
238
+
239
+ | 代码 | 严重性 | 描述 |
240
+ |------|----------|-------------|
241
+ | `SSL_BROKEN` | bad | SSL 模块导入失败 |
242
+ | `CERT_STORE_FAIL` | warn | HTTPS 证书验证失败 |
243
+ | `DLL_LOAD_FAIL` | bad | 本机扩展 DLL 加载失败 |
244
+ | `ABI_MISMATCH` | bad | 二进制不兼容(ARM/x86) |
245
+ | `PIP_MISSING` | warn | pip 不可用 |
246
+ | `PIP_CHECK_FAIL` | warn | 检测到依赖项冲突 |
247
+ | `USER_SITE_LEAK` | warn | venv 中启用了用户站点包 |
248
+ | `PYTHONPATH_INJECTED` | warn | 设置了 PYTHONPATH 环境变量 |
249
+ | `ARCH_MISMATCH` | bad | 当需要 64 位的 Python 时,使用了 32 位的 Python |
250
+ | `PYVENV_CFG_INVALID` | warn | pyvenv.cfg 文件损坏或缺失 |
251
+
252
+ ## 开发
253
+
254
254
  ```bash
255
255
  npm install
256
256
  npm run typecheck # Type check
257
257
  npm run test # Run tests
258
258
  npm run build # Build to dist/
259
259
  ```
260
-
261
- ## 许可证
262
-
263
- MIT 协议。
260
+
261
+ ## 安全与数据范围
262
+
263
+ - **只读扫描:** Python 可执行文件和 pyvenv.cfg 文件会被读取,但绝不会被修改。
264
+ - **子进程:** 使用受控参数启动 `python` 进程,不涉及 shell 执行。
265
+ - **网络:** 可选的 `--httpsProbe` 参数用于测试 SSL 证书,不会发送其他类型的网络请求。
266
+ - **不收集或发送任何遥测数据**,详细的安全策略请参见 [SECURITY.md](SECURITY.md) 文件。
267
+
268
+ ## 许可证
269
+
270
+ MIT
271
+
272
+ ---
273
+
274
+ 由 [MCP Tool Shop](https://mcp-tool-shop.github.io/) 构建。
@@ -0,0 +1,75 @@
1
+ export type Severity = "info" | "warn" | "bad";
2
+ export type HealthStatus = "good" | "warn" | "bad" | "unknown";
3
+ export type FindingCode = "PYTHON_EXEC_MISSING" | "NOT_A_VENV" | "ARCH_MISMATCH" | "PIP_MISSING" | "PIP_POINTS_TO_OTHER_PYTHON" | "PYTHONPATH_INJECTED" | "USER_SITE_ENABLED" | "USER_SITE_LEAK" | "PIP_CHECK_FAIL" | "MULTI_VERSION_ON_PATH" | "RESOLVER_CONFLICT_HINT" | "OUTDATED_INSTALL_TOOLING" | "IMPORT_FAIL" | "DLL_LOAD_FAIL" | "ABI_MISMATCH" | "SSL_BROKEN" | "CERT_STORE_FAIL" | "SUBPROCESS_BROKEN" | "PYVENV_CFG_INVALID";
4
+ export type Finding = {
5
+ code: FindingCode;
6
+ severity: Severity;
7
+ penalty: number;
8
+ what: string;
9
+ why: string;
10
+ fix: Array<{
11
+ title: string;
12
+ steps: string[];
13
+ }>;
14
+ evidence?: Record<string, unknown>;
15
+ };
16
+ export type RunResult = {
17
+ ok: boolean;
18
+ exitCode: number | null;
19
+ stdout: string;
20
+ stderr: string;
21
+ timedOut: boolean;
22
+ };
23
+ export type CmdRunner = (cmd: string, args: string[], opts: {
24
+ env?: NodeJS.ProcessEnv;
25
+ timeoutMs: number;
26
+ }) => Promise<RunResult>;
27
+ export type DoctorLiteOptions = {
28
+ /** Python executable path (venv python or base python). Required. */
29
+ pythonPath: string;
30
+ /** Modules to import-test (task required caps). */
31
+ requiredModules?: string[];
32
+ /** If true, also do a HTTPS probe to pypi.org (can fail in corp MITM; still useful). */
33
+ httpsProbe?: boolean;
34
+ /** If task requires 64-bit python, set true. If unknown, leave undefined. */
35
+ requireX64?: boolean;
36
+ /** Timeout per subprocess (ms). */
37
+ timeoutMs?: number;
38
+ /** If true, run heavier checks (pip check, multi-version scan). */
39
+ strict?: boolean;
40
+ /** Override environment variables passed to python. */
41
+ env?: Record<string, string | undefined>;
42
+ };
43
+ export type DoctorLiteReport = {
44
+ pythonPath: string;
45
+ ranAt: string;
46
+ status: HealthStatus;
47
+ score: number;
48
+ summary: string;
49
+ facts?: FactsResult;
50
+ findings: Finding[];
51
+ };
52
+ type FactsResult = {
53
+ version: string;
54
+ version_info: number[];
55
+ executable: string;
56
+ prefix: string;
57
+ base_prefix: string | null;
58
+ bits: number;
59
+ machine: string;
60
+ os: string;
61
+ py_path: string[];
62
+ enable_user_site: boolean | null;
63
+ user_site: string;
64
+ };
65
+ /**
66
+ * Run a subprocess with timeout, capturing stdout/stderr.
67
+ */
68
+ export declare function runCmd(cmd: string, args: string[], opts: {
69
+ env?: NodeJS.ProcessEnv;
70
+ timeoutMs: number;
71
+ }): Promise<RunResult>;
72
+ export declare function doctorLite(opts: DoctorLiteOptions, runner?: CmdRunner): Promise<DoctorLiteReport>;
73
+ export declare function envIdFromPythonPath(pythonPath: string): string;
74
+ export {};
75
+ //# sourceMappingURL=doctorLite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctorLite.d.ts","sourceRoot":"","sources":["../doctorLite.ts"],"names":[],"mappings":"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"}