@orkestrel/scaffold 0.0.44 → 0.0.45

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 (66) hide show
  1. package/README.md +10 -10
  2. package/dist/bin/main.js +31 -31
  3. package/dist/bin/main.js.map +1 -1
  4. package/dist/host/AGENTS.md +7 -2
  5. package/dist/host/agents/orchestration.md +232 -56
  6. package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +7 -7
  7. package/dist/host/agents/skills/enterprise-bootstrap/references/bootstrap-reference.md +11 -9
  8. package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +3 -3
  9. package/dist/host/agents/skills/enterprise-bootstrap/references/frontend-design.md +3 -3
  10. package/dist/host/agents/skills/enterprise-bootstrap/references/utilities.md +1 -1
  11. package/dist/host/agents/skills/orkestrel-align-packages/SKILL.md +1 -1
  12. package/dist/host/agents/skills/orkestrel-build-application/SKILL.md +2 -2
  13. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +1 -1
  14. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +2 -2
  15. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +8 -8
  16. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +16 -14
  17. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +3 -3
  18. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +14 -14
  19. package/dist/host/agents/skills/orkestrel-harden-package/SKILL.md +1 -1
  20. package/dist/host/agents/skills/orkestrel-human-journey/SKILL.md +3 -3
  21. package/dist/host/agents/skills/orkestrel-human-journey/references/captures.md +3 -3
  22. package/dist/host/agents/skills/orkestrel-human-journey/references/layer.md +3 -3
  23. package/dist/host/agents/skills/orkestrel-polish-surface/SKILL.md +3 -3
  24. package/dist/host/claude/agents/analyst.md +2 -2
  25. package/dist/host/claude/agents/checker.md +2 -2
  26. package/dist/host/claude/agents/codex.md +5 -5
  27. package/dist/host/claude/agents/orkestrel.md +9 -8
  28. package/dist/host/claude/agents/planner.md +1 -1
  29. package/dist/host/claude/agents/researcher.md +2 -2
  30. package/dist/host/claude/agents/reviewer.md +1 -1
  31. package/dist/host/claude/agents/scout.md +2 -2
  32. package/dist/host/claude/agents/sol.md +3 -3
  33. package/dist/host/claude/agents/verifier.md +8 -0
  34. package/dist/host/claude/rules/application.md +7 -7
  35. package/dist/host/claude/rules/architecture.md +6 -6
  36. package/dist/host/claude/rules/documentation.md +1 -0
  37. package/dist/host/claude/rules/patterns.md +3 -3
  38. package/dist/host/claude/rules/quality.md +3 -3
  39. package/dist/host/claude/rules/tests.md +9 -2
  40. package/dist/host/claude/rules/workspace.md +7 -7
  41. package/dist/host/claude/rules/writing.md +12 -2
  42. package/dist/host/codex/agents/planner.toml +1 -1
  43. package/dist/host/configs/helpers.ts +21 -1
  44. package/dist/host/cursor/rules/orchestration.mdc +1 -1
  45. package/dist/host/dotfiles/gitignore +4 -1
  46. package/dist/host/guides/scaffold.md +134 -119
  47. package/dist/host/scripts/codex.sh +0 -0
  48. package/dist/host/scripts/cursor.sh +0 -0
  49. package/dist/host/scripts/deps.sh +0 -0
  50. package/dist/host/scripts/ollama.sh +0 -0
  51. package/dist/host/tests/config.test.ts +40 -1
  52. package/dist/host/tests/policy.test.ts +2 -2
  53. package/dist/host/tests/setupPolicy.ts +8 -5
  54. package/dist/src/core/index.cjs +143 -149
  55. package/dist/src/core/index.cjs.map +1 -1
  56. package/dist/src/core/index.d.cts +1624 -1643
  57. package/dist/src/core/index.d.ts +1624 -1643
  58. package/dist/src/core/index.js +144 -149
  59. package/dist/src/core/index.js.map +1 -1
  60. package/dist/src/server/index.cjs +82 -97
  61. package/dist/src/server/index.cjs.map +1 -1
  62. package/dist/src/server/index.d.cts +1844 -1871
  63. package/dist/src/server/index.d.ts +1844 -1871
  64. package/dist/src/server/index.js +83 -96
  65. package/dist/src/server/index.js.map +1 -1
  66. package/package.json +3 -3
@@ -3,7 +3,7 @@ import { fillTemplate } from "@orkestrel/template";
3
3
  import { Emitter } from "@orkestrel/emitter";
4
4
  //#region src/core/constants.ts
5
5
  /**
6
- * The three `Environment` values, frozen.
6
+ * The `Environment` values, frozen.
7
7
  *
8
8
  * @remarks
9
9
  * A blueprint's `src` and `app` axes are caller-supplied, so the gate measures
@@ -17,7 +17,7 @@ var ENVIRONMENTS = Object.freeze([
17
17
  "server"
18
18
  ]);
19
19
  /**
20
- * The seven `Group` values in plan order, frozen.
20
+ * The `Group` values in plan order, frozen.
21
21
  *
22
22
  * @remarks
23
23
  * A compile that names no groups covers every one of them, so this list is the
@@ -69,7 +69,7 @@ var SRC_MATRIX = Object.freeze({
69
69
  * @remarks
70
70
  * An application environment declares no exports, so it carries a runtime
71
71
  * entry instead of a subpath and formats. Core carries none because it is
72
- * shared logic the other two import rather than a host that runs.
72
+ * shared logic the other environments import rather than a host that runs.
73
73
  */
74
74
  var APP_MATRIX = Object.freeze({
75
75
  core: Object.freeze({
@@ -97,8 +97,8 @@ var BIN_ENTRY_PATH = "src/bin/main.ts";
97
97
  * @remarks
98
98
  * These are the files the fleet shares verbatim: the root instruction
99
99
  * documents, the licence, the canonical orchestration contract every harness
100
- * bridge points at, the four harness directories, the session hook scripts,
101
- * the shared policy register, the byte-identical root dotfiles, and the two
100
+ * bridge points at, the harness directories, the session hook scripts,
101
+ * the shared policy register, the byte-identical root dotfiles, and the
102
102
  * guide mirrors a generated workspace starts from. A directory entry vendors
103
103
  * everything beneath it.
104
104
  *
@@ -244,7 +244,7 @@ var DEPENDENCY_NAME_PATTERN = /^@orkestrel\/[a-z][a-z0-9-]*$/;
244
244
  * is admitted, so the shape cannot express a traversal.
245
245
  */
246
246
  var FOREIGN_NAME_PATTERN = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/;
247
- /** The exact three-component version syntax a blueprint declares. */
247
+ /** The exact `major.minor.patch` version syntax a blueprint declares. */
248
248
  var VERSION_PATTERN = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)$/;
249
249
  /**
250
250
  * The exact caret-pinned pre-1.0 range accepted for an `@orkestrel/*` runtime dependency.
@@ -259,7 +259,7 @@ var ORKESTREL_RANGE_PATTERN = /^\^0\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)$/;
259
259
  /** The registry-only semver subset accepted for a development extra's range. */
260
260
  var EXTRA_RANGE_PATTERN = /^(?:\^|~)?(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*)?$/;
261
261
  /**
262
- * The exact three-component floor accepted for a foreign peer's range.
262
+ * The exact `major.minor.patch` floor accepted for a foreign peer's range.
263
263
  *
264
264
  * @remarks
265
265
  * This is independent from {@link ENGINES_PATTERN}. An engine floors the Node
@@ -314,14 +314,14 @@ var DEFAULT_ENGINES = `>=${MINIMUM_NODE_VERSION}`;
314
314
  /** The tooling versions scaffold and every generated workspace share. */
315
315
  var BASE_DEV_DEPENDENCIES = Object.freeze({
316
316
  "@orkestrel/guide": "^0.0.12",
317
- "@orkestrel/scaffold": "^0.0.44",
317
+ "@orkestrel/scaffold": "^0.0.45",
318
318
  "@orkestrel/test": "^0.0.7",
319
319
  "@types/node": "^26.2.0",
320
- oxfmt: "^0.62.0",
321
- oxlint: "^1.77.0",
320
+ oxfmt: "^0.64.0",
321
+ oxlint: "^1.79.0",
322
322
  typescript: "^6.0.3",
323
- vite: "~8.2.0",
324
- vitest: "^4.1.10"
323
+ vite: "~8.2.1",
324
+ vitest: "^4.1.11"
325
325
  });
326
326
  /** The development dependencies that emit declarations for published source or an executable. */
327
327
  var DECLARATION_DEV_DEPENDENCIES = Object.freeze({
@@ -330,7 +330,7 @@ var DECLARATION_DEV_DEPENDENCIES = Object.freeze({
330
330
  });
331
331
  /** The development dependencies a published browser `src` environment adds. */
332
332
  var SOURCE_BROWSER_DEV_DEPENDENCIES = Object.freeze({
333
- "@vitest/browser-playwright": "^4.1.10",
333
+ "@vitest/browser-playwright": "^4.1.11",
334
334
  playwright: "^1.62.1"
335
335
  });
336
336
  /** The development dependency every private `app` environment adds. */
@@ -357,9 +357,9 @@ var SHOWCASE_DEV_DEPENDENCIES = Object.freeze({ "vite-plugin-singlefile": "^2.3.
357
357
  /** The development dependencies a private server application adds. */
358
358
  var APP_SERVER_DEV_DEPENDENCIES = Object.freeze({
359
359
  "@orkestrel/emitter": "^0.0.7",
360
- "@orkestrel/middleware": "^0.0.13",
360
+ "@orkestrel/middleware": "^0.0.16",
361
361
  "@orkestrel/router": "^0.0.10",
362
- "@orkestrel/server": "^0.0.13"
362
+ "@orkestrel/server": "^0.0.14"
363
363
  });
364
364
  //#endregion
365
365
  //#region src/core/templates.ts
@@ -461,6 +461,7 @@ const resolve = {
461
461
  emptyOutDir: true,
462
462
  sourcemap: true,
463
463
  minify: false,
464
+ rolldownOptions: { onLog: enforceBuildLog },
464
465
  },
465
466
  test: {
466
467
  name: { label: 'src:core', color: 'magenta' },
@@ -490,6 +491,7 @@ const resolve = {
490
491
  },
491
492
  outDir: 'dist/src/browser',
492
493
  rolldownOptions: {
494
+ onLog: enforceBuildLog,
493
495
  {{external}}
494
496
  {{output}}
495
497
  },
@@ -528,6 +530,7 @@ const resolve = {
528
530
  outDir: 'dist/src/server',
529
531
  target: 'node22',
530
532
  rolldownOptions: {
533
+ onLog: enforceBuildLog,
531
534
  platform: 'node',
532
535
  {{external}}
533
536
  {{output}}
@@ -562,6 +565,7 @@ const resolve = {
562
565
  outDir: 'dist/bin',
563
566
  target: 'node22',
564
567
  rolldownOptions: {
568
+ onLog: enforceBuildLog,
565
569
  external: (id: string) =>
566
570
  id.startsWith('node:') ||
567
571
  id.startsWith('@orkestrel/') ||
@@ -612,7 +616,10 @@ const resolve = {
612
616
  build: {
613
617
  {{showcaseBuild}} emptyOutDir: true,
614
618
  outDir: resolveWorkspacePath(output),
615
- rolldownOptions: { input: resolveWorkspacePath('app/browser/index.html') },
619
+ rolldownOptions: {
620
+ onLog: enforceBuildLog,
621
+ input: resolveWorkspacePath('app/browser/index.html'),
622
+ },
616
623
  },
617
624
  test: {
618
625
  name: { label: 'app:browser', color: 'blue' },
@@ -649,7 +656,10 @@ export function appBrowser(): UserConfig {
649
656
  },
650
657
  outDir: resolveWorkspacePath('dist/app/server'),
651
658
  target: 'node22',
652
- rolldownOptions: { external: (id: string) => id.startsWith('node:') },
659
+ rolldownOptions: {
660
+ onLog: enforceBuildLog,
661
+ external: (id: string) => id.startsWith('node:'),
662
+ },
653
663
  },
654
664
  test: {
655
665
  name: { label: 'app:server', color: 'green' },
@@ -1033,7 +1043,7 @@ export default defineConfig(
1033
1043
  import { srcBin } from '../../vite.config.ts'
1034
1044
 
1035
1045
  // The \`scaffold\` executable build — a single ESM lib file, no declarations (an
1036
- // executable ships no types), with the \`#!/usr/bin/env node\` shebang re-emitted via
1046
+ // executable ships no types), with the \`#!/usr/bin/env node\` shebang re-emitted through
1037
1047
  // \`output.banner\` (rolldown strips shebangs from source during bundling), and
1038
1048
  // \`output.paths\` rewriting the externalized \`@src/*\` specifiers to the built sibling
1039
1049
  // src environments (relative to \`dist/bin/\`), so the emitted bin resolves at runtime.
@@ -1285,7 +1295,7 @@ export function resolveBundledBrowser(platform: NodeJS.Platform, root: string):
1285
1295
  /**
1286
1296
  * Resolve the first installed stable system Chromium channel.
1287
1297
  *
1288
- * @param platform - The Node platform whose standard layouts should be probed.
1298
+ * @param platform - The Node platform whose standard layouts this call probes.
1289
1299
  * @param environment - The process environment supplying Windows installation roots.
1290
1300
  * @returns \`chrome\`, then \`msedge\`, or \`undefined\` when neither is executable.
1291
1301
  *
@@ -1330,7 +1340,7 @@ export function resolveSystemBrowser(
1330
1340
  * Resolve Playwright provider options for whatever browser this host can actually launch.
1331
1341
  *
1332
1342
  * @param pinned - The executable path for Playwright's pinned Chromium revision, when it has one.
1333
- * @param platform - The Node platform whose standard layouts should be probed.
1343
+ * @param platform - The Node platform whose standard layouts this call probes.
1334
1344
  * @param environment - The process environment supplying operator overrides and Windows roots.
1335
1345
  * @param root - The managed-container bundled browsers directory to search.
1336
1346
  * @returns Provider options naming an executable, a WebSocket endpoint, or a channel.
@@ -1339,7 +1349,7 @@ export function resolveSystemBrowser(
1339
1349
  * Precedence, most important first: \`PLAYWRIGHT_EXECUTABLE_PATH\`, \`PLAYWRIGHT_WS_ENDPOINT\`,
1340
1350
  * \`PLAYWRIGHT_CHANNEL\`, the managed Playwright Chromium, the container's bundled Chromium, a
1341
1351
  * verified system channel, then the platform default channel. An operator override outranks
1342
- * discovery and is returned exactly as given: none of those three environment values is checked
1352
+ * discovery and is returned exactly as given: none of those environment values is checked
1343
1353
  * against the filesystem, because verifying an override would defeat the override. The pinned
1344
1354
  * managed revision outranks anything found on the host because it is deterministic. The installed
1345
1355
  * pinned revision returns empty options so Playwright keeps its own default launch semantics. Only
@@ -1616,7 +1626,7 @@ var isHex = stringOf({
1616
1626
  * The bound is a code-unit ceiling rather than a byte count, because a string
1617
1627
  * of more code units than {@link MAX_ARTIFACT_BYTES} cannot encode within that
1618
1628
  * budget under any encoding this package writes. The exact UTF-8 measurement
1619
- * belongs to the compiler and the writer, which are the two places the bytes
1629
+ * belongs to the compiler and the writer, which are the places the bytes
1620
1630
  * are actually produced.
1621
1631
  */
1622
1632
  var isContent = stringOf({ max: MAX_ARTIFACT_BYTES });
@@ -1889,7 +1899,7 @@ var isFinding = unionOf(recordOf({
1889
1899
  *
1890
1900
  * @remarks
1891
1901
  * An audit reaches the writer and the destructive verb, so it is guarded as
1892
- * strictly as the plan beside it. Findings use the sum of the two producer
1902
+ * strictly as the plan beside it. Findings use the sum of the producer
1893
1903
  * bounds: one per planned artifact, then one per unplanned snapshot path.
1894
1904
  */
1895
1905
  var isAudit = recordOf({
@@ -1901,7 +1911,7 @@ var isAudit = recordOf({
1901
1911
  *
1902
1912
  * @remarks
1903
1913
  * `content` is the fetched guide text and `observed` is the local mirror's
1904
- * exact bytes, so the two carry different laws: one is content this package
1914
+ * exact bytes, so they carry different laws: one is content this package
1905
1915
  * writes, the other is the precondition that write is held to.
1906
1916
  */
1907
1917
  var isMirror = unionOf(recordOf({
@@ -2268,7 +2278,7 @@ function matchesOrchestrationPath(path) {
2268
2278
  * @returns The group that owns the path.
2269
2279
  *
2270
2280
  * @remarks
2271
- * A path is grouped by what it governs rather than by where it sits. The two
2281
+ * A path is grouped by what it governs rather than by where it sits. The
2272
2282
  * manifest files are named exactly; anything
2273
2283
  * {@link matchesOrchestrationPath} accepts is orchestration; `src` and `app`
2274
2284
  * are source; `tests`, `guides`, and `docs` carry their own names; the licence
@@ -2400,7 +2410,7 @@ function matchesPrintWidth(line) {
2400
2410
  * module's own relative depth, so a nested module emits a path that escapes
2401
2411
  * `dist/src` and a flat one resolves only by luck. Both faces rewrite the same
2402
2412
  * relative core path to the package's published root export, so the branch is
2403
- * derived once here. The extension alternation is what the two permitted import
2413
+ * derived once here. The extension alternation is what the permitted import
2404
2414
  * spellings produce: an `@src/core` alias resolves to the core source module and
2405
2415
  * prints `.ts`, while a relative import prints the `.js` specifier it was
2406
2416
  * written with. The formatter keeps the call on one line only while the line it
@@ -2580,8 +2590,8 @@ function matchesDriftReachability(ownership, finding) {
2580
2590
  *
2581
2591
  * The order matters because these packages are `0.0.x`, where a caret pins one
2582
2592
  * exact release. Publishing a dependent before its dependency leaves the
2583
- * dependent pinned to the older release, and two ranges that disagree install
2584
- * two copies of one package that the compiler reads as two distinct types.
2593
+ * dependent pinned to the older release, and ranges that disagree install
2594
+ * duplicate copies of one package that the compiler reads as distinct types.
2585
2595
  *
2586
2596
  * A cycle cannot be published in rounds, so its members are omitted rather than
2587
2597
  * placed in an order that would be wrong. An absent name is the report: compare
@@ -2650,11 +2660,11 @@ function planToSummary(plan) {
2650
2660
  };
2651
2661
  }
2652
2662
  /**
2653
- * Extract the three numeric components of an exact version.
2663
+ * Extract the major, minor, and patch components of an exact version.
2654
2664
  *
2655
2665
  * @param version - The candidate version text.
2656
2666
  * @returns The major, minor, and patch numbers, or `undefined` when the text is
2657
- * not the exact three-component syntax.
2667
+ * not the exact `major.minor.patch` syntax.
2658
2668
  *
2659
2669
  * @remarks
2660
2670
  * Deliberately narrow: a prerelease or build suffix is not extracted, because
@@ -2724,10 +2734,10 @@ function compareVersions(left, right) {
2724
2734
  * @remarks
2725
2735
  * The one place this comparison is made. A `Release` records the declared range
2726
2736
  * and the reported version and stores no verdict beside them, because a stored
2727
- * verdict could only disagree with the two fields it sits next to.
2737
+ * verdict could only disagree with the fields it sits next to.
2728
2738
  *
2729
2739
  * Readability is decided first, and it is `EXTRA_RANGE_PATTERN`: an optional
2730
- * caret or tilde over three numeric components and an optional prerelease
2740
+ * caret or tilde over `major.minor.patch` and an optional prerelease
2731
2741
  * suffix. That pattern already covers every `ORKESTREL_RANGE_PATTERN` range and
2732
2742
  * every `VERSION_PATTERN` version, so the subset is stated once rather than
2733
2743
  * assembled here. Text outside it is never admitted, including text handed in on
@@ -3034,7 +3044,7 @@ function srcToExports(src) {
3034
3044
  * not installed by the workspace that declares it and developing against one
3035
3045
  * requires it present. A runtime dependency is the opposite case and is removed:
3036
3046
  * it is already installed, so a second declaration would state one fact twice
3037
- * and the two ranges would be free to disagree.
3047
+ * and the ranges would be free to disagree.
3038
3048
  *
3039
3049
  * A workspace never declares itself, so its own package name is removed. That
3040
3050
  * matters for a workspace named after a package the baseline already carries:
@@ -3218,7 +3228,7 @@ function blueprintToScripts(blueprint) {
3218
3228
  * artifact serialized directly.
3219
3229
  *
3220
3230
  * The artifact carrying this text is claimed by birth. A workspace owns its own
3221
- * manifest once it exists: its description, its keywords, and any script it
3231
+ * manifest after it exists: its description, its keywords, and any script it
3222
3232
  * added are the consumer's, so a repair that replaced the file would take them.
3223
3233
  * The one part scaffold keeps current afterwards is the declared `@orkestrel/*`
3224
3234
  * range set, and that is a region with its own writer rather than a claim over
@@ -3288,7 +3298,7 @@ function blueprintToManifest(blueprint) {
3288
3298
  * Derive the host-specific machinery a generated root Vite configuration carries.
3289
3299
  *
3290
3300
  * @param blueprint - The workspace specification.
3291
- * @returns The four pipelines the generated configuration selects.
3301
+ * @returns The pipelines the generated configuration selects.
3292
3302
  *
3293
3303
  * @remarks
3294
3304
  * The sole derivation of that set: every renderer reads it rather than
@@ -3519,11 +3529,15 @@ export function appShowcase(): UserConfig {
3519
3529
  ${projects.map((project) => `\t\t\t${project},`).join("\n")}
3520
3530
  \t],`;
3521
3531
  const body = `${factories.join("\n")}\n`;
3522
- const boundaries = ["environmentBoundary", "outputBoundary"].filter((boundary) => body.includes(boundary));
3532
+ const helpers = [
3533
+ "enforceBuildLog",
3534
+ "environmentBoundary",
3535
+ "outputBoundary"
3536
+ ].filter((helper) => body.includes(helper));
3523
3537
  return fillTemplate(CONFIG_TEMPLATES.root.vite, {
3524
3538
  viteTypes: machinery.showcase ? "PluginOption, UserConfig" : "UserConfig",
3525
3539
  imports: imports.length === 0 ? "" : `${imports.join("\n")}\n`,
3526
- helpers: boundaries.length === 0 ? "" : `import { ${boundaries.join(", ")} } from './configs/helpers.js'\n`,
3540
+ helpers: helpers.length === 0 ? "" : `import { ${helpers.join(", ")} } from './configs/helpers.js'\n`,
3527
3541
  browsers: machinery.browser ? "import { resolveBrowser, resolvePinnedBrowser } from './configs/browsers.js'\n" : "",
3528
3542
  options: machinery.browser ? "const browserOptions = resolveBrowser(resolvePinnedBrowser(), process.platform, process.env)\n\n" : "",
3529
3543
  factories: body,
@@ -3648,7 +3662,7 @@ ${paths.join("\n")}
3648
3662
  *
3649
3663
  * @remarks
3650
3664
  * The barrels and every runtime entry intentionally hold nothing. A generated
3651
- * sample entity is too easy to mistake for package implementation, so the
3665
+ * sample entity would read as package implementation, so the
3652
3666
  * scaffold establishes only the selected environment boundaries. An application
3653
3667
  * entry is empty for the same reason the bin entry is, and because the vendored
3654
3668
  * lint config refuses an unassigned import outside a stylesheet, so the entry
@@ -4018,9 +4032,9 @@ function applyOverrides(artifacts, overrides) {
4018
4032
  *
4019
4033
  * @example
4020
4034
  * ```ts
4021
- * import { createBlueprint, createCompiler, planToHash } from '@orkestrel/scaffold'
4035
+ * import { Compiler, createBlueprint, planToHash } from '@orkestrel/scaffold'
4022
4036
  *
4023
- * const { plan } = createCompiler().compile(createBlueprint('router', { src: ['core'] }))
4037
+ * const { plan } = new Compiler().compile(createBlueprint('router', { src: ['core'] }))
4024
4038
  *
4025
4039
  * plan === undefined ? undefined : planToHash(plan)?.length // 16
4026
4040
  * ```
@@ -4049,7 +4063,7 @@ function planToHash(plan) {
4049
4063
  * destination has no bytes to record, and every other verdict records the bytes
4050
4064
  * it was given, which is the precondition the mutation that follows is held to.
4051
4065
  * Ownership is copied rather than inferred from drift because aligned findings
4052
- * span all three ownership tiers.
4066
+ * span every ownership tier.
4053
4067
  *
4054
4068
  * `foreign` is not answerable here, because it describes a path no artifact was
4055
4069
  * planned for.
@@ -4112,9 +4126,9 @@ function artifactToFinding(artifact, observed) {
4112
4126
  *
4113
4127
  * @example
4114
4128
  * ```ts
4115
- * import { createBlueprint, createCompiler, planToFindings } from '@orkestrel/scaffold'
4129
+ * import { Compiler, createBlueprint, planToFindings } from '@orkestrel/scaffold'
4116
4130
  *
4117
- * const { plan } = createCompiler().compile(createBlueprint('router', { src: ['core'] }))
4131
+ * const { plan } = new Compiler().compile(createBlueprint('router', { src: ['core'] }))
4118
4132
  *
4119
4133
  * plan === undefined ? [] : planToFindings(plan, { 'AGENTS.md': '68690a' })
4120
4134
  * ```
@@ -4150,7 +4164,7 @@ function planToFindings(plan, current) {
4150
4164
  * range, in list order.
4151
4165
  *
4152
4166
  * @remarks
4153
- * The declared lists and peer partitions differ only in the two syntaxes they
4167
+ * The declared lists and peer partitions differ only in the syntaxes they
4154
4168
  * accept, so the rules live here once and each caller supplies its own patterns.
4155
4169
  * A runtime dependency name reaches a path through its guide mirror and is
4156
4170
  * fixed to the `@orkestrel` scope. A foreign peer or development extra reaches
@@ -4207,14 +4221,14 @@ function dependenciesToQuestions(dependencies, field, name, range) {
4207
4221
  * Only the laws a blueprint answers alone are here. The structural record and
4208
4222
  * its bounds are already settled by `isBlueprint`, which refuses a value that is
4209
4223
  * not a blueprint at all; what remains is the syntax of a name, a version, a
4210
- * range, and an engines floor, the combinations the two environment axes admit,
4211
- * and the overlaps between the three declared package lists. The laws that need
4224
+ * range, and an engines floor, the combinations the environment axes admit,
4225
+ * and the overlaps between the declared package lists. The laws that need
4212
4226
  * a drafted plan belong to {@link artifactsToQuestions} and
4213
4227
  * {@link overridesToQuestions}.
4214
4228
  *
4215
4229
  * A question blocks when it describes a workspace this package cannot generate.
4216
- * Three do not, because each describes a workspace it can describe honestly and
4217
- * should not create: a published axis of several environments without core,
4230
+ * These do not, because each describes a workspace it can describe honestly but
4231
+ * will not create: a published axis of several environments without core,
4218
4232
  * whose manifest names a core build the workspace never runs; a showcase flag
4219
4233
  * whose required browser axis is absent, which emits nothing; and an
4220
4234
  * integration flag over fewer than two environments, whose seed does emit and
@@ -4461,6 +4475,72 @@ function overridesToQuestions(overrides, artifacts) {
4461
4475
  return questions;
4462
4476
  }
4463
4477
  //#endregion
4478
+ //#region src/core/factories.ts
4479
+ /**
4480
+ * Construct a {@link Blueprint} from a name and the fields that differ from the defaults.
4481
+ *
4482
+ * @param name - The bare workspace name.
4483
+ * @param input - The fields to set; every omitted field takes its default.
4484
+ * @returns The filled blueprint, owned by the caller and sharing nothing with `input`.
4485
+ * @throws {@link ScaffoldError} coded `INVALID` when the filled record is not a
4486
+ * blueprint.
4487
+ *
4488
+ * @remarks
4489
+ * A blueprint is a closed record, and most of its fields have one sensible
4490
+ * starting value: an empty list, a cleared flag, `DEFAULT_VERSION`, and
4491
+ * `DEFAULT_ENGINES`. Filling them here is what lets a caller state only what its
4492
+ * workspace actually declares.
4493
+ *
4494
+ * This is the construction door, and {@link parseBlueprint} is the coercing one.
4495
+ * They differ in every part: this fills the defaults and takes a
4496
+ * partial specification, where the parser fills nothing and takes an untrusted
4497
+ * value; and this refuses by throwing, where the parser refuses by answering
4498
+ * `undefined`. What they share is the law — both accept exactly what
4499
+ * `isBlueprint` accepts.
4500
+ *
4501
+ * That law is structural only. Whether the name is a name, the version a
4502
+ * version, and the environment axes a combination this package can generate
4503
+ * are the gate's laws, and the gate answers them with {@link Question}s carrying
4504
+ * their accepted candidates. Deciding them here as well would restate that law
4505
+ * and let the answers disagree, so a blueprint the gate will
4506
+ * refuse is still constructible.
4507
+ *
4508
+ * @example
4509
+ * ```ts
4510
+ * import { createBlueprint } from '@orkestrel/scaffold'
4511
+ *
4512
+ * createBlueprint('router', { src: ['core'] }).version // '0.0.1'
4513
+ * createBlueprint('Router').name // 'Router' — the gate refuses it, this does not
4514
+ * ```
4515
+ */
4516
+ function createBlueprint(name, input) {
4517
+ const blueprint = parseBlueprint(cloneValue({
4518
+ name,
4519
+ ...input?.description === void 0 ? {} : { description: input.description },
4520
+ keywords: input?.keywords ?? [],
4521
+ src: input?.src ?? [],
4522
+ app: input?.app ?? [],
4523
+ dependencies: input?.dependencies ?? [],
4524
+ peers: input?.peers ?? [],
4525
+ extras: input?.extras ?? [],
4526
+ version: input?.version ?? "0.0.1",
4527
+ engines: input?.engines ?? DEFAULT_ENGINES,
4528
+ overrides: input?.overrides ?? [],
4529
+ bin: input?.bin ?? false,
4530
+ setup: input?.setup ?? false,
4531
+ guides: input?.guides ?? false,
4532
+ distribution: input?.distribution ?? false,
4533
+ integration: input?.integration ?? false,
4534
+ conformance: input?.conformance ?? false,
4535
+ service: input?.service ?? false,
4536
+ vendors: input?.vendors ?? [],
4537
+ global: input?.global ?? false,
4538
+ showcase: input?.showcase ?? false
4539
+ }));
4540
+ if (blueprint === void 0) throw new ScaffoldError("INVALID", "The filled record is not a blueprint.", { name });
4541
+ return blueprint;
4542
+ }
4543
+ //#endregion
4464
4544
  //#region src/core/Compiler.ts
4465
4545
  /**
4466
4546
  * The compile spine: draft, gate, pin, run in that order over a blueprint.
@@ -4483,7 +4563,7 @@ function overridesToQuestions(overrides, artifacts) {
4483
4563
  * `INVALID`. Structure raises; the laws a well-formed blueprint can still break
4484
4564
  * are the gate's, and they answer with questions.
4485
4565
  *
4486
- * Two consequences of that order are worth stating, because they are the ones a
4566
+ * The consequences of that order are worth stating, because they are the ones a
4487
4567
  * JavaScript caller meets first. A property backed by an accessor is refused
4488
4568
  * rather than read, which is what closes the race a guard cannot close from
4489
4569
  * inside; the accessor never runs. And an optional field present with the value
@@ -4545,21 +4625,21 @@ var Compiler = class {
4545
4625
  * carries no plan, then `compile` with the whole outcome either way, so an
4546
4626
  * observer reads every compile from one event and the refusals from the other.
4547
4627
  *
4548
- * A plan says the blueprint can be built. It does not say the blueprint should
4549
- * be created, and the questions beside it are what this compiler could not
4550
- * settle. A caller creating a fresh workspace answers them first and writes
4551
- * nothing while any remains, which is the rule the `new` verb applies; a caller
4552
- * describing or repairing an existing target carries them through instead.
4553
- * Nothing downstream repeats that check, because only the caller knows which of
4554
- * the two it is.
4628
+ * A plan says the blueprint can be built. It does not decide whether to create
4629
+ * it, and the questions beside it are what this compiler could not settle. A
4630
+ * caller creating a fresh workspace answers them first and writes nothing while
4631
+ * any remains, which is the rule the `new` verb applies; a caller describing or
4632
+ * repairing an existing target carries them through instead.
4633
+ * Nothing downstream repeats that check, because only the caller knows which
4634
+ * case it is.
4555
4635
  *
4556
4636
  * @example
4557
4637
  * ```ts
4558
- * import { createBlueprint, createCompiler } from '@orkestrel/scaffold'
4638
+ * import { Compiler, createBlueprint } from '@orkestrel/scaffold'
4559
4639
  *
4560
4640
  * const blueprint = createBlueprint('router', { src: ['core'] })
4561
4641
  *
4562
- * createCompiler().compile(blueprint, ['manifest']).plan?.artifacts.length // 1
4642
+ * new Compiler().compile(blueprint, ['manifest']).plan?.artifacts.length // 1
4563
4643
  * ```
4564
4644
  */
4565
4645
  compile(blueprint, groups) {
@@ -4592,12 +4672,12 @@ var Compiler = class {
4592
4672
  *
4593
4673
  * @example
4594
4674
  * ```ts
4595
- * import { createBlueprint, createCompiler } from '@orkestrel/scaffold'
4675
+ * import { Compiler, createBlueprint } from '@orkestrel/scaffold'
4596
4676
  *
4597
4677
  * const blueprint = createBlueprint('router', { src: ['core'] })
4598
4678
  *
4599
- * createCompiler().audit(blueprint, {}, ['manifest']).findings[0]?.drift // 'aligned'
4600
- * createCompiler().audit(blueprint, {}, ['configs']).findings[0]?.drift // 'missing'
4679
+ * new Compiler().audit(blueprint, {}, ['manifest']).findings[0]?.drift // 'aligned'
4680
+ * new Compiler().audit(blueprint, {}, ['configs']).findings[0]?.drift // 'missing'
4601
4681
  * ```
4602
4682
  */
4603
4683
  audit(blueprint, current, groups) {
@@ -4620,9 +4700,9 @@ var Compiler = class {
4620
4700
  *
4621
4701
  * @example
4622
4702
  * ```ts
4623
- * import { createCompiler } from '@orkestrel/scaffold'
4703
+ * import { Compiler } from '@orkestrel/scaffold'
4624
4704
  *
4625
- * const compiler = createCompiler()
4705
+ * const compiler = new Compiler()
4626
4706
  * compiler.destroy()
4627
4707
  * compiler.emitter.destroyed // true
4628
4708
  * ```
@@ -4762,91 +4842,6 @@ var Compiler = class {
4762
4842
  }
4763
4843
  };
4764
4844
  //#endregion
4765
- //#region src/core/factories.ts
4766
- /**
4767
- * Construct a {@link Blueprint} from a name and the fields that differ from the defaults.
4768
- *
4769
- * @param name - The bare workspace name.
4770
- * @param input - The fields to set; every omitted field takes its default.
4771
- * @returns The filled blueprint, owned by the caller and sharing nothing with `input`.
4772
- * @throws {@link ScaffoldError} coded `INVALID` when the filled record is not a
4773
- * blueprint.
4774
- *
4775
- * @remarks
4776
- * A blueprint is a closed record, and most of its fields have one sensible
4777
- * starting value: an empty list, a cleared flag, `DEFAULT_VERSION`, and
4778
- * `DEFAULT_ENGINES`. Filling them here is what lets a caller state only what its
4779
- * workspace actually declares.
4780
- *
4781
- * This is the construction door, and {@link parseBlueprint} is the coercing one.
4782
- * They differ in all three of their parts: this fills the defaults and takes a
4783
- * partial specification, where the parser fills nothing and takes an untrusted
4784
- * value; and this refuses by throwing, where the parser refuses by answering
4785
- * `undefined`. What they share is the law — both accept exactly what
4786
- * `isBlueprint` accepts.
4787
- *
4788
- * That law is structural only. Whether the name is a name, the version a
4789
- * version, and the two environment axes a combination this package can generate
4790
- * are the gate's laws, and the gate answers them with {@link Question}s carrying
4791
- * their accepted candidates. Deciding them here as well would state one law in
4792
- * two places and let the two answers disagree, so a blueprint the gate will
4793
- * refuse is still constructible.
4794
- *
4795
- * @example
4796
- * ```ts
4797
- * import { createBlueprint } from '@orkestrel/scaffold'
4798
- *
4799
- * createBlueprint('router', { src: ['core'] }).version // '0.0.1'
4800
- * createBlueprint('Router').name // 'Router' — the gate refuses it, this does not
4801
- * ```
4802
- */
4803
- function createBlueprint(name, input) {
4804
- const blueprint = parseBlueprint(cloneValue({
4805
- name,
4806
- ...input?.description === void 0 ? {} : { description: input.description },
4807
- keywords: input?.keywords ?? [],
4808
- src: input?.src ?? [],
4809
- app: input?.app ?? [],
4810
- dependencies: input?.dependencies ?? [],
4811
- peers: input?.peers ?? [],
4812
- extras: input?.extras ?? [],
4813
- version: input?.version ?? "0.0.1",
4814
- engines: input?.engines ?? DEFAULT_ENGINES,
4815
- overrides: input?.overrides ?? [],
4816
- bin: input?.bin ?? false,
4817
- setup: input?.setup ?? false,
4818
- guides: input?.guides ?? false,
4819
- distribution: input?.distribution ?? false,
4820
- integration: input?.integration ?? false,
4821
- conformance: input?.conformance ?? false,
4822
- service: input?.service ?? false,
4823
- vendors: input?.vendors ?? [],
4824
- global: input?.global ?? false,
4825
- showcase: input?.showcase ?? false
4826
- }));
4827
- if (blueprint === void 0) throw new ScaffoldError("INVALID", "The filled record is not a blueprint.", { name });
4828
- return blueprint;
4829
- }
4830
- /**
4831
- * Construct a {@link Compiler}.
4832
- *
4833
- * @param options - The initial listeners and the listener-error handler.
4834
- * @returns The compiler, typed as the contract consumers program against.
4835
- * @throws {@link ScaffoldError} coded `INVALID` when `options` is present but is
4836
- * not an option bag the compiler accepts.
4837
- *
4838
- * @example
4839
- * ```ts
4840
- * import { createCompiler } from '@orkestrel/scaffold'
4841
- *
4842
- * const compiler = createCompiler({ on: { block: (questions) => report(questions) } })
4843
- * compiler.destroy()
4844
- * ```
4845
- */
4846
- function createCompiler(options) {
4847
- return new Compiler(options);
4848
- }
4849
- //#endregion
4850
- export { APP_BROWSER_DEV_DEPENDENCIES, APP_DEV_DEPENDENCIES, APP_MATRIX, APP_SERVER_DEV_DEPENDENCIES, ARTIFACT_TEMPLATES, BASE_DEV_DEPENDENCIES, BIN_CONFIGS, BIN_ENTRY_PATH, CATALOG_AGENT_PATH, CONFIG_TEMPLATES, CONFORMANCE_TEST_PATH, CONTROL_CHARACTER_PATTERN, Compiler, DECLARATION_DEV_DEPENDENCIES, DEFAULT_ENGINES, DEFAULT_VERSION, DEPENDENCY_NAME_PATTERN, DISTRIBUTION_TEST_PATH, ENGINES_PATTERN, ENVIRONMENTS, EXECUTABLE_PATHS, EXTRA_RANGE_PATTERN, FLOOR_RANGE_PATTERN, FOREIGN_NAME_PATTERN, GLOBAL_SETUP_PATH, GROUPS, GUIDES_TEST_PATH, HEX_PATTERN, HOST_PATHS, INTEGRATION_TEST_PATH, INVALID_PATH_CHARACTER_PATTERN, MAX_ARTIFACT_BYTES, MAX_ARTIFACT_HEX_LENGTH, MAX_AUDIT_FINDINGS, MAX_COLLECTION_ITEMS, MAX_DEPENDENCY_NAME_LENGTH, MAX_MANIFEST_BYTES, MAX_NAME_LENGTH, MAX_PATH_LENGTH, MAX_RANGE_LENGTH, MAX_TOTAL_ARTIFACT_BYTES, MINIMUM_NODE_VERSION, NAME_PATTERN, ORCHESTRATION_PATH_NAMES, ORCHESTRATION_PATH_PREFIXES, ORKESTREL_RANGE_PATTERN, PRINT_WIDTH, SERVICE_SCRIPT_PATH, SERVICE_SETUP_PATH, SERVICE_TEST_INCLUDE, SHOWCASE_CONFIG_PATH, SHOWCASE_DEV_DEPENDENCIES, SOURCE_BROWSER_DEV_DEPENDENCIES, SRC_MATRIX, ScaffoldError, TAB_WIDTH, VERSION_PATTERN, WORKSPACE_OWNED_PATHS, applyOverrides, artifactToFinding, artifactToHex, artifactsToQuestions, blueprintToConfigArtifacts, blueprintToDevDependencies, blueprintToDocumentArtifacts, blueprintToGuideArtifacts, blueprintToMachinery, blueprintToManifest, blueprintToOrchestrationArtifacts, blueprintToQuestions, blueprintToRootTsconfig, blueprintToRootVite, blueprintToScripts, blueprintToSourceArtifacts, blueprintToTestArtifacts, bytesToHex, catalogToLayers, cloneValue, compareVersions, computeBytes, computeHash, contentToHex, createBlueprint, createCompiler, dependenciesToQuestions, extractVersion, inferDrift, inferGroup, isArtifact, isAudit, isBlueprint, isCatalogEntry, isCollection, isCompilerHooks, isCompilerOptions, isContent, isDependency, isDependencyName, isEnvironment, isFinding, isGroup, isGroups, isHex, isMirror, isOverride, isPath, isPlan, isQuestion, isScaffoldError, isSnapshot, manifestToDependencies, manifestToName, matchesDriftReachability, matchesEngines, matchesOrchestrationPath, matchesPrintWidth, matchesRange, nameToGuide, nameToHostArtifacts, nameToRewrite, overridesToQuestions, parseBlueprint, parseCompilerOptions, parseGroups, parseSnapshot, pathToCondition, planToFindings, planToHash, planToSummary, selectGroups, selectHostPaths, serializeTypeScriptString, srcToEntry, srcToExports, srcToRoot };
4845
+ export { APP_BROWSER_DEV_DEPENDENCIES, APP_DEV_DEPENDENCIES, APP_MATRIX, APP_SERVER_DEV_DEPENDENCIES, ARTIFACT_TEMPLATES, BASE_DEV_DEPENDENCIES, BIN_CONFIGS, BIN_ENTRY_PATH, CATALOG_AGENT_PATH, CONFIG_TEMPLATES, CONFORMANCE_TEST_PATH, CONTROL_CHARACTER_PATTERN, Compiler, DECLARATION_DEV_DEPENDENCIES, DEFAULT_ENGINES, DEFAULT_VERSION, DEPENDENCY_NAME_PATTERN, DISTRIBUTION_TEST_PATH, ENGINES_PATTERN, ENVIRONMENTS, EXECUTABLE_PATHS, EXTRA_RANGE_PATTERN, FLOOR_RANGE_PATTERN, FOREIGN_NAME_PATTERN, GLOBAL_SETUP_PATH, GROUPS, GUIDES_TEST_PATH, HEX_PATTERN, HOST_PATHS, INTEGRATION_TEST_PATH, INVALID_PATH_CHARACTER_PATTERN, MAX_ARTIFACT_BYTES, MAX_ARTIFACT_HEX_LENGTH, MAX_AUDIT_FINDINGS, MAX_COLLECTION_ITEMS, MAX_DEPENDENCY_NAME_LENGTH, MAX_MANIFEST_BYTES, MAX_NAME_LENGTH, MAX_PATH_LENGTH, MAX_RANGE_LENGTH, MAX_TOTAL_ARTIFACT_BYTES, MINIMUM_NODE_VERSION, NAME_PATTERN, ORCHESTRATION_PATH_NAMES, ORCHESTRATION_PATH_PREFIXES, ORKESTREL_RANGE_PATTERN, PRINT_WIDTH, SERVICE_SCRIPT_PATH, SERVICE_SETUP_PATH, SERVICE_TEST_INCLUDE, SHOWCASE_CONFIG_PATH, SHOWCASE_DEV_DEPENDENCIES, SOURCE_BROWSER_DEV_DEPENDENCIES, SRC_MATRIX, ScaffoldError, TAB_WIDTH, VERSION_PATTERN, WORKSPACE_OWNED_PATHS, applyOverrides, artifactToFinding, artifactToHex, artifactsToQuestions, blueprintToConfigArtifacts, blueprintToDevDependencies, blueprintToDocumentArtifacts, blueprintToGuideArtifacts, blueprintToMachinery, blueprintToManifest, blueprintToOrchestrationArtifacts, blueprintToQuestions, blueprintToRootTsconfig, blueprintToRootVite, blueprintToScripts, blueprintToSourceArtifacts, blueprintToTestArtifacts, bytesToHex, catalogToLayers, cloneValue, compareVersions, computeBytes, computeHash, contentToHex, createBlueprint, dependenciesToQuestions, extractVersion, inferDrift, inferGroup, isArtifact, isAudit, isBlueprint, isCatalogEntry, isCollection, isCompilerHooks, isCompilerOptions, isContent, isDependency, isDependencyName, isEnvironment, isFinding, isGroup, isGroups, isHex, isMirror, isOverride, isPath, isPlan, isQuestion, isScaffoldError, isSnapshot, manifestToDependencies, manifestToName, matchesDriftReachability, matchesEngines, matchesOrchestrationPath, matchesPrintWidth, matchesRange, nameToGuide, nameToHostArtifacts, nameToRewrite, overridesToQuestions, parseBlueprint, parseCompilerOptions, parseGroups, parseSnapshot, pathToCondition, planToFindings, planToHash, planToSummary, selectGroups, selectHostPaths, serializeTypeScriptString, srcToEntry, srcToExports, srcToRoot };
4851
4846
 
4852
4847
  //# sourceMappingURL=index.js.map