@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,540 @@
|
|
|
1
|
+
import { DeliveryError } from '../errors.js';
|
|
2
|
+
export const PROJECT_DELIVERY_STATUSES = ['Todo', 'In Progress', 'Blocked', 'Done'];
|
|
3
|
+
export async function archiveIssueProjectItem(input) {
|
|
4
|
+
const configuration = input.configuration ??
|
|
5
|
+
(await getProjectDeliveryConfiguration({
|
|
6
|
+
...input,
|
|
7
|
+
settings: requireProjectSettings(input.settings),
|
|
8
|
+
requireWritable: true,
|
|
9
|
+
}));
|
|
10
|
+
assertWritableConfiguration(configuration);
|
|
11
|
+
const item = await findIssueProjectItem({ ...input, configuration });
|
|
12
|
+
if (item === null)
|
|
13
|
+
return null;
|
|
14
|
+
if (item.archived)
|
|
15
|
+
return { archived: true, itemId: item.id };
|
|
16
|
+
const response = await input.graphql(`
|
|
17
|
+
mutation ArchiveProjectDeliveryItem($projectId: ID!, $itemId: ID!) {
|
|
18
|
+
archiveProjectV2Item(input: { projectId: $projectId, itemId: $itemId }) {
|
|
19
|
+
item { id isArchived }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
`, { itemId: item.id, projectId: configuration.projectId });
|
|
23
|
+
const record = requireRecord(response, 'GitHub returned invalid Project archive evidence.');
|
|
24
|
+
const payload = requireRecord(record.archiveProjectV2Item, 'GitHub omitted Project archive payload.');
|
|
25
|
+
const archivedItem = requireRecord(payload.item, 'GitHub omitted the archived Project item.');
|
|
26
|
+
if (archivedItem.id !== item.id || archivedItem.isArchived !== true) {
|
|
27
|
+
throw new DeliveryError('Project archive mutation did not return the exact archived item.');
|
|
28
|
+
}
|
|
29
|
+
await readBackProjectArchiveState({
|
|
30
|
+
archived: true,
|
|
31
|
+
configuration,
|
|
32
|
+
graphql: input.graphql,
|
|
33
|
+
issueNodeId: input.issueNodeId,
|
|
34
|
+
itemId: item.id,
|
|
35
|
+
});
|
|
36
|
+
return { archived: true, itemId: item.id };
|
|
37
|
+
}
|
|
38
|
+
export async function getIssueProjectStatus(input) {
|
|
39
|
+
const configuration = input.configuration ??
|
|
40
|
+
(await getProjectDeliveryConfiguration({ ...input, settings: requireProjectSettings(input.settings) }));
|
|
41
|
+
const item = await findIssueProjectItem({ ...input, configuration });
|
|
42
|
+
if (item === null || item.archived)
|
|
43
|
+
return null;
|
|
44
|
+
if (item.status === null && item.statusOptionId === null)
|
|
45
|
+
return null;
|
|
46
|
+
const status = requireItemStatus(item, configuration);
|
|
47
|
+
return { itemId: item.id, status };
|
|
48
|
+
}
|
|
49
|
+
export async function getProjectDeliveryConfiguration(input) {
|
|
50
|
+
const settings = requireProjectSettings(input.settings);
|
|
51
|
+
const nodes = [];
|
|
52
|
+
let cursor = null;
|
|
53
|
+
let hasNextPage = true;
|
|
54
|
+
const seenCursors = new Set();
|
|
55
|
+
let project = null;
|
|
56
|
+
while (hasNextPage) {
|
|
57
|
+
const response = await input.graphql(`
|
|
58
|
+
query ProjectDeliveryConfiguration($org: String!, $number: Int!, $cursor: String) {
|
|
59
|
+
organization(login: $org) {
|
|
60
|
+
projectV2(number: $number) {
|
|
61
|
+
id
|
|
62
|
+
number
|
|
63
|
+
title
|
|
64
|
+
viewerCanUpdate
|
|
65
|
+
fields(first: 100, after: $cursor) {
|
|
66
|
+
nodes {
|
|
67
|
+
__typename
|
|
68
|
+
... on ProjectV2Field {
|
|
69
|
+
id
|
|
70
|
+
name
|
|
71
|
+
dataType
|
|
72
|
+
}
|
|
73
|
+
... on ProjectV2IterationField {
|
|
74
|
+
id
|
|
75
|
+
name
|
|
76
|
+
}
|
|
77
|
+
... on ProjectV2MultiSelectField {
|
|
78
|
+
id
|
|
79
|
+
name
|
|
80
|
+
}
|
|
81
|
+
... on ProjectV2SingleSelectField {
|
|
82
|
+
id
|
|
83
|
+
name
|
|
84
|
+
isIssueField
|
|
85
|
+
options { id name }
|
|
86
|
+
issueField {
|
|
87
|
+
__typename
|
|
88
|
+
... on IssueFieldSingleSelect {
|
|
89
|
+
id
|
|
90
|
+
fullDatabaseId
|
|
91
|
+
name
|
|
92
|
+
options { id name }
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
pageInfo { endCursor hasNextPage }
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
`, { cursor, number: settings.number, org: input.org });
|
|
103
|
+
const responseRecord = requireRecord(response, 'GitHub returned invalid delivery Project configuration.');
|
|
104
|
+
const organization = requireRecord(responseRecord.organization, `Organization ${input.org} is unavailable to the selected GitHub identity.`);
|
|
105
|
+
const pageProject = requireRecord(organization.projectV2, `Expected organization Project #${String(settings.number)} (${settings.title}).`);
|
|
106
|
+
const fields = requireRecord(pageProject.fields, 'GitHub omitted delivery Project fields.');
|
|
107
|
+
if (!Array.isArray(fields.nodes)) {
|
|
108
|
+
throw new DeliveryError('GitHub returned invalid delivery Project field nodes.');
|
|
109
|
+
}
|
|
110
|
+
for (const node of fields.nodes)
|
|
111
|
+
nodes.push(node);
|
|
112
|
+
project = { ...pageProject, fields: { nodes } };
|
|
113
|
+
const pageInfo = requireRecord(fields.pageInfo, 'GitHub omitted delivery Project field pagination.');
|
|
114
|
+
hasNextPage = pageInfo.hasNextPage === true;
|
|
115
|
+
const nextCursor = typeof pageInfo.endCursor === 'string' ? pageInfo.endCursor : null;
|
|
116
|
+
assertAdvancingCursor({ cursor, hasNextPage, nextCursor, seenCursors, surface: 'field' });
|
|
117
|
+
if (nextCursor !== null)
|
|
118
|
+
seenCursors.add(nextCursor);
|
|
119
|
+
cursor = nextCursor;
|
|
120
|
+
}
|
|
121
|
+
if (project === null) {
|
|
122
|
+
throw new DeliveryError(`Expected organization Project #${String(settings.number)} (${settings.title}).`);
|
|
123
|
+
}
|
|
124
|
+
return resolveProjectDeliveryConfiguration(project, {
|
|
125
|
+
requireWritable: input.requireWritable === true,
|
|
126
|
+
settings,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
export function projectSettingsFromDeliveryConfig(config) {
|
|
130
|
+
const project = config.native.project;
|
|
131
|
+
return {
|
|
132
|
+
number: project.number,
|
|
133
|
+
points: config.native.points,
|
|
134
|
+
priority: config.native.priority,
|
|
135
|
+
statuses: {
|
|
136
|
+
Blocked: project.statuses.blocked,
|
|
137
|
+
Done: project.statuses.done,
|
|
138
|
+
'In Progress': project.statuses.inProgress,
|
|
139
|
+
Todo: project.statuses.todo,
|
|
140
|
+
},
|
|
141
|
+
statusField: project.statusField,
|
|
142
|
+
title: project.title,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export function resolveProjectDeliveryConfiguration(raw, options) {
|
|
146
|
+
const settings = requireProjectSettings(options.settings);
|
|
147
|
+
const project = requireRecord(raw, 'GitHub returned invalid delivery Project configuration.');
|
|
148
|
+
if (project.number !== settings.number || project.title !== settings.title) {
|
|
149
|
+
throw new DeliveryError(`Expected organization Project #${String(settings.number)} titled ${settings.title}.`);
|
|
150
|
+
}
|
|
151
|
+
if (options.requireWritable === true && project.viewerCanUpdate !== true) {
|
|
152
|
+
throw new DeliveryError(`Organization Project #${String(settings.number)} is not writable by this identity.`);
|
|
153
|
+
}
|
|
154
|
+
const projectId = requireString(project.id, 'GitHub omitted the delivery Project node id.');
|
|
155
|
+
const fields = requireRecord(project.fields, 'GitHub omitted delivery Project fields.');
|
|
156
|
+
if (!Array.isArray(fields.nodes)) {
|
|
157
|
+
throw new DeliveryError('GitHub returned invalid delivery Project field nodes.');
|
|
158
|
+
}
|
|
159
|
+
const statusField = requireExactlyOneField(fields.nodes, settings.statusField);
|
|
160
|
+
const pointsField = requireBoundIssueField({
|
|
161
|
+
expectedDatabaseId: settings.points.databaseId,
|
|
162
|
+
expectedOptions: settings.points.values,
|
|
163
|
+
fields: fields.nodes,
|
|
164
|
+
name: settings.points.name,
|
|
165
|
+
});
|
|
166
|
+
const priorityField = requireBoundIssueField({
|
|
167
|
+
expectedDatabaseId: settings.priority.databaseId,
|
|
168
|
+
expectedOptions: settings.priority.values,
|
|
169
|
+
fields: fields.nodes,
|
|
170
|
+
name: settings.priority.name,
|
|
171
|
+
});
|
|
172
|
+
if (statusField.__typename !== 'ProjectV2SingleSelectField' || statusField.isIssueField !== false) {
|
|
173
|
+
throw new DeliveryError('Project Status must be the sole Project-owned single-select workflow field.');
|
|
174
|
+
}
|
|
175
|
+
const statusOptions = readOptions(statusField.options, `Project ${settings.statusField}`);
|
|
176
|
+
assertExactOptionSet({
|
|
177
|
+
expected: PROJECT_DELIVERY_STATUSES.map((status) => settings.statuses[status]),
|
|
178
|
+
fieldName: `Project ${settings.statusField}`,
|
|
179
|
+
options: statusOptions,
|
|
180
|
+
});
|
|
181
|
+
const statusOptionIds = Object.fromEntries(PROJECT_DELIVERY_STATUSES.map((status) => [
|
|
182
|
+
status,
|
|
183
|
+
statusOptions.find((option) => option.name === settings.statuses[status])?.id,
|
|
184
|
+
]));
|
|
185
|
+
return {
|
|
186
|
+
pointsFieldId: requireString(pointsField.id, 'GitHub omitted the Project Points field id.'),
|
|
187
|
+
priorityFieldId: requireString(priorityField.id, 'GitHub omitted the Project Priority field id.'),
|
|
188
|
+
projectId,
|
|
189
|
+
projectNumber: settings.number,
|
|
190
|
+
settings,
|
|
191
|
+
statusFieldId: requireString(statusField.id, 'GitHub omitted the Project Status field id.'),
|
|
192
|
+
statusOptionIds,
|
|
193
|
+
title: settings.title,
|
|
194
|
+
writable: project.viewerCanUpdate === true,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
export async function restoreIssueProjectItem(input) {
|
|
198
|
+
const configuration = input.configuration ??
|
|
199
|
+
(await getProjectDeliveryConfiguration({
|
|
200
|
+
...input,
|
|
201
|
+
settings: requireProjectSettings(input.settings),
|
|
202
|
+
requireWritable: true,
|
|
203
|
+
}));
|
|
204
|
+
assertWritableConfiguration(configuration);
|
|
205
|
+
const item = await findIssueProjectItem({ ...input, configuration });
|
|
206
|
+
if (item === null)
|
|
207
|
+
return null;
|
|
208
|
+
if (!item.archived)
|
|
209
|
+
return { archived: false, itemId: item.id };
|
|
210
|
+
const response = await input.graphql(`
|
|
211
|
+
mutation RestoreProjectDeliveryItem($projectId: ID!, $itemId: ID!) {
|
|
212
|
+
unarchiveProjectV2Item(input: { projectId: $projectId, itemId: $itemId }) {
|
|
213
|
+
item { id isArchived }
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
`, { itemId: item.id, projectId: configuration.projectId });
|
|
217
|
+
const record = requireRecord(response, 'GitHub returned invalid Project restore evidence.');
|
|
218
|
+
const payload = requireRecord(record.unarchiveProjectV2Item, 'GitHub omitted Project restore payload.');
|
|
219
|
+
const restoredItem = requireRecord(payload.item, 'GitHub omitted the restored Project item.');
|
|
220
|
+
if (restoredItem.id !== item.id || restoredItem.isArchived !== false) {
|
|
221
|
+
throw new DeliveryError('Project restore mutation did not return the exact active item.');
|
|
222
|
+
}
|
|
223
|
+
await readBackProjectArchiveState({
|
|
224
|
+
archived: false,
|
|
225
|
+
configuration,
|
|
226
|
+
graphql: input.graphql,
|
|
227
|
+
issueNodeId: input.issueNodeId,
|
|
228
|
+
itemId: item.id,
|
|
229
|
+
});
|
|
230
|
+
return { archived: false, itemId: item.id };
|
|
231
|
+
}
|
|
232
|
+
export async function syncIssueProjectStatus(input) {
|
|
233
|
+
const configuration = input.configuration ??
|
|
234
|
+
(await getProjectDeliveryConfiguration({
|
|
235
|
+
...input,
|
|
236
|
+
settings: requireProjectSettings(input.settings),
|
|
237
|
+
requireWritable: true,
|
|
238
|
+
}));
|
|
239
|
+
assertWritableConfiguration(configuration);
|
|
240
|
+
let item = await findIssueProjectItem({ ...input, configuration });
|
|
241
|
+
if (item?.archived === true) {
|
|
242
|
+
throw new DeliveryError('The issue delivery Project item is archived and cannot be updated.');
|
|
243
|
+
}
|
|
244
|
+
if (item !== null &&
|
|
245
|
+
item.status !== null &&
|
|
246
|
+
item.statusOptionId !== null &&
|
|
247
|
+
requireItemStatus(item, configuration) === input.status) {
|
|
248
|
+
return { itemId: item.id, status: input.status };
|
|
249
|
+
}
|
|
250
|
+
if (item === null) {
|
|
251
|
+
const response = await input.graphql(`
|
|
252
|
+
mutation AddProjectDeliveryItem($projectId: ID!, $contentId: ID!) {
|
|
253
|
+
addProjectV2ItemById(input: { projectId: $projectId, contentId: $contentId }) {
|
|
254
|
+
item { id }
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
`, { contentId: input.issueNodeId, projectId: configuration.projectId });
|
|
258
|
+
const added = requireRecord(response, 'GitHub returned invalid Project item creation evidence.');
|
|
259
|
+
const payload = requireRecord(added.addProjectV2ItemById, 'GitHub omitted Project item creation payload.');
|
|
260
|
+
const created = requireRecord(payload.item, 'GitHub omitted the created Project item.');
|
|
261
|
+
item = {
|
|
262
|
+
archived: false,
|
|
263
|
+
contentId: input.issueNodeId,
|
|
264
|
+
id: requireString(created.id, 'GitHub omitted the created Project item id.'),
|
|
265
|
+
status: null,
|
|
266
|
+
statusOptionId: null,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
const optionId = configuration.statusOptionIds[input.status];
|
|
270
|
+
const updateResponse = await input.graphql(`
|
|
271
|
+
mutation UpdateProjectDeliveryStatus($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!) {
|
|
272
|
+
updateProjectV2ItemFieldValue(
|
|
273
|
+
input: {
|
|
274
|
+
projectId: $projectId
|
|
275
|
+
itemId: $itemId
|
|
276
|
+
fieldId: $fieldId
|
|
277
|
+
value: { singleSelectOptionId: $optionId }
|
|
278
|
+
}
|
|
279
|
+
) {
|
|
280
|
+
projectV2Item { id }
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
`, {
|
|
284
|
+
fieldId: configuration.statusFieldId,
|
|
285
|
+
itemId: item.id,
|
|
286
|
+
optionId,
|
|
287
|
+
projectId: configuration.projectId,
|
|
288
|
+
});
|
|
289
|
+
const update = requireRecord(updateResponse, 'GitHub returned invalid Project Status mutation evidence.');
|
|
290
|
+
const updatePayload = requireRecord(update.updateProjectV2ItemFieldValue, 'GitHub omitted Project Status mutation payload.');
|
|
291
|
+
const updatedItem = requireRecord(updatePayload.projectV2Item, 'GitHub omitted the updated Project item.');
|
|
292
|
+
if (updatedItem.id !== item.id) {
|
|
293
|
+
throw new DeliveryError('Project Status mutation returned a different item identity.');
|
|
294
|
+
}
|
|
295
|
+
return await readBackProjectItem({
|
|
296
|
+
configuration,
|
|
297
|
+
graphql: input.graphql,
|
|
298
|
+
issueNodeId: input.issueNodeId,
|
|
299
|
+
itemId: item.id,
|
|
300
|
+
status: input.status,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
function assertAdvancingCursor(input) {
|
|
304
|
+
if (input.hasNextPage && input.nextCursor === null) {
|
|
305
|
+
throw new DeliveryError(`Delivery Project ${input.surface} pagination omitted its next cursor.`);
|
|
306
|
+
}
|
|
307
|
+
if (input.hasNextPage &&
|
|
308
|
+
input.nextCursor !== null &&
|
|
309
|
+
(input.nextCursor === input.cursor || input.seenCursors.has(input.nextCursor))) {
|
|
310
|
+
throw new DeliveryError(`Delivery Project ${input.surface} pagination repeated a non-advancing cursor.`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
function assertExactOptionSet(input) {
|
|
314
|
+
const observed = input.options.map((option) => option.name);
|
|
315
|
+
const observedSet = new Set(observed);
|
|
316
|
+
const expectedSet = new Set(input.expected);
|
|
317
|
+
if (observedSet.size !== observed.length ||
|
|
318
|
+
observedSet.size !== expectedSet.size ||
|
|
319
|
+
observed.some((option) => !expectedSet.has(option))) {
|
|
320
|
+
throw new DeliveryError(`${input.fieldName} options must be exactly ${input.expected.join(', ')} (order is provider-owned).`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function assertWritableConfiguration(configuration) {
|
|
324
|
+
if (!configuration.writable) {
|
|
325
|
+
throw new DeliveryError(`Organization Project #${String(configuration.projectNumber)} is not writable by this identity.`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
async function findIssueProjectItem(input) {
|
|
329
|
+
const matches = [];
|
|
330
|
+
let cursor = null;
|
|
331
|
+
let hasNextPage = true;
|
|
332
|
+
const seenCursors = new Set();
|
|
333
|
+
while (hasNextPage) {
|
|
334
|
+
const response = await input.graphql(`
|
|
335
|
+
query ProjectDeliveryItems($org: String!, $number: Int!, $cursor: String, $statusField: String!) {
|
|
336
|
+
organization(login: $org) {
|
|
337
|
+
projectV2(number: $number) {
|
|
338
|
+
items(first: 100, after: $cursor, archivedStates: [ARCHIVED, NOT_ARCHIVED]) {
|
|
339
|
+
nodes {
|
|
340
|
+
id
|
|
341
|
+
isArchived
|
|
342
|
+
content { ... on Issue { id } }
|
|
343
|
+
fieldValueByName(name: $statusField) {
|
|
344
|
+
... on ProjectV2ItemFieldSingleSelectValue { name optionId }
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
pageInfo { endCursor hasNextPage }
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
`, {
|
|
353
|
+
cursor,
|
|
354
|
+
number: input.configuration.projectNumber,
|
|
355
|
+
org: input.org,
|
|
356
|
+
statusField: input.configuration.settings.statusField,
|
|
357
|
+
});
|
|
358
|
+
const record = requireRecord(response, 'GitHub returned invalid delivery Project item evidence.');
|
|
359
|
+
const organization = requireRecord(record.organization, 'GitHub omitted the delivery Project organization.');
|
|
360
|
+
const project = requireRecord(organization.projectV2, 'GitHub omitted the delivery Project.');
|
|
361
|
+
const items = requireRecord(project.items, 'GitHub omitted delivery Project items.');
|
|
362
|
+
if (!Array.isArray(items.nodes)) {
|
|
363
|
+
throw new DeliveryError('GitHub returned invalid delivery Project items.');
|
|
364
|
+
}
|
|
365
|
+
for (const rawItem of items.nodes) {
|
|
366
|
+
const item = parseProjectItem(rawItem, input.configuration);
|
|
367
|
+
if (item !== null && item.contentId === input.issueNodeId)
|
|
368
|
+
matches.push(item);
|
|
369
|
+
}
|
|
370
|
+
const pageInfo = requireRecord(items.pageInfo, 'GitHub omitted delivery Project item pagination.');
|
|
371
|
+
hasNextPage = pageInfo.hasNextPage === true;
|
|
372
|
+
const nextCursor = typeof pageInfo.endCursor === 'string' ? pageInfo.endCursor : null;
|
|
373
|
+
assertAdvancingCursor({ cursor, hasNextPage, nextCursor, seenCursors, surface: 'item' });
|
|
374
|
+
if (nextCursor !== null)
|
|
375
|
+
seenCursors.add(nextCursor);
|
|
376
|
+
cursor = nextCursor;
|
|
377
|
+
}
|
|
378
|
+
if (matches.length > 1) {
|
|
379
|
+
throw new DeliveryError(`Issue has ${String(matches.length)} duplicate Project items in ${input.configuration.title}.`);
|
|
380
|
+
}
|
|
381
|
+
return matches[0] ?? null;
|
|
382
|
+
}
|
|
383
|
+
function isRecord(value) {
|
|
384
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
385
|
+
}
|
|
386
|
+
function parseProjectItem(raw, configuration) {
|
|
387
|
+
const item = requireRecord(raw, 'GitHub returned an invalid delivery Project item.');
|
|
388
|
+
const content = item.content;
|
|
389
|
+
if (content === null || content === undefined)
|
|
390
|
+
return null;
|
|
391
|
+
const contentRecord = requireRecord(content, 'GitHub returned an invalid delivery Project item content node.');
|
|
392
|
+
const contentId = requireString(contentRecord.id, 'GitHub omitted a delivery Project item content id.');
|
|
393
|
+
const fieldValue = item.fieldValueByName;
|
|
394
|
+
let status = null;
|
|
395
|
+
let statusOptionId = null;
|
|
396
|
+
if (fieldValue !== null && fieldValue !== undefined) {
|
|
397
|
+
const statusRecord = requireRecord(fieldValue, 'GitHub returned invalid Project Status readback.');
|
|
398
|
+
const name = requireString(statusRecord.name, 'GitHub omitted Project Status name.');
|
|
399
|
+
const optionId = requireString(statusRecord.optionId, 'GitHub omitted Project Status option id.');
|
|
400
|
+
const statuses = configuration.settings.statuses;
|
|
401
|
+
const canonicalStatus = PROJECT_DELIVERY_STATUSES.find((candidate) => statuses[candidate] === name);
|
|
402
|
+
if (canonicalStatus === undefined || configuration.statusOptionIds[canonicalStatus] !== optionId) {
|
|
403
|
+
throw new DeliveryError(`GitHub returned unsupported Project Status ${name}.`);
|
|
404
|
+
}
|
|
405
|
+
status = canonicalStatus;
|
|
406
|
+
statusOptionId = optionId;
|
|
407
|
+
}
|
|
408
|
+
return {
|
|
409
|
+
archived: item.isArchived === true,
|
|
410
|
+
contentId,
|
|
411
|
+
id: requireString(item.id, 'GitHub omitted the delivery Project item id.'),
|
|
412
|
+
status,
|
|
413
|
+
statusOptionId,
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
async function readBackProjectArchiveState(input) {
|
|
417
|
+
const response = await input.graphql(`
|
|
418
|
+
query ${input.archived ? 'Archived' : 'Restored'}ProjectDeliveryItemReadback($itemId: ID!) {
|
|
419
|
+
node(id: $itemId) {
|
|
420
|
+
... on ProjectV2Item {
|
|
421
|
+
id
|
|
422
|
+
isArchived
|
|
423
|
+
project { id number }
|
|
424
|
+
content { ... on Issue { id } }
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
`, { itemId: input.itemId });
|
|
429
|
+
const state = input.archived ? 'archived' : 'restored';
|
|
430
|
+
const record = requireRecord(response, `GitHub returned invalid ${state} Project item readback.`);
|
|
431
|
+
const node = requireRecord(record.node, `GitHub omitted ${state} Project item readback.`);
|
|
432
|
+
const project = requireRecord(node.project, `GitHub omitted ${state} Project identity readback.`);
|
|
433
|
+
const content = requireRecord(node.content, `GitHub omitted ${state} Project item content readback.`);
|
|
434
|
+
if (node.id !== input.itemId ||
|
|
435
|
+
node.isArchived !== input.archived ||
|
|
436
|
+
project.id !== input.configuration.projectId ||
|
|
437
|
+
project.number !== input.configuration.projectNumber ||
|
|
438
|
+
content.id !== input.issueNodeId) {
|
|
439
|
+
throw new DeliveryError(`Project ${state} readback did not report the exact issue item.`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
async function readBackProjectItem(input) {
|
|
443
|
+
const response = await input.graphql(`
|
|
444
|
+
query ProjectDeliveryItemReadback($itemId: ID!, $statusField: String!) {
|
|
445
|
+
node(id: $itemId) {
|
|
446
|
+
... on ProjectV2Item {
|
|
447
|
+
id
|
|
448
|
+
isArchived
|
|
449
|
+
project { id number }
|
|
450
|
+
content { ... on Issue { id } }
|
|
451
|
+
fieldValueByName(name: $statusField) {
|
|
452
|
+
... on ProjectV2ItemFieldSingleSelectValue { name optionId }
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
`, { itemId: input.itemId, statusField: input.configuration.settings.statusField });
|
|
458
|
+
const record = requireRecord(response, 'GitHub returned invalid Project item readback.');
|
|
459
|
+
const node = requireRecord(record.node, 'GitHub omitted Project item readback.');
|
|
460
|
+
const project = requireRecord(node.project, 'GitHub omitted Project identity readback.');
|
|
461
|
+
const content = requireRecord(node.content, 'GitHub omitted Project item content readback.');
|
|
462
|
+
const fieldValue = requireRecord(node.fieldValueByName, 'GitHub omitted Project Status readback.');
|
|
463
|
+
const observedName = requireString(fieldValue.name, 'GitHub omitted Project Status name readback.');
|
|
464
|
+
const observedOptionId = requireString(fieldValue.optionId, 'GitHub omitted Project Status option readback.');
|
|
465
|
+
if (node.id !== input.itemId ||
|
|
466
|
+
node.isArchived === true ||
|
|
467
|
+
project.id !== input.configuration.projectId ||
|
|
468
|
+
project.number !== input.configuration.projectNumber ||
|
|
469
|
+
content.id !== input.issueNodeId ||
|
|
470
|
+
observedName !== input.configuration.settings.statuses[input.status] ||
|
|
471
|
+
observedOptionId !== input.configuration.statusOptionIds[input.status]) {
|
|
472
|
+
throw new DeliveryError(`Project Status readback did not report ${input.status} for the exact issue item.`);
|
|
473
|
+
}
|
|
474
|
+
return { itemId: input.itemId, status: input.status };
|
|
475
|
+
}
|
|
476
|
+
function readOptions(raw, fieldName) {
|
|
477
|
+
if (!Array.isArray(raw)) {
|
|
478
|
+
throw new DeliveryError(`${fieldName} options are malformed.`);
|
|
479
|
+
}
|
|
480
|
+
return raw.map((option) => {
|
|
481
|
+
const record = requireRecord(option, `${fieldName} option is malformed.`);
|
|
482
|
+
return {
|
|
483
|
+
id: requireString(record.id, `${fieldName} option id is missing.`),
|
|
484
|
+
name: requireString(record.name, `${fieldName} option name is missing.`),
|
|
485
|
+
};
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
function requireBoundIssueField(input) {
|
|
489
|
+
const field = requireExactlyOneField(input.fields, input.name);
|
|
490
|
+
if (field.__typename !== 'ProjectV2SingleSelectField' || field.isIssueField !== true) {
|
|
491
|
+
throw new DeliveryError(`Project ${input.name} must bind the organization issue field.`);
|
|
492
|
+
}
|
|
493
|
+
if (Array.isArray(field.options) && field.options.length !== 0) {
|
|
494
|
+
throw new DeliveryError(`Project ${input.name} must not define Project-owned duplicate options.`);
|
|
495
|
+
}
|
|
496
|
+
const issueField = requireRecord(field.issueField, `Project ${input.name} omitted its bound organization issue field.`);
|
|
497
|
+
const databaseId = typeof issueField.fullDatabaseId === 'string' ? issueField.fullDatabaseId : String(issueField.fullDatabaseId);
|
|
498
|
+
if (issueField.__typename !== 'IssueFieldSingleSelect' ||
|
|
499
|
+
issueField.name !== input.name ||
|
|
500
|
+
databaseId !== input.expectedDatabaseId) {
|
|
501
|
+
throw new DeliveryError(`Project ${input.name} must bind organization issue field ${input.expectedDatabaseId}.`);
|
|
502
|
+
}
|
|
503
|
+
assertExactOptionSet({
|
|
504
|
+
expected: input.expectedOptions,
|
|
505
|
+
fieldName: input.name,
|
|
506
|
+
options: readOptions(issueField.options, `organization ${input.name}`),
|
|
507
|
+
});
|
|
508
|
+
return field;
|
|
509
|
+
}
|
|
510
|
+
function requireExactlyOneField(fields, name) {
|
|
511
|
+
const matches = fields.filter((field) => isRecord(field) && field.name === name);
|
|
512
|
+
if (matches.length !== 1) {
|
|
513
|
+
throw new DeliveryError(`Expected exactly one Project ${name} field, found ${String(matches.length)}.`);
|
|
514
|
+
}
|
|
515
|
+
return matches[0];
|
|
516
|
+
}
|
|
517
|
+
function requireItemStatus(item, configuration) {
|
|
518
|
+
if (item.status === null ||
|
|
519
|
+
item.statusOptionId === null ||
|
|
520
|
+
configuration.statusOptionIds[item.status] !== item.statusOptionId) {
|
|
521
|
+
throw new DeliveryError('The issue delivery Project item has no canonical Project Status.');
|
|
522
|
+
}
|
|
523
|
+
return item.status;
|
|
524
|
+
}
|
|
525
|
+
function requireRecord(value, message) {
|
|
526
|
+
if (!isRecord(value))
|
|
527
|
+
throw new DeliveryError(message);
|
|
528
|
+
return value;
|
|
529
|
+
}
|
|
530
|
+
function requireString(value, message) {
|
|
531
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
532
|
+
throw new DeliveryError(message);
|
|
533
|
+
return value;
|
|
534
|
+
}
|
|
535
|
+
function requireProjectSettings(settings) {
|
|
536
|
+
if (settings === undefined)
|
|
537
|
+
throw new DeliveryError('Project delivery settings are required.');
|
|
538
|
+
return settings;
|
|
539
|
+
}
|
|
540
|
+
//# sourceMappingURL=projectDelivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectDelivery.js","sourceRoot":"","sources":["../../src/github/projectDelivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { graphql as GraphQLType } from '@octokit/graphql';
|
|
2
|
+
import type { Octokit } from '@octokit/rest';
|
|
3
|
+
import type { RepoCoordinates } from './repo.js';
|
|
4
|
+
export interface NativeBlockerRelationship {
|
|
5
|
+
id: string;
|
|
6
|
+
number: number;
|
|
7
|
+
state: 'CLOSED' | 'OPEN';
|
|
8
|
+
title: string;
|
|
9
|
+
}
|
|
10
|
+
export interface NativeBlockerRelationshipReadback {
|
|
11
|
+
blockers: NativeBlockerRelationship[];
|
|
12
|
+
parentId: null | string;
|
|
13
|
+
parentNumber: null | number;
|
|
14
|
+
}
|
|
15
|
+
export interface NativeRelationshipTargets {
|
|
16
|
+
blockerNodeIds: ReadonlyMap<number, string>;
|
|
17
|
+
unresolvedBlockers: number[];
|
|
18
|
+
}
|
|
19
|
+
interface LinkBlockedByParams extends RelationshipContext {
|
|
20
|
+
blockerNodeIds?: ReadonlyMap<number, string>;
|
|
21
|
+
blockers: number[];
|
|
22
|
+
existingBlockers?: readonly number[];
|
|
23
|
+
issueNumber: number;
|
|
24
|
+
}
|
|
25
|
+
interface LinkSubIssueParams {
|
|
26
|
+
parentIssueNumber: number;
|
|
27
|
+
repo: RepoCoordinates;
|
|
28
|
+
rest: Octokit;
|
|
29
|
+
subIssueId?: number;
|
|
30
|
+
subIssueNumber: number;
|
|
31
|
+
}
|
|
32
|
+
interface RelationshipContext {
|
|
33
|
+
graphql: typeof GraphQLType;
|
|
34
|
+
repo: RepoCoordinates;
|
|
35
|
+
rest: Octokit;
|
|
36
|
+
}
|
|
37
|
+
export declare function getNativeBlockerNumbers(params: Omit<RelationshipContext, 'rest'> & {
|
|
38
|
+
issueNumber: number;
|
|
39
|
+
}): Promise<number[]>;
|
|
40
|
+
export declare function getNativeBlockerRelationships({ graphql, issueNumber, repo, }: Omit<RelationshipContext, 'rest'> & {
|
|
41
|
+
issueNumber: number;
|
|
42
|
+
}): Promise<NativeBlockerRelationshipReadback>;
|
|
43
|
+
/** Return the issues that declare this issue as a native blocker. */
|
|
44
|
+
export declare function getNativeBlockingRelationships({ graphql, issueNumber, repo, }: Omit<RelationshipContext, 'rest'> & {
|
|
45
|
+
issueNumber: number;
|
|
46
|
+
}): Promise<NativeBlockerRelationship[]>;
|
|
47
|
+
/** Native sub-issues make an issue a planning container rather than an executable delivery. */
|
|
48
|
+
export declare function hasNativeSubIssues({ issueNumber, repo, rest, }: {
|
|
49
|
+
issueNumber: number;
|
|
50
|
+
repo: RepoCoordinates;
|
|
51
|
+
rest: Octokit;
|
|
52
|
+
}): Promise<boolean>;
|
|
53
|
+
export declare function linkBlockedBy({ blockerNodeIds, blockers, existingBlockers, graphql, issueNumber, repo, rest, }: LinkBlockedByParams): Promise<void>;
|
|
54
|
+
export declare function linkSubIssue({ parentIssueNumber, repo, rest, subIssueId, subIssueNumber, }: LinkSubIssueParams): Promise<void>;
|
|
55
|
+
/** Replace, rather than append to, the native blocked-by edge set. */
|
|
56
|
+
export declare function replaceBlockedBy({ blockers, graphql, issueNumber, repo, rest, }: LinkBlockedByParams): Promise<void>;
|
|
57
|
+
/** Replace or clear the issue's single native parent relationship. */
|
|
58
|
+
export declare function replaceParentIssue({ graphql, issueNumber, parentIssueNumber, repo, rest, }: RelationshipContext & {
|
|
59
|
+
issueNumber: number;
|
|
60
|
+
parentIssueNumber: null | number;
|
|
61
|
+
}): Promise<void>;
|
|
62
|
+
/** Resolve every existing relationship target before a new tracking issue is created. */
|
|
63
|
+
export declare function resolveNativeRelationshipTargets({ blockers, parentIssueNumber, repo, rest, }: {
|
|
64
|
+
blockers: readonly number[];
|
|
65
|
+
parentIssueNumber?: number;
|
|
66
|
+
repo: RepoCoordinates;
|
|
67
|
+
rest: Octokit;
|
|
68
|
+
}): Promise<NativeRelationshipTargets>;
|
|
69
|
+
export {};
|