@orkestrel/scaffold 0.0.102 → 0.0.104
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/agents/skills/orkestrel-dispatch/scripts/helpers.js +84 -1
- package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +21 -6
- package/dist/agents/skills/orkestrel-harden/scripts/titles.js +338 -0
- package/dist/agents/skills/orkestrel-publish/scripts/swap.js +3 -39
- package/dist/agents/skills/orkestrel-publish/scripts/wave.js +433 -47
- package/dist/agents/skills/orkestrel-publish/scripts/window.js +2 -1
- package/dist/bin/main.js +16 -9
- package/dist/bin/main.js.map +1 -1
- package/dist/host/agents/orchestration.md +3 -3
- package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +2 -2
- package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +1 -1
- package/dist/host/agents/skills/orkestrel-build/SKILL.md +2 -2
- package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +2 -2
- package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +1 -1
- package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +3 -3
- package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +10 -10
- package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +1 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +100 -1
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +27 -6
- package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +4 -4
- package/dist/host/agents/skills/orkestrel-falsify/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +8 -7
- package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +6 -6
- package/dist/host/agents/skills/orkestrel-harden/SKILL.md +6 -1
- package/dist/host/agents/skills/orkestrel-harden/references/bindings.md +1700 -0
- package/dist/host/agents/skills/orkestrel-harden/references/contract.md +2 -2
- package/dist/host/agents/skills/orkestrel-harden/references/equivalence.md +48 -0
- package/dist/host/agents/skills/orkestrel-harden/references/hardening.md +4 -2
- package/dist/host/agents/skills/orkestrel-harden/scripts/titles.ts +425 -0
- package/dist/host/agents/skills/orkestrel-journey/SKILL.md +2 -2
- package/dist/host/agents/skills/orkestrel-journey/references/captures.md +9 -8
- package/dist/host/agents/skills/orkestrel-polish/SKILL.md +3 -3
- package/dist/host/agents/skills/orkestrel-publish/SKILL.md +2 -2
- package/dist/host/agents/skills/orkestrel-publish/references/release.md +1 -0
- package/dist/host/agents/skills/orkestrel-publish/references/wave.md +56 -13
- package/dist/host/agents/skills/orkestrel-publish/references/window.md +6 -6
- package/dist/host/agents/skills/orkestrel-publish/scripts/swap.ts +5 -49
- package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +646 -49
- package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +2 -1
- package/dist/host/agents/transports/codex.md +1 -1
- package/dist/host/claude/agents/orkestrel.md +54 -53
- package/dist/host/claude/agents/reviewer.md +4 -4
- package/dist/host/claude/rules/documentation.md +2 -1
- package/dist/host/claude/rules/patterns.md +1 -1
- package/dist/host/claude/rules/quality.md +2 -2
- package/dist/host/claude/rules/styles.md +1 -1
- package/dist/host/claude/rules/tests.md +34 -8
- package/dist/host/claude/rules/typescript.md +29 -0
- package/dist/host/claude/rules/workspace.md +35 -28
- package/dist/host/claude/rules/writing.md +34 -26
- package/dist/host/claude/settings.json +2 -0
- package/dist/host/claude/skills/orkestrel-debrief/SKILL.md +1 -1
- package/dist/host/claude/skills/orkestrel-falsify/SKILL.md +1 -1
- package/dist/host/codex/agents/analyst.toml +3 -3
- package/dist/host/codex/agents/reviewer.toml +4 -4
- package/dist/host/configs/helpers.ts +4 -16
- package/dist/host/configs/policy.ts +13 -2
- package/dist/host/dotfiles/editorconfig +0 -1
- package/dist/host/dotfiles/gitattributes +0 -1
- package/dist/host/dotfiles/gitignore +0 -1
- package/dist/host/dotfiles/oxlintrc.json +25 -11
- package/dist/host/guides/agent.md +1638 -598
- package/dist/host/guides/budget.md +89 -29
- package/dist/host/guides/form.md +477 -91
- package/dist/host/guides/mcp.md +14 -2
- package/dist/host/guides/ollama.md +97 -73
- package/dist/host/guides/probe.md +1 -1
- package/dist/host/guides/scaffold.md +158 -101
- package/dist/host/guides/study.md +2635 -0
- package/dist/host/guides/table.md +225 -15
- package/dist/host/guides/terminal.md +22 -20
- package/dist/host/guides/test.md +689 -255
- package/dist/host/manifest.json +88 -64
- package/dist/host/tests/config.test.ts +189 -146
- package/dist/host/tests/policy.test.ts +39 -1
- package/dist/host/tests/setupPolicy.ts +104 -57
- package/dist/src/core/index.cjs +1387 -611
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +35 -20
- package/dist/src/core/index.d.ts +35 -20
- package/dist/src/core/index.js +1385 -612
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/index.cjs +12 -12
- package/dist/src/server/index.cjs.map +1 -1
- package/dist/src/server/index.d.cts +12 -12
- package/dist/src/server/index.d.ts +12 -12
- package/dist/src/server/index.js +12 -12
- package/dist/src/server/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -126,6 +126,7 @@ Exported from `@orkestrel/scaffold`, and reachable from
|
|
|
126
126
|
| `BASE_DEV_DEPENDENCIES` | const | Holds the tooling versions scaffold and every generated workspace share. |
|
|
127
127
|
| `BIN_CONFIGS` | const | Lists the configuration files a workspace that ships its own executable adds, frozen. |
|
|
128
128
|
| `BIN_ENTRY_PATH` | const | Names the executable entry whose presence makes a workspace `bin`. |
|
|
129
|
+
| `BIN_OUTPUT_PATH` | const | Names the built executable a bin workspace's manifest command runs. |
|
|
129
130
|
| `BROWSE_DEV_DEPENDENCIES` | const | Names the development dependency a browser or styles surface adds. |
|
|
130
131
|
| `BROWSE_UPSTREAM` | const | Lists the packages `@orkestrel/browser` depends on at runtime, directly or transitively, frozen. |
|
|
131
132
|
| `CANON_PATHS` | const | Lists the instruction-canon paths staged for reading rather than for a target, frozen. |
|
|
@@ -139,6 +140,7 @@ Exported from `@orkestrel/scaffold`, and reachable from
|
|
|
139
140
|
| `DEFAULT_ENGINES` | const | Names the `engines.node` range a workspace starts with. |
|
|
140
141
|
| `DEFAULT_VERSION` | const | Names the version a workspace starts at. |
|
|
141
142
|
| `DEPENDENCY_NAME_PATTERN` | const | Matches the runtime dependency name syntax: the `@orkestrel` scope and a bare name. |
|
|
143
|
+
| `DISTRIBUTION_SETUP_PATH` | const | Names the content-owned harness imported by the generated distribution proof. |
|
|
142
144
|
| `DISTRIBUTION_TEST_PATH` | const | Names the generated packed-package proof every publishing workspace is planned at. |
|
|
143
145
|
| `ENGINES_PATTERN` | const | Matches the minimum-Node engine syntax a blueprint declares. |
|
|
144
146
|
| `ENVIRONMENTS` | const | Lists the `Environment` values, frozen. |
|
|
@@ -201,6 +203,7 @@ Exported from `@orkestrel/scaffold`, and reachable from
|
|
|
201
203
|
| `TARGET_SKILL_NAMES` | const | Lists the package-facing skills a target receives pointers for, frozen and alphabetical. |
|
|
202
204
|
| `THEMES_BARREL_PATH` | const | Names the themes stylesheet marker. |
|
|
203
205
|
| `THEMES_ENTRY_PATH` | const | Names the themes build entry marker. |
|
|
206
|
+
| `TREE_TEST_PATH` | const | Names the real-tree proof whose presence makes a workspace `tree`. |
|
|
204
207
|
| `VERSION_PATTERN` | const | Matches the exact `major.minor.patch` version syntax a blueprint declares. |
|
|
205
208
|
| `WORKSPACE_DEV_ENGINES` | const | Holds the `devEngines` record every generated manifest carries. |
|
|
206
209
|
| `WORKSPACE_OWNED_PATHS` | const | Lists the vendored paths whose present bytes belong to each workspace, frozen. |
|
|
@@ -663,7 +666,8 @@ answers a read and grant no verb write authority that it did not already have.
|
|
|
663
666
|
states what each emits and what each refuses. Creation leaves `setup` empty, and the remaining
|
|
664
667
|
structural facts take no creation option. Add a root `tests/setup*.test.ts` proof for `setup`,
|
|
665
668
|
`tests/guides.test.ts` for `guides`, `tests/integration.test.ts` for `integration`,
|
|
666
|
-
`tests/conformance.test.ts` for `conformance`, `tests/
|
|
669
|
+
`tests/conformance.test.ts` for `conformance`, `tests/tree.test.ts` for `tree`,
|
|
670
|
+
`tests/setupService.ts` for `service`, an
|
|
667
671
|
exact-case `*.test.ts` file beneath `tests/studies`, outside any `node_modules` or `.git` directory,
|
|
668
672
|
for `studies`, `tests/setupGlobal.ts` for `global`, `configs/app/vite.journey.config.ts` for `journey`, and
|
|
669
673
|
`configs/agents/tsconfig.skills.json` for `skills`; reading verbs detect each exact-case file and
|
|
@@ -685,7 +689,8 @@ it could disagree. The styles surface, its themes target, the showcase, and ever
|
|
|
685
689
|
read from the markers Surfaces and extensions lists. The remaining facts come from exact-case
|
|
686
690
|
files: `src/bin/main.ts` selects `bin`, each root `tests/setup*.test.ts` match selects `setup`,
|
|
687
691
|
`tests/guides.test.ts` selects `guides`, `tests/integration.test.ts` selects `integration`,
|
|
688
|
-
`tests/conformance.test.ts` selects `conformance`, `tests/
|
|
692
|
+
`tests/conformance.test.ts` selects `conformance`, `tests/tree.test.ts` selects `tree`,
|
|
693
|
+
`tests/setupService.ts` selects `service`,
|
|
689
694
|
any exact-case `*.test.ts` file beneath `tests/studies`, nested or direct, outside any
|
|
690
695
|
`node_modules` or `.git` directory, which Vitest's default exclude never collects, selects
|
|
691
696
|
`studies`, `tests/setupGlobal.ts` selects `global`, `configs/app/vite.journey.config.ts` selects `journey`,
|
|
@@ -1035,8 +1040,8 @@ because the shape is chosen once and read afterwards: `new` refuses the advisory
|
|
|
1035
1040
|
`repair` need the plan to describe and restore a target that already has that shape. A library
|
|
1036
1041
|
caller creating a workspace holds the same refusal, and the Compile section states it.
|
|
1037
1042
|
|
|
1038
|
-
`bin`, `setup`, `guides`, `integration`, `conformance`, `service`, `vendors`, `studies`,
|
|
1039
|
-
`styles`, `themes`, `showcase`, `journey`, and `skills` are structural facts, and `extensions` lists the
|
|
1043
|
+
`bin`, `setup`, `guides`, `integration`, `conformance`, `tree`, `service`, `vendors`, `studies`,
|
|
1044
|
+
`global`, `styles`, `themes`, `showcase`, `journey`, and `skills` are structural facts, and `extensions` lists the
|
|
1040
1045
|
extension faces. Reading verbs set each fact and list each extension only when the workspace
|
|
1041
1046
|
physically ships the directory or exact-case file that defines it, never because of the workspace's
|
|
1042
1047
|
name and never because a sibling fact is set.
|
|
@@ -1048,9 +1053,9 @@ The `setup` member is a `readonly SetupRuntime[]`, empty by default. Target infe
|
|
|
1048
1053
|
|
|
1049
1054
|
The `node` runtime registers the Node `setup` project, which loads `tests/setup.ts` and excludes
|
|
1050
1055
|
both browser proofs. The `browser` runtime registers `setup:browser`, which collects only the two
|
|
1051
|
-
browser proofs and loads `tests/setup.ts` and `tests/setupBrowser.ts` through Playwright Chromium.
|
|
1052
|
-
sheet face registers
|
|
1053
|
-
|
|
1056
|
+
browser proofs and loads `tests/setup.ts` and `tests/setupBrowser.ts` through Playwright Chromium.
|
|
1057
|
+
A sheet face alone registers no setup project. A target's browser setup proof selects that project
|
|
1058
|
+
through the `browser` runtime. The generated manifest emits the selected `test:setup` and
|
|
1054
1059
|
`test:setup:browser` scripts and invokes them from `test`. Scaffold generates no setup proof for an
|
|
1055
1060
|
empty setup seed.
|
|
1056
1061
|
|
|
@@ -1087,8 +1092,9 @@ condition, read from the `src` axis and the styles surface the blueprint already
|
|
|
1087
1092
|
packs and installs the published
|
|
1088
1093
|
artifact, so a workspace publishing none has nothing for it to read and gets no project, no
|
|
1089
1094
|
`test:distribution` script, and no gate entry. A workspace publishing any gets the project, the
|
|
1090
|
-
script, the `prepublishOnly` entry, and `tests/distribution.test.ts` itself
|
|
1091
|
-
is the one proof scaffold generates
|
|
1095
|
+
script, the `prepublishOnly` entry, and `tests/distribution.test.ts` itself with its
|
|
1096
|
+
`tests/setupDistribution.ts` harness. Limits states why this is the one proof scaffold generates
|
|
1097
|
+
from the workspace's own shape.
|
|
1092
1098
|
|
|
1093
1099
|
`service` says the workspace runs a live-service Vitest project over `tests/service`, and it alone
|
|
1094
1100
|
registers that project, its `test:service` script, and the `tests/setupService.ts` readiness module
|
|
@@ -1113,6 +1119,15 @@ tests run, and it selects nothing. A `prepublishOnly` chain written before the f
|
|
|
1113
1119
|
in place: the generated chain without its study step, and without both its study step and the release
|
|
1114
1120
|
proof, are accepted predecessors.
|
|
1115
1121
|
|
|
1122
|
+
`tree` says the workspace holds the exact-case `tests/tree.test.ts` proof, and it alone registers
|
|
1123
|
+
the `tree` Vitest project over that file and its `test:tree` script, which `test` invokes in a
|
|
1124
|
+
publishing and a `private: true` workspace alike. The project runs in Node with the browser disabled
|
|
1125
|
+
and loads `tests/setup.ts` and `tests/setupServer.ts`, so scaffold plans the birth-owned
|
|
1126
|
+
`tests/setupServer.ts` seed for a `tree` workspace whatever environments it selects. The proof
|
|
1127
|
+
states the laws this package holds about its own real tree, and it reads that tree without a build,
|
|
1128
|
+
install, or service. Without the file, the workspace has no `tree` project and no `test:tree`
|
|
1129
|
+
script, and its `test` chain carries no step for one.
|
|
1130
|
+
|
|
1116
1131
|
`integration` projects a cross-environment composition proof for any workspace, independently of
|
|
1117
1132
|
whether it has a published `src`. Its generated seed imports every selected `src` and `app`
|
|
1118
1133
|
environment through its public barrel. It starts no process and does not pack or install the
|
|
@@ -1260,9 +1275,9 @@ same seed. In the following table, `<face>` is `styles` or the extension's name:
|
|
|
1260
1275
|
| `_index.scss` in each of `src/<face>/elements`, `components`, and `utilities` | `birth` |
|
|
1261
1276
|
| `src/styles/themes/index.scss`, `_default.scss`, and `sheet.ts` | `birth` |
|
|
1262
1277
|
| `tests/src/<face>/index.test.ts` and `tests/src/styles/themes/index.test.ts` | `birth` |
|
|
1263
|
-
| `tests/setupStyles.ts` and `tests/setupStyles.test.ts` | `birth` |
|
|
1264
1278
|
| `configs/src/vite.<face>.config.ts` and `configs/src/tsconfig.<face>.json` | `content` |
|
|
1265
1279
|
| `configs/src/vite.themes.config.ts` | `content` |
|
|
1280
|
+
| `tests/setupDistribution.ts` | `content` |
|
|
1266
1281
|
| `tests/distribution.test.ts` | `presence` |
|
|
1267
1282
|
|
|
1268
1283
|
`sheet.ts` imports `./index.scss` and nothing else, and `index.ts` star-exports `./sheet.js`.
|
|
@@ -1293,8 +1308,9 @@ path relative to the test file. With themes, `build:src:styles`
|
|
|
1293
1308
|
builds the themes target after the base face. The root configuration registers each face's project
|
|
1294
1309
|
by its wrapper, and the wrapper composes it through the root `sheetProject` factory, which runs it
|
|
1295
1310
|
in Playwright Chromium with `isolate: false` and loads `tests/setup.ts`, `tests/setupBrowser.ts`,
|
|
1296
|
-
and `tests/setupStyles.ts`. The manifest declares `sass` from
|
|
1297
|
-
Playwright pair, and the root `tsconfig.json` aliases
|
|
1311
|
+
and, when the target has the file, `tests/setupStyles.ts`. The manifest declares `sass` from
|
|
1312
|
+
`STYLES_DEV_DEPENDENCIES` beside the Playwright pair, and the root `tsconfig.json` aliases
|
|
1313
|
+
`@src/<face>` to the face's `index.ts`.
|
|
1298
1314
|
|
|
1299
1315
|
### The browser surface
|
|
1300
1316
|
|
|
@@ -1320,8 +1336,11 @@ The `vue` extension gives each axis it occupies a face of its own:
|
|
|
1320
1336
|
`vue-tsc`, `build:app:vue`, `dev:vue`, and `test:app:vue`. While `app/vue` is occupied, the root
|
|
1321
1337
|
`check` script typechecks the whole tree through `vue-tsc` in place of `tsc`.
|
|
1322
1338
|
|
|
1323
|
-
The vendored `.oxlintrc.json` holds each face to the import direction `AGENTS.md` § Project model
|
|
1324
|
-
|
|
1339
|
+
The vendored `.oxlintrc.json` holds each face to the import direction `AGENTS.md` § Project model fixes, and
|
|
1340
|
+
refuses, from `src/browser`, `src/server`, `src/vue`, and `src/bin`, a relative path to `src/core`, to
|
|
1341
|
+
`src/browser` from `src/vue`, or to `src/server` from `src/bin` with a message naming the alias, because a face's
|
|
1342
|
+
build bundles what a relative path reaches. The vendored
|
|
1343
|
+
`tests/config.test.ts` drives those directions through Oxlint.
|
|
1325
1344
|
|
|
1326
1345
|
Every published face's build decides its externals through `resolveExternal` from the vendored
|
|
1327
1346
|
`configs/helpers.ts`. Node builtins, `@orkestrel/*` packages, declared peers with their subpaths,
|
|
@@ -1390,7 +1409,7 @@ The vendored `tests/config.test.ts` proves those files in each target that holds
|
|
|
1390
1409
|
enumerates the sheet faces and the framework faces from the target's tree rather than from the
|
|
1391
1410
|
emitted wrappers, requires a non-empty population only where a marker exists, loads every selected
|
|
1392
1411
|
wrapper, and pairs each behaviour with a mutation control in a scratch copy: a deleted wrapper, a
|
|
1393
|
-
removed `tests/setupStyles.ts` entry, a reversed themes build order, a disabled Vue import
|
|
1412
|
+
removed `tests/setupStyles.ts` entry when the target has that file, a reversed themes build order, a disabled Vue import
|
|
1394
1413
|
restriction, and disabled declaration rewrites each fail it. Scaffold's own release gate adds a
|
|
1395
1414
|
scratch adopter: `tests/distribution.test.ts` generates the complete selection through the packed
|
|
1396
1415
|
executable, installs it, runs its checks, builds, projects, journey modes, showcase builds, and CSS
|
|
@@ -1413,9 +1432,9 @@ names the fleet targets that meet the refusal.
|
|
|
1413
1432
|
Scaffold plans each setup seed that declares an export beside its sibling proof, so the module and
|
|
1414
1433
|
its proof arrive together under the mirror `.claude/rules/tests.md` states:
|
|
1415
1434
|
|
|
1416
|
-
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1435
|
+
- The emitted sheet proofs import `adoptSheet` and `readLayerNames` from `@orkestrel/test/browser`.
|
|
1436
|
+
Scaffold seeds no styles setup module or proof because those instruments belong to the package.
|
|
1437
|
+
A target can keep its own `tests/setupStyles.ts` module and sibling proof for its CSSOM instruments.
|
|
1419
1438
|
- `tests/setupGlobal.ts` exports the Vitest global `setup` function and arrives with
|
|
1420
1439
|
`tests/setupGlobal.test.ts`, which imports `setup` and runs in the Node `setup` project that
|
|
1421
1440
|
`test:setup` invokes from `test`.
|
|
@@ -1424,7 +1443,10 @@ A journey workspace's `tests/setupBrowser.ts` seed declares no top-level export,
|
|
|
1424
1443
|
without a proof. The vendored policy sweep in `tests/setupPolicy.ts` reads the same mirror in both
|
|
1425
1444
|
directions: a root `tests/setup<Name>.test.ts` without its `tests/setup<Name>.ts` module fails
|
|
1426
1445
|
`test:policy`, as does a root module that declares an export with neither its sibling proof nor an
|
|
1427
|
-
import from `tests/setup.test.ts`.
|
|
1446
|
+
import from `tests/setup.test.ts`. The setup modules scaffold owns sit outside that population in
|
|
1447
|
+
every target: a module `HOST_PATHS` vendors, and the content-owned `tests/setupDistribution.ts`
|
|
1448
|
+
harness a publishing workspace receives. The harness declares exports and arrives with no sibling
|
|
1449
|
+
proof, because the distribution proof beside it is the test that imports it.
|
|
1428
1450
|
|
|
1429
1451
|
## Compile
|
|
1430
1452
|
|
|
@@ -1577,12 +1599,14 @@ You own `tests/setup.ts`, the selected `tests/setupBrowser.ts`, `tests/setupServ
|
|
|
1577
1599
|
and `tests/app`, the `tests/src/bin/main.test.ts` file, and the `tests/integration.test.ts` seed.
|
|
1578
1600
|
Every sheet face's seed under `src` is yours on the same terms. Scaffold writes those
|
|
1579
1601
|
planned files only during materialize and leaves later edits or deletions alone. You also own the
|
|
1580
|
-
`tests/guides.test.ts`, `tests/conformance.test.ts`,
|
|
1581
|
-
each of which selects its project by being written. The browser commands you register in
|
|
1602
|
+
`tests/guides.test.ts`, `tests/conformance.test.ts`, `tests/tree.test.ts`, and
|
|
1603
|
+
`tests/service/**/*.test.ts` proof files, each of which selects its project by being written. The browser commands you register in
|
|
1582
1604
|
`configs/commands.ts` are yours too: scaffold writes the empty seed when the file is missing and
|
|
1583
1605
|
leaves the bytes you wrote alone. Scaffold content-owns `tests/setupPolicy.ts`,
|
|
1584
|
-
`tests/policy.test.ts`, and `tests/config.test.ts
|
|
1585
|
-
|
|
1606
|
+
`tests/policy.test.ts`, and `tests/config.test.ts`, and in a publishing workspace the
|
|
1607
|
+
`tests/setupDistribution.ts` harness; `repair` and `overwrite` restore those files when their bytes
|
|
1608
|
+
drift or the files are missing, and leave the presence-owned `tests/distribution.test.ts` proof beside
|
|
1609
|
+
the harness as it stands.
|
|
1586
1610
|
|
|
1587
1611
|
`tests/policy.test.ts` proves the path- and text-shaped laws, and the vendored oxlint plugin
|
|
1588
1612
|
`configs/policy.ts` carries the syntax-shaped ones: `policy/no-malformed-summary` reads the doc
|
|
@@ -1625,9 +1649,14 @@ typechecked, and ambiguous star exports aren't resolved semantically.
|
|
|
1625
1649
|
The `surface` rule in `inspectPolicyWorkspace` compares live barrel exports and target-owned root
|
|
1626
1650
|
`tests/setup*.ts` exports with the hosted guides. It matches bare names case-sensitively across
|
|
1627
1651
|
environments and declaration kinds. Source names claimed by the target's own hosted guide are
|
|
1628
|
-
grandfathered; setup exports have no grandfather
|
|
1629
|
-
|
|
1630
|
-
|
|
1652
|
+
grandfathered; setup exports have no grandfather. The rule excludes the setup modules scaffold owns
|
|
1653
|
+
in every target: the setup paths `HOST_PATHS` selects and the `tests/setupDistribution.ts`
|
|
1654
|
+
harness. A scaffold checkout reads its own `guides/` directory and its own catalog; every other
|
|
1655
|
+
target reads `node_modules/@orkestrel/scaffold/dist/host/guides/` and the catalog staged beside it,
|
|
1656
|
+
or its own `guides/` directory and its own catalog where that installed host is absent. Beside the
|
|
1657
|
+
installed guides, the rule takes no row from the target's own catalog table: the `catalog` verb
|
|
1658
|
+
writes that table from the registry's organization package list, so the table can list a package
|
|
1659
|
+
whose guide the installed release doesn't stage.
|
|
1631
1660
|
The population it compares is what the parser accounts for: each exported declaration — a variable
|
|
1632
1661
|
declarator, function, class, interface, type alias, enum, or namespace — every name an export list
|
|
1633
1662
|
or a re-export list names, the alias of a namespace re-export, and the names a relative star export
|
|
@@ -1714,9 +1743,21 @@ replaces it, and none ever reports it stale. Deleting the file is how you ask fo
|
|
|
1714
1743
|
proof back; editing it is how you keep your own. Limits states what makes this proof generable when
|
|
1715
1744
|
the others are not.
|
|
1716
1745
|
|
|
1746
|
+
The proof's machinery lives beside it in `tests/setupDistribution.ts`, a harness scaffold plans
|
|
1747
|
+
under the same condition and claims by content. The generated proof imports
|
|
1748
|
+
`createDistributionSuite` and `buildDistributionCases` from it, plus `checkDistributionBrowser`
|
|
1749
|
+
where it carries the browser branch. It binds the suite, starts and destroys it in its hooks, and
|
|
1750
|
+
registers one `it` per case row inside `describe`, and each `it` compares the `actual` and
|
|
1751
|
+
`expected` values its row observes. The harness registers no test and makes no assertion. A missing
|
|
1752
|
+
harness reports `missing` drift and an edited one reports `stale`, and `repair` or `overwrite`
|
|
1753
|
+
writes the planned bytes back byte for byte while leaving the proof beside it untouched, so a fix to
|
|
1754
|
+
the harness reaches a workspace that keeps its own proof. Because no verb rewrites that proof, no
|
|
1755
|
+
release renames or removes a harness export a released proof imports, a member it reads, or the
|
|
1756
|
+
`./setupDistribution.js` specifier; `.claude/rules/tests.md` names that frozen set.
|
|
1757
|
+
|
|
1717
1758
|
Content ownership does not preserve an arbitrary custom Vitest project. The optional proof projects
|
|
1718
|
-
are fixed: `guides`, `integration`, `conformance`, and `service` are selected by their
|
|
1719
|
-
paths, `studies` by an exact-case `*.test.ts` file beneath `tests/studies` outside any `node_modules` or
|
|
1759
|
+
are fixed: `guides`, `integration`, `conformance`, `tree`, and `service` are selected by their
|
|
1760
|
+
defining paths, `studies` by an exact-case `*.test.ts` file beneath `tests/studies` outside any `node_modules` or
|
|
1720
1761
|
`.git` directory, and `distribution` by a published `src` environment. A workspace that needs other local
|
|
1721
1762
|
configuration must keep those edits outside a content-owned file; `repair` restores that file to the
|
|
1722
1763
|
canonical project set.
|
|
@@ -2126,7 +2167,7 @@ against the digest in `host.json`, then verifies the inventory against its membe
|
|
|
2126
2167
|
Transport encoding is transparent and does not enter the comparison. The path never character-
|
|
2127
2168
|
decodes and re-encodes the content.
|
|
2128
2169
|
|
|
2129
|
-
This posture supplies integrity, not authenticity.
|
|
2170
|
+
This posture supplies integrity, not authenticity. Anyone who can serve the files can also
|
|
2130
2171
|
serve a matching inventory. The residual is direct: fetched bytes govern agent behavior in a target
|
|
2131
2172
|
that has no release gate. Run `audit` to preview the change, use the `--offline` option to pin the
|
|
2132
2173
|
distributed floors, and keep operator grants in `.claude/settings.local.json`; scaffold does not
|
|
@@ -2170,10 +2211,11 @@ Nothing is fixed except the manifest.
|
|
|
2170
2211
|
`--hide-scrollbars` default argument so classic scrollbars can take layout space in every case.
|
|
2171
2212
|
An empty or unset value preserves the launch defaults; any other value throws an `Error`.
|
|
2172
2213
|
Pairing `classic` with `PLAYWRIGHT_WS_ENDPOINT` throws an `Error`, even with an executable
|
|
2173
|
-
override, because the server owns the launch.
|
|
2174
|
-
|
|
2175
|
-
sibling `chromium-*` revision under the same browsers
|
|
2176
|
-
one usable build for many Playwright versions.
|
|
2214
|
+
override, because the server owns the launch. Every resolved managed path names the full Chromium
|
|
2215
|
+
executable so headless launches retain browser permissions. A pinned revision that is not installed
|
|
2216
|
+
falls through to a `chromium` alias or a sibling `chromium-*` revision under the same browsers
|
|
2217
|
+
directory, because a managed container ships one usable build for many Playwright versions.
|
|
2218
|
+
It is its own file rather than a block in the
|
|
2177
2219
|
vendored `configs/helpers.ts`, which every workspace receives byte-identical while only a browser
|
|
2178
2220
|
selection declares the `playwright` this module imports.
|
|
2179
2221
|
- One template artifact, `configs/commands.ts`, for every workspace that receives
|
|
@@ -2182,29 +2224,30 @@ Nothing is fixed except the manifest.
|
|
|
2182
2224
|
`test.browser.commands`. `appVue` and each `journey:<variant>` project keep it through the
|
|
2183
2225
|
browser configuration they spread. Scaffold claims the file by presence, so `repair` and
|
|
2184
2226
|
`overwrite` write the seed into a target that lacks it and keep the commands you register.
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2227
|
+
|
|
2228
|
+
The root configuration bundles `configs/commands.ts` into every configuration load, builds
|
|
2229
|
+
included, and the bundle resolves no workspace alias. A native import of `src/server/index.ts`
|
|
2230
|
+
from a command body fails with `ERR_MODULE_NOT_FOUND` on that module's own `@src/core` import.
|
|
2231
|
+
Import only a `node:` module or a package the manifest declares in `dependencies` or
|
|
2232
|
+
`devDependencies` at the top of the file. Load workspace source inside the command body through
|
|
2233
|
+
`context.project.vitest.import`, which runs on the root Vite server and its `resolve.alias`, and
|
|
2234
|
+
narrow the module it returns as `unknown`. The following module registers a `greeting` command
|
|
2235
|
+
that returns the `message` export of `src/server/index.ts`:
|
|
2236
|
+
|
|
2237
|
+
```ts
|
|
2238
|
+
import type { BrowserCommandContext, BrowserConfigOptions } from 'vitest/node'
|
|
2239
|
+
import { fileURLToPath } from 'node:url'
|
|
2240
|
+
|
|
2241
|
+
const SERVER_ENTRY = fileURLToPath(new URL('../src/server/index.ts', import.meta.url))
|
|
2242
|
+
|
|
2243
|
+
export const commands: Readonly<NonNullable<BrowserConfigOptions['commands']>> = Object.freeze({
|
|
2244
|
+
greeting: async (context: BrowserCommandContext): Promise<string | undefined> => {
|
|
2245
|
+
const loaded = await context.project.vitest.import<unknown>(SERVER_ENTRY)
|
|
2246
|
+
if (typeof loaded !== 'object' || loaded === null || !('message' in loaded)) return undefined
|
|
2247
|
+
return typeof loaded.message === 'string' ? loaded.message : undefined
|
|
2248
|
+
},
|
|
2249
|
+
})
|
|
2250
|
+
```
|
|
2208
2251
|
|
|
2209
2252
|
- One template artifact per source and test file the selection needs: an `index.ts` barrel per
|
|
2210
2253
|
selected environment, `main.ts` and `index.html` for an application browser, `tests/setup.ts`
|
|
@@ -2213,18 +2256,30 @@ Nothing is fixed except the manifest.
|
|
|
2213
2256
|
selected public barrel and records its initial empty exports for the consumer to replace with an
|
|
2214
2257
|
observable cross-environment flow.
|
|
2215
2258
|
- One set of template artifacts per sheet face, and one for the themes target: the birth-owned
|
|
2216
|
-
seed, the content-owned wrappers, and the birth-owned entry proof
|
|
2217
|
-
|
|
2259
|
+
seed, the content-owned wrappers, and the birth-owned entry proof. Surfaces and extensions lists
|
|
2260
|
+
each path.
|
|
2218
2261
|
- One set of template artifacts per axis the `vue` extension occupies, and one birth-owned arrival
|
|
2219
2262
|
journey per application of a journey workspace. Surfaces and extensions lists each face.
|
|
2220
|
-
-
|
|
2221
|
-
|
|
2222
|
-
than birth, so a workspace that replaces it keeps its
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2263
|
+
- Two template artifacts for a workspace publishing any `src` environment or sheet face: the
|
|
2264
|
+
packed-package proof `tests/distribution.test.ts` and its harness `tests/setupDistribution.ts`.
|
|
2265
|
+
The proof is claimed by presence rather than birth, so a workspace that replaces it keeps its
|
|
2266
|
+
replacement. The harness is claimed by content, so `repair` restores its planned bytes. The
|
|
2267
|
+
harness's suite stages its consumer when the proof's `beforeAll` hook starts it; listing the
|
|
2268
|
+
project creates no distribution staging directory. The proof registers the harness's case table,
|
|
2269
|
+
including the installed source-map scan, the declaration-copy scan, and the manifest fixed point
|
|
2270
|
+
under `npm pkg fix`. The source-map scan reads each output's `sourceMappingURL` map, including
|
|
2271
|
+
inline data maps, or its sibling map when the comment is absent. Relative map references resolve
|
|
2272
|
+
at the output; relative sources and roots resolve at the map, and file URLs become host paths.
|
|
2273
|
+
The scan reports sibling sources or a map with no source of its own environment. The declaration scan reads
|
|
2274
|
+
top-level declared names, including unexported names, groups declaration formats by face, and
|
|
2275
|
+
refuses a roll-up declaring no names when its workspace source entry exports names. A built
|
|
2276
|
+
JavaScript output holding code requires its own readable source map. An empty publication passes each scan with
|
|
2277
|
+
its reason: no built face holds code, or no source entry exports names. A single declaration
|
|
2278
|
+
face passes the copy check after its required-content check. The manifest check runs npm on a
|
|
2279
|
+
scratch copy and reports each changed top-level key. A published browser environment adds the
|
|
2280
|
+
real-browser stage to both: the harness bundles the installed package with the workspace's own
|
|
2226
2281
|
`configs/browsers.ts` resolution, serves the bundle over a loopback server, and drives it in
|
|
2227
|
-
Playwright Chromium
|
|
2282
|
+
Playwright Chromium, and the proof registers that stage through `checkDistributionBrowser`.
|
|
2228
2283
|
- One template artifact each for `README.md` and `guides/README.md`.
|
|
2229
2284
|
- One template artifact for `AGENTS.md`. It is a pointer rather than a contract:
|
|
2230
2285
|
`AGENTS.md` names the coding contract, the orchestration contract, the rules, the skills, and the
|
|
@@ -2330,13 +2385,13 @@ When a `Materializer` uses a value `Host`, each mutating call stages the host un
|
|
|
2330
2385
|
`#fill` root in the operating system's temporary directory and removes that root in a `finally`
|
|
2331
2386
|
block. A process killed during the mutation can leave the temporary root behind.
|
|
2332
2387
|
|
|
2333
|
-
`resolveContainedPath` refuses a
|
|
2334
|
-
link whose raw target contains a `..` segment. It returns the lexical join
|
|
2335
|
-
absolute path under `root` — after checking the namespace, not an open
|
|
2336
|
-
shipped example tests that answer's suffix rather than printing the whole
|
|
2337
|
-
therefore excludes a concurrent rename or link swap during the check or before
|
|
2338
|
-
using that path. A caller that admits
|
|
2339
|
-
operation instead.
|
|
2388
|
+
`resolveContainedPath` refuses a path whose text resolves outside the root, a physical link out of
|
|
2389
|
+
the root, and a dangling link whose raw target contains a `..` segment. It returns the lexical join
|
|
2390
|
+
of `root` and `path` — an absolute path under `root` — after checking the namespace, not an open
|
|
2391
|
+
filesystem handle. Its shipped example tests that answer's suffix rather than printing the whole
|
|
2392
|
+
path. Its contract therefore excludes a concurrent rename or link swap during the check or before
|
|
2393
|
+
the caller finishes using that path. A caller that admits untrusted concurrent namespace mutation
|
|
2394
|
+
needs a handle-bound operation instead.
|
|
2340
2395
|
|
|
2341
2396
|
`resolveRealPath` answers the caller's own text collapsed lexically, then resolved through every link
|
|
2342
2397
|
in what survives that collapse. A `..` the caller wrote cancels the segment before it as text, so
|
|
@@ -2527,9 +2582,9 @@ implementation that conforms to it, then export both from the barrel — the ord
|
|
|
2527
2582
|
is what separates them, and it is the whole rule. Generating a file is not the same as writing one:
|
|
2528
2583
|
scaffold also writes `tests/policy.test.ts` and `tests/config.test.ts` into a target, byte for byte
|
|
2529
2584
|
from the shared file set, and the distribution proof is the one it derives from the workspace it is
|
|
2530
|
-
writing into. A seed is not generation either: scaffold writes `tests/
|
|
2531
|
-
|
|
2532
|
-
|
|
2585
|
+
writing into. A seed is not generation either: scaffold writes `tests/setupGlobal.test.ts` and each
|
|
2586
|
+
arrival journey at creation, as birth-owned template bytes that prove the modules and applications
|
|
2587
|
+
it seeds beside them. After creation those files are the
|
|
2533
2588
|
workspace's, so no verb compares or restores them.
|
|
2534
2589
|
|
|
2535
2590
|
A distribution proof's every assertion derives from the artifact the workspace installs: the
|
|
@@ -2538,9 +2593,10 @@ a Node import, a CommonJS require, and a real browser hand back from that instal
|
|
|
2538
2593
|
there has to be named, so one generated file measures every publishing workspace, and it stays true
|
|
2539
2594
|
as that workspace's published surface moves.
|
|
2540
2595
|
|
|
2541
|
-
A guide, conformance, live-service, or authored setup proof asserts something scaffold
|
|
2542
|
-
guide fence claims, the official runner a conformance check measures against,
|
|
2543
|
-
|
|
2596
|
+
A guide, conformance, real-tree, live-service, or authored setup proof asserts something scaffold
|
|
2597
|
+
cannot read: the API a guide fence claims, the official runner a conformance check measures against,
|
|
2598
|
+
the laws a package states about its own tree, the service a live proof drives, and what a setup
|
|
2599
|
+
module does. That subject is what no generated file can reach, and
|
|
2544
2600
|
the claim here is about the subject rather than about every property those files have. A structural
|
|
2545
2601
|
property of the same files can be derivable — whether each root `tests/setup*.ts` module is
|
|
2546
2602
|
reachable from the root configuration is one — and a file asserting it would still leave the
|
|
@@ -2548,22 +2604,22 @@ module's behavior unmeasured. A generated file there would read as a proof while
|
|
|
2548
2604
|
which is worse than an absent one. So the file a consumer writes is what selects each of those
|
|
2549
2605
|
projects. Scaffold also seeds proofs for its own setup modules, as Root setup mirror describes.
|
|
2550
2606
|
|
|
2551
|
-
Registration follows the same split. Scaffold registers `conformance`, `studies`, and
|
|
2552
|
-
structural facts are set, and registers `distribution` whenever the workspace
|
|
2553
|
-
`src` environment or sheet face. In a publishing workspace, `distribution`,
|
|
2554
|
-
and `conformance`
|
|
2607
|
+
Registration follows the same split. Scaffold registers `conformance`, `tree`, `studies`, and
|
|
2608
|
+
`service` when their structural facts are set, and registers `distribution` whenever the workspace
|
|
2609
|
+
publishes at least one `src` environment or sheet face. In a publishing workspace, `distribution`,
|
|
2610
|
+
`studies`, and `service` run from `prepublishOnly`, and `conformance` and `tree` stay in `test`. In a `private: true` workspace, `distribution` is absent,
|
|
2555
2611
|
`studies` and then `service` run from `test`, and there is no `prepublishOnly` at all. The `policy` project reports an exporting root setup module that lacks its sibling proof or an import from `tests/setup.test.ts`.
|
|
2556
2612
|
Separately, a filled, exporting `tests/setup*.ts` module that no `tests/setup*.test.ts`
|
|
2557
2613
|
proof covers raises the non-blocking `setup` question in `audit`, which names the modules and the proof to add.
|
|
2558
2614
|
For setup modules the workspace authors, the workspace supplies the behavior proof; the setup modules scaffold seeds arrive with their sibling proofs.
|
|
2559
2615
|
|
|
2560
|
-
The generated proof partitions the installed `exports` map rather than sampling it. Every published
|
|
2616
|
+
The harness imported by the generated proof partitions the installed `exports` map rather than sampling it. Every published
|
|
2561
2617
|
subpath lands in exactly one of driven, undeclared, or excluded, and a totality assertion holds that
|
|
2562
|
-
partition against the map's own subpath list, so a subpath the
|
|
2618
|
+
partition against the map's own subpath list, so a subpath the harness classifies into none of them
|
|
2563
2619
|
reddens instead of disappearing. Another assertion beside it names every driven subpath whose entry
|
|
2564
2620
|
resolves no Node target and no browser target: each drive retires itself for such a subpath, so
|
|
2565
2621
|
membership of the partition alone would leave one measured by nothing. Together they hold that every
|
|
2566
|
-
published subpath is driven, or is named where the
|
|
2622
|
+
published subpath is driven, or is named where the harness cannot drive it.
|
|
2567
2623
|
|
|
2568
2624
|
A subpath is driven when its entry resolves a declaration, and each measurement resolves that entry
|
|
2569
2625
|
under the conditions of the driver taking it rather than under one shared set. The Node ESM runtime
|
|
@@ -2604,7 +2660,7 @@ one answered first. That is what drives a `require`-only subpath declaring its t
|
|
|
2604
2660
|
adjacent declaration TypeScript substitutes from its runtime target.
|
|
2605
2661
|
|
|
2606
2662
|
An entry's published names are checked against its own declarations by the type system rather than
|
|
2607
|
-
by a walk the
|
|
2663
|
+
by a walk the harness carries. Each drive writes the runtime's own key list into a generated consumer
|
|
2608
2664
|
module as a literal and lets the workspace's compiler judge that module under the driver's own
|
|
2609
2665
|
resolution, in both directions. `Record<keyof typeof entry, true>` takes the literal, so a name the
|
|
2610
2666
|
declarations carry and the runtime does not lands there. `Record<keyof typeof published, true>`
|
|
@@ -2624,14 +2680,14 @@ rather than the JavaScript one, and the addon publishes names to whatever loads
|
|
|
2624
2680
|
extension the name carries rather than a denylist of asset extensions. Reading the
|
|
2625
2681
|
file name rather than the whole path is load-bearing: `./dist/bundle.js/feature` and
|
|
2626
2682
|
`./dist/v1.2/index` are modules, and reading the path gets each of them wrong. What the rule
|
|
2627
|
-
excludes is stated where the
|
|
2683
|
+
excludes is stated where the harness is emitted: an extensionless file published for a reader, such as
|
|
2628
2684
|
a `LICENSE` at a subpath, reports undeclared until it is given an extension or a declaration. That
|
|
2629
|
-
is the safe direction: the
|
|
2685
|
+
is the safe direction: the harness names a subpath it cannot vouch for rather than passing one it
|
|
2630
2686
|
never measured.
|
|
2631
2687
|
|
|
2632
2688
|
A subpath is excluded when it resolves no declaration and names no runtime target: the
|
|
2633
2689
|
`./package.json` pointer, a published stylesheet, and a WebAssembly binary are read rather than
|
|
2634
|
-
imported, and the
|
|
2690
|
+
imported, and the harness names them where it excludes them.
|
|
2635
2691
|
|
|
2636
2692
|
Classification reads every target the entry names under every condition, and the members of a
|
|
2637
2693
|
fallback list with them: Node reads an array in an exports entry as a list of fallbacks, and a
|
|
@@ -2648,29 +2704,30 @@ A `./*` subpath pattern is read as an ordinary subpath, with no expansion of the
|
|
|
2648
2704
|
naming a runtime target reddens rather than landing in excluded. That is deliberate: excluding the
|
|
2649
2705
|
pattern would account for a whole family of published subpaths and measure none of them, which is
|
|
2650
2706
|
the silence this partition exists to close. Measuring the family means expanding the pattern against
|
|
2651
|
-
the installed tree and driving each match, which this
|
|
2652
|
-
red is reading the honest answer — the
|
|
2653
|
-
the
|
|
2707
|
+
the installed tree and driving each match, which this harness does not do. A maintainer meeting that
|
|
2708
|
+
red is reading the honest answer — the harness does not measure that family — rather than a defect in
|
|
2709
|
+
the harness.
|
|
2654
2710
|
|
|
2655
2711
|
The proof generated for a workspace publishing no browser face asserts that no browser face exists.
|
|
2656
|
-
That variant
|
|
2712
|
+
That variant registers the harness's Node import and Node require cases and carries no browser branch, because the
|
|
2657
2713
|
branch follows a published browser face on the `src` axis: the browser drive measures the packed
|
|
2658
2714
|
artifact, and only a published face is packed. A workspace that selects `browser` on its `app` axis
|
|
2659
2715
|
alone declares `playwright` and `@vitest/browser-playwright` and gets `configs/browsers.ts` emitted,
|
|
2660
2716
|
and its proof still carries no branch: the selector reads the `src` axis, and a generated manifest
|
|
2661
|
-
packs `dist/src`, so an application face is neither selected nor packed. The imports the branch
|
|
2717
|
+
packs `dist/src`, so an application face is neither selected nor packed. The imports the harness's branch
|
|
2662
2718
|
needs are declared by either axis, so they do not select the branch. The `vite` import selects
|
|
2663
2719
|
nothing either: every workspace declares `vite`, whatever it publishes. In a core-only workspace,
|
|
2664
2720
|
those imports resolve to nothing, and emitting the branch there would fail its own `check` and
|
|
2665
|
-
`lint:check` gates.
|
|
2721
|
+
`lint:check` gates. The harness's Node cases retire themselves for a browser face, so a face published after
|
|
2666
2722
|
the file was written would leave nothing measuring it. The assertion reddens instead, and names the
|
|
2667
2723
|
subpath a browser branch is owed for. The remedy it carries is to delete the file and run `repair`,
|
|
2668
2724
|
which writes the variant that carries the branch — the same route presence ownership already gives
|
|
2669
2725
|
you for asking for the generated proof back.
|
|
2670
2726
|
|
|
2671
2727
|
The generated distribution proof takes its release contract from the outside. The generated
|
|
2672
|
-
`prepublishOnly` invokes it as `npm run test:distribution -- --mode release`, and the
|
|
2673
|
-
`import.meta.env.MODE === 'release'
|
|
2728
|
+
`prepublishOnly` invokes it as `npm run test:distribution -- --mode release`, and the harness it
|
|
2729
|
+
imports reads `import.meta.env.MODE === 'release'`, so the proof **fails** on an unreachable
|
|
2730
|
+
registry rather than skipping.
|
|
2674
2731
|
The project factories the root configuration registers receive the invocation record, and each of
|
|
2675
2732
|
their projects runs in the invocation's mode. Vitest runs a project whose factory returns no mode in
|
|
2676
2733
|
Vitest's own `test` mode, where the proof skips. A journey project is such a project: its
|
|
@@ -2683,8 +2740,8 @@ a replacement alone, so a replacement that ignores the flag reports green on exa
|
|
|
2683
2740
|
matter.
|
|
2684
2741
|
|
|
2685
2742
|
The consequence is one empty-project case per refused proof. A blueprint carrying `conformance` with
|
|
2686
|
-
no `tests/conformance.test.ts` registers a project whose
|
|
2687
|
-
exits non-zero on it. A blueprint carrying `service` gets `tests/setupService.ts` — the root
|
|
2743
|
+
no `tests/conformance.test.ts`, or `tree` with no `tests/tree.test.ts`, registers a project whose
|
|
2744
|
+
include resolves to nothing, and Vitest exits non-zero on it. A blueprint carrying `service` gets `tests/setupService.ts` — the root
|
|
2688
2745
|
configuration names that module by path, so an absent one fails the project's load rather than its
|
|
2689
2746
|
run — and still no suite beneath `tests/service`, so `test:service` reports no test files until the
|
|
2690
2747
|
consumer writes the first one. A blueprint carrying `studies` has no such case, because the fact is
|
|
@@ -2716,11 +2773,11 @@ The generated guide index lists each occupied Vue face with its source, tests, a
|
|
|
2716
2773
|
- [`tests/src/core/helpers.test.ts`](../tests/src/core/helpers.test.ts) — the pure leaves, their
|
|
2717
2774
|
determinism, and their input independence.
|
|
2718
2775
|
- [`tests/src/core/validators.test.ts`](../tests/src/core/validators.test.ts) — every guard against
|
|
2719
|
-
the
|
|
2776
|
+
the matrix of unexpected values.
|
|
2720
2777
|
- [`tests/src/core/parsers.test.ts`](../tests/src/core/parsers.test.ts) — parse and guard soundness
|
|
2721
2778
|
in both directions.
|
|
2722
2779
|
- [`tests/src/core/cloners.test.ts`](../tests/src/core/cloners.test.ts) — ownership of a snapshot
|
|
2723
|
-
taken from
|
|
2780
|
+
taken from an unexpected value.
|
|
2724
2781
|
- [`tests/src/core/templates.test.ts`](../tests/src/core/templates.test.ts) — the frozen template
|
|
2725
2782
|
definitions and generated configurations under live Vitest. The isolated `templates` project runs
|
|
2726
2783
|
through `test:templates` in `prepublishOnly`; its compiler and Chromium processes run apart from
|