@paretools/github 0.8.0 → 0.8.2

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 (45) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/lib/formatters.d.ts +52 -1
  3. package/dist/lib/formatters.d.ts.map +1 -1
  4. package/dist/lib/formatters.js +110 -0
  5. package/dist/lib/formatters.js.map +1 -1
  6. package/dist/lib/parsers.d.ts +36 -1
  7. package/dist/lib/parsers.d.ts.map +1 -1
  8. package/dist/lib/parsers.js +132 -0
  9. package/dist/lib/parsers.js.map +1 -1
  10. package/dist/schemas/index.d.ts +142 -0
  11. package/dist/schemas/index.d.ts.map +1 -1
  12. package/dist/schemas/index.js +93 -0
  13. package/dist/schemas/index.js.map +1 -1
  14. package/dist/tools/api.d.ts +3 -0
  15. package/dist/tools/api.d.ts.map +1 -0
  16. package/dist/tools/api.js +75 -0
  17. package/dist/tools/api.js.map +1 -0
  18. package/dist/tools/gist-create.d.ts +3 -0
  19. package/dist/tools/gist-create.d.ts.map +1 -0
  20. package/dist/tools/gist-create.js +52 -0
  21. package/dist/tools/gist-create.js.map +1 -0
  22. package/dist/tools/index.d.ts.map +1 -1
  23. package/dist/tools/index.js +21 -0
  24. package/dist/tools/index.js.map +1 -1
  25. package/dist/tools/pr-checks.d.ts +3 -0
  26. package/dist/tools/pr-checks.d.ts.map +1 -0
  27. package/dist/tools/pr-checks.js +39 -0
  28. package/dist/tools/pr-checks.js.map +1 -0
  29. package/dist/tools/pr-diff.d.ts +3 -0
  30. package/dist/tools/pr-diff.d.ts.map +1 -0
  31. package/dist/tools/pr-diff.js +130 -0
  32. package/dist/tools/pr-diff.js.map +1 -0
  33. package/dist/tools/release-create.d.ts +3 -0
  34. package/dist/tools/release-create.d.ts.map +1 -0
  35. package/dist/tools/release-create.js +68 -0
  36. package/dist/tools/release-create.js.map +1 -0
  37. package/dist/tools/release-list.d.ts +3 -0
  38. package/dist/tools/release-list.d.ts.map +1 -0
  39. package/dist/tools/release-list.js +50 -0
  40. package/dist/tools/release-list.js.map +1 -0
  41. package/dist/tools/run-rerun.d.ts +3 -0
  42. package/dist/tools/run-rerun.d.ts.map +1 -0
  43. package/dist/tools/run-rerun.js +45 -0
  44. package/dist/tools/run-rerun.js.map +1 -0
  45. package/package.json +1 -1
@@ -0,0 +1,130 @@
1
+ import { z } from "zod";
2
+ import { compactDualOutput, INPUT_LIMITS } from "@paretools/shared";
3
+ import { assertNoFlagInjection } from "@paretools/shared";
4
+ import { ghCmd } from "../lib/gh-runner.js";
5
+ import { formatPrDiff, compactPrDiffMap, formatPrDiffCompact } from "../lib/formatters.js";
6
+ import { PrDiffResultSchema } from "../schemas/index.js";
7
+ export function registerPrDiffTool(server) {
8
+ server.registerTool("pr-diff", {
9
+ title: "PR Diff",
10
+ description: "Returns file-level diff statistics for a pull request. Use full=true for patch content. Use instead of running `gh pr diff` in the terminal.",
11
+ inputSchema: {
12
+ pr: z.number().describe("Pull request number"),
13
+ repo: z
14
+ .string()
15
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
16
+ .optional()
17
+ .describe("Repository in OWNER/REPO format (default: current repo)"),
18
+ full: z
19
+ .boolean()
20
+ .optional()
21
+ .default(false)
22
+ .describe("Include full patch content in chunks"),
23
+ compact: z
24
+ .boolean()
25
+ .optional()
26
+ .default(true)
27
+ .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
28
+ },
29
+ outputSchema: PrDiffResultSchema,
30
+ }, async ({ pr, repo, full, compact }) => {
31
+ if (repo) {
32
+ assertNoFlagInjection(repo, "repo");
33
+ }
34
+ // Get numstat for structured file-level stats
35
+ const numstatArgs = ["pr", "diff", String(pr), "--patch=false"];
36
+ if (repo)
37
+ numstatArgs.push("--repo", repo);
38
+ // We use a two-pass approach: first get numstat, then optionally get full patch
39
+ const diffArgs = ["pr", "diff", String(pr)];
40
+ if (repo)
41
+ diffArgs.push("--repo", repo);
42
+ const result = await ghCmd(diffArgs, { cwd: process.cwd() });
43
+ if (result.exitCode !== 0) {
44
+ throw new Error(`gh pr diff failed: ${result.stderr}`);
45
+ }
46
+ // Parse the unified diff output to extract numstat-like data
47
+ const diff = parsePrDiffFromPatch(result.stdout);
48
+ // If full patch requested, attach chunk data
49
+ if (full && diff.files.length > 0) {
50
+ const filePatches = result.stdout.split(/^diff --git /m).filter(Boolean);
51
+ for (const patch of filePatches) {
52
+ const fileMatch = patch.match(/b\/(.+)\n/);
53
+ if (fileMatch) {
54
+ const matchedFile = diff.files.find((f) => f.file === fileMatch[1]);
55
+ if (matchedFile) {
56
+ const chunks = patch.split(/^@@/m).slice(1);
57
+ matchedFile.chunks = chunks.map((chunk) => {
58
+ const headerEnd = chunk.indexOf("\n");
59
+ return {
60
+ header: `@@${chunk.slice(0, headerEnd)}`,
61
+ lines: chunk.slice(headerEnd + 1),
62
+ };
63
+ });
64
+ }
65
+ }
66
+ }
67
+ }
68
+ return compactDualOutput(diff, result.stdout, formatPrDiff, compactPrDiffMap, formatPrDiffCompact, compact === false);
69
+ });
70
+ }
71
+ /**
72
+ * Parses unified diff output from `gh pr diff` into structured file stats.
73
+ * Counts additions (+) and deletions (-) from diff hunks.
74
+ */
75
+ function parsePrDiffFromPatch(patchOutput) {
76
+ const filePatches = patchOutput.split(/^diff --git /m).filter(Boolean);
77
+ const files = filePatches.map((patch) => {
78
+ // Extract file path from "a/path b/path" header
79
+ const headerMatch = patch.match(/^a\/(.+?) b\/(.+?)\n/);
80
+ const oldFile = headerMatch?.[1] ?? "";
81
+ const newFile = headerMatch?.[2] ?? "";
82
+ // Detect status from diff headers
83
+ const isNew = /^new file mode/m.test(patch);
84
+ const isDeleted = /^deleted file mode/m.test(patch);
85
+ const isRenamed = /^rename from /m.test(patch) || /^similarity index/m.test(patch);
86
+ // Count additions and deletions from diff lines
87
+ let additions = 0;
88
+ let deletions = 0;
89
+ const lines = patch.split("\n");
90
+ let inHunk = false;
91
+ for (const line of lines) {
92
+ if (line.startsWith("@@")) {
93
+ inHunk = true;
94
+ continue;
95
+ }
96
+ if (!inHunk)
97
+ continue;
98
+ // Stop at next diff header or file boundary
99
+ if (line.startsWith("diff --git "))
100
+ break;
101
+ if (line.startsWith("+") && !line.startsWith("+++")) {
102
+ additions++;
103
+ }
104
+ else if (line.startsWith("-") && !line.startsWith("---")) {
105
+ deletions++;
106
+ }
107
+ }
108
+ const status = isNew
109
+ ? "added"
110
+ : isDeleted
111
+ ? "deleted"
112
+ : isRenamed
113
+ ? "renamed"
114
+ : "modified";
115
+ return {
116
+ file: newFile,
117
+ status,
118
+ additions,
119
+ deletions,
120
+ ...(isRenamed && oldFile !== newFile ? { oldFile } : {}),
121
+ };
122
+ });
123
+ return {
124
+ files,
125
+ totalAdditions: files.reduce((sum, f) => sum + f.additions, 0),
126
+ totalDeletions: files.reduce((sum, f) => sum + f.deletions, 0),
127
+ totalFiles: files.length,
128
+ };
129
+ }
130
+ //# sourceMappingURL=pr-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-diff.js","sourceRoot":"","sources":["../../src/tools/pr-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerReleaseCreateTool(server: McpServer): void;
3
+ //# sourceMappingURL=release-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-create.d.ts","sourceRoot":"","sources":["../../src/tools/release-create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QA6D1D"}
@@ -0,0 +1,68 @@
1
+ import { z } from "zod";
2
+ import { dualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
+ import { ghCmd } from "../lib/gh-runner.js";
4
+ import { parseReleaseCreate } from "../lib/parsers.js";
5
+ import { formatReleaseCreate } from "../lib/formatters.js";
6
+ import { ReleaseCreateResultSchema } from "../schemas/index.js";
7
+ export function registerReleaseCreateTool(server) {
8
+ server.registerTool("release-create", {
9
+ title: "Release Create",
10
+ description: "Creates a new GitHub release. Returns structured data with tag, URL, draft, and prerelease status. Use instead of running `gh release create` in the terminal.",
11
+ inputSchema: {
12
+ tag: z.string().max(INPUT_LIMITS.SHORT_STRING_MAX).describe("Tag name for the release"),
13
+ title: z
14
+ .string()
15
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
16
+ .optional()
17
+ .describe("Release title (default: tag name)"),
18
+ notes: z.string().max(INPUT_LIMITS.STRING_MAX).optional().describe("Release notes/body"),
19
+ draft: z.boolean().optional().default(false).describe("Create as draft release"),
20
+ prerelease: z.boolean().optional().default(false).describe("Mark as prerelease"),
21
+ target: z
22
+ .string()
23
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
24
+ .optional()
25
+ .describe("Target commitish (branch or commit SHA)"),
26
+ repo: z
27
+ .string()
28
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
29
+ .optional()
30
+ .describe("Repository in owner/repo format (default: current repo)"),
31
+ path: z
32
+ .string()
33
+ .max(INPUT_LIMITS.PATH_MAX)
34
+ .optional()
35
+ .describe("Repository path (default: cwd)"),
36
+ },
37
+ outputSchema: ReleaseCreateResultSchema,
38
+ }, async ({ tag, title, notes, draft, prerelease, target, repo, path }) => {
39
+ const cwd = path || process.cwd();
40
+ assertNoFlagInjection(tag, "tag");
41
+ if (title)
42
+ assertNoFlagInjection(title, "title");
43
+ if (target)
44
+ assertNoFlagInjection(target, "target");
45
+ if (repo)
46
+ assertNoFlagInjection(repo, "repo");
47
+ const args = ["release", "create", tag];
48
+ if (title)
49
+ args.push("--title", title);
50
+ if (notes !== undefined)
51
+ args.push("--notes", notes);
52
+ if (draft)
53
+ args.push("--draft");
54
+ if (prerelease)
55
+ args.push("--prerelease");
56
+ if (target)
57
+ args.push("--target", target);
58
+ if (repo)
59
+ args.push("--repo", repo);
60
+ const result = await ghCmd(args, cwd);
61
+ if (result.exitCode !== 0) {
62
+ throw new Error(`gh release create failed: ${result.stderr}`);
63
+ }
64
+ const data = parseReleaseCreate(result.stdout, tag, !!draft, !!prerelease);
65
+ return dualOutput(data, formatReleaseCreate);
66
+ });
67
+ }
68
+ //# sourceMappingURL=release-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-create.js","sourceRoot":"","sources":["../../src/tools/release-create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerReleaseListTool(server: McpServer): void;
3
+ //# sourceMappingURL=release-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-list.d.ts","sourceRoot":"","sources":["../../src/tools/release-list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QA0DxD"}
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
+ import { ghCmd } from "../lib/gh-runner.js";
4
+ import { parseReleaseList } from "../lib/parsers.js";
5
+ import { formatReleaseList, compactReleaseListMap, formatReleaseListCompact, } from "../lib/formatters.js";
6
+ import { ReleaseListResultSchema } from "../schemas/index.js";
7
+ const RELEASE_LIST_FIELDS = "tagName,name,isDraft,isPrerelease,publishedAt,url";
8
+ export function registerReleaseListTool(server) {
9
+ server.registerTool("release-list", {
10
+ title: "Release List",
11
+ description: "Lists GitHub releases for a repository. Returns structured list with tag, name, draft/prerelease status, publish date, and URL. Use instead of running `gh release list` in the terminal.",
12
+ inputSchema: {
13
+ limit: z
14
+ .number()
15
+ .optional()
16
+ .default(10)
17
+ .describe("Maximum number of releases to return (default: 10)"),
18
+ repo: z
19
+ .string()
20
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
21
+ .optional()
22
+ .describe("Repository in owner/repo format (default: current repo)"),
23
+ path: z
24
+ .string()
25
+ .max(INPUT_LIMITS.PATH_MAX)
26
+ .optional()
27
+ .describe("Repository path (default: cwd)"),
28
+ compact: z
29
+ .boolean()
30
+ .optional()
31
+ .default(true)
32
+ .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
33
+ },
34
+ outputSchema: ReleaseListResultSchema,
35
+ }, async ({ limit, repo, path, compact }) => {
36
+ const cwd = path || process.cwd();
37
+ if (repo)
38
+ assertNoFlagInjection(repo, "repo");
39
+ const args = ["release", "list", "--json", RELEASE_LIST_FIELDS, "--limit", String(limit)];
40
+ if (repo)
41
+ args.push("--repo", repo);
42
+ const result = await ghCmd(args, cwd);
43
+ if (result.exitCode !== 0) {
44
+ throw new Error(`gh release list failed: ${result.stderr}`);
45
+ }
46
+ const data = parseReleaseList(result.stdout);
47
+ return compactDualOutput(data, result.stdout, formatReleaseList, compactReleaseListMap, formatReleaseListCompact, compact === false);
48
+ });
49
+ }
50
+ //# sourceMappingURL=release-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-list.js","sourceRoot":"","sources":["../../src/tools/release-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,mBAAmB,GAAG,mDAAmD,CAAC;AAEhF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,2LAA2L;QAC7L,WAAW,EAAE;YACX,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,oDAAoD,CAAC;YACjE,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,EAAE;iBACV,QAAQ,CAAC,yDAAyD,CAAC;YACtE,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,gCAAgC,CAAC;YAC7C,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,uBAAuB;KACtC,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,IAAI;YAAE,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE9C,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1F,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEtC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerRunRerunTool(server: McpServer): void;
3
+ //# sourceMappingURL=run-rerun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-rerun.d.ts","sourceRoot":"","sources":["../../src/tools/run-rerun.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QA4CrD"}
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ import { dualOutput, INPUT_LIMITS } from "@paretools/shared";
3
+ import { ghCmd } from "../lib/gh-runner.js";
4
+ import { parseRunRerun } from "../lib/parsers.js";
5
+ import { formatRunRerun } from "../lib/formatters.js";
6
+ import { RunRerunResultSchema } from "../schemas/index.js";
7
+ export function registerRunRerunTool(server) {
8
+ server.registerTool("run-rerun", {
9
+ title: "Run Rerun",
10
+ description: "Re-runs a workflow run by ID. Optionally re-runs only failed jobs. Returns structured result with run ID, status, and URL. Use instead of running `gh run rerun` in the terminal.",
11
+ inputSchema: {
12
+ runId: z.number().describe("Workflow run ID to re-run"),
13
+ failedOnly: z
14
+ .boolean()
15
+ .optional()
16
+ .default(false)
17
+ .describe("Re-run only failed jobs (default: false)"),
18
+ repo: z
19
+ .string()
20
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
21
+ .optional()
22
+ .describe("Repository in OWNER/REPO format (default: detected from git remote)"),
23
+ path: z
24
+ .string()
25
+ .max(INPUT_LIMITS.PATH_MAX)
26
+ .optional()
27
+ .describe("Repository path (default: cwd)"),
28
+ },
29
+ outputSchema: RunRerunResultSchema,
30
+ }, async ({ runId, failedOnly, repo, path }) => {
31
+ const cwd = path || process.cwd();
32
+ const args = ["run", "rerun", String(runId)];
33
+ if (failedOnly)
34
+ args.push("--failed");
35
+ if (repo)
36
+ args.push("--repo", repo);
37
+ const result = await ghCmd(args, cwd);
38
+ if (result.exitCode !== 0) {
39
+ throw new Error(`gh run rerun failed: ${result.stderr}`);
40
+ }
41
+ const data = parseRunRerun(result.stdout, result.stderr, runId, failedOnly ?? false);
42
+ return dualOutput(data, formatRunRerun);
43
+ });
44
+ }
45
+ //# sourceMappingURL=run-rerun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-rerun.js","sourceRoot":"","sources":["../../src/tools/run-rerun.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,mLAAmL;QACrL,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YACvD,UAAU,EAAE,CAAC;iBACV,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,0CAA0C,CAAC;YACvD,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,EAAE;iBACV,QAAQ,CAAC,qEAAqE,CAAC;YAClF,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,gCAAgC,CAAC;SAC9C;QACD,YAAY,EAAE,oBAAoB;KACnC,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAElC,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,IAAI,UAAU;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEtC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,IAAI,KAAK,CAAC,CAAC;QACrF,OAAO,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1C,CAAC,CACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paretools/github",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "mcpName": "io.github.Dave-London/pare-github",
5
5
  "description": "MCP server for GitHub operations (PRs, issues, actions) with structured, token-efficient output",
6
6
  "license": "MIT",