@orkestrel/scaffold 0.0.52 → 0.0.54

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.
@@ -148,6 +148,16 @@ Every file in the following table is a normative extension of this root. Read ev
148
148
 
149
149
  This governs prose everywhere: chat replies, instruction files, guides, TSDoc, commit messages, and briefs.
150
150
 
151
+ Follow ISO 24495-1:2023 Plain Language in every response:
152
+
153
+ - Give the reader what they need for the task at hand, and nothing else.
154
+ - Put the key point first, and order the rest so the reader finds each part where they look for it.
155
+ - Word every sentence so the reader understands it on the first read.
156
+ - Shape the response so the reader can act on it without asking a follow-up question.
157
+
158
+ The rules in this section and `.claude/rules/writing.md` implement these principles. Apply the
159
+ principles directly to a case no rule covers.
160
+
151
161
  - Write plainly. Say what you mean; mean what you say.
152
162
  - Lead with the decision or the finding. Do not build up to it.
153
163
  - One idea per sentence. Keep sentences short.
@@ -730,6 +730,12 @@ transport.
730
730
  **When a brief assigns a bench unit a path outside the obvious source tree, name the write limit
731
731
  in the brief.** If the sandbox rejects the patch, the unit stops and reports the rejection. Never
732
732
  find another write mechanism.
733
+ **A bench unit writes only under its own `--cd` root and the system temporary directory.** A
734
+ report path in the orchestrator's repository is outside both, so the write is rejected after the
735
+ work is already done and the unit improvises a fallback the Orchestrator has to go find. Name the
736
+ report path inside the unit's own tree, or tell the unit to return the report as its final
737
+ message and take it from the `--output-last-message` file. Retention still lands the report in
738
+ `.orkestrel/<package>/` — the Orchestrator copies it there, and the unit never writes it there.
733
739
  6. **Ephemeral streams, durable records.** A journal proves a bench is alive and recovers an
734
740
  interrupted session. Keep journals under `tmp/`, never commit them, and sweep them at acceptance
735
741
  after the final gate evidence is recorded. Durable retention — brief, distillate, verdict,
@@ -42,9 +42,9 @@ so network-controlled descriptions never enter agent instruction context.
42
42
  | Package | Version | Layer | Runtime dependencies |
43
43
  | ----------------------- | -------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
44
44
  | `@orkestrel/abort` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
45
- | `@orkestrel/agent` | `0.0.17` | L5 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.7`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/workflow` `^0.0.14`, `@orkestrel/workspace` `^0.0.5` |
46
- | `@orkestrel/brief` | `0.0.4` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/interpret` `^0.0.10`, `@orkestrel/reason` `^0.0.7` |
47
- | `@orkestrel/browser` | `0.0.12` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/html` `^0.0.4`, `@orkestrel/websocket` `^0.0.9` |
45
+ | `@orkestrel/agent` | `0.0.18` | L5 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.7`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/workflow` `^0.0.14`, `@orkestrel/workspace` `^0.0.5` |
46
+ | `@orkestrel/brief` | `0.0.6` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/interpret` `^0.0.11`, `@orkestrel/reason` `^0.0.8` |
47
+ | `@orkestrel/browser` | `0.0.13` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/html` `^0.0.6`, `@orkestrel/websocket` `^0.0.10` |
48
48
  | `@orkestrel/budget` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
49
49
  | `@orkestrel/console` | `0.0.10` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
50
50
  | `@orkestrel/contract` | `0.0.13` | L0 | |
@@ -52,18 +52,19 @@ so network-controlled descriptions never enter agent instruction context.
52
52
  | `@orkestrel/database` | `0.0.12` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/indexeddb` `^0.0.9`, `@orkestrel/sqlite` `^0.0.9` |
53
53
  | `@orkestrel/emitter` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
54
54
  | `@orkestrel/form` | `0.0.3` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
55
- | `@orkestrel/guide` | `0.0.13` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/markdown` `^0.0.10` |
56
- | `@orkestrel/html` | `0.0.5` | L1 | `@orkestrel/contract` `^0.0.13` |
55
+ | `@orkestrel/guide` | `0.0.14` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/markdown` `^0.0.11` |
56
+ | `@orkestrel/html` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.13` |
57
57
  | `@orkestrel/indexeddb` | `0.0.9` | L1 | `@orkestrel/contract` `^0.0.13` |
58
58
  | `@orkestrel/interpret` | `0.0.11` | L3 | `@orkestrel/reason` `^0.0.8`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/template` `^0.0.5` |
59
- | `@orkestrel/markdown` | `0.0.10` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/html` `^0.0.5` |
60
- | `@orkestrel/mcp` | `0.0.21` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/process` `^0.0.6`, `@orkestrel/sse` `^0.0.5`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/websocket` `^0.0.9` |
59
+ | `@orkestrel/lsp` | `0.0.2` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/process` `^0.0.6` |
60
+ | `@orkestrel/markdown` | `0.0.12` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/html` `^0.0.7` |
61
+ | `@orkestrel/mcp` | `0.0.25` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/process` `^0.0.6`, `@orkestrel/sse` `^0.0.5`, `@orkestrel/tool` `^0.0.12`, `@orkestrel/websocket` `^0.0.10` |
61
62
  | `@orkestrel/middleware` | `0.0.17` | L2 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/timeout` `^0.0.7` |
62
63
  | `@orkestrel/msg` | `0.0.8` | L0 | |
63
64
  | `@orkestrel/ndjson` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
64
- | `@orkestrel/ollama` | `0.0.11` | L6 | `@orkestrel/agent` `^0.0.17`, `@orkestrel/budget` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/ndjson` `^0.0.8`, `@orkestrel/timeout` `^0.0.8`, `@orkestrel/tool` `^0.0.12` |
65
+ | `@orkestrel/ollama` | `0.0.12` | L6 | `@orkestrel/agent` `^0.0.18`, `@orkestrel/budget` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/ndjson` `^0.0.8`, `@orkestrel/timeout` `^0.0.8`, `@orkestrel/tool` `^0.0.12` |
65
66
  | `@orkestrel/pool` | `0.0.8` | L2 | `@orkestrel/emitter` `^0.0.7` |
66
- | `@orkestrel/probe` | `0.0.3` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/mcp` `^0.0.21`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.7`, `@orkestrel/tool` `^0.0.11` |
67
+ | `@orkestrel/probe` | `0.0.8` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/lsp` `^0.0.2`, `@orkestrel/mcp` `^0.0.25`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.8`, `@orkestrel/tool` `^0.0.12` |
67
68
  | `@orkestrel/process` | `0.0.6` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7` |
68
69
  | `@orkestrel/program` | `0.0.10` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/qualifier` `^0.0.11`, `@orkestrel/rater` `^0.0.11`, `@orkestrel/reason` `^0.0.7` |
69
70
  | `@orkestrel/qualifier` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/reason` `^0.0.7` |
@@ -72,7 +73,7 @@ so network-controlled descriptions never enter agent instruction context.
72
73
  | `@orkestrel/reason` | `0.0.8` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
73
74
  | `@orkestrel/relation` | `0.0.10` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8` |
74
75
  | `@orkestrel/router` | `0.0.11` | L2 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7` |
75
- | `@orkestrel/scaffold` | `0.0.49` | L3 | `@orkestrel/console` `^0.0.9`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/markdown` `^0.0.9`, `@orkestrel/process` `^0.0.6`, `@orkestrel/template` `^0.0.4` |
76
+ | `@orkestrel/scaffold` | `0.0.53` | L3 | `@orkestrel/console` `^0.0.10`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/markdown` `^0.0.11`, `@orkestrel/process` `^0.0.6`, `@orkestrel/template` `^0.0.5` |
76
77
  | `@orkestrel/sea` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/process` `^0.0.6` |
77
78
  | `@orkestrel/server` | `0.0.15` | L3 | `@orkestrel/abort` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/router` `^0.0.11`, `@orkestrel/timeout` `^0.0.8` |
78
79
  | `@orkestrel/sqlite` | `0.0.9` | L1 | `@orkestrel/contract` `^0.0.13` |
@@ -84,10 +85,10 @@ so network-controlled descriptions never enter agent instruction context.
84
85
  | `@orkestrel/test` | `0.0.11` | L0 | |
85
86
  | `@orkestrel/timeout` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
86
87
  | `@orkestrel/tool` | `0.0.12` | L1 | `@orkestrel/contract` `^0.0.13` |
87
- | `@orkestrel/toolbox` | `0.0.8` | L6 | `@orkestrel/agent` `^0.0.17`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/form` `^0.0.2`, `@orkestrel/relation` `^0.0.9`, `@orkestrel/server` `^0.0.14`, `@orkestrel/terminal` `^0.0.11`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/workflow` `^0.0.14`, `@orkestrel/workspace` `^0.0.5` |
88
+ | `@orkestrel/toolbox` | `0.0.9` | L6 | `@orkestrel/agent` `^0.0.18`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/form` `^0.0.2`, `@orkestrel/relation` `^0.0.9`, `@orkestrel/server` `^0.0.14`, `@orkestrel/terminal` `^0.0.11`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/workflow` `^0.0.14`, `@orkestrel/workspace` `^0.0.5` |
88
89
  | `@orkestrel/websocket` | `0.0.10` | L2 | `@orkestrel/emitter` `^0.0.8` |
89
90
  | `@orkestrel/worker` | `0.0.9` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/pool` `^0.0.8`, `@orkestrel/queue` `^0.0.10` |
90
- | `@orkestrel/workflow` | `0.0.14` | L4 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.7` |
91
+ | `@orkestrel/workflow` | `0.0.15` | L4 | `@orkestrel/abort` `^0.0.8`, `@orkestrel/budget` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.8` |
91
92
  | `@orkestrel/workspace` | `0.0.6` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8` |
92
93
 
93
94
  <!-- /orkestrel:catalog -->
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json",
3
+ "ignorePatterns": [".orkestrel/"],
3
4
  "plugins": ["import", "typescript", "vitest"],
4
5
  "jsPlugins": [{ "name": "policy", "specifier": "./configs/policy.ts" }],
5
6
  "rules": {
@@ -9,3 +9,6 @@ demo/showcase.html
9
9
 
10
10
  # Campaign records under the orchestration folder are verbatim evidence, not formatted source.
11
11
  .orkestrel/
12
+
13
+ # Fetched-bytes mirrors keep their upstream bytes and stay out of the formatter.
14
+ tests/mirrors/
@@ -456,16 +456,18 @@ package distributes; each operation reports one baseline word per surface. A sur
456
456
  `floor` only where the package distributes a copy. The registry's organization membership ships
457
457
  nowhere, so `catalog` refuses when that read fails.
458
458
 
459
- For `new`, `repair`, `catalog`, and `overwrite`, authoritative absence never selects `floor`. A
460
- registry `404` or a packument with no admitted version stays a `FETCH` refusal, because writing a
461
- version the registry says is absent produces an uninstallable manifest. `audit` turns release
462
- absence into questions and returns its audit result. Transport faults, timeouts, rate refusals,
463
- byte-bound refusals, and integrity refusals can select the floor.
464
-
465
- The guide surface is the per-row exception to whole-surface fallback. A failed foreign guide keeps
466
- the target's existing mirror as its floor, while the other guide rows can still update. When at
467
- least one selected guide keeps its mirror, `provenance.guides` is `floor` for the result; it is
468
- `live` only when every selected guide resolved live.
459
+ For `new`, `repair`, `catalog`, and `overwrite`, authoritative absence on a version surface never
460
+ selects `floor`. A registry `404` or a packument with no admitted version stays a `FETCH` refusal,
461
+ because writing a version the registry says is absent produces an uninstallable manifest. `audit`
462
+ turns release absence into questions and returns its audit result. Transport faults, timeouts, rate
463
+ refusals, byte-bound refusals, and integrity refusals can select the floor.
464
+
465
+ The guide surface is the per-row exception to whole-surface fallback, for absence as well as for
466
+ faults. A foreign guide the host could not serve a failed read, or the `404` a published package
467
+ with a private repository answers with — keeps the target's existing mirror as its floor, while the
468
+ other guide rows can still update. When at least one selected guide keeps its mirror,
469
+ `provenance.guides` is `floor` for the result; it is `live` only when every selected guide resolved
470
+ live.
469
471
 
470
472
  A value `Host` can carry live host-owned bytes beside installed floor bytes for deferred guide and
471
473
  catalog paths. Each surface still contributes one baseline. Deferred paths are presence-only, and
@@ -588,7 +590,10 @@ literal absent project, its advisory tells the developer to register the project
588
590
  script. For a planned project absent from the gate chains, the advisory reads the manifest after a
589
591
  writable script projection. The `scripts` question owns an absent direct `test:<project>` line. The
590
592
  `projects` question names the direct script and the gate chain that must invoke it when the projected
591
- region still leaves the project ungated. When `configs` is selected, `repair` and `overwrite` refuse
593
+ region still leaves the project ungated. Its remedy reads the manifest on disk rather than the
594
+ projection, so it states what the developer's own file holds: a script the manifest declares leaves
595
+ the gate as the only repair, and a script only the projection supplies is named as missing beside
596
+ the gate. When `configs` is selected, `repair` and `overwrite` refuse
592
597
  an unregistered or ungated project before writing. Their refusal names the `configs` group, the
593
598
  manifest and planned `vite.config.ts` conflict, and the option to exclude `configs` from `--groups`.
594
599
  A selection that excludes `configs` proceeds. An advisory alone does not make an aligned target
@@ -602,8 +607,18 @@ and `copy` gate chains stay maintainer-owned. A declared value is overwritten on
602
607
  the value being written or is a recognized generated predecessor. The overwrite happens in place,
603
608
  so every byte outside the replaced ranges survives. A target's descriptions, keywords, extra
604
609
  scripts, and manifest key order survive byte-for-byte. A script the manifest does not declare is
605
- appended after the last declared one, copying that section's indentation. `catalog` writes no script
606
- region; it names the ranges alone.
610
+ appended after the last declared script of its own key family, copying that section's indentation:
611
+ `test:setup` follows the last declared `test:` key rather than the lifecycle scripts that close the
612
+ section. A name carrying no colon has no family, and a family the section declares no member of has
613
+ nothing to follow, so each of those is appended after the last declared script instead. `catalog`
614
+ writes no script region; it names the ranges alone.
615
+
616
+ The range region and the script region are not groups. `package.json` is birth-owned, so the
617
+ `manifest` group creates it when a workspace is first materialized and never rewrites it afterwards,
618
+ and `--groups` narrows the plan rather than the regions. `repair` and `overwrite` therefore
619
+ reconcile the declared ranges and write the script region on every run, whatever the selection
620
+ names. A run scoped to `manifest` for a script write takes the reconciled `@orkestrel/*`
621
+ ranges with it, and a run that excludes `manifest` still takes the ranges and the scripts.
607
622
 
608
623
  A value matching neither is a script the workspace author wrote. The region writer retains that
609
624
  value byte-for-byte and reports its name, declared value, and planned value. Each other planned
@@ -613,8 +628,8 @@ non-string value or a `scripts` field that is not an object still refuses the wh
613
628
  script byte moving. `audit` reports absent and differing scripts separately in its non-blocking
614
629
  `scripts` question, and the terminal audit in `repair` and `overwrite` keeps every retained
615
630
  difference visible. Other selected writes still proceed. The `projects` question reports only a
616
- direct script the manifest declares but the maintainer-owned gate chain does not invoke after
617
- projection.
631
+ direct script the projected region declares and the maintainer-owned gate chain does not invoke, and
632
+ it names that script as declared or as missing according to the manifest on disk.
618
633
 
619
634
  The same plan-reading verbs compare the tooling set the derived blueprint plans against
620
635
  `dependencies` and `devDependencies` together. A missing planned package produces one non-blocking
@@ -1083,13 +1098,13 @@ Each verb resolves a surface's complete answer before it opens that surface's wr
1083
1098
  a partial answer never becomes a partial pin set. `overwrite` keeps the repair and removal work it
1084
1099
  committed before a later catalog refusal and records that refusal in `note`.
1085
1100
 
1086
- | Verb | Reads live | When the network forces a floor | With `--offline` |
1087
- | ----------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
1088
- | `new` | Declared versions and the vendored host | Writes the distributed version and host floors; exits `0` after creating the workspace | Reads no upstream surface, writes the same floors, and exits `0` after creating the workspace |
1089
- | `audit` | Declared versions and the vendored host | Compares through the distributed floors and exits `1` | Compares through the floors; exits `0` for an aligned target or `1` for drift |
1090
- | `repair` | Declared versions and the vendored host | Repairs from the distributed floors and exits `1`, even when the terminal audit is aligned | Repairs from the floors; the terminal audit decides exit `0` or `1` |
1091
- | `catalog` | Organization membership, its packuments, and the selected guides | Refuses a membership or version failure with `FETCH` and exit `1`; preserves each failed guide's local mirror and exits `1` | Is a usage error; exits `2` and writes nothing |
1092
- | `overwrite` | Everything `repair` and `catalog` read | Keeps completed repair and deletion work, names each floor or refused catalog step in `note`, and exits `1` | Repairs, deletes, and writes version floors; skips `catalog`, records that refusal in `note`, and exits `1` |
1101
+ | Verb | Reads live | When the network forces a floor | With `--offline` |
1102
+ | ----------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
1103
+ | `new` | Declared versions and the vendored host | Writes the distributed version and host floors; exits `0` after creating the workspace | Reads no upstream surface, writes the same floors, and exits `0` after creating the workspace |
1104
+ | `audit` | Declared versions and the vendored host | Compares through the distributed floors and exits `1` | Compares through the floors; exits `0` for an aligned target or `1` for drift |
1105
+ | `repair` | Declared versions and the vendored host | Repairs from the distributed floors and exits `1`, even when the terminal audit is aligned | Repairs from the floors; the terminal audit decides exit `0` or `1` |
1106
+ | `catalog` | Organization membership, its packuments, and the selected guides | Refuses a membership or version failure with `FETCH` and exit `1`; preserves the local mirror of each guide that failed or is absent upstream and exits `1` | Is a usage error; exits `2` and writes nothing |
1107
+ | `overwrite` | Everything `repair` and `catalog` read | Keeps completed repair and deletion work, names each floor or refused catalog step in `note`, and exits `1` | Repairs, deletes, and writes version floors; skips `catalog`, records that refusal in `note`, and exits `1` |
1093
1108
 
1094
1109
  A fleet row is compared exactly — `^0.1.0` is stale the moment the registry serves `0.1.2` — and
1095
1110
  that inequality alone raises `audit` to exit `1`. A foreign row is compared inside its declared
@@ -4,7 +4,7 @@
4
4
  "storage": "AGENTS.md",
5
5
  "destination": "AGENTS.md",
6
6
  "executable": false,
7
- "digest": "691f9fb52acd475a08109b93cdbed18628af36e9363f4803d84176a8117cf53c"
7
+ "digest": "5dbb143394991882d36f90a8aabd7e6b0874863b45dde4040760fc834e9d942e"
8
8
  },
9
9
  {
10
10
  "storage": "CLAUDE.md",
@@ -22,7 +22,7 @@
22
22
  "storage": "agents/orchestration.md",
23
23
  "destination": ".agents/orchestration.md",
24
24
  "executable": false,
25
- "digest": "3681749c3a0a0d601dacf78c7726a2018d0ea7643d96dbd77641c186ee2cd01e"
25
+ "digest": "db4414f1dc8eb2cc9e96cb920f08946d4be2507b081866839fea4112949b7505"
26
26
  },
27
27
  {
28
28
  "storage": "agents/skills/enterprise-bootstrap/SKILL.md",
@@ -310,7 +310,7 @@
310
310
  "storage": "claude/agents/orkestrel.md",
311
311
  "destination": ".claude/agents/orkestrel.md",
312
312
  "executable": false,
313
- "digest": "2381c90be0c3b543622386ab235fdbcdf827abc17c196d82e189f208727f7722"
313
+ "digest": "f71a28e5a4865bf6a910d9628d645f7d430f38aef29b815ef85caa1c01d87454"
314
314
  },
315
315
  {
316
316
  "storage": "claude/agents/planner.md",
@@ -628,13 +628,13 @@
628
628
  "storage": "dotfiles/oxlintrc.json",
629
629
  "destination": ".oxlintrc.json",
630
630
  "executable": false,
631
- "digest": "d4154c90721ff32cb1e4a709ac4672ca7bf31c0c9d757a0643397b2c8fbcff0d"
631
+ "digest": "c2d9715f5db07992601cf764532c9d9c7b11177a366d46d767ce07f50f49acad"
632
632
  },
633
633
  {
634
634
  "storage": "dotfiles/prettierignore",
635
635
  "destination": ".prettierignore",
636
636
  "executable": false,
637
- "digest": "9a2f99856efdf7a1c1cd806e40997a4621237de5a037ee60b2ac0bd23a3979cb"
637
+ "digest": "6f8bd3b8a192c974ae6332f017c2e76179d15e2598fbd624f7cd4e9e57156ff2"
638
638
  },
639
639
  {
640
640
  "storage": "guides/guide.md",
@@ -646,7 +646,7 @@
646
646
  "storage": "guides/scaffold.md",
647
647
  "destination": "guides/scaffold.md",
648
648
  "executable": false,
649
- "digest": "1aace5325608c6880d73a2bae7c02936c26445ef7aff550c43a70333c7be85f6"
649
+ "digest": "4b6e503d74188118ebba5ff4c9d76d9c9a933c0aec055ae600e02540e73c8c57"
650
650
  },
651
651
  {
652
652
  "storage": "scripts/codex.sh",
@@ -736,5 +736,5 @@
736
736
  ".codex/agents",
737
737
  ".cursor/rules"
738
738
  ],
739
- "digest": "f82097a8363d8b04d7363565947907bdb691a8fcbca2a2f103d9e9c551328bd5"
739
+ "digest": "bb4f3428a2d0d631ca77df5dc1921a7a171cef0b5e8a840038f0b7ab32f751d7"
740
740
  }
File without changes
File without changes
File without changes
File without changes
@@ -4,7 +4,7 @@ let _orkestrel_template = require("@orkestrel/template");
4
4
  let _orkestrel_emitter = require("@orkestrel/emitter");
5
5
  var package_default = {
6
6
  name: "@orkestrel/scaffold",
7
- version: "0.0.52",
7
+ version: "0.0.54",
8
8
  description: "Scaffold workspaces with five commands: new, audit, repair, catalog, and overwrite.",
9
9
  keywords: [
10
10
  "audit",
@@ -78,7 +78,7 @@ var package_default = {
78
78
  "test:distribution": "vitest run --config vite.config.ts --no-cache --reporter=dot --project distribution",
79
79
  "test:probe": "vitest run --config vite.config.ts --no-cache --reporter=verbose --project probe",
80
80
  "test:bench": "vitest bench --config vite.config.ts --no-cache --project probe",
81
- "build": "npm run clean && npm run build:src && npm run build:host",
81
+ "build": "npm run clean && npm run build:src && npm run build:host && npm run build:inventory",
82
82
  "build:src": "npm run build:src:core && npm run build:src:server && npm run build:src:bin",
83
83
  "build:src:core": "vite build --config configs/src/vite.core.config.ts && npm run copy dist/src/core/index.d.ts dist/src/core/index.d.cts",
84
84
  "build:src:server": "vite build --config configs/src/vite.server.config.ts && npm run copy dist/src/server/index.d.ts dist/src/server/index.d.cts",
@@ -92,20 +92,20 @@ var package_default = {
92
92
  "@orkestrel/console": "^0.0.10",
93
93
  "@orkestrel/contract": "^0.0.13",
94
94
  "@orkestrel/emitter": "^0.0.8",
95
- "@orkestrel/markdown": "^0.0.10",
95
+ "@orkestrel/markdown": "^0.0.12",
96
96
  "@orkestrel/process": "^0.0.6",
97
97
  "@orkestrel/template": "^0.0.5"
98
98
  },
99
99
  devDependencies: {
100
100
  "@microsoft/api-extractor": "^7.59.0",
101
- "@orkestrel/guide": "^0.0.13",
102
- "@orkestrel/html": "^0.0.5",
103
- "@orkestrel/probe": "^0.0.4",
101
+ "@orkestrel/guide": "^0.0.14",
102
+ "@orkestrel/html": "^0.0.7",
103
+ "@orkestrel/probe": "^0.0.8",
104
104
  "@orkestrel/test": "^0.0.11",
105
- "@types/node": "^26.2.0",
105
+ "@types/node": "^26.3.0",
106
106
  "@vitest/browser-playwright": "^4.1.11",
107
- "oxfmt": "^0.64.0",
108
- "oxlint": "^1.79.0",
107
+ "oxfmt": "^0.65.0",
108
+ "oxlint": "^1.80.0",
109
109
  "playwright": "^1.62.1",
110
110
  "typescript": "^6.0.3",
111
111
  "vite": "^8.2.2",
@@ -5445,9 +5445,12 @@ function replaceManifestRanges(manifest, pins) {
5445
5445
  * other string is a chain the workspace author customized, so it stays
5446
5446
  * byte-identical while the other named scripts are written independently. A
5447
5447
  * named script the manifest does not declare is appended after the last
5448
- * declared script, copying that section's indentation. A region declaring
5449
- * nothing takes every named script as its first entries, indented from the line
5450
- * its own opening brace sits on.
5448
+ * declared script of its own key family, copying that section's indentation:
5449
+ * `test:setup` follows the last declared `test:` key. A name carrying no colon
5450
+ * has no family, and so does a family the section declares no member of, and
5451
+ * each of those is appended after the last declared script instead. A region
5452
+ * declaring nothing takes every named script as its first entries, indented
5453
+ * from the line its own opening brace sits on.
5451
5454
  *
5452
5455
  * @example
5453
5456
  * ```ts
@@ -5541,6 +5544,7 @@ function replaceManifestScripts(manifest, scripts) {
5541
5544
  if (start < 0 || end < 0) return void 0;
5542
5545
  const edits = [];
5543
5546
  const written = /* @__PURE__ */ new Set();
5547
+ const anchors = [];
5544
5548
  let first = -1;
5545
5549
  let nested = 0;
5546
5550
  let scan = start;
@@ -5593,6 +5597,10 @@ function replaceManifestScripts(manifest, scripts) {
5593
5597
  if (valueEnd >= end) return void 0;
5594
5598
  scan = valueEnd + 1;
5595
5599
  const key = (0, _orkestrel_contract.parseJSON)(manifest.slice(keyStart, keyEnd));
5600
+ if ((0, _orkestrel_contract.isString)(key)) anchors.push({
5601
+ name: key,
5602
+ end: valueEnd + 1
5603
+ });
5596
5604
  const script = scripts.find((entry) => entry.name === key);
5597
5605
  if (script === void 0) continue;
5598
5606
  written.add(script.name);
@@ -5620,15 +5628,25 @@ function replaceManifestScripts(manifest, scripts) {
5620
5628
  text: `${entries.join(",")}${closing}`
5621
5629
  });
5622
5630
  } else {
5623
- let anchor = end - 1;
5624
- while (anchor > start && /\s/u.test(manifest.charAt(anchor - 1))) anchor -= 1;
5631
+ let tail = end - 1;
5632
+ while (tail > start && /\s/u.test(manifest.charAt(tail - 1))) tail -= 1;
5625
5633
  const newline = manifest.lastIndexOf("\n", first);
5626
5634
  const indent = newline < 0 ? "" : manifest.slice(newline + 1, first);
5627
5635
  const separator = newline < 0 || /\S/u.test(indent) ? "" : `\n${indent}`;
5628
- edits.push({
5636
+ const placed = /* @__PURE__ */ new Map();
5637
+ for (const script of missing) {
5638
+ const colon = script.name.indexOf(":");
5639
+ const family = colon < 0 ? void 0 : script.name.slice(0, colon + 1);
5640
+ const anchor = (family === void 0 ? void 0 : anchors.findLast((entry) => entry.name.startsWith(family)))?.end ?? tail;
5641
+ const text = `,${separator}${JSON.stringify(script.name)}: ${JSON.stringify(script.command)}`;
5642
+ const queued = placed.get(anchor);
5643
+ if (queued === void 0) placed.set(anchor, [text]);
5644
+ else queued.push(text);
5645
+ }
5646
+ for (const [anchor, queued] of placed) edits.push({
5629
5647
  start: anchor,
5630
5648
  end: anchor,
5631
- text: missing.map((script) => `,${separator}${JSON.stringify(script.name)}: ${JSON.stringify(script.command)}`).join("")
5649
+ text: queued.join("")
5632
5650
  });
5633
5651
  }
5634
5652
  }