@agent-teams/engineering-foundation 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/LICENSE +201 -0
- package/README.md +32 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +173 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +106 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +6 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/local-mode/consumer-policy.d.ts +13 -0
- package/dist/local-mode/consumer-policy.d.ts.map +1 -0
- package/dist/local-mode/consumer-policy.js +227 -0
- package/dist/local-mode/consumer-policy.js.map +1 -0
- package/dist/local-mode/index.d.ts +7 -0
- package/dist/local-mode/index.d.ts.map +1 -0
- package/dist/local-mode/index.js +5 -0
- package/dist/local-mode/index.js.map +1 -0
- package/dist/local-mode/inspection.d.ts +7 -0
- package/dist/local-mode/inspection.d.ts.map +1 -0
- package/dist/local-mode/inspection.js +224 -0
- package/dist/local-mode/inspection.js.map +1 -0
- package/dist/local-mode/process-runner.d.ts +5 -0
- package/dist/local-mode/process-runner.d.ts.map +1 -0
- package/dist/local-mode/process-runner.js +20 -0
- package/dist/local-mode/process-runner.js.map +1 -0
- package/dist/local-mode/service.d.ts +16 -0
- package/dist/local-mode/service.d.ts.map +1 -0
- package/dist/local-mode/service.js +503 -0
- package/dist/local-mode/service.js.map +1 -0
- package/dist/local-mode/types.d.ts +62 -0
- package/dist/local-mode/types.d.ts.map +1 -0
- package/dist/local-mode/types.js +7 -0
- package/dist/local-mode/types.js.map +1 -0
- package/dist/package-self-check.d.ts +15 -0
- package/dist/package-self-check.d.ts.map +1 -0
- package/dist/package-self-check.js +172 -0
- package/dist/package-self-check.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
import { appendFile, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, rmdir, stat, symlink } from "node:fs/promises";
|
|
2
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
3
|
+
import { isDeepStrictEqual } from "node:util";
|
|
4
|
+
import { lock } from "proper-lockfile";
|
|
5
|
+
import { FoundationError } from "../errors.js";
|
|
6
|
+
import { inspectFoundationPackage, parseFoundationPackageSelfCheck } from "../package-self-check.js";
|
|
7
|
+
import { inspectFoundationDevOnly, isExactVersion } from "./consumer-policy.js";
|
|
8
|
+
import { inspectFoundationMode } from "./inspection.js";
|
|
9
|
+
import { FOUNDATION_PACKAGE_NAME, LOCAL_OPERATION_LOCK, LOCAL_REGISTRY_BACKUP, LOCAL_STATE_DIRECTORY, LOCAL_STATE_FILE } from "./types.js";
|
|
10
|
+
async function readPackageManifest(path) {
|
|
11
|
+
const value = JSON.parse(await readFile(join(path, "package.json"), "utf8"));
|
|
12
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
13
|
+
throw new FoundationError("PACKAGE_INVALID", `Invalid package.json at ${path}.`);
|
|
14
|
+
}
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
async function pathExists(path) {
|
|
18
|
+
try {
|
|
19
|
+
await stat(path);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof Error &&
|
|
24
|
+
"code" in error &&
|
|
25
|
+
error.code === "ENOENT") {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function pathEntryExists(path) {
|
|
32
|
+
try {
|
|
33
|
+
await lstat(path);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error instanceof Error &&
|
|
38
|
+
"code" in error &&
|
|
39
|
+
error.code === "ENOENT") {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function ensureLocalStateDirectory(consumerRoot) {
|
|
46
|
+
const directory = join(consumerRoot, LOCAL_STATE_DIRECTORY);
|
|
47
|
+
try {
|
|
48
|
+
const entry = await lstat(directory);
|
|
49
|
+
if (!entry.isDirectory() || entry.isSymbolicLink()) {
|
|
50
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Local foundation state path must be a real consumer-owned directory.");
|
|
51
|
+
}
|
|
52
|
+
if ((await realpath(directory)) !== directory) {
|
|
53
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Local foundation state directory resolves outside its expected path.");
|
|
54
|
+
}
|
|
55
|
+
return directory;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (!(error instanceof Error &&
|
|
59
|
+
"code" in error &&
|
|
60
|
+
error.code === "ENOENT")) {
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
await mkdir(directory);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof Error &&
|
|
69
|
+
"code" in error &&
|
|
70
|
+
error.code === "EEXIST") {
|
|
71
|
+
return await ensureLocalStateDirectory(consumerRoot);
|
|
72
|
+
}
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
await syncDirectory(consumerRoot);
|
|
76
|
+
return directory;
|
|
77
|
+
}
|
|
78
|
+
async function readPackageEntry(path) {
|
|
79
|
+
const packageRoot = await realpath(path);
|
|
80
|
+
return {
|
|
81
|
+
manifest: await readPackageManifest(packageRoot),
|
|
82
|
+
packageRoot
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function isWithin(parent, candidate) {
|
|
86
|
+
const path = relative(parent, candidate);
|
|
87
|
+
return (path === "" ||
|
|
88
|
+
(!path.startsWith(`..${sep}`) && path !== ".." && !isAbsolute(path)));
|
|
89
|
+
}
|
|
90
|
+
function assertRecoveryStatePaths(consumerRoot, state) {
|
|
91
|
+
const expectedBackupPath = join(consumerRoot, LOCAL_STATE_DIRECTORY, LOCAL_REGISTRY_BACKUP);
|
|
92
|
+
const nodeModulesRoot = join(consumerRoot, "node_modules");
|
|
93
|
+
if (resolve(state.consumerRoot) !== consumerRoot ||
|
|
94
|
+
resolve(state.registryBackupPath) !== expectedBackupPath ||
|
|
95
|
+
!isWithin(nodeModulesRoot, resolve(state.registryPackageRoot))) {
|
|
96
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Local recovery state contains paths outside its consumer-owned boundary.");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function resolveTargetPackageRoot(targetPath) {
|
|
100
|
+
const root = await realpath(resolve(targetPath));
|
|
101
|
+
const directManifest = join(root, "package.json");
|
|
102
|
+
if (await pathExists(directManifest)) {
|
|
103
|
+
const manifest = await readPackageManifest(root);
|
|
104
|
+
if (manifest.name === FOUNDATION_PACKAGE_NAME) {
|
|
105
|
+
return root;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const workspacePackage = join(root, "packages", "engineering-foundation");
|
|
109
|
+
if (await pathExists(join(workspacePackage, "package.json"))) {
|
|
110
|
+
const manifest = await readPackageManifest(workspacePackage);
|
|
111
|
+
if (manifest.name === FOUNDATION_PACKAGE_NAME) {
|
|
112
|
+
return await realpath(workspacePackage);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
throw new FoundationError("PACKAGE_INVALID", `Target does not contain ${FOUNDATION_PACKAGE_NAME}.`);
|
|
116
|
+
}
|
|
117
|
+
async function writeLinkState(consumerRoot, state) {
|
|
118
|
+
const directory = join(consumerRoot, LOCAL_STATE_DIRECTORY);
|
|
119
|
+
const destination = join(directory, LOCAL_STATE_FILE);
|
|
120
|
+
const temporary = `${destination}.${process.pid}.tmp`;
|
|
121
|
+
await ensureLocalStateDirectory(consumerRoot);
|
|
122
|
+
const handle = await open(temporary, "w", 0o600);
|
|
123
|
+
try {
|
|
124
|
+
await handle.writeFile(`${JSON.stringify(state, null, 2)}\n`, "utf8");
|
|
125
|
+
await handle.sync();
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
await handle.close();
|
|
129
|
+
}
|
|
130
|
+
await rename(temporary, destination);
|
|
131
|
+
await syncDirectory(directory);
|
|
132
|
+
}
|
|
133
|
+
async function syncDirectory(path) {
|
|
134
|
+
try {
|
|
135
|
+
const handle = await open(path, "r");
|
|
136
|
+
try {
|
|
137
|
+
await handle.sync();
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
await handle.close();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
if (process.platform === "win32" &&
|
|
145
|
+
error instanceof Error &&
|
|
146
|
+
"code" in error &&
|
|
147
|
+
["EACCES", "EINVAL", "EISDIR", "EPERM"].includes(error.code ?? "")) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async function removeLinkState(consumerRoot) {
|
|
154
|
+
const directory = join(consumerRoot, LOCAL_STATE_DIRECTORY);
|
|
155
|
+
const destination = join(directory, LOCAL_STATE_FILE);
|
|
156
|
+
await rm(destination, { force: true });
|
|
157
|
+
const temporaryEntries = await readdir(directory).catch(() => []);
|
|
158
|
+
await Promise.all(temporaryEntries
|
|
159
|
+
.filter((entry) => entry.startsWith(`${LOCAL_STATE_FILE}.`) && entry.endsWith(".tmp"))
|
|
160
|
+
.map(async (entry) => {
|
|
161
|
+
await rm(join(directory, entry), { force: true });
|
|
162
|
+
}));
|
|
163
|
+
await syncDirectory(directory);
|
|
164
|
+
try {
|
|
165
|
+
await rmdir(directory);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (error instanceof Error &&
|
|
169
|
+
"code" in error &&
|
|
170
|
+
["ENOENT", "ENOTEMPTY"].includes(error.code ?? "")) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async function pruneLocalStateDirectory(consumerRoot) {
|
|
177
|
+
try {
|
|
178
|
+
await rmdir(join(consumerRoot, LOCAL_STATE_DIRECTORY));
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (error instanceof Error &&
|
|
182
|
+
"code" in error &&
|
|
183
|
+
["ENOENT", "ENOTEMPTY"].includes(error.code ?? "")) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export async function acquireFoundationOperationLock(consumerRoot) {
|
|
190
|
+
const directory = await ensureLocalStateDirectory(consumerRoot);
|
|
191
|
+
const lockPath = join(directory, LOCAL_OPERATION_LOCK);
|
|
192
|
+
if (await pathEntryExists(lockPath)) {
|
|
193
|
+
const lockEntry = await lstat(lockPath);
|
|
194
|
+
if (!lockEntry.isDirectory() || lockEntry.isSymbolicLink()) {
|
|
195
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Foundation operation lock path must be a real local directory.");
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
const release = await lock(directory, {
|
|
200
|
+
lockfilePath: lockPath,
|
|
201
|
+
onCompromised: (error) => {
|
|
202
|
+
throw error;
|
|
203
|
+
},
|
|
204
|
+
realpath: true,
|
|
205
|
+
retries: 0,
|
|
206
|
+
stale: 120_000,
|
|
207
|
+
update: 30_000
|
|
208
|
+
});
|
|
209
|
+
return async () => {
|
|
210
|
+
await release();
|
|
211
|
+
await syncDirectory(directory);
|
|
212
|
+
await pruneLocalStateDirectory(consumerRoot);
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Another foundation operation is active or its lock is not safely recoverable.", { cause: error });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
export class FoundationLocalModeService {
|
|
220
|
+
#runner;
|
|
221
|
+
#now;
|
|
222
|
+
constructor(options) {
|
|
223
|
+
this.#runner = options.runner;
|
|
224
|
+
this.#now = options.now ?? (() => new Date());
|
|
225
|
+
}
|
|
226
|
+
async #restoreRegistryEntry(consumerRoot, dependencySpec, state) {
|
|
227
|
+
const installedPackagePath = join(consumerRoot, "node_modules", FOUNDATION_PACKAGE_NAME);
|
|
228
|
+
const registryBackupPath = join(consumerRoot, LOCAL_STATE_DIRECTORY, LOCAL_REGISTRY_BACKUP);
|
|
229
|
+
if (state !== undefined) {
|
|
230
|
+
assertRecoveryStatePaths(consumerRoot, state);
|
|
231
|
+
}
|
|
232
|
+
if (await pathEntryExists(registryBackupPath)) {
|
|
233
|
+
const backup = await readPackageEntry(registryBackupPath);
|
|
234
|
+
const nodeModulesRoot = join(consumerRoot, "node_modules");
|
|
235
|
+
const backupRootIsExpected = state === undefined
|
|
236
|
+
? backup.packageRoot === registryBackupPath ||
|
|
237
|
+
isWithin(nodeModulesRoot, backup.packageRoot)
|
|
238
|
+
: backup.packageRoot ===
|
|
239
|
+
(state.registryEntryKind === "directory"
|
|
240
|
+
? registryBackupPath
|
|
241
|
+
: resolve(state.registryPackageRoot));
|
|
242
|
+
if (backup.manifest.name !== FOUNDATION_PACKAGE_NAME ||
|
|
243
|
+
backup.manifest.version !== dependencySpec ||
|
|
244
|
+
!backupRootIsExpected) {
|
|
245
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Registry backup identity, version, or location is invalid.");
|
|
246
|
+
}
|
|
247
|
+
await rm(installedPackagePath, { force: true, recursive: true });
|
|
248
|
+
await mkdir(dirname(installedPackagePath), { recursive: true });
|
|
249
|
+
await rename(registryBackupPath, installedPackagePath);
|
|
250
|
+
await syncDirectory(dirname(installedPackagePath));
|
|
251
|
+
await syncDirectory(dirname(registryBackupPath));
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (await pathEntryExists(installedPackagePath)) {
|
|
255
|
+
const installed = await readPackageEntry(installedPackagePath).catch(() => { });
|
|
256
|
+
if (installed !== undefined &&
|
|
257
|
+
(state === undefined
|
|
258
|
+
? isWithin(join(consumerRoot, "node_modules"), installed.packageRoot)
|
|
259
|
+
: installed.packageRoot === resolve(state.registryPackageRoot)) &&
|
|
260
|
+
installed.manifest.name === FOUNDATION_PACKAGE_NAME &&
|
|
261
|
+
installed.manifest.version === dependencySpec) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Registry backup is unavailable and the installed package cannot be proven to be the original registry entry.");
|
|
266
|
+
}
|
|
267
|
+
async #readStatus(consumerPath, ignoreOperationLock) {
|
|
268
|
+
const status = await inspectFoundationMode(consumerPath, {
|
|
269
|
+
ignoreOperationLock
|
|
270
|
+
});
|
|
271
|
+
if (status.mode !== "LOCAL" || status.linkState === undefined) {
|
|
272
|
+
return status;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const sourceGitCommit = (await this.#runner.run({
|
|
276
|
+
command: "git",
|
|
277
|
+
args: [
|
|
278
|
+
"-C",
|
|
279
|
+
status.linkState.targetPackageRoot,
|
|
280
|
+
"rev-parse",
|
|
281
|
+
"HEAD"
|
|
282
|
+
],
|
|
283
|
+
cwd: status.consumerRoot
|
|
284
|
+
})).stdout.trim();
|
|
285
|
+
const sourceGitDirty = (await this.#runner.run({
|
|
286
|
+
command: "git",
|
|
287
|
+
args: [
|
|
288
|
+
"-C",
|
|
289
|
+
status.linkState.targetPackageRoot,
|
|
290
|
+
"status",
|
|
291
|
+
"--porcelain"
|
|
292
|
+
],
|
|
293
|
+
cwd: status.consumerRoot
|
|
294
|
+
})).stdout.trim().length > 0;
|
|
295
|
+
return { ...status, sourceGitCommit, sourceGitDirty };
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
return {
|
|
299
|
+
...status,
|
|
300
|
+
mode: "INVALID",
|
|
301
|
+
issues: [
|
|
302
|
+
...status.issues,
|
|
303
|
+
`Local foundation Git evidence is unavailable: ${error instanceof Error ? error.message : String(error)}`
|
|
304
|
+
]
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async status(consumerPath) {
|
|
309
|
+
return await this.#readStatus(consumerPath, false);
|
|
310
|
+
}
|
|
311
|
+
async attach(consumerPath, targetPath) {
|
|
312
|
+
const before = await inspectFoundationMode(consumerPath, {
|
|
313
|
+
ignoreOperationLock: true
|
|
314
|
+
});
|
|
315
|
+
if (before.mode !== "REGISTRY" ||
|
|
316
|
+
before.dependencySpec === undefined ||
|
|
317
|
+
!isExactVersion(before.dependencySpec)) {
|
|
318
|
+
throw new FoundationError("CONSUMER_INVALID", `Consumer must be in valid registry mode with an exact ${FOUNDATION_PACKAGE_NAME} version before attach: ${before.issues.join(" ") || before.mode}.`);
|
|
319
|
+
}
|
|
320
|
+
const consumerRoot = before.consumerRoot;
|
|
321
|
+
const targetPackageRoot = await resolveTargetPackageRoot(targetPath);
|
|
322
|
+
if (targetPackageRoot === consumerRoot) {
|
|
323
|
+
throw new FoundationError("PACKAGE_INVALID", "Foundation target cannot be the consumer repository.");
|
|
324
|
+
}
|
|
325
|
+
const expectedSelfCheck = await inspectFoundationPackage(targetPackageRoot);
|
|
326
|
+
const selfCheckResult = await this.#runner.run({
|
|
327
|
+
command: process.execPath,
|
|
328
|
+
args: [join(targetPackageRoot, "dist", "cli.js"), "self-check", "--json"],
|
|
329
|
+
cwd: targetPackageRoot
|
|
330
|
+
});
|
|
331
|
+
let actualSelfCheck;
|
|
332
|
+
try {
|
|
333
|
+
actualSelfCheck = parseFoundationPackageSelfCheck(JSON.parse(selfCheckResult.stdout));
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
throw new FoundationError("PACKAGE_INVALID", "Foundation target CLI self-check did not return a valid result.", { cause: error });
|
|
337
|
+
}
|
|
338
|
+
if (!isDeepStrictEqual(actualSelfCheck, expectedSelfCheck)) {
|
|
339
|
+
throw new FoundationError("PACKAGE_INVALID", "Foundation target CLI self-check disagrees with package metadata.");
|
|
340
|
+
}
|
|
341
|
+
const gitCommit = (await this.#runner.run({
|
|
342
|
+
command: "git",
|
|
343
|
+
args: ["-C", targetPackageRoot, "rev-parse", "HEAD"],
|
|
344
|
+
cwd: consumerRoot
|
|
345
|
+
})).stdout.trim();
|
|
346
|
+
const gitDirty = (await this.#runner.run({
|
|
347
|
+
command: "git",
|
|
348
|
+
args: ["-C", targetPackageRoot, "status", "--porcelain"],
|
|
349
|
+
cwd: consumerRoot
|
|
350
|
+
})).stdout.trim().length > 0;
|
|
351
|
+
const excludeResult = await this.#runner.run({
|
|
352
|
+
command: "git",
|
|
353
|
+
args: ["-C", consumerRoot, "rev-parse", "--git-path", "info/exclude"],
|
|
354
|
+
cwd: consumerRoot
|
|
355
|
+
});
|
|
356
|
+
const excludePathCandidate = excludeResult.stdout.trim();
|
|
357
|
+
const excludePath = isAbsolute(excludePathCandidate)
|
|
358
|
+
? excludePathCandidate
|
|
359
|
+
: resolve(consumerRoot, excludePathCandidate);
|
|
360
|
+
await mkdir(dirname(excludePath), { recursive: true });
|
|
361
|
+
const exclude = await readFile(excludePath, "utf8").catch(() => "");
|
|
362
|
+
if (!exclude.split(/\r?\n/u).includes(`${LOCAL_STATE_DIRECTORY}/`)) {
|
|
363
|
+
const separator = exclude.length === 0 || exclude.endsWith("\n") ? "" : "\n";
|
|
364
|
+
await appendFile(excludePath, `${separator}${LOCAL_STATE_DIRECTORY}/\n`, "utf8");
|
|
365
|
+
}
|
|
366
|
+
const installedPackagePath = join(consumerRoot, "node_modules", FOUNDATION_PACKAGE_NAME);
|
|
367
|
+
const registryBackupPath = join(consumerRoot, LOCAL_STATE_DIRECTORY, LOCAL_REGISTRY_BACKUP);
|
|
368
|
+
const releaseLock = await acquireFoundationOperationLock(consumerRoot);
|
|
369
|
+
let state;
|
|
370
|
+
try {
|
|
371
|
+
const current = await inspectFoundationMode(consumerRoot, {
|
|
372
|
+
ignoreOperationLock: true
|
|
373
|
+
});
|
|
374
|
+
if (current.mode !== "REGISTRY" ||
|
|
375
|
+
current.dependencySpec !== before.dependencySpec ||
|
|
376
|
+
current.installedPackageRoot === undefined) {
|
|
377
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Consumer foundation state changed before attach acquired its operation lock.");
|
|
378
|
+
}
|
|
379
|
+
if (await pathEntryExists(registryBackupPath)) {
|
|
380
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "A registry backup already exists; run detach to recover it before attaching.");
|
|
381
|
+
}
|
|
382
|
+
const registryEntry = await lstat(installedPackagePath);
|
|
383
|
+
if (!registryEntry.isDirectory() && !registryEntry.isSymbolicLink()) {
|
|
384
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Installed foundation entry is neither a directory nor a symbolic link.");
|
|
385
|
+
}
|
|
386
|
+
state = {
|
|
387
|
+
schemaVersion: 1,
|
|
388
|
+
phase: "ATTACHING",
|
|
389
|
+
consumerRoot,
|
|
390
|
+
targetPackageRoot,
|
|
391
|
+
registryBackupPath,
|
|
392
|
+
registryEntryKind: registryEntry.isSymbolicLink()
|
|
393
|
+
? "symbolic-link"
|
|
394
|
+
: "directory",
|
|
395
|
+
registryPackageRoot: current.installedPackageRoot,
|
|
396
|
+
packageVersion: expectedSelfCheck.packageVersion,
|
|
397
|
+
gitCommit,
|
|
398
|
+
gitDirty,
|
|
399
|
+
attachedAt: this.#now().toISOString()
|
|
400
|
+
};
|
|
401
|
+
await writeLinkState(consumerRoot, state);
|
|
402
|
+
if (state.registryEntryKind === "symbolic-link") {
|
|
403
|
+
await symlink(state.registryPackageRoot, registryBackupPath, process.platform === "win32" ? "junction" : "dir");
|
|
404
|
+
await syncDirectory(dirname(registryBackupPath));
|
|
405
|
+
await rm(installedPackagePath, { force: true });
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
await rename(installedPackagePath, registryBackupPath);
|
|
409
|
+
await syncDirectory(dirname(registryBackupPath));
|
|
410
|
+
}
|
|
411
|
+
await syncDirectory(dirname(installedPackagePath));
|
|
412
|
+
await mkdir(dirname(installedPackagePath), { recursive: true });
|
|
413
|
+
await symlink(targetPackageRoot, installedPackagePath, process.platform === "win32" ? "junction" : "dir");
|
|
414
|
+
const installedPackageRoot = await realpath(installedPackagePath);
|
|
415
|
+
if (installedPackageRoot !== targetPackageRoot) {
|
|
416
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Local package link does not resolve to the requested target.");
|
|
417
|
+
}
|
|
418
|
+
await syncDirectory(dirname(installedPackagePath));
|
|
419
|
+
state = { ...state, phase: "LOCAL" };
|
|
420
|
+
await writeLinkState(consumerRoot, state);
|
|
421
|
+
const status = await this.#readStatus(consumerRoot, true);
|
|
422
|
+
if (status.mode !== "LOCAL") {
|
|
423
|
+
throw new FoundationError("LOCAL_STATE_INVALID", `Local attach verification failed: ${status.issues.join(" ")}`);
|
|
424
|
+
}
|
|
425
|
+
return { status, targetPackageRoot };
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
if (state === undefined) {
|
|
429
|
+
throw error;
|
|
430
|
+
}
|
|
431
|
+
const recoveryErrors = [];
|
|
432
|
+
try {
|
|
433
|
+
await this.#restoreRegistryEntry(consumerRoot, before.dependencySpec, state);
|
|
434
|
+
}
|
|
435
|
+
catch (restoreError) {
|
|
436
|
+
recoveryErrors.push(restoreError);
|
|
437
|
+
}
|
|
438
|
+
try {
|
|
439
|
+
await removeLinkState(consumerRoot);
|
|
440
|
+
}
|
|
441
|
+
catch (cleanupError) {
|
|
442
|
+
recoveryErrors.push(cleanupError);
|
|
443
|
+
}
|
|
444
|
+
if (recoveryErrors.length > 0) {
|
|
445
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Local attach failed and its registry state could not be fully restored.", {
|
|
446
|
+
cause: new AggregateError([error, ...recoveryErrors], "Attach and one or more recovery operations failed.")
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Local attach failed and the registry installation was restored.", { cause: error });
|
|
450
|
+
}
|
|
451
|
+
finally {
|
|
452
|
+
await releaseLock();
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
async detach(consumerPath) {
|
|
456
|
+
const before = await inspectFoundationMode(consumerPath);
|
|
457
|
+
if (before.dependencySpec === undefined ||
|
|
458
|
+
!isExactVersion(before.dependencySpec)) {
|
|
459
|
+
throw new FoundationError("CONSUMER_INVALID", `Consumer must retain an exact ${FOUNDATION_PACKAGE_NAME} registry dependency.`);
|
|
460
|
+
}
|
|
461
|
+
const releaseLock = await acquireFoundationOperationLock(before.consumerRoot);
|
|
462
|
+
try {
|
|
463
|
+
const current = await inspectFoundationMode(before.consumerRoot, {
|
|
464
|
+
ignoreOperationLock: true
|
|
465
|
+
});
|
|
466
|
+
if (current.mode === "REGISTRY") {
|
|
467
|
+
return current;
|
|
468
|
+
}
|
|
469
|
+
if (current.linkState !== undefined) {
|
|
470
|
+
await writeLinkState(before.consumerRoot, {
|
|
471
|
+
...current.linkState,
|
|
472
|
+
phase: "DETACHING"
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
await this.#restoreRegistryEntry(before.consumerRoot, before.dependencySpec, current.linkState);
|
|
476
|
+
await removeLinkState(before.consumerRoot);
|
|
477
|
+
}
|
|
478
|
+
finally {
|
|
479
|
+
await releaseLock();
|
|
480
|
+
}
|
|
481
|
+
const after = await inspectFoundationMode(before.consumerRoot);
|
|
482
|
+
if (after.mode !== "REGISTRY") {
|
|
483
|
+
throw new FoundationError("LOCAL_STATE_INVALID", `Registry restoration failed: ${after.issues.join(" ")}`);
|
|
484
|
+
}
|
|
485
|
+
return after;
|
|
486
|
+
}
|
|
487
|
+
async assertRegistry(consumerPath) {
|
|
488
|
+
const status = await inspectFoundationMode(consumerPath);
|
|
489
|
+
if (status.mode !== "REGISTRY") {
|
|
490
|
+
throw new FoundationError("REGISTRY_MODE_REQUIRED", `Registry foundation mode required: ${status.issues.join(" ") || status.mode}`);
|
|
491
|
+
}
|
|
492
|
+
return status;
|
|
493
|
+
}
|
|
494
|
+
async assertDevOnly(consumerPath) {
|
|
495
|
+
const consumerRoot = await realpath(resolve(consumerPath));
|
|
496
|
+
const status = await inspectFoundationDevOnly(consumerRoot);
|
|
497
|
+
if (status.issues.length > 0) {
|
|
498
|
+
throw new FoundationError("CONSUMER_INVALID", `Development-only foundation dependency required: ${status.issues.join(" ")}`);
|
|
499
|
+
}
|
|
500
|
+
return status;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/local-mode/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export declare const FOUNDATION_PACKAGE_NAME: "@agent-teams/engineering-foundation";
|
|
2
|
+
export declare const LOCAL_STATE_DIRECTORY: ".agent-teams-local";
|
|
3
|
+
export declare const LOCAL_STATE_FILE: "foundation-link.json";
|
|
4
|
+
export declare const LOCAL_REGISTRY_BACKUP: "foundation-registry-backup";
|
|
5
|
+
export declare const LOCAL_OPERATION_LOCK: "foundation-operation.lock";
|
|
6
|
+
export declare const FOUNDATION_LOCAL_MODE_PROTOCOL_VERSION: 1;
|
|
7
|
+
export type FoundationMode = "INVALID" | "LOCAL" | "REGISTRY";
|
|
8
|
+
export type FoundationLinkPhase = "ATTACHING" | "DETACHING" | "LOCAL";
|
|
9
|
+
export interface FoundationLinkState {
|
|
10
|
+
readonly schemaVersion: 1;
|
|
11
|
+
readonly phase: FoundationLinkPhase;
|
|
12
|
+
readonly consumerRoot: string;
|
|
13
|
+
readonly targetPackageRoot: string;
|
|
14
|
+
readonly registryBackupPath: string;
|
|
15
|
+
readonly registryEntryKind: "directory" | "symbolic-link";
|
|
16
|
+
readonly registryPackageRoot: string;
|
|
17
|
+
readonly packageVersion: string;
|
|
18
|
+
readonly gitCommit: string;
|
|
19
|
+
readonly gitDirty: boolean;
|
|
20
|
+
readonly attachedAt: string;
|
|
21
|
+
}
|
|
22
|
+
export interface FoundationStatus {
|
|
23
|
+
readonly mode: FoundationMode;
|
|
24
|
+
readonly consumerRoot: string;
|
|
25
|
+
readonly dependencySpec?: string;
|
|
26
|
+
readonly installedPackageRoot?: string;
|
|
27
|
+
readonly installedVersion?: string;
|
|
28
|
+
readonly lockfilePath?: string;
|
|
29
|
+
readonly lockfilePackageKey?: string;
|
|
30
|
+
readonly registryIntegrity?: string;
|
|
31
|
+
readonly linkState?: FoundationLinkState;
|
|
32
|
+
readonly sourceGitCommit?: string;
|
|
33
|
+
readonly sourceGitDirty?: boolean;
|
|
34
|
+
readonly issues: readonly string[];
|
|
35
|
+
}
|
|
36
|
+
export interface FoundationDevOnlyStatus {
|
|
37
|
+
readonly consumerRoot: string;
|
|
38
|
+
readonly dependencySpec?: string;
|
|
39
|
+
readonly issues: readonly string[];
|
|
40
|
+
}
|
|
41
|
+
export interface FoundationRegistryProvenance {
|
|
42
|
+
readonly lockfilePath: string;
|
|
43
|
+
readonly packageKey: string;
|
|
44
|
+
readonly integrity: string;
|
|
45
|
+
}
|
|
46
|
+
export interface AttachResult {
|
|
47
|
+
readonly status: FoundationStatus;
|
|
48
|
+
readonly targetPackageRoot: string;
|
|
49
|
+
}
|
|
50
|
+
export interface ProcessRequest {
|
|
51
|
+
readonly command: string;
|
|
52
|
+
readonly args: readonly string[];
|
|
53
|
+
readonly cwd: string;
|
|
54
|
+
}
|
|
55
|
+
export interface ProcessResult {
|
|
56
|
+
readonly stdout: string;
|
|
57
|
+
readonly stderr: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ProcessRunner {
|
|
60
|
+
run(request: ProcessRequest): Promise<ProcessResult>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/local-mode/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const FOUNDATION_PACKAGE_NAME = "@agent-teams/engineering-foundation";
|
|
2
|
+
export const LOCAL_STATE_DIRECTORY = ".agent-teams-local";
|
|
3
|
+
export const LOCAL_STATE_FILE = "foundation-link.json";
|
|
4
|
+
export const LOCAL_REGISTRY_BACKUP = "foundation-registry-backup";
|
|
5
|
+
export const LOCAL_OPERATION_LOCK = "foundation-operation.lock";
|
|
6
|
+
export const FOUNDATION_LOCAL_MODE_PROTOCOL_VERSION = 1;
|
|
7
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/local-mode/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAClC,qCAA8C,CAAC;AACjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,oBAA6B,CAAC;AACnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAA+B,CAAC;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAG,4BAAqC,CAAC;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAAoC,CAAC;AACzE,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAU,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FOUNDATION_PACKAGE_NAME } from "./local-mode/types.js";
|
|
2
|
+
export declare const FOUNDATION_METADATA_SCHEMA_VERSION: 1;
|
|
3
|
+
export interface FoundationPackageSelfCheck {
|
|
4
|
+
readonly ok: true;
|
|
5
|
+
readonly metadataSchemaVersion: typeof FOUNDATION_METADATA_SCHEMA_VERSION;
|
|
6
|
+
readonly packageName: typeof FOUNDATION_PACKAGE_NAME;
|
|
7
|
+
readonly packageVersion: string;
|
|
8
|
+
readonly localModeProtocolVersion: number;
|
|
9
|
+
readonly compatibleLocalModeProtocolVersions: readonly number[];
|
|
10
|
+
readonly exportPaths: readonly string[];
|
|
11
|
+
readonly runtimeDependencies: Readonly<Record<string, string>>;
|
|
12
|
+
}
|
|
13
|
+
export declare function inspectFoundationPackage(packageRoot: string): Promise<FoundationPackageSelfCheck>;
|
|
14
|
+
export declare function parseFoundationPackageSelfCheck(value: unknown): FoundationPackageSelfCheck;
|
|
15
|
+
//# sourceMappingURL=package-self-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-self-check.d.ts","sourceRoot":"","sources":["../src/package-self-check.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,kCAAkC,EAAG,CAAU,CAAC;AAE7D,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,qBAAqB,EAAE,OAAO,kCAAkC,CAAC;IAC1E,QAAQ,CAAC,WAAW,EAAE,OAAO,uBAAuB,CAAC;IACrD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,mCAAmC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAChE;AA8GD,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,0BAA0B,CAAC,CAkIrC;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,OAAO,GACb,0BAA0B,CA0B5B"}
|