@paretools/github 0.8.5 → 0.10.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.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/formatters.d.ts +10 -2
- package/dist/lib/formatters.d.ts.map +1 -1
- package/dist/lib/formatters.js +144 -16
- package/dist/lib/formatters.js.map +1 -1
- package/dist/lib/gh-runner.d.ts.map +1 -1
- package/dist/lib/gh-runner.js +2 -1
- package/dist/lib/gh-runner.js.map +1 -1
- package/dist/lib/parsers.d.ts +54 -18
- package/dist/lib/parsers.d.ts.map +1 -1
- package/dist/lib/parsers.js +426 -38
- package/dist/lib/parsers.js.map +1 -1
- package/dist/lib/path-validation.d.ts +13 -0
- package/dist/lib/path-validation.d.ts.map +1 -0
- package/dist/lib/path-validation.js +54 -0
- package/dist/lib/path-validation.js.map +1 -0
- package/dist/schemas/index.d.ts +267 -4
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +195 -4
- package/dist/schemas/index.js.map +1 -1
- package/dist/tools/api.d.ts.map +1 -1
- package/dist/tools/api.js +134 -8
- package/dist/tools/api.js.map +1 -1
- package/dist/tools/gist-create.d.ts.map +1 -1
- package/dist/tools/gist-create.js +91 -21
- package/dist/tools/gist-create.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/issue-close.d.ts.map +1 -1
- package/dist/tools/issue-close.js +56 -9
- package/dist/tools/issue-close.js.map +1 -1
- package/dist/tools/issue-comment.d.ts.map +1 -1
- package/dist/tools/issue-comment.js +60 -9
- package/dist/tools/issue-comment.js.map +1 -1
- package/dist/tools/issue-create.d.ts.map +1 -1
- package/dist/tools/issue-create.js +95 -9
- package/dist/tools/issue-create.js.map +1 -1
- package/dist/tools/issue-list.d.ts.map +1 -1
- package/dist/tools/issue-list.js +139 -11
- package/dist/tools/issue-list.js.map +1 -1
- package/dist/tools/issue-update.d.ts.map +1 -1
- package/dist/tools/issue-update.js +142 -15
- package/dist/tools/issue-update.js.map +1 -1
- package/dist/tools/issue-view.d.ts.map +1 -1
- package/dist/tools/issue-view.js +26 -14
- package/dist/tools/issue-view.js.map +1 -1
- package/dist/tools/label-create.d.ts +4 -0
- package/dist/tools/label-create.d.ts.map +1 -0
- package/dist/tools/label-create.js +73 -0
- package/dist/tools/label-create.js.map +1 -0
- package/dist/tools/label-list.d.ts +4 -0
- package/dist/tools/label-list.d.ts.map +1 -0
- package/dist/tools/label-list.js +71 -0
- package/dist/tools/label-list.js.map +1 -0
- package/dist/tools/pr-checks.d.ts.map +1 -1
- package/dist/tools/pr-checks.js +57 -11
- package/dist/tools/pr-checks.js.map +1 -1
- package/dist/tools/pr-comment.d.ts.map +1 -1
- package/dist/tools/pr-comment.js +60 -9
- package/dist/tools/pr-comment.js.map +1 -1
- package/dist/tools/pr-create.d.ts.map +1 -1
- package/dist/tools/pr-create.js +154 -9
- package/dist/tools/pr-create.js.map +1 -1
- package/dist/tools/pr-diff.d.ts.map +1 -1
- package/dist/tools/pr-diff.js +63 -16
- package/dist/tools/pr-diff.js.map +1 -1
- package/dist/tools/pr-list.d.ts.map +1 -1
- package/dist/tools/pr-list.js +115 -11
- package/dist/tools/pr-list.js.map +1 -1
- package/dist/tools/pr-merge.d.ts.map +1 -1
- package/dist/tools/pr-merge.js +104 -15
- package/dist/tools/pr-merge.js.map +1 -1
- package/dist/tools/pr-review.d.ts.map +1 -1
- package/dist/tools/pr-review.js +41 -8
- package/dist/tools/pr-review.js.map +1 -1
- package/dist/tools/pr-update.d.ts.map +1 -1
- package/dist/tools/pr-update.js +157 -10
- package/dist/tools/pr-update.js.map +1 -1
- package/dist/tools/pr-view.d.ts.map +1 -1
- package/dist/tools/pr-view.js +27 -14
- package/dist/tools/pr-view.js.map +1 -1
- package/dist/tools/release-create.d.ts.map +1 -1
- package/dist/tools/release-create.js +106 -9
- package/dist/tools/release-create.js.map +1 -1
- package/dist/tools/release-list.d.ts.map +1 -1
- package/dist/tools/release-list.js +39 -13
- package/dist/tools/release-list.js.map +1 -1
- package/dist/tools/run-list.d.ts.map +1 -1
- package/dist/tools/run-list.js +111 -12
- package/dist/tools/run-list.js.map +1 -1
- package/dist/tools/run-rerun.d.ts.map +1 -1
- package/dist/tools/run-rerun.js +38 -8
- package/dist/tools/run-rerun.js.map +1 -1
- package/dist/tools/run-view.d.ts.map +1 -1
- package/dist/tools/run-view.js +64 -13
- package/dist/tools/run-view.js.map +1 -1
- package/package.json +2 -2
package/dist/tools/issue-list.js
CHANGED
|
@@ -4,12 +4,13 @@ import { ghCmd } from "../lib/gh-runner.js";
|
|
|
4
4
|
import { parseIssueList } from "../lib/parsers.js";
|
|
5
5
|
import { formatIssueList, compactIssueListMap, formatIssueListCompact } from "../lib/formatters.js";
|
|
6
6
|
import { IssueListResultSchema } from "../schemas/index.js";
|
|
7
|
-
|
|
7
|
+
// S-gap P1: Add author, createdAt, milestone to JSON fields
|
|
8
|
+
const ISSUE_LIST_FIELDS = "number,state,title,url,labels,assignees,author,createdAt,milestone";
|
|
8
9
|
/** Registers the `issue-list` tool on the given MCP server. */
|
|
9
10
|
export function registerIssueListTool(server) {
|
|
10
11
|
server.registerTool("issue-list", {
|
|
11
12
|
title: "Issue List",
|
|
12
|
-
description: "Lists issues with optional filters. Returns structured list with issue number, state, title, labels,
|
|
13
|
+
description: "Lists issues with optional filters. Returns structured list with issue number, state, title, labels, assignees, author, creation date, and milestone.",
|
|
13
14
|
inputSchema: {
|
|
14
15
|
state: z
|
|
15
16
|
.enum(["open", "closed", "all"])
|
|
@@ -21,42 +22,169 @@ export function registerIssueListTool(server) {
|
|
|
21
22
|
.optional()
|
|
22
23
|
.default(30)
|
|
23
24
|
.describe("Maximum number of issues to return (default: 30)"),
|
|
25
|
+
paginate: z
|
|
26
|
+
.boolean()
|
|
27
|
+
.optional()
|
|
28
|
+
.default(false)
|
|
29
|
+
.describe("Fetch a larger paginated set (up to 1000 issues)"),
|
|
24
30
|
label: z.string().max(INPUT_LIMITS.SHORT_STRING_MAX).optional().describe("Filter by label"),
|
|
31
|
+
labels: z
|
|
32
|
+
.array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
|
|
33
|
+
.max(INPUT_LIMITS.ARRAY_MAX)
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("Filter by multiple labels (each maps to --label)"),
|
|
25
36
|
assignee: z
|
|
26
37
|
.string()
|
|
27
38
|
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
28
39
|
.optional()
|
|
29
40
|
.describe("Filter by assignee username"),
|
|
30
|
-
|
|
41
|
+
// S-gap P0: Add search param
|
|
42
|
+
search: z
|
|
31
43
|
.string()
|
|
32
|
-
.max(INPUT_LIMITS.
|
|
44
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
33
45
|
.optional()
|
|
34
|
-
.describe("
|
|
35
|
-
|
|
36
|
-
|
|
46
|
+
.describe("GitHub search syntax (-S/--search)"),
|
|
47
|
+
// S-gap P0: Add author filter
|
|
48
|
+
author: z
|
|
49
|
+
.string()
|
|
50
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
51
|
+
.optional()
|
|
52
|
+
.describe("Filter by author username (-A/--author)"),
|
|
53
|
+
// S-gap P1: Add milestone filter
|
|
54
|
+
milestone: z
|
|
55
|
+
.string()
|
|
56
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
57
|
+
.optional()
|
|
58
|
+
.describe("Filter by milestone name or number (-m/--milestone)"),
|
|
59
|
+
// S-gap P2: Add mention filter
|
|
60
|
+
mention: z
|
|
61
|
+
.string()
|
|
62
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
63
|
+
.optional()
|
|
64
|
+
.describe("Filter by mentioned user (--mention)"),
|
|
65
|
+
// S-gap P2: Add app filter
|
|
66
|
+
app: z
|
|
67
|
+
.string()
|
|
68
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
37
69
|
.optional()
|
|
38
|
-
.
|
|
39
|
-
|
|
70
|
+
.describe("Filter by GitHub App (--app)"),
|
|
71
|
+
// S-gap P1: Add repo for cross-repo listing
|
|
72
|
+
repo: z
|
|
73
|
+
.string()
|
|
74
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
75
|
+
.optional()
|
|
76
|
+
.describe("Repository in OWNER/REPO format (--repo). Default: current repo."),
|
|
77
|
+
path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Repository path"),
|
|
78
|
+
compact: z.boolean().optional().default(true).describe("Prefer compact output"),
|
|
40
79
|
},
|
|
41
80
|
outputSchema: IssueListResultSchema,
|
|
42
|
-
}, async ({ state, limit, label, assignee, path, compact }) => {
|
|
81
|
+
}, async ({ state, limit, paginate, label, labels, assignee, search, author, milestone, mention, app, repo, path, compact, }) => {
|
|
43
82
|
const cwd = path || process.cwd();
|
|
44
83
|
if (label)
|
|
45
84
|
assertNoFlagInjection(label, "label");
|
|
85
|
+
if (labels) {
|
|
86
|
+
for (const l of labels) {
|
|
87
|
+
assertNoFlagInjection(l, "labels");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
46
90
|
if (assignee)
|
|
47
91
|
assertNoFlagInjection(assignee, "assignee");
|
|
48
|
-
|
|
92
|
+
if (search)
|
|
93
|
+
assertNoFlagInjection(search, "search");
|
|
94
|
+
if (author)
|
|
95
|
+
assertNoFlagInjection(author, "author");
|
|
96
|
+
if (milestone)
|
|
97
|
+
assertNoFlagInjection(milestone, "milestone");
|
|
98
|
+
if (mention)
|
|
99
|
+
assertNoFlagInjection(mention, "mention");
|
|
100
|
+
if (app)
|
|
101
|
+
assertNoFlagInjection(app, "app");
|
|
102
|
+
if (repo)
|
|
103
|
+
assertNoFlagInjection(repo, "repo");
|
|
104
|
+
const requestedLimit = paginate ? 1000 : limit;
|
|
105
|
+
const args = [
|
|
106
|
+
"issue",
|
|
107
|
+
"list",
|
|
108
|
+
"--json",
|
|
109
|
+
ISSUE_LIST_FIELDS,
|
|
110
|
+
"--limit",
|
|
111
|
+
String(requestedLimit),
|
|
112
|
+
];
|
|
49
113
|
if (state)
|
|
50
114
|
args.push("--state", state);
|
|
51
115
|
if (label)
|
|
52
116
|
args.push("--label", label);
|
|
117
|
+
if (labels && labels.length > 0) {
|
|
118
|
+
for (const l of labels) {
|
|
119
|
+
args.push("--label", l);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
53
122
|
if (assignee)
|
|
54
123
|
args.push("--assignee", assignee);
|
|
124
|
+
if (search)
|
|
125
|
+
args.push("--search", search);
|
|
126
|
+
if (author)
|
|
127
|
+
args.push("--author", author);
|
|
128
|
+
if (milestone)
|
|
129
|
+
args.push("--milestone", milestone);
|
|
130
|
+
if (mention)
|
|
131
|
+
args.push("--mention", mention);
|
|
132
|
+
if (app)
|
|
133
|
+
args.push("--app", app);
|
|
134
|
+
if (repo)
|
|
135
|
+
args.push("--repo", repo);
|
|
55
136
|
const result = await ghCmd(args, cwd);
|
|
56
137
|
if (result.exitCode !== 0) {
|
|
57
138
|
throw new Error(`gh issue list failed: ${result.stderr}`);
|
|
58
139
|
}
|
|
59
140
|
const data = parseIssueList(result.stdout);
|
|
141
|
+
if (!paginate) {
|
|
142
|
+
const probeArgs = [
|
|
143
|
+
"issue",
|
|
144
|
+
"list",
|
|
145
|
+
"--json",
|
|
146
|
+
ISSUE_LIST_FIELDS,
|
|
147
|
+
"--limit",
|
|
148
|
+
String(limit + 1),
|
|
149
|
+
];
|
|
150
|
+
if (state)
|
|
151
|
+
probeArgs.push("--state", state);
|
|
152
|
+
if (label)
|
|
153
|
+
probeArgs.push("--label", label);
|
|
154
|
+
if (labels && labels.length > 0) {
|
|
155
|
+
for (const l of labels)
|
|
156
|
+
probeArgs.push("--label", l);
|
|
157
|
+
}
|
|
158
|
+
if (assignee)
|
|
159
|
+
probeArgs.push("--assignee", assignee);
|
|
160
|
+
if (search)
|
|
161
|
+
probeArgs.push("--search", search);
|
|
162
|
+
if (author)
|
|
163
|
+
probeArgs.push("--author", author);
|
|
164
|
+
if (milestone)
|
|
165
|
+
probeArgs.push("--milestone", milestone);
|
|
166
|
+
if (mention)
|
|
167
|
+
probeArgs.push("--mention", mention);
|
|
168
|
+
if (app)
|
|
169
|
+
probeArgs.push("--app", app);
|
|
170
|
+
if (repo)
|
|
171
|
+
probeArgs.push("--repo", repo);
|
|
172
|
+
const probeResult = await ghCmd(probeArgs, cwd);
|
|
173
|
+
if (probeResult.exitCode === 0) {
|
|
174
|
+
const probe = parseIssueList(probeResult.stdout);
|
|
175
|
+
const hasMore = probe.total > limit;
|
|
176
|
+
data.hasMore = hasMore;
|
|
177
|
+
data.totalAvailable = hasMore ? limit + 1 : data.total;
|
|
178
|
+
if (hasMore) {
|
|
179
|
+
data.issues = data.issues.slice(0, limit);
|
|
180
|
+
data.total = data.issues.length;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
data.hasMore = false;
|
|
186
|
+
data.totalAvailable = data.total;
|
|
187
|
+
}
|
|
60
188
|
return compactDualOutput(data, result.stdout, formatIssueList, compactIssueListMap, formatIssueListCompact, compact === false);
|
|
61
189
|
});
|
|
62
190
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-list.js","sourceRoot":"","sources":["../../src/tools/issue-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,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,iBAAiB,GAAG,
|
|
1
|
+
{"version":3,"file":"issue-list.js","sourceRoot":"","sources":["../../src/tools/issue-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-update.d.ts","sourceRoot":"","sources":["../../src/tools/issue-update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"issue-update.d.ts","sourceRoot":"","sources":["../../src/tools/issue-update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,iEAAiE;AACjE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QAmPxD"}
|
|
@@ -4,50 +4,117 @@ import { ghCmd } from "../lib/gh-runner.js";
|
|
|
4
4
|
import { parseIssueUpdate } from "../lib/parsers.js";
|
|
5
5
|
import { formatIssueUpdate } from "../lib/formatters.js";
|
|
6
6
|
import { EditResultSchema } from "../schemas/index.js";
|
|
7
|
+
function classifyIssueUpdateError(stderr) {
|
|
8
|
+
const lower = stderr.toLowerCase();
|
|
9
|
+
if (/not found|could not resolve|no issue/.test(lower))
|
|
10
|
+
return "not-found";
|
|
11
|
+
if (/forbidden|permission|403/.test(lower))
|
|
12
|
+
return "permission-denied";
|
|
13
|
+
if (/validation|invalid|required|unprocessable/.test(lower))
|
|
14
|
+
return "validation";
|
|
15
|
+
return "unknown";
|
|
16
|
+
}
|
|
7
17
|
/** Registers the `issue-update` tool on the given MCP server. */
|
|
8
18
|
export function registerIssueUpdateTool(server) {
|
|
9
19
|
server.registerTool("issue-update", {
|
|
10
20
|
title: "Issue Update",
|
|
11
|
-
description: "Updates issue metadata (title, body, labels, assignees
|
|
21
|
+
description: "Updates issue metadata (title, body, labels, assignees, milestone, projects). " +
|
|
22
|
+
"All fields except `number` are optional — only supply the fields you want to change. " +
|
|
23
|
+
"For list fields (labels, assignees, projects), use `add*` to append and `remove*` to " +
|
|
24
|
+
"delete specific items without affecting others. " +
|
|
25
|
+
"Returns structured data with issue number and URL.",
|
|
12
26
|
inputSchema: {
|
|
13
|
-
|
|
14
|
-
|
|
27
|
+
// ── Target ──────────────────────────────────────────────────
|
|
28
|
+
/** Issue number (integer) or full GitHub issue URL. */
|
|
29
|
+
number: z
|
|
30
|
+
.string()
|
|
31
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
32
|
+
.describe("Issue number or full GitHub issue URL to update"),
|
|
33
|
+
/** Repository path on disk. Defaults to cwd. */
|
|
34
|
+
path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Repository path"),
|
|
35
|
+
// ── Content fields ──────────────────────────────────────────
|
|
36
|
+
/** Replace the issue title entirely. */
|
|
37
|
+
title: z
|
|
15
38
|
.string()
|
|
16
|
-
.max(INPUT_LIMITS.
|
|
39
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
17
40
|
.optional()
|
|
18
|
-
.describe("
|
|
19
|
-
|
|
41
|
+
.describe("New issue title (replaces existing)"),
|
|
42
|
+
/** Replace the issue body entirely. Passed via stdin to avoid shell escaping issues. */
|
|
20
43
|
body: z
|
|
21
44
|
.string()
|
|
22
45
|
.max(INPUT_LIMITS.STRING_MAX)
|
|
23
46
|
.optional()
|
|
24
|
-
.describe("New issue body/description"),
|
|
47
|
+
.describe("New issue body/description (replaces existing, sent via stdin)"),
|
|
48
|
+
// ── Labels (additive/subtractive) ───────────────────────────
|
|
49
|
+
/** Labels to add to the issue. Does not remove existing labels. */
|
|
25
50
|
addLabels: z
|
|
26
51
|
.array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
|
|
27
52
|
.max(INPUT_LIMITS.ARRAY_MAX)
|
|
28
53
|
.optional()
|
|
29
|
-
.describe("Labels to add"),
|
|
54
|
+
.describe("Labels to add (preserves existing labels)"),
|
|
55
|
+
/** Labels to remove from the issue. Ignores labels not present. */
|
|
30
56
|
removeLabels: z
|
|
31
57
|
.array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
|
|
32
58
|
.max(INPUT_LIMITS.ARRAY_MAX)
|
|
33
59
|
.optional()
|
|
34
|
-
.describe("Labels to remove"),
|
|
60
|
+
.describe("Labels to remove (ignores labels not currently set)"),
|
|
61
|
+
// ── Assignees (additive/subtractive) ────────────────────────
|
|
62
|
+
/** Assignees to add. Does not remove existing assignees. */
|
|
35
63
|
addAssignees: z
|
|
36
64
|
.array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
|
|
37
65
|
.max(INPUT_LIMITS.ARRAY_MAX)
|
|
38
66
|
.optional()
|
|
39
|
-
.describe("
|
|
67
|
+
.describe("GitHub usernames to assign (preserves existing assignees)"),
|
|
68
|
+
/** Assignees to remove. Ignores users not currently assigned. */
|
|
40
69
|
removeAssignees: z
|
|
41
70
|
.array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
|
|
42
71
|
.max(INPUT_LIMITS.ARRAY_MAX)
|
|
43
72
|
.optional()
|
|
44
|
-
.describe("
|
|
73
|
+
.describe("GitHub usernames to unassign (ignores users not assigned)"),
|
|
74
|
+
// ── Milestone ───────────────────────────────────────────────
|
|
75
|
+
/** Set the milestone. Use `removeMilestone` to clear it instead. */
|
|
76
|
+
milestone: z
|
|
77
|
+
.string()
|
|
78
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
79
|
+
.optional()
|
|
80
|
+
.describe("Set milestone by name or number (--milestone). Mutually exclusive with removeMilestone."),
|
|
81
|
+
/** Remove the current milestone from the issue. */
|
|
82
|
+
removeMilestone: z
|
|
83
|
+
.boolean()
|
|
84
|
+
.optional()
|
|
85
|
+
.describe("Remove the milestone from the issue (--remove-milestone). Mutually exclusive with milestone."),
|
|
86
|
+
// ── Projects (additive/subtractive) ─────────────────────────
|
|
87
|
+
/** Projects to add. Does not remove existing project associations. */
|
|
88
|
+
addProjects: z
|
|
89
|
+
.array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
|
|
90
|
+
.max(INPUT_LIMITS.ARRAY_MAX)
|
|
91
|
+
.optional()
|
|
92
|
+
.describe("Project board names to add (--add-project)"),
|
|
93
|
+
/** Projects to remove. Ignores projects not currently associated. */
|
|
94
|
+
removeProjects: z
|
|
95
|
+
.array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
|
|
96
|
+
.max(INPUT_LIMITS.ARRAY_MAX)
|
|
97
|
+
.optional()
|
|
98
|
+
.describe("Project board names to remove (--remove-project)"),
|
|
99
|
+
// ── Cross-repo ──────────────────────────────────────────────
|
|
100
|
+
/** Target a different repository than the one at `path`. */
|
|
101
|
+
repo: z
|
|
102
|
+
.string()
|
|
103
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
104
|
+
.optional()
|
|
105
|
+
.describe("Repository in OWNER/REPO format (--repo). Default: current repo."),
|
|
45
106
|
},
|
|
46
107
|
outputSchema: EditResultSchema,
|
|
47
|
-
}, async ({ number, path, title, body, addLabels, removeLabels, addAssignees, removeAssignees, }) => {
|
|
108
|
+
}, async ({ number, path, title, body, addLabels, removeLabels, addAssignees, removeAssignees, milestone, removeMilestone, addProjects, removeProjects, repo, }) => {
|
|
48
109
|
const cwd = path || process.cwd();
|
|
49
110
|
if (title)
|
|
50
111
|
assertNoFlagInjection(title, "title");
|
|
112
|
+
if (typeof number === "string")
|
|
113
|
+
assertNoFlagInjection(number, "number");
|
|
114
|
+
if (milestone)
|
|
115
|
+
assertNoFlagInjection(milestone, "milestone");
|
|
116
|
+
if (repo)
|
|
117
|
+
assertNoFlagInjection(repo, "repo");
|
|
51
118
|
if (addLabels) {
|
|
52
119
|
for (const label of addLabels) {
|
|
53
120
|
assertNoFlagInjection(label, "addLabels");
|
|
@@ -68,7 +135,41 @@ export function registerIssueUpdateTool(server) {
|
|
|
68
135
|
assertNoFlagInjection(assignee, "removeAssignees");
|
|
69
136
|
}
|
|
70
137
|
}
|
|
71
|
-
|
|
138
|
+
if (addProjects) {
|
|
139
|
+
for (const project of addProjects) {
|
|
140
|
+
assertNoFlagInjection(project, "addProjects");
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (removeProjects) {
|
|
144
|
+
for (const project of removeProjects) {
|
|
145
|
+
assertNoFlagInjection(project, "removeProjects");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const selector = String(number);
|
|
149
|
+
const issueNum = typeof number === "number" ? number : 0;
|
|
150
|
+
const updatedFields = [
|
|
151
|
+
title ? "title" : undefined,
|
|
152
|
+
body ? "body" : undefined,
|
|
153
|
+
addLabels && addLabels.length > 0 ? "labels" : undefined,
|
|
154
|
+
removeLabels && removeLabels.length > 0 ? "labels" : undefined,
|
|
155
|
+
addAssignees && addAssignees.length > 0 ? "assignees" : undefined,
|
|
156
|
+
removeAssignees && removeAssignees.length > 0 ? "assignees" : undefined,
|
|
157
|
+
milestone ? "milestone" : undefined,
|
|
158
|
+
removeMilestone ? "milestone" : undefined,
|
|
159
|
+
addProjects && addProjects.length > 0 ? "projects" : undefined,
|
|
160
|
+
removeProjects && removeProjects.length > 0 ? "projects" : undefined,
|
|
161
|
+
].filter(Boolean);
|
|
162
|
+
const operations = [
|
|
163
|
+
addLabels && addLabels.length > 0 ? "add-label" : undefined,
|
|
164
|
+
removeLabels && removeLabels.length > 0 ? "remove-label" : undefined,
|
|
165
|
+
addAssignees && addAssignees.length > 0 ? "add-assignee" : undefined,
|
|
166
|
+
removeAssignees && removeAssignees.length > 0 ? "remove-assignee" : undefined,
|
|
167
|
+
addProjects && addProjects.length > 0 ? "add-project" : undefined,
|
|
168
|
+
removeProjects && removeProjects.length > 0 ? "remove-project" : undefined,
|
|
169
|
+
milestone ? "set-milestone" : undefined,
|
|
170
|
+
removeMilestone ? "remove-milestone" : undefined,
|
|
171
|
+
].filter(Boolean);
|
|
172
|
+
const args = ["issue", "edit", selector];
|
|
72
173
|
if (title)
|
|
73
174
|
args.push("--title", title);
|
|
74
175
|
if (addLabels && addLabels.length > 0) {
|
|
@@ -91,14 +192,40 @@ export function registerIssueUpdateTool(server) {
|
|
|
91
192
|
args.push("--remove-assignee", assignee);
|
|
92
193
|
}
|
|
93
194
|
}
|
|
195
|
+
// Milestone: set or remove (mutually exclusive)
|
|
196
|
+
if (milestone)
|
|
197
|
+
args.push("--milestone", milestone);
|
|
198
|
+
if (removeMilestone)
|
|
199
|
+
args.push("--remove-milestone");
|
|
200
|
+
// Projects: add or remove
|
|
201
|
+
if (addProjects && addProjects.length > 0) {
|
|
202
|
+
for (const project of addProjects) {
|
|
203
|
+
args.push("--add-project", project);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (removeProjects && removeProjects.length > 0) {
|
|
207
|
+
for (const project of removeProjects) {
|
|
208
|
+
args.push("--remove-project", project);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (repo)
|
|
212
|
+
args.push("--repo", repo);
|
|
94
213
|
if (body) {
|
|
95
214
|
args.push("--body-file", "-");
|
|
96
215
|
}
|
|
97
216
|
const result = await ghCmd(args, body ? { cwd, stdin: body } : { cwd });
|
|
98
217
|
if (result.exitCode !== 0) {
|
|
99
|
-
|
|
218
|
+
const combined = `${result.stdout}\n${result.stderr}`.trim();
|
|
219
|
+
return dualOutput({
|
|
220
|
+
number: issueNum,
|
|
221
|
+
url: "",
|
|
222
|
+
updatedFields,
|
|
223
|
+
operations,
|
|
224
|
+
errorType: classifyIssueUpdateError(combined),
|
|
225
|
+
errorMessage: combined || "gh issue edit failed",
|
|
226
|
+
}, formatIssueUpdate);
|
|
100
227
|
}
|
|
101
|
-
const data = parseIssueUpdate(result.stdout,
|
|
228
|
+
const data = parseIssueUpdate(result.stdout, issueNum, updatedFields, operations);
|
|
102
229
|
return dualOutput(data, formatIssueUpdate);
|
|
103
230
|
});
|
|
104
231
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-update.js","sourceRoot":"","sources":["../../src/tools/issue-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,iEAAiE;AACjE,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"issue-update.js","sourceRoot":"","sources":["../../src/tools/issue-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-view.d.ts","sourceRoot":"","sources":["../../src/tools/issue-view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"issue-view.d.ts","sourceRoot":"","sources":["../../src/tools/issue-view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,+DAA+D;AAC/D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAoDtD"}
|
package/dist/tools/issue-view.js
CHANGED
|
@@ -1,32 +1,44 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { compactDualOutput, INPUT_LIMITS } from "@paretools/shared";
|
|
2
|
+
import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
|
|
3
3
|
import { ghCmd } from "../lib/gh-runner.js";
|
|
4
4
|
import { parseIssueView } from "../lib/parsers.js";
|
|
5
5
|
import { formatIssueView, compactIssueViewMap, formatIssueViewCompact } from "../lib/formatters.js";
|
|
6
6
|
import { IssueViewResultSchema } from "../schemas/index.js";
|
|
7
|
-
|
|
7
|
+
// S-gap: Add stateReason, author, milestone, updatedAt, closedAt, isPinned, projectItems
|
|
8
|
+
const ISSUE_VIEW_FIELDS = "number,state,title,body,labels,assignees,url,createdAt,stateReason,author,milestone,updatedAt,closedAt,isPinned,projectItems";
|
|
8
9
|
/** Registers the `issue-view` tool on the given MCP server. */
|
|
9
10
|
export function registerIssueViewTool(server) {
|
|
10
11
|
server.registerTool("issue-view", {
|
|
11
12
|
title: "Issue View",
|
|
12
|
-
description: "Views an issue by number. Returns structured data with state, labels, assignees,
|
|
13
|
+
description: "Views an issue by number or URL. Returns structured data with state, labels, assignees, author, milestone, close reason, and body.",
|
|
13
14
|
inputSchema: {
|
|
14
|
-
number: z.
|
|
15
|
-
|
|
16
|
-
.string()
|
|
17
|
-
.max(INPUT_LIMITS.PATH_MAX)
|
|
18
|
-
.optional()
|
|
19
|
-
.describe("Repository path (default: cwd)"),
|
|
20
|
-
compact: z
|
|
15
|
+
number: z.string().max(INPUT_LIMITS.STRING_MAX).describe("Issue number or URL"),
|
|
16
|
+
comments: z
|
|
21
17
|
.boolean()
|
|
22
18
|
.optional()
|
|
23
|
-
.
|
|
24
|
-
|
|
19
|
+
.describe("Include issue comments in output (-c/--comments)"),
|
|
20
|
+
// S-gap P1: Add repo for cross-repo viewing
|
|
21
|
+
repo: z
|
|
22
|
+
.string()
|
|
23
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
24
|
+
.optional()
|
|
25
|
+
.describe("Repository in OWNER/REPO format (--repo). Default: current repo."),
|
|
26
|
+
path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Repository path"),
|
|
27
|
+
compact: z.boolean().optional().default(true).describe("Prefer compact output"),
|
|
25
28
|
},
|
|
26
29
|
outputSchema: IssueViewResultSchema,
|
|
27
|
-
}, async ({ number, path, compact }) => {
|
|
30
|
+
}, async ({ number, comments, repo, path, compact }) => {
|
|
28
31
|
const cwd = path || process.cwd();
|
|
29
|
-
|
|
32
|
+
if (repo)
|
|
33
|
+
assertNoFlagInjection(repo, "repo");
|
|
34
|
+
if (typeof number === "string")
|
|
35
|
+
assertNoFlagInjection(number, "number");
|
|
36
|
+
const selector = String(number);
|
|
37
|
+
const args = ["issue", "view", selector, "--json", ISSUE_VIEW_FIELDS];
|
|
38
|
+
if (comments)
|
|
39
|
+
args.push("--comments");
|
|
40
|
+
if (repo)
|
|
41
|
+
args.push("--repo", repo);
|
|
30
42
|
const result = await ghCmd(args, cwd);
|
|
31
43
|
if (result.exitCode !== 0) {
|
|
32
44
|
throw new Error(`gh issue view failed: ${result.stderr}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-view.js","sourceRoot":"","sources":["../../src/tools/issue-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"issue-view.js","sourceRoot":"","sources":["../../src/tools/issue-view.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,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,yFAAyF;AACzF,MAAM,iBAAiB,GACrB,8HAA8H,CAAC;AAEjI,+DAA+D;AAC/D,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,oIAAoI;QACtI,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAC/E,QAAQ,EAAE,CAAC;iBACR,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,kDAAkD,CAAC;YAC/D,4CAA4C;YAC5C,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,EAAE;iBACV,QAAQ,CAAC,kEAAkE,CAAC;YAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAClF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SAChF;QACD,YAAY,EAAE,qBAAqB;KACpC,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAClD,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,IAAI;YAAE,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAExE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACtE,IAAI,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACpC,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,yBAAyB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label-create.d.ts","sourceRoot":"","sources":["../../src/tools/label-create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,iEAAiE;AACjE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QA6DxD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { dualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
|
|
3
|
+
import { ghCmd } from "../lib/gh-runner.js";
|
|
4
|
+
import { parseLabelCreate } from "../lib/parsers.js";
|
|
5
|
+
import { formatLabelCreate } from "../lib/formatters.js";
|
|
6
|
+
import { LabelCreateResultSchema } from "../schemas/index.js";
|
|
7
|
+
function classifyLabelCreateError(text) {
|
|
8
|
+
const lower = text.toLowerCase();
|
|
9
|
+
if (/already exists|label .* already/.test(lower))
|
|
10
|
+
return "already-exists";
|
|
11
|
+
if (/forbidden|permission|403/.test(lower))
|
|
12
|
+
return "permission-denied";
|
|
13
|
+
if (/validation|invalid|required|unprocessable/.test(lower))
|
|
14
|
+
return "validation";
|
|
15
|
+
return "unknown";
|
|
16
|
+
}
|
|
17
|
+
/** Registers the `label-create` tool on the given MCP server. */
|
|
18
|
+
export function registerLabelCreateTool(server) {
|
|
19
|
+
server.registerTool("label-create", {
|
|
20
|
+
title: "Label Create",
|
|
21
|
+
description: "Creates a new repository label. Returns structured data with label name, description, color, and URL.",
|
|
22
|
+
inputSchema: {
|
|
23
|
+
name: z.string().max(INPUT_LIMITS.SHORT_STRING_MAX).describe("Label name"),
|
|
24
|
+
description: z
|
|
25
|
+
.string()
|
|
26
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
27
|
+
.optional()
|
|
28
|
+
.describe("Label description"),
|
|
29
|
+
color: z
|
|
30
|
+
.string()
|
|
31
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
32
|
+
.optional()
|
|
33
|
+
.describe("Label color as hex (e.g., 'ff0000' without #)"),
|
|
34
|
+
repo: z
|
|
35
|
+
.string()
|
|
36
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("Repository in OWNER/REPO format (default: current repo)"),
|
|
39
|
+
path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Repository path"),
|
|
40
|
+
},
|
|
41
|
+
outputSchema: LabelCreateResultSchema,
|
|
42
|
+
}, async ({ name, description, color, repo, path }) => {
|
|
43
|
+
const cwd = path || process.cwd();
|
|
44
|
+
assertNoFlagInjection(name, "name");
|
|
45
|
+
if (description)
|
|
46
|
+
assertNoFlagInjection(description, "description");
|
|
47
|
+
if (color)
|
|
48
|
+
assertNoFlagInjection(color, "color");
|
|
49
|
+
if (repo)
|
|
50
|
+
assertNoFlagInjection(repo, "repo");
|
|
51
|
+
const args = ["label", "create", name];
|
|
52
|
+
if (description)
|
|
53
|
+
args.push("--description", description);
|
|
54
|
+
if (color)
|
|
55
|
+
args.push("--color", color);
|
|
56
|
+
if (repo)
|
|
57
|
+
args.push("--repo", repo);
|
|
58
|
+
const result = await ghCmd(args, cwd);
|
|
59
|
+
if (result.exitCode !== 0) {
|
|
60
|
+
const combined = `${result.stdout}\n${result.stderr}`.trim();
|
|
61
|
+
return dualOutput({
|
|
62
|
+
name,
|
|
63
|
+
description: description ?? undefined,
|
|
64
|
+
color: color ?? undefined,
|
|
65
|
+
errorType: classifyLabelCreateError(combined),
|
|
66
|
+
errorMessage: combined || "gh label create failed",
|
|
67
|
+
}, formatLabelCreate);
|
|
68
|
+
}
|
|
69
|
+
const data = parseLabelCreate(result.stdout, result.stderr, name, description, color);
|
|
70
|
+
return dualOutput(data, formatLabelCreate);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=label-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label-create.js","sourceRoot":"","sources":["../../src/tools/label-create.ts"],"names":[],"mappings":"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"}
|