@aviaratech/ai-delivery 0.1.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/CONTRIBUTING.md +47 -0
- package/LICENSE +21 -0
- package/README.md +84 -0
- package/dist/agent.d.ts +17 -0
- package/dist/agent.js +16 -0
- package/dist/agent.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +314 -0
- package/dist/cli.js.map +1 -0
- package/dist/cliResult.d.ts +2 -0
- package/dist/cliResult.js +12 -0
- package/dist/cliResult.js.map +1 -0
- package/dist/cliResult.test.d.ts +1 -0
- package/dist/cliResult.test.js +30 -0
- package/dist/cliResult.test.js.map +1 -0
- package/dist/config/deliveryConfig.d.ts +113 -0
- package/dist/config/deliveryConfig.js +261 -0
- package/dist/config/deliveryConfig.js.map +1 -0
- package/dist/config/deliveryConfig.test.d.ts +1 -0
- package/dist/config/deliveryConfig.test.js +355 -0
- package/dist/config/deliveryConfig.test.js.map +1 -0
- package/dist/delivery/common.d.ts +28 -0
- package/dist/delivery/common.js +117 -0
- package/dist/delivery/common.js.map +1 -0
- package/dist/delivery/delivery.test.d.ts +1 -0
- package/dist/delivery/delivery.test.js +234 -0
- package/dist/delivery/delivery.test.js.map +1 -0
- package/dist/delivery/evidence.d.ts +92 -0
- package/dist/delivery/evidence.js +126 -0
- package/dist/delivery/evidence.js.map +1 -0
- package/dist/delivery/index.d.ts +8 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/delivery/policy.d.ts +237 -0
- package/dist/delivery/policy.js +246 -0
- package/dist/delivery/policy.js.map +1 -0
- package/dist/delivery/stage.d.ts +125 -0
- package/dist/delivery/stage.js +218 -0
- package/dist/delivery/stage.js.map +1 -0
- package/dist/dispatch.d.ts +15 -0
- package/dist/dispatch.js +397 -0
- package/dist/dispatch.js.map +1 -0
- package/dist/errors.d.ts +4 -0
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -0
- package/dist/genericCompatibility.test.d.ts +1 -0
- package/dist/genericCompatibility.test.js +92 -0
- package/dist/genericCompatibility.test.js.map +1 -0
- package/dist/git.d.ts +13 -0
- package/dist/git.js +65 -0
- package/dist/git.js.map +1 -0
- package/dist/github/client.d.ts +34 -0
- package/dist/github/client.js +143 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/commandIdentityPolicy.d.ts +13 -0
- package/dist/github/commandIdentityPolicy.js +46 -0
- package/dist/github/commandIdentityPolicy.js.map +1 -0
- package/dist/github/nativeIssueMetadata.d.ts +78 -0
- package/dist/github/nativeIssueMetadata.js +249 -0
- package/dist/github/nativeIssueMetadata.js.map +1 -0
- package/dist/github/projectDelivery.d.ts +68 -0
- package/dist/github/projectDelivery.js +540 -0
- package/dist/github/projectDelivery.js.map +1 -0
- package/dist/github/relationships.d.ts +69 -0
- package/dist/github/relationships.js +395 -0
- package/dist/github/relationships.js.map +1 -0
- package/dist/github/repo.d.ts +8 -0
- package/dist/github/repo.js +34 -0
- package/dist/github/repo.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/issue.d.ts +86 -0
- package/dist/issue.js +347 -0
- package/dist/issue.js.map +1 -0
- package/dist/lifecycle.test.d.ts +1 -0
- package/dist/lifecycle.test.js +1118 -0
- package/dist/lifecycle.test.js.map +1 -0
- package/dist/logger.d.ts +21 -0
- package/dist/logger.js +86 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.js +46 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +162 -0
- package/dist/mcp/tools.js +154 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/pr.d.ts +146 -0
- package/dist/pr.js +972 -0
- package/dist/pr.js.map +1 -0
- package/dist/pr.test.d.ts +1 -0
- package/dist/pr.test.js +252 -0
- package/dist/pr.test.js.map +1 -0
- package/dist/review.d.ts +104 -0
- package/dist/review.js +228 -0
- package/dist/review.js.map +1 -0
- package/dist/review.test.d.ts +1 -0
- package/dist/review.test.js +327 -0
- package/dist/review.test.js.map +1 -0
- package/dist/services/agentReadinessService.d.ts +17 -0
- package/dist/services/agentReadinessService.js +225 -0
- package/dist/services/agentReadinessService.js.map +1 -0
- package/dist/services/deliveryAdmission.d.ts +33 -0
- package/dist/services/deliveryAdmission.js +122 -0
- package/dist/services/deliveryAdmission.js.map +1 -0
- package/dist/services/deliveryRecordService.d.ts +47 -0
- package/dist/services/deliveryRecordService.js +199 -0
- package/dist/services/deliveryRecordService.js.map +1 -0
- package/dist/services/legacyIssueMigration.d.ts +46 -0
- package/dist/services/legacyIssueMigration.js +313 -0
- package/dist/services/legacyIssueMigration.js.map +1 -0
- package/dist/services/worktreeRegistry.d.ts +67 -0
- package/dist/services/worktreeRegistry.js +545 -0
- package/dist/services/worktreeRegistry.js.map +1 -0
- package/dist/terminalMessages.d.ts +13 -0
- package/dist/terminalMessages.js +43 -0
- package/dist/terminalMessages.js.map +1 -0
- package/dist/utils/atomicJson.d.ts +6 -0
- package/dist/utils/atomicJson.js +78 -0
- package/dist/utils/atomicJson.js.map +1 -0
- package/dist/utils/filesystem.d.ts +9 -0
- package/dist/utils/filesystem.js +19 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/lockfile.d.ts +12 -0
- package/dist/utils/lockfile.js +78 -0
- package/dist/utils/lockfile.js.map +1 -0
- package/dist/verification.d.ts +24 -0
- package/dist/verification.js +227 -0
- package/dist/verification.js.map +1 -0
- package/dist/worktree.d.ts +44 -0
- package/dist/worktree.js +255 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +82 -0
- package/plugins/ai-delivery/.claude-plugin/plugin.json +6 -0
- package/plugins/ai-delivery/.mcp.json +8 -0
- package/plugins/ai-delivery/README.md +5 -0
- package/plugins/ai-delivery/dist/mcp-launcher.js +22 -0
- package/plugins/ai-delivery/skills/intake-create/SKILL.md +26 -0
- package/plugins/ai-delivery/skills/pr-handoff/SKILL.md +28 -0
- package/plugins/ai-delivery/skills/worktree-lifecycle/SKILL.md +24 -0
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
import { CLIError, formatError, logInfo } from '../logger.js';
|
|
3
|
+
const NativeBlockerPageSchema = z
|
|
4
|
+
.object({
|
|
5
|
+
repository: z
|
|
6
|
+
.object({
|
|
7
|
+
issue: z
|
|
8
|
+
.object({
|
|
9
|
+
blockedBy: z
|
|
10
|
+
.object({
|
|
11
|
+
nodes: z.array(z
|
|
12
|
+
.object({
|
|
13
|
+
id: z.string(),
|
|
14
|
+
number: z.number().int().positive(),
|
|
15
|
+
state: z.enum(['OPEN', 'CLOSED']),
|
|
16
|
+
title: z.string(),
|
|
17
|
+
})
|
|
18
|
+
.strict()),
|
|
19
|
+
pageInfo: z
|
|
20
|
+
.object({
|
|
21
|
+
endCursor: z.string().nullable(),
|
|
22
|
+
hasNextPage: z.boolean(),
|
|
23
|
+
})
|
|
24
|
+
.strict(),
|
|
25
|
+
})
|
|
26
|
+
.strict(),
|
|
27
|
+
parent: z.object({ id: z.string(), number: z.number().int().positive().optional() }).strict().nullable(),
|
|
28
|
+
})
|
|
29
|
+
.strict(),
|
|
30
|
+
})
|
|
31
|
+
.strict(),
|
|
32
|
+
})
|
|
33
|
+
.strict();
|
|
34
|
+
const NativeBlockingPageSchema = z
|
|
35
|
+
.object({
|
|
36
|
+
repository: z
|
|
37
|
+
.object({
|
|
38
|
+
issue: z
|
|
39
|
+
.object({
|
|
40
|
+
blocking: z
|
|
41
|
+
.object({
|
|
42
|
+
nodes: z.array(z
|
|
43
|
+
.object({
|
|
44
|
+
id: z.string(),
|
|
45
|
+
number: z.number().int().positive(),
|
|
46
|
+
state: z.enum(['OPEN', 'CLOSED']),
|
|
47
|
+
title: z.string(),
|
|
48
|
+
})
|
|
49
|
+
.strict()),
|
|
50
|
+
pageInfo: z.object({ endCursor: z.string().nullable(), hasNextPage: z.boolean() }).strict(),
|
|
51
|
+
})
|
|
52
|
+
.strict(),
|
|
53
|
+
})
|
|
54
|
+
.strict(),
|
|
55
|
+
})
|
|
56
|
+
.strict(),
|
|
57
|
+
})
|
|
58
|
+
.strict();
|
|
59
|
+
export async function getNativeBlockerNumbers(params) {
|
|
60
|
+
return (await getNativeBlockerRelationships(params)).blockers.map((blocker) => blocker.number);
|
|
61
|
+
}
|
|
62
|
+
export async function getNativeBlockerRelationships({ graphql, issueNumber, repo, }) {
|
|
63
|
+
const blockers = new Map();
|
|
64
|
+
let cursor = null;
|
|
65
|
+
let hasNextPage = true;
|
|
66
|
+
let parentId = null;
|
|
67
|
+
let parentNumber = null;
|
|
68
|
+
const seenCursors = new Set();
|
|
69
|
+
while (hasNextPage) {
|
|
70
|
+
const response = await graphql(`
|
|
71
|
+
query ($owner: String!, $name: String!, $number: Int!, $cursor: String) {
|
|
72
|
+
repository(owner: $owner, name: $name) {
|
|
73
|
+
issue(number: $number) {
|
|
74
|
+
parent {
|
|
75
|
+
id
|
|
76
|
+
number
|
|
77
|
+
}
|
|
78
|
+
blockedBy(first: 100, after: $cursor) {
|
|
79
|
+
nodes {
|
|
80
|
+
id
|
|
81
|
+
number
|
|
82
|
+
title
|
|
83
|
+
state
|
|
84
|
+
}
|
|
85
|
+
pageInfo {
|
|
86
|
+
endCursor
|
|
87
|
+
hasNextPage
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
`, { cursor, name: repo.repo, number: issueNumber, owner: repo.owner });
|
|
94
|
+
const parsed = NativeBlockerPageSchema.safeParse(response);
|
|
95
|
+
if (!parsed.success) {
|
|
96
|
+
throw new CLIError(`GitHub returned invalid blocked-by relationship evidence for issue #${String(issueNumber)}.`);
|
|
97
|
+
}
|
|
98
|
+
const issue = parsed.data.repository.issue;
|
|
99
|
+
for (const blocker of issue.blockedBy.nodes) {
|
|
100
|
+
blockers.set(blocker.number, blocker);
|
|
101
|
+
}
|
|
102
|
+
parentId = issue.parent?.id ?? null;
|
|
103
|
+
parentNumber = issue.parent?.number ?? null;
|
|
104
|
+
hasNextPage = issue.blockedBy.pageInfo.hasNextPage;
|
|
105
|
+
const nextCursor = issue.blockedBy.pageInfo.endCursor;
|
|
106
|
+
if (hasNextPage && nextCursor === null) {
|
|
107
|
+
throw new CLIError(`Native blocked-by pagination for issue #${String(issueNumber)} omitted its next cursor.`);
|
|
108
|
+
}
|
|
109
|
+
if (hasNextPage && nextCursor !== null && (nextCursor === cursor || seenCursors.has(nextCursor))) {
|
|
110
|
+
throw new CLIError(`Native blocked-by pagination for issue #${String(issueNumber)} repeated a non-advancing cursor.`);
|
|
111
|
+
}
|
|
112
|
+
if (nextCursor !== null)
|
|
113
|
+
seenCursors.add(nextCursor);
|
|
114
|
+
cursor = nextCursor;
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
blockers: [...blockers.values()].sort((left, right) => left.number - right.number),
|
|
118
|
+
parentId,
|
|
119
|
+
parentNumber,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/** Return the issues that declare this issue as a native blocker. */
|
|
123
|
+
export async function getNativeBlockingRelationships({ graphql, issueNumber, repo, }) {
|
|
124
|
+
const dependents = new Map();
|
|
125
|
+
let cursor = null;
|
|
126
|
+
let hasNextPage = true;
|
|
127
|
+
const seenCursors = new Set();
|
|
128
|
+
while (hasNextPage) {
|
|
129
|
+
const response = await graphql(`
|
|
130
|
+
query ($owner: String!, $name: String!, $number: Int!, $cursor: String) {
|
|
131
|
+
repository(owner: $owner, name: $name) {
|
|
132
|
+
issue(number: $number) {
|
|
133
|
+
blocking(first: 100, after: $cursor) {
|
|
134
|
+
nodes {
|
|
135
|
+
id
|
|
136
|
+
number
|
|
137
|
+
title
|
|
138
|
+
state
|
|
139
|
+
}
|
|
140
|
+
pageInfo {
|
|
141
|
+
endCursor
|
|
142
|
+
hasNextPage
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
`, { cursor, name: repo.repo, number: issueNumber, owner: repo.owner });
|
|
149
|
+
const parsed = NativeBlockingPageSchema.safeParse(response);
|
|
150
|
+
if (!parsed.success) {
|
|
151
|
+
throw new CLIError(`GitHub returned invalid blocking relationship evidence for issue #${String(issueNumber)}.`);
|
|
152
|
+
}
|
|
153
|
+
const page = parsed.data.repository.issue.blocking;
|
|
154
|
+
for (const dependent of page.nodes)
|
|
155
|
+
dependents.set(dependent.number, dependent);
|
|
156
|
+
hasNextPage = page.pageInfo.hasNextPage;
|
|
157
|
+
const nextCursor = page.pageInfo.endCursor;
|
|
158
|
+
if (hasNextPage && nextCursor === null) {
|
|
159
|
+
throw new CLIError(`Native blocking pagination for issue #${String(issueNumber)} omitted its next cursor.`);
|
|
160
|
+
}
|
|
161
|
+
if (hasNextPage && nextCursor !== null && (nextCursor === cursor || seenCursors.has(nextCursor))) {
|
|
162
|
+
throw new CLIError(`Native blocking pagination for issue #${String(issueNumber)} repeated a non-advancing cursor.`);
|
|
163
|
+
}
|
|
164
|
+
if (nextCursor !== null)
|
|
165
|
+
seenCursors.add(nextCursor);
|
|
166
|
+
cursor = nextCursor;
|
|
167
|
+
}
|
|
168
|
+
return [...dependents.values()].sort((left, right) => left.number - right.number);
|
|
169
|
+
}
|
|
170
|
+
/** Native sub-issues make an issue a planning container rather than an executable delivery. */
|
|
171
|
+
export async function hasNativeSubIssues({ issueNumber, repo, rest, }) {
|
|
172
|
+
const response = await rest.issues.listSubIssues({
|
|
173
|
+
issue_number: issueNumber,
|
|
174
|
+
owner: repo.owner,
|
|
175
|
+
per_page: 1,
|
|
176
|
+
repo: repo.repo,
|
|
177
|
+
});
|
|
178
|
+
return response.data.length > 0;
|
|
179
|
+
}
|
|
180
|
+
export async function linkBlockedBy({ blockerNodeIds, blockers, existingBlockers = [], graphql, issueNumber, repo, rest, }) {
|
|
181
|
+
if (blockers.length === 0) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const requestedBlockers = [...new Set(blockers)];
|
|
185
|
+
const existing = new Set([...existingBlockers, ...(await getNativeBlockerNumbers({ graphql, issueNumber, repo }))]);
|
|
186
|
+
const blockersToAdd = requestedBlockers.filter((blocker) => !existing.has(blocker));
|
|
187
|
+
if (blockersToAdd.length > 0) {
|
|
188
|
+
const issueNodeId = await issueNumberToNode({ issueNumber, repo, rest });
|
|
189
|
+
for (const blocker of blockersToAdd) {
|
|
190
|
+
const blockerNodeId = blockerNodeIds?.get(blocker) ?? (await issueNumberToNode({ issueNumber: blocker, repo, rest }));
|
|
191
|
+
await graphql(`
|
|
192
|
+
mutation ($issue: ID!, $blocking: ID!) {
|
|
193
|
+
addBlockedBy(input: { issueId: $issue, blockingIssueId: $blocking }) {
|
|
194
|
+
issue {
|
|
195
|
+
number
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
`, {
|
|
200
|
+
blocking: blockerNodeId,
|
|
201
|
+
issue: issueNodeId,
|
|
202
|
+
});
|
|
203
|
+
logInfo(`Linked issue #${String(issueNumber)} as blocked by issue #${String(blocker)}.`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const observed = new Set(await getNativeBlockerNumbers({ graphql, issueNumber, repo }));
|
|
207
|
+
const missing = requestedBlockers.filter((blocker) => !observed.has(blocker));
|
|
208
|
+
if (missing.length > 0) {
|
|
209
|
+
throw new CLIError(`Native blocked-by readback for issue #${String(issueNumber)} omitted requested blocker(s): ${missing
|
|
210
|
+
.map((blocker) => `#${String(blocker)}`)
|
|
211
|
+
.join(', ')}.`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
export async function linkSubIssue({ parentIssueNumber, repo, rest, subIssueId, subIssueNumber, }) {
|
|
215
|
+
if (parentIssueNumber === subIssueNumber) {
|
|
216
|
+
throw new CLIError(`Issue #${String(subIssueNumber)} cannot be its own parent.`);
|
|
217
|
+
}
|
|
218
|
+
const resolvedSubIssueId = typeof subIssueId === 'number' && Number.isFinite(subIssueId)
|
|
219
|
+
? subIssueId
|
|
220
|
+
: await issueNumberToId({ issueNumber: subIssueNumber, repo, rest });
|
|
221
|
+
if (await parentContainsSubIssue({ parentIssueNumber, repo, rest, subIssueNumber })) {
|
|
222
|
+
logInfo(`Issue #${String(subIssueNumber)} is already a sub-issue of issue #${String(parentIssueNumber)}.`);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
await rest.issues.addSubIssue({
|
|
226
|
+
issue_number: parentIssueNumber,
|
|
227
|
+
owner: repo.owner,
|
|
228
|
+
repo: repo.repo,
|
|
229
|
+
sub_issue_id: resolvedSubIssueId,
|
|
230
|
+
});
|
|
231
|
+
if (!(await parentContainsSubIssue({ parentIssueNumber, repo, rest, subIssueNumber }))) {
|
|
232
|
+
throw new CLIError(`Native sub-issue readback for parent #${String(parentIssueNumber)} omitted requested issue #${String(subIssueNumber)}.`);
|
|
233
|
+
}
|
|
234
|
+
logInfo(`Linked issue #${String(subIssueNumber)} as sub-issue of issue #${String(parentIssueNumber)}.`);
|
|
235
|
+
}
|
|
236
|
+
/** Replace, rather than append to, the native blocked-by edge set. */
|
|
237
|
+
export async function replaceBlockedBy({ blockers, graphql, issueNumber, repo, rest, }) {
|
|
238
|
+
const requested = [...new Set(blockers)].sort((left, right) => left - right);
|
|
239
|
+
const before = await getNativeBlockerRelationships({ graphql, issueNumber, repo });
|
|
240
|
+
const requestedSet = new Set(requested);
|
|
241
|
+
const issueNodeId = await issueNumberToNode({ issueNumber, repo, rest });
|
|
242
|
+
for (const blocker of before.blockers.filter((candidate) => !requestedSet.has(candidate.number))) {
|
|
243
|
+
await graphql(`
|
|
244
|
+
mutation ($issue: ID!, $blocking: ID!) {
|
|
245
|
+
removeBlockedBy(input: { issueId: $issue, blockingIssueId: $blocking }) {
|
|
246
|
+
issue {
|
|
247
|
+
number
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
`, { blocking: blocker.id, issue: issueNodeId });
|
|
252
|
+
}
|
|
253
|
+
const existing = new Set(before.blockers.map((blocker) => blocker.number));
|
|
254
|
+
for (const blocker of requested.filter((candidate) => !existing.has(candidate))) {
|
|
255
|
+
const blockerNodeId = await issueNumberToNode({ issueNumber: blocker, repo, rest });
|
|
256
|
+
await graphql(`
|
|
257
|
+
mutation ($issue: ID!, $blocking: ID!) {
|
|
258
|
+
addBlockedBy(input: { issueId: $issue, blockingIssueId: $blocking }) {
|
|
259
|
+
issue {
|
|
260
|
+
number
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
`, { blocking: blockerNodeId, issue: issueNodeId });
|
|
265
|
+
}
|
|
266
|
+
const observed = (await getNativeBlockerNumbers({ graphql, issueNumber, repo })).sort((left, right) => left - right);
|
|
267
|
+
if (observed.join(',') !== requested.join(',')) {
|
|
268
|
+
throw new CLIError(`Native blocked-by replacement readback mismatch for issue #${String(issueNumber)}: expected ${requested.join(',') || '(none)'}, found ${observed.join(',') || '(none)'}.`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/** Replace or clear the issue's single native parent relationship. */
|
|
272
|
+
export async function replaceParentIssue({ graphql, issueNumber, parentIssueNumber, repo, rest, }) {
|
|
273
|
+
if (parentIssueNumber === issueNumber) {
|
|
274
|
+
throw new CLIError(`Issue #${String(issueNumber)} cannot be its own parent.`);
|
|
275
|
+
}
|
|
276
|
+
const before = await getNativeBlockerRelationships({ graphql, issueNumber, repo });
|
|
277
|
+
if (before.parentNumber === parentIssueNumber)
|
|
278
|
+
return;
|
|
279
|
+
const subIssueId = await issueNumberToId({ issueNumber, repo, rest });
|
|
280
|
+
if (before.parentNumber !== null) {
|
|
281
|
+
await rest.issues.removeSubIssue({
|
|
282
|
+
issue_number: before.parentNumber,
|
|
283
|
+
owner: repo.owner,
|
|
284
|
+
repo: repo.repo,
|
|
285
|
+
sub_issue_id: subIssueId,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
if (parentIssueNumber !== null) {
|
|
289
|
+
await linkSubIssue({ parentIssueNumber, repo, rest, subIssueId, subIssueNumber: issueNumber });
|
|
290
|
+
}
|
|
291
|
+
const after = await getNativeBlockerRelationships({ graphql, issueNumber, repo });
|
|
292
|
+
if (after.parentNumber !== parentIssueNumber) {
|
|
293
|
+
const expectedParent = parentIssueNumber === null ? '(none)' : `#${String(parentIssueNumber)}`;
|
|
294
|
+
const observedParent = after.parentNumber === null ? '(none)' : `#${String(after.parentNumber)}`;
|
|
295
|
+
throw new CLIError(`Native parent replacement readback mismatch for issue #${String(issueNumber)}: expected ${expectedParent}, found ${observedParent}.`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/** Resolve every existing relationship target before a new tracking issue is created. */
|
|
299
|
+
export async function resolveNativeRelationshipTargets({ blockers, parentIssueNumber, repo, rest, }) {
|
|
300
|
+
const blockerNodeIds = new Map();
|
|
301
|
+
const unresolvedBlockers = [];
|
|
302
|
+
for (const blocker of new Set(blockers)) {
|
|
303
|
+
const target = await resolveBlockerTarget({ issueNumber: blocker, repo, rest });
|
|
304
|
+
blockerNodeIds.set(blocker, target.nodeId);
|
|
305
|
+
if (target.state === 'OPEN')
|
|
306
|
+
unresolvedBlockers.push(blocker);
|
|
307
|
+
}
|
|
308
|
+
if (parentIssueNumber !== undefined) {
|
|
309
|
+
await requireIssueTarget({ issueNumber: parentIssueNumber, relationship: 'parent', repo, rest });
|
|
310
|
+
}
|
|
311
|
+
return { blockerNodeIds, unresolvedBlockers };
|
|
312
|
+
}
|
|
313
|
+
async function issueNumberToId({ issueNumber, repo, rest }) {
|
|
314
|
+
try {
|
|
315
|
+
const issue = await rest.issues.get({
|
|
316
|
+
issue_number: issueNumber,
|
|
317
|
+
owner: repo.owner,
|
|
318
|
+
repo: repo.repo,
|
|
319
|
+
});
|
|
320
|
+
const issueId = issue.data.id;
|
|
321
|
+
if (typeof issueId !== 'number') {
|
|
322
|
+
throw new CLIError(`GitHub omitted the numeric issue id for issue #${String(issueNumber)}.`);
|
|
323
|
+
}
|
|
324
|
+
return issueId;
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
if (error instanceof CLIError) {
|
|
328
|
+
throw error;
|
|
329
|
+
}
|
|
330
|
+
throw new CLIError(`Unable to resolve sub-issue id for issue #${String(issueNumber)}: ${formatError(error)}.`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async function issueNumberToNode({ issueNumber, repo, rest }) {
|
|
334
|
+
try {
|
|
335
|
+
const issue = await rest.issues.get({
|
|
336
|
+
issue_number: issueNumber,
|
|
337
|
+
owner: repo.owner,
|
|
338
|
+
repo: repo.repo,
|
|
339
|
+
});
|
|
340
|
+
const nodeId = issue.data.node_id;
|
|
341
|
+
if (typeof nodeId !== 'string') {
|
|
342
|
+
throw new CLIError(`GitHub omitted the node id for issue #${String(issueNumber)}.`);
|
|
343
|
+
}
|
|
344
|
+
return nodeId;
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
if (error instanceof CLIError) {
|
|
348
|
+
throw error;
|
|
349
|
+
}
|
|
350
|
+
throw new CLIError(`Unable to resolve blocker issue #${String(issueNumber)}: ${formatError(error)}.`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
async function parentContainsSubIssue({ parentIssueNumber, repo, rest, subIssueNumber, }) {
|
|
354
|
+
const observed = await rest.paginate(rest.issues.listSubIssues, {
|
|
355
|
+
issue_number: parentIssueNumber,
|
|
356
|
+
owner: repo.owner,
|
|
357
|
+
per_page: 100,
|
|
358
|
+
repo: repo.repo,
|
|
359
|
+
});
|
|
360
|
+
return observed.some((issue) => issue.number === subIssueNumber);
|
|
361
|
+
}
|
|
362
|
+
async function requireIssueTarget({ issueNumber, relationship, repo, rest, }) {
|
|
363
|
+
try {
|
|
364
|
+
await rest.issues.get({
|
|
365
|
+
issue_number: issueNumber,
|
|
366
|
+
owner: repo.owner,
|
|
367
|
+
repo: repo.repo,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
throw new CLIError(`Unable to resolve ${relationship} issue #${String(issueNumber)}: ${formatError(error)}.`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
async function resolveBlockerTarget({ issueNumber, repo, rest, }) {
|
|
375
|
+
try {
|
|
376
|
+
const issue = await rest.issues.get({
|
|
377
|
+
issue_number: issueNumber,
|
|
378
|
+
owner: repo.owner,
|
|
379
|
+
repo: repo.repo,
|
|
380
|
+
});
|
|
381
|
+
const nodeId = issue.data.node_id;
|
|
382
|
+
const state = issue.data.state;
|
|
383
|
+
if (typeof nodeId !== 'string' || (state !== 'open' && state !== 'closed')) {
|
|
384
|
+
throw new CLIError(`GitHub omitted the node id or state for blocker issue #${String(issueNumber)}.`);
|
|
385
|
+
}
|
|
386
|
+
return { nodeId, state: state === 'open' ? 'OPEN' : 'CLOSED' };
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
if (error instanceof CLIError) {
|
|
390
|
+
throw error;
|
|
391
|
+
}
|
|
392
|
+
throw new CLIError(`Unable to resolve blocker issue #${String(issueNumber)}: ${formatError(error)}.`);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
//# sourceMappingURL=relationships.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.js","sourceRoot":"","sources":["../../src/github/relationships.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DeliveryConfig } from '../config/deliveryConfig.js';
|
|
2
|
+
export interface RepoCoordinates {
|
|
3
|
+
owner: string;
|
|
4
|
+
repo: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function formatRepoCoordinates(repo: RepoCoordinates): string;
|
|
7
|
+
export declare function resolveDeliveryRepo(config: DeliveryConfig, repoRoot: string): RepoCoordinates;
|
|
8
|
+
export declare function resolveRepoFromRemote(repoRoot: string): RepoCoordinates;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { DeliveryError } from '../errors.js';
|
|
3
|
+
export function formatRepoCoordinates(repo) {
|
|
4
|
+
return `${repo.owner}/${repo.repo}`;
|
|
5
|
+
}
|
|
6
|
+
export function resolveDeliveryRepo(config, repoRoot) {
|
|
7
|
+
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/u.test(config.repository)) {
|
|
8
|
+
throw new DeliveryError('Invalid configured delivery repository.');
|
|
9
|
+
}
|
|
10
|
+
const [owner, repo] = config.repository.split('/');
|
|
11
|
+
if (!owner || !repo)
|
|
12
|
+
throw new DeliveryError('Invalid configured delivery repository.');
|
|
13
|
+
const remote = resolveRepoFromRemote(repoRoot);
|
|
14
|
+
if (owner.toLowerCase() !== remote.owner.toLowerCase() || repo.toLowerCase() !== remote.repo.toLowerCase()) {
|
|
15
|
+
throw new DeliveryError('Configured delivery repository does not match remote.origin.url.');
|
|
16
|
+
}
|
|
17
|
+
return { owner, repo };
|
|
18
|
+
}
|
|
19
|
+
export function resolveRepoFromRemote(repoRoot) {
|
|
20
|
+
const result = spawnSync('git', ['config', '--get', 'remote.origin.url'], {
|
|
21
|
+
cwd: repoRoot,
|
|
22
|
+
encoding: 'utf8',
|
|
23
|
+
});
|
|
24
|
+
if (result.status !== 0) {
|
|
25
|
+
throw new DeliveryError('Unable to determine canonical repository identity from remote.origin.url.');
|
|
26
|
+
}
|
|
27
|
+
const remote = result.stdout.trim();
|
|
28
|
+
const match = /^(?:git@github\.com:|ssh:\/\/git@github\.com\/|https:\/\/github\.com\/)([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+?)(?:\.git)?\/?$/u.exec(remote);
|
|
29
|
+
if (!match?.[1] || !match[2]) {
|
|
30
|
+
throw new DeliveryError('remote.origin.url must be a GitHub repository URL.');
|
|
31
|
+
}
|
|
32
|
+
return { owner: match[1], repo: match[2] };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/github/repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAO7C,MAAM,UAAU,qBAAqB,CAAC,IAAqB;IACzD,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAsB,EAAE,QAAgB;IAC1E,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,aAAa,CAAC,yCAAyC,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,aAAa,CAAC,yCAAyC,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3G,MAAM,IAAI,aAAa,CAAC,kEAAkE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE;QACxE,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC,2EAA2E,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,KAAK,GACT,6HAA6H,CAAC,IAAI,CAChI,MAAM,CACP,CAAC;IACJ,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,aAAa,CAAC,oDAAoD,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
|
package/dist/issue.d.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { DeliveryConfig } from './config/deliveryConfig.js';
|
|
2
|
+
import { DeliveryError } from './errors.js';
|
|
3
|
+
import { type GitHubClients } from './github/client.js';
|
|
4
|
+
import { type RepoCoordinates } from './github/repo.js';
|
|
5
|
+
import { type AgentReadinessResult } from './services/agentReadinessService.js';
|
|
6
|
+
export interface DeliveryContext {
|
|
7
|
+
clients: GitHubClients;
|
|
8
|
+
config: DeliveryConfig;
|
|
9
|
+
repo: RepoCoordinates;
|
|
10
|
+
root: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadDeliveryContext(input: {
|
|
13
|
+
identity: string;
|
|
14
|
+
personalAuth?: boolean;
|
|
15
|
+
repoRoot: string;
|
|
16
|
+
role: 'author' | 'reviewer';
|
|
17
|
+
}): Promise<DeliveryContext>;
|
|
18
|
+
export interface CreateIssueInput {
|
|
19
|
+
blockedBy?: number[];
|
|
20
|
+
body?: string;
|
|
21
|
+
issueType?: string;
|
|
22
|
+
labels?: string[];
|
|
23
|
+
milestone?: number;
|
|
24
|
+
parentIssueNumber?: number;
|
|
25
|
+
points?: number;
|
|
26
|
+
priority?: string;
|
|
27
|
+
title: string;
|
|
28
|
+
}
|
|
29
|
+
export declare class CreatedTrackingIssueError extends DeliveryError {
|
|
30
|
+
readonly created: {
|
|
31
|
+
number: number;
|
|
32
|
+
title: string;
|
|
33
|
+
url: string;
|
|
34
|
+
};
|
|
35
|
+
constructor(created: {
|
|
36
|
+
number: number;
|
|
37
|
+
title: string;
|
|
38
|
+
url: string;
|
|
39
|
+
}, cause: unknown);
|
|
40
|
+
}
|
|
41
|
+
export declare function createIssue(context: DeliveryContext, input: CreateIssueInput): Promise<{
|
|
42
|
+
body: string;
|
|
43
|
+
created: {
|
|
44
|
+
number: number;
|
|
45
|
+
title: string;
|
|
46
|
+
url: string;
|
|
47
|
+
};
|
|
48
|
+
}>;
|
|
49
|
+
export interface UpdateIssueInput {
|
|
50
|
+
blockedBy?: number[];
|
|
51
|
+
body?: string;
|
|
52
|
+
issueNumber: number;
|
|
53
|
+
issueType?: string;
|
|
54
|
+
labels?: string[];
|
|
55
|
+
milestone?: number | null;
|
|
56
|
+
parentIssueNumber?: number | null;
|
|
57
|
+
points?: number;
|
|
58
|
+
priority?: string;
|
|
59
|
+
state?: 'open' | 'closed';
|
|
60
|
+
title?: string;
|
|
61
|
+
}
|
|
62
|
+
export declare function updateIssue(context: DeliveryContext, input: UpdateIssueInput): Promise<Awaited<ReturnType<typeof issueInfo>>>;
|
|
63
|
+
/** Complete the native tracking and Project state of an issue created before an interrupted response. */
|
|
64
|
+
export declare function resumeCreatedIssue(context: DeliveryContext, input: UpdateIssueInput): Promise<IssueInfo>;
|
|
65
|
+
export interface IssueInfo {
|
|
66
|
+
blockedBy: number[];
|
|
67
|
+
body: string;
|
|
68
|
+
issueNumber: number;
|
|
69
|
+
issueType: string | null;
|
|
70
|
+
parentIssueNumber: number | null;
|
|
71
|
+
points?: number;
|
|
72
|
+
priority?: string;
|
|
73
|
+
projectStatus: string | null;
|
|
74
|
+
state: string;
|
|
75
|
+
title: string;
|
|
76
|
+
url: string;
|
|
77
|
+
worktree: string | null;
|
|
78
|
+
}
|
|
79
|
+
export declare function cachedIssueInfo(repoRoot: string, issueNumber: number): IssueInfo;
|
|
80
|
+
export declare function issueInfo(context: DeliveryContext, issueNumber: number): Promise<IssueInfo>;
|
|
81
|
+
export declare function listIssueSubissues(context: DeliveryContext, issueNumber: number): Promise<number[]>;
|
|
82
|
+
export declare function readyCheck(context: DeliveryContext, issueNumber: number): Promise<AgentReadinessResult>;
|
|
83
|
+
export declare function developIssue(context: DeliveryContext, issueNumber: number): Promise<{
|
|
84
|
+
path: string;
|
|
85
|
+
branch: string;
|
|
86
|
+
}>;
|