@agent-teams/engineering-foundation 0.4.1 → 0.5.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/README.md +22 -0
- package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.js +12 -2
- package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.js.map +1 -1
- package/dist/capabilities/repository-agent-workflow/adapters/inbound/cli/report-renderer.d.ts +3 -0
- package/dist/capabilities/repository-agent-workflow/adapters/inbound/cli/report-renderer.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/adapters/inbound/cli/report-renderer.js +26 -0
- package/dist/capabilities/repository-agent-workflow/adapters/inbound/cli/report-renderer.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/filesystem/filesystem-repository-agent-workflow-reader.d.ts +6 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/filesystem/filesystem-repository-agent-workflow-reader.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/filesystem/filesystem-repository-agent-workflow-reader.js +81 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/filesystem/filesystem-repository-agent-workflow-reader.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/git/git-repository-changes-reader.d.ts +15 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/git/git-repository-changes-reader.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/git/git-repository-changes-reader.js +153 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/git/git-repository-changes-reader.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/pnpm/pnpm-package-script-runner.d.ts +17 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/pnpm/pnpm-package-script-runner.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/pnpm/pnpm-package-script-runner.js +70 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/pnpm/pnpm-package-script-runner.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/process/process-execution.d.ts +10 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/process/process-execution.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/process/process-execution.js +30 -0
- package/dist/capabilities/repository-agent-workflow/adapters/outbound/process/process-execution.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/model/changed-workflow.d.ts +36 -0
- package/dist/capabilities/repository-agent-workflow/application/model/changed-workflow.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/model/changed-workflow.js +2 -0
- package/dist/capabilities/repository-agent-workflow/application/model/changed-workflow.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/model/repository-agent-workflow.d.ts +34 -0
- package/dist/capabilities/repository-agent-workflow/application/model/repository-agent-workflow.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/model/repository-agent-workflow.js +2 -0
- package/dist/capabilities/repository-agent-workflow/application/model/repository-agent-workflow.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/policies/evaluate-repository-agent-workflow.d.ts +4 -0
- package/dist/capabilities/repository-agent-workflow/application/policies/evaluate-repository-agent-workflow.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/policies/evaluate-repository-agent-workflow.js +131 -0
- package/dist/capabilities/repository-agent-workflow/application/policies/evaluate-repository-agent-workflow.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/ports/changed-workflow.d.ts +17 -0
- package/dist/capabilities/repository-agent-workflow/application/ports/changed-workflow.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/ports/changed-workflow.js +2 -0
- package/dist/capabilities/repository-agent-workflow/application/ports/changed-workflow.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/ports/repository-agent-workflow-reader.d.ts +5 -0
- package/dist/capabilities/repository-agent-workflow/application/ports/repository-agent-workflow-reader.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/ports/repository-agent-workflow-reader.js +2 -0
- package/dist/capabilities/repository-agent-workflow/application/ports/repository-agent-workflow-reader.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/rules.d.ts +8 -0
- package/dist/capabilities/repository-agent-workflow/application/rules.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/rules.js +35 -0
- package/dist/capabilities/repository-agent-workflow/application/rules.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/use-cases/analyze-repository-agent-workflow.d.ts +9 -0
- package/dist/capabilities/repository-agent-workflow/application/use-cases/analyze-repository-agent-workflow.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/use-cases/analyze-repository-agent-workflow.js +7 -0
- package/dist/capabilities/repository-agent-workflow/application/use-cases/analyze-repository-agent-workflow.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/use-cases/run-changed-agent-workflow.d.ts +4 -0
- package/dist/capabilities/repository-agent-workflow/application/use-cases/run-changed-agent-workflow.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/application/use-cases/run-changed-agent-workflow.js +79 -0
- package/dist/capabilities/repository-agent-workflow/application/use-cases/run-changed-agent-workflow.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/changed-command.d.ts +9 -0
- package/dist/capabilities/repository-agent-workflow/changed-command.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/changed-command.js +28 -0
- package/dist/capabilities/repository-agent-workflow/changed-command.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/contract/config.d.ts +5 -0
- package/dist/capabilities/repository-agent-workflow/contract/config.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/contract/config.js +121 -0
- package/dist/capabilities/repository-agent-workflow/contract/config.js.map +1 -0
- package/dist/capabilities/repository-agent-workflow/module.d.ts +5 -0
- package/dist/capabilities/repository-agent-workflow/module.d.ts.map +1 -0
- package/dist/capabilities/repository-agent-workflow/module.js +49 -0
- package/dist/capabilities/repository-agent-workflow/module.js.map +1 -0
- package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.d.ts.map +1 -1
- package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.js +150 -125
- package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.js.map +1 -1
- package/dist/capabilities/workspace-dependency-declarations/application/policies/evaluate-workspace-dependencies.d.ts.map +1 -1
- package/dist/capabilities/workspace-dependency-declarations/application/policies/evaluate-workspace-dependencies.js +9 -1
- package/dist/capabilities/workspace-dependency-declarations/application/policies/evaluate-workspace-dependencies.js.map +1 -1
- package/dist/cli-arguments.d.ts +12 -0
- package/dist/cli-arguments.d.ts.map +1 -0
- package/dist/cli-arguments.js +114 -0
- package/dist/cli-arguments.js.map +1 -0
- package/dist/cli.js +131 -125
- package/dist/cli.js.map +1 -1
- package/dist/composition/capability-registry.d.ts.map +1 -1
- package/dist/composition/capability-registry.js +2 -0
- package/dist/composition/capability-registry.js.map +1 -1
- package/dist/composition/rule-registry.d.ts.map +1 -1
- package/dist/composition/rule-registry.js +2 -0
- package/dist/composition/rule-registry.js.map +1 -1
- package/dist/foundation-config.d.ts +1 -1
- package/dist/foundation-config.d.ts.map +1 -1
- package/dist/foundation-config.js +2 -0
- package/dist/foundation-config.js.map +1 -1
- package/dist/local-mode/attach-transaction.d.ts +11 -0
- package/dist/local-mode/attach-transaction.d.ts.map +1 -0
- package/dist/local-mode/attach-transaction.js +176 -0
- package/dist/local-mode/attach-transaction.js.map +1 -0
- package/dist/local-mode/consumer-policy.d.ts +2 -3
- package/dist/local-mode/consumer-policy.d.ts.map +1 -1
- package/dist/local-mode/consumer-policy.js +102 -94
- package/dist/local-mode/consumer-policy.js.map +1 -1
- package/dist/local-mode/index.d.ts +1 -0
- package/dist/local-mode/index.d.ts.map +1 -1
- package/dist/local-mode/index.js.map +1 -1
- package/dist/local-mode/inspection.d.ts.map +1 -1
- package/dist/local-mode/inspection.js +126 -118
- package/dist/local-mode/inspection.js.map +1 -1
- package/dist/local-mode/local-state-store.d.ts +6 -0
- package/dist/local-mode/local-state-store.d.ts.map +1 -0
- package/dist/local-mode/local-state-store.js +138 -0
- package/dist/local-mode/local-state-store.js.map +1 -0
- package/dist/local-mode/registry-recovery.d.ts +5 -0
- package/dist/local-mode/registry-recovery.d.ts.map +1 -0
- package/dist/local-mode/registry-recovery.js +112 -0
- package/dist/local-mode/registry-recovery.js.map +1 -0
- package/dist/local-mode/service.d.ts +1 -1
- package/dist/local-mode/service.d.ts.map +1 -1
- package/dist/local-mode/service.js +14 -398
- package/dist/local-mode/service.js.map +1 -1
- package/dist/package-self-check.d.ts +1 -1
- package/dist/package-self-check.d.ts.map +1 -1
- package/dist/package-self-check.js +13 -1
- package/dist/package-self-check.js.map +1 -1
- package/dist/public-api-surface.d.ts +4 -0
- package/dist/public-api-surface.d.ts.map +1 -0
- package/dist/public-api-surface.js +4 -0
- package/dist/public-api-surface.js.map +1 -0
- package/dist/scaffolding/adapters/memory/memory-workspace.d.ts +9 -0
- package/dist/scaffolding/adapters/memory/memory-workspace.d.ts.map +1 -0
- package/dist/scaffolding/adapters/memory/memory-workspace.js +93 -0
- package/dist/scaffolding/adapters/memory/memory-workspace.js.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-journal.d.ts +6 -0
- package/dist/scaffolding/adapters/node/filesystem-journal.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-journal.js +79 -0
- package/dist/scaffolding/adapters/node/filesystem-journal.js.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-path-guard.d.ts +7 -0
- package/dist/scaffolding/adapters/node/filesystem-path-guard.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-path-guard.js +144 -0
- package/dist/scaffolding/adapters/node/filesystem-path-guard.js.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-workspace.d.ts +13 -0
- package/dist/scaffolding/adapters/node/filesystem-workspace.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/filesystem-workspace.js +336 -0
- package/dist/scaffolding/adapters/node/filesystem-workspace.js.map +1 -0
- package/dist/scaffolding/adapters/node/installed-foundation-version.d.ts +2 -0
- package/dist/scaffolding/adapters/node/installed-foundation-version.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/installed-foundation-version.js +10 -0
- package/dist/scaffolding/adapters/node/installed-foundation-version.js.map +1 -0
- package/dist/scaffolding/adapters/node/node-input-loader.d.ts +17 -0
- package/dist/scaffolding/adapters/node/node-input-loader.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/node-input-loader.js +157 -0
- package/dist/scaffolding/adapters/node/node-input-loader.js.map +1 -0
- package/dist/scaffolding/adapters/node/node-plan-authority.d.ts +3 -0
- package/dist/scaffolding/adapters/node/node-plan-authority.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/node-plan-authority.js +18 -0
- package/dist/scaffolding/adapters/node/node-plan-authority.js.map +1 -0
- package/dist/scaffolding/adapters/node/node-receipt-validator.d.ts +4 -0
- package/dist/scaffolding/adapters/node/node-receipt-validator.d.ts.map +1 -0
- package/dist/scaffolding/adapters/node/node-receipt-validator.js +10 -0
- package/dist/scaffolding/adapters/node/node-receipt-validator.js.map +1 -0
- package/dist/scaffolding/cli-command.d.ts +8 -0
- package/dist/scaffolding/cli-command.d.ts.map +1 -0
- package/dist/scaffolding/cli-command.js +60 -0
- package/dist/scaffolding/cli-command.js.map +1 -0
- package/dist/scaffolding/contract/types.d.ts +296 -0
- package/dist/scaffolding/contract/types.d.ts.map +1 -0
- package/dist/scaffolding/contract/types.js +2 -0
- package/dist/scaffolding/contract/types.js.map +1 -0
- package/dist/scaffolding/definitions/conformance-fixture.d.ts +3 -0
- package/dist/scaffolding/definitions/conformance-fixture.d.ts.map +1 -0
- package/dist/scaffolding/definitions/conformance-fixture.js +217 -0
- package/dist/scaffolding/definitions/conformance-fixture.js.map +1 -0
- package/dist/scaffolding/definitions/registry.d.ts +3 -0
- package/dist/scaffolding/definitions/registry.d.ts.map +1 -0
- package/dist/scaffolding/definitions/registry.js +6 -0
- package/dist/scaffolding/definitions/registry.js.map +1 -0
- package/dist/scaffolding/index.d.ts +11 -0
- package/dist/scaffolding/index.d.ts.map +1 -0
- package/dist/scaffolding/index.js +9 -0
- package/dist/scaffolding/index.js.map +1 -0
- package/dist/scaffolding/kernel/canonical-json.d.ts +6 -0
- package/dist/scaffolding/kernel/canonical-json.d.ts.map +1 -0
- package/dist/scaffolding/kernel/canonical-json.js +55 -0
- package/dist/scaffolding/kernel/canonical-json.js.map +1 -0
- package/dist/scaffolding/kernel/compiler.d.ts +4 -0
- package/dist/scaffolding/kernel/compiler.d.ts.map +1 -0
- package/dist/scaffolding/kernel/compiler.js +297 -0
- package/dist/scaffolding/kernel/compiler.js.map +1 -0
- package/dist/scaffolding/kernel/definition-registry.d.ts +50 -0
- package/dist/scaffolding/kernel/definition-registry.d.ts.map +1 -0
- package/dist/scaffolding/kernel/definition-registry.js +92 -0
- package/dist/scaffolding/kernel/definition-registry.js.map +1 -0
- package/dist/scaffolding/kernel/limits.d.ts +5 -0
- package/dist/scaffolding/kernel/limits.d.ts.map +1 -0
- package/dist/scaffolding/kernel/limits.js +5 -0
- package/dist/scaffolding/kernel/limits.js.map +1 -0
- package/dist/scaffolding/kernel/plan-validation.d.ts +3 -0
- package/dist/scaffolding/kernel/plan-validation.d.ts.map +1 -0
- package/dist/scaffolding/kernel/plan-validation.js +44 -0
- package/dist/scaffolding/kernel/plan-validation.js.map +1 -0
- package/dist/scaffolding/kernel/receipt.d.ts +35 -0
- package/dist/scaffolding/kernel/receipt.d.ts.map +1 -0
- package/dist/scaffolding/kernel/receipt.js +206 -0
- package/dist/scaffolding/kernel/receipt.js.map +1 -0
- package/dist/scaffolding/scaffold-error.d.ts +8 -0
- package/dist/scaffolding/scaffold-error.d.ts.map +1 -0
- package/dist/scaffolding/scaffold-error.js +11 -0
- package/dist/scaffolding/scaffold-error.js.map +1 -0
- package/dist/scaffolding/service.d.ts +8 -0
- package/dist/scaffolding/service.d.ts.map +1 -0
- package/dist/scaffolding/service.js +15 -0
- package/dist/scaffolding/service.js.map +1 -0
- package/dist/schema-ids.d.ts +1 -1
- package/dist/schema-ids.d.ts.map +1 -1
- package/dist/schema-ids.js +6 -0
- package/dist/schema-ids.js.map +1 -1
- package/dist/source-inventory/adapters/outbound/filesystem/filesystem-source-tree-reader.d.ts.map +1 -1
- package/dist/source-inventory/adapters/outbound/filesystem/filesystem-source-tree-reader.js +17 -12
- package/dist/source-inventory/adapters/outbound/filesystem/filesystem-source-tree-reader.js.map +1 -1
- package/package.json +5 -1
- package/presets/oxlint/maintainability-tests.json +23 -0
- package/presets/oxlint/maintainability.json +23 -0
- package/schemas/foundation-config/v1.schema.json +10 -0
- package/schemas/repository-agent-workflow/v1.schema.json +92 -0
- package/schemas/scaffold-intent/v1.schema.json +60 -0
- package/schemas/scaffold-plan/v1.schema.json +250 -0
- package/schemas/scaffold-receipt/v1.schema.json +299 -0
- package/schemas/scaffold-target-catalog/v1.schema.json +52 -0
- package/schemas/scaffolding-config/v1.schema.json +99 -0
|
@@ -62,162 +62,170 @@ function isWithin(parent, candidate) {
|
|
|
62
62
|
const path = relative(parent, candidate);
|
|
63
63
|
return path === "" || (!path.startsWith(`..${sep}`) && path !== ".." && !isAbsolute(path));
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
function isMissing(error) {
|
|
66
|
+
return (error instanceof Error &&
|
|
67
|
+
"code" in error &&
|
|
68
|
+
error.code === "ENOENT");
|
|
69
|
+
}
|
|
70
|
+
async function inspectLocalStateDirectory(consumerRoot, ignoreOperationLock, issues) {
|
|
71
|
+
const directory = join(consumerRoot, LOCAL_STATE_DIRECTORY);
|
|
72
|
+
let exists = false;
|
|
71
73
|
try {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
if (!
|
|
75
|
-
stateEntry.isSymbolicLink() ||
|
|
76
|
-
(await realpath(localStateDirectory)) !== localStateDirectory) {
|
|
77
|
-
localStateDirectoryIsSafe = false;
|
|
74
|
+
const entry = await lstat(directory);
|
|
75
|
+
exists = true;
|
|
76
|
+
if (!entry.isDirectory() || entry.isSymbolicLink() || (await realpath(directory)) !== directory) {
|
|
78
77
|
issues.push("Local foundation state path must be a real consumer-owned directory.");
|
|
78
|
+
return false;
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
catch (error) {
|
|
82
|
-
if (!(error
|
|
83
|
-
"code" in error &&
|
|
84
|
-
error.code === "ENOENT")) {
|
|
85
|
-
localStateDirectoryIsSafe = false;
|
|
82
|
+
if (!isMissing(error)) {
|
|
86
83
|
issues.push("Local foundation state directory cannot be inspected.");
|
|
84
|
+
return false;
|
|
87
85
|
}
|
|
88
86
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
87
|
+
if (!exists) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
let entries = [];
|
|
91
|
+
try {
|
|
92
|
+
entries = await readdir(directory);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (!isMissing(error)) {
|
|
96
|
+
issues.push("Local foundation state directory cannot be read.");
|
|
100
97
|
}
|
|
101
98
|
}
|
|
102
|
-
if (
|
|
103
|
-
localEntries.includes(LOCAL_OPERATION_LOCK)) {
|
|
99
|
+
if (!ignoreOperationLock && entries.includes(LOCAL_OPERATION_LOCK)) {
|
|
104
100
|
issues.push("A foundation operation is currently active or interrupted.");
|
|
105
101
|
}
|
|
106
|
-
if (
|
|
102
|
+
if (entries.some((entry) => entry.startsWith(`${LOCAL_STATE_FILE}.`) && entry.endsWith(".tmp"))) {
|
|
107
103
|
issues.push("An incomplete foundation state write requires recovery.");
|
|
108
104
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const provenance = await inspectFoundationRegistryProvenance(consumerRoot, dependencySpec);
|
|
113
|
-
issues.push(...provenance.issues);
|
|
114
|
-
let installedPackageRoot;
|
|
115
|
-
let installedVersion;
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
async function inspectInstalledFoundation(consumerRoot, issues) {
|
|
116
108
|
try {
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
if (isRecord(
|
|
120
|
-
|
|
121
|
-
typeof
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
109
|
+
const root = await realpath(join(consumerRoot, "node_modules", FOUNDATION_PACKAGE_NAME));
|
|
110
|
+
const manifest = await readJson(join(root, "package.json"));
|
|
111
|
+
if (isRecord(manifest) &&
|
|
112
|
+
manifest.name === FOUNDATION_PACKAGE_NAME &&
|
|
113
|
+
typeof manifest.version === "string") {
|
|
114
|
+
return { root, version: manifest.version };
|
|
115
|
+
}
|
|
116
|
+
issues.push("Installed foundation package identity or version is invalid.");
|
|
117
|
+
return { root };
|
|
127
118
|
}
|
|
128
119
|
catch {
|
|
129
120
|
issues.push("Installed foundation package cannot be resolved.");
|
|
121
|
+
return {};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function inspectLinkStateConsistency(consumerRoot, state, installed, issues) {
|
|
125
|
+
const backupPath = join(consumerRoot, LOCAL_STATE_DIRECTORY, LOCAL_REGISTRY_BACKUP);
|
|
126
|
+
if (resolve(state.registryBackupPath) !== backupPath) {
|
|
127
|
+
issues.push("Local state registry backup path is invalid.");
|
|
128
|
+
}
|
|
129
|
+
if (!isWithin(join(consumerRoot, "node_modules"), resolve(state.registryPackageRoot))) {
|
|
130
|
+
issues.push("Local state registry package root is outside node_modules.");
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
const expectedBackupRoot = state.registryEntryKind === "symbolic-link"
|
|
134
|
+
? resolve(state.registryPackageRoot)
|
|
135
|
+
: backupPath;
|
|
136
|
+
if ((await realpath(backupPath)) !== expectedBackupRoot) {
|
|
137
|
+
issues.push("Registry backup does not match local state.");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
issues.push("Registry backup cannot be resolved.");
|
|
142
|
+
}
|
|
143
|
+
if (state.phase !== "LOCAL") {
|
|
144
|
+
issues.push(`Local foundation operation is incomplete: ${state.phase}.`);
|
|
145
|
+
}
|
|
146
|
+
if (resolve(state.consumerRoot) !== consumerRoot) {
|
|
147
|
+
issues.push("Local state belongs to a different consumer root.");
|
|
148
|
+
}
|
|
149
|
+
if (installed.root === undefined || resolve(state.targetPackageRoot) !== installed.root) {
|
|
150
|
+
issues.push("Installed foundation path does not match local state.");
|
|
151
|
+
}
|
|
152
|
+
if (installed.version !== undefined && state.packageVersion !== installed.version) {
|
|
153
|
+
issues.push("Installed foundation version does not match local state.");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function inspectOrphanBackup(consumerRoot, issues) {
|
|
157
|
+
try {
|
|
158
|
+
await lstat(join(consumerRoot, LOCAL_STATE_DIRECTORY, LOCAL_REGISTRY_BACKUP));
|
|
159
|
+
issues.push("An orphan registry backup requires detach recovery.");
|
|
130
160
|
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (!isMissing(error)) {
|
|
163
|
+
issues.push("Registry backup state cannot be inspected.");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function buildStatus(input) {
|
|
168
|
+
return {
|
|
169
|
+
mode: input.issues.length === 0
|
|
170
|
+
? input.linkState === undefined ? "REGISTRY" : "LOCAL"
|
|
171
|
+
: "INVALID",
|
|
172
|
+
consumerRoot: input.consumerRoot,
|
|
173
|
+
...(input.dependencySpec === undefined ? {} : { dependencySpec: input.dependencySpec }),
|
|
174
|
+
...(input.installed.root === undefined ? {} : { installedPackageRoot: input.installed.root }),
|
|
175
|
+
...(input.installed.version === undefined ? {} : { installedVersion: input.installed.version }),
|
|
176
|
+
...(input.provenance === undefined
|
|
177
|
+
? {}
|
|
178
|
+
: {
|
|
179
|
+
lockfilePath: input.provenance.lockfilePath,
|
|
180
|
+
lockfilePackageKey: input.provenance.packageKey,
|
|
181
|
+
registryIntegrity: input.provenance.integrity
|
|
182
|
+
}),
|
|
183
|
+
...(input.linkState === undefined ? {} : { linkState: input.linkState }),
|
|
184
|
+
issues: input.issues
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
export async function inspectFoundationMode(consumerPath, options = {}) {
|
|
188
|
+
const consumerRoot = await realpath(resolve(consumerPath));
|
|
189
|
+
const issues = [];
|
|
190
|
+
const localStateDirectoryIsSafe = await inspectLocalStateDirectory(consumerRoot, options.ignoreOperationLock === true, issues);
|
|
191
|
+
const dependencyPolicy = await inspectFoundationDevOnly(consumerRoot);
|
|
192
|
+
issues.push(...dependencyPolicy.issues);
|
|
193
|
+
const dependencySpec = dependencyPolicy.dependencySpec;
|
|
194
|
+
const provenance = await inspectFoundationRegistryProvenance(consumerRoot, dependencySpec);
|
|
195
|
+
issues.push(...provenance.issues);
|
|
196
|
+
const installed = await inspectInstalledFoundation(consumerRoot, issues);
|
|
131
197
|
const linkState = localStateDirectoryIsSafe
|
|
132
198
|
? await readOptionalLinkState(consumerRoot, issues)
|
|
133
199
|
: undefined;
|
|
134
200
|
if (linkState !== undefined) {
|
|
135
|
-
|
|
136
|
-
|
|
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",
|
|
201
|
+
await inspectLinkStateConsistency(consumerRoot, linkState, installed, issues);
|
|
202
|
+
return buildStatus({
|
|
169
203
|
consumerRoot,
|
|
170
204
|
...(dependencySpec === undefined ? {} : { dependencySpec }),
|
|
171
|
-
|
|
172
|
-
...(
|
|
173
|
-
...(provenance.provenance === undefined
|
|
174
|
-
? {}
|
|
175
|
-
: {
|
|
176
|
-
lockfilePath: provenance.provenance.lockfilePath,
|
|
177
|
-
lockfilePackageKey: provenance.provenance.packageKey,
|
|
178
|
-
registryIntegrity: provenance.provenance.integrity
|
|
179
|
-
}),
|
|
205
|
+
installed,
|
|
206
|
+
...(provenance.provenance === undefined ? {} : { provenance: provenance.provenance }),
|
|
180
207
|
linkState,
|
|
181
208
|
issues
|
|
182
|
-
};
|
|
209
|
+
});
|
|
183
210
|
}
|
|
184
211
|
if (localStateDirectoryIsSafe) {
|
|
185
|
-
|
|
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
|
-
}
|
|
212
|
+
await inspectOrphanBackup(consumerRoot, issues);
|
|
196
213
|
}
|
|
197
|
-
if (
|
|
198
|
-
!isWithin(join(consumerRoot, "node_modules"), installedPackageRoot)) {
|
|
214
|
+
if (installed.root !== undefined && !isWithin(join(consumerRoot, "node_modules"), installed.root)) {
|
|
199
215
|
issues.push("Foundation resolves outside consumer node_modules without local state.");
|
|
200
216
|
}
|
|
201
217
|
if (dependencySpec !== undefined &&
|
|
202
|
-
|
|
203
|
-
dependencySpec !==
|
|
218
|
+
installed.version !== undefined &&
|
|
219
|
+
dependencySpec !== installed.version) {
|
|
204
220
|
issues.push("Installed foundation version differs from the manifest version.");
|
|
205
221
|
}
|
|
206
|
-
return {
|
|
207
|
-
mode: issues.length === 0 ? "REGISTRY" : "INVALID",
|
|
222
|
+
return buildStatus({
|
|
208
223
|
consumerRoot,
|
|
209
224
|
...(dependencySpec === undefined ? {} : { dependencySpec }),
|
|
210
|
-
|
|
211
|
-
...(
|
|
212
|
-
...(provenance.provenance === undefined
|
|
213
|
-
? {}
|
|
214
|
-
: {
|
|
215
|
-
lockfilePath: provenance.provenance.lockfilePath,
|
|
216
|
-
lockfilePackageKey: provenance.provenance.packageKey,
|
|
217
|
-
registryIntegrity: provenance.provenance.integrity
|
|
218
|
-
}),
|
|
225
|
+
installed,
|
|
226
|
+
...(provenance.provenance === undefined ? {} : { provenance: provenance.provenance }),
|
|
219
227
|
issues
|
|
220
|
-
};
|
|
228
|
+
});
|
|
221
229
|
}
|
|
222
230
|
export { inspectFoundationDevOnly, inspectFoundationRegistryProvenance } from "./consumer-policy.js";
|
|
223
231
|
export { isExactVersion } from "../semantic-version.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspection.js","sourceRoot":"","sources":["../../src/local-mode/inspection.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"inspection.js","sourceRoot":"","sources":["../../src/local-mode/inspection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FoundationLinkState } from "./types.js";
|
|
2
|
+
export declare function syncDirectory(path: string): Promise<void>;
|
|
3
|
+
export declare function writeLinkState(consumerRoot: string, state: FoundationLinkState): Promise<void>;
|
|
4
|
+
export declare function removeLinkState(consumerRoot: string): Promise<void>;
|
|
5
|
+
export declare function acquireFoundationOperationLock(consumerRoot: string): Promise<() => Promise<void>>;
|
|
6
|
+
//# sourceMappingURL=local-state-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-state-store.d.ts","sourceRoot":"","sources":["../../src/local-mode/local-state-store.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAoDtD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB/D;AAED,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CAcf;AAiBD,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAczE;AAED,wBAAsB,8BAA8B,CAClD,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CA6C9B"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { lstat, mkdir, open, readdir, realpath, rename, rm, rmdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { lock } from "proper-lockfile";
|
|
4
|
+
import { FoundationError } from "../errors.js";
|
|
5
|
+
import { LOCAL_OPERATION_LOCK, LOCAL_STATE_DIRECTORY, LOCAL_STATE_FILE } from "./types.js";
|
|
6
|
+
async function ensureLocalStateDirectory(consumerRoot) {
|
|
7
|
+
const directory = join(consumerRoot, LOCAL_STATE_DIRECTORY);
|
|
8
|
+
try {
|
|
9
|
+
const entry = await lstat(directory);
|
|
10
|
+
if (!entry.isDirectory() || entry.isSymbolicLink()) {
|
|
11
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Local foundation state path must be a real consumer-owned directory.");
|
|
12
|
+
}
|
|
13
|
+
if ((await realpath(directory)) !== directory) {
|
|
14
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Local foundation state directory resolves outside its expected path.");
|
|
15
|
+
}
|
|
16
|
+
return directory;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (!(error instanceof Error &&
|
|
20
|
+
"code" in error &&
|
|
21
|
+
error.code === "ENOENT")) {
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
await mkdir(directory);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (error instanceof Error &&
|
|
30
|
+
"code" in error &&
|
|
31
|
+
error.code === "EEXIST") {
|
|
32
|
+
return await ensureLocalStateDirectory(consumerRoot);
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
await syncDirectory(consumerRoot);
|
|
37
|
+
return directory;
|
|
38
|
+
}
|
|
39
|
+
export async function syncDirectory(path) {
|
|
40
|
+
try {
|
|
41
|
+
const handle = await open(path, "r");
|
|
42
|
+
try {
|
|
43
|
+
await handle.sync();
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await handle.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (process.platform === "win32" &&
|
|
51
|
+
error instanceof Error &&
|
|
52
|
+
"code" in error &&
|
|
53
|
+
["EACCES", "EINVAL", "EISDIR", "EPERM"].includes(error.code ?? "")) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function writeLinkState(consumerRoot, state) {
|
|
60
|
+
const directory = join(consumerRoot, LOCAL_STATE_DIRECTORY);
|
|
61
|
+
const destination = join(directory, LOCAL_STATE_FILE);
|
|
62
|
+
const temporary = `${destination}.${process.pid}.tmp`;
|
|
63
|
+
await ensureLocalStateDirectory(consumerRoot);
|
|
64
|
+
const handle = await open(temporary, "w", 0o600);
|
|
65
|
+
try {
|
|
66
|
+
await handle.writeFile(`${JSON.stringify(state, null, 2)}\n`, "utf8");
|
|
67
|
+
await handle.sync();
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await handle.close();
|
|
71
|
+
}
|
|
72
|
+
await rename(temporary, destination);
|
|
73
|
+
await syncDirectory(directory);
|
|
74
|
+
}
|
|
75
|
+
async function pruneLocalStateDirectory(consumerRoot) {
|
|
76
|
+
try {
|
|
77
|
+
await rmdir(join(consumerRoot, LOCAL_STATE_DIRECTORY));
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error instanceof Error &&
|
|
81
|
+
"code" in error &&
|
|
82
|
+
["ENOENT", "ENOTEMPTY"].includes(error.code ?? "")) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export async function removeLinkState(consumerRoot) {
|
|
89
|
+
const directory = join(consumerRoot, LOCAL_STATE_DIRECTORY);
|
|
90
|
+
const destination = join(directory, LOCAL_STATE_FILE);
|
|
91
|
+
await rm(destination, { force: true });
|
|
92
|
+
const temporaryEntries = await readdir(directory).catch(() => []);
|
|
93
|
+
await Promise.all(temporaryEntries
|
|
94
|
+
.filter((entry) => entry.startsWith(`${LOCAL_STATE_FILE}.`) && entry.endsWith(".tmp"))
|
|
95
|
+
.map(async (entry) => {
|
|
96
|
+
await rm(join(directory, entry), { force: true });
|
|
97
|
+
}));
|
|
98
|
+
await syncDirectory(directory);
|
|
99
|
+
await pruneLocalStateDirectory(consumerRoot);
|
|
100
|
+
}
|
|
101
|
+
export async function acquireFoundationOperationLock(consumerRoot) {
|
|
102
|
+
const directory = await ensureLocalStateDirectory(consumerRoot);
|
|
103
|
+
const lockPath = join(directory, LOCAL_OPERATION_LOCK);
|
|
104
|
+
try {
|
|
105
|
+
const lockEntry = await lstat(lockPath);
|
|
106
|
+
if (!lockEntry.isDirectory() || lockEntry.isSymbolicLink()) {
|
|
107
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Foundation operation lock path must be a real local directory.");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (!(error instanceof Error &&
|
|
112
|
+
"code" in error &&
|
|
113
|
+
error.code === "ENOENT")) {
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const release = await lock(directory, {
|
|
119
|
+
lockfilePath: lockPath,
|
|
120
|
+
onCompromised: (error) => {
|
|
121
|
+
throw error;
|
|
122
|
+
},
|
|
123
|
+
realpath: true,
|
|
124
|
+
retries: 0,
|
|
125
|
+
stale: 120_000,
|
|
126
|
+
update: 30_000
|
|
127
|
+
});
|
|
128
|
+
return async () => {
|
|
129
|
+
await release();
|
|
130
|
+
await syncDirectory(directory);
|
|
131
|
+
await pruneLocalStateDirectory(consumerRoot);
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Another foundation operation is active or its lock is not safely recoverable.", { cause: error });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=local-state-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-state-store.js","sourceRoot":"","sources":["../../src/local-mode/local-state-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FoundationLinkState } from "./types.js";
|
|
2
|
+
export declare function pathEntryExists(path: string): Promise<boolean>;
|
|
3
|
+
export declare function restoreRegistryEntry(consumerRoot: string, dependencySpec: string, state: FoundationLinkState | undefined): Promise<void>;
|
|
4
|
+
export declare function resolveTargetPackageRoot(targetPath: string): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=registry-recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-recovery.d.ts","sourceRoot":"","sources":["../../src/local-mode/registry-recovery.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAgCtD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUpE;AA2CD,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,mBAAmB,GAAG,SAAS,GACrC,OAAO,CAAC,IAAI,CAAC,CA2Cf;AAED,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { lstat, mkdir, readFile, realpath, rename, rm, stat } from "node:fs/promises";
|
|
2
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
3
|
+
import { FoundationError } from "../errors.js";
|
|
4
|
+
import { syncDirectory } from "./local-state-store.js";
|
|
5
|
+
import { FOUNDATION_PACKAGE_NAME, LOCAL_REGISTRY_BACKUP, LOCAL_STATE_DIRECTORY } from "./types.js";
|
|
6
|
+
async function readPackageManifest(path) {
|
|
7
|
+
const value = JSON.parse(await readFile(join(path, "package.json"), "utf8"));
|
|
8
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
9
|
+
throw new FoundationError("PACKAGE_INVALID", `Invalid package.json at ${path}.`);
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
async function pathExists(path) {
|
|
14
|
+
try {
|
|
15
|
+
await stat(path);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function pathEntryExists(path) {
|
|
26
|
+
try {
|
|
27
|
+
await lstat(path);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function readPackageEntry(path) {
|
|
38
|
+
const packageRoot = await realpath(path);
|
|
39
|
+
return { manifest: await readPackageManifest(packageRoot), packageRoot };
|
|
40
|
+
}
|
|
41
|
+
function isWithin(parent, candidate) {
|
|
42
|
+
const path = relative(parent, candidate);
|
|
43
|
+
return path === "" || (!path.startsWith(`..${sep}`) && path !== ".." && !isAbsolute(path));
|
|
44
|
+
}
|
|
45
|
+
function assertRecoveryStatePaths(consumerRoot, state) {
|
|
46
|
+
const backupPath = join(consumerRoot, LOCAL_STATE_DIRECTORY, LOCAL_REGISTRY_BACKUP);
|
|
47
|
+
if (resolve(state.consumerRoot) !== consumerRoot ||
|
|
48
|
+
resolve(state.registryBackupPath) !== backupPath ||
|
|
49
|
+
!isWithin(join(consumerRoot, "node_modules"), resolve(state.registryPackageRoot))) {
|
|
50
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Local recovery state contains paths outside its consumer-owned boundary.");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function backupRootExpected(consumerRoot, backupRoot, backupPath, state) {
|
|
54
|
+
if (state === undefined) {
|
|
55
|
+
return backupRoot === backupPath || isWithin(join(consumerRoot, "node_modules"), backupRoot);
|
|
56
|
+
}
|
|
57
|
+
return backupRoot === (state.registryEntryKind === "directory"
|
|
58
|
+
? backupPath
|
|
59
|
+
: resolve(state.registryPackageRoot));
|
|
60
|
+
}
|
|
61
|
+
export async function restoreRegistryEntry(consumerRoot, dependencySpec, state) {
|
|
62
|
+
const installedPath = join(consumerRoot, "node_modules", FOUNDATION_PACKAGE_NAME);
|
|
63
|
+
const backupPath = join(consumerRoot, LOCAL_STATE_DIRECTORY, LOCAL_REGISTRY_BACKUP);
|
|
64
|
+
if (state !== undefined) {
|
|
65
|
+
assertRecoveryStatePaths(consumerRoot, state);
|
|
66
|
+
}
|
|
67
|
+
if (await pathEntryExists(backupPath)) {
|
|
68
|
+
const backup = await readPackageEntry(backupPath);
|
|
69
|
+
if (backup.manifest.name !== FOUNDATION_PACKAGE_NAME ||
|
|
70
|
+
backup.manifest.version !== dependencySpec ||
|
|
71
|
+
!backupRootExpected(consumerRoot, backup.packageRoot, backupPath, state)) {
|
|
72
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Registry backup identity, version, or location is invalid.");
|
|
73
|
+
}
|
|
74
|
+
await rm(installedPath, { force: true, recursive: true });
|
|
75
|
+
await mkdir(dirname(installedPath), { recursive: true });
|
|
76
|
+
await rename(backupPath, installedPath);
|
|
77
|
+
await syncDirectory(dirname(installedPath));
|
|
78
|
+
await syncDirectory(dirname(backupPath));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (await pathEntryExists(installedPath)) {
|
|
82
|
+
const installed = await readPackageEntry(installedPath).catch(() => { });
|
|
83
|
+
const expectedRoot = state === undefined
|
|
84
|
+
? installed !== undefined && isWithin(join(consumerRoot, "node_modules"), installed.packageRoot)
|
|
85
|
+
: installed?.packageRoot === resolve(state.registryPackageRoot);
|
|
86
|
+
if (installed !== undefined &&
|
|
87
|
+
expectedRoot &&
|
|
88
|
+
installed.manifest.name === FOUNDATION_PACKAGE_NAME &&
|
|
89
|
+
installed.manifest.version === dependencySpec) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
throw new FoundationError("LOCAL_STATE_INVALID", "Registry backup is unavailable and the installed package cannot be proven to be the original registry entry.");
|
|
94
|
+
}
|
|
95
|
+
export async function resolveTargetPackageRoot(targetPath) {
|
|
96
|
+
const root = await realpath(resolve(targetPath));
|
|
97
|
+
if (await pathExists(join(root, "package.json"))) {
|
|
98
|
+
const manifest = await readPackageManifest(root);
|
|
99
|
+
if (manifest.name === FOUNDATION_PACKAGE_NAME) {
|
|
100
|
+
return root;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const workspacePackage = join(root, "packages", "engineering-foundation");
|
|
104
|
+
if (await pathExists(join(workspacePackage, "package.json"))) {
|
|
105
|
+
const manifest = await readPackageManifest(workspacePackage);
|
|
106
|
+
if (manifest.name === FOUNDATION_PACKAGE_NAME) {
|
|
107
|
+
return await realpath(workspacePackage);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
throw new FoundationError("PACKAGE_INVALID", `Target does not contain ${FOUNDATION_PACKAGE_NAME}.`);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=registry-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-recovery.js","sourceRoot":"","sources":["../../src/local-mode/registry-recovery.ts"],"names":[],"mappings":"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"}
|