@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,545 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { assertPrivateFile, writeCreateOnly } from '../delivery/common.js';
|
|
4
|
+
import { digestValue } from '../delivery/index.js';
|
|
5
|
+
import { gitCommonDir } from '../git.js';
|
|
6
|
+
import { logInfo, logWarn } from '../logger.js';
|
|
7
|
+
import { ensureDataDirectory, ISSUE_CLI_DATA_DIR } from '../utils/filesystem.js';
|
|
8
|
+
import { writeJsonFileAtomically } from '../utils/atomicJson.js';
|
|
9
|
+
import { withLock } from '../utils/lockfile.js';
|
|
10
|
+
const REGISTRY_PATH = `${ISSUE_CLI_DATA_DIR}/worktrees.json`;
|
|
11
|
+
const LOCK_RETRY_MESSAGE = 'Worktree registry locked by another process. Retrying...';
|
|
12
|
+
function ownerContent(entry) {
|
|
13
|
+
if (!entry.identity)
|
|
14
|
+
throw new Error('ai-delivery worktree ownership requires the preparing identity.');
|
|
15
|
+
return {
|
|
16
|
+
branch: entry.branch,
|
|
17
|
+
identity: entry.identity,
|
|
18
|
+
...(entry.issueNumber === undefined ? {} : { issueNumber: entry.issueNumber }),
|
|
19
|
+
path: entry.path,
|
|
20
|
+
...(entry.prNumber === undefined || entry.type === 'issue' ? {} : { prNumber: entry.prNumber }),
|
|
21
|
+
schemaVersion: 'ai-delivery.worktree-owner@1',
|
|
22
|
+
type: entry.type,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function ownerPath(root, entry) {
|
|
26
|
+
const id = digestValue(ownerContent(entry)).slice('sha256:'.length);
|
|
27
|
+
return join(gitCommonDir(root), 'ai-delivery', 'worktree-owners', `${id}.json`);
|
|
28
|
+
}
|
|
29
|
+
/** An immutable witness separates new rows from legacy rows in the same canonical registry. */
|
|
30
|
+
export function assertAiDeliveryWorktreeOwner(entry, root) {
|
|
31
|
+
const content = ownerContent(entry);
|
|
32
|
+
const path = ownerPath(root, entry);
|
|
33
|
+
let stored;
|
|
34
|
+
try {
|
|
35
|
+
stored = JSON.parse(assertPrivateFile(path).toString('utf8'));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new Error('Worktree lacks its exact ai-delivery ownership witness.');
|
|
39
|
+
}
|
|
40
|
+
if (JSON.stringify(stored) !== JSON.stringify({ ...content, ownerId: digestValue(content) })) {
|
|
41
|
+
throw new Error('Worktree ownership witness disagrees with the canonical registry identity.');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function writeWorktreeOwner(entry, root) {
|
|
45
|
+
const content = ownerContent(entry);
|
|
46
|
+
writeCreateOnly(ownerPath(root, entry), Buffer.from(JSON.stringify({ ...content, ownerId: digestValue(content) })));
|
|
47
|
+
assertAiDeliveryWorktreeOwner(entry, root);
|
|
48
|
+
}
|
|
49
|
+
export async function addWorktreeEntry(entry, projectRoot) {
|
|
50
|
+
const root = projectRoot ?? process.cwd();
|
|
51
|
+
const normalizedEntry = {
|
|
52
|
+
...entry,
|
|
53
|
+
status: entry.status,
|
|
54
|
+
updatedAt: entry.updatedAt,
|
|
55
|
+
};
|
|
56
|
+
ensureRegistryDirectory(root);
|
|
57
|
+
await withLock(REGISTRY_PATH, {
|
|
58
|
+
onTimeout: () => {
|
|
59
|
+
logWarn(LOCK_RETRY_MESSAGE);
|
|
60
|
+
},
|
|
61
|
+
operation: () => {
|
|
62
|
+
const registry = loadRegistryStrict(root);
|
|
63
|
+
const collisions = registry.worktrees.filter((existing) => registryIdentitiesOverlap(existing, normalizedEntry));
|
|
64
|
+
const [existing] = collisions;
|
|
65
|
+
if (collisions.length > 0) {
|
|
66
|
+
if (collisions.length === 1 && existing !== undefined && isIdempotentRegistration(existing, normalizedEntry)) {
|
|
67
|
+
assertAiDeliveryWorktreeOwner(existing, root);
|
|
68
|
+
logInfo(`Worktree already registered: ${normalizedEntry.path}`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (collisions.length === 1 && existing !== undefined && isMergedIssueReactivation(existing, normalizedEntry)) {
|
|
72
|
+
assertAiDeliveryWorktreeOwner(existing, root);
|
|
73
|
+
const existingIndex = registry.worktrees.indexOf(existing);
|
|
74
|
+
registry.worktrees.splice(existingIndex, 1, {
|
|
75
|
+
...normalizedEntry,
|
|
76
|
+
createdAt: existing.createdAt,
|
|
77
|
+
});
|
|
78
|
+
saveRegistryStrict(root, registry);
|
|
79
|
+
logInfo(`Reactivated merged issue worktree: ${normalizedEntry.path}`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
throw new Error(`New worktree entry conflicts with existing canonical registry identity: ${normalizedEntry.path}.`);
|
|
83
|
+
}
|
|
84
|
+
writeWorktreeOwner(normalizedEntry, root);
|
|
85
|
+
registry.worktrees.push(normalizedEntry);
|
|
86
|
+
logInfo(`Added to worktree registry: ${normalizedEntry.path}`);
|
|
87
|
+
saveRegistryStrict(root, registry);
|
|
88
|
+
},
|
|
89
|
+
projectRoot: root,
|
|
90
|
+
timeout: 5000,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/** Resolve the sole canonical issue row for a provider-mutating lifecycle transition. */
|
|
94
|
+
export function getIssueWorktreeStrict(issueNumber, projectRoot) {
|
|
95
|
+
const root = projectRoot ?? process.cwd();
|
|
96
|
+
const registry = loadRegistryStrict(root);
|
|
97
|
+
const matching = registry.worktrees.filter((entry) => entry.type === 'issue' && entry.issueNumber === issueNumber);
|
|
98
|
+
const entry = matching[0];
|
|
99
|
+
if (matching.length !== 1 || entry === undefined) {
|
|
100
|
+
throw new Error(`Expected exactly one canonical registry row for issue #${String(issueNumber)}; found ${String(matching.length)}.`);
|
|
101
|
+
}
|
|
102
|
+
assertAiDeliveryWorktreeOwner(entry, root);
|
|
103
|
+
return entry;
|
|
104
|
+
}
|
|
105
|
+
/** Tracking writes may target an issue without a worktree, but never adopt a foreign active row. */
|
|
106
|
+
export function assertNoForeignIssueWorktree(issueNumber, root) {
|
|
107
|
+
const matches = listWorktreesStrict(root).filter((entry) => entry.type === 'issue' && entry.issueNumber === issueNumber);
|
|
108
|
+
if (matches.length > 1)
|
|
109
|
+
throw new Error(`Issue #${String(issueNumber)} has duplicate worktree owners.`);
|
|
110
|
+
if (matches[0] !== undefined)
|
|
111
|
+
assertAiDeliveryWorktreeOwner(matches[0], root);
|
|
112
|
+
}
|
|
113
|
+
export function getStaleWorktrees(daysOld, projectRoot) {
|
|
114
|
+
const root = projectRoot ?? process.cwd();
|
|
115
|
+
const registry = loadRegistry(root);
|
|
116
|
+
const cutoffDate = new Date();
|
|
117
|
+
cutoffDate.setDate(cutoffDate.getDate() - daysOld);
|
|
118
|
+
return registry.worktrees.filter((entry) => {
|
|
119
|
+
const updatedAt = new Date(entry.updatedAt);
|
|
120
|
+
return updatedAt < cutoffDate || entry.status === 'stale' || entry.status === 'merged';
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
export function getWorktreeByIssue(issueNumber, projectRoot) {
|
|
124
|
+
const root = projectRoot ?? process.cwd();
|
|
125
|
+
const registry = loadRegistry(root);
|
|
126
|
+
return registry.worktrees.find((w) => w.type === 'issue' && w.issueNumber === issueNumber) ?? null;
|
|
127
|
+
}
|
|
128
|
+
export function getWorktreeByPR(prNumber, projectRoot) {
|
|
129
|
+
const root = projectRoot ?? process.cwd();
|
|
130
|
+
const registry = loadRegistry(root);
|
|
131
|
+
return registry.worktrees.find((w) => w.type === 'pr' && w.prNumber === prNumber) ?? null;
|
|
132
|
+
}
|
|
133
|
+
export function listWorktrees(projectRoot) {
|
|
134
|
+
const root = projectRoot ?? process.cwd();
|
|
135
|
+
const registry = loadRegistry(root);
|
|
136
|
+
return registry.worktrees;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Reads the registry for a terminal safety decision. Unlike the operational
|
|
140
|
+
* listing helper, this fails closed if an existing registry cannot be read.
|
|
141
|
+
*/
|
|
142
|
+
export function listWorktreesStrict(projectRoot) {
|
|
143
|
+
const root = projectRoot ?? process.cwd();
|
|
144
|
+
const registry = loadRegistryStrict(root);
|
|
145
|
+
return registry.worktrees;
|
|
146
|
+
}
|
|
147
|
+
export async function markStaleEntries(thresholdMs, projectRoot) {
|
|
148
|
+
const root = projectRoot ?? process.cwd();
|
|
149
|
+
let updated = 0;
|
|
150
|
+
ensureRegistryDirectory(root);
|
|
151
|
+
await withLock(REGISTRY_PATH, {
|
|
152
|
+
onTimeout: () => {
|
|
153
|
+
logWarn(LOCK_RETRY_MESSAGE);
|
|
154
|
+
},
|
|
155
|
+
operation: () => {
|
|
156
|
+
const registry = loadRegistryStrict(root);
|
|
157
|
+
const now = Date.now();
|
|
158
|
+
const newWorktrees = registry.worktrees.map((entry) => {
|
|
159
|
+
const age = now - new Date(entry.updatedAt).getTime();
|
|
160
|
+
if (age >= thresholdMs &&
|
|
161
|
+
entry.type !== 'standalone' &&
|
|
162
|
+
entry.status !== 'stale' &&
|
|
163
|
+
entry.status !== 'merged') {
|
|
164
|
+
assertAiDeliveryWorktreeOwner(entry, root);
|
|
165
|
+
updated += 1;
|
|
166
|
+
return {
|
|
167
|
+
...entry,
|
|
168
|
+
status: 'stale',
|
|
169
|
+
updatedAt: new Date().toISOString(),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return entry;
|
|
173
|
+
});
|
|
174
|
+
if (updated > 0) {
|
|
175
|
+
registry.worktrees = newWorktrees;
|
|
176
|
+
saveRegistryStrict(root, registry);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
projectRoot: root,
|
|
180
|
+
timeout: 5000,
|
|
181
|
+
});
|
|
182
|
+
return updated;
|
|
183
|
+
}
|
|
184
|
+
/** Atomically reconcile one verified terminal PR without changing its original producer identity. */
|
|
185
|
+
export async function reconcileCompletedIssueWorktreeDelivery(options) {
|
|
186
|
+
if (!Number.isSafeInteger(options.prNumber) || options.prNumber <= 0) {
|
|
187
|
+
throw new Error(`Canonical PR number must be a positive integer for issue #${String(options.issueNumber)}.`);
|
|
188
|
+
}
|
|
189
|
+
const root = options.projectRoot ?? process.cwd();
|
|
190
|
+
ensureRegistryDirectory(root);
|
|
191
|
+
return await withLock(REGISTRY_PATH, {
|
|
192
|
+
onTimeout: () => {
|
|
193
|
+
logWarn(LOCK_RETRY_MESSAGE);
|
|
194
|
+
},
|
|
195
|
+
operation: () => {
|
|
196
|
+
const registry = loadRegistryStrict(root);
|
|
197
|
+
const matchingIndex = requireCanonicalIssueIndex({ ...options, registry });
|
|
198
|
+
const entry = registry.worktrees[matchingIndex];
|
|
199
|
+
if (entry === undefined) {
|
|
200
|
+
throw new Error(`Canonical registry row for issue #${String(options.issueNumber)} disappeared during reconciliation.`);
|
|
201
|
+
}
|
|
202
|
+
assertAiDeliveryWorktreeOwner(entry, root);
|
|
203
|
+
if (entry.status === 'merged' && entry.prNumber === options.prNumber) {
|
|
204
|
+
return 'already-reconciled';
|
|
205
|
+
}
|
|
206
|
+
if (!(entry.status === 'active' && entry.prNumber === undefined) &&
|
|
207
|
+
!(entry.status === 'pr-published' && entry.prNumber === options.prNumber)) {
|
|
208
|
+
throw new Error(`Invalid completed-delivery reconciliation for #${String(options.issueNumber)}: ${entry.status}.`);
|
|
209
|
+
}
|
|
210
|
+
registry.worktrees.splice(matchingIndex, 1, {
|
|
211
|
+
...entry,
|
|
212
|
+
prNumber: options.prNumber,
|
|
213
|
+
status: 'merged',
|
|
214
|
+
updatedAt: new Date().toISOString(),
|
|
215
|
+
});
|
|
216
|
+
saveRegistryStrict(root, registry);
|
|
217
|
+
assertIssueDeliveryReadback({
|
|
218
|
+
options: { ...options, status: 'merged' },
|
|
219
|
+
registry: loadRegistryStrict(root),
|
|
220
|
+
});
|
|
221
|
+
return 'reconciled';
|
|
222
|
+
},
|
|
223
|
+
projectRoot: root,
|
|
224
|
+
timeout: 5000,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/** Remove one exact active standalone row without weakening registry parsing or identity checks. */
|
|
228
|
+
export async function removeActiveStandaloneWorktreeEntry(input) {
|
|
229
|
+
const root = input.projectRoot;
|
|
230
|
+
ensureRegistryDirectory(root);
|
|
231
|
+
await withLock(REGISTRY_PATH, {
|
|
232
|
+
onTimeout: () => {
|
|
233
|
+
logWarn(LOCK_RETRY_MESSAGE);
|
|
234
|
+
},
|
|
235
|
+
operation: () => {
|
|
236
|
+
const registry = loadRegistryStrict(root);
|
|
237
|
+
const matchingIndexes = registry.worktrees.flatMap((entry, index) => entry.path === input.path || entry.branch === input.branch ? [index] : []);
|
|
238
|
+
const [matchingIndex] = matchingIndexes;
|
|
239
|
+
const entry = matchingIndex === undefined ? undefined : registry.worktrees[matchingIndex];
|
|
240
|
+
if (matchingIndexes.length !== 1 ||
|
|
241
|
+
entry === undefined ||
|
|
242
|
+
entry.path !== input.path ||
|
|
243
|
+
entry.branch !== input.branch ||
|
|
244
|
+
entry.type !== 'standalone' ||
|
|
245
|
+
entry.status !== 'active' ||
|
|
246
|
+
entry.issueNumber !== undefined ||
|
|
247
|
+
entry.prNumber !== undefined) {
|
|
248
|
+
throw new Error('Expected one exact active standalone registry row for qualification cleanup.');
|
|
249
|
+
}
|
|
250
|
+
if (matchingIndex === undefined) {
|
|
251
|
+
throw new Error('Qualification cleanup registry identity disappeared before removal.');
|
|
252
|
+
}
|
|
253
|
+
assertAiDeliveryWorktreeOwner(entry, root);
|
|
254
|
+
registry.worktrees.splice(matchingIndex, 1);
|
|
255
|
+
saveRegistryStrict(root, registry);
|
|
256
|
+
const readback = loadRegistryStrict(root).worktrees;
|
|
257
|
+
if (readback.some((candidate) => candidate.path === input.path || candidate.branch === input.branch)) {
|
|
258
|
+
throw new Error('Qualification cleanup registry readback retained the standalone identity.');
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
projectRoot: root,
|
|
262
|
+
timeout: 5000,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
export async function removeWorktreeEntry(path, projectRoot) {
|
|
266
|
+
const root = projectRoot ?? process.cwd();
|
|
267
|
+
ensureRegistryDirectory(root);
|
|
268
|
+
return await withLock(REGISTRY_PATH, {
|
|
269
|
+
onTimeout: () => {
|
|
270
|
+
logWarn(LOCK_RETRY_MESSAGE);
|
|
271
|
+
},
|
|
272
|
+
operation: () => {
|
|
273
|
+
const registry = loadRegistryStrict(root);
|
|
274
|
+
const matching = registry.worktrees.filter((row) => row.path === path);
|
|
275
|
+
if (matching.length > 1)
|
|
276
|
+
throw new Error('Worktree registry contains duplicate paths.');
|
|
277
|
+
if (matching[0] !== undefined) {
|
|
278
|
+
assertAiDeliveryWorktreeOwner(matching[0], root);
|
|
279
|
+
registry.worktrees = registry.worktrees.filter((row) => row.path !== path);
|
|
280
|
+
saveRegistryStrict(root, registry);
|
|
281
|
+
logInfo(`Removed from worktree registry: ${path}`);
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
return false;
|
|
285
|
+
},
|
|
286
|
+
projectRoot: root,
|
|
287
|
+
timeout: 5000,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
export async function updateIssueWorktreeDelivery(options) {
|
|
291
|
+
const { branch, issueNumber, path, status } = options;
|
|
292
|
+
const root = options.projectRoot ?? process.cwd();
|
|
293
|
+
ensureRegistryDirectory(root);
|
|
294
|
+
await withLock(REGISTRY_PATH, {
|
|
295
|
+
onTimeout: () => {
|
|
296
|
+
logWarn(LOCK_RETRY_MESSAGE);
|
|
297
|
+
},
|
|
298
|
+
operation: () => {
|
|
299
|
+
const registry = loadRegistryStrict(root);
|
|
300
|
+
const matchingIndex = requireCanonicalIssueIndex({ branch, issueNumber, path, registry });
|
|
301
|
+
const entry = registry.worktrees[matchingIndex];
|
|
302
|
+
if (entry === undefined) {
|
|
303
|
+
throw new Error(`Canonical registry row for issue #${String(issueNumber)} disappeared during transition.`);
|
|
304
|
+
}
|
|
305
|
+
assertAiDeliveryWorktreeOwner(entry, root);
|
|
306
|
+
assertIssueDeliveryTransition({ entry, options });
|
|
307
|
+
registry.worktrees.splice(matchingIndex, 1, {
|
|
308
|
+
...entry,
|
|
309
|
+
...(options.status === 'pr-published' ? { prNumber: options.prNumber } : {}),
|
|
310
|
+
status,
|
|
311
|
+
updatedAt: new Date().toISOString(),
|
|
312
|
+
});
|
|
313
|
+
saveRegistryStrict(root, registry);
|
|
314
|
+
assertIssueDeliveryReadback({ options, registry: loadRegistryStrict(root) });
|
|
315
|
+
},
|
|
316
|
+
projectRoot: root,
|
|
317
|
+
timeout: 5000,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
function assertIssueDeliveryReadback({ options, registry, }) {
|
|
321
|
+
const rows = registry.worktrees.filter((candidate) => candidate.type === 'issue' && candidate.issueNumber === options.issueNumber);
|
|
322
|
+
const entry = rows[0];
|
|
323
|
+
if (rows.length !== 1 ||
|
|
324
|
+
entry === undefined ||
|
|
325
|
+
entry.branch !== options.branch ||
|
|
326
|
+
entry.path !== options.path ||
|
|
327
|
+
entry.status !== options.status ||
|
|
328
|
+
(options.status === 'pr-published' && entry.prNumber !== options.prNumber)) {
|
|
329
|
+
throw new Error(`Canonical registry transition readback failed for issue #${String(options.issueNumber)}.`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
function assertIssueDeliveryTransition({ entry, options, }) {
|
|
333
|
+
if (options.status === 'pr-published') {
|
|
334
|
+
if (!Number.isSafeInteger(options.prNumber) || options.prNumber <= 0) {
|
|
335
|
+
throw new Error(`Canonical PR number must be a positive integer for issue #${String(options.issueNumber)}.`);
|
|
336
|
+
}
|
|
337
|
+
if (entry.status === 'active' && entry.prNumber === undefined) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
if (entry.status === 'pr-published' && entry.prNumber === options.prNumber) {
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
if (entry.status === 'pr-published' && entry.prNumber !== undefined) {
|
|
344
|
+
throw new Error(`Issue #${String(options.issueNumber)} cannot replace canonical PR #${String(entry.prNumber)} with #${String(options.prNumber)}.`);
|
|
345
|
+
}
|
|
346
|
+
throw new Error(`Invalid issue delivery transition for #${String(options.issueNumber)}: ${entry.status} -> pr-published.`);
|
|
347
|
+
}
|
|
348
|
+
if ((entry.status === 'pr-published' || entry.status === 'merged') &&
|
|
349
|
+
entry.prNumber !== undefined &&
|
|
350
|
+
Number.isSafeInteger(entry.prNumber) &&
|
|
351
|
+
entry.prNumber > 0) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
throw new Error(`Invalid issue delivery transition for #${String(options.issueNumber)}: ${entry.status} -> merged.`);
|
|
355
|
+
}
|
|
356
|
+
function ensureRegistryDirectory(root) {
|
|
357
|
+
ensureDataDirectory(root);
|
|
358
|
+
}
|
|
359
|
+
function isIdempotentRegistration(existing, incoming) {
|
|
360
|
+
return (existing.branch === incoming.branch &&
|
|
361
|
+
existing.identity === incoming.identity &&
|
|
362
|
+
existing.issueNumber === incoming.issueNumber &&
|
|
363
|
+
existing.path === incoming.path &&
|
|
364
|
+
existing.prNumber === incoming.prNumber &&
|
|
365
|
+
existing.status === incoming.status &&
|
|
366
|
+
existing.type === incoming.type);
|
|
367
|
+
}
|
|
368
|
+
function isMergedIssueReactivation(existing, incoming) {
|
|
369
|
+
return (existing.branch === incoming.branch &&
|
|
370
|
+
existing.identity === incoming.identity &&
|
|
371
|
+
existing.issueNumber === incoming.issueNumber &&
|
|
372
|
+
existing.path === incoming.path &&
|
|
373
|
+
existing.prNumber !== undefined &&
|
|
374
|
+
existing.status === 'merged' &&
|
|
375
|
+
existing.type === 'issue' &&
|
|
376
|
+
incoming.prNumber === undefined &&
|
|
377
|
+
incoming.status === 'active' &&
|
|
378
|
+
incoming.type === 'issue');
|
|
379
|
+
}
|
|
380
|
+
function isRecord(value) {
|
|
381
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
382
|
+
}
|
|
383
|
+
function loadRegistry(root) {
|
|
384
|
+
const registryPath = resolve(root, REGISTRY_PATH);
|
|
385
|
+
if (!existsSync(registryPath)) {
|
|
386
|
+
return { worktrees: [] };
|
|
387
|
+
}
|
|
388
|
+
try {
|
|
389
|
+
const raw = readFileSync(registryPath, 'utf8');
|
|
390
|
+
const parsed = JSON.parse(raw);
|
|
391
|
+
return {
|
|
392
|
+
worktrees: parsed.worktrees.map((entry) => {
|
|
393
|
+
const status = normalizeStatus(entry.status);
|
|
394
|
+
return {
|
|
395
|
+
branch: entry.branch,
|
|
396
|
+
createdAt: entry.createdAt,
|
|
397
|
+
...(entry.identity !== undefined ? { identity: entry.identity } : {}),
|
|
398
|
+
...(entry.issueNumber !== undefined ? { issueNumber: entry.issueNumber } : {}),
|
|
399
|
+
path: entry.path,
|
|
400
|
+
...(entry.prNumber !== undefined ? { prNumber: entry.prNumber } : {}),
|
|
401
|
+
status,
|
|
402
|
+
type: entry.type,
|
|
403
|
+
updatedAt: entry.updatedAt ?? entry.createdAt,
|
|
404
|
+
};
|
|
405
|
+
}),
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
logWarn(`Failed to load worktree registry: ${error instanceof Error ? error.message : String(error)}`);
|
|
410
|
+
return { worktrees: [] };
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
function loadRegistryStrict(root) {
|
|
414
|
+
const registryPath = resolve(root, REGISTRY_PATH);
|
|
415
|
+
if (!existsSync(registryPath)) {
|
|
416
|
+
return { worktrees: [] };
|
|
417
|
+
}
|
|
418
|
+
try {
|
|
419
|
+
const raw = readFileSync(registryPath, 'utf8');
|
|
420
|
+
const parsed = JSON.parse(raw);
|
|
421
|
+
if (!isRecord(parsed) || Object.keys(parsed).length !== 1 || !Array.isArray(parsed.worktrees)) {
|
|
422
|
+
throw new Error('Registry must be an object with a worktrees array.');
|
|
423
|
+
}
|
|
424
|
+
return {
|
|
425
|
+
worktrees: parsed.worktrees.map((entry, index) => normalizeStrictWorktreeEntry(entry, index)),
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
catch (error) {
|
|
429
|
+
throw new Error(`Unable to read worktree registry: ${error instanceof Error ? error.message : String(error)}`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
function normalizeStatus(raw) {
|
|
433
|
+
if (raw === 'merged' || raw === 'pr-published' || raw === 'active' || raw === 'error' || raw === 'stale') {
|
|
434
|
+
return raw;
|
|
435
|
+
}
|
|
436
|
+
throw new Error('Worktree registry status is invalid.');
|
|
437
|
+
}
|
|
438
|
+
function normalizeStrictWorktreeEntry(entry, index) {
|
|
439
|
+
if (!isRecord(entry)) {
|
|
440
|
+
throw new Error(`worktrees[${String(index)}] must be an object.`);
|
|
441
|
+
}
|
|
442
|
+
const allowed = new Set([
|
|
443
|
+
'branch',
|
|
444
|
+
'createdAt',
|
|
445
|
+
'identity',
|
|
446
|
+
'issueNumber',
|
|
447
|
+
'path',
|
|
448
|
+
'prNumber',
|
|
449
|
+
'status',
|
|
450
|
+
'type',
|
|
451
|
+
'updatedAt',
|
|
452
|
+
]);
|
|
453
|
+
const unknown = Object.keys(entry).filter((key) => !allowed.has(key));
|
|
454
|
+
if (unknown.length > 0) {
|
|
455
|
+
throw new Error(`worktrees[${String(index)}] has unsupported fields: ${unknown.join(', ')}.`);
|
|
456
|
+
}
|
|
457
|
+
const branch = requiredString(entry.branch, `worktrees[${String(index)}].branch`);
|
|
458
|
+
const createdAt = requiredString(entry.createdAt, `worktrees[${String(index)}].createdAt`);
|
|
459
|
+
const path = requiredString(entry.path, `worktrees[${String(index)}].path`);
|
|
460
|
+
const type = requiredWorktreeType(entry.type, `worktrees[${String(index)}].type`);
|
|
461
|
+
const status = requiredWorktreeStatus(entry.status, `worktrees[${String(index)}].status`);
|
|
462
|
+
const identity = optionalString(entry.identity, `worktrees[${String(index)}].identity`);
|
|
463
|
+
const issueNumber = optionalPositiveInteger(entry.issueNumber, `worktrees[${String(index)}].issueNumber`);
|
|
464
|
+
const prNumber = optionalPositiveInteger(entry.prNumber, `worktrees[${String(index)}].prNumber`);
|
|
465
|
+
const updatedAt = requiredString(entry.updatedAt, `worktrees[${String(index)}].updatedAt`);
|
|
466
|
+
if (type === 'issue' && issueNumber === undefined) {
|
|
467
|
+
throw new Error(`worktrees[${String(index)}].issueNumber is required for issue worktrees.`);
|
|
468
|
+
}
|
|
469
|
+
return {
|
|
470
|
+
branch,
|
|
471
|
+
createdAt,
|
|
472
|
+
...(identity === undefined ? {} : { identity }),
|
|
473
|
+
...(issueNumber === undefined ? {} : { issueNumber }),
|
|
474
|
+
path,
|
|
475
|
+
...(prNumber === undefined ? {} : { prNumber }),
|
|
476
|
+
status,
|
|
477
|
+
type,
|
|
478
|
+
updatedAt,
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
function optionalPositiveInteger(value, label) {
|
|
482
|
+
if (value === undefined) {
|
|
483
|
+
return undefined;
|
|
484
|
+
}
|
|
485
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {
|
|
486
|
+
throw new Error(`${label} must be a positive integer.`);
|
|
487
|
+
}
|
|
488
|
+
return value;
|
|
489
|
+
}
|
|
490
|
+
function optionalString(value, label) {
|
|
491
|
+
if (value === undefined) {
|
|
492
|
+
return undefined;
|
|
493
|
+
}
|
|
494
|
+
return requiredString(value, label);
|
|
495
|
+
}
|
|
496
|
+
function registryIdentitiesOverlap(left, right) {
|
|
497
|
+
return (left.path === right.path ||
|
|
498
|
+
left.branch === right.branch ||
|
|
499
|
+
(left.issueNumber !== undefined && right.issueNumber !== undefined && left.issueNumber === right.issueNumber) ||
|
|
500
|
+
(left.prNumber !== undefined && right.prNumber !== undefined && left.prNumber === right.prNumber));
|
|
501
|
+
}
|
|
502
|
+
function requireCanonicalIssueIndex({ branch, issueNumber, path, registry, }) {
|
|
503
|
+
const issueIndexes = registry.worktrees.flatMap((entry, index) => entry.type === 'issue' && entry.issueNumber === issueNumber ? [index] : []);
|
|
504
|
+
if (issueIndexes.length !== 1) {
|
|
505
|
+
throw new Error(`Expected exactly one canonical registry row for issue #${String(issueNumber)}; found ${String(issueIndexes.length)}.`);
|
|
506
|
+
}
|
|
507
|
+
const matchingIndex = issueIndexes[0];
|
|
508
|
+
const entry = matchingIndex === undefined ? undefined : registry.worktrees[matchingIndex];
|
|
509
|
+
if (matchingIndex === undefined || entry === undefined) {
|
|
510
|
+
throw new Error(`Canonical registry row for issue #${String(issueNumber)} disappeared during transition.`);
|
|
511
|
+
}
|
|
512
|
+
if (entry.branch !== branch || entry.path !== path) {
|
|
513
|
+
throw new Error(`Canonical registry row for issue #${String(issueNumber)} does not match branch ${branch} and path ${path}.`);
|
|
514
|
+
}
|
|
515
|
+
return matchingIndex;
|
|
516
|
+
}
|
|
517
|
+
function requiredString(value, label) {
|
|
518
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
519
|
+
throw new Error(`${label} must be a non-empty string.`);
|
|
520
|
+
}
|
|
521
|
+
return value;
|
|
522
|
+
}
|
|
523
|
+
function requiredWorktreeStatus(value, label) {
|
|
524
|
+
if (value === 'merged' || value === 'pr-published' || value === 'active' || value === 'error' || value === 'stale') {
|
|
525
|
+
return value;
|
|
526
|
+
}
|
|
527
|
+
throw new Error(`${label} is invalid.`);
|
|
528
|
+
}
|
|
529
|
+
function requiredWorktreeType(value, label) {
|
|
530
|
+
if (value === 'issue' || value === 'pr' || value === 'standalone') {
|
|
531
|
+
return value;
|
|
532
|
+
}
|
|
533
|
+
throw new Error(`${label} is invalid.`);
|
|
534
|
+
}
|
|
535
|
+
function saveRegistryStrict(root, registry) {
|
|
536
|
+
ensureRegistryDirectory(root);
|
|
537
|
+
const registryPath = resolve(root, REGISTRY_PATH);
|
|
538
|
+
try {
|
|
539
|
+
writeJsonFileAtomically(registryPath, registry);
|
|
540
|
+
}
|
|
541
|
+
catch (error) {
|
|
542
|
+
throw new Error(`Unable to save worktree registry: ${error instanceof Error ? error.message : String(error)}`);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
//# sourceMappingURL=worktreeRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktreeRegistry.js","sourceRoot":"","sources":["../../src/services/worktreeRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type TerminalRunState = 'blocked' | 'completed' | 'failed' | 'ready' | 'review_required' | 'running' | 'unknown';
|
|
2
|
+
export type TerminalSeverity = 'debug' | 'error' | 'info' | 'progress' | 'success' | 'warning';
|
|
3
|
+
export interface TerminalStatusBlock {
|
|
4
|
+
explanation?: string;
|
|
5
|
+
nextAction?: string;
|
|
6
|
+
state: TerminalRunState;
|
|
7
|
+
stopReason?: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function formatTerminalLogLine(severity: TerminalSeverity, message: string): string;
|
|
11
|
+
export declare function formatTerminalSeverityPrefix(severity: TerminalSeverity): string;
|
|
12
|
+
export declare function formatTerminalStateLabel(state: TerminalRunState): string;
|
|
13
|
+
export declare function formatTerminalStatusBlock(block: TerminalStatusBlock): string;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const RUN_STATE_LABELS = {
|
|
2
|
+
blocked: 'BLOCKED',
|
|
3
|
+
completed: 'COMPLETED',
|
|
4
|
+
failed: 'FAILED',
|
|
5
|
+
ready: 'READY',
|
|
6
|
+
review_required: 'REVIEW REQUIRED',
|
|
7
|
+
running: 'RUNNING',
|
|
8
|
+
unknown: 'UNKNOWN',
|
|
9
|
+
};
|
|
10
|
+
const SEVERITY_LABELS = {
|
|
11
|
+
debug: 'DEBUG',
|
|
12
|
+
error: 'ERROR',
|
|
13
|
+
info: 'INFO',
|
|
14
|
+
progress: 'PROGRESS',
|
|
15
|
+
success: 'SUCCESS',
|
|
16
|
+
warning: 'WARNING',
|
|
17
|
+
};
|
|
18
|
+
export function formatTerminalLogLine(severity, message) {
|
|
19
|
+
return `${formatTerminalSeverityPrefix(severity)} ${message}`;
|
|
20
|
+
}
|
|
21
|
+
export function formatTerminalSeverityPrefix(severity) {
|
|
22
|
+
return `[${SEVERITY_LABELS[severity]}]`;
|
|
23
|
+
}
|
|
24
|
+
export function formatTerminalStateLabel(state) {
|
|
25
|
+
return RUN_STATE_LABELS[state];
|
|
26
|
+
}
|
|
27
|
+
export function formatTerminalStatusBlock(block) {
|
|
28
|
+
const lines = [`Status: ${formatTerminalStateLabel(block.state)}`];
|
|
29
|
+
if (block.stopReason !== undefined && block.stopReason.length > 0) {
|
|
30
|
+
lines.push(`Stop reason: ${block.stopReason}`);
|
|
31
|
+
}
|
|
32
|
+
if (block.title !== undefined && block.title.length > 0) {
|
|
33
|
+
lines.push(`Diagnosis: ${block.title}`);
|
|
34
|
+
}
|
|
35
|
+
if (block.explanation !== undefined && block.explanation.length > 0) {
|
|
36
|
+
lines.push(`Explanation: ${block.explanation}`);
|
|
37
|
+
}
|
|
38
|
+
if (block.nextAction !== undefined && block.nextAction.length > 0) {
|
|
39
|
+
lines.push(`Next action: ${block.nextAction}`);
|
|
40
|
+
}
|
|
41
|
+
return lines.join('\n');
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=terminalMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminalMessages.js","sourceRoot":"","sources":["../src/terminalMessages.ts"],"names":[],"mappings":"AAIA,MAAM,gBAAgB,GAAG;IACvB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,iBAAiB;IAClC,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACwB,CAAC;AAE7C,MAAM,eAAe,GAAG;IACtB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACwB,CAAC;AAU7C,MAAM,UAAU,qBAAqB,CAAC,QAA0B,EAAE,OAAe;IAC/E,OAAO,GAAG,4BAA4B,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,QAA0B;IACrE,OAAO,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAuB;IAC9D,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAA0B;IAClE,MAAM,KAAK,GAAG,CAAC,WAAW,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Create a private directory hierarchy and durably publish every new directory entry. */
|
|
2
|
+
export declare function ensurePrivateDirectoryDurably(path: string): void;
|
|
3
|
+
/** Publish a complete JSON file with a same-directory durable rename. */
|
|
4
|
+
export declare function writeJsonFileAtomically(path: string, value: unknown): void;
|
|
5
|
+
/** Publish private JSON evidence with the same durable rename contract. */
|
|
6
|
+
export declare function writePrivateJsonFileAtomically(path: string, value: unknown): void;
|