@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
package/dist/worktree.js
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { existsSync, realpathSync } from 'node:fs';
|
|
2
|
+
import { join, relative, resolve } from 'node:path';
|
|
3
|
+
import { DeliveryError } from './errors.js';
|
|
4
|
+
import { assertClean, defaultBaseRef, git, gitExitCode, gitRoot, primaryGitRoot } from './git.js';
|
|
5
|
+
import { addWorktreeEntry, assertAiDeliveryWorktreeOwner, getIssueWorktreeStrict, listWorktreesStrict, removeWorktreeEntry, } from './services/worktreeRegistry.js';
|
|
6
|
+
function assertSafePath(root, target) {
|
|
7
|
+
const rel = relative(join(root, '.worktrees'), target);
|
|
8
|
+
if (rel === '' || rel.startsWith('..') || rel.startsWith('/')) {
|
|
9
|
+
throw new DeliveryError('Worktree path must be inside the repository .worktrees directory.');
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function assertIssueNumber(issueNumber) {
|
|
13
|
+
if (!Number.isSafeInteger(issueNumber) || issueNumber <= 0)
|
|
14
|
+
throw new DeliveryError('Issue number must be positive.');
|
|
15
|
+
}
|
|
16
|
+
export async function prepareIssueWorktree(input) {
|
|
17
|
+
assertIssueNumber(input.issueNumber);
|
|
18
|
+
const root = primaryGitRoot(input.repoRoot);
|
|
19
|
+
const branch = `issue/${input.issueNumber}`;
|
|
20
|
+
const target = join(root, '.worktrees', `issue-${input.issueNumber}`);
|
|
21
|
+
assertSafePath(root, target);
|
|
22
|
+
const existing = listWorktreesStrict(root).filter((row) => row.type === 'issue' && row.issueNumber === input.issueNumber);
|
|
23
|
+
if (existing.length > 1)
|
|
24
|
+
throw new DeliveryError('Issue has duplicate worktree registry rows.');
|
|
25
|
+
if (existing.length === 1) {
|
|
26
|
+
const row = existing[0];
|
|
27
|
+
assertAiDeliveryWorktreeOwner(row, root);
|
|
28
|
+
if (row.status !== 'active' && row.status !== 'pr-published') {
|
|
29
|
+
throw new DeliveryError('Only an active issue worktree can be resumed.');
|
|
30
|
+
}
|
|
31
|
+
if (row.path !== target ||
|
|
32
|
+
row.branch !== branch ||
|
|
33
|
+
!existsSync(target) ||
|
|
34
|
+
gitRoot(target) !== realpathSync(target)) {
|
|
35
|
+
throw new DeliveryError('Registered worktree disagrees with its exact path or branch.');
|
|
36
|
+
}
|
|
37
|
+
if (git(target, 'branch', '--show-current') !== branch)
|
|
38
|
+
throw new DeliveryError('Registered branch drifted.');
|
|
39
|
+
return row;
|
|
40
|
+
}
|
|
41
|
+
if (existsSync(target))
|
|
42
|
+
throw new DeliveryError('An unregistered issue worktree path already exists.');
|
|
43
|
+
const base = input.baseRef ?? defaultBaseRef(root);
|
|
44
|
+
if (!base || gitExitCode(root, 'rev-parse', '--verify', '--quiet', base) !== 0) {
|
|
45
|
+
throw new DeliveryError('Default base ref is missing.');
|
|
46
|
+
}
|
|
47
|
+
const branchExists = gitExitCode(root, 'show-ref', '--verify', '--quiet', `refs/heads/${branch}`) === 0;
|
|
48
|
+
if (branchExists) {
|
|
49
|
+
git(root, 'worktree', 'add', target, branch);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
git(root, 'worktree', 'add', '-b', branch, target, base);
|
|
53
|
+
}
|
|
54
|
+
const now = new Date().toISOString();
|
|
55
|
+
const row = {
|
|
56
|
+
branch,
|
|
57
|
+
createdAt: now,
|
|
58
|
+
identity: input.identity,
|
|
59
|
+
issueNumber: input.issueNumber,
|
|
60
|
+
path: target,
|
|
61
|
+
status: 'active',
|
|
62
|
+
type: 'issue',
|
|
63
|
+
updatedAt: now,
|
|
64
|
+
};
|
|
65
|
+
try {
|
|
66
|
+
await addWorktreeEntry(row, root);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (git(target, 'status', '--porcelain', '--untracked-files=all') === '') {
|
|
70
|
+
git(root, 'worktree', 'remove', target);
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
return row;
|
|
75
|
+
}
|
|
76
|
+
export async function prepareStandaloneWorktree(input) {
|
|
77
|
+
if (!/^[a-z][a-z0-9-]{0,63}$/u.test(input.name) || !/^[A-Za-z0-9._/-]+$/u.test(input.branch)) {
|
|
78
|
+
throw new DeliveryError('Invalid standalone worktree name or branch.');
|
|
79
|
+
}
|
|
80
|
+
const root = primaryGitRoot(input.repoRoot);
|
|
81
|
+
const target = resolve(root, '.worktrees', input.name);
|
|
82
|
+
assertSafePath(root, target);
|
|
83
|
+
if (existsSync(target) ||
|
|
84
|
+
listWorktreesStrict(root).some((row) => row.path === target || row.branch === input.branch)) {
|
|
85
|
+
throw new DeliveryError('Standalone worktree name or branch already exists.');
|
|
86
|
+
}
|
|
87
|
+
const base = input.baseRef ?? defaultBaseRef(root);
|
|
88
|
+
git(root, 'worktree', 'add', '-b', input.branch, target, base);
|
|
89
|
+
const now = new Date().toISOString();
|
|
90
|
+
const row = {
|
|
91
|
+
branch: input.branch,
|
|
92
|
+
createdAt: now,
|
|
93
|
+
identity: input.identity,
|
|
94
|
+
path: target,
|
|
95
|
+
status: 'active',
|
|
96
|
+
type: 'standalone',
|
|
97
|
+
updatedAt: now,
|
|
98
|
+
};
|
|
99
|
+
try {
|
|
100
|
+
await addWorktreeEntry(row, root);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
assertClean(target);
|
|
104
|
+
git(root, 'worktree', 'remove', target);
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
return row;
|
|
108
|
+
}
|
|
109
|
+
/** Register the exact head of an in-repository PR after its selected-App fetch. */
|
|
110
|
+
export async function preparePrWorktree(input) {
|
|
111
|
+
assertIssueNumber(input.prNumber);
|
|
112
|
+
if (!/^[a-f0-9]{40}$/u.test(input.headSha))
|
|
113
|
+
throw new DeliveryError('PR head SHA is invalid.');
|
|
114
|
+
const root = primaryGitRoot(input.repoRoot);
|
|
115
|
+
const branch = `pr/${input.prNumber}`;
|
|
116
|
+
const target = join(root, '.worktrees', `pr-${input.prNumber}`);
|
|
117
|
+
assertSafePath(root, target);
|
|
118
|
+
if (gitExitCode(root, 'cat-file', '-e', `${input.headSha}^{commit}`) !== 0) {
|
|
119
|
+
throw new DeliveryError('Fetched PR head object is unavailable.');
|
|
120
|
+
}
|
|
121
|
+
const matches = listWorktreesStrict(root).filter((row) => row.type === 'pr' && row.prNumber === input.prNumber);
|
|
122
|
+
if (matches.length > 1)
|
|
123
|
+
throw new DeliveryError('PR has duplicate worktree registry rows.');
|
|
124
|
+
if (matches.length === 1) {
|
|
125
|
+
const row = matches[0];
|
|
126
|
+
assertAiDeliveryWorktreeOwner(row, root);
|
|
127
|
+
if (row.status !== 'active' ||
|
|
128
|
+
row.path !== target ||
|
|
129
|
+
row.branch !== branch ||
|
|
130
|
+
!existsSync(target) ||
|
|
131
|
+
gitRoot(target) !== realpathSync(target) ||
|
|
132
|
+
git(target, 'branch', '--show-current') !== branch) {
|
|
133
|
+
throw new DeliveryError('Registered PR worktree disagrees with its exact path or branch.');
|
|
134
|
+
}
|
|
135
|
+
if (git(target, 'rev-parse', 'HEAD') !== input.headSha) {
|
|
136
|
+
throw new DeliveryError('Registered PR worktree head differs from the fetched PR head.');
|
|
137
|
+
}
|
|
138
|
+
return row;
|
|
139
|
+
}
|
|
140
|
+
if (existsSync(target))
|
|
141
|
+
throw new DeliveryError('An unregistered PR worktree path already exists.');
|
|
142
|
+
const branchExists = gitExitCode(root, 'show-ref', '--verify', '--quiet', `refs/heads/${branch}`) === 0;
|
|
143
|
+
if (branchExists && git(root, 'rev-parse', `refs/heads/${branch}`) !== input.headSha) {
|
|
144
|
+
throw new DeliveryError('Retained PR branch differs from the fetched PR head.');
|
|
145
|
+
}
|
|
146
|
+
if (branchExists)
|
|
147
|
+
git(root, 'worktree', 'add', target, branch);
|
|
148
|
+
else
|
|
149
|
+
git(root, 'worktree', 'add', '-b', branch, target, input.headSha);
|
|
150
|
+
const now = new Date().toISOString();
|
|
151
|
+
const row = {
|
|
152
|
+
branch,
|
|
153
|
+
createdAt: now,
|
|
154
|
+
identity: input.identity,
|
|
155
|
+
path: target,
|
|
156
|
+
prNumber: input.prNumber,
|
|
157
|
+
status: 'active',
|
|
158
|
+
type: 'pr',
|
|
159
|
+
updatedAt: now,
|
|
160
|
+
};
|
|
161
|
+
try {
|
|
162
|
+
await addWorktreeEntry(row, root);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
assertClean(target);
|
|
166
|
+
git(root, 'worktree', 'remove', target);
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
return row;
|
|
170
|
+
}
|
|
171
|
+
/** Remove only a clean registered PR or standalone worktree; issue cleanup remains receipt-bound. */
|
|
172
|
+
export async function cleanupNonIssueWorktree(input) {
|
|
173
|
+
if ((input.name === undefined) === (input.prNumber === undefined)) {
|
|
174
|
+
throw new DeliveryError('Select exactly one registered PR number or standalone name.');
|
|
175
|
+
}
|
|
176
|
+
if (input.prNumber !== undefined)
|
|
177
|
+
assertIssueNumber(input.prNumber);
|
|
178
|
+
if (input.name !== undefined && !/^[a-z0-9][a-z0-9._-]*$/u.test(input.name)) {
|
|
179
|
+
throw new DeliveryError('Standalone worktree name is invalid.');
|
|
180
|
+
}
|
|
181
|
+
const root = primaryGitRoot(input.repoRoot);
|
|
182
|
+
const target = input.prNumber === undefined
|
|
183
|
+
? join(root, '.worktrees', input.name)
|
|
184
|
+
: join(root, '.worktrees', `pr-${input.prNumber}`);
|
|
185
|
+
assertSafePath(root, target);
|
|
186
|
+
const matches = listWorktreesStrict(root).filter((row) => row.path === target);
|
|
187
|
+
if (matches.length !== 1 ||
|
|
188
|
+
(input.prNumber === undefined
|
|
189
|
+
? matches[0].type !== 'standalone'
|
|
190
|
+
: matches[0].type !== 'pr' || matches[0].prNumber !== input.prNumber)) {
|
|
191
|
+
throw new DeliveryError('Selected non-issue worktree has no exact registry owner.');
|
|
192
|
+
}
|
|
193
|
+
const row = matches[0];
|
|
194
|
+
assertAiDeliveryWorktreeOwner(row, root);
|
|
195
|
+
if (!existsSync(target) ||
|
|
196
|
+
gitRoot(target) !== realpathSync(target) ||
|
|
197
|
+
git(target, 'branch', '--show-current') !== row.branch) {
|
|
198
|
+
throw new DeliveryError('Registered non-issue worktree is missing or drifted.');
|
|
199
|
+
}
|
|
200
|
+
assertClean(target);
|
|
201
|
+
const head = git(target, 'rev-parse', 'HEAD');
|
|
202
|
+
const remoteRef = input.prNumber === undefined
|
|
203
|
+
? `refs/remotes/origin/${row.branch}`
|
|
204
|
+
: `refs/remotes/origin/ai-delivery-pr-${input.prNumber}`;
|
|
205
|
+
const retainedByBase = gitExitCode(root, 'merge-base', '--is-ancestor', head, defaultBaseRef(root)) === 0;
|
|
206
|
+
const retainedByRemote = gitExitCode(root, 'show-ref', '--verify', '--quiet', remoteRef) === 0 &&
|
|
207
|
+
gitExitCode(root, 'merge-base', '--is-ancestor', head, remoteRef) === 0;
|
|
208
|
+
if (!retainedByBase && !retainedByRemote) {
|
|
209
|
+
throw new DeliveryError('Clean worktree has an unpublished commit; cleanup requires an exact retaining ref.');
|
|
210
|
+
}
|
|
211
|
+
git(root, 'worktree', 'remove', target);
|
|
212
|
+
await removeWorktreeEntry(target, root);
|
|
213
|
+
}
|
|
214
|
+
export async function cleanupMergedIssueWorktree(input) {
|
|
215
|
+
assertIssueNumber(input.issueNumber);
|
|
216
|
+
const root = primaryGitRoot(input.repoRoot);
|
|
217
|
+
const row = getIssueWorktreeStrict(input.issueNumber, root);
|
|
218
|
+
assertSafePath(root, row.path);
|
|
219
|
+
if (row.status !== 'merged' || row.path !== join(root, '.worktrees', `issue-${input.issueNumber}`)) {
|
|
220
|
+
throw new DeliveryError('Only the exact registered merged issue worktree can be cleaned.');
|
|
221
|
+
}
|
|
222
|
+
const present = existsSync(row.path);
|
|
223
|
+
if (present && gitRoot(row.path) !== realpathSync(row.path)) {
|
|
224
|
+
throw new DeliveryError('Registered worktree points elsewhere.');
|
|
225
|
+
}
|
|
226
|
+
if (!present && input.afterRemoval === undefined) {
|
|
227
|
+
throw new DeliveryError('Registered worktree is missing.');
|
|
228
|
+
}
|
|
229
|
+
if (present)
|
|
230
|
+
assertClean(row.path);
|
|
231
|
+
const base = defaultBaseRef(root);
|
|
232
|
+
const branchIncluded = gitExitCode(root, 'merge-base', '--is-ancestor', row.branch, base) === 0;
|
|
233
|
+
const attestation = input.merge;
|
|
234
|
+
if (attestation) {
|
|
235
|
+
if (attestation.headBranch !== row.branch ||
|
|
236
|
+
attestation.headSha !== git(present ? row.path : root, 'rev-parse', present ? 'HEAD' : row.branch) ||
|
|
237
|
+
(attestation.remoteHeadSha !== null && attestation.remoteHeadSha !== attestation.headSha) ||
|
|
238
|
+
attestation.baseBranch !== base.replace(/^origin\//u, '') ||
|
|
239
|
+
attestation.remoteBaseSha !== git(root, 'rev-parse', base) ||
|
|
240
|
+
gitExitCode(root, 'merge-base', '--is-ancestor', attestation.baseSha, attestation.mergeSha) !== 0 ||
|
|
241
|
+
gitExitCode(root, 'merge-base', '--is-ancestor', attestation.mergeSha, base) !== 0 ||
|
|
242
|
+
git(root, 'rev-parse', `${attestation.mergeSha}^{tree}`) !== attestation.mergeTree ||
|
|
243
|
+
(!branchIncluded && attestation.strategy === 'merge')) {
|
|
244
|
+
throw new DeliveryError('Exact merged-result cleanup attestation disagrees with Git or remote readback.');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else if (!branchIncluded) {
|
|
248
|
+
throw new DeliveryError('Branch is not included in the current base and exact merged-result attestation is absent.');
|
|
249
|
+
}
|
|
250
|
+
if (present)
|
|
251
|
+
git(root, 'worktree', 'remove', row.path);
|
|
252
|
+
await input.afterRemoval?.();
|
|
253
|
+
await removeWorktreeEntry(row.path, root);
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aviaratech/ai-delivery",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "Generic GitHub issue and pull request delivery CLI and MCP server",
|
|
6
|
+
"homepage": "https://github.com/aviaratech/ai-delivery#readme",
|
|
7
|
+
"bugs": {
|
|
8
|
+
"url": "https://github.com/aviaratech/ai-delivery/issues"
|
|
9
|
+
},
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/aviaratech/ai-delivery.git"
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"ai-delivery": "./dist/cli.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"plugins/ai-delivery",
|
|
21
|
+
"README.md",
|
|
22
|
+
"CONTRIBUTING.md"
|
|
23
|
+
],
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"default": "./dist/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./agent": {
|
|
33
|
+
"types": "./dist/agent.d.ts",
|
|
34
|
+
"default": "./dist/agent.js"
|
|
35
|
+
},
|
|
36
|
+
"./delivery": {
|
|
37
|
+
"types": "./dist/delivery/index.d.ts",
|
|
38
|
+
"default": "./dist/delivery/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./mcp": {
|
|
41
|
+
"types": "./dist/mcp/index.d.ts",
|
|
42
|
+
"default": "./dist/mcp/index.js"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"format": "oxfmt src package.json tsconfig.json tsconfig.build.json vitest.config.ts .oxlintrc.json .oxfmtrc.json",
|
|
50
|
+
"format:check": "oxfmt --check src package.json tsconfig.json tsconfig.build.json vitest.config.ts .oxlintrc.json .oxfmtrc.json",
|
|
51
|
+
"lint": "oxlint",
|
|
52
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
53
|
+
"build": "tsc -p tsconfig.build.json",
|
|
54
|
+
"postbuild": "node -e \"require('node:fs').chmodSync('dist/cli.js', 0o755)\"",
|
|
55
|
+
"test": "npm run build && vitest run",
|
|
56
|
+
"checks": "npm run format:check && npm run lint && npm run typecheck && npm test"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
60
|
+
"@octokit/auth-app": "^8.2.0",
|
|
61
|
+
"@octokit/graphql": "^9.0.3",
|
|
62
|
+
"@octokit/rest": "^22.0.1",
|
|
63
|
+
"chalk": "^5.6.2",
|
|
64
|
+
"commander": "^14.0.3",
|
|
65
|
+
"proper-lockfile": "^4.1.2",
|
|
66
|
+
"zod": "^4.4.3"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@types/node": "^25.9.1",
|
|
70
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
71
|
+
"oxfmt": "0.70.0",
|
|
72
|
+
"oxlint": "1.85.0",
|
|
73
|
+
"oxlint-tsgolint": "7.0.2003",
|
|
74
|
+
"typescript": "6.0.2",
|
|
75
|
+
"vitest": "5.0.1"
|
|
76
|
+
},
|
|
77
|
+
"engines": {
|
|
78
|
+
"node": ">=24.21.0 <25",
|
|
79
|
+
"npm": "11.19.0"
|
|
80
|
+
},
|
|
81
|
+
"packageManager": "npm@11.19.0"
|
|
82
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# ai-delivery plugin
|
|
2
|
+
|
|
3
|
+
Thin host plugin for `@aviaratech/ai-delivery`. The launcher starts the installed package's `mcp:serve` command over stdio. MCP schemas, GitHub operations, worktree handling, and delivery logic remain in the package.
|
|
4
|
+
|
|
5
|
+
The bundled skills cover issue intake, prepared worktree development, and pull request handoff. Install the package with its `plugins/ai-delivery` directory available to the host plugin loader. Point the host at `plugins/ai-delivery/dist/mcp-launcher.js` from the verified package installation, set the consuming repository's configured App credential environment outside source control, and issue the private runtime-admission record described in the [package guide](../../README.md) before a lifecycle write. Restart the host after installation so it loads the new launcher. A read-only `issue_info` call can confirm repository selection; verify App identity and role permissions before any mutation. Keep one active writer per issue and preserve its original worktree owner when upgrading.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
|
|
4
|
+
const packageEntry = import.meta.resolve('@aviaratech/ai-delivery');
|
|
5
|
+
if (!packageEntry.startsWith('file:')) {
|
|
6
|
+
throw new Error('Cannot resolve the installed @aviaratech/ai-delivery package to a file');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const cliEntry = fileURLToPath(new URL('./cli.js', packageEntry));
|
|
10
|
+
const child = spawn(process.execPath, [cliEntry, 'mcp:serve'], {
|
|
11
|
+
env: process.env,
|
|
12
|
+
stdio: 'inherit',
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
child.on('error', (error) => {
|
|
16
|
+
process.stderr.write(`Unable to start ai-delivery MCP server: ${error.message}\n`);
|
|
17
|
+
process.exitCode = 1;
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
child.on('close', (code, signal) => {
|
|
21
|
+
process.exitCode = code ?? (signal ? 1 : 0);
|
|
22
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "ai-delivery:intake-create"
|
|
3
|
+
description: Create or inspect a GitHub tracking issue and check whether it is ready for development.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Issue intake
|
|
7
|
+
|
|
8
|
+
Use the native GitHub issue as the source of truth for issue details and relationships. Keep the title and body concrete: describe the problem, available evidence, acceptance criteria, and verification command.
|
|
9
|
+
|
|
10
|
+
## MCP tools first
|
|
11
|
+
|
|
12
|
+
1. Use `issue_create` to create one coherent tracking issue with the applicable native issue metadata and relationships.
|
|
13
|
+
2. Use `issue_info` to inspect a known issue and `issue_update` for authoritative metadata, relationship, or lifecycle changes.
|
|
14
|
+
3. Run `issue_ready_check` before development. Resolve any reported gaps in the issue before proceeding.
|
|
15
|
+
4. Continue with `issue_develop` when the issue is ready.
|
|
16
|
+
|
|
17
|
+
## CLI fallback
|
|
18
|
+
|
|
19
|
+
When MCP is unavailable, use the installed `ai-delivery` command:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
ai-delivery create
|
|
23
|
+
ai-delivery info --issue <number>
|
|
24
|
+
ai-delivery ready:check --issue <number>
|
|
25
|
+
ai-delivery develop --issue <number>
|
|
26
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "ai-delivery:pr-handoff"
|
|
3
|
+
description: Publish a verified change, submit independent review evidence, and complete guarded pull request delivery.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Pull request handoff
|
|
7
|
+
|
|
8
|
+
Use the verified commit and its evidence throughout publication, review, and merge. If the commit changes, verify the new commit and obtain review for its exact pull request head.
|
|
9
|
+
|
|
10
|
+
## MCP tools first
|
|
11
|
+
|
|
12
|
+
1. Run `issue_verify` on the committed change.
|
|
13
|
+
2. Publish it as a draft with `issue_pr_create`, then inspect it with `issue_pr_info` as needed.
|
|
14
|
+
3. Obtain an independent review of the exact pull request head and submit its evidence with `issue_pr_review`.
|
|
15
|
+
4. Once the approval and required checks are present, promote the pull request and use `issue_finish` to complete guarded delivery and cleanup.
|
|
16
|
+
|
|
17
|
+
Missing or stale evidence, a changed head, failed checks, conflicts, or unresolved blockers require resolution before continuing.
|
|
18
|
+
|
|
19
|
+
## CLI fallback
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
ai-delivery verify
|
|
23
|
+
ai-delivery pr:create --issue <number>
|
|
24
|
+
# obtain independent review of the exact pull request head
|
|
25
|
+
ai-delivery pr:review --pr <number> --artifact <review-artifact>
|
|
26
|
+
ai-delivery pr:create --issue <number> --ready
|
|
27
|
+
ai-delivery finish --issue <number> --pr <number>
|
|
28
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "ai-delivery:worktree-lifecycle"
|
|
3
|
+
description: Prepare an issue-backed or explicitly standalone worktree, develop there, and verify the resulting commit.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Prepared worktree lifecycle
|
|
7
|
+
|
|
8
|
+
Use a registered prepared worktree for implementation so changes and delivery evidence stay associated with the intended issue.
|
|
9
|
+
|
|
10
|
+
## MCP tools first
|
|
11
|
+
|
|
12
|
+
1. For tracked work, inspect the issue with `issue_info`, check it with `issue_ready_check`, then prepare it with `issue_develop`.
|
|
13
|
+
2. For explicitly standalone work, use `issue_worktree_create`.
|
|
14
|
+
3. Make changes in the prepared worktree, run the focused checks, and commit the change.
|
|
15
|
+
4. Run `issue_verify` after the commit. Continue to pull request handoff with the exact verified commit.
|
|
16
|
+
|
|
17
|
+
## CLI fallback
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
ai-delivery ready:check --issue <number>
|
|
21
|
+
ai-delivery develop --issue <number>
|
|
22
|
+
# edit, run focused checks, and commit in the prepared worktree
|
|
23
|
+
ai-delivery verify
|
|
24
|
+
```
|