@orkestrel/scaffold 0.0.108 → 0.0.109
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/bench.js +326 -91
- package/dist/agents/skills/orkestrel-dispatch/scripts/brief.js +110 -14
- package/dist/agents/skills/orkestrel-dispatch/scripts/chain.js +280 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/cite.js +188 -26
- package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +142 -43
- package/dist/agents/skills/orkestrel-dispatch/scripts/login.js +240 -62
- package/dist/agents/skills/orkestrel-dispatch/scripts/patch.js +323 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/result.js +169 -32
- package/dist/agents/skills/orkestrel-dispatch/scripts/sweep.js +290 -69
- package/dist/agents/skills/orkestrel-falsify/scripts/mutate.js +560 -0
- package/dist/agents/skills/orkestrel-harden/scripts/discovery.js +1052 -205
- package/dist/agents/skills/orkestrel-harden/scripts/measure.js +361 -0
- package/dist/agents/skills/orkestrel-harden/scripts/titles.js +455 -80
- package/dist/agents/skills/orkestrel-parallel/scripts/cases.js +327 -0
- package/dist/agents/skills/orkestrel-publish/scripts/compare.js +298 -51
- package/dist/agents/skills/orkestrel-publish/scripts/pins.js +170 -13
- package/dist/agents/skills/orkestrel-publish/scripts/swap.js +956 -191
- package/dist/agents/skills/orkestrel-publish/scripts/wave.js +707 -112
- package/dist/agents/skills/orkestrel-publish/scripts/window.js +235 -41
- package/dist/agents/skills/orkestrel-scout/scripts/map.js +341 -54
- package/dist/agents/templates/brief.md +1 -1
- package/dist/bin/main.js +51 -46
- package/dist/bin/main.js.map +1 -1
- package/dist/host/AGENTS.md +23 -21
- package/dist/host/agents/orchestration.md +43 -18
- package/dist/host/agents/platforms/windows.md +3 -3
- package/dist/host/agents/skills/orkestrel-align/SKILL.md +10 -13
- package/dist/host/agents/skills/orkestrel-align/references/fleet.md +4 -10
- package/dist/host/agents/skills/orkestrel-align/references/integration.md +1 -1
- package/dist/host/agents/skills/orkestrel-build/SKILL.md +16 -48
- package/dist/host/agents/skills/orkestrel-build/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +19 -16
- package/dist/host/agents/skills/orkestrel-debrief/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +15 -28
- package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +5 -6
- package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +4 -6
- package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +31 -20
- package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +3 -4
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/bench.ts +366 -75
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/brief.ts +126 -16
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/chain.ts +323 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/cite.ts +220 -31
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +176 -33
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/login.ts +294 -59
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/patch.ts +401 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/result.ts +199 -34
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/sweep.ts +330 -69
- package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +10 -8
- package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +1 -5
- package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +1 -1
- package/dist/host/agents/skills/orkestrel-falsify/scripts/mutate.ts +701 -0
- package/dist/host/agents/skills/orkestrel-harden/SKILL.md +16 -12
- package/dist/host/agents/skills/orkestrel-harden/references/bindings.md +23 -81
- package/dist/host/agents/skills/orkestrel-harden/references/centralization.md +4 -5
- package/dist/host/agents/skills/orkestrel-harden/references/contract.md +2 -0
- package/dist/host/agents/skills/orkestrel-harden/references/document.md +33 -0
- package/dist/host/agents/skills/orkestrel-harden/references/equivalence.md +6 -3
- package/dist/host/agents/skills/orkestrel-harden/references/hardening.md +8 -4
- package/dist/host/agents/skills/orkestrel-harden/references/research.md +2 -0
- package/dist/host/agents/skills/orkestrel-harden/scripts/discovery.ts +1272 -279
- package/dist/host/agents/skills/orkestrel-harden/scripts/measure.ts +425 -0
- package/dist/host/agents/skills/orkestrel-harden/scripts/titles.ts +603 -98
- package/dist/host/agents/skills/orkestrel-journey/SKILL.md +75 -98
- package/dist/host/agents/skills/orkestrel-journey/references/captures.md +54 -17
- package/dist/host/agents/skills/orkestrel-journey/references/decide.md +1 -20
- package/dist/host/agents/skills/orkestrel-journey/references/layer.md +21 -31
- package/dist/host/agents/skills/orkestrel-journey/references/styles.md +1 -1
- package/dist/host/agents/skills/orkestrel-parallel/SKILL.md +28 -24
- package/dist/host/agents/skills/orkestrel-parallel/references/claude.md +15 -13
- package/dist/host/agents/skills/orkestrel-parallel/references/codex.md +1 -0
- package/dist/host/agents/skills/orkestrel-parallel/references/cursor.md +13 -13
- package/dist/host/agents/skills/orkestrel-parallel/scripts/cases.ts +389 -0
- package/dist/host/agents/skills/orkestrel-polish/SKILL.md +16 -20
- package/dist/host/agents/skills/orkestrel-polish/references/capture-harness.md +16 -26
- package/dist/host/agents/skills/orkestrel-publish/SKILL.md +12 -26
- package/dist/host/agents/skills/orkestrel-publish/agents/openai.yaml +2 -2
- package/dist/host/agents/skills/orkestrel-publish/references/adopt.md +23 -0
- package/dist/host/agents/skills/orkestrel-publish/references/release.md +4 -4
- package/dist/host/agents/skills/orkestrel-publish/references/wave.md +10 -9
- package/dist/host/agents/skills/orkestrel-publish/references/window.md +20 -25
- package/dist/host/agents/skills/orkestrel-publish/scripts/compare.ts +348 -59
- package/dist/host/agents/skills/orkestrel-publish/scripts/pins.ts +202 -22
- package/dist/host/agents/skills/orkestrel-publish/scripts/swap.ts +1061 -191
- package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +812 -140
- package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +280 -38
- package/dist/host/agents/skills/orkestrel-scout/SKILL.md +3 -3
- package/dist/host/agents/skills/orkestrel-scout/scripts/map.ts +428 -70
- package/dist/host/agents/templates/brief.md +1 -1
- package/dist/host/agents/transports/claude-cli.md +3 -3
- package/dist/host/agents/transports/codex.md +2 -7
- package/dist/host/agents/transports/cursor.md +2 -3
- package/dist/host/claude/AGENTS.md +2 -2
- package/dist/host/claude/agents/analyst.md +3 -3
- package/dist/host/claude/agents/astra.md +3 -3
- package/dist/host/claude/agents/builder.md +1 -1
- package/dist/host/claude/agents/checker.md +1 -1
- package/dist/host/claude/agents/distiller.md +1 -1
- package/dist/host/claude/agents/grok.md +1 -1
- package/dist/host/claude/agents/opus.md +2 -2
- package/dist/host/claude/agents/orkestrel.md +57 -90
- package/dist/host/claude/agents/researcher.md +1 -1
- package/dist/host/claude/agents/reviewer.md +4 -0
- package/dist/host/claude/agents/scout.md +1 -1
- package/dist/host/claude/agents/verifier.md +1 -1
- package/dist/host/claude/rules/application.md +14 -21
- package/dist/host/claude/rules/architecture.md +34 -44
- package/dist/host/claude/rules/browser.md +3 -4
- package/dist/host/claude/rules/campaign.md +2 -2
- package/dist/host/claude/rules/documentation.md +25 -12
- package/dist/host/claude/rules/names.md +9 -4
- package/dist/host/claude/rules/patterns.md +6 -7
- package/dist/host/claude/rules/portability.md +1 -1
- package/dist/host/claude/rules/quality.md +4 -5
- package/dist/host/claude/rules/styles.md +2 -2
- package/dist/host/claude/rules/tests.md +57 -114
- package/dist/host/claude/rules/typescript.md +7 -9
- package/dist/host/claude/rules/workspace.md +21 -19
- package/dist/host/claude/rules/writing.md +2 -5
- package/dist/host/claude/skills/orkestrel-dispatch/SKILL.md +1 -1
- package/dist/host/claude/skills/orkestrel-harden/SKILL.md +1 -1
- package/dist/host/claude/skills/orkestrel-publish/SKILL.md +1 -1
- package/dist/host/claude/skills/orkestrel-scout/SKILL.md +1 -1
- package/dist/host/codex/agents/analyst.toml +9 -3
- package/dist/host/codex/agents/astra.toml +3 -4
- package/dist/host/codex/agents/builder.toml +1 -1
- package/dist/host/codex/agents/opus.toml +3 -4
- package/dist/host/codex/agents/orkestrel.toml +1 -1
- package/dist/host/codex/agents/researcher.toml +2 -2
- package/dist/host/codex/agents/verifier.toml +1 -1
- package/dist/host/configs/helpers.ts +21 -1
- package/dist/host/configs/policy.ts +299 -15
- package/dist/host/dotfiles/oxlintrc.json +137 -3
- package/dist/host/guides/agent.md +111 -134
- package/dist/host/guides/capture.md +801 -0
- package/dist/host/guides/probe.md +27 -8
- package/dist/host/guides/scaffold.md +96 -18
- package/dist/host/guides/study.md +534 -440
- package/dist/host/guides/test.md +111 -44
- package/dist/host/manifest.json +160 -240
- package/dist/host/tests/config.test.ts +971 -187
- package/dist/host/tests/policy.test.ts +127 -1
- package/dist/host/tests/setupPolicy.ts +893 -33
- package/dist/src/core/index.cjs +214 -86
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +122 -38
- package/dist/src/core/index.d.ts +122 -38
- package/dist/src/core/index.js +209 -85
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/index.cjs +20 -27
- package/dist/src/server/index.cjs.map +1 -1
- package/dist/src/server/index.js +21 -28
- package/dist/src/server/index.js.map +1 -1
- package/package.json +11 -11
- package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +0 -283
- package/dist/host/agents/skills/orkestrel-dispatch/references/bench.md +0 -25
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +0 -333
- package/dist/host/guides/supervisor.md +0 -4890
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: orkestrel-publish
|
|
3
|
-
description: Run an Orkestrel release from layer order to registry confirmation. Use when the user asks to publish a package, to run a fleet-wide release wave,
|
|
3
|
+
description: Run an Orkestrel release from layer order to registry confirmation, or adopt a published scaffold release in one consumer. Use when the user asks to publish a package, to run a fleet-wide release wave, to recover a release that stalled at the npm approval, or to adopt a published scaffold release in one repository, and follow it for the per-repository visit, the bump ruling, the layer preparation, the login approval, the upload approval, and the adoption.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Publish an Orkestrel release
|
|
@@ -14,9 +14,10 @@ description: Run an Orkestrel release from layer order to registry confirmation.
|
|
|
14
14
|
here.
|
|
15
15
|
2. The reference the moment needs: [wave.md](references/wave.md) before visiting a repository,
|
|
16
16
|
ruling on a bump, or preparing a layer; [window.md](references/window.md) before running
|
|
17
|
-
`npm login` or any upload.
|
|
17
|
+
`npm login` or any upload; [adopt.md](references/adopt.md) before one consumer adopts a
|
|
18
|
+
published scaffold release outside a wave.
|
|
18
19
|
3. The live evidence: the registry's packument for every package in the round, each target's
|
|
19
|
-
manifest, and the catalog table
|
|
20
|
+
manifest, and the catalog table `references/release.md` names as the layer order.
|
|
20
21
|
|
|
21
22
|
## Scripts
|
|
22
23
|
|
|
@@ -26,35 +27,20 @@ description: Run an Orkestrel release from layer order to registry confirmation.
|
|
|
26
27
|
| `scripts/pins.ts` | `--version PRIOR [--range PRIOR_RANGE ...] [--paths src,tests] [--json]`, run from the package root: lists every line under the paths carrying the prior version literal or a prior range literal, once per line, sweeping a one-comparator range such as `^8.3.0` for its bare version in any form. Exit 0 with no hits, 3 with hits, 64 on usage (no literal, or a flag with no value). |
|
|
27
28
|
| `scripts/swap.ts` | One mode per run, from any directory: `--pin --consumer DIR --source DIR [--source DIR ...] [--override NAME ...] [--no-build] [--dry-run] [--json]` refuses a source whose packed manifest names a local dependency spec in any dependency field (a `file:` or `link:` prefix, a path start of `.`, `~/`, `/`, `\`, or a drive letter, or a protocol-free archive name ending in `.tgz`, `.tar.gz`, or `.tar` that is not a `user/repo` shorthand), builds and packs each source into `<consumer>/tmp/tarballs/` under a name carrying its SHA-256, records each replaced range in the ledger `pins.json` there, the record of which build the consumer runs, writes each tarball's absolute `file:` spec and each `--override` (repeatable, like `--source`) where oxfmt sorts it, installs, and proves that every pinned source, an override-only one included, is installed with the source's bytes; `--restore --consumer DIR [--package NAME ...] [--json]` puts back each recorded range and override, keeps an `overrides` block that existed before the pin, installs, proves the restored copy, and lists the re-pin arguments, and refuses with 64, before it writes anything, a ledger whose package or override keys are not package names or whose removal would leave `node_modules`; `--status --consumer DIR [--json]` writes nothing and reports drift between the ledger, the manifest, the tarballs, the installed bytes, and the source commits, a manifest spec holding its tarball only when it names the ledger archive's location. `--pin` and `--restore` write a receipt under `tmp/units/`. Exit 0 on success, 1 when a command or a proof failed, 3 when `--status` reports drift, 64 on usage. |
|
|
28
29
|
| `scripts/wave.ts` | `--visit [--target DIR] [--offline] [--regenerate] [--from STEP] [--to STEP] [--prior VERSION] [--dry-run] [--json] [--out FILE]` runs one repository's visit in the order [wave.md](references/wave.md) § Visit a repository fixes (pin, commit, overwrite, verify, install, pins, format, record, gates, compare), stops at the first failing step, journals each executed step's full output under the target's `tmp/units/wave/` when the work tree ignores `tmp/` and names the journal in its row, and prints each step's exit (a failed step names the `code: message` refusal or the `note` a JSON verb writes on stdout, else the last stderr lines), the bump ruling (the rebuilt dist against the published tarball, and the final runtime dependency set against the published manifest), and a row for `.orkestrel/release.md`; `--prior` names the version a pre-ruled bump replaced so the self-pin sweep finds it; `--plan` prints the packages by layer from the catalog table. An install that fails `ERESOLVE` names the rerun command, and `--regenerate` replaces the lockfile and `node_modules` from the manifest under the refusals and proof [wave.md](references/wave.md) § Regenerate a lock the install cannot move states; `record` commits the overwrite's writes as `Overwrite with scaffold VERSION`. Exit 0 when every step passed, 1 when one failed, 2 when a reading failed, 64 on usage, including `--regenerate` with `--plan`. |
|
|
29
|
-
| `scripts/window.ts` | `--whoami [--wait SECONDS]` reads or polls `npm whoami`; `--login` prints the operator's login command and polls `whoami` until it answers; `--publish DIR... --otp CODE` refuses a batch whose nearest `.git` entry is a file, including ancestor entries, with exit 3 before contacting npm; it names a linked worktree's primary clone or identifies a submodule, then uploads back to back with `npm publish --ignore-scripts --otp`, journals each upload under `tmp/units/`, stops at the first refusal naming where to resume, and confirms each accepted version against the registry; `--confirm NAME@VERSION...` re-reads the registry until it serves the version. Exit 0 on success, 3 when not.
|
|
30
|
+
| `scripts/window.ts` | `--whoami [--wait SECONDS]` reads or polls `npm whoami`; `--login` prints the operator's login command and polls `whoami` until it answers; `--publish DIR... --otp CODE` refuses a batch whose nearest `.git` entry is a file, including ancestor entries, with exit 3 before contacting npm; it names a linked worktree's primary clone or identifies a submodule, then uploads back to back with `npm publish --ignore-scripts --otp`, journals each upload under `tmp/units/`, stops at the first refusal naming where to resume, and confirms each accepted version against the registry; `--confirm NAME@VERSION...` re-reads the registry until it serves the version. Exit 0 on success, 3 when not, 64 on usage. |
|
|
30
31
|
|
|
31
|
-
The user's current instruction wins. `references/release.md`
|
|
32
|
-
and authorization law; nothing here weakens it.
|
|
33
|
-
|
|
34
|
-
## The boundary with the contract
|
|
35
|
-
|
|
36
|
-
`references/release.md` binds every release, and this skill does not
|
|
37
|
-
repeat it. Read that section for the credential and approval law, the long-running-command
|
|
38
|
-
binding, the serialization of uploads, the tarball swap that serves a consumer whose dependency
|
|
39
|
-
has not published, what a bump obliges downstream, and where the layer order comes from.
|
|
40
|
-
|
|
41
|
-
This skill carries what an operator needs while a release is running: the per-repository visit,
|
|
42
|
-
the bump ruling, the preparation order, the login and approval mechanics, and the window.
|
|
43
|
-
|
|
44
|
-
Where the skill and the contract disagree, the contract wins. Report the drift instead of
|
|
45
|
-
following the skill.
|
|
32
|
+
The user's current instruction wins. `references/release.md` binds every release: the credential and authorization law, the upload serialization, the tarball swap, what a bump obliges downstream, and the layer order. Nothing here weakens it. Where this skill disagrees with it, report the drift instead of following the skill.
|
|
46
33
|
|
|
47
34
|
## Run the release
|
|
48
35
|
|
|
49
36
|
1. **Name the round.** List the packages the release covers, and group them into layers with
|
|
50
|
-
`node .agents/skills/orkestrel-publish/scripts/wave.ts --plan`, which reads the
|
|
51
|
-
|
|
37
|
+
`node .agents/skills/orkestrel-publish/scripts/wave.ts --plan`, which reads the layer order
|
|
38
|
+
from the catalog table.
|
|
52
39
|
2. **Take the registry evidence.** Read what the registry serves for every package in the round.
|
|
53
40
|
Derive each pin from that reading, never from a local manifest.
|
|
54
41
|
3. **Visit each repository.** Run `node .agents/skills/orkestrel-publish/scripts/wave.ts --visit --target <repository>`,
|
|
55
42
|
which runs the visit in [wave.md](references/wave.md) in its stated order and stops at the first
|
|
56
|
-
failing step; repair that step by hand and re-run from it with `--from`; for an `ERESOLVE`, follow [wave.md](references/wave.md) § Regenerate a lock the install cannot move.
|
|
57
|
-
slices of disjoint repositories, each slice serial inside itself.
|
|
43
|
+
failing step; repair that step by hand and re-run from it with `--from`; for an `ERESOLVE`, follow [wave.md](references/wave.md) § Regenerate a lock the install cannot move.
|
|
58
44
|
4. **Rule on each package's bump.** Take the visit's comparison and range reading; repeat `compare.ts` only after the artifact changes or an unanswered result. Apply the triggers in [wave.md](references/wave.md) § Rule on
|
|
59
45
|
the bump; `references/release.md` § What a bump obliges owns the blast radius.
|
|
60
46
|
5. **Prepare the whole layer before authenticating**, in the order [wave.md](references/wave.md)
|
|
@@ -69,8 +55,8 @@ following the skill.
|
|
|
69
55
|
8. **Close the layer from the registry, then prepare the next**, per [wave.md](references/wave.md)
|
|
70
56
|
§ Prepare a layer.
|
|
71
57
|
|
|
72
|
-
Run that sequence for every layer, from the registry reading to the registry close
|
|
73
|
-
registry
|
|
58
|
+
Run that sequence for every layer, from the registry reading to the registry close;
|
|
59
|
+
[wave.md](references/wave.md) § Refresh the registry between layers owns the refresh.
|
|
74
60
|
|
|
75
61
|
## Accept the release
|
|
76
62
|
|
|
@@ -81,7 +67,7 @@ Completion requires:
|
|
|
81
67
|
- every obligation `references/release.md` § What a bump obliges places on a published package's dependents has closed as
|
|
82
68
|
that section requires;
|
|
83
69
|
- every tarball swap is restored per `references/release.md` § Fix a dependency before it publishes, and no target
|
|
84
|
-
repository is left holding an uncommitted bump or an unpushed commit;
|
|
70
|
+
repository is left holding an uncommitted bump or an unpushed commit the user has not held;
|
|
85
71
|
- every gate that proved a package ran outside the window and against the artifact that shipped;
|
|
86
72
|
- every gate red at a package's baseline for a cause `ROADMAP.md` already carries is recorded as a
|
|
87
73
|
standing reading beside the package's row with its carrier, and the release report names it. A
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: 'Publish Orkestrel Release'
|
|
3
|
-
short_description: 'Run a release in layer order through the npm approval
|
|
4
|
-
default_prompt: 'Use $orkestrel-publish to run the release - layer order, per-repository visit, bump ruling, layer preparation, login approval, upload
|
|
3
|
+
short_description: 'Run a release in layer order through the npm approval, or adopt a scaffold release in one consumer'
|
|
4
|
+
default_prompt: 'Use $orkestrel-publish to run the release - layer order, per-repository visit, bump ruling, layer preparation, login approval, upload approval, and registry confirmation - or to adopt a published scaffold release in one consumer.'
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Adopt a published scaffold release in one consumer
|
|
2
|
+
|
|
3
|
+
This file governs one consumer taking a published `@orkestrel/scaffold` release outside a release wave. [wave.md](wave.md) § Visit a repository owns the visit a wave runs; [release.md](release.md) § The scaffold surface owns what a vendored-only release obliges.
|
|
4
|
+
|
|
5
|
+
Every verb and flag below is in `guides/scaffold.md` § Command line. `audit` writes nothing; `repair` writes each planned path the target is missing or has let drift, and reconciles the declared `@orkestrel/*` ranges and the script region on every run, whatever `--groups` names.
|
|
6
|
+
|
|
7
|
+
## Steps
|
|
8
|
+
|
|
9
|
+
1. **Restore pins.** Restore every tarball pin the consumer holds with `scripts/swap.ts --restore`, per [release.md](release.md) § Fix a dependency before it publishes, so the adoption reads registry ranges.
|
|
10
|
+
2. **Re-pin.** Read the registry's `@orkestrel/scaffold` version, set the consumer's range to the caret of that release, and commit nothing yet.
|
|
11
|
+
3. **Install against the registry.** Run `npm install` with `npm_config_prefer_online=true`, per [wave.md](wave.md) § Refresh the registry between layers. A cached packument answers `notarget` for a version the registry already serves.
|
|
12
|
+
4. **Read the drift.** Run `scaffold audit` from the consumer, and add `--groups <list>` to scope it to the groups the consumer takes. Read its questions and findings before writing.
|
|
13
|
+
5. **Repair.** Run `scaffold repair --groups <list>` over the groups the consumer takes, named per `guides/scaffold.md` § Groups. Omit `--offline`: it writes the distributed floors, not the registry's.
|
|
14
|
+
6. **Restore held ranges.** `repair` rewrites the declared `@orkestrel/*` ranges and the showcase pair on every run (`guides/scaffold.md` § Dependency floors), so diff the manifest against `HEAD` and put back every range the consumer holds on purpose. The consumer's plan or ledger names each hold.
|
|
15
|
+
7. **Reinstall.** Run the install of step 3 again; the restored manifest no longer matches the lockfile the first install wrote.
|
|
16
|
+
8. **Run the gates.** Run the gate chain the consumer's manifest declares. `scaffold audit` exits `0` when the target matches its plan, `1` on drift, and `2` on a usage error. A drift a held range causes is expected; name it.
|
|
17
|
+
9. **Rebuild committed artifacts.** Rebuild every artifact the consumer's plan names as committed (a generated registry, a snapshot, a mirror) with the consumer's own script, and read the diff.
|
|
18
|
+
10. **Commit** by explicit paths, with the scaffold version in the message. A push to the remote waits for the user's go-ahead.
|
|
19
|
+
|
|
20
|
+
## Refuse
|
|
21
|
+
|
|
22
|
+
- Never run `repair` against the `@orkestrel/scaffold` checkout; the verb refuses it with the `TARGET` code.
|
|
23
|
+
- Never edit a vendored file in the consumer to quiet `audit`; change it in the scaffold repository and release, per [release.md](release.md) § The scaffold surface.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Release laws
|
|
2
2
|
|
|
3
|
-
`orkestrel-publish
|
|
3
|
+
The `orkestrel-publish` skill names this file. It carries the fleet release rules that bind an executor who is publishing or preparing a package to publish.
|
|
4
4
|
|
|
5
5
|
## Publishing is the user's
|
|
6
6
|
|
|
7
7
|
- Publishing is the user's decision and the user's credential. Prepare, surface the approval, and run the publishes the user asked for. Never substitute an API key, an access token, a copied auth file, or another login flow, and never ask the user to paste a token into the conversation.
|
|
8
|
-
- A publish chain is a long-running command: write it as a
|
|
8
|
+
- A publish chain is a long-running command: write it as a plan for the `orkestrel-dispatch` skill's `scripts/chain.ts` and launch the chain through that skill's `scripts/launch.ts`; confirm the previous chain is dead by process id before starting another. Publish serially; concurrent publishes collide on the authentication handshake.
|
|
9
9
|
- A wave over unpublished tips derives its order per run from the dependency graph and records only the round each package landed in.
|
|
10
10
|
|
|
11
11
|
## Fix a dependency before it publishes
|
|
@@ -29,8 +29,8 @@ When a consumer needs a dependency's unpublished source, to meet a defect that l
|
|
|
29
29
|
- A runtime `dependencies` bump reaches every consumer: each package downstream re-pins, re-runs its gates, bumps, and republishes in layer order.
|
|
30
30
|
- A development `devDependencies` bump reaches nobody: re-pin, prove the gates green, commit to `main`; do not bump or publish.
|
|
31
31
|
- A development bump that moves the published artifact is a runtime bump. Prove the direction with the build: rebuild after the re-pin and run `node .agents/skills/orkestrel-publish/scripts/compare.ts`, which compares `dist/` against the published tarball on material content only. Exit 3 bumps and publishes that package, and its dependents follow the runtime rule.
|
|
32
|
-
-
|
|
33
|
-
- Read
|
|
32
|
+
- A `0.0.x` caret pins one exact release, so the fleet publishes in topological layer order derived from runtime `dependencies` and `peerDependencies` edges, never from a development edge.
|
|
33
|
+
- Read each package's version and layer from the catalog table in `.claude/agents/orkestrel.md`, regenerated with `scaffold catalog` before sequencing a cascade. Never write a second order elsewhere.
|
|
34
34
|
|
|
35
35
|
## The scaffold surface
|
|
36
36
|
|
|
@@ -23,10 +23,14 @@ overwrite receipts are written only where the work tree ignores `tmp/`.
|
|
|
23
23
|
rewrite a peer range only when its name shares an audited release reading. For example, with
|
|
24
24
|
peer-only `@orkestrel/peer-only: ^0.0.1`, leave that peer unchanged; with a planned tool whose
|
|
25
25
|
registry serves `8.3.4`, apply `vite: ~8.2.0 -> ^8.3.4` even though the tilde excludes `8.3.4`.
|
|
26
|
+
Keep a wave within each declared major. For a workspace whose selected framework activates a
|
|
27
|
+
`TOOLCHAIN_HOLDS` row, keep the tool within that range's major; read the audit question for its reason. Prove
|
|
28
|
+
that framework on the later major before lifting its hold.
|
|
26
29
|
2. Commit the manifest and the lockfile as the preparation commit. `scaffold overwrite` refuses a
|
|
27
30
|
tree carrying uncommitted changes, and the install left both dirty.
|
|
28
|
-
3. Run `scaffold overwrite`. One run repairs the `AGENTS.md` and
|
|
29
|
-
every tracked copy the target still holds at an instruction-canon path
|
|
31
|
+
3. Run `scaffold overwrite`. One run repairs the `AGENTS.md` pointer and the skill pointer set and
|
|
32
|
+
deletes every tracked copy the target still holds at an instruction-canon path, a `CLAUDE.md`
|
|
33
|
+
included; the plan ships no `CLAUDE.md`. Prove the sweep with a
|
|
30
34
|
second `scaffold audit` that exits `0`.
|
|
31
35
|
- Where the target's `.claude/agents/orkestrel.md` carries a body outside the marker-bounded
|
|
32
36
|
table that differs from the floor copy the installed scaffold stages, delete the file and
|
|
@@ -144,11 +148,9 @@ registry copy over any staged tip, so every consumer stays red until that tip is
|
|
|
144
148
|
- When the manifest's `engines.node` names a floor below the `DEFAULT_ENGINES` a generated workspace declares, raise it to that floor.
|
|
145
149
|
- When a package still carries `.github/workflows/ci.yml`, delete it in that visit; the ecosystem runs no hosted CI.
|
|
146
150
|
- Before the release, rule the package's guide and source comments against `.claude/rules/writing.md` § Substitutions and reword each hit its rows name; identifiers stay.
|
|
147
|
-
- Compare release packs between hosts by paths, sizes, and content hashes, and report executable-mode differences separately
|
|
151
|
+
- Compare release packs between hosts by paths, sizes, and content hashes, and report executable-mode differences separately (`.agents/platforms/windows.md` § Release packs and terminals).
|
|
148
152
|
|
|
149
|
-
An unpublished package's first version is `0.0.1`. Do not bump it before that first publish.
|
|
150
|
-
registry has nothing to serve, so there is no version to move away from, and bumping produces a
|
|
151
|
-
package whose history starts at a number nothing explains.
|
|
153
|
+
An unpublished package's first version is `0.0.1`. Do not bump it before that first publish.
|
|
152
154
|
|
|
153
155
|
Prepare a published package's layer in this order, after the visit has ruled the package's bump:
|
|
154
156
|
|
|
@@ -175,9 +177,8 @@ Prepare the next layer only after this one is on the registry. A dependent's new
|
|
|
175
177
|
install until the version it names exists, so preparation and publication interleave and cannot be
|
|
176
178
|
batched ahead.
|
|
177
179
|
|
|
178
|
-
The window is for uploads. Every gate, build, install, and commit happens outside it
|
|
179
|
-
|
|
180
|
-
the flag is what stops the gate chain running a second time inside the five minutes.
|
|
180
|
+
The window is for uploads. Every gate, build, install, and commit happens outside it; publish with
|
|
181
|
+
`--ignore-scripts` so the gate chain does not run a second time on the proved artifact.
|
|
181
182
|
|
|
182
183
|
## Sweep the self-pins
|
|
183
184
|
|
|
@@ -13,16 +13,18 @@ rest of the layer either fits inside it or takes another approval.
|
|
|
13
13
|
|
|
14
14
|
- Read the session with `node .agents/skills/orkestrel-publish/scripts/window.ts --whoami`; `--login` prints the command the operator runs in a real terminal and polls `whoami` until it answers. No child of a script holds the TTY npm needs, so the login itself is the operator's.
|
|
15
15
|
|
|
16
|
-
- Run the login and every browser-authorized publish
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
- Run the login and every browser-authorized publish in a real terminal: npm offers the browser
|
|
17
|
+
approval only when it sees a TTY, and without one it fails `EOTP` with no way to answer. A POSIX
|
|
18
|
+
Orchestrator gives npm one with `script -qfc '<command>' <log>`; on Windows the operator runs the
|
|
19
|
+
command (`.agents/platforms/windows.md` § Release packs and terminals). The one-time-code path
|
|
20
|
+
runs under captured pipes instead, per § Authorize the upload.
|
|
19
21
|
- Pass `--browser=false` to `npm login` and to every `npm publish`. Without it npm prints
|
|
20
22
|
`Press ENTER to open in the browser...` and blocks. Never answer that prompt with a newline: the
|
|
21
23
|
web flow consumes the newline on a later read, drops to a legacy `Username:` prompt, and exits
|
|
22
24
|
**zero** without authenticating. With the flag npm prints the URL and polls, and stdin stays
|
|
23
25
|
untouched.
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
+
- Write nothing to npm's stdin and never close it: EOF drops npm to the same legacy prompt a
|
|
27
|
+
stray newline does.
|
|
26
28
|
- Run `npm login` before any publish. The `npm publish` command does not open the browser flow:
|
|
27
29
|
unauthenticated it returns `E404` on `PUT`, which reads as a missing package rather than as a
|
|
28
30
|
missing credential.
|
|
@@ -33,14 +35,12 @@ rest of the layer either fits inside it or takes another approval.
|
|
|
33
35
|
- Read a login log that shows the spinner and then a legacy `Username:` prompt as a dead attempt
|
|
34
36
|
rather than as a prompt to answer: expired, or refused on its first poll per § Read a `403` on the
|
|
35
37
|
poll. Kill it by the process id recorded at its launch, per the `orkestrel-dispatch` skill's launch
|
|
36
|
-
reference § Kill and relaunch.
|
|
37
|
-
|
|
38
|
-
- On a Windows host, Git Bash ships no `script` binary, so a browser-authorized upload is
|
|
38
|
+
reference § Kill and relaunch.
|
|
39
|
+
- Where the Orchestrator has no TTY to give npm, a browser-authorized upload is
|
|
39
40
|
operator-driven: prepare the layer, prove the gates, surface the exact `npm publish` command, and
|
|
40
41
|
the operator runs it in a real terminal. Everything before and after the upload — bumps, re-pins,
|
|
41
42
|
gates, registry reads — stays with the Orchestrator, and the one-time-code path in § Authorize the
|
|
42
|
-
upload runs through `window.ts` on every host.
|
|
43
|
-
upload on that host.
|
|
43
|
+
upload runs through `window.ts` on every host.
|
|
44
44
|
|
|
45
45
|
## Reach the approval
|
|
46
46
|
|
|
@@ -53,8 +53,7 @@ rest of the layer either fits inside it or takes another approval.
|
|
|
53
53
|
prints `https://www.npmjs.com/auth/cli/<id>`.
|
|
54
54
|
- Never shorten, redirect-strip, or otherwise improve a minted URL. The bare
|
|
55
55
|
`https://www.npmjs.com/login/cli/<id>` target the login URL names is not a page: opened in a
|
|
56
|
-
browser it answers `{"message":"Unauthorized"}`.
|
|
57
|
-
chain is healthy, and the operator diagnoses the wrong failure.
|
|
56
|
+
browser it answers `{"message":"Unauthorized"}`.
|
|
58
57
|
- Expect an unclicked session to die about 45 seconds after it is minted. Measured on 2026-08-27
|
|
59
58
|
against `registry.npmjs.org` with `npm` 10.9.7 and `node` 22.22.2: npm polls `GET /-/v1/done`
|
|
60
59
|
every few seconds and takes `202` while the session waits, and the registry answers `403` at
|
|
@@ -78,8 +77,7 @@ rest of the layer either fits inside it or takes another approval.
|
|
|
78
77
|
- Read the URL out of the journal in the foreground and surface it before arming any watcher. A
|
|
79
78
|
watcher-based relay can fail silently, and its silence is indistinguishable from a chain that
|
|
80
79
|
has not reached the URL yet.
|
|
81
|
-
- Relay the URL as plain text
|
|
82
|
-
nothing to click while the window ran down.
|
|
80
|
+
- Relay the URL as plain text; a decorated link did not render for the operator.
|
|
83
81
|
- Re-read the log before treating an approval as failed. The chain is sometimes still alive on a
|
|
84
82
|
later URL, so surface that one rather than starting the chain again.
|
|
85
83
|
- Read a `404` on an approval URL as a publish that already succeeded and consumed it. Read the
|
|
@@ -92,9 +90,8 @@ rest of the layer either fits inside it or takes another approval.
|
|
|
92
90
|
- Take the account's one-time code where the account has one. The
|
|
93
91
|
`npm publish --ignore-scripts --otp=<code>` command uploads with no browser authorization and no
|
|
94
92
|
poll. The code has its own life: measured on 2026-09-04 against `registry.npmjs.org`, one code
|
|
95
|
-
carried every upload of a layer started within about a minute of its first use,
|
|
96
|
-
|
|
97
|
-
20:26:00; a code read before its layer was ready was refused at its first upload.
|
|
93
|
+
carried every upload of a layer started within about a minute of its first use, and a code read
|
|
94
|
+
before its layer was ready was refused at its first upload.
|
|
98
95
|
- Prepare the whole layer, then ask for one code at the moment the layer's first upload starts, and
|
|
99
96
|
chase the layer's uploads back-to-back inside that code's life with no gate between them. A code
|
|
100
97
|
read minutes earlier is already spent.
|
|
@@ -103,12 +100,11 @@ rest of the layer either fits inside it or takes another approval.
|
|
|
103
100
|
from that package on a fresh code. Never retry the refused upload on the same code.
|
|
104
101
|
- Ask for the code and nothing else. Never ask for a password, an access token, or an auth file.
|
|
105
102
|
`release.md` § Publishing is the user's owns that law.
|
|
106
|
-
- A one-time-code upload needs no terminal arming: `window.ts --publish`
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
the chain cannot see.
|
|
103
|
+
- A one-time-code upload needs no terminal arming: `window.ts --publish` runs it under captured
|
|
104
|
+
pipes, where a spent code is refused `EOTP` with no prompt and no browser flow, which is the stop
|
|
105
|
+
the runner reads. The runner passes `--browser=false` and re-reads `whoami` immediately before the
|
|
106
|
+
first upload. Never run a one-time-code upload on a TTY: there npm answers a refused code with a
|
|
107
|
+
prompt the chain cannot see.
|
|
112
108
|
- Fall back to the browser authorization where the account answers with no code. That path mints
|
|
113
109
|
the `auth/cli/<id>` URL, needs the click inside the session's life, and opens the five-minute
|
|
114
110
|
window.
|
|
@@ -184,5 +180,4 @@ the same status. Rule from the evidence, never from which cause reads likelier.
|
|
|
184
180
|
- Rule on a pack-time manifest-rewriting warning by fetching the registry's copy of the manifest,
|
|
185
181
|
never by the warning's own text.
|
|
186
182
|
- Re-read the registry before telling the user a package failed. A chain still running, a retry
|
|
187
|
-
that landed, and CDN lag all produce a failure reading that the registry contradicts
|
|
188
|
-
false failure report costs a needless approval and a needless republish.
|
|
183
|
+
that landed, and CDN lag all produce a failure reading that the registry contradicts.
|