@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,227 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { parseDocument } from "yaml";
|
|
4
|
+
import { FOUNDATION_PACKAGE_NAME } from "./types.js";
|
|
5
|
+
const EXACT_SEMVER_PATTERN = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
|
|
6
|
+
const SHA512_INTEGRITY_PATTERN = /^sha512-[A-Za-z0-9+/]+={0,2}$/;
|
|
7
|
+
const RUNTIME_DEPENDENCY_FIELDS = [
|
|
8
|
+
"dependencies",
|
|
9
|
+
"optionalDependencies",
|
|
10
|
+
"peerDependencies"
|
|
11
|
+
];
|
|
12
|
+
function isRecord(value) {
|
|
13
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
14
|
+
}
|
|
15
|
+
function dependencyValue(container, dependencyName) {
|
|
16
|
+
return isRecord(container) ? container[dependencyName] : undefined;
|
|
17
|
+
}
|
|
18
|
+
function targetsFoundation(value) {
|
|
19
|
+
if (!isRecord(value)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return Object.keys(value).some((key) => key.includes(FOUNDATION_PACKAGE_NAME));
|
|
23
|
+
}
|
|
24
|
+
function hasBundledFoundation(value) {
|
|
25
|
+
return (Array.isArray(value) &&
|
|
26
|
+
value.some((candidate) => candidate === FOUNDATION_PACKAGE_NAME));
|
|
27
|
+
}
|
|
28
|
+
async function readJson(path) {
|
|
29
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
30
|
+
}
|
|
31
|
+
export function isExactVersion(value) {
|
|
32
|
+
return EXACT_SEMVER_PATTERN.test(value);
|
|
33
|
+
}
|
|
34
|
+
export async function inspectFoundationDevOnly(consumerRoot) {
|
|
35
|
+
const issues = [];
|
|
36
|
+
let manifest;
|
|
37
|
+
try {
|
|
38
|
+
const candidate = await readJson(join(consumerRoot, "package.json"));
|
|
39
|
+
if (isRecord(candidate)) {
|
|
40
|
+
manifest = candidate;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
issues.push("Consumer package.json must contain an object.");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
issues.push("Consumer package.json cannot be read.");
|
|
48
|
+
}
|
|
49
|
+
const dependencyCandidate = dependencyValue(manifest?.devDependencies, FOUNDATION_PACKAGE_NAME);
|
|
50
|
+
const dependencySpec = typeof dependencyCandidate === "string" ? dependencyCandidate : undefined;
|
|
51
|
+
if (dependencySpec === undefined) {
|
|
52
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must be declared in devDependencies.`);
|
|
53
|
+
}
|
|
54
|
+
else if (!isExactVersion(dependencySpec)) {
|
|
55
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must use an exact registry version.`);
|
|
56
|
+
}
|
|
57
|
+
for (const field of RUNTIME_DEPENDENCY_FIELDS) {
|
|
58
|
+
if (dependencyValue(manifest?.[field], FOUNDATION_PACKAGE_NAME) !== undefined) {
|
|
59
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must not be declared in ${field}.`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (hasBundledFoundation(manifest?.bundleDependencies) ||
|
|
63
|
+
hasBundledFoundation(manifest?.bundledDependencies)) {
|
|
64
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must not be bundled for runtime.`);
|
|
65
|
+
}
|
|
66
|
+
if (targetsFoundation(manifest?.overrides)) {
|
|
67
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must not use npm overrides.`);
|
|
68
|
+
}
|
|
69
|
+
if (targetsFoundation(manifest?.resolutions)) {
|
|
70
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must not use dependency resolutions.`);
|
|
71
|
+
}
|
|
72
|
+
if (isRecord(manifest?.pnpm)) {
|
|
73
|
+
if (targetsFoundation(manifest.pnpm.overrides)) {
|
|
74
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must not use pnpm overrides.`);
|
|
75
|
+
}
|
|
76
|
+
if (targetsFoundation(manifest.pnpm.patchedDependencies)) {
|
|
77
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must not use pnpm patches.`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const packageManager = typeof manifest?.packageManager === "string"
|
|
81
|
+
? manifest.packageManager
|
|
82
|
+
: undefined;
|
|
83
|
+
if (packageManager === undefined ||
|
|
84
|
+
!/^pnpm@11\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u.test(packageManager)) {
|
|
85
|
+
issues.push("Consumer packageManager must pin an exact pnpm 11 version.");
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
consumerRoot,
|
|
89
|
+
...(dependencySpec === undefined ? {} : { dependencySpec }),
|
|
90
|
+
...(packageManager === undefined ? {} : { packageManager }),
|
|
91
|
+
issues
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function readLockfileObject(source) {
|
|
95
|
+
const document = parseDocument(source, {
|
|
96
|
+
uniqueKeys: true
|
|
97
|
+
});
|
|
98
|
+
if (document.errors.length > 0) {
|
|
99
|
+
throw new Error(document.errors.map((error) => error.message).join("; "));
|
|
100
|
+
}
|
|
101
|
+
const value = document.toJS({ maxAliasCount: 0 });
|
|
102
|
+
if (!isRecord(value)) {
|
|
103
|
+
throw new Error("pnpm-lock.yaml must contain an object.");
|
|
104
|
+
}
|
|
105
|
+
return value;
|
|
106
|
+
}
|
|
107
|
+
export async function inspectFoundationRegistryProvenance(consumerRoot, dependencySpec) {
|
|
108
|
+
const inspectLockfile = (lockfile, source) => {
|
|
109
|
+
const issues = [];
|
|
110
|
+
if (lockfile.lockfileVersion !== "9.0") {
|
|
111
|
+
issues.push(`${source} must use pnpm lockfileVersion 9.0.`);
|
|
112
|
+
}
|
|
113
|
+
if (targetsFoundation(lockfile.overrides)) {
|
|
114
|
+
issues.push(`${source} must not use lockfile overrides.`);
|
|
115
|
+
}
|
|
116
|
+
if (targetsFoundation(lockfile.patchedDependencies)) {
|
|
117
|
+
issues.push(`${source} must not use lockfile patches.`);
|
|
118
|
+
}
|
|
119
|
+
const rootImporter = isRecord(lockfile.importers)
|
|
120
|
+
? lockfile.importers["."]
|
|
121
|
+
: undefined;
|
|
122
|
+
if (!isRecord(rootImporter)) {
|
|
123
|
+
issues.push(`${source} must contain the root importer.`);
|
|
124
|
+
return { issues };
|
|
125
|
+
}
|
|
126
|
+
for (const field of RUNTIME_DEPENDENCY_FIELDS) {
|
|
127
|
+
if (dependencyValue(rootImporter[field], FOUNDATION_PACKAGE_NAME) !==
|
|
128
|
+
undefined) {
|
|
129
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must not resolve through ${source} ${field}.`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const lockedDependency = dependencyValue(rootImporter.devDependencies, FOUNDATION_PACKAGE_NAME);
|
|
133
|
+
if (!isRecord(lockedDependency)) {
|
|
134
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must be locked in ${source} root devDependencies.`);
|
|
135
|
+
return { issues };
|
|
136
|
+
}
|
|
137
|
+
if (dependencySpec === undefined ||
|
|
138
|
+
lockedDependency.specifier !== dependencySpec ||
|
|
139
|
+
lockedDependency.version !== dependencySpec) {
|
|
140
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} ${source} specifier and version must equal the exact manifest version.`);
|
|
141
|
+
return { issues };
|
|
142
|
+
}
|
|
143
|
+
const packageKey = `${FOUNDATION_PACKAGE_NAME}@${dependencySpec}`;
|
|
144
|
+
const packageEntry = isRecord(lockfile.packages)
|
|
145
|
+
? lockfile.packages[packageKey]
|
|
146
|
+
: undefined;
|
|
147
|
+
if (!isRecord(packageEntry) || !isRecord(packageEntry.resolution)) {
|
|
148
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must have an npm registry package entry in ${source}.`);
|
|
149
|
+
return { issues };
|
|
150
|
+
}
|
|
151
|
+
const resolution = packageEntry.resolution;
|
|
152
|
+
const integrity = typeof resolution.integrity === "string"
|
|
153
|
+
? resolution.integrity
|
|
154
|
+
: undefined;
|
|
155
|
+
if (integrity === undefined || !SHA512_INTEGRITY_PATTERN.test(integrity)) {
|
|
156
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} ${source} entry must contain sha512 registry integrity.`);
|
|
157
|
+
}
|
|
158
|
+
const tarball = typeof resolution.tarball === "string" ? resolution.tarball : undefined;
|
|
159
|
+
if (tarball !== undefined &&
|
|
160
|
+
!tarball.startsWith("https://registry.npmjs.org/")) {
|
|
161
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} ${source} tarball must come from registry.npmjs.org.`);
|
|
162
|
+
}
|
|
163
|
+
for (const forbiddenField of [
|
|
164
|
+
"commit",
|
|
165
|
+
"directory",
|
|
166
|
+
"path",
|
|
167
|
+
"repo",
|
|
168
|
+
"type"
|
|
169
|
+
]) {
|
|
170
|
+
if (resolution[forbiddenField] !== undefined) {
|
|
171
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} ${source} resolution contains forbidden field ${forbiddenField}.`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (!isRecord(lockfile.snapshots) ||
|
|
175
|
+
!isRecord(lockfile.snapshots[packageKey])) {
|
|
176
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} must have an exact snapshot entry in ${source}.`);
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
...(packageKey === undefined ? {} : { packageKey }),
|
|
180
|
+
...(integrity === undefined ? {} : { integrity }),
|
|
181
|
+
issues
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
const issues = [];
|
|
185
|
+
const lockfilePath = join(consumerRoot, "pnpm-lock.yaml");
|
|
186
|
+
let lockfile;
|
|
187
|
+
try {
|
|
188
|
+
lockfile = readLockfileObject(await readFile(lockfilePath, "utf8"));
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return {
|
|
192
|
+
issues: ["Consumer pnpm-lock.yaml cannot be parsed safely."]
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const rootProvenance = inspectLockfile(lockfile, "consumer pnpm-lock.yaml");
|
|
196
|
+
issues.push(...rootProvenance.issues);
|
|
197
|
+
const virtualStoreLockfilePath = join(consumerRoot, "node_modules", ".pnpm", "lock.yaml");
|
|
198
|
+
let virtualStoreLockfile;
|
|
199
|
+
try {
|
|
200
|
+
virtualStoreLockfile = readLockfileObject(await readFile(virtualStoreLockfilePath, "utf8"));
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
issues.push("Installed pnpm virtual-store lockfile cannot be parsed safely.");
|
|
204
|
+
return { issues };
|
|
205
|
+
}
|
|
206
|
+
const installedProvenance = inspectLockfile(virtualStoreLockfile, "installed pnpm virtual-store lockfile");
|
|
207
|
+
issues.push(...installedProvenance.issues);
|
|
208
|
+
if (rootProvenance.packageKey !== installedProvenance.packageKey ||
|
|
209
|
+
rootProvenance.integrity !== installedProvenance.integrity) {
|
|
210
|
+
issues.push(`${FOUNDATION_PACKAGE_NAME} root and installed pnpm lockfile provenance must match.`);
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
...(issues.length === 0 &&
|
|
214
|
+
rootProvenance.packageKey !== undefined &&
|
|
215
|
+
rootProvenance.integrity !== undefined
|
|
216
|
+
? {
|
|
217
|
+
provenance: {
|
|
218
|
+
lockfilePath,
|
|
219
|
+
packageKey: rootProvenance.packageKey,
|
|
220
|
+
integrity: rootProvenance.integrity
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
: {}),
|
|
224
|
+
issues
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=consumer-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumer-policy.js","sourceRoot":"","sources":["../../src/local-mode/consumer-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { inspectFoundationDevOnly, inspectFoundationMode, inspectFoundationRegistryProvenance, isExactVersion } from "./inspection.js";
|
|
2
|
+
export { NodeProcessRunner } from "./process-runner.js";
|
|
3
|
+
export { FoundationLocalModeService } from "./service.js";
|
|
4
|
+
export type { FoundationLocalModeServiceOptions } from "./service.js";
|
|
5
|
+
export { FOUNDATION_PACKAGE_NAME, FOUNDATION_LOCAL_MODE_PROTOCOL_VERSION, LOCAL_OPERATION_LOCK, LOCAL_REGISTRY_BACKUP, LOCAL_STATE_DIRECTORY, LOCAL_STATE_FILE } from "./types.js";
|
|
6
|
+
export type { AttachResult, FoundationDevOnlyStatus, FoundationLinkPhase, FoundationLinkState, FoundationMode, FoundationRegistryProvenance, FoundationStatus, ProcessRequest, ProcessResult, ProcessRunner } from "./types.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/local-mode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,mCAAmC,EACnC,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,YAAY,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,sCAAsC,EACtC,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,4BAA4B,EAC5B,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { inspectFoundationDevOnly, inspectFoundationMode, inspectFoundationRegistryProvenance, isExactVersion } from "./inspection.js";
|
|
2
|
+
export { NodeProcessRunner } from "./process-runner.js";
|
|
3
|
+
export { FoundationLocalModeService } from "./service.js";
|
|
4
|
+
export { FOUNDATION_PACKAGE_NAME, FOUNDATION_LOCAL_MODE_PROTOCOL_VERSION, LOCAL_OPERATION_LOCK, LOCAL_REGISTRY_BACKUP, LOCAL_STATE_DIRECTORY, LOCAL_STATE_FILE } from "./types.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/local-mode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,mCAAmC,EACnC,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EACL,uBAAuB,EACvB,sCAAsC,EACtC,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FoundationStatus } from "./types.js";
|
|
2
|
+
export declare function inspectFoundationMode(consumerPath: string, options?: {
|
|
3
|
+
readonly ignoreOperationLock?: boolean;
|
|
4
|
+
}): Promise<FoundationStatus>;
|
|
5
|
+
export { inspectFoundationDevOnly, inspectFoundationRegistryProvenance } from "./consumer-policy.js";
|
|
6
|
+
export { isExactVersion } from "./consumer-policy.js";
|
|
7
|
+
//# sourceMappingURL=inspection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspection.d.ts","sourceRoot":"","sources":["../../src/local-mode/inspection.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAyFpB,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAO,GACvD,OAAO,CAAC,gBAAgB,CAAC,CAgN3B;AAED,OAAO,EACL,wBAAwB,EACxB,mCAAmC,EACpC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { lstat, readFile, readdir, realpath } from "node:fs/promises";
|
|
2
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
3
|
+
import { inspectFoundationDevOnly, inspectFoundationRegistryProvenance } from "./consumer-policy.js";
|
|
4
|
+
import { FOUNDATION_PACKAGE_NAME, LOCAL_OPERATION_LOCK, LOCAL_REGISTRY_BACKUP, LOCAL_STATE_DIRECTORY, LOCAL_STATE_FILE } from "./types.js";
|
|
5
|
+
async function readJson(path) {
|
|
6
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
7
|
+
}
|
|
8
|
+
function isRecord(value) {
|
|
9
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
function parseLinkState(value) {
|
|
12
|
+
if (!isRecord(value) ||
|
|
13
|
+
value.schemaVersion !== 1 ||
|
|
14
|
+
!["ATTACHING", "DETACHING", "LOCAL"].includes(typeof value.phase === "string" ? value.phase : "") ||
|
|
15
|
+
typeof value.consumerRoot !== "string" ||
|
|
16
|
+
typeof value.targetPackageRoot !== "string" ||
|
|
17
|
+
typeof value.registryBackupPath !== "string" ||
|
|
18
|
+
!["directory", "symbolic-link"].includes(typeof value.registryEntryKind === "string"
|
|
19
|
+
? value.registryEntryKind
|
|
20
|
+
: "") ||
|
|
21
|
+
typeof value.registryPackageRoot !== "string" ||
|
|
22
|
+
typeof value.packageVersion !== "string" ||
|
|
23
|
+
typeof value.gitCommit !== "string" ||
|
|
24
|
+
typeof value.gitDirty !== "boolean" ||
|
|
25
|
+
typeof value.attachedAt !== "string") {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
schemaVersion: 1,
|
|
30
|
+
phase: value.phase,
|
|
31
|
+
consumerRoot: value.consumerRoot,
|
|
32
|
+
targetPackageRoot: value.targetPackageRoot,
|
|
33
|
+
registryBackupPath: value.registryBackupPath,
|
|
34
|
+
registryEntryKind: value.registryEntryKind,
|
|
35
|
+
registryPackageRoot: value.registryPackageRoot,
|
|
36
|
+
packageVersion: value.packageVersion,
|
|
37
|
+
gitCommit: value.gitCommit,
|
|
38
|
+
gitDirty: value.gitDirty,
|
|
39
|
+
attachedAt: value.attachedAt
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async function readOptionalLinkState(consumerRoot, issues) {
|
|
43
|
+
const path = join(consumerRoot, LOCAL_STATE_DIRECTORY, LOCAL_STATE_FILE);
|
|
44
|
+
try {
|
|
45
|
+
const state = parseLinkState(await readJson(path));
|
|
46
|
+
if (state === undefined) {
|
|
47
|
+
issues.push("Local foundation state exists but is invalid.");
|
|
48
|
+
}
|
|
49
|
+
return state;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof Error &&
|
|
53
|
+
"code" in error &&
|
|
54
|
+
error.code === "ENOENT") {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
issues.push("Local foundation state cannot be read.");
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function isWithin(parent, candidate) {
|
|
62
|
+
const path = relative(parent, candidate);
|
|
63
|
+
return path === "" || (!path.startsWith(`..${sep}`) && path !== ".." && !isAbsolute(path));
|
|
64
|
+
}
|
|
65
|
+
export async function inspectFoundationMode(consumerPath, options = {}) {
|
|
66
|
+
const consumerRoot = await realpath(resolve(consumerPath));
|
|
67
|
+
const issues = [];
|
|
68
|
+
const localStateDirectory = join(consumerRoot, LOCAL_STATE_DIRECTORY);
|
|
69
|
+
let localStateDirectoryIsSafe = true;
|
|
70
|
+
let localStateDirectoryExists = false;
|
|
71
|
+
try {
|
|
72
|
+
const stateEntry = await lstat(localStateDirectory);
|
|
73
|
+
localStateDirectoryExists = true;
|
|
74
|
+
if (!stateEntry.isDirectory() ||
|
|
75
|
+
stateEntry.isSymbolicLink() ||
|
|
76
|
+
(await realpath(localStateDirectory)) !== localStateDirectory) {
|
|
77
|
+
localStateDirectoryIsSafe = false;
|
|
78
|
+
issues.push("Local foundation state path must be a real consumer-owned directory.");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
if (!(error instanceof Error &&
|
|
83
|
+
"code" in error &&
|
|
84
|
+
error.code === "ENOENT")) {
|
|
85
|
+
localStateDirectoryIsSafe = false;
|
|
86
|
+
issues.push("Local foundation state directory cannot be inspected.");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
let localEntries = [];
|
|
90
|
+
if (localStateDirectoryExists && localStateDirectoryIsSafe) {
|
|
91
|
+
try {
|
|
92
|
+
localEntries = await readdir(localStateDirectory);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (!(error instanceof Error &&
|
|
96
|
+
"code" in error &&
|
|
97
|
+
error.code === "ENOENT")) {
|
|
98
|
+
issues.push("Local foundation state directory cannot be read.");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (options.ignoreOperationLock !== true &&
|
|
103
|
+
localEntries.includes(LOCAL_OPERATION_LOCK)) {
|
|
104
|
+
issues.push("A foundation operation is currently active or interrupted.");
|
|
105
|
+
}
|
|
106
|
+
if (localEntries.some((entry) => entry.startsWith(`${LOCAL_STATE_FILE}.`) && entry.endsWith(".tmp"))) {
|
|
107
|
+
issues.push("An incomplete foundation state write requires recovery.");
|
|
108
|
+
}
|
|
109
|
+
const dependencyPolicy = await inspectFoundationDevOnly(consumerRoot);
|
|
110
|
+
issues.push(...dependencyPolicy.issues);
|
|
111
|
+
const dependencySpec = dependencyPolicy.dependencySpec;
|
|
112
|
+
const provenance = await inspectFoundationRegistryProvenance(consumerRoot, dependencySpec);
|
|
113
|
+
issues.push(...provenance.issues);
|
|
114
|
+
let installedPackageRoot;
|
|
115
|
+
let installedVersion;
|
|
116
|
+
try {
|
|
117
|
+
installedPackageRoot = await realpath(join(consumerRoot, "node_modules", FOUNDATION_PACKAGE_NAME));
|
|
118
|
+
const installedManifest = await readJson(join(installedPackageRoot, "package.json"));
|
|
119
|
+
if (isRecord(installedManifest) &&
|
|
120
|
+
installedManifest.name === FOUNDATION_PACKAGE_NAME &&
|
|
121
|
+
typeof installedManifest.version === "string") {
|
|
122
|
+
installedVersion = installedManifest.version;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
issues.push("Installed foundation package identity or version is invalid.");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
issues.push("Installed foundation package cannot be resolved.");
|
|
130
|
+
}
|
|
131
|
+
const linkState = localStateDirectoryIsSafe
|
|
132
|
+
? await readOptionalLinkState(consumerRoot, issues)
|
|
133
|
+
: undefined;
|
|
134
|
+
if (linkState !== undefined) {
|
|
135
|
+
const expectedBackupPath = join(consumerRoot, LOCAL_STATE_DIRECTORY, LOCAL_REGISTRY_BACKUP);
|
|
136
|
+
if (resolve(linkState.registryBackupPath) !== expectedBackupPath) {
|
|
137
|
+
issues.push("Local state registry backup path is invalid.");
|
|
138
|
+
}
|
|
139
|
+
if (!isWithin(join(consumerRoot, "node_modules"), resolve(linkState.registryPackageRoot))) {
|
|
140
|
+
issues.push("Local state registry package root is outside node_modules.");
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const expectedBackupRoot = linkState.registryEntryKind === "symbolic-link"
|
|
144
|
+
? resolve(linkState.registryPackageRoot)
|
|
145
|
+
: expectedBackupPath;
|
|
146
|
+
if ((await realpath(expectedBackupPath)) !== expectedBackupRoot) {
|
|
147
|
+
issues.push("Registry backup does not match local state.");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
issues.push("Registry backup cannot be resolved.");
|
|
152
|
+
}
|
|
153
|
+
if (linkState.phase !== "LOCAL") {
|
|
154
|
+
issues.push(`Local foundation operation is incomplete: ${linkState.phase}.`);
|
|
155
|
+
}
|
|
156
|
+
if (resolve(linkState.consumerRoot) !== consumerRoot) {
|
|
157
|
+
issues.push("Local state belongs to a different consumer root.");
|
|
158
|
+
}
|
|
159
|
+
if (installedPackageRoot === undefined ||
|
|
160
|
+
resolve(linkState.targetPackageRoot) !== installedPackageRoot) {
|
|
161
|
+
issues.push("Installed foundation path does not match local state.");
|
|
162
|
+
}
|
|
163
|
+
if (installedVersion !== undefined &&
|
|
164
|
+
linkState.packageVersion !== installedVersion) {
|
|
165
|
+
issues.push("Installed foundation version does not match local state.");
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
mode: issues.length === 0 ? "LOCAL" : "INVALID",
|
|
169
|
+
consumerRoot,
|
|
170
|
+
...(dependencySpec === undefined ? {} : { dependencySpec }),
|
|
171
|
+
...(installedPackageRoot === undefined ? {} : { installedPackageRoot }),
|
|
172
|
+
...(installedVersion === undefined ? {} : { installedVersion }),
|
|
173
|
+
...(provenance.provenance === undefined
|
|
174
|
+
? {}
|
|
175
|
+
: {
|
|
176
|
+
lockfilePath: provenance.provenance.lockfilePath,
|
|
177
|
+
lockfilePackageKey: provenance.provenance.packageKey,
|
|
178
|
+
registryIntegrity: provenance.provenance.integrity
|
|
179
|
+
}),
|
|
180
|
+
linkState,
|
|
181
|
+
issues
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
if (localStateDirectoryIsSafe) {
|
|
185
|
+
try {
|
|
186
|
+
await lstat(join(consumerRoot, LOCAL_STATE_DIRECTORY, LOCAL_REGISTRY_BACKUP));
|
|
187
|
+
issues.push("An orphan registry backup requires detach recovery.");
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
if (!(error instanceof Error &&
|
|
191
|
+
"code" in error &&
|
|
192
|
+
error.code === "ENOENT")) {
|
|
193
|
+
issues.push("Registry backup state cannot be inspected.");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (installedPackageRoot !== undefined &&
|
|
198
|
+
!isWithin(join(consumerRoot, "node_modules"), installedPackageRoot)) {
|
|
199
|
+
issues.push("Foundation resolves outside consumer node_modules without local state.");
|
|
200
|
+
}
|
|
201
|
+
if (dependencySpec !== undefined &&
|
|
202
|
+
installedVersion !== undefined &&
|
|
203
|
+
dependencySpec !== installedVersion) {
|
|
204
|
+
issues.push("Installed foundation version differs from the manifest version.");
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
mode: issues.length === 0 ? "REGISTRY" : "INVALID",
|
|
208
|
+
consumerRoot,
|
|
209
|
+
...(dependencySpec === undefined ? {} : { dependencySpec }),
|
|
210
|
+
...(installedPackageRoot === undefined ? {} : { installedPackageRoot }),
|
|
211
|
+
...(installedVersion === undefined ? {} : { installedVersion }),
|
|
212
|
+
...(provenance.provenance === undefined
|
|
213
|
+
? {}
|
|
214
|
+
: {
|
|
215
|
+
lockfilePath: provenance.provenance.lockfilePath,
|
|
216
|
+
lockfilePackageKey: provenance.provenance.packageKey,
|
|
217
|
+
registryIntegrity: provenance.provenance.integrity
|
|
218
|
+
}),
|
|
219
|
+
issues
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
export { inspectFoundationDevOnly, inspectFoundationRegistryProvenance } from "./consumer-policy.js";
|
|
223
|
+
export { isExactVersion } from "./consumer-policy.js";
|
|
224
|
+
//# sourceMappingURL=inspection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspection.js","sourceRoot":"","sources":["../../src/local-mode/inspection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-runner.d.ts","sourceRoot":"","sources":["../../src/local-mode/process-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,iBAAkB,YAAW,aAAa;IAC/C,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAyBzD;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { FoundationError } from "../errors.js";
|
|
3
|
+
export class NodeProcessRunner {
|
|
4
|
+
async run(request) {
|
|
5
|
+
return await new Promise((resolve, reject) => {
|
|
6
|
+
execFile(request.command, [...request.args], {
|
|
7
|
+
cwd: request.cwd,
|
|
8
|
+
encoding: "utf8",
|
|
9
|
+
maxBuffer: 4 * 1024 * 1024
|
|
10
|
+
}, (error, stdout, stderr) => {
|
|
11
|
+
if (error !== null) {
|
|
12
|
+
reject(new FoundationError("PROCESS_FAILED", `${request.command} ${request.args.join(" ")} failed: ${stderr.trim() || error.message}`, { cause: error }));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
resolve({ stdout, stderr });
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=process-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-runner.js","sourceRoot":"","sources":["../../src/local-mode/process-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAO/C,MAAM,OAAO,iBAAiB;IAC5B,KAAK,CAAC,GAAG,CAAC,OAAuB;QAC/B,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,QAAQ,CACN,OAAO,CAAC,OAAO,EACf,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,EACjB;gBACE,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ,EAAE,MAAM;gBAChB,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;aAC3B,EACD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACxB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,MAAM,CACJ,IAAI,eAAe,CACjB,gBAAgB,EAChB,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,EACxF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CACF,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9B,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AttachResult, FoundationDevOnlyStatus, FoundationStatus, ProcessRunner } from "./types.js";
|
|
2
|
+
export interface FoundationLocalModeServiceOptions {
|
|
3
|
+
readonly runner: ProcessRunner;
|
|
4
|
+
readonly now?: () => Date;
|
|
5
|
+
}
|
|
6
|
+
export declare function acquireFoundationOperationLock(consumerRoot: string): Promise<() => Promise<void>>;
|
|
7
|
+
export declare class FoundationLocalModeService {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(options: FoundationLocalModeServiceOptions);
|
|
10
|
+
status(consumerPath: string): Promise<FoundationStatus>;
|
|
11
|
+
attach(consumerPath: string, targetPath: string): Promise<AttachResult>;
|
|
12
|
+
detach(consumerPath: string): Promise<FoundationStatus>;
|
|
13
|
+
assertRegistry(consumerPath: string): Promise<FoundationStatus>;
|
|
14
|
+
assertDevOnly(consumerPath: string): Promise<FoundationDevOnlyStatus>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/local-mode/service.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EACV,YAAY,EACZ,uBAAuB,EAEvB,gBAAgB,EAChB,aAAa,EACd,MAAM,YAAY,CAAC;AAcpB,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAmPD,wBAAsB,8BAA8B,CAClD,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAmC9B;AAED,qBAAa,0BAA0B;;IAIrC,YAAY,OAAO,EAAE,iCAAiC,EAGrD;IA4HK,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE5D;IAEK,MAAM,CACV,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,CA2NvB;IAEK,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6C5D;IAEK,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CASpE;IAEK,aAAa,CACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,uBAAuB,CAAC,CAUlC;CACF"}
|