@orkestrel/scaffold 0.0.21 → 0.0.23

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.
Files changed (68) hide show
  1. package/dist/bin/scaffold.js +371 -140
  2. package/dist/bin/scaffold.js.map +1 -1
  3. package/dist/host/AGENTS.md +61 -42
  4. package/dist/host/CLAUDE.md +39 -408
  5. package/dist/host/agents/orchestration.md +454 -0
  6. package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +25 -7
  7. package/dist/host/agents/skills/orkestrel-align-packages/SKILL.md +2 -2
  8. package/dist/host/agents/skills/orkestrel-build-application/SKILL.md +42 -31
  9. package/dist/host/agents/skills/orkestrel-build-application/references/application.md +129 -0
  10. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +3 -3
  11. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +2 -2
  12. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +167 -0
  13. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +98 -0
  14. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +148 -0
  15. package/dist/host/agents/skills/orkestrel-harden-package/SKILL.md +4 -2
  16. package/dist/host/agents/skills/orkestrel-harden-package/references/centralization.md +5 -5
  17. package/dist/host/agents/skills/orkestrel-harden-package/references/research.md +2 -0
  18. package/dist/host/agents/skills/orkestrel-polish-surface/SKILL.md +11 -6
  19. package/dist/host/claude/agents/analyst.md +59 -0
  20. package/dist/host/claude/agents/application.md +1 -1
  21. package/dist/host/claude/agents/builder.md +1 -1
  22. package/dist/host/claude/agents/checker.md +5 -1
  23. package/dist/host/claude/agents/codex.md +120 -94
  24. package/dist/host/claude/agents/grok.md +44 -32
  25. package/dist/host/claude/agents/implementer.md +1 -1
  26. package/dist/host/claude/agents/orkestrel.md +5 -5
  27. package/dist/host/claude/agents/planner.md +9 -3
  28. package/dist/host/claude/agents/researcher.md +6 -5
  29. package/dist/host/claude/agents/reviewer.md +12 -6
  30. package/dist/host/claude/agents/scout.md +7 -4
  31. package/dist/host/claude/agents/verifier.md +1 -1
  32. package/dist/host/claude/rules/application.md +17 -16
  33. package/dist/host/claude/rules/architecture.md +41 -22
  34. package/dist/host/claude/rules/documentation.md +2 -1
  35. package/dist/host/claude/rules/names.md +7 -6
  36. package/dist/host/claude/rules/quality.md +65 -18
  37. package/dist/host/claude/rules/styles.md +1 -1
  38. package/dist/host/claude/rules/tests.md +12 -6
  39. package/dist/host/claude/rules/typescript.md +1 -1
  40. package/dist/host/claude/rules/workspace.md +6 -3
  41. package/dist/host/claude/settings.json +2 -0
  42. package/dist/host/claude/skills/orkestrel-falsify/SKILL.md +10 -0
  43. package/dist/host/codex/agents/analyst.toml +13 -4
  44. package/dist/host/codex/agents/checker.toml +1 -1
  45. package/dist/host/codex/agents/grok.toml +2 -1
  46. package/dist/host/codex/agents/opus.toml +1 -1
  47. package/dist/host/codex/agents/planner.toml +1 -1
  48. package/dist/host/codex/agents/researcher.toml +2 -2
  49. package/dist/host/codex/agents/reviewer.toml +1 -1
  50. package/dist/host/codex/agents/scout.toml +2 -2
  51. package/dist/host/codex/config.toml +23 -70
  52. package/dist/host/cursor/rules/orchestration.mdc +33 -0
  53. package/dist/host/guides/src/scaffold.md +339 -125
  54. package/dist/host/manifest.json +47 -1
  55. package/dist/host/tests/setupPolicy.ts +210 -3
  56. package/dist/src/core/index.cjs +477 -69
  57. package/dist/src/core/index.cjs.map +1 -1
  58. package/dist/src/core/index.d.cts +132 -43
  59. package/dist/src/core/index.d.ts +132 -43
  60. package/dist/src/core/index.js +474 -70
  61. package/dist/src/core/index.js.map +1 -1
  62. package/dist/src/server/index.cjs +83 -33
  63. package/dist/src/server/index.cjs.map +1 -1
  64. package/dist/src/server/index.d.cts +43 -27
  65. package/dist/src/server/index.d.ts +43 -27
  66. package/dist/src/server/index.js +84 -35
  67. package/dist/src/server/index.js.map +1 -1
  68. package/package.json +4 -4
@@ -1,23 +1,23 @@
1
- import { Audit } from '../core/index.ts';
2
- import { Blueprint } from '../core/index.ts';
1
+ import { Audit } from '@orkestrel/scaffold';
2
+ import { Blueprint } from '@orkestrel/scaffold';
3
3
  import { BooleanShape } from '@orkestrel/contract';
4
- import { CatalogEntry } from '../core/index.ts';
4
+ import { CatalogEntry } from '@orkestrel/scaffold';
5
5
  import { ContractInterface } from '@orkestrel/contract';
6
- import { Dependency } from '../core/index.ts';
6
+ import { Dependency } from '@orkestrel/scaffold';
7
7
  import { EmitterErrorHandler } from '@orkestrel/emitter';
8
8
  import { EmitterHooks } from '@orkestrel/emitter';
9
9
  import { EmitterInterface } from '@orkestrel/emitter';
10
- import { GuideSync } from '../core/index.ts';
11
- import { HostArtifact } from '../core/index.ts';
10
+ import { GuideSync } from '@orkestrel/scaffold';
11
+ import { HostArtifact } from '@orkestrel/scaffold';
12
12
  import { NumberShape } from '@orkestrel/contract';
13
13
  import { ObjectShape } from '@orkestrel/contract';
14
14
  import { OptionalShape } from '@orkestrel/contract';
15
- import { Plan } from '../core/index.ts';
16
- import { ScaffoldErrorCode } from '../core/index.ts';
17
- import { Snapshot } from '../core/index.ts';
15
+ import { Plan } from '@orkestrel/scaffold';
16
+ import { ScaffoldErrorCode } from '@orkestrel/scaffold';
17
+ import { Snapshot } from '@orkestrel/scaffold';
18
18
  import { StringShape } from '@orkestrel/contract';
19
- import { SyncReport } from '../core/index.ts';
20
- import { VersionSync } from '../core/index.ts';
19
+ import { SyncReport } from '@orkestrel/scaffold';
20
+ import { VersionSync } from '@orkestrel/scaffold';
21
21
 
22
22
  /** One mutable aggregate entry allowance shared by fleet catalog roots. */
23
23
  export declare type CatalogAllowance = Float64Array;
@@ -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`, `integration`, and `service` facts probe physical
143
- * directories at `src/bin`, `tests/integration`, and `tests/service`, respectively,
144
- * while `global` probes the physical exact-case `tests/setupGlobal.ts` file and `showcase`
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('TARGET', …)` when `tests/service` exists without the
165
- * physical companion files `tests/setupService.ts` and `scripts/service.sh`.
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 ONLY the
489
- * `missing` / `stale` artifacts an `Audit` names, leaving `aligned` ones
490
- * untouched. Hydrated directory-shaped host entries are expanded into
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, mirroring the
522
- * READ path (`hydratePlan` leaves such artifacts `content`-undefined, so
523
- * `diffPlan` audits them by PRESENCE only). For every OTHER zero-match, the
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, collision-prone, root-incomplete, or does not map
808
- * bijectively and case-exactly onto real contained storage files.
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
@@ -1,23 +1,23 @@
1
- import { Audit } from '../core/index.ts';
2
- import { Blueprint } from '../core/index.ts';
1
+ import { Audit } from '@orkestrel/scaffold';
2
+ import { Blueprint } from '@orkestrel/scaffold';
3
3
  import { BooleanShape } from '@orkestrel/contract';
4
- import { CatalogEntry } from '../core/index.ts';
4
+ import { CatalogEntry } from '@orkestrel/scaffold';
5
5
  import { ContractInterface } from '@orkestrel/contract';
6
- import { Dependency } from '../core/index.ts';
6
+ import { Dependency } from '@orkestrel/scaffold';
7
7
  import { EmitterErrorHandler } from '@orkestrel/emitter';
8
8
  import { EmitterHooks } from '@orkestrel/emitter';
9
9
  import { EmitterInterface } from '@orkestrel/emitter';
10
- import { GuideSync } from '../core/index.ts';
11
- import { HostArtifact } from '../core/index.ts';
10
+ import { GuideSync } from '@orkestrel/scaffold';
11
+ import { HostArtifact } from '@orkestrel/scaffold';
12
12
  import { NumberShape } from '@orkestrel/contract';
13
13
  import { ObjectShape } from '@orkestrel/contract';
14
14
  import { OptionalShape } from '@orkestrel/contract';
15
- import { Plan } from '../core/index.ts';
16
- import { ScaffoldErrorCode } from '../core/index.ts';
17
- import { Snapshot } from '../core/index.ts';
15
+ import { Plan } from '@orkestrel/scaffold';
16
+ import { ScaffoldErrorCode } from '@orkestrel/scaffold';
17
+ import { Snapshot } from '@orkestrel/scaffold';
18
18
  import { StringShape } from '@orkestrel/contract';
19
- import { SyncReport } from '../core/index.ts';
20
- import { VersionSync } from '../core/index.ts';
19
+ import { SyncReport } from '@orkestrel/scaffold';
20
+ import { VersionSync } from '@orkestrel/scaffold';
21
21
 
22
22
  /** One mutable aggregate entry allowance shared by fleet catalog roots. */
23
23
  export declare type CatalogAllowance = Float64Array;
@@ -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`, `integration`, and `service` facts probe physical
143
- * directories at `src/bin`, `tests/integration`, and `tests/service`, respectively,
144
- * while `global` probes the physical exact-case `tests/setupGlobal.ts` file and `showcase`
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('TARGET', …)` when `tests/service` exists without the
165
- * physical companion files `tests/setupService.ts` and `scripts/service.sh`.
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 ONLY the
489
- * `missing` / `stale` artifacts an `Audit` names, leaving `aligned` ones
490
- * untouched. Hydrated directory-shaped host entries are expanded into
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, mirroring the
522
- * READ path (`hydratePlan` leaves such artifacts `content`-undefined, so
523
- * `diffPlan` audits them by PRESENCE only). For every OTHER zero-match, the
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, collision-prone, root-incomplete, or does not map
808
- * bijectively and case-exactly onto real contained storage files.
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
@@ -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, SERVICE_SCRIPT_PATH, 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, validateDependencyArray, validatePlan } from "../core/index.js";
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
- return keys.length === 2 && keys.every((key) => key === "entries" || key === "roots") && entries !== void 0 && Reflect.has(entries, "value") && roots !== void 0 && Reflect.has(roots, "value") && isDenseDataArray(entries.value, 4096, isManifestEntry) && isDenseDataArray(roots.value, 4096, isPortablePath);
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`, `integration`, and `service` facts probe physical
1775
- * directories at `src/bin`, `tests/integration`, and `tests/service`, respectively,
1776
- * while `global` probes the physical exact-case `tests/setupGlobal.ts` file and `showcase`
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('TARGET', …)` when `tests/service` exists without the
1797
- * physical companion files `tests/setupService.ts` and `scripts/service.sh`.
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 service = isRealDirectory(join(target, "tests", "service"));
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
- service,
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
- service,
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, collision-prone, root-incomplete, or does not map
2029
- * bijectively and case-exactly onto real contained storage files.
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
- artifacts.push(artifact);
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 ONLY the
3084
- * `missing` / `stale` artifacts an `Audit` names, leaving `aligned` ones
3085
- * untouched. Hydrated directory-shaped host entries are expanded into
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, mirroring the
3117
- * READ path (`hydratePlan` leaves such artifacts `content`-undefined, so
3118
- * `diffPlan` audits them by PRESENCE only). For every OTHER zero-match, the
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 drifted = new Set(preview.value.findings.filter((finding) => finding.drift === "missing" || finding.drift === "stale").map((finding) => finding.path));
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) => drifted.has(artifact.path))
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 (!drifted.has(artifact.path)) skipped.push(artifact.path);
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