@orkestrel/scaffold 0.0.21 → 0.0.22
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/dist/bin/scaffold.js +371 -140
- package/dist/bin/scaffold.js.map +1 -1
- package/dist/host/AGENTS.md +61 -42
- package/dist/host/CLAUDE.md +39 -408
- package/dist/host/agents/orchestration.md +454 -0
- package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +25 -7
- package/dist/host/agents/skills/orkestrel-align-packages/SKILL.md +2 -2
- package/dist/host/agents/skills/orkestrel-build-application/SKILL.md +42 -31
- package/dist/host/agents/skills/orkestrel-build-application/references/application.md +129 -0
- package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +3 -3
- package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +2 -2
- package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +167 -0
- package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +98 -0
- package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +148 -0
- package/dist/host/agents/skills/orkestrel-harden-package/SKILL.md +4 -2
- package/dist/host/agents/skills/orkestrel-harden-package/references/centralization.md +5 -5
- package/dist/host/agents/skills/orkestrel-harden-package/references/research.md +2 -0
- package/dist/host/agents/skills/orkestrel-polish-surface/SKILL.md +11 -6
- package/dist/host/claude/agents/analyst.md +59 -0
- package/dist/host/claude/agents/application.md +1 -1
- package/dist/host/claude/agents/builder.md +1 -1
- package/dist/host/claude/agents/checker.md +5 -1
- package/dist/host/claude/agents/codex.md +120 -94
- package/dist/host/claude/agents/grok.md +44 -32
- package/dist/host/claude/agents/implementer.md +1 -1
- package/dist/host/claude/agents/orkestrel.md +1 -1
- package/dist/host/claude/agents/planner.md +9 -3
- package/dist/host/claude/agents/researcher.md +6 -5
- package/dist/host/claude/agents/reviewer.md +12 -6
- package/dist/host/claude/agents/scout.md +7 -4
- package/dist/host/claude/agents/verifier.md +1 -1
- package/dist/host/claude/rules/application.md +17 -16
- package/dist/host/claude/rules/architecture.md +41 -22
- package/dist/host/claude/rules/documentation.md +2 -1
- package/dist/host/claude/rules/names.md +7 -6
- package/dist/host/claude/rules/quality.md +65 -18
- package/dist/host/claude/rules/styles.md +1 -1
- package/dist/host/claude/rules/tests.md +12 -6
- package/dist/host/claude/rules/typescript.md +1 -1
- package/dist/host/claude/rules/workspace.md +6 -3
- package/dist/host/claude/settings.json +2 -0
- package/dist/host/claude/skills/orkestrel-falsify/SKILL.md +10 -0
- package/dist/host/codex/agents/analyst.toml +13 -4
- package/dist/host/codex/agents/checker.toml +1 -1
- package/dist/host/codex/agents/grok.toml +2 -1
- package/dist/host/codex/agents/opus.toml +1 -1
- package/dist/host/codex/agents/planner.toml +1 -1
- package/dist/host/codex/agents/researcher.toml +2 -2
- package/dist/host/codex/agents/reviewer.toml +1 -1
- package/dist/host/codex/agents/scout.toml +2 -2
- package/dist/host/codex/config.toml +23 -70
- package/dist/host/cursor/rules/orchestration.mdc +33 -0
- package/dist/host/guides/src/scaffold.md +301 -123
- package/dist/host/manifest.json +47 -1
- package/dist/host/tests/setupPolicy.ts +83 -3
- package/dist/src/core/index.cjs +404 -63
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +119 -41
- package/dist/src/core/index.d.ts +119 -41
- package/dist/src/core/index.js +401 -64
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/index.cjs +83 -33
- package/dist/src/server/index.cjs.map +1 -1
- package/dist/src/server/index.d.cts +32 -16
- package/dist/src/server/index.d.ts +32 -16
- package/dist/src/server/index.js +84 -35
- package/dist/src/server/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -139,9 +139,10 @@ export declare const DEFAULT_SYNC_TIMEOUT = 10000;
|
|
|
139
139
|
* and the name satisfies `isWorkspaceName`; every other name is a coded
|
|
140
140
|
* `TARGET` failure. `src` is derived from `src/<environment>/` and `app` from
|
|
141
141
|
* `app/<environment>/`; a target with no environment on either axis is also a coded
|
|
142
|
-
* `TARGET` failure. The `bin
|
|
143
|
-
* directories at `src/bin
|
|
144
|
-
*
|
|
142
|
+
* `TARGET` failure. The `bin` and `integration` facts probe physical
|
|
143
|
+
* directories at `src/bin` and `tests/integration`. `services` is the sorted
|
|
144
|
+
* set of direct vendor directories under `tests/service` that contain a test
|
|
145
|
+
* at any depth, while `global` probes the physical exact-case `tests/setupGlobal.ts` file and `showcase`
|
|
145
146
|
* probes the physical exact-case `configs/app/vite.showcase.config.ts` regular file; none is
|
|
146
147
|
* inferred from the workspace name. `dependencies` /
|
|
147
148
|
* `peers` are the `@orkestrel/`-prefixed entries of `manifest.dependencies` /
|
|
@@ -161,8 +162,8 @@ export declare const DEFAULT_SYNC_TIMEOUT = 10000;
|
|
|
161
162
|
* @throws `ScaffoldError('TARGET', …)` when `target`'s manifest is unreadable
|
|
162
163
|
* (via `readManifest`), is not valid JSON, its name is unsafe for its
|
|
163
164
|
* publication mode, or `target` carries no source or application environment.
|
|
164
|
-
* @throws `ScaffoldError('
|
|
165
|
-
*
|
|
165
|
+
* @throws `ScaffoldError('INVALID', …)` when service tests use the retired flat
|
|
166
|
+
* layout, a vendor directory has no test, or a service companion is missing.
|
|
166
167
|
*
|
|
167
168
|
* @example
|
|
168
169
|
* ```ts
|
|
@@ -189,6 +190,15 @@ export declare function digestFile(path: string): string;
|
|
|
189
190
|
*/
|
|
190
191
|
export declare function digestHex(hex: string): string;
|
|
191
192
|
|
|
193
|
+
/**
|
|
194
|
+
* Digest the exact declared membership of a vendored host manifest.
|
|
195
|
+
*
|
|
196
|
+
* @param entries - The ordered file membership declarations.
|
|
197
|
+
* @param roots - The ordered directory membership declarations.
|
|
198
|
+
* @returns A SHA-256 digest independent of the manifest's stored digest field.
|
|
199
|
+
*/
|
|
200
|
+
export declare function digestHostManifest(entries: readonly ManifestEntry[], roots: readonly string[]): string;
|
|
201
|
+
|
|
192
202
|
/**
|
|
193
203
|
* Compute SHA-256 from UTF-8 text.
|
|
194
204
|
*
|
|
@@ -264,6 +274,8 @@ export declare const HOST_MANIFEST_PATH = "manifest.json";
|
|
|
264
274
|
export declare interface HostManifest {
|
|
265
275
|
readonly entries: readonly ManifestEntry[];
|
|
266
276
|
readonly roots: readonly string[];
|
|
277
|
+
/** SHA-256 of the exact declared entry/root membership. */
|
|
278
|
+
readonly digest: string;
|
|
267
279
|
}
|
|
268
280
|
|
|
269
281
|
/**
|
|
@@ -329,7 +341,7 @@ export declare function isFilesystemPath(value: unknown): value is string;
|
|
|
329
341
|
* Narrow a value to one exact complete vendored-host manifest.
|
|
330
342
|
*
|
|
331
343
|
* @param value - The candidate manifest value.
|
|
332
|
-
* @returns `true` only for an exact `{ entries, roots }` record with safe paths.
|
|
344
|
+
* @returns `true` only for an exact `{ entries, roots, digest }` record with safe paths.
|
|
333
345
|
*/
|
|
334
346
|
export declare function isHostManifest(value: unknown): value is HostManifest;
|
|
335
347
|
|
|
@@ -460,6 +472,7 @@ export declare function listFiles(root: string): readonly string[];
|
|
|
460
472
|
* {
|
|
461
473
|
* entries: [{ storage: 'pkg.tmpl', destination: 'package.json', executable: false }],
|
|
462
474
|
* roots: [],
|
|
475
|
+
* digest: '3b52f19450237ea4cfb39bc7a77b1e5094b52a8ff1fc9c02fd68b13ad088aa0f',
|
|
463
476
|
* },
|
|
464
477
|
* 'package.json',
|
|
465
478
|
* './dist/host',
|
|
@@ -485,9 +498,10 @@ export declare interface ManifestEntry {
|
|
|
485
498
|
* (`ScaffoldError('TARGET', …)`), then byte-copies each `host` artifact from
|
|
486
499
|
* the `host` root and writes each `template` / `computed` artifact's rendered
|
|
487
500
|
* `content`, failing fast on any write error (`ScaffoldError('WRITE', …)`).
|
|
488
|
-
* `repair` is into-existing: it skips the vacancy check and writes
|
|
489
|
-
* `
|
|
490
|
-
*
|
|
501
|
+
* `repair` is into-existing: it skips the vacancy check and writes `missing`
|
|
502
|
+
* artifacts an `Audit` names. `stale` artifacts are report-only unless its
|
|
503
|
+
* `replace` switch is true, because byte replacement discards local changes.
|
|
504
|
+
* Hydrated directory-shaped host entries are expanded into
|
|
491
505
|
* file-shaped artifacts, so canonical skills and agent configuration are
|
|
492
506
|
* audited and repaired file by file. `prune` deletes stale files under
|
|
493
507
|
* `target/.claude/agents/`, `target/.codex/agents/`, and `target/scripts/`
|
|
@@ -518,9 +532,10 @@ export declare interface ManifestEntry {
|
|
|
518
532
|
* source is always staged by `stageHost`, so a non-guide zero-match means a
|
|
519
533
|
* corrupted or truncated `manifest.json`, not an intentionally-unvendored
|
|
520
534
|
* artifact. For a guide pointer, a short stub file is written at the
|
|
521
|
-
* destination and reported exactly like a successful copy
|
|
522
|
-
*
|
|
523
|
-
*
|
|
535
|
+
* destination and reported exactly like a successful copy. The READ path
|
|
536
|
+
* leaves that intentional pointer without canonical bytes, so `diffPlan`
|
|
537
|
+
* treats it as presence-owned rather than inventing a byte match.
|
|
538
|
+
* For every OTHER zero-match, the
|
|
524
539
|
* fail-closed `ScaffoldError('TARGET', …)` is thrown — degrading an
|
|
525
540
|
* unscoped zero-match would otherwise let a corrupted manifest silently stub
|
|
526
541
|
* an unrecoverable artifact (e.g. `AGENTS.md` — `pull` only ever fetches
|
|
@@ -567,7 +582,7 @@ export declare class Materializer implements MaterializerInterface {
|
|
|
567
582
|
constructor(options?: MaterializerOptions);
|
|
568
583
|
get emitter(): EmitterInterface<MaterializerEventMap>;
|
|
569
584
|
materialize(plan: Plan, target: string): MaterializeResult;
|
|
570
|
-
repair(plan: Plan, audit: Audit, target: string): MaterializeResult;
|
|
585
|
+
repair(plan: Plan, audit: Audit, target: string, replace?: boolean): MaterializeResult;
|
|
571
586
|
prune(target: string, expected: Readonly<Record<string, string>>): MaterializeResult;
|
|
572
587
|
destroy(): void;
|
|
573
588
|
}
|
|
@@ -595,7 +610,7 @@ export declare type MaterializerEventMap = {
|
|
|
595
610
|
export declare interface MaterializerInterface {
|
|
596
611
|
readonly emitter: EmitterInterface<MaterializerEventMap>;
|
|
597
612
|
materialize(plan: Plan, target: string): MaterializeResult;
|
|
598
|
-
repair(plan: Plan, audit: Audit, target: string): MaterializeResult;
|
|
613
|
+
repair(plan: Plan, audit: Audit, target: string, replace?: boolean): MaterializeResult;
|
|
599
614
|
prune(target: string, expected: Snapshot): MaterializeResult;
|
|
600
615
|
destroy(): void;
|
|
601
616
|
}
|
|
@@ -804,8 +819,9 @@ export declare function readGuideReferences(target: string, names: readonly stri
|
|
|
804
819
|
* `manifest.json` — the raw-repo-root fallback (`Materializer` then maps
|
|
805
820
|
* an artifact's `source` to `host` 1:1, no vendored staging indirection).
|
|
806
821
|
* @throws `ScaffoldError('TARGET', …)` when `manifest.json` exists but is
|
|
807
|
-
* unreadable, malformed,
|
|
808
|
-
* bijectively and case-exactly onto real
|
|
822
|
+
* unreadable, malformed, membership-corrupted, collision-prone,
|
|
823
|
+
* root-incomplete, or does not map bijectively and case-exactly onto real
|
|
824
|
+
* contained storage files.
|
|
809
825
|
*
|
|
810
826
|
* @example
|
|
811
827
|
* ```ts
|
|
@@ -139,9 +139,10 @@ export declare const DEFAULT_SYNC_TIMEOUT = 10000;
|
|
|
139
139
|
* and the name satisfies `isWorkspaceName`; every other name is a coded
|
|
140
140
|
* `TARGET` failure. `src` is derived from `src/<environment>/` and `app` from
|
|
141
141
|
* `app/<environment>/`; a target with no environment on either axis is also a coded
|
|
142
|
-
* `TARGET` failure. The `bin
|
|
143
|
-
* directories at `src/bin
|
|
144
|
-
*
|
|
142
|
+
* `TARGET` failure. The `bin` and `integration` facts probe physical
|
|
143
|
+
* directories at `src/bin` and `tests/integration`. `services` is the sorted
|
|
144
|
+
* set of direct vendor directories under `tests/service` that contain a test
|
|
145
|
+
* at any depth, while `global` probes the physical exact-case `tests/setupGlobal.ts` file and `showcase`
|
|
145
146
|
* probes the physical exact-case `configs/app/vite.showcase.config.ts` regular file; none is
|
|
146
147
|
* inferred from the workspace name. `dependencies` /
|
|
147
148
|
* `peers` are the `@orkestrel/`-prefixed entries of `manifest.dependencies` /
|
|
@@ -161,8 +162,8 @@ export declare const DEFAULT_SYNC_TIMEOUT = 10000;
|
|
|
161
162
|
* @throws `ScaffoldError('TARGET', …)` when `target`'s manifest is unreadable
|
|
162
163
|
* (via `readManifest`), is not valid JSON, its name is unsafe for its
|
|
163
164
|
* publication mode, or `target` carries no source or application environment.
|
|
164
|
-
* @throws `ScaffoldError('
|
|
165
|
-
*
|
|
165
|
+
* @throws `ScaffoldError('INVALID', …)` when service tests use the retired flat
|
|
166
|
+
* layout, a vendor directory has no test, or a service companion is missing.
|
|
166
167
|
*
|
|
167
168
|
* @example
|
|
168
169
|
* ```ts
|
|
@@ -189,6 +190,15 @@ export declare function digestFile(path: string): string;
|
|
|
189
190
|
*/
|
|
190
191
|
export declare function digestHex(hex: string): string;
|
|
191
192
|
|
|
193
|
+
/**
|
|
194
|
+
* Digest the exact declared membership of a vendored host manifest.
|
|
195
|
+
*
|
|
196
|
+
* @param entries - The ordered file membership declarations.
|
|
197
|
+
* @param roots - The ordered directory membership declarations.
|
|
198
|
+
* @returns A SHA-256 digest independent of the manifest's stored digest field.
|
|
199
|
+
*/
|
|
200
|
+
export declare function digestHostManifest(entries: readonly ManifestEntry[], roots: readonly string[]): string;
|
|
201
|
+
|
|
192
202
|
/**
|
|
193
203
|
* Compute SHA-256 from UTF-8 text.
|
|
194
204
|
*
|
|
@@ -264,6 +274,8 @@ export declare const HOST_MANIFEST_PATH = "manifest.json";
|
|
|
264
274
|
export declare interface HostManifest {
|
|
265
275
|
readonly entries: readonly ManifestEntry[];
|
|
266
276
|
readonly roots: readonly string[];
|
|
277
|
+
/** SHA-256 of the exact declared entry/root membership. */
|
|
278
|
+
readonly digest: string;
|
|
267
279
|
}
|
|
268
280
|
|
|
269
281
|
/**
|
|
@@ -329,7 +341,7 @@ export declare function isFilesystemPath(value: unknown): value is string;
|
|
|
329
341
|
* Narrow a value to one exact complete vendored-host manifest.
|
|
330
342
|
*
|
|
331
343
|
* @param value - The candidate manifest value.
|
|
332
|
-
* @returns `true` only for an exact `{ entries, roots }` record with safe paths.
|
|
344
|
+
* @returns `true` only for an exact `{ entries, roots, digest }` record with safe paths.
|
|
333
345
|
*/
|
|
334
346
|
export declare function isHostManifest(value: unknown): value is HostManifest;
|
|
335
347
|
|
|
@@ -460,6 +472,7 @@ export declare function listFiles(root: string): readonly string[];
|
|
|
460
472
|
* {
|
|
461
473
|
* entries: [{ storage: 'pkg.tmpl', destination: 'package.json', executable: false }],
|
|
462
474
|
* roots: [],
|
|
475
|
+
* digest: '3b52f19450237ea4cfb39bc7a77b1e5094b52a8ff1fc9c02fd68b13ad088aa0f',
|
|
463
476
|
* },
|
|
464
477
|
* 'package.json',
|
|
465
478
|
* './dist/host',
|
|
@@ -485,9 +498,10 @@ export declare interface ManifestEntry {
|
|
|
485
498
|
* (`ScaffoldError('TARGET', …)`), then byte-copies each `host` artifact from
|
|
486
499
|
* the `host` root and writes each `template` / `computed` artifact's rendered
|
|
487
500
|
* `content`, failing fast on any write error (`ScaffoldError('WRITE', …)`).
|
|
488
|
-
* `repair` is into-existing: it skips the vacancy check and writes
|
|
489
|
-
* `
|
|
490
|
-
*
|
|
501
|
+
* `repair` is into-existing: it skips the vacancy check and writes `missing`
|
|
502
|
+
* artifacts an `Audit` names. `stale` artifacts are report-only unless its
|
|
503
|
+
* `replace` switch is true, because byte replacement discards local changes.
|
|
504
|
+
* Hydrated directory-shaped host entries are expanded into
|
|
491
505
|
* file-shaped artifacts, so canonical skills and agent configuration are
|
|
492
506
|
* audited and repaired file by file. `prune` deletes stale files under
|
|
493
507
|
* `target/.claude/agents/`, `target/.codex/agents/`, and `target/scripts/`
|
|
@@ -518,9 +532,10 @@ export declare interface ManifestEntry {
|
|
|
518
532
|
* source is always staged by `stageHost`, so a non-guide zero-match means a
|
|
519
533
|
* corrupted or truncated `manifest.json`, not an intentionally-unvendored
|
|
520
534
|
* artifact. For a guide pointer, a short stub file is written at the
|
|
521
|
-
* destination and reported exactly like a successful copy
|
|
522
|
-
*
|
|
523
|
-
*
|
|
535
|
+
* destination and reported exactly like a successful copy. The READ path
|
|
536
|
+
* leaves that intentional pointer without canonical bytes, so `diffPlan`
|
|
537
|
+
* treats it as presence-owned rather than inventing a byte match.
|
|
538
|
+
* For every OTHER zero-match, the
|
|
524
539
|
* fail-closed `ScaffoldError('TARGET', …)` is thrown — degrading an
|
|
525
540
|
* unscoped zero-match would otherwise let a corrupted manifest silently stub
|
|
526
541
|
* an unrecoverable artifact (e.g. `AGENTS.md` — `pull` only ever fetches
|
|
@@ -567,7 +582,7 @@ export declare class Materializer implements MaterializerInterface {
|
|
|
567
582
|
constructor(options?: MaterializerOptions);
|
|
568
583
|
get emitter(): EmitterInterface<MaterializerEventMap>;
|
|
569
584
|
materialize(plan: Plan, target: string): MaterializeResult;
|
|
570
|
-
repair(plan: Plan, audit: Audit, target: string): MaterializeResult;
|
|
585
|
+
repair(plan: Plan, audit: Audit, target: string, replace?: boolean): MaterializeResult;
|
|
571
586
|
prune(target: string, expected: Readonly<Record<string, string>>): MaterializeResult;
|
|
572
587
|
destroy(): void;
|
|
573
588
|
}
|
|
@@ -595,7 +610,7 @@ export declare type MaterializerEventMap = {
|
|
|
595
610
|
export declare interface MaterializerInterface {
|
|
596
611
|
readonly emitter: EmitterInterface<MaterializerEventMap>;
|
|
597
612
|
materialize(plan: Plan, target: string): MaterializeResult;
|
|
598
|
-
repair(plan: Plan, audit: Audit, target: string): MaterializeResult;
|
|
613
|
+
repair(plan: Plan, audit: Audit, target: string, replace?: boolean): MaterializeResult;
|
|
599
614
|
prune(target: string, expected: Snapshot): MaterializeResult;
|
|
600
615
|
destroy(): void;
|
|
601
616
|
}
|
|
@@ -804,8 +819,9 @@ export declare function readGuideReferences(target: string, names: readonly stri
|
|
|
804
819
|
* `manifest.json` — the raw-repo-root fallback (`Materializer` then maps
|
|
805
820
|
* an artifact's `source` to `host` 1:1, no vendored staging indirection).
|
|
806
821
|
* @throws `ScaffoldError('TARGET', …)` when `manifest.json` exists but is
|
|
807
|
-
* unreadable, malformed,
|
|
808
|
-
* bijectively and case-exactly onto real
|
|
822
|
+
* unreadable, malformed, membership-corrupted, collision-prone,
|
|
823
|
+
* root-incomplete, or does not map bijectively and case-exactly onto real
|
|
824
|
+
* contained storage files.
|
|
809
825
|
*
|
|
810
826
|
* @example
|
|
811
827
|
* ```ts
|
package/dist/src/server/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CONTROL_CHARACTER_PATTERN, DEFAULT_ENGINES, DEFAULT_VERSION, DEPENDENCY_NAME_PATTERN, ENVIRONMENTS, EXTRA_NAME_PATTERN, GLOBAL_SETUP_PATH, HEX_PATTERN, HOST_PATHS, INVALID_PATH_CHARACTER_PATTERN, MAX_ARTIFACT_BYTES, MAX_ARTIFACT_HEX_LENGTH, MAX_COLLECTION_ITEMS, MAX_DEPENDENCY_NAME_LENGTH, MAX_MANIFEST_BYTES, MAX_PATH_LENGTH, MAX_TOTAL_ARTIFACT_BYTES,
|
|
1
|
+
import { CONTROL_CHARACTER_PATTERN, DEFAULT_ENGINES, DEFAULT_VERSION, DEPENDENCY_NAME_PATTERN, ENVIRONMENTS, EXTRA_NAME_PATTERN, GLOBAL_SETUP_PATH, HEX_PATTERN, HOST_PATHS, INVALID_PATH_CHARACTER_PATTERN, MAX_ARTIFACT_BYTES, MAX_ARTIFACT_HEX_LENGTH, MAX_COLLECTION_ITEMS, MAX_DEPENDENCY_NAME_LENGTH, MAX_MANIFEST_BYTES, MAX_PATH_LENGTH, MAX_TOTAL_ARTIFACT_BYTES, SHOWCASE_CONFIG_PATH, SYNC_BASELINE_PATTERN, ScaffoldError, VERSION_PATTERN, blueprint, bytesToHex, contentByteLength, devDependenciesFor, diffPlan, findFileConflict, findPathConflict, hasOnlyDataProperties, hasValidAuditBytes, hasValidSnapshotBytes, isDenseDataArray, isDependency, isEmitterErrorHandler, isPlan, isSyncReport, isWorkspaceName, manifestToDependencies, manifestToName, ownDataValue, parsePlan, parseSyncReport, rangeToFreshness, snapshotPlan, stableStringify, validateDependencyArray, validatePlan } from "../core/index.js";
|
|
2
2
|
import { attempt, booleanShape, createContract, integerShape, isError, isFunction, isRecord, isString, objectShape, optionalShape, parseJSON, parseJSONAs, stringShape } from "@orkestrel/contract";
|
|
3
3
|
import { createHash, randomUUID } from "node:crypto";
|
|
4
4
|
import { chmodSync, closeSync, constants, copyFileSync, existsSync, fstatSync, linkSync, lstatSync, mkdirSync, openSync, opendirSync, readSync, readdirSync, realpathSync, renameSync, rmSync, rmdirSync, writeFileSync } from "node:fs";
|
|
@@ -255,7 +255,7 @@ function isManifestEntry(value) {
|
|
|
255
255
|
* Narrow a value to one exact complete vendored-host manifest.
|
|
256
256
|
*
|
|
257
257
|
* @param value - The candidate manifest value.
|
|
258
|
-
* @returns `true` only for an exact `{ entries, roots }` record with safe paths.
|
|
258
|
+
* @returns `true` only for an exact `{ entries, roots, digest }` record with safe paths.
|
|
259
259
|
*/
|
|
260
260
|
function isHostManifest(value) {
|
|
261
261
|
const result = attempt(() => {
|
|
@@ -263,7 +263,8 @@ function isHostManifest(value) {
|
|
|
263
263
|
const keys = Reflect.ownKeys(value);
|
|
264
264
|
const entries = Reflect.getOwnPropertyDescriptor(value, "entries");
|
|
265
265
|
const roots = Reflect.getOwnPropertyDescriptor(value, "roots");
|
|
266
|
-
|
|
266
|
+
const digest = Reflect.getOwnPropertyDescriptor(value, "digest");
|
|
267
|
+
return keys.length === 3 && keys.every((key) => key === "entries" || key === "roots" || key === "digest") && entries !== void 0 && Reflect.has(entries, "value") && roots !== void 0 && Reflect.has(roots, "value") && digest !== void 0 && Reflect.has(digest, "value") && isDenseDataArray(entries.value, 4096, isManifestEntry) && isDenseDataArray(roots.value, 4096, isPortablePath) && typeof digest.value === "string" && WRITE_DIGEST_PATTERN.test(digest.value);
|
|
267
268
|
});
|
|
268
269
|
return result.success && result.value;
|
|
269
270
|
}
|
|
@@ -938,6 +939,19 @@ function digestText(value) {
|
|
|
938
939
|
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
939
940
|
}
|
|
940
941
|
/**
|
|
942
|
+
* Digest the exact declared membership of a vendored host manifest.
|
|
943
|
+
*
|
|
944
|
+
* @param entries - The ordered file membership declarations.
|
|
945
|
+
* @param roots - The ordered directory membership declarations.
|
|
946
|
+
* @returns A SHA-256 digest independent of the manifest's stored digest field.
|
|
947
|
+
*/
|
|
948
|
+
function digestHostManifest(entries, roots) {
|
|
949
|
+
return digestText(stableStringify({
|
|
950
|
+
entries,
|
|
951
|
+
roots
|
|
952
|
+
}));
|
|
953
|
+
}
|
|
954
|
+
/**
|
|
941
955
|
* Render the local pointer written when an upstream dependency guide is not vendored yet.
|
|
942
956
|
*
|
|
943
957
|
* @param source - The canonical `guides/src/<name>.md` source path.
|
|
@@ -1771,9 +1785,10 @@ function selectOrkestrelEntries(value) {
|
|
|
1771
1785
|
* and the name satisfies `isWorkspaceName`; every other name is a coded
|
|
1772
1786
|
* `TARGET` failure. `src` is derived from `src/<environment>/` and `app` from
|
|
1773
1787
|
* `app/<environment>/`; a target with no environment on either axis is also a coded
|
|
1774
|
-
* `TARGET` failure. The `bin
|
|
1775
|
-
* directories at `src/bin
|
|
1776
|
-
*
|
|
1788
|
+
* `TARGET` failure. The `bin` and `integration` facts probe physical
|
|
1789
|
+
* directories at `src/bin` and `tests/integration`. `services` is the sorted
|
|
1790
|
+
* set of direct vendor directories under `tests/service` that contain a test
|
|
1791
|
+
* at any depth, while `global` probes the physical exact-case `tests/setupGlobal.ts` file and `showcase`
|
|
1777
1792
|
* probes the physical exact-case `configs/app/vite.showcase.config.ts` regular file; none is
|
|
1778
1793
|
* inferred from the workspace name. `dependencies` /
|
|
1779
1794
|
* `peers` are the `@orkestrel/`-prefixed entries of `manifest.dependencies` /
|
|
@@ -1793,8 +1808,8 @@ function selectOrkestrelEntries(value) {
|
|
|
1793
1808
|
* @throws `ScaffoldError('TARGET', …)` when `target`'s manifest is unreadable
|
|
1794
1809
|
* (via `readManifest`), is not valid JSON, its name is unsafe for its
|
|
1795
1810
|
* publication mode, or `target` carries no source or application environment.
|
|
1796
|
-
* @throws `ScaffoldError('
|
|
1797
|
-
*
|
|
1811
|
+
* @throws `ScaffoldError('INVALID', …)` when service tests use the retired flat
|
|
1812
|
+
* layout, a vendor directory has no test, or a service companion is missing.
|
|
1798
1813
|
*
|
|
1799
1814
|
* @example
|
|
1800
1815
|
* ```ts
|
|
@@ -1834,22 +1849,46 @@ function deriveBlueprint(target) {
|
|
|
1834
1849
|
const engines = typeof rawNode === "string" ? rawNode : DEFAULT_ENGINES;
|
|
1835
1850
|
const bin = isRealDirectory(join(target, "src", "bin"));
|
|
1836
1851
|
const integration = isRealDirectory(join(target, "tests", "integration"));
|
|
1837
|
-
const
|
|
1852
|
+
const serviceRoot = join(target, "tests", "service");
|
|
1853
|
+
const services = [];
|
|
1854
|
+
if (existsSync(serviceRoot)) {
|
|
1855
|
+
if (!isRealDirectory(serviceRoot)) throw new ScaffoldError("INVALID", `Service root at ${serviceRoot} must be a physical directory`, {
|
|
1856
|
+
target,
|
|
1857
|
+
path: "tests/service"
|
|
1858
|
+
});
|
|
1859
|
+
const serviceEntries = readdirSync(serviceRoot, { withFileTypes: true });
|
|
1860
|
+
const flat = serviceEntries.filter((entry) => entry.name.endsWith(".test.ts") && !entry.isDirectory()).map((entry) => entry.name).sort();
|
|
1861
|
+
if (flat.length > 0) throw new ScaffoldError("INVALID", `Flat service tests are not supported; move ${flat.join(", ")} into tests/service/<vendor>/`, {
|
|
1862
|
+
target,
|
|
1863
|
+
paths: flat.map((path) => `tests/service/${path}`)
|
|
1864
|
+
});
|
|
1865
|
+
for (const entry of serviceEntries) {
|
|
1866
|
+
const vendor = join(serviceRoot, entry.name);
|
|
1867
|
+
if (!isRealDirectory(vendor)) continue;
|
|
1868
|
+
if (!isWorkspaceName(entry.name)) throw new ScaffoldError("INVALID", `Service vendor directory "${entry.name}" must use a bounded lowercase name`, {
|
|
1869
|
+
target,
|
|
1870
|
+
path: `tests/service/${entry.name}`
|
|
1871
|
+
});
|
|
1872
|
+
if (listFiles(vendor).filter((path) => path.endsWith(".test.ts")).length === 0) throw new ScaffoldError("INVALID", `Service vendor "${entry.name}" contains no test; add tests/service/${entry.name}/**/*.test.ts or remove the directory`, {
|
|
1873
|
+
target,
|
|
1874
|
+
service: entry.name
|
|
1875
|
+
});
|
|
1876
|
+
const setup = `tests/service/${entry.name}/setup.ts`;
|
|
1877
|
+
if (!isRealFile(join(target, setup))) throw new ScaffoldError("INVALID", `Service vendor "${entry.name}" is missing ${setup}; add a readiness module that probes and warms the vendor and throws when unavailable`, {
|
|
1878
|
+
target,
|
|
1879
|
+
service: entry.name,
|
|
1880
|
+
missing: setup
|
|
1881
|
+
});
|
|
1882
|
+
services.push(entry.name);
|
|
1883
|
+
}
|
|
1884
|
+
services.sort();
|
|
1885
|
+
}
|
|
1838
1886
|
const showcaseRoot = join(target, dirname(SHOWCASE_CONFIG_PATH));
|
|
1839
1887
|
const showcaseEntries = attempt(() => readdirSync(showcaseRoot));
|
|
1840
1888
|
const showcase = showcaseEntries.success && showcaseEntries.value.includes(basename(SHOWCASE_CONFIG_PATH)) && isRealFile(join(target, SHOWCASE_CONFIG_PATH));
|
|
1841
1889
|
const tests = join(target, dirname(GLOBAL_SETUP_PATH));
|
|
1842
1890
|
const entries = attempt(() => readdirSync(tests));
|
|
1843
1891
|
const global = entries.success && entries.value.includes(basename(GLOBAL_SETUP_PATH)) && isRealFile(join(target, GLOBAL_SETUP_PATH));
|
|
1844
|
-
if (service) {
|
|
1845
|
-
const missing = [];
|
|
1846
|
-
if (!isRealFile(join(target, "tests", "setupService.ts"))) missing.push("tests/setupService.ts");
|
|
1847
|
-
if (!isRealFile(join(target, SERVICE_SCRIPT_PATH))) missing.push(SERVICE_SCRIPT_PATH);
|
|
1848
|
-
if (missing.length > 0) throw new ScaffoldError("TARGET", `Service tests under ${target} are missing ${missing.join(" and ")}`, {
|
|
1849
|
-
target,
|
|
1850
|
-
missing
|
|
1851
|
-
});
|
|
1852
|
-
}
|
|
1853
1892
|
const rawDependencies = ownDataValue(parsed, "dependencies");
|
|
1854
1893
|
const rawPeerDependencies = ownDataValue(parsed, "peerDependencies");
|
|
1855
1894
|
const dependencies = selectOrkestrelEntries(rawDependencies).map(([depName, range]) => ({
|
|
@@ -1878,7 +1917,7 @@ function deriveBlueprint(target) {
|
|
|
1878
1917
|
extras: [],
|
|
1879
1918
|
bin,
|
|
1880
1919
|
integration,
|
|
1881
|
-
|
|
1920
|
+
services,
|
|
1882
1921
|
global,
|
|
1883
1922
|
showcase
|
|
1884
1923
|
}))));
|
|
@@ -1901,7 +1940,7 @@ function deriveBlueprint(target) {
|
|
|
1901
1940
|
overrides: [],
|
|
1902
1941
|
bin,
|
|
1903
1942
|
integration,
|
|
1904
|
-
|
|
1943
|
+
services,
|
|
1905
1944
|
global,
|
|
1906
1945
|
showcase
|
|
1907
1946
|
});
|
|
@@ -2025,8 +2064,9 @@ function readManifest(target) {
|
|
|
2025
2064
|
* `manifest.json` — the raw-repo-root fallback (`Materializer` then maps
|
|
2026
2065
|
* an artifact's `source` to `host` 1:1, no vendored staging indirection).
|
|
2027
2066
|
* @throws `ScaffoldError('TARGET', …)` when `manifest.json` exists but is
|
|
2028
|
-
* unreadable, malformed,
|
|
2029
|
-
* bijectively and case-exactly onto real
|
|
2067
|
+
* unreadable, malformed, membership-corrupted, collision-prone,
|
|
2068
|
+
* root-incomplete, or does not map bijectively and case-exactly onto real
|
|
2069
|
+
* contained storage files.
|
|
2030
2070
|
*
|
|
2031
2071
|
* @example
|
|
2032
2072
|
* ```ts
|
|
@@ -2050,6 +2090,10 @@ function readHostManifest(host) {
|
|
|
2050
2090
|
host,
|
|
2051
2091
|
full
|
|
2052
2092
|
});
|
|
2093
|
+
if (manifest.digest !== digestHostManifest(manifest.entries, manifest.roots)) throw new ScaffoldError("TARGET", `Host manifest membership at ${full} is corrupted`, {
|
|
2094
|
+
host,
|
|
2095
|
+
full
|
|
2096
|
+
});
|
|
2053
2097
|
const destinationConflict = findFileConflict(manifest.entries.map((entry) => entry.destination));
|
|
2054
2098
|
if (destinationConflict !== void 0) throw new ScaffoldError("TARGET", `Host manifest destination collision between "${destinationConflict[0]}" and "${destinationConflict[1]}"`, {
|
|
2055
2099
|
host,
|
|
@@ -2526,7 +2570,8 @@ function stageHost(root, out, paths = HOST_PATHS) {
|
|
|
2526
2570
|
if (rootConflict !== void 0) throw new ScaffoldError("TARGET", `Directory collision between "${rootConflict[0]}" and "${rootConflict[1]}"`, { paths: rootConflict });
|
|
2527
2571
|
const manifest = {
|
|
2528
2572
|
entries,
|
|
2529
|
-
roots: uniqueRoots
|
|
2573
|
+
roots: uniqueRoots,
|
|
2574
|
+
digest: digestHostManifest(entries, uniqueRoots)
|
|
2530
2575
|
};
|
|
2531
2576
|
const parent = dirname(resolve(out));
|
|
2532
2577
|
const name = basename(resolve(out));
|
|
@@ -2625,6 +2670,7 @@ function stageHost(root, out, paths = HOST_PATHS) {
|
|
|
2625
2670
|
* {
|
|
2626
2671
|
* entries: [{ storage: 'pkg.tmpl', destination: 'package.json', executable: false }],
|
|
2627
2672
|
* roots: [],
|
|
2673
|
+
* digest: '3b52f19450237ea4cfb39bc7a77b1e5094b52a8ff1fc9c02fd68b13ad088aa0f',
|
|
2628
2674
|
* },
|
|
2629
2675
|
* 'package.json',
|
|
2630
2676
|
* './dist/host',
|
|
@@ -2737,7 +2783,8 @@ function hydratePlan(plan, host) {
|
|
|
2737
2783
|
});
|
|
2738
2784
|
if (entries.length === 0) {
|
|
2739
2785
|
if (source.startsWith("guides/src/") && source.endsWith(".md")) {
|
|
2740
|
-
|
|
2786
|
+
const { hex: _hex, ...presenceOwned } = artifact;
|
|
2787
|
+
artifacts.push(presenceOwned);
|
|
2741
2788
|
continue;
|
|
2742
2789
|
}
|
|
2743
2790
|
throw new ScaffoldError("TARGET", `Host manifest does not declare ${source}`, {
|
|
@@ -3080,9 +3127,10 @@ function catalogPackages(roots, limit = MAX_HOST_ENTRIES) {
|
|
|
3080
3127
|
* (`ScaffoldError('TARGET', …)`), then byte-copies each `host` artifact from
|
|
3081
3128
|
* the `host` root and writes each `template` / `computed` artifact's rendered
|
|
3082
3129
|
* `content`, failing fast on any write error (`ScaffoldError('WRITE', …)`).
|
|
3083
|
-
* `repair` is into-existing: it skips the vacancy check and writes
|
|
3084
|
-
* `
|
|
3085
|
-
*
|
|
3130
|
+
* `repair` is into-existing: it skips the vacancy check and writes `missing`
|
|
3131
|
+
* artifacts an `Audit` names. `stale` artifacts are report-only unless its
|
|
3132
|
+
* `replace` switch is true, because byte replacement discards local changes.
|
|
3133
|
+
* Hydrated directory-shaped host entries are expanded into
|
|
3086
3134
|
* file-shaped artifacts, so canonical skills and agent configuration are
|
|
3087
3135
|
* audited and repaired file by file. `prune` deletes stale files under
|
|
3088
3136
|
* `target/.claude/agents/`, `target/.codex/agents/`, and `target/scripts/`
|
|
@@ -3113,9 +3161,10 @@ function catalogPackages(roots, limit = MAX_HOST_ENTRIES) {
|
|
|
3113
3161
|
* source is always staged by `stageHost`, so a non-guide zero-match means a
|
|
3114
3162
|
* corrupted or truncated `manifest.json`, not an intentionally-unvendored
|
|
3115
3163
|
* artifact. For a guide pointer, a short stub file is written at the
|
|
3116
|
-
* destination and reported exactly like a successful copy
|
|
3117
|
-
*
|
|
3118
|
-
*
|
|
3164
|
+
* destination and reported exactly like a successful copy. The READ path
|
|
3165
|
+
* leaves that intentional pointer without canonical bytes, so `diffPlan`
|
|
3166
|
+
* treats it as presence-owned rather than inventing a byte match.
|
|
3167
|
+
* For every OTHER zero-match, the
|
|
3119
3168
|
* fail-closed `ScaffoldError('TARGET', …)` is thrown — degrading an
|
|
3120
3169
|
* unscoped zero-match would otherwise let a corrupted manifest silently stub
|
|
3121
3170
|
* an unrecoverable artifact (e.g. `AGENTS.md` — `pull` only ever fetches
|
|
@@ -3189,16 +3238,16 @@ var Materializer = class {
|
|
|
3189
3238
|
this.#emitter.emit("done", result);
|
|
3190
3239
|
return result;
|
|
3191
3240
|
}
|
|
3192
|
-
repair(plan, audit, target) {
|
|
3241
|
+
repair(plan, audit, target, replace = false) {
|
|
3193
3242
|
this.#ensureAlive();
|
|
3194
3243
|
const context = this.#prepare(plan, target, plan, false);
|
|
3195
3244
|
if (!hasOnlyDataProperties(audit) || !hasValidAuditBytes(audit)) throw new ScaffoldError("INVALID", "repair requires a bounded audit snapshot");
|
|
3196
3245
|
const preview = attempt(() => structuredClone(audit));
|
|
3197
3246
|
if (!preview.success || !Array.isArray(preview.value.findings)) throw new ScaffoldError("INVALID", "repair requires a structurally valid audit", { ...preview.success ? {} : { error: preview.error } });
|
|
3198
|
-
const
|
|
3247
|
+
const selectedPaths = new Set(preview.value.findings.filter((finding) => finding.drift === "missing" || replace === true && finding.drift === "stale").map((finding) => finding.path));
|
|
3199
3248
|
const selected = {
|
|
3200
3249
|
...context,
|
|
3201
|
-
artifacts: context.artifacts.filter((artifact) =>
|
|
3250
|
+
artifacts: context.artifacts.filter((artifact) => selectedPaths.has(artifact.path))
|
|
3202
3251
|
};
|
|
3203
3252
|
const prepared = this.#prepare(selected, target, context);
|
|
3204
3253
|
const preparedByPath = new Map(prepared.artifacts.map((artifact) => [artifact.path, artifact]));
|
|
@@ -3222,7 +3271,7 @@ var Materializer = class {
|
|
|
3222
3271
|
throw new ScaffoldError("INVALID", `Repair precondition is missing at ${artifact.path}`, { path: artifact.path });
|
|
3223
3272
|
});
|
|
3224
3273
|
const skipped = [];
|
|
3225
|
-
for (const artifact of context.artifacts) if (!
|
|
3274
|
+
for (const artifact of context.artifacts) if (!selectedPaths.has(artifact.path)) skipped.push(artifact.path);
|
|
3226
3275
|
const { written, copied } = this.#apply(prepared, target, preconditions);
|
|
3227
3276
|
const result = {
|
|
3228
3277
|
target,
|
|
@@ -4151,6 +4200,6 @@ function createSync(options) {
|
|
|
4151
4200
|
return new Sync(options);
|
|
4152
4201
|
}
|
|
4153
4202
|
//#endregion
|
|
4154
|
-
export { DEFAULT_SYNC_BUDGET, DEFAULT_SYNC_CONCURRENCY, DEFAULT_SYNC_ITEMS, DEFAULT_SYNC_LIMIT, DEFAULT_SYNC_TIMEOUT, HOST_MANIFEST_PATH, MAX_CATALOG_DESCRIPTION_LENGTH, MAX_FILESYSTEM_DEPTH, MAX_GUIDE_BYTES, MAX_HOST_DEPTH, MAX_HOST_ENTRIES, MAX_PATH_SEGMENT_BYTES, MAX_SYNC_BASE_LENGTH, MAX_SYNC_BRANCH_LENGTH, MAX_SYNC_BUDGET, MAX_SYNC_CONCURRENCY, MAX_SYNC_ITEMS, MAX_SYNC_LIMIT, MAX_SYNC_RETRIES, MAX_SYNC_TIMEOUT, Materializer, PRUNE_DIRECTORIES, RESERVED_PATH_SEGMENT_PATTERN, RESERVED_TARGET_PATH_PATTERN, SENSITIVE_HOST_PATH_PATTERN, SYNC_BRANCH_PATTERN, Sync, WRITE_DIGEST_PATTERN, WriteTransaction, catalogPackages, commitWriteTransaction, consumeCatalogAllowance, createMaterializer, createSync, createWriteDirectory, deriveBlueprint, digestFile, digestHex, digestText, discardWriteTransaction, discoverPackages, guideStub, guideToDescription, hostRoot, hydratePlan, isCatalogAllowance, isCatalogDescription, isDependencyData, isFilesystemPath, isHostManifest, isManifestEntry, isMaterializerEventHooks, isMissingPathError, isPortablePath, isRealDirectory, isRealFile, isReservedTargetPath, isSensitiveHostPath, isSyncEventHooks, isTerminalText, isVacant, isWritePrecondition, listDirectories, listFiles, locateHostSource, materializerOptionsContract, materializerOptionsShape, packageShortName, parseFilesystemPaths, parseMaterializerOptions, parsePortablePaths, parseSyncBase, parseSyncBranch, parseSyncCurrent, parseSyncDependencies, parseSyncNames, parseSyncOptions, parseWritePreconditions, pruneTargets, readFileHex, readFileText, readGuideReferences, readHostManifest, readManifest, readTarget, remapArtifactPath, replaceDirectory, resolveContainedPath, resolveGuideWrites, resolvePhysicalPath, resolveRealPath, restoreFiles, selectOrkestrelEntries, stageHost, storagePath, syncGuideOptionsShape, syncOptionsContract, syncOptionsShape, syncRegistryOptionsShape, syncReportOf, validateWriteAnchor, validateWriteDirectories, validateWriteTarget, vendoredPruneSet };
|
|
4203
|
+
export { DEFAULT_SYNC_BUDGET, DEFAULT_SYNC_CONCURRENCY, DEFAULT_SYNC_ITEMS, DEFAULT_SYNC_LIMIT, DEFAULT_SYNC_TIMEOUT, HOST_MANIFEST_PATH, MAX_CATALOG_DESCRIPTION_LENGTH, MAX_FILESYSTEM_DEPTH, MAX_GUIDE_BYTES, MAX_HOST_DEPTH, MAX_HOST_ENTRIES, MAX_PATH_SEGMENT_BYTES, MAX_SYNC_BASE_LENGTH, MAX_SYNC_BRANCH_LENGTH, MAX_SYNC_BUDGET, MAX_SYNC_CONCURRENCY, MAX_SYNC_ITEMS, MAX_SYNC_LIMIT, MAX_SYNC_RETRIES, MAX_SYNC_TIMEOUT, Materializer, PRUNE_DIRECTORIES, RESERVED_PATH_SEGMENT_PATTERN, RESERVED_TARGET_PATH_PATTERN, SENSITIVE_HOST_PATH_PATTERN, SYNC_BRANCH_PATTERN, Sync, WRITE_DIGEST_PATTERN, WriteTransaction, catalogPackages, commitWriteTransaction, consumeCatalogAllowance, createMaterializer, createSync, createWriteDirectory, deriveBlueprint, digestFile, digestHex, digestHostManifest, digestText, discardWriteTransaction, discoverPackages, guideStub, guideToDescription, hostRoot, hydratePlan, isCatalogAllowance, isCatalogDescription, isDependencyData, isFilesystemPath, isHostManifest, isManifestEntry, isMaterializerEventHooks, isMissingPathError, isPortablePath, isRealDirectory, isRealFile, isReservedTargetPath, isSensitiveHostPath, isSyncEventHooks, isTerminalText, isVacant, isWritePrecondition, listDirectories, listFiles, locateHostSource, materializerOptionsContract, materializerOptionsShape, packageShortName, parseFilesystemPaths, parseMaterializerOptions, parsePortablePaths, parseSyncBase, parseSyncBranch, parseSyncCurrent, parseSyncDependencies, parseSyncNames, parseSyncOptions, parseWritePreconditions, pruneTargets, readFileHex, readFileText, readGuideReferences, readHostManifest, readManifest, readTarget, remapArtifactPath, replaceDirectory, resolveContainedPath, resolveGuideWrites, resolvePhysicalPath, resolveRealPath, restoreFiles, selectOrkestrelEntries, stageHost, storagePath, syncGuideOptionsShape, syncOptionsContract, syncOptionsShape, syncRegistryOptionsShape, syncReportOf, validateWriteAnchor, validateWriteDirectories, validateWriteTarget, vendoredPruneSet };
|
|
4155
4204
|
|
|
4156
4205
|
//# sourceMappingURL=index.js.map
|