@paretools/python 0.2.0 → 0.5.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 (49) hide show
  1. package/README.md +89 -0
  2. package/dist/index.js +2 -3
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/formatters.d.ts +13 -1
  5. package/dist/lib/formatters.d.ts.map +1 -1
  6. package/dist/lib/formatters.js +66 -0
  7. package/dist/lib/formatters.js.map +1 -1
  8. package/dist/lib/parsers.d.ts +13 -1
  9. package/dist/lib/parsers.d.ts.map +1 -1
  10. package/dist/lib/parsers.js +175 -4
  11. package/dist/lib/parsers.js.map +1 -1
  12. package/dist/lib/python-runner.d.ts +3 -0
  13. package/dist/lib/python-runner.d.ts.map +1 -1
  14. package/dist/lib/python-runner.js +9 -0
  15. package/dist/lib/python-runner.js.map +1 -1
  16. package/dist/schemas/index.d.ts +79 -195
  17. package/dist/schemas/index.d.ts.map +1 -1
  18. package/dist/schemas/index.js +49 -4
  19. package/dist/schemas/index.js.map +1 -1
  20. package/dist/tools/black.d.ts +3 -0
  21. package/dist/tools/black.d.ts.map +1 -0
  22. package/dist/tools/black.js +35 -0
  23. package/dist/tools/black.js.map +1 -0
  24. package/dist/tools/index.d.ts.map +1 -1
  25. package/dist/tools/index.js +8 -0
  26. package/dist/tools/index.js.map +1 -1
  27. package/dist/tools/mypy.js +1 -1
  28. package/dist/tools/mypy.js.map +1 -1
  29. package/dist/tools/pip-audit.d.ts.map +1 -1
  30. package/dist/tools/pip-audit.js +1 -1
  31. package/dist/tools/pip-audit.js.map +1 -1
  32. package/dist/tools/pip-install.d.ts.map +1 -1
  33. package/dist/tools/pip-install.js +1 -1
  34. package/dist/tools/pip-install.js.map +1 -1
  35. package/dist/tools/pytest.d.ts +3 -0
  36. package/dist/tools/pytest.d.ts.map +1 -0
  37. package/dist/tools/pytest.js +38 -0
  38. package/dist/tools/pytest.js.map +1 -0
  39. package/dist/tools/ruff.js +1 -1
  40. package/dist/tools/ruff.js.map +1 -1
  41. package/dist/tools/uv-install.d.ts +3 -0
  42. package/dist/tools/uv-install.d.ts.map +1 -0
  43. package/dist/tools/uv-install.js +34 -0
  44. package/dist/tools/uv-install.js.map +1 -0
  45. package/dist/tools/uv-run.d.ts +3 -0
  46. package/dist/tools/uv-run.d.ts.map +1 -0
  47. package/dist/tools/uv-run.js +29 -0
  48. package/dist/tools/uv-run.js.map +1 -0
  49. package/package.json +31 -5
package/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # @paretools/python
2
+
3
+ [![npm](https://img.shields.io/npm/v/@paretools/python.svg)](https://www.npmjs.com/package/@paretools/python)
4
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/Dave-London/pare/blob/main/LICENSE)
5
+
6
+ **Structured, token-efficient Python tool output for AI agents.** Up to 65% fewer tokens than raw CLI output.
7
+
8
+ Part of the [Pare](https://github.com/Dave-London/pare) suite of MCP servers.
9
+
10
+ ## Tools (8)
11
+
12
+ | Tool | Description |
13
+ | ------------- | ------------------------------------------------------- |
14
+ | `pip-install` | Install packages, returns summary of installed items |
15
+ | `mypy` | Type-check diagnostics (file, line, severity, message) |
16
+ | `ruff-check` | Lint diagnostics (file, line, code, message) |
17
+ | `pip-audit` | Vulnerability report for installed packages |
18
+ | `pytest` | Run tests, returns structured pass/fail results |
19
+ | `uv-install` | Install packages via uv with structured summary |
20
+ | `uv-run` | Run a command in a uv-managed environment |
21
+ | `black` | Format code with Black, returns changed/unchanged files |
22
+
23
+ ## Quick Start
24
+
25
+ ```bash
26
+ npx -y @paretools/python
27
+ ```
28
+
29
+ Add to your MCP client config:
30
+
31
+ ```json
32
+ {
33
+ "mcpServers": {
34
+ "pare-python": {
35
+ "command": "npx",
36
+ "args": ["-y", "@paretools/python"]
37
+ }
38
+ }
39
+ }
40
+ ```
41
+
42
+ ## Example
43
+
44
+ **`mypy` output:**
45
+
46
+ ```json
47
+ {
48
+ "success": false,
49
+ "errors": [
50
+ {
51
+ "file": "app/main.py",
52
+ "line": 15,
53
+ "severity": "error",
54
+ "message": "Argument 1 to \"process\" has incompatible type \"str\"; expected \"int\"",
55
+ "code": "arg-type"
56
+ }
57
+ ],
58
+ "errorCount": 1,
59
+ "warningCount": 0,
60
+ "noteCount": 0
61
+ }
62
+ ```
63
+
64
+ ## All Pare Servers (62 tools)
65
+
66
+ | Package | Tools | Wraps |
67
+ | -------------------------------------------------------------------- | --------------------------------------------------------------------------- | ---------------------------------- |
68
+ | [@paretools/git](https://www.npmjs.com/package/@paretools/git) | status, log, diff, branch, show, add, commit, push, pull, checkout | git |
69
+ | [@paretools/test](https://www.npmjs.com/package/@paretools/test) | run, coverage | pytest, jest, vitest, mocha |
70
+ | [@paretools/npm](https://www.npmjs.com/package/@paretools/npm) | install, audit, outdated, list, run, test, init | npm |
71
+ | [@paretools/build](https://www.npmjs.com/package/@paretools/build) | tsc, build, esbuild, vite-build, webpack | tsc, esbuild, vite, webpack |
72
+ | [@paretools/lint](https://www.npmjs.com/package/@paretools/lint) | lint, format-check, prettier-format, biome-check, biome-format | eslint, prettier, biome |
73
+ | **@paretools/python** | pip-install, mypy, ruff-check, pip-audit, pytest, uv-install, uv-run, black | pip, mypy, ruff, pytest, uv, black |
74
+ | [@paretools/docker](https://www.npmjs.com/package/@paretools/docker) | ps, build, logs, images, run, exec, compose-up, compose-down, pull | docker, docker compose |
75
+ | [@paretools/cargo](https://www.npmjs.com/package/@paretools/cargo) | build, test, clippy, run, add, remove, fmt, doc, check | cargo |
76
+ | [@paretools/go](https://www.npmjs.com/package/@paretools/go) | build, test, vet, run, mod-tidy, fmt, generate | go, gofmt |
77
+
78
+ ## Compatible Clients
79
+
80
+ Works with any MCP-compatible client: [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Claude Desktop](https://claude.ai/download), [Cursor](https://cursor.com), [Windsurf](https://codeium.com/windsurf), [VS Code / GitHub Copilot](https://code.visualstudio.com), [Cline](https://github.com/cline/cline), [Roo Code](https://roocode.com), [Zed](https://zed.dev), [Continue.dev](https://continue.dev), [Gemini CLI](https://github.com/google-gemini/gemini-cli), [OpenAI Codex](https://openai.com/index/codex/)
81
+
82
+ ## Links
83
+
84
+ - [Pare monorepo](https://github.com/Dave-London/pare)
85
+ - [MCP protocol](https://modelcontextprotocol.io)
86
+
87
+ ## License
88
+
89
+ [MIT](https://github.com/Dave-London/pare/blob/main/LICENSE)
package/dist/index.js CHANGED
@@ -2,9 +2,8 @@
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
4
  import { registerAllTools } from "./tools/index.js";
5
- const server = new McpServer({
6
- name: "@paretools/python",
7
- version: "0.1.0",
5
+ const server = new McpServer({ name: "@paretools/python", version: "0.2.0" }, {
6
+ instructions: "Structured Python tool operations (pip install, mypy, ruff, pip-audit, pytest, uv, black). Use instead of running Python tool commands via bash. Returns typed JSON with structured type errors, lint violations, vulnerability data, test results, and formatting status.",
8
7
  });
9
8
  registerAllTools(server);
10
9
  const transport = new StdioServerTransport();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEzB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC/C;IACE,YAAY,EACV,4QAA4Q;CAC/Q,CACF,CAAC;AAEF,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEzB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -1,6 +1,18 @@
1
- import type { PipInstall, MypyResult, RuffResult, PipAuditResult } from "../schemas/index.js";
1
+ import type { PipInstall, MypyResult, RuffResult, PipAuditResult, PytestResult, UvInstall, UvRun, BlackResult } from "../schemas/index.js";
2
+ /** Formats structured pip install results into a human-readable summary of installed packages. */
2
3
  export declare function formatPipInstall(data: PipInstall): string;
4
+ /** Formats structured mypy type-check results into a human-readable diagnostic summary. */
3
5
  export declare function formatMypy(data: MypyResult): string;
6
+ /** Formats structured ruff lint results into a human-readable diagnostic listing. */
4
7
  export declare function formatRuff(data: RuffResult): string;
8
+ /** Formats structured pip-audit vulnerability results into a human-readable security report. */
5
9
  export declare function formatPipAudit(data: PipAuditResult): string;
10
+ /** Formats structured pytest results into a human-readable test summary. */
11
+ export declare function formatPytest(data: PytestResult): string;
12
+ /** Formats structured uv install results into a human-readable summary. */
13
+ export declare function formatUvInstall(data: UvInstall): string;
14
+ /** Formats structured uv run results into a human-readable summary. */
15
+ export declare function formatUvRun(data: UvRun): string;
16
+ /** Formats structured Black formatter results into a human-readable summary. */
17
+ export declare function formatBlack(data: BlackResult): string;
6
18
  //# sourceMappingURL=formatters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE9F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CASzD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAUnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAQnD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAS3D"}
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAS,EACT,KAAK,EACL,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CASzD;AAED,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAUnD;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAQnD;AAED,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAS3D;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAgBvD;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CASvD;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAY/C;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAoBrD"}
@@ -1,3 +1,4 @@
1
+ /** Formats structured pip install results into a human-readable summary of installed packages. */
1
2
  export function formatPipInstall(data) {
2
3
  if (data.alreadySatisfied && data.total === 0)
3
4
  return "All requirements already satisfied.";
@@ -9,6 +10,7 @@ export function formatPipInstall(data) {
9
10
  }
10
11
  return lines.join("\n");
11
12
  }
13
+ /** Formats structured mypy type-check results into a human-readable diagnostic summary. */
12
14
  export function formatMypy(data) {
13
15
  if (data.success && data.total === 0)
14
16
  return "mypy: no errors found.";
@@ -20,6 +22,7 @@ export function formatMypy(data) {
20
22
  }
21
23
  return lines.join("\n");
22
24
  }
25
+ /** Formats structured ruff lint results into a human-readable diagnostic listing. */
23
26
  export function formatRuff(data) {
24
27
  if (data.total === 0)
25
28
  return "ruff: no issues found.";
@@ -29,6 +32,7 @@ export function formatRuff(data) {
29
32
  }
30
33
  return lines.join("\n");
31
34
  }
35
+ /** Formats structured pip-audit vulnerability results into a human-readable security report. */
32
36
  export function formatPipAudit(data) {
33
37
  if (data.total === 0)
34
38
  return "No vulnerabilities found.";
@@ -39,4 +43,66 @@ export function formatPipAudit(data) {
39
43
  }
40
44
  return lines.join("\n");
41
45
  }
46
+ /** Formats structured pytest results into a human-readable test summary. */
47
+ export function formatPytest(data) {
48
+ if (data.total === 0)
49
+ return "pytest: no tests collected.";
50
+ const parts = [];
51
+ if (data.passed > 0)
52
+ parts.push(`${data.passed} passed`);
53
+ if (data.failed > 0)
54
+ parts.push(`${data.failed} failed`);
55
+ if (data.errors > 0)
56
+ parts.push(`${data.errors} errors`);
57
+ if (data.skipped > 0)
58
+ parts.push(`${data.skipped} skipped`);
59
+ const lines = [`pytest: ${parts.join(", ")} in ${data.duration}s`];
60
+ for (const f of data.failures) {
61
+ lines.push(` FAILED ${f.test}: ${f.message}`);
62
+ }
63
+ return lines.join("\n");
64
+ }
65
+ /** Formats structured uv install results into a human-readable summary. */
66
+ export function formatUvInstall(data) {
67
+ if (!data.success)
68
+ return "uv install failed.";
69
+ if (data.total === 0)
70
+ return "All requirements already satisfied.";
71
+ const lines = [`Installed ${data.total} packages in ${data.duration}s:`];
72
+ for (const pkg of data.installed) {
73
+ lines.push(` ${pkg.name}==${pkg.version}`);
74
+ }
75
+ return lines.join("\n");
76
+ }
77
+ /** Formats structured uv run results into a human-readable summary. */
78
+ export function formatUvRun(data) {
79
+ const status = data.success ? "completed" : `failed (exit ${data.exitCode})`;
80
+ const lines = [`uv run ${status} in ${data.duration}s`];
81
+ if (data.stdout.trim()) {
82
+ lines.push("stdout:", data.stdout.trim());
83
+ }
84
+ if (data.stderr.trim()) {
85
+ lines.push("stderr:", data.stderr.trim());
86
+ }
87
+ return lines.join("\n");
88
+ }
89
+ /** Formats structured Black formatter results into a human-readable summary. */
90
+ export function formatBlack(data) {
91
+ if (data.filesChecked === 0)
92
+ return "black: no Python files found.";
93
+ if (data.success && data.filesChanged === 0) {
94
+ return `black: ${data.filesUnchanged} files already formatted.`;
95
+ }
96
+ const lines = [];
97
+ if (data.wouldReformat.length > 0) {
98
+ lines.push(`black: ${data.filesChanged} files ${data.success ? "reformatted" : "would be reformatted"}, ${data.filesUnchanged} unchanged`);
99
+ for (const f of data.wouldReformat) {
100
+ lines.push(` ${f}`);
101
+ }
102
+ }
103
+ else {
104
+ lines.push(`black: ${data.filesChanged} files reformatted, ${data.filesUnchanged} unchanged`);
105
+ }
106
+ return lines.join("\n");
107
+ }
42
108
  //# sourceMappingURL=formatters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,qCAAqC,CAAC;IAC5F,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,qBAAqB,CAAC;IAEhD,MAAM,KAAK,GAAG,CAAC,aAAa,IAAI,CAAC,KAAK,YAAY,CAAC,CAAC;IACpD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,wBAAwB,CAAC;IAEtE,MAAM,KAAK,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,QAAQ,iBAAiB,CAAC,CAAC;IAC/E,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,wBAAwB,CAAC;IAEtD,MAAM,KAAK,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;IACvE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAoB;IACjD,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,2BAA2B,CAAC;IAEzD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,mBAAmB,CAAC,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,18 @@
1
- import type { PipInstall, MypyResult, RuffResult, PipAuditResult } from "../schemas/index.js";
1
+ import type { PipInstall, MypyResult, RuffResult, PipAuditResult, PytestResult, UvInstall, UvRun, BlackResult } from "../schemas/index.js";
2
+ /** Parses `pip install` output into structured data with installed packages and satisfaction status. */
2
3
  export declare function parsePipInstall(stdout: string, stderr: string, exitCode: number): PipInstall;
4
+ /** Parses mypy type-checker output into structured diagnostics with file locations and error codes. */
3
5
  export declare function parseMypyOutput(stdout: string, exitCode: number): MypyResult;
6
+ /** Parses `ruff check --output-format json` output into structured lint diagnostics with fixability info. */
4
7
  export declare function parseRuffJson(stdout: string): RuffResult;
8
+ /** Parses `pip-audit --format json` output into structured vulnerability data with fix versions. */
5
9
  export declare function parsePipAuditJson(stdout: string): PipAuditResult;
10
+ /** Parses pytest output into structured test results with pass/fail/error/skip counts and failure details. */
11
+ export declare function parsePytestOutput(stdout: string, stderr: string, exitCode: number): PytestResult;
12
+ /** Parses uv pip install output into structured data with installed packages. */
13
+ export declare function parseUvInstall(stdout: string, stderr: string, exitCode: number): UvInstall;
14
+ /** Parses uv run output into structured result with exit code, stdout, stderr. */
15
+ export declare function parseUvRun(stdout: string, stderr: string, exitCode: number, durationMs: number): UvRun;
16
+ /** Parses Black code formatter output into structured result with file counts. */
17
+ export declare function parseBlackOutput(stdout: string, stderr: string, exitCode: number): BlackResult;
6
18
  //# sourceMappingURL=parsers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EAEV,UAAU,EACV,cAAc,EACf,MAAM,qBAAqB,CAAC;AAM7B,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAyB5F;AAKD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CA8B5E;AAGD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAsBxD;AAYD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAmBhE"}
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EAEV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAS,EACT,KAAK,EACL,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAK7B,wGAAwG;AACxG,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAyB5F;AAID,uGAAuG;AACvG,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CA8B5E;AAED,6GAA6G;AAC7G,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAsBxD;AAWD,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAmBhE;AAqBD,8GAA8G;AAC9G,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAsFhG;AAMD,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAwB1F;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,KAAK,CAQP;AAOD,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAsD9F"}
@@ -1,4 +1,4 @@
1
- // pip install output: "Successfully installed pkg1-1.0 pkg2-2.0" or "Requirement already satisfied"
1
+ /** Parses `pip install` output into structured data with installed packages and satisfaction status. */
2
2
  export function parsePipInstall(stdout, stderr, exitCode) {
3
3
  const output = stdout + "\n" + stderr;
4
4
  const alreadySatisfied = output.includes("already satisfied");
@@ -23,8 +23,8 @@ export function parsePipInstall(stdout, stderr, exitCode) {
23
23
  total: installed.length,
24
24
  };
25
25
  }
26
- // mypy output: file:line: severity: message [code]
27
26
  const MYPY_RE = /^(.+?):(\d+)(?::(\d+))?: (error|warning|note): (.+?)(?:\s+\[([^\]]+)\])?$/;
27
+ /** Parses mypy type-checker output into structured diagnostics with file locations and error codes. */
28
28
  export function parseMypyOutput(stdout, exitCode) {
29
29
  const lines = stdout.split("\n");
30
30
  const diagnostics = [];
@@ -51,7 +51,7 @@ export function parseMypyOutput(stdout, exitCode) {
51
51
  warnings,
52
52
  };
53
53
  }
54
- // ruff check --output-format json returns JSON array
54
+ /** Parses `ruff check --output-format json` output into structured lint diagnostics with fixability info. */
55
55
  export function parseRuffJson(stdout) {
56
56
  let entries;
57
57
  try {
@@ -73,7 +73,7 @@ export function parseRuffJson(stdout) {
73
73
  const fixable = diagnostics.filter((d) => d.fixable).length;
74
74
  return { diagnostics, total: diagnostics.length, fixable };
75
75
  }
76
- // pip-audit --format json
76
+ /** Parses `pip-audit --format json` output into structured vulnerability data with fix versions. */
77
77
  export function parsePipAuditJson(stdout) {
78
78
  let data;
79
79
  try {
@@ -91,4 +91,175 @@ export function parsePipAuditJson(stdout) {
91
91
  })));
92
92
  return { vulnerabilities, total: vulnerabilities.length };
93
93
  }
94
+ const PYTEST_DURATION_RE = /in ([\d.]+)s/;
95
+ function extractCount(line, label) {
96
+ const m = line.match(label);
97
+ return m ? parseInt(m[1], 10) : 0;
98
+ }
99
+ /** Parses pytest output into structured test results with pass/fail/error/skip counts and failure details. */
100
+ export function parsePytestOutput(stdout, stderr, exitCode) {
101
+ const output = stdout + "\n" + stderr;
102
+ const lines = output.split("\n");
103
+ // Find the summary line (e.g., "=== 3 passed, 1 failed in 0.52s ===")
104
+ let passed = 0;
105
+ let failed = 0;
106
+ let errors = 0;
107
+ let skipped = 0;
108
+ let duration = 0;
109
+ for (const line of lines) {
110
+ // Match lines containing pytest summary markers (== ... in Xs ==) or standalone counts
111
+ if (/\d+ (?:passed|failed|error|skipped)/.test(line) || /in [\d.]+s/.test(line)) {
112
+ passed = Math.max(passed, extractCount(line, /(\d+) passed/));
113
+ failed = Math.max(failed, extractCount(line, /(\d+) failed/));
114
+ errors = Math.max(errors, extractCount(line, /(\d+) errors?/));
115
+ skipped = Math.max(skipped, extractCount(line, /(\d+) skipped/));
116
+ const durationMatch = line.match(PYTEST_DURATION_RE);
117
+ if (durationMatch) {
118
+ duration = parseFloat(durationMatch[1]);
119
+ }
120
+ }
121
+ }
122
+ // Check for "no tests ran" case
123
+ const noTests = output.includes("no tests ran");
124
+ if (noTests && passed === 0 && failed === 0 && errors === 0) {
125
+ return {
126
+ success: exitCode === 0 || exitCode === 5,
127
+ passed: 0,
128
+ failed: 0,
129
+ errors: 0,
130
+ skipped: 0,
131
+ total: 0,
132
+ duration,
133
+ failures: [],
134
+ };
135
+ }
136
+ // Parse failure blocks from short traceback
137
+ const failures = [];
138
+ const failureBlockRe = /_{3,}\s+(.+?)\s+_{3,}/g;
139
+ let failMatch;
140
+ while ((failMatch = failureBlockRe.exec(output)) !== null) {
141
+ const testName = failMatch[1].trim();
142
+ const startIdx = failMatch.index + failMatch[0].length;
143
+ // Find the end of this failure block (next FAILED marker, next separator, or end)
144
+ const remaining = output.slice(startIdx);
145
+ const endMatch = remaining.match(/(?:_{3,}|={3,})/);
146
+ const block = endMatch ? remaining.slice(0, endMatch.index) : remaining;
147
+ // Extract the most relevant error line
148
+ const blockLines = block
149
+ .split("\n")
150
+ .map((l) => l.trim())
151
+ .filter(Boolean);
152
+ let message = "";
153
+ // Look for assertion errors, E lines, or the last meaningful line
154
+ for (const bLine of blockLines) {
155
+ if (bLine.startsWith("E ")) {
156
+ message = message ? message + "\n" + bLine.slice(2).trim() : bLine.slice(2).trim();
157
+ }
158
+ }
159
+ if (!message && blockLines.length > 0) {
160
+ message = blockLines[blockLines.length - 1];
161
+ }
162
+ failures.push({ test: testName, message });
163
+ }
164
+ const total = passed + failed + errors + skipped;
165
+ return {
166
+ success: exitCode === 0,
167
+ passed,
168
+ failed,
169
+ errors,
170
+ skipped,
171
+ total,
172
+ duration,
173
+ failures,
174
+ };
175
+ }
176
+ // Matches uv install output lines like: " + package==version" or "Installed N packages in Ns"
177
+ const UV_INSTALLED_PKG_RE = /^\s*\+\s+(\S+)==(\S+)/;
178
+ const UV_SUMMARY_RE = /Installed (\d+) packages? in ([\d.]+)/;
179
+ /** Parses uv pip install output into structured data with installed packages. */
180
+ export function parseUvInstall(stdout, stderr, exitCode) {
181
+ const output = stdout + "\n" + stderr;
182
+ const lines = output.split("\n");
183
+ const installed = [];
184
+ let duration = 0;
185
+ for (const line of lines) {
186
+ const pkgMatch = line.match(UV_INSTALLED_PKG_RE);
187
+ if (pkgMatch) {
188
+ installed.push({ name: pkgMatch[1], version: pkgMatch[2] });
189
+ }
190
+ const summaryMatch = line.match(UV_SUMMARY_RE);
191
+ if (summaryMatch) {
192
+ duration = parseFloat(summaryMatch[2]);
193
+ }
194
+ }
195
+ return {
196
+ success: exitCode === 0,
197
+ installed,
198
+ total: installed.length,
199
+ duration,
200
+ };
201
+ }
202
+ /** Parses uv run output into structured result with exit code, stdout, stderr. */
203
+ export function parseUvRun(stdout, stderr, exitCode, durationMs) {
204
+ return {
205
+ exitCode,
206
+ stdout,
207
+ stderr,
208
+ success: exitCode === 0,
209
+ duration: Math.round(durationMs) / 1000,
210
+ };
211
+ }
212
+ const BLACK_REFORMAT_RE = /^would reformat (.+)$/;
213
+ const BLACK_REFORMATTED_RE = /^reformatted (.+)$/;
214
+ const BLACK_SUMMARY_RE = /(\d+) files? (?:would be )?reformatted(?:,\s*(\d+) files? (?:would be )?left unchanged)?|(\d+) files? (?:would be )?left unchanged/;
215
+ /** Parses Black code formatter output into structured result with file counts. */
216
+ export function parseBlackOutput(stdout, stderr, exitCode) {
217
+ // Black writes most output to stderr
218
+ const output = stdout + "\n" + stderr;
219
+ const lines = output.split("\n");
220
+ const wouldReformat = [];
221
+ let filesChanged = 0;
222
+ let filesUnchanged = 0;
223
+ for (const line of lines) {
224
+ const wouldMatch = line.match(BLACK_REFORMAT_RE);
225
+ if (wouldMatch) {
226
+ wouldReformat.push(wouldMatch[1].trim());
227
+ }
228
+ const reformattedMatch = line.match(BLACK_REFORMATTED_RE);
229
+ if (reformattedMatch) {
230
+ wouldReformat.push(reformattedMatch[1].trim());
231
+ }
232
+ }
233
+ // Parse summary line
234
+ for (const line of lines) {
235
+ const summaryMatch = line.match(BLACK_SUMMARY_RE);
236
+ if (summaryMatch) {
237
+ if (summaryMatch[1]) {
238
+ filesChanged = parseInt(summaryMatch[1], 10);
239
+ filesUnchanged = summaryMatch[2] ? parseInt(summaryMatch[2], 10) : 0;
240
+ }
241
+ else if (summaryMatch[3]) {
242
+ filesChanged = 0;
243
+ filesUnchanged = parseInt(summaryMatch[3], 10);
244
+ }
245
+ }
246
+ }
247
+ // If we found "would reformat" lines but no summary, use those counts
248
+ if (filesChanged === 0 && wouldReformat.length > 0) {
249
+ filesChanged = wouldReformat.length;
250
+ }
251
+ const filesChecked = filesChanged + filesUnchanged;
252
+ // In check mode, success means no files need reformatting
253
+ // In format mode, success is always true (exitCode 0) unless black errors
254
+ // exitCode 1 in check mode = files would be reformatted
255
+ // exitCode 123 = internal error
256
+ const success = exitCode === 0;
257
+ return {
258
+ filesChanged,
259
+ filesUnchanged,
260
+ filesChecked,
261
+ success,
262
+ wouldReformat,
263
+ };
264
+ }
94
265
  //# sourceMappingURL=parsers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,7 @@ import { type RunResult } from "@paretools/shared";
2
2
  export declare function pip(args: string[], cwd?: string): Promise<RunResult>;
3
3
  export declare function mypy(args: string[], cwd?: string): Promise<RunResult>;
4
4
  export declare function ruff(args: string[], cwd?: string): Promise<RunResult>;
5
+ export declare function pytest(args: string[], cwd?: string): Promise<RunResult>;
6
+ export declare function uv(args: string[], cwd?: string): Promise<RunResult>;
7
+ export declare function black(args: string[], cwd?: string): Promise<RunResult>;
5
8
  //# sourceMappingURL=python-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"python-runner.d.ts","sourceRoot":"","sources":["../../src/lib/python-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAExD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAE1E;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAE3E;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAE3E"}
1
+ {"version":3,"file":"python-runner.d.ts","sourceRoot":"","sources":["../../src/lib/python-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAExD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAE1E;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAE3E;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAE3E;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAE7E;AAED,wBAAsB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAEzE;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAE5E"}
@@ -8,4 +8,13 @@ export async function mypy(args, cwd) {
8
8
  export async function ruff(args, cwd) {
9
9
  return run("ruff", args, { cwd });
10
10
  }
11
+ export async function pytest(args, cwd) {
12
+ return run("pytest", args, { cwd, timeout: 300_000 });
13
+ }
14
+ export async function uv(args, cwd) {
15
+ return run("uv", args, { cwd, timeout: 120_000 });
16
+ }
17
+ export async function black(args, cwd) {
18
+ return run("black", args, { cwd });
19
+ }
11
20
  //# sourceMappingURL=python-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"python-runner.js","sourceRoot":"","sources":["../../src/lib/python-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAkB,MAAM,mBAAmB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,GAAY;IACpD,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc,EAAE,GAAY;IACrD,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc,EAAE,GAAY;IACrD,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"python-runner.js","sourceRoot":"","sources":["../../src/lib/python-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAkB,MAAM,mBAAmB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,GAAY;IACpD,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc,EAAE,GAAY;IACrD,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc,EAAE,GAAY;IACrD,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,GAAY;IACvD,OAAO,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAc,EAAE,GAAY;IACnD,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAc,EAAE,GAAY;IACtD,OAAO,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACrC,CAAC"}