@orkestrel/scaffold 0.0.52 → 0.0.53

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.
@@ -42,8 +42,8 @@ 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` |
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
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` |
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` |
@@ -53,17 +53,17 @@ so network-controlled descriptions never enter agent instruction context.
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
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` |
56
+ | `@orkestrel/html` | `0.0.6` | 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/markdown` | `0.0.11` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/html` `^0.0.6` |
60
+ | `@orkestrel/mcp` | `0.0.24` | 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
61
  | `@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
62
  | `@orkestrel/msg` | `0.0.8` | L0 | |
63
63
  | `@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` |
64
+ | `@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
65
  | `@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` |
66
+ | `@orkestrel/probe` | `0.0.6` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/mcp` `^0.0.24`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.8`, `@orkestrel/tool` `^0.0.12` |
67
67
  | `@orkestrel/process` | `0.0.6` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7` |
68
68
  | `@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
69
  | `@orkestrel/qualifier` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/reason` `^0.0.7` |
@@ -72,7 +72,7 @@ so network-controlled descriptions never enter agent instruction context.
72
72
  | `@orkestrel/reason` | `0.0.8` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
73
73
  | `@orkestrel/relation` | `0.0.10` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8` |
74
74
  | `@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` |
75
+ | `@orkestrel/scaffold` | `0.0.52` | L3 | `@orkestrel/console` `^0.0.10`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/markdown` `^0.0.10`, `@orkestrel/process` `^0.0.6`, `@orkestrel/template` `^0.0.5` |
76
76
  | `@orkestrel/sea` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/process` `^0.0.6` |
77
77
  | `@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
78
  | `@orkestrel/sqlite` | `0.0.9` | L1 | `@orkestrel/contract` `^0.0.13` |
@@ -84,7 +84,7 @@ so network-controlled descriptions never enter agent instruction context.
84
84
  | `@orkestrel/test` | `0.0.11` | L0 | |
85
85
  | `@orkestrel/timeout` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
86
86
  | `@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` |
87
+ | `@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
88
  | `@orkestrel/websocket` | `0.0.10` | L2 | `@orkestrel/emitter` `^0.0.8` |
89
89
  | `@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
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` |
@@ -588,7 +588,10 @@ literal absent project, its advisory tells the developer to register the project
588
588
  script. For a planned project absent from the gate chains, the advisory reads the manifest after a
589
589
  writable script projection. The `scripts` question owns an absent direct `test:<project>` line. The
590
590
  `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
591
+ region still leaves the project ungated. Its remedy reads the manifest on disk rather than the
592
+ projection, so it states what the developer's own file holds: a script the manifest declares leaves
593
+ the gate as the only repair, and a script only the projection supplies is named as missing beside
594
+ the gate. When `configs` is selected, `repair` and `overwrite` refuse
592
595
  an unregistered or ungated project before writing. Their refusal names the `configs` group, the
593
596
  manifest and planned `vite.config.ts` conflict, and the option to exclude `configs` from `--groups`.
594
597
  A selection that excludes `configs` proceeds. An advisory alone does not make an aligned target
@@ -602,8 +605,18 @@ and `copy` gate chains stay maintainer-owned. A declared value is overwritten on
602
605
  the value being written or is a recognized generated predecessor. The overwrite happens in place,
603
606
  so every byte outside the replaced ranges survives. A target's descriptions, keywords, extra
604
607
  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.
608
+ appended after the last declared script of its own key family, copying that section's indentation:
609
+ `test:setup` follows the last declared `test:` key rather than the lifecycle scripts that close the
610
+ section. A name carrying no colon has no family, and a family the section declares no member of has
611
+ nothing to follow, so each of those is appended after the last declared script instead. `catalog`
612
+ writes no script region; it names the ranges alone.
613
+
614
+ The range region and the script region are not groups. `package.json` is birth-owned, so the
615
+ `manifest` group creates it when a workspace is first materialized and never rewrites it afterwards,
616
+ and `--groups` narrows the plan rather than the regions. `repair` and `overwrite` therefore
617
+ reconcile the declared ranges and write the script region on every run, whatever the selection
618
+ names. A run scoped to `manifest` for a script write takes the reconciled `@orkestrel/*`
619
+ ranges with it, and a run that excludes `manifest` still takes the ranges and the scripts.
607
620
 
608
621
  A value matching neither is a script the workspace author wrote. The region writer retains that
609
622
  value byte-for-byte and reports its name, declared value, and planned value. Each other planned
@@ -613,8 +626,8 @@ non-string value or a `scripts` field that is not an object still refuses the wh
613
626
  script byte moving. `audit` reports absent and differing scripts separately in its non-blocking
614
627
  `scripts` question, and the terminal audit in `repair` and `overwrite` keeps every retained
615
628
  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.
629
+ direct script the projected region declares and the maintainer-owned gate chain does not invoke, and
630
+ it names that script as declared or as missing according to the manifest on disk.
618
631
 
619
632
  The same plan-reading verbs compare the tooling set the derived blueprint plans against
620
633
  `dependencies` and `devDependencies` together. A missing planned package produces one non-blocking
@@ -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",
@@ -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": "3d1d0b4ee196465d831178f5aa1c425325f39d4f9087654aac48b877f728af3d"
314
314
  },
315
315
  {
316
316
  "storage": "claude/agents/planner.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": "0a69b1cf0194078be9a54c9c51d88029d7c7d93a41bce63001e038f588f175ce"
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": "938ab0fd0dc511cf6d138259d14c58de31eaec665ce65ce2ac4ef62e5f31ae32"
740
740
  }
@@ -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.53",
8
8
  description: "Scaffold workspaces with five commands: new, audit, repair, catalog, and overwrite.",
9
9
  keywords: [
10
10
  "audit",
@@ -92,15 +92,15 @@ 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.11",
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
101
  "@orkestrel/guide": "^0.0.13",
102
- "@orkestrel/html": "^0.0.5",
103
- "@orkestrel/probe": "^0.0.4",
102
+ "@orkestrel/html": "^0.0.6",
103
+ "@orkestrel/probe": "^0.0.6",
104
104
  "@orkestrel/test": "^0.0.11",
105
105
  "@types/node": "^26.2.0",
106
106
  "@vitest/browser-playwright": "^4.1.11",
@@ -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
  }