@orkestrel/scaffold 0.0.107 → 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 +368 -27
- 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 +26 -20
- package/dist/host/agents/orchestration.md +98 -58
- package/dist/host/agents/platforms/posix.md +15 -0
- package/dist/host/agents/platforms/windows.md +37 -0
- 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 +12 -14
- package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +36 -24
- package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +14 -11
- 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 +428 -27
- 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 +91 -30
- package/dist/host/agents/skills/orkestrel-parallel/agents/openai.yaml +2 -2
- package/dist/host/agents/skills/orkestrel-parallel/references/claude.md +34 -0
- package/dist/host/agents/skills/orkestrel-parallel/references/codex.md +29 -0
- package/dist/host/agents/skills/orkestrel-parallel/references/cursor.md +29 -0
- package/dist/host/agents/skills/orkestrel-parallel/references/t3.md +31 -0
- 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 +12 -10
- 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 +3 -8
- package/dist/host/agents/transports/cursor.md +2 -3
- package/dist/host/claude/AGENTS.md +7 -10
- 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 +55 -0
- package/dist/host/claude/rules/documentation.md +26 -11
- 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 +2 -3
- 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 +8 -10
- package/dist/host/claude/rules/workspace.md +21 -19
- package/dist/host/claude/rules/writing.md +3 -3
- 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-parallel/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/codex/config.toml +3 -3
- package/dist/host/configs/helpers.ts +21 -1
- package/dist/host/configs/policy.ts +405 -16
- package/dist/host/cursor/rules/orchestration.mdc +1 -0
- package/dist/host/dotfiles/oxlintrc.json +141 -5
- 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 +152 -19
- package/dist/host/guides/study.md +534 -440
- package/dist/host/guides/test.md +111 -44
- package/dist/host/manifest.json +199 -242
- package/dist/host/tests/config.test.ts +1558 -219
- package/dist/host/tests/policy.test.ts +127 -1
- package/dist/host/tests/setupPolicy.ts +1389 -39
- package/dist/src/core/index.cjs +239 -87
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +123 -39
- package/dist/src/core/index.d.ts +123 -39
- package/dist/src/core/index.js +234 -86
- 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/agents/skills/orkestrel-parallel/references/harnesses.md +0 -19
- package/dist/host/guides/supervisor.md +0 -4890
|
@@ -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
|
|
@@ -141,13 +145,12 @@ registry copy over any staged tip, so every consumer stays red until that tip is
|
|
|
141
145
|
|
|
142
146
|
## Prepare a layer
|
|
143
147
|
|
|
144
|
-
- When the manifest's `engines.node` names a floor below the `DEFAULT_ENGINES` a generated workspace declares, raise it to that floor
|
|
148
|
+
- When the manifest's `engines.node` names a floor below the `DEFAULT_ENGINES` a generated workspace declares, raise it to that floor.
|
|
149
|
+
- When a package still carries `.github/workflows/ci.yml`, delete it in that visit; the ecosystem runs no hosted CI.
|
|
145
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.
|
|
146
|
-
- 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).
|
|
147
152
|
|
|
148
|
-
An unpublished package's first version is `0.0.1`. Do not bump it before that first publish.
|
|
149
|
-
registry has nothing to serve, so there is no version to move away from, and bumping produces a
|
|
150
|
-
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.
|
|
151
154
|
|
|
152
155
|
Prepare a published package's layer in this order, after the visit has ruled the package's bump:
|
|
153
156
|
|
|
@@ -174,9 +177,8 @@ Prepare the next layer only after this one is on the registry. A dependent's new
|
|
|
174
177
|
install until the version it names exists, so preparation and publication interleave and cannot be
|
|
175
178
|
batched ahead.
|
|
176
179
|
|
|
177
|
-
The window is for uploads. Every gate, build, install, and commit happens outside it
|
|
178
|
-
|
|
179
|
-
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.
|
|
180
182
|
|
|
181
183
|
## Sweep the self-pins
|
|
182
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.
|