@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.
Files changed (140) hide show
  1. package/CONTRIBUTING.md +47 -0
  2. package/LICENSE +21 -0
  3. package/README.md +84 -0
  4. package/dist/agent.d.ts +17 -0
  5. package/dist/agent.js +16 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +314 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/cliResult.d.ts +2 -0
  11. package/dist/cliResult.js +12 -0
  12. package/dist/cliResult.js.map +1 -0
  13. package/dist/cliResult.test.d.ts +1 -0
  14. package/dist/cliResult.test.js +30 -0
  15. package/dist/cliResult.test.js.map +1 -0
  16. package/dist/config/deliveryConfig.d.ts +113 -0
  17. package/dist/config/deliveryConfig.js +261 -0
  18. package/dist/config/deliveryConfig.js.map +1 -0
  19. package/dist/config/deliveryConfig.test.d.ts +1 -0
  20. package/dist/config/deliveryConfig.test.js +355 -0
  21. package/dist/config/deliveryConfig.test.js.map +1 -0
  22. package/dist/delivery/common.d.ts +28 -0
  23. package/dist/delivery/common.js +117 -0
  24. package/dist/delivery/common.js.map +1 -0
  25. package/dist/delivery/delivery.test.d.ts +1 -0
  26. package/dist/delivery/delivery.test.js +234 -0
  27. package/dist/delivery/delivery.test.js.map +1 -0
  28. package/dist/delivery/evidence.d.ts +92 -0
  29. package/dist/delivery/evidence.js +126 -0
  30. package/dist/delivery/evidence.js.map +1 -0
  31. package/dist/delivery/index.d.ts +8 -0
  32. package/dist/delivery/index.js +5 -0
  33. package/dist/delivery/index.js.map +1 -0
  34. package/dist/delivery/policy.d.ts +237 -0
  35. package/dist/delivery/policy.js +246 -0
  36. package/dist/delivery/policy.js.map +1 -0
  37. package/dist/delivery/stage.d.ts +125 -0
  38. package/dist/delivery/stage.js +218 -0
  39. package/dist/delivery/stage.js.map +1 -0
  40. package/dist/dispatch.d.ts +15 -0
  41. package/dist/dispatch.js +397 -0
  42. package/dist/dispatch.js.map +1 -0
  43. package/dist/errors.d.ts +4 -0
  44. package/dist/errors.js +9 -0
  45. package/dist/errors.js.map +1 -0
  46. package/dist/genericCompatibility.test.d.ts +1 -0
  47. package/dist/genericCompatibility.test.js +92 -0
  48. package/dist/genericCompatibility.test.js.map +1 -0
  49. package/dist/git.d.ts +13 -0
  50. package/dist/git.js +65 -0
  51. package/dist/git.js.map +1 -0
  52. package/dist/github/client.d.ts +34 -0
  53. package/dist/github/client.js +143 -0
  54. package/dist/github/client.js.map +1 -0
  55. package/dist/github/commandIdentityPolicy.d.ts +13 -0
  56. package/dist/github/commandIdentityPolicy.js +46 -0
  57. package/dist/github/commandIdentityPolicy.js.map +1 -0
  58. package/dist/github/nativeIssueMetadata.d.ts +78 -0
  59. package/dist/github/nativeIssueMetadata.js +249 -0
  60. package/dist/github/nativeIssueMetadata.js.map +1 -0
  61. package/dist/github/projectDelivery.d.ts +68 -0
  62. package/dist/github/projectDelivery.js +540 -0
  63. package/dist/github/projectDelivery.js.map +1 -0
  64. package/dist/github/relationships.d.ts +69 -0
  65. package/dist/github/relationships.js +395 -0
  66. package/dist/github/relationships.js.map +1 -0
  67. package/dist/github/repo.d.ts +8 -0
  68. package/dist/github/repo.js +34 -0
  69. package/dist/github/repo.js.map +1 -0
  70. package/dist/index.d.ts +2 -0
  71. package/dist/index.js +3 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/issue.d.ts +86 -0
  74. package/dist/issue.js +347 -0
  75. package/dist/issue.js.map +1 -0
  76. package/dist/lifecycle.test.d.ts +1 -0
  77. package/dist/lifecycle.test.js +1118 -0
  78. package/dist/lifecycle.test.js.map +1 -0
  79. package/dist/logger.d.ts +21 -0
  80. package/dist/logger.js +86 -0
  81. package/dist/logger.js.map +1 -0
  82. package/dist/mcp/index.d.ts +5 -0
  83. package/dist/mcp/index.js +46 -0
  84. package/dist/mcp/index.js.map +1 -0
  85. package/dist/mcp/tools.d.ts +162 -0
  86. package/dist/mcp/tools.js +154 -0
  87. package/dist/mcp/tools.js.map +1 -0
  88. package/dist/pr.d.ts +146 -0
  89. package/dist/pr.js +972 -0
  90. package/dist/pr.js.map +1 -0
  91. package/dist/pr.test.d.ts +1 -0
  92. package/dist/pr.test.js +252 -0
  93. package/dist/pr.test.js.map +1 -0
  94. package/dist/review.d.ts +104 -0
  95. package/dist/review.js +228 -0
  96. package/dist/review.js.map +1 -0
  97. package/dist/review.test.d.ts +1 -0
  98. package/dist/review.test.js +327 -0
  99. package/dist/review.test.js.map +1 -0
  100. package/dist/services/agentReadinessService.d.ts +17 -0
  101. package/dist/services/agentReadinessService.js +225 -0
  102. package/dist/services/agentReadinessService.js.map +1 -0
  103. package/dist/services/deliveryAdmission.d.ts +33 -0
  104. package/dist/services/deliveryAdmission.js +122 -0
  105. package/dist/services/deliveryAdmission.js.map +1 -0
  106. package/dist/services/deliveryRecordService.d.ts +47 -0
  107. package/dist/services/deliveryRecordService.js +199 -0
  108. package/dist/services/deliveryRecordService.js.map +1 -0
  109. package/dist/services/legacyIssueMigration.d.ts +46 -0
  110. package/dist/services/legacyIssueMigration.js +313 -0
  111. package/dist/services/legacyIssueMigration.js.map +1 -0
  112. package/dist/services/worktreeRegistry.d.ts +67 -0
  113. package/dist/services/worktreeRegistry.js +545 -0
  114. package/dist/services/worktreeRegistry.js.map +1 -0
  115. package/dist/terminalMessages.d.ts +13 -0
  116. package/dist/terminalMessages.js +43 -0
  117. package/dist/terminalMessages.js.map +1 -0
  118. package/dist/utils/atomicJson.d.ts +6 -0
  119. package/dist/utils/atomicJson.js +78 -0
  120. package/dist/utils/atomicJson.js.map +1 -0
  121. package/dist/utils/filesystem.d.ts +9 -0
  122. package/dist/utils/filesystem.js +19 -0
  123. package/dist/utils/filesystem.js.map +1 -0
  124. package/dist/utils/lockfile.d.ts +12 -0
  125. package/dist/utils/lockfile.js +78 -0
  126. package/dist/utils/lockfile.js.map +1 -0
  127. package/dist/verification.d.ts +24 -0
  128. package/dist/verification.js +227 -0
  129. package/dist/verification.js.map +1 -0
  130. package/dist/worktree.d.ts +44 -0
  131. package/dist/worktree.js +255 -0
  132. package/dist/worktree.js.map +1 -0
  133. package/package.json +82 -0
  134. package/plugins/ai-delivery/.claude-plugin/plugin.json +6 -0
  135. package/plugins/ai-delivery/.mcp.json +8 -0
  136. package/plugins/ai-delivery/README.md +5 -0
  137. package/plugins/ai-delivery/dist/mcp-launcher.js +22 -0
  138. package/plugins/ai-delivery/skills/intake-create/SKILL.md +26 -0
  139. package/plugins/ai-delivery/skills/pr-handoff/SKILL.md +28 -0
  140. package/plugins/ai-delivery/skills/worktree-lifecycle/SKILL.md +24 -0
@@ -0,0 +1,78 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { closeSync, existsSync, fsyncSync, mkdirSync, openSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ /** Create a private directory hierarchy and durably publish every new directory entry. */
5
+ export function ensurePrivateDirectoryDurably(path) {
6
+ ensureDirectoryDurably(path, 0o700);
7
+ }
8
+ /** Publish a complete JSON file with a same-directory durable rename. */
9
+ export function writeJsonFileAtomically(path, value) {
10
+ writeJsonAtomically({ directoryMode: 0o777, mode: 0o666, path, value });
11
+ }
12
+ /** Publish private JSON evidence with the same durable rename contract. */
13
+ export function writePrivateJsonFileAtomically(path, value) {
14
+ writeJsonAtomically({ directoryMode: 0o700, mode: 0o600, path, value });
15
+ }
16
+ function ensureDirectoryDurably(directory, mode) {
17
+ const missing = [];
18
+ let candidate = directory;
19
+ while (!existsSync(candidate)) {
20
+ missing.push(candidate);
21
+ const parent = dirname(candidate);
22
+ if (parent === candidate)
23
+ break;
24
+ candidate = parent;
25
+ }
26
+ for (const path of missing.reverse()) {
27
+ mkdirSync(path, { mode });
28
+ fsyncDirectory(dirname(path));
29
+ }
30
+ }
31
+ function fsyncDirectory(directory) {
32
+ const descriptor = openSync(directory, 'r');
33
+ try {
34
+ fsyncSync(descriptor);
35
+ }
36
+ finally {
37
+ closeSync(descriptor);
38
+ }
39
+ }
40
+ function writeJsonAtomically({ directoryMode, mode, path, value, }) {
41
+ const directory = dirname(path);
42
+ ensureDirectoryDurably(directory, directoryMode);
43
+ const temporaryPath = join(directory, `.${String(process.pid)}.${randomUUID()}.tmp`);
44
+ let creationDescriptor;
45
+ let fileDescriptor;
46
+ let directoryDescriptor;
47
+ try {
48
+ creationDescriptor = openSync(temporaryPath, 'wx', mode);
49
+ closeSync(creationDescriptor);
50
+ creationDescriptor = undefined;
51
+ writeFileSync(temporaryPath, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
52
+ fileDescriptor = openSync(temporaryPath, 'r');
53
+ fsyncSync(fileDescriptor);
54
+ closeSync(fileDescriptor);
55
+ fileDescriptor = undefined;
56
+ renameSync(temporaryPath, path);
57
+ directoryDescriptor = openSync(directory, 'r');
58
+ fsyncSync(directoryDescriptor);
59
+ closeSync(directoryDescriptor);
60
+ directoryDescriptor = undefined;
61
+ }
62
+ catch (error) {
63
+ if (creationDescriptor !== undefined)
64
+ closeSync(creationDescriptor);
65
+ if (fileDescriptor !== undefined)
66
+ closeSync(fileDescriptor);
67
+ if (directoryDescriptor !== undefined)
68
+ closeSync(directoryDescriptor);
69
+ try {
70
+ unlinkSync(temporaryPath);
71
+ }
72
+ catch {
73
+ // The temporary file was never created or has already been renamed.
74
+ }
75
+ throw error;
76
+ }
77
+ }
78
+ //# sourceMappingURL=atomicJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicJson.js","sourceRoot":"","sources":["../../src/utils/atomicJson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const ISSUE_CLI_DATA_DIR = ".issue-cli";
2
+ /**
3
+ * Ensure the `.issue-cli` runtime directory exists.
4
+ * All agent runtime data (worktrees, metrics, audit logs) lives here.
5
+ *
6
+ * @param projectRoot - Project root directory (defaults to cwd)
7
+ * @returns Absolute path to the data directory
8
+ */
9
+ export declare function ensureDataDirectory(projectRoot?: string): string;
@@ -0,0 +1,19 @@
1
+ import { existsSync, mkdirSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ export const ISSUE_CLI_DATA_DIR = '.issue-cli';
4
+ /**
5
+ * Ensure the `.issue-cli` runtime directory exists.
6
+ * All agent runtime data (worktrees, metrics, audit logs) lives here.
7
+ *
8
+ * @param projectRoot - Project root directory (defaults to cwd)
9
+ * @returns Absolute path to the data directory
10
+ */
11
+ export function ensureDataDirectory(projectRoot) {
12
+ const root = projectRoot ?? process.cwd();
13
+ const dataDir = resolve(root, ISSUE_CLI_DATA_DIR);
14
+ if (!existsSync(dataDir)) {
15
+ mkdirSync(dataDir, { recursive: true });
16
+ }
17
+ return dataDir;
18
+ }
19
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAoB;IACtD,MAAM,IAAI,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAElD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,12 @@
1
+ interface WithLockOptions<T> {
2
+ onTimeout?: () => void;
3
+ operation: () => Promise<T> | T;
4
+ projectRoot?: string;
5
+ timeout?: number;
6
+ }
7
+ /**
8
+ * Execute a function with exclusive file lock
9
+ * Prevents concurrent modifications to the worktree registry
10
+ */
11
+ export declare function withLock<T>(filePath: string, { onTimeout, operation, projectRoot, timeout }: WithLockOptions<T>): Promise<T>;
12
+ export {};
@@ -0,0 +1,78 @@
1
+ import { resolve } from 'node:path';
2
+ import * as lockfile from 'proper-lockfile';
3
+ import { logDebug, logWarn } from '../logger.js';
4
+ const LOCK_OPTIONS = {
5
+ realpath: false,
6
+ retries: 0,
7
+ stale: 10000, // 10 seconds - auto-release stale locks
8
+ };
9
+ const LOCK_RETRY_DELAY_MS = 200;
10
+ /**
11
+ * Execute a function with exclusive file lock
12
+ * Prevents concurrent modifications to the worktree registry
13
+ */
14
+ export async function withLock(filePath, { onTimeout, operation, projectRoot, timeout }) {
15
+ const root = projectRoot ?? process.cwd();
16
+ const lockPath = resolve(root, filePath);
17
+ let release = null;
18
+ const timeoutInterval = typeof timeout === 'number' && timeout > 0 ? timeout : null;
19
+ const maxAttempts = timeoutInterval !== null ? Math.ceil(timeoutInterval / LOCK_RETRY_DELAY_MS) : null;
20
+ let attempts = 0;
21
+ let nextTimeoutAt = timeoutInterval === null ? null : Date.now() + timeoutInterval;
22
+ let warned = false;
23
+ try {
24
+ for (;;) {
25
+ // Enforce hard timeout by breaking after max attempts
26
+ if (maxAttempts !== null && attempts >= maxAttempts) {
27
+ const timeoutLabel = timeoutInterval === null ? 'unknown' : String(timeoutInterval);
28
+ throw new Error(`Lock acquisition timeout after ${timeoutLabel}ms on ${lockPath}. Another process may be holding the lock.`);
29
+ }
30
+ attempts += 1;
31
+ const attemptLabel = maxAttempts !== null ? `${String(attempts)}/${String(maxAttempts)}` : String(attempts);
32
+ logDebug(`Acquiring lock on ${lockPath}... (attempt ${attemptLabel})`);
33
+ try {
34
+ release = await lockfile.lock(lockPath, LOCK_OPTIONS);
35
+ logDebug(`Lock acquired on ${lockPath}`);
36
+ break;
37
+ }
38
+ catch (error) {
39
+ if (!isLockError(error)) {
40
+ throw error;
41
+ }
42
+ if (!warned) {
43
+ logWarn(`Unable to acquire lock on ${lockPath} - another agent is modifying it. Retrying...`);
44
+ warned = true;
45
+ }
46
+ if (nextTimeoutAt !== null && timeoutInterval !== null && Date.now() >= nextTimeoutAt) {
47
+ onTimeout?.();
48
+ nextTimeoutAt = Date.now() + timeoutInterval;
49
+ }
50
+ await delay(LOCK_RETRY_DELAY_MS);
51
+ }
52
+ }
53
+ return await operation();
54
+ }
55
+ finally {
56
+ if (release !== null) {
57
+ try {
58
+ await release();
59
+ logDebug(`Lock released on ${lockPath}`);
60
+ }
61
+ catch (error) {
62
+ // Lock release failure is non-fatal - stale lock will auto-expire
63
+ logDebug(`Failed to release lock on ${lockPath}: ${error instanceof Error ? error.message : String(error)}`);
64
+ }
65
+ }
66
+ }
67
+ }
68
+ function delay(ms) {
69
+ return new Promise((resolve) => setTimeout(resolve, ms));
70
+ }
71
+ function isLockError(error) {
72
+ if (typeof error !== 'object' || error === null) {
73
+ return false;
74
+ }
75
+ const code = error.code;
76
+ return code === 'ELOCKED';
77
+ }
78
+ //# sourceMappingURL=lockfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/utils/lockfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,YAAY,GAAG;IACnB,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,KAAK,EAAE,wCAAwC;CACvD,CAAC;AAEF,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAShC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAsB;IAElE,MAAM,IAAI,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEzC,IAAI,OAAO,GAAiC,IAAI,CAAC;IACjD,MAAM,eAAe,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,MAAM,WAAW,GAAG,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvG,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,aAAa,GAAG,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;IACnF,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,IAAI,CAAC;QACH,SAAS,CAAC;YACR,sDAAsD;YACtD,IAAI,WAAW,KAAK,IAAI,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;gBACpD,MAAM,YAAY,GAAG,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBACpF,MAAM,IAAI,KAAK,CACb,kCAAkC,YAAY,SAAS,QAAQ,4CAA4C,CAC5G,CAAC;YACJ,CAAC;YAED,QAAQ,IAAI,CAAC,CAAC;YACd,MAAM,YAAY,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5G,QAAQ,CAAC,qBAAqB,QAAQ,gBAAgB,YAAY,GAAG,CAAC,CAAC;YAEvE,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;gBACtD,QAAQ,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;gBACzC,MAAM;YACR,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;oBACxB,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,CAAC,6BAA6B,QAAQ,+CAA+C,CAAC,CAAC;oBAC9F,MAAM,GAAG,IAAI,CAAC;gBAChB,CAAC;gBAED,IAAI,aAAa,KAAK,IAAI,IAAI,eAAe,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,aAAa,EAAE,CAAC;oBACtF,SAAS,EAAE,EAAE,CAAC;oBACd,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;gBAC/C,CAAC;gBAED,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,OAAO,EAAE,CAAC;gBAChB,QAAQ,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,kEAAkE;gBAClE,QAAQ,CAAC,6BAA6B,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/G,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,OAAO,IAAI,KAAK,SAAS,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type RepositoryApprovalBinding, type RepositoryClassificationReceipt, type RepositoryDeliveryEvidence, type RepositoryMergeReadback, type RepositoryStageAggregate, type RepositoryStageReceipt } from './delivery/index.js';
2
+ export interface VerificationRun {
3
+ aggregate: RepositoryStageAggregate;
4
+ classification: RepositoryClassificationReceipt;
5
+ completedAt: string;
6
+ manifestId: string;
7
+ schemaVersion: 'ai-delivery.run@1';
8
+ stageReceipts: RepositoryStageReceipt[];
9
+ }
10
+ export declare function verifyIssue(input: {
11
+ admittedResourceClasses?: readonly string[];
12
+ issueNumber: number;
13
+ repoRoot: string;
14
+ }): Promise<VerificationRun>;
15
+ export declare function createIssuePhaseEvidence(input: {
16
+ approval?: RepositoryApprovalBinding;
17
+ issueNumber: number;
18
+ mergeReadback?: RepositoryMergeReadback;
19
+ phase: 'verify' | 'publish' | 'merge';
20
+ repoRoot: string;
21
+ }): Promise<RepositoryDeliveryEvidence>;
22
+ export declare function loadVerifiedRun(repoRoot: string, issueNumber: number): VerificationRun;
23
+ /** Recover an exact merged run after worktree removal interrupted terminal recording. */
24
+ export declare function loadRemovedMergedRun(primaryRepoRoot: string, issueNumber: number): VerificationRun;
@@ -0,0 +1,227 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ import { basename, dirname, join } from 'node:path';
4
+ import { loadDeliveryConfig } from './config/deliveryConfig.js';
5
+ import { classifyRepositoryExactRange, createRepositoryDeliveryEvidence, createRepositoryStageAggregate, createRepositoryStageInput, createRepositoryStageReceipt, digestValue, loadRepositoryStageCheckpoint, loadSelectedRepositoryPolicy, RepositoryClassificationReceiptSchema, RepositoryStageAggregateSchema, RepositoryStageReceiptSchema, writeRepositoryCommandOutput, writeRepositoryDeliveryEvidence, writeRepositoryStageAggregate, writeRepositoryStageCheckpoint, } from './delivery/index.js';
6
+ import { DeliveryError } from './errors.js';
7
+ import { assertClean, changedPaths, coordinate, defaultBaseRef, git, gitCommonDir, gitRoot } from './git.js';
8
+ import { getIssueWorktreeStrict } from './services/worktreeRegistry.js';
9
+ import { writePrivateJsonFileAtomically } from './utils/atomicJson.js';
10
+ function primaryRoot(worktreeRoot) {
11
+ const common = gitCommonDir(worktreeRoot);
12
+ if (basename(common) !== '.git')
13
+ throw new DeliveryError('Expected a conventional non-bare Git repository.');
14
+ return dirname(common);
15
+ }
16
+ function assertRegisteredIssue(worktreeRoot, issueNumber, allowMerged = false) {
17
+ const row = getIssueWorktreeStrict(issueNumber, primaryRoot(worktreeRoot));
18
+ if (row.path !== worktreeRoot ||
19
+ row.branch !== `issue/${issueNumber}` ||
20
+ (row.status !== 'active' && row.status !== 'pr-published' && !(allowMerged && row.status === 'merged'))) {
21
+ throw new DeliveryError('Verification requires the exact registered issue worktree.');
22
+ }
23
+ assertClean(worktreeRoot);
24
+ }
25
+ function manifestPath(common, headSha) {
26
+ return join(common, 'ai-delivery', 'runs', `${headSha}.json`);
27
+ }
28
+ function parseRun(value) {
29
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
30
+ throw new DeliveryError('Invalid run manifest.');
31
+ const input = value;
32
+ const classification = RepositoryClassificationReceiptSchema.parse(input.classification);
33
+ const aggregate = RepositoryStageAggregateSchema.parse(input.aggregate);
34
+ const stageReceipts = RepositoryStageReceiptSchema.array().parse(input.stageReceipts);
35
+ const content = {
36
+ aggregate,
37
+ classification,
38
+ completedAt: input.completedAt,
39
+ schemaVersion: input.schemaVersion,
40
+ stageReceipts,
41
+ };
42
+ if (input.schemaVersion !== 'ai-delivery.run@1' ||
43
+ typeof input.completedAt !== 'string' ||
44
+ input.manifestId !== digestValue(content))
45
+ throw new DeliveryError('Run manifest identity is invalid.');
46
+ return { ...content, completedAt: input.completedAt, manifestId: input.manifestId };
47
+ }
48
+ function loadRun(common, headSha) {
49
+ let raw;
50
+ try {
51
+ raw = JSON.parse(readFileSync(manifestPath(common, headSha), 'utf8'));
52
+ }
53
+ catch {
54
+ throw new DeliveryError('Exact-head verification run is missing or corrupt.');
55
+ }
56
+ return parseRun(raw);
57
+ }
58
+ function stageEnvironmentDigest() {
59
+ return digestValue({
60
+ arch: process.arch,
61
+ node: process.version,
62
+ path: process.env.PATH ?? '',
63
+ platform: process.platform,
64
+ });
65
+ }
66
+ function runStageCommand(repoRoot, argv) {
67
+ const [executable, ...args] = argv;
68
+ if (!executable)
69
+ throw new DeliveryError('Policy selected an empty stage command.');
70
+ const result = spawnSync(executable, args, {
71
+ cwd: repoRoot,
72
+ encoding: 'buffer',
73
+ maxBuffer: 8 * 1024 * 1024,
74
+ timeout: 600_000,
75
+ stdio: ['ignore', 'pipe', 'pipe'],
76
+ });
77
+ const output = Buffer.concat([Buffer.from(result.stdout ?? ''), Buffer.from(result.stderr ?? '')]);
78
+ if (result.error || result.status !== 0 || output.length > 8 * 1024 * 1024) {
79
+ const reason = result.error?.message ?? `exit ${String(result.status)}`;
80
+ throw new DeliveryError(`Selected policy stage command failed (${reason}).`);
81
+ }
82
+ return output;
83
+ }
84
+ export async function verifyIssue(input) {
85
+ const root = gitRoot(input.repoRoot);
86
+ assertRegisteredIssue(root, input.issueNumber);
87
+ const common = gitCommonDir(root);
88
+ const loaded = loadDeliveryConfig(root);
89
+ const selected = await loadSelectedRepositoryPolicy({
90
+ repoRoot: root,
91
+ policySourcePath: loaded.config.policy.module,
92
+ });
93
+ const base = coordinate(root, defaultBaseRef(root));
94
+ const head = coordinate(root);
95
+ const classification = classifyRepositoryExactRange({
96
+ base,
97
+ changedPaths: changedPaths(root, base.sha, head.sha),
98
+ configDigest: loaded.configDigest,
99
+ head,
100
+ policy: selected.policy,
101
+ policySourcePath: loaded.config.policy.module,
102
+ repoRoot: root,
103
+ repository: loaded.config.repository,
104
+ });
105
+ const receipts = [];
106
+ const admitted = new Set(input.admittedResourceClasses ?? ['source_only']);
107
+ const environmentDigest = stageEnvironmentDigest();
108
+ for (const stage of classification.requiredStages) {
109
+ if (!admitted.has(stage.resourceClass)) {
110
+ throw new DeliveryError(`Stage '${stage.id}' requires explicit ${stage.resourceClass} admission.`);
111
+ }
112
+ const stageInput = createRepositoryStageInput({
113
+ classification,
114
+ environmentDigest,
115
+ semanticInputs: stage.semanticInputKeys.map((key) => ({
116
+ digest: digestValue({ key, evidenceId: classification.policyEvidence.evidenceId }),
117
+ key,
118
+ })),
119
+ stageId: stage.id,
120
+ upstream: stage.dependsOn.map((stageId) => {
121
+ const receipt = receipts.find((value) => value.input.stageId === stageId);
122
+ if (!receipt)
123
+ throw new DeliveryError(`Missing upstream stage '${stageId}'.`);
124
+ return { receiptId: receipt.receiptId, stageId };
125
+ }),
126
+ });
127
+ const cached = loadRepositoryStageCheckpoint({
128
+ classification,
129
+ configDigest: loaded.configDigest,
130
+ gitCommonDir: common,
131
+ policySourcePath: loaded.config.policy.module,
132
+ repoRoot: root,
133
+ stageInput,
134
+ });
135
+ if (cached) {
136
+ receipts.push(cached);
137
+ continue;
138
+ }
139
+ const startedAt = new Date().toISOString();
140
+ const commands = stage.commands.map((command) => ({
141
+ exitCode: 0,
142
+ label: command.label,
143
+ outputDigest: writeRepositoryCommandOutput({ bytes: runStageCommand(root, command.argv), gitCommonDir: common }),
144
+ }));
145
+ const artifacts = stage.attestationKey === undefined
146
+ ? []
147
+ : classification.policyEvidence.artifacts
148
+ .filter((artifact) => artifact.path === stage.attestationKey)
149
+ .map((artifact) => ({ digest: artifact.digest, path: artifact.path }));
150
+ if (stage.attestationKey !== undefined && artifacts.length === 0) {
151
+ throw new DeliveryError(`Selected attestation '${stage.attestationKey}' lacks a bound artifact.`);
152
+ }
153
+ const receipt = createRepositoryStageReceipt({
154
+ artifacts,
155
+ classification,
156
+ commands,
157
+ completedAt: new Date().toISOString(),
158
+ stageInput,
159
+ startedAt,
160
+ });
161
+ writeRepositoryStageCheckpoint({ gitCommonDir: common, receipt, repoRoot: root });
162
+ receipts.push(receipt);
163
+ }
164
+ const aggregate = createRepositoryStageAggregate({ classification, receipts });
165
+ writeRepositoryStageAggregate({ gitCommonDir: common, aggregate });
166
+ const content = {
167
+ aggregate,
168
+ classification,
169
+ completedAt: new Date().toISOString(),
170
+ schemaVersion: 'ai-delivery.run@1',
171
+ stageReceipts: receipts,
172
+ };
173
+ const run = { ...content, manifestId: digestValue(content) };
174
+ writePrivateJsonFileAtomically(manifestPath(common, head.sha), run);
175
+ return run;
176
+ }
177
+ export async function createIssuePhaseEvidence(input) {
178
+ const root = gitRoot(input.repoRoot);
179
+ assertRegisteredIssue(root, input.issueNumber);
180
+ const loaded = loadDeliveryConfig(root);
181
+ const selected = await loadSelectedRepositoryPolicy({
182
+ repoRoot: root,
183
+ policySourcePath: loaded.config.policy.module,
184
+ });
185
+ const run = loadRun(gitCommonDir(root), coordinate(root).sha);
186
+ const evidence = createRepositoryDeliveryEvidence({
187
+ aggregate: run.aggregate,
188
+ ...(input.approval === undefined ? {} : { approval: input.approval }),
189
+ approvalRoles: {
190
+ authorIdentity: loaded.config.roles.author.identity,
191
+ reviewerIdentity: loaded.config.roles.reviewer.identity,
192
+ },
193
+ classification: run.classification,
194
+ configDigest: loaded.configDigest,
195
+ currentBase: coordinate(root, run.classification.base.sha),
196
+ currentHead: coordinate(root),
197
+ gitCommonDir: gitCommonDir(root),
198
+ ...(input.mergeReadback === undefined ? {} : { mergeReadback: input.mergeReadback }),
199
+ phase: input.phase,
200
+ policy: selected.policy,
201
+ policySourcePath: loaded.config.policy.module,
202
+ repoRoot: root,
203
+ stageReceipts: run.stageReceipts,
204
+ });
205
+ writeRepositoryDeliveryEvidence({ evidence, gitCommonDir: gitCommonDir(root) });
206
+ return evidence;
207
+ }
208
+ export function loadVerifiedRun(repoRoot, issueNumber) {
209
+ const root = gitRoot(repoRoot);
210
+ assertRegisteredIssue(root, issueNumber, true);
211
+ return loadRun(gitCommonDir(root), coordinate(root).sha);
212
+ }
213
+ /** Recover an exact merged run after worktree removal interrupted terminal recording. */
214
+ export function loadRemovedMergedRun(primaryRepoRoot, issueNumber) {
215
+ const root = gitRoot(primaryRepoRoot);
216
+ const row = getIssueWorktreeStrict(issueNumber, root);
217
+ if (row.status !== 'merged' || row.path !== join(root, '.worktrees', `issue-${issueNumber}`)) {
218
+ throw new DeliveryError('Removed-run recovery requires the exact registered merged issue.');
219
+ }
220
+ const headSha = git(root, 'rev-parse', `refs/heads/${row.branch}`);
221
+ const run = loadRun(gitCommonDir(root), headSha);
222
+ if (run.classification.head.sha !== headSha) {
223
+ throw new DeliveryError('Recovered merged run disagrees with the registered branch.');
224
+ }
225
+ return run;
226
+ }
227
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type WorktreeEntry } from './services/worktreeRegistry.js';
2
+ export declare function prepareIssueWorktree(input: {
3
+ baseRef?: string;
4
+ identity: string;
5
+ issueNumber: number;
6
+ repoRoot: string;
7
+ }): Promise<WorktreeEntry>;
8
+ export declare function prepareStandaloneWorktree(input: {
9
+ baseRef?: string;
10
+ branch: string;
11
+ identity: string;
12
+ name: string;
13
+ repoRoot: string;
14
+ }): Promise<WorktreeEntry>;
15
+ /** Register the exact head of an in-repository PR after its selected-App fetch. */
16
+ export declare function preparePrWorktree(input: {
17
+ headSha: string;
18
+ identity: string;
19
+ prNumber: number;
20
+ repoRoot: string;
21
+ }): Promise<WorktreeEntry>;
22
+ /** Remove only a clean registered PR or standalone worktree; issue cleanup remains receipt-bound. */
23
+ export declare function cleanupNonIssueWorktree(input: {
24
+ name?: string;
25
+ prNumber?: number;
26
+ repoRoot: string;
27
+ }): Promise<void>;
28
+ export interface MergeCleanupAttestation {
29
+ baseBranch: string;
30
+ baseSha: string;
31
+ headBranch: string;
32
+ headSha: string;
33
+ mergeSha: string;
34
+ mergeTree: string;
35
+ remoteBaseSha: string;
36
+ remoteHeadSha: string | null;
37
+ strategy: 'merge' | 'squash' | 'rebase';
38
+ }
39
+ export declare function cleanupMergedIssueWorktree(input: {
40
+ issueNumber: number;
41
+ repoRoot: string;
42
+ merge?: MergeCleanupAttestation;
43
+ afterRemoval?: () => Promise<void>;
44
+ }): Promise<void>;