@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 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
package/dist/errors.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,IAAI,CAAqB;IAElC,YAAY,OAAe,EAAE,IAAa;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { test } from 'vitest';
|
|
7
|
+
import { buildVelocityReport, getDeliveryRecords, recordMergedDelivery, } from './services/deliveryRecordService.js';
|
|
8
|
+
import { planOfflineLegacyIssueMigration } from './services/legacyIssueMigration.js';
|
|
9
|
+
test('offline legacy normalization preserves native blockers and refuses an unproven tracking parent', () => {
|
|
10
|
+
const input = {
|
|
11
|
+
issues: [
|
|
12
|
+
{
|
|
13
|
+
number: 17,
|
|
14
|
+
body: '<!-- dependencyDeclaration: {"blockedBy":["#9"]} -->\n## Outcome\nDeliver.',
|
|
15
|
+
labels: ['area:delivery', 'effort:s', 'type:task', 'status:blocked'],
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
repositoryLabels: ['area:delivery', 'effort:s'],
|
|
19
|
+
};
|
|
20
|
+
const report = planOfflineLegacyIssueMigration(input);
|
|
21
|
+
assert.equal(report.schemaVersion, 'ai-delivery.legacy-issue-migration@1');
|
|
22
|
+
assert.equal(report.mode, 'dry-run');
|
|
23
|
+
assert.deepEqual(report.plans[0]?.native, {
|
|
24
|
+
blockedBy: [9],
|
|
25
|
+
issueType: 'Task',
|
|
26
|
+
points: 2,
|
|
27
|
+
projectStatus: 'Blocked',
|
|
28
|
+
});
|
|
29
|
+
assert.deepEqual(report.retiredRepositoryLabels, ['effort:s']);
|
|
30
|
+
assert.doesNotMatch(report.plans[0]?.body ?? '', /dependencyDeclaration/u);
|
|
31
|
+
assert.throws(() => planOfflineLegacyIssueMigration({
|
|
32
|
+
issues: [
|
|
33
|
+
{
|
|
34
|
+
number: 18,
|
|
35
|
+
body: 'Track children',
|
|
36
|
+
labels: ['type:tracking'],
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
}), /native sub-issue/u);
|
|
40
|
+
assert.throws(() => planOfflineLegacyIssueMigration({ issues: [input.issues[0], input.issues[0]] }), /repeats an issue number/u);
|
|
41
|
+
});
|
|
42
|
+
test('legacy CLI emits an offline plan without modifying its input', () => {
|
|
43
|
+
const root = mkdtempSync(join(tmpdir(), 'ai-delivery-migration-'));
|
|
44
|
+
try {
|
|
45
|
+
const path = join(root, 'issues.json');
|
|
46
|
+
const bytes = JSON.stringify({ issues: [{ number: 5, body: '## Outcome\nDeliver.', labels: ['effort:xs'] }] });
|
|
47
|
+
writeFileSync(path, bytes);
|
|
48
|
+
const output = execFileSync(process.execPath, [join(process.cwd(), 'dist', 'cli.js'), 'migrate:legacy-issues', '--input-file', path], { encoding: 'utf8' });
|
|
49
|
+
const report = JSON.parse(output);
|
|
50
|
+
assert.equal(report.mode, 'dry-run');
|
|
51
|
+
assert.equal(report.plans[0]?.native.points, 1);
|
|
52
|
+
assert.equal(readFileSync(path, 'utf8'), bytes);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
rmSync(root, { recursive: true, force: true });
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
test('bounded velocity records are idempotent and conflict on changed merged facts', async () => {
|
|
59
|
+
const root = mkdtempSync(join(tmpdir(), 'ai-delivery-metrics-'));
|
|
60
|
+
try {
|
|
61
|
+
execFileSync('git', ['init', '-q', '-b', 'main'], { cwd: root });
|
|
62
|
+
const now = new Date('2026-09-25T12:00:00.000Z');
|
|
63
|
+
const mergedAt = '2026-09-20T12:00:00.000Z';
|
|
64
|
+
const record = {
|
|
65
|
+
blockerTimeMs: null,
|
|
66
|
+
cycleTimeMs: 3600000,
|
|
67
|
+
firstPassApproved: null,
|
|
68
|
+
issueNumber: 17,
|
|
69
|
+
mergedAt,
|
|
70
|
+
mergeSha: 'a'.repeat(40),
|
|
71
|
+
points: 4,
|
|
72
|
+
recordedAt: '2026-09-20T13:00:00.000Z',
|
|
73
|
+
repository: 'example/widget',
|
|
74
|
+
reviewRounds: null,
|
|
75
|
+
schemaVersion: 'ai-delivery.delivery-record@1',
|
|
76
|
+
terminalCleanupAt: '2026-09-20T13:00:00.000Z',
|
|
77
|
+
};
|
|
78
|
+
assert.equal((await recordMergedDelivery(record, root)).state, 'recorded');
|
|
79
|
+
assert.equal((await recordMergedDelivery(record, root)).state, 'already-recorded');
|
|
80
|
+
assert.equal(getDeliveryRecords(root).length, 1);
|
|
81
|
+
await assert.rejects(recordMergedDelivery({ ...record, points: 3 }, root), /facts conflict/u);
|
|
82
|
+
const report = buildVelocityReport(getDeliveryRecords(root), now, [1, 2, 4]);
|
|
83
|
+
assert.equal(report.schemaVersion, 'ai-delivery.velocity-report@1');
|
|
84
|
+
assert.equal(report.weeks.reduce((sum, week) => sum + week.mergedPoints, 0), 4);
|
|
85
|
+
assert.equal(report.pointBuckets.find((bucket) => bucket.points === 4)?.firstPassRate, null);
|
|
86
|
+
assert.equal(report.pointBuckets.find((bucket) => bucket.points === 1)?.deliveries, 0);
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
rmSync(root, { recursive: true, force: true });
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=genericCompatibility.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genericCompatibility.test.js","sourceRoot":"","sources":["../src/genericCompatibility.test.ts"],"names":[],"mappings":"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"}
|
package/dist/git.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface GitCoordinate {
|
|
2
|
+
sha: string;
|
|
3
|
+
tree: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function git(cwd: string, ...args: string[]): string;
|
|
6
|
+
export declare function gitExitCode(cwd: string, ...args: string[]): number;
|
|
7
|
+
export declare function gitRoot(cwd: string): string;
|
|
8
|
+
export declare function gitCommonDir(cwd: string): string;
|
|
9
|
+
export declare function primaryGitRoot(cwd: string): string;
|
|
10
|
+
export declare function coordinate(cwd: string, ref?: string): GitCoordinate;
|
|
11
|
+
export declare function assertClean(cwd: string): void;
|
|
12
|
+
export declare function changedPaths(cwd: string, baseSha: string, headSha: string): string[];
|
|
13
|
+
export declare function defaultBaseRef(cwd: string): string;
|
package/dist/git.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { execFileSync, spawnSync } from 'node:child_process';
|
|
2
|
+
import { realpathSync } from 'node:fs';
|
|
3
|
+
import { basename, dirname, resolve } from 'node:path';
|
|
4
|
+
import { DeliveryError } from './errors.js';
|
|
5
|
+
export function git(cwd, ...args) {
|
|
6
|
+
try {
|
|
7
|
+
return execFileSync('git', args, {
|
|
8
|
+
cwd,
|
|
9
|
+
encoding: 'utf8',
|
|
10
|
+
maxBuffer: 4 * 1024 * 1024,
|
|
11
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
12
|
+
}).trim();
|
|
13
|
+
}
|
|
14
|
+
catch (cause) {
|
|
15
|
+
const error = cause;
|
|
16
|
+
const detail = String(error.stderr ?? '').trim();
|
|
17
|
+
throw new DeliveryError(`git ${args[0] ?? ''} failed${detail ? `: ${detail}` : ''}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function gitExitCode(cwd, ...args) {
|
|
21
|
+
const result = spawnSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
|
|
22
|
+
if (result.error)
|
|
23
|
+
throw result.error;
|
|
24
|
+
return result.status ?? 1;
|
|
25
|
+
}
|
|
26
|
+
export function gitRoot(cwd) {
|
|
27
|
+
return realpathSync(resolve(cwd, git(cwd, 'rev-parse', '--show-toplevel')));
|
|
28
|
+
}
|
|
29
|
+
export function gitCommonDir(cwd) {
|
|
30
|
+
return realpathSync(resolve(cwd, git(cwd, 'rev-parse', '--git-common-dir')));
|
|
31
|
+
}
|
|
32
|
+
export function primaryGitRoot(cwd) {
|
|
33
|
+
const common = gitCommonDir(cwd);
|
|
34
|
+
if (basename(common) !== '.git')
|
|
35
|
+
throw new DeliveryError('Expected a conventional non-bare Git repository.');
|
|
36
|
+
return dirname(common);
|
|
37
|
+
}
|
|
38
|
+
export function coordinate(cwd, ref = 'HEAD') {
|
|
39
|
+
const sha = git(cwd, 'rev-parse', '--verify', ref);
|
|
40
|
+
const tree = git(cwd, 'rev-parse', `${sha}^{tree}`);
|
|
41
|
+
if (!/^[a-f0-9]{40}$/u.test(sha) || !/^[a-f0-9]{40}$/u.test(tree)) {
|
|
42
|
+
throw new DeliveryError('Git coordinate is not a SHA-1 commit and tree.');
|
|
43
|
+
}
|
|
44
|
+
return { sha, tree };
|
|
45
|
+
}
|
|
46
|
+
export function assertClean(cwd) {
|
|
47
|
+
if (git(cwd, 'status', '--porcelain', '--untracked-files=all') !== '') {
|
|
48
|
+
throw new DeliveryError('Delivery requires an exact clean worktree.');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function changedPaths(cwd, baseSha, headSha) {
|
|
52
|
+
const output = git(cwd, 'diff', '--name-only', '-z', baseSha, headSha);
|
|
53
|
+
return output.split('\0').filter(Boolean).sort();
|
|
54
|
+
}
|
|
55
|
+
export function defaultBaseRef(cwd) {
|
|
56
|
+
const remoteHead = gitExitCode(cwd, 'symbolic-ref', '--quiet', '--short', 'refs/remotes/origin/HEAD');
|
|
57
|
+
if (remoteHead === 0)
|
|
58
|
+
return git(cwd, 'symbolic-ref', '--quiet', '--short', 'refs/remotes/origin/HEAD');
|
|
59
|
+
if (gitExitCode(cwd, 'show-ref', '--verify', '--quiet', 'refs/remotes/origin/main') === 0)
|
|
60
|
+
return 'origin/main';
|
|
61
|
+
if (gitExitCode(cwd, 'show-ref', '--verify', '--quiet', 'refs/heads/main') === 0)
|
|
62
|
+
return 'main';
|
|
63
|
+
return git(cwd, 'branch', '--show-current');
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { graphql as GraphQLType } from '@octokit/graphql';
|
|
2
|
+
import { Octokit } from '@octokit/rest';
|
|
3
|
+
import type { DeliveryConfig, DeliveryRole } from '../config/deliveryConfig.js';
|
|
4
|
+
export interface GitHubClients {
|
|
5
|
+
authSource: 'app' | 'personal';
|
|
6
|
+
role: DeliveryRole;
|
|
7
|
+
appActorLogin?: () => Promise<string>;
|
|
8
|
+
authenticatedAuthor?: () => Promise<{
|
|
9
|
+
actorLogin: string;
|
|
10
|
+
credentialIdentity: string;
|
|
11
|
+
}>;
|
|
12
|
+
graphql: typeof GraphQLType;
|
|
13
|
+
rest: Octokit;
|
|
14
|
+
}
|
|
15
|
+
/** Pass the selected author App token only to the operation that needs Git HTTP auth. */
|
|
16
|
+
export declare function withAuthorGitToken<T>(clients: GitHubClients, callback: (token: string) => Promise<T> | T): Promise<T>;
|
|
17
|
+
export type DeliveryPermission = 'read' | 'write';
|
|
18
|
+
export declare function assertDeliveryRolePermissions(input: {
|
|
19
|
+
additional?: Readonly<Record<string, DeliveryPermission>>;
|
|
20
|
+
permissions: unknown;
|
|
21
|
+
role: DeliveryRole;
|
|
22
|
+
}): void;
|
|
23
|
+
/** The author role may use a personal token only after an explicit operator opt-in. */
|
|
24
|
+
export declare function createDeliveryGitHubClients(input: {
|
|
25
|
+
config: DeliveryConfig;
|
|
26
|
+
env?: NodeJS.ProcessEnv;
|
|
27
|
+
identity: string;
|
|
28
|
+
personalAuth?: {
|
|
29
|
+
enabled: true;
|
|
30
|
+
token?: string;
|
|
31
|
+
};
|
|
32
|
+
additionalPermissions?: Readonly<Record<string, DeliveryPermission>>;
|
|
33
|
+
role: DeliveryRole;
|
|
34
|
+
}): Promise<GitHubClients>;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { createAppAuth } from '@octokit/auth-app';
|
|
2
|
+
import { graphql } from '@octokit/graphql';
|
|
3
|
+
import { Octokit } from '@octokit/rest';
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
import { resolveDeliveryRoleCredentials } from '../config/deliveryConfig.js';
|
|
6
|
+
import { DeliveryError } from '../errors.js';
|
|
7
|
+
const authorGitTokens = new WeakMap();
|
|
8
|
+
/** Pass the selected author App token only to the operation that needs Git HTTP auth. */
|
|
9
|
+
export async function withAuthorGitToken(clients, callback) {
|
|
10
|
+
const token = clients.role === 'author' && clients.authSource === 'app' ? authorGitTokens.get(clients) : undefined;
|
|
11
|
+
if (!token)
|
|
12
|
+
throw new DeliveryError('Git push requires the selected author GitHub App installation token.');
|
|
13
|
+
return callback(token);
|
|
14
|
+
}
|
|
15
|
+
export function assertDeliveryRolePermissions(input) {
|
|
16
|
+
if (typeof input.permissions !== 'object' || input.permissions === null || Array.isArray(input.permissions)) {
|
|
17
|
+
throw new DeliveryError(`GitHub App ${input.role} role did not return installation permissions.`);
|
|
18
|
+
}
|
|
19
|
+
const permissions = input.permissions;
|
|
20
|
+
const required = input.role === 'author'
|
|
21
|
+
? { contents: 'write', issues: 'write', organization_projects: 'write', pull_requests: 'write' }
|
|
22
|
+
: { contents: 'read', pull_requests: 'write' };
|
|
23
|
+
for (const [name, level] of [...Object.entries(required), ...Object.entries(input.additional ?? {})]) {
|
|
24
|
+
const actual = permissions[name];
|
|
25
|
+
if (actual !== 'admin' && actual !== 'write' && (level === 'write' || actual !== 'read')) {
|
|
26
|
+
throw new DeliveryError(`GitHub App ${input.role} role lacks required ${name}:${level} permission.`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** The author role may use a personal token only after an explicit operator opt-in. */
|
|
31
|
+
export async function createDeliveryGitHubClients(input) {
|
|
32
|
+
const env = input.env ?? process.env;
|
|
33
|
+
if (input.personalAuth !== undefined) {
|
|
34
|
+
if (input.personalAuth.enabled !== true ||
|
|
35
|
+
input.role !== 'author' ||
|
|
36
|
+
input.identity.trim().toLowerCase() !== 'personal') {
|
|
37
|
+
throw new DeliveryError('Personal-token auth requires the explicit personal author identity.');
|
|
38
|
+
}
|
|
39
|
+
const token = input.personalAuth.token?.trim() || env.GH_TOKEN?.trim() || env.GITHUB_TOKEN?.trim();
|
|
40
|
+
if (!token)
|
|
41
|
+
throw new DeliveryError('Explicit personal-token auth requested but no token was supplied.');
|
|
42
|
+
return buildClients(token, 'personal', 'author', undefined, async () => {
|
|
43
|
+
try {
|
|
44
|
+
const user = (await new Octokit({ auth: token }).rest.users.getAuthenticated()).data;
|
|
45
|
+
if (!Number.isSafeInteger(user.id) || user.id <= 0 || !user.login) {
|
|
46
|
+
throw new DeliveryError('Personal author identity readback is incomplete.');
|
|
47
|
+
}
|
|
48
|
+
return { actorLogin: user.login, credentialIdentity: `user:${String(user.id)}` };
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (error instanceof DeliveryError)
|
|
52
|
+
throw error;
|
|
53
|
+
throw new DeliveryError('Personal author identity readback failed.');
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const selected = input.config.roles[input.role];
|
|
58
|
+
if (input.identity.trim().toLowerCase() !== selected.identity.toLowerCase()) {
|
|
59
|
+
throw new DeliveryError(`GitHub ${input.role} operation requires the configured ${input.role} identity.`);
|
|
60
|
+
}
|
|
61
|
+
const credentials = resolveDeliveryRoleCredentials({ config: input.config, env, role: input.role });
|
|
62
|
+
const otherRole = input.role === 'author' ? 'reviewer' : 'author';
|
|
63
|
+
const other = resolveDeliveryRoleCredentials({ config: input.config, env, role: otherRole });
|
|
64
|
+
if (credentials.appId === other.appId ||
|
|
65
|
+
credentials.installationId === other.installationId ||
|
|
66
|
+
credentials.privateKeyPath === other.privateKeyPath) {
|
|
67
|
+
throw new DeliveryError('Author and reviewer must use distinct GitHub App credentials.');
|
|
68
|
+
}
|
|
69
|
+
let privateKey;
|
|
70
|
+
try {
|
|
71
|
+
privateKey = readFileSync(credentials.privateKeyPath, 'utf8');
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
throw new DeliveryError(`GitHub App private key for ${input.role} role is unavailable.`);
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const auth = createAppAuth({ appId: credentials.appId, privateKey });
|
|
78
|
+
const result = await auth({ installationId: credentials.installationId, type: 'installation' });
|
|
79
|
+
if (typeof result.token !== 'string' || !result.token.startsWith('ghs_')) {
|
|
80
|
+
throw new DeliveryError(`GitHub ${input.role} role did not receive an App installation token.`);
|
|
81
|
+
}
|
|
82
|
+
assertDeliveryRolePermissions({
|
|
83
|
+
...(input.additionalPermissions === undefined ? {} : { additional: input.additionalPermissions }),
|
|
84
|
+
permissions: result.permissions,
|
|
85
|
+
role: input.role,
|
|
86
|
+
});
|
|
87
|
+
const appActorLogin = input.role === 'reviewer'
|
|
88
|
+
? async () => {
|
|
89
|
+
try {
|
|
90
|
+
const app = await new Octokit({ auth: (await auth({ type: 'app' })).token }).rest.apps.getAuthenticated();
|
|
91
|
+
if (!app.data || app.data.id !== Number(credentials.appId) || !app.data.slug) {
|
|
92
|
+
throw new DeliveryError('Reviewer GitHub App identity did not match its configured App ID.');
|
|
93
|
+
}
|
|
94
|
+
return `${app.data.slug}[bot]`;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error instanceof DeliveryError)
|
|
98
|
+
throw error;
|
|
99
|
+
throw new DeliveryError('Reviewer GitHub App actor lookup failed.');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
: undefined;
|
|
103
|
+
const authenticatedAuthor = input.role === 'author'
|
|
104
|
+
? async () => {
|
|
105
|
+
try {
|
|
106
|
+
const app = await new Octokit({ auth: (await auth({ type: 'app' })).token }).rest.apps.getAuthenticated();
|
|
107
|
+
if (!app.data || app.data.id !== Number(credentials.appId) || !app.data.slug) {
|
|
108
|
+
throw new DeliveryError('Author GitHub App identity did not match its configured App ID.');
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
actorLogin: `${app.data.slug}[bot]`,
|
|
112
|
+
credentialIdentity: `app:${String(app.data.id)}:installation:${credentials.installationId}`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (error instanceof DeliveryError)
|
|
117
|
+
throw error;
|
|
118
|
+
throw new DeliveryError('Author GitHub App actor lookup failed.');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
: undefined;
|
|
122
|
+
return buildClients(result.token, 'app', input.role, appActorLogin, authenticatedAuthor);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (error instanceof DeliveryError)
|
|
126
|
+
throw error;
|
|
127
|
+
throw new DeliveryError(`GitHub App authentication failed for ${input.role} role.`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function buildClients(token, authSource, role, appActorLogin, authenticatedAuthor) {
|
|
131
|
+
const clients = {
|
|
132
|
+
authSource,
|
|
133
|
+
role,
|
|
134
|
+
...(appActorLogin ? { appActorLogin } : {}),
|
|
135
|
+
...(authenticatedAuthor ? { authenticatedAuthor } : {}),
|
|
136
|
+
graphql: graphql.defaults({ headers: { authorization: `token ${token}` } }),
|
|
137
|
+
rest: new Octokit({ auth: token }),
|
|
138
|
+
};
|
|
139
|
+
if (authSource === 'app' && role === 'author')
|
|
140
|
+
authorGitTokens.set(clients, token);
|
|
141
|
+
return clients;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/github/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DeliveryConfig, DeliveryRole } from '../config/deliveryConfig.js';
|
|
2
|
+
export interface CommandIdentityPolicyEvaluation {
|
|
3
|
+
error: null | string;
|
|
4
|
+
normalizedCommandName: string;
|
|
5
|
+
requiredRole: DeliveryRole | null;
|
|
6
|
+
requiresExplicitIdentity: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function evaluateCommandIdentityPolicy(input: {
|
|
9
|
+
commandName: string;
|
|
10
|
+
deliveryConfig: DeliveryConfig;
|
|
11
|
+
identity: null | string;
|
|
12
|
+
personalAuth?: boolean;
|
|
13
|
+
}): CommandIdentityPolicyEvaluation;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const AUTHOR_COMMANDS = new Set([
|
|
2
|
+
'cleanup',
|
|
3
|
+
'close',
|
|
4
|
+
'comment',
|
|
5
|
+
'create',
|
|
6
|
+
'develop',
|
|
7
|
+
'finish',
|
|
8
|
+
'start',
|
|
9
|
+
'update',
|
|
10
|
+
'pr:create',
|
|
11
|
+
'pr:merge',
|
|
12
|
+
'worktree',
|
|
13
|
+
'worktree:create',
|
|
14
|
+
'worktrees:cleanup',
|
|
15
|
+
'pr:checkout',
|
|
16
|
+
]);
|
|
17
|
+
const REVIEWER_COMMANDS = new Set(['pr:review']);
|
|
18
|
+
export function evaluateCommandIdentityPolicy(input) {
|
|
19
|
+
const normalizedCommandName = input.commandName.trim().toLowerCase();
|
|
20
|
+
const requiredRole = REVIEWER_COMMANDS.has(normalizedCommandName)
|
|
21
|
+
? 'reviewer'
|
|
22
|
+
: AUTHOR_COMMANDS.has(normalizedCommandName)
|
|
23
|
+
? 'author'
|
|
24
|
+
: null;
|
|
25
|
+
if (requiredRole === null) {
|
|
26
|
+
return { error: null, normalizedCommandName, requiredRole, requiresExplicitIdentity: false };
|
|
27
|
+
}
|
|
28
|
+
const identity = input.identity?.trim().toLowerCase() ?? '';
|
|
29
|
+
let error = null;
|
|
30
|
+
if (!identity) {
|
|
31
|
+
error = `Command "${normalizedCommandName}" requires an explicit ${requiredRole} identity.`;
|
|
32
|
+
}
|
|
33
|
+
else if (identity === 'personal') {
|
|
34
|
+
if (requiredRole !== 'author' || input.personalAuth !== true) {
|
|
35
|
+
error = `Command "${normalizedCommandName}" requires a configured GitHub App role; personal-token fallback requires explicit author opt-in.`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (input.personalAuth === true) {
|
|
39
|
+
error = 'Personal-token opt-in requires the explicit personal identity.';
|
|
40
|
+
}
|
|
41
|
+
else if (identity !== input.deliveryConfig.roles[requiredRole].identity.toLowerCase()) {
|
|
42
|
+
error = `Command "${normalizedCommandName}" requires configured ${requiredRole} identity "${input.deliveryConfig.roles[requiredRole].identity}".`;
|
|
43
|
+
}
|
|
44
|
+
return { error, normalizedCommandName, requiredRole, requiresExplicitIdentity: true };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=commandIdentityPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandIdentityPolicy.js","sourceRoot":"","sources":["../../src/github/commandIdentityPolicy.ts"],"names":[],"mappings":"AASA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,SAAS;IACT,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,WAAW;IACX,UAAU;IACV,UAAU;IACV,iBAAiB;IACjB,mBAAmB;IACnB,aAAa;CACd,CAAC,CAAC;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAEjD,MAAM,UAAU,6BAA6B,CAAC,KAK7C;IACC,MAAM,qBAAqB,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrE,MAAM,YAAY,GAAwB,iBAAiB,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACpF,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,qBAAqB,CAAC;YAC1C,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC;IACX,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,YAAY,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC;IAC/F,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,KAAK,GAAG,YAAY,qBAAqB,0BAA0B,YAAY,YAAY,CAAC;IAC9F,CAAC;SAAM,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,IAAI,YAAY,KAAK,QAAQ,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YAC7D,KAAK,GAAG,YAAY,qBAAqB,mGAAmG,CAAC;QAC/I,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QACvC,KAAK,GAAG,gEAAgE,CAAC;IAC3E,CAAC;SAAM,IAAI,QAAQ,KAAK,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QACxF,KAAK,GAAG,YAAY,qBAAqB,yBAAyB,YAAY,cAAc,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,IAAI,CAAC;IACpJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { DeliveryConfig } from '../config/deliveryConfig.js';
|
|
2
|
+
export declare const NATIVE_ISSUE_API_VERSION = "2026-03-10";
|
|
3
|
+
export interface ConfiguredNativeIssueMetadata {
|
|
4
|
+
points?: number;
|
|
5
|
+
priority?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface NativeIssueFieldCatalog {
|
|
8
|
+
points: NativeIssueFieldReference;
|
|
9
|
+
priority: NativeIssueFieldReference;
|
|
10
|
+
}
|
|
11
|
+
export interface NativeIssueFieldReference {
|
|
12
|
+
dataType: 'single_select';
|
|
13
|
+
id: number;
|
|
14
|
+
name: string;
|
|
15
|
+
}
|
|
16
|
+
export interface NativeIssueSettings {
|
|
17
|
+
points: {
|
|
18
|
+
databaseId: string;
|
|
19
|
+
name: string;
|
|
20
|
+
values: readonly number[];
|
|
21
|
+
};
|
|
22
|
+
priority: {
|
|
23
|
+
databaseId: string;
|
|
24
|
+
name: string;
|
|
25
|
+
values: readonly string[];
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface NativeIssueMetadataRest {
|
|
29
|
+
request: (route: string, parameters: Record<string, unknown>) => Promise<{
|
|
30
|
+
data: unknown;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
export type NativePointValue = number;
|
|
34
|
+
export type NativePriorityValue = string;
|
|
35
|
+
export declare function nativeIssueSettingsFromDeliveryConfig(config: DeliveryConfig): NativeIssueSettings;
|
|
36
|
+
export declare function validateConfiguredNativeTracking(input: {
|
|
37
|
+
blockedBy?: readonly number[];
|
|
38
|
+
config: DeliveryConfig;
|
|
39
|
+
issueNumber?: number;
|
|
40
|
+
issueType: string;
|
|
41
|
+
milestone?: number;
|
|
42
|
+
parentIssueNumber?: number;
|
|
43
|
+
points: number;
|
|
44
|
+
priority: string;
|
|
45
|
+
}): void;
|
|
46
|
+
export declare function clearConfiguredNativeIssuePoints(input: {
|
|
47
|
+
catalog?: NativeIssueFieldCatalog;
|
|
48
|
+
issueNumber: number;
|
|
49
|
+
org: string;
|
|
50
|
+
owner: string;
|
|
51
|
+
repo: string;
|
|
52
|
+
rest: NativeIssueMetadataRest;
|
|
53
|
+
settings: NativeIssueSettings;
|
|
54
|
+
}): Promise<void>;
|
|
55
|
+
export declare function getConfiguredNativeIssueFieldCatalog(input: {
|
|
56
|
+
org: string;
|
|
57
|
+
rest: NativeIssueMetadataRest;
|
|
58
|
+
settings: NativeIssueSettings;
|
|
59
|
+
}): Promise<NativeIssueFieldCatalog>;
|
|
60
|
+
export declare function getConfiguredNativeIssueMetadata(input: {
|
|
61
|
+
issueNumber: number;
|
|
62
|
+
owner: string;
|
|
63
|
+
repo: string;
|
|
64
|
+
rest: NativeIssueMetadataRest;
|
|
65
|
+
settings: NativeIssueSettings;
|
|
66
|
+
}): Promise<ConfiguredNativeIssueMetadata>;
|
|
67
|
+
export declare function parseConfiguredNativeIssueMetadata(raw: unknown, settings: NativeIssueSettings): ConfiguredNativeIssueMetadata;
|
|
68
|
+
export declare function resolveNativeIssueFieldCatalog(raw: unknown, settings: NativeIssueSettings): NativeIssueFieldCatalog;
|
|
69
|
+
export declare function setConfiguredNativeIssueMetadata(input: {
|
|
70
|
+
catalog?: NativeIssueFieldCatalog;
|
|
71
|
+
issueNumber: number;
|
|
72
|
+
metadata: ConfiguredNativeIssueMetadata;
|
|
73
|
+
org: string;
|
|
74
|
+
owner: string;
|
|
75
|
+
repo: string;
|
|
76
|
+
rest: NativeIssueMetadataRest;
|
|
77
|
+
settings: NativeIssueSettings;
|
|
78
|
+
}): Promise<ConfiguredNativeIssueMetadata>;
|