run402 4.95.0 → 4.96.0
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/README.md +3 -3
- package/cli.mjs +1 -21
- package/core-dist/keystore.js +1 -1
- package/git-remote-run402.mjs +6 -6
- package/lib/cold-start.mjs +2 -2
- package/lib/command-manifest.mjs +3 -41
- package/lib/credentials.mjs +1 -1
- package/lib/daemon-path.mjs +3 -3
- package/lib/deploy-v2.mjs +17 -17
- package/lib/doctor.mjs +45 -54
- package/lib/init.mjs +29 -29
- package/lib/next-actions.mjs +1 -1
- package/lib/org-context.mjs +9 -9
- package/lib/orgs.mjs +19 -19
- package/lib/path-lookup.mjs +7 -10
- package/lib/path-lookup.test.mjs +19 -21
- package/lib/remote-helper-session.mjs +93 -93
- package/lib/repos.mjs +174 -175
- package/lib/rooms-context.mjs +7 -7
- package/lib/up.mjs +14 -14
- package/lib/{gitvault-capabilities.mjs → vault-capabilities.mjs} +10 -14
- package/lib/{gitvault-daemon-run.mjs → vault-daemon-run.mjs} +2 -2
- package/lib/{gitvault-daemon.mjs → vault-daemon.mjs} +23 -23
- package/lib/{gitvault-scaffold.mjs → vault-scaffold.mjs} +12 -12
- package/lib/{gitvault-target.mjs → vault-target.mjs} +22 -17
- package/package.json +2 -2
- package/sdk/core-dist/keystore.js +1 -1
- package/sdk/dist/errors.d.ts +4 -4
- package/sdk/dist/errors.d.ts.map +1 -1
- package/sdk/dist/index.d.ts +9 -9
- package/sdk/dist/index.d.ts.map +1 -1
- package/sdk/dist/index.js +8 -8
- package/sdk/dist/index.js.map +1 -1
- package/sdk/dist/namespaces/deploy.d.ts +5 -5
- package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
- package/sdk/dist/namespaces/deploy.js +20 -20
- package/sdk/dist/namespaces/deploy.js.map +1 -1
- package/sdk/dist/namespaces/deploy.types.d.ts +17 -17
- package/sdk/dist/namespaces/deploy.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/org.d.ts +2 -2
- package/sdk/dist/namespaces/org.js +2 -2
- package/sdk/dist/namespaces/org.types.d.ts +3 -3
- package/sdk/dist/namespaces/pay.js +1 -1
- package/sdk/dist/namespaces/{gitvault.d.ts → repos.d.ts} +436 -449
- package/sdk/dist/namespaces/repos.d.ts.map +1 -0
- package/sdk/dist/namespaces/{gitvault.js → repos.js} +451 -459
- package/sdk/dist/namespaces/repos.js.map +1 -0
- package/sdk/dist/namespaces/rooms.js +2 -2
- package/sdk/dist/namespaces/rooms.js.map +1 -1
- package/sdk/dist/namespaces/session.d.ts +2 -2
- package/sdk/dist/namespaces/session.d.ts.map +1 -1
- package/sdk/dist/namespaces/session.js +2 -2
- package/sdk/dist/namespaces/session.js.map +1 -1
- package/sdk/dist/namespaces/tier.d.ts +3 -3
- package/sdk/dist/namespaces/tier.d.ts.map +1 -1
- package/sdk/dist/namespaces/{gitvault.crypto.d.ts → vault.crypto.d.ts} +141 -141
- package/sdk/dist/namespaces/vault.crypto.d.ts.map +1 -0
- package/sdk/dist/namespaces/{gitvault.crypto.js → vault.crypto.js} +173 -173
- package/sdk/dist/namespaces/vault.crypto.js.map +1 -0
- package/sdk/dist/namespaces/{gitvault.types.d.ts → vault.types.d.ts} +136 -136
- package/sdk/dist/namespaces/vault.types.d.ts.map +1 -0
- package/sdk/dist/namespaces/{gitvault.types.js → vault.types.js} +4 -4
- package/sdk/dist/namespaces/vault.types.js.map +1 -0
- package/sdk/dist/node/bearer-redeem-key.d.ts +1 -1
- package/sdk/dist/node/bearer-redeem-key.js +5 -5
- package/sdk/dist/node/bearer-redeem-key.js.map +1 -1
- package/sdk/dist/node/http-dispatcher.js +5 -5
- package/sdk/dist/node/http-dispatcher.js.map +1 -1
- package/sdk/dist/node/index.d.ts +29 -29
- package/sdk/dist/node/index.d.ts.map +1 -1
- package/sdk/dist/node/index.js +39 -39
- package/sdk/dist/node/index.js.map +1 -1
- package/sdk/dist/node/{gitvault-address.d.ts → vault-address.d.ts} +42 -42
- package/sdk/dist/node/vault-address.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-address.js → vault-address.js} +43 -43
- package/sdk/dist/node/vault-address.js.map +1 -0
- package/sdk/dist/node/{gitvault-apply.d.ts → vault-apply.d.ts} +27 -27
- package/sdk/dist/node/vault-apply.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-apply.js → vault-apply.js} +38 -38
- package/sdk/dist/node/vault-apply.js.map +1 -0
- package/sdk/dist/node/vault-byo-config.d.ts +29 -0
- package/sdk/dist/node/vault-byo-config.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-byo-config.js → vault-byo-config.js} +18 -18
- package/sdk/dist/node/vault-byo-config.js.map +1 -0
- package/sdk/dist/node/vault-byo-probe.d.ts +20 -0
- package/sdk/dist/node/vault-byo-probe.d.ts.map +1 -0
- package/sdk/dist/node/vault-byo-probe.js +57 -0
- package/sdk/dist/node/vault-byo-probe.js.map +1 -0
- package/sdk/dist/node/{gitvault-creation-journal.d.ts → vault-creation-journal.d.ts} +69 -69
- package/sdk/dist/node/vault-creation-journal.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-creation-journal.js → vault-creation-journal.js} +54 -54
- package/sdk/dist/node/vault-creation-journal.js.map +1 -0
- package/sdk/dist/node/{gitvault-degraded-read.d.ts → vault-degraded-read.d.ts} +34 -34
- package/sdk/dist/node/vault-degraded-read.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-degraded-read.js → vault-degraded-read.js} +24 -24
- package/sdk/dist/node/vault-degraded-read.js.map +1 -0
- package/sdk/dist/node/{gitvault-deploy.d.ts → vault-deploy.d.ts} +67 -67
- package/sdk/dist/node/vault-deploy.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-deploy.js → vault-deploy.js} +27 -27
- package/sdk/dist/node/vault-deploy.js.map +1 -0
- package/sdk/dist/node/{gitvault-edge-fetch.d.ts → vault-edge-fetch.d.ts} +9 -9
- package/sdk/dist/node/vault-edge-fetch.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-edge-fetch.js → vault-edge-fetch.js} +11 -11
- package/sdk/dist/node/vault-edge-fetch.js.map +1 -0
- package/sdk/dist/node/{gitvault-handoff.d.ts → vault-handoff.d.ts} +9 -9
- package/sdk/dist/node/vault-handoff.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-handoff.js → vault-handoff.js} +24 -24
- package/sdk/dist/node/vault-handoff.js.map +1 -0
- package/sdk/dist/node/{gitvault-keystore.d.ts → vault-keystore.d.ts} +87 -77
- package/sdk/dist/node/vault-keystore.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-keystore.js → vault-keystore.js} +105 -68
- package/sdk/dist/node/vault-keystore.js.map +1 -0
- package/sdk/dist/node/{gitvault-member-bundle.d.ts → vault-member-bundle.d.ts} +17 -17
- package/sdk/dist/node/vault-member-bundle.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-member-bundle.js → vault-member-bundle.js} +11 -11
- package/sdk/dist/node/vault-member-bundle.js.map +1 -0
- package/sdk/dist/node/{gitvault-mirror-backend.d.ts → vault-mirror-backend.d.ts} +26 -26
- package/sdk/dist/node/vault-mirror-backend.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-mirror-backend.js → vault-mirror-backend.js} +25 -25
- package/sdk/dist/node/vault-mirror-backend.js.map +1 -0
- package/sdk/dist/node/{gitvault-mirror-config.d.ts → vault-mirror-config.d.ts} +23 -23
- package/sdk/dist/node/vault-mirror-config.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-mirror-config.js → vault-mirror-config.js} +16 -16
- package/sdk/dist/node/vault-mirror-config.js.map +1 -0
- package/sdk/dist/node/{gitvault-mirror.d.ts → vault-mirror.d.ts} +36 -36
- package/sdk/dist/node/vault-mirror.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-mirror.js → vault-mirror.js} +75 -75
- package/sdk/dist/node/vault-mirror.js.map +1 -0
- package/sdk/dist/node/{gitvault-native-crypto.d.ts → vault-native-crypto.d.ts} +10 -10
- package/sdk/dist/node/vault-native-crypto.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-native-crypto.js → vault-native-crypto.js} +16 -16
- package/sdk/dist/node/vault-native-crypto.js.map +1 -0
- package/sdk/dist/node/{gitvault-open-or-create.d.ts → vault-open-or-create.d.ts} +16 -16
- package/sdk/dist/node/vault-open-or-create.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-open-or-create.js → vault-open-or-create.js} +10 -10
- package/sdk/dist/node/vault-open-or-create.js.map +1 -0
- package/sdk/dist/node/{gitvault-prewarm.d.ts → vault-prewarm.d.ts} +13 -13
- package/sdk/dist/node/vault-prewarm.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-prewarm.js → vault-prewarm.js} +25 -25
- package/sdk/dist/node/vault-prewarm.js.map +1 -0
- package/sdk/dist/node/{gitvault-profile-scan.d.ts → vault-profile-scan.d.ts} +3 -3
- package/sdk/dist/node/vault-profile-scan.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-profile-scan.js → vault-profile-scan.js} +12 -12
- package/sdk/dist/node/vault-profile-scan.js.map +1 -0
- package/sdk/dist/node/{gitvault-prune.d.ts → vault-prune.d.ts} +61 -61
- package/sdk/dist/node/vault-prune.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-prune.js → vault-prune.js} +34 -34
- package/sdk/dist/node/vault-prune.js.map +1 -0
- package/sdk/dist/node/{gitvault-publication.d.ts → vault-publication.d.ts} +399 -399
- package/sdk/dist/node/vault-publication.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-publication.js → vault-publication.js} +584 -584
- package/sdk/dist/node/vault-publication.js.map +1 -0
- package/sdk/dist/node/{gitvault-push-to-create.d.ts → vault-push-to-create.d.ts} +16 -16
- package/sdk/dist/node/vault-push-to-create.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-push-to-create.js → vault-push-to-create.js} +9 -9
- package/sdk/dist/node/vault-push-to-create.js.map +1 -0
- package/sdk/dist/node/{gitvault-recover.d.ts → vault-recover.d.ts} +50 -50
- package/sdk/dist/node/vault-recover.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-recover.js → vault-recover.js} +84 -84
- package/sdk/dist/node/vault-recover.js.map +1 -0
- package/sdk/dist/node/{gitvault-restore.d.ts → vault-restore.d.ts} +8 -8
- package/sdk/dist/node/vault-restore.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-restore.js → vault-restore.js} +11 -11
- package/sdk/dist/node/vault-restore.js.map +1 -0
- package/sdk/dist/node/{gitvault-snapshot.d.ts → vault-snapshot.d.ts} +48 -48
- package/sdk/dist/node/vault-snapshot.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-snapshot.js → vault-snapshot.js} +61 -61
- package/sdk/dist/node/vault-snapshot.js.map +1 -0
- package/sdk/dist/node/{gitvault-writer-state.d.ts → vault-writer-state.d.ts} +8 -8
- package/sdk/dist/node/vault-writer-state.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-writer-state.js → vault-writer-state.js} +15 -15
- package/sdk/dist/node/vault-writer-state.js.map +1 -0
- package/sdk/dist/node/workflow-output.js +4 -4
- package/sdk/dist/node/workflow-output.js.map +1 -1
- package/vault-surface.json +40 -0
- package/gitvault-surface.json +0 -89
- package/lib/gitvault.mjs +0 -163
- package/lib/source-access.mjs +0 -70
- package/sdk/dist/namespaces/gitvault.crypto.d.ts.map +0 -1
- package/sdk/dist/namespaces/gitvault.crypto.js.map +0 -1
- package/sdk/dist/namespaces/gitvault.d.ts.map +0 -1
- package/sdk/dist/namespaces/gitvault.js.map +0 -1
- package/sdk/dist/namespaces/gitvault.types.d.ts.map +0 -1
- package/sdk/dist/namespaces/gitvault.types.js.map +0 -1
- package/sdk/dist/node/gitvault-address.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-address.js.map +0 -1
- package/sdk/dist/node/gitvault-apply.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-apply.js.map +0 -1
- package/sdk/dist/node/gitvault-byo-config.d.ts +0 -29
- package/sdk/dist/node/gitvault-byo-config.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-byo-config.js.map +0 -1
- package/sdk/dist/node/gitvault-byo-probe.d.ts +0 -20
- package/sdk/dist/node/gitvault-byo-probe.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-byo-probe.js +0 -57
- package/sdk/dist/node/gitvault-byo-probe.js.map +0 -1
- package/sdk/dist/node/gitvault-creation-journal.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-creation-journal.js.map +0 -1
- package/sdk/dist/node/gitvault-degraded-read.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-degraded-read.js.map +0 -1
- package/sdk/dist/node/gitvault-deploy.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-deploy.js.map +0 -1
- package/sdk/dist/node/gitvault-edge-fetch.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-edge-fetch.js.map +0 -1
- package/sdk/dist/node/gitvault-handoff.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-handoff.js.map +0 -1
- package/sdk/dist/node/gitvault-keystore.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-keystore.js.map +0 -1
- package/sdk/dist/node/gitvault-member-bundle.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-member-bundle.js.map +0 -1
- package/sdk/dist/node/gitvault-mirror-backend.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-mirror-backend.js.map +0 -1
- package/sdk/dist/node/gitvault-mirror-config.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-mirror-config.js.map +0 -1
- package/sdk/dist/node/gitvault-mirror.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-mirror.js.map +0 -1
- package/sdk/dist/node/gitvault-native-crypto.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-native-crypto.js.map +0 -1
- package/sdk/dist/node/gitvault-open-or-create.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-open-or-create.js.map +0 -1
- package/sdk/dist/node/gitvault-prewarm.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-prewarm.js.map +0 -1
- package/sdk/dist/node/gitvault-profile-scan.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-profile-scan.js.map +0 -1
- package/sdk/dist/node/gitvault-prune.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-prune.js.map +0 -1
- package/sdk/dist/node/gitvault-publication.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-publication.js.map +0 -1
- package/sdk/dist/node/gitvault-push-to-create.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-push-to-create.js.map +0 -1
- package/sdk/dist/node/gitvault-recover.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-recover.js.map +0 -1
- package/sdk/dist/node/gitvault-restore.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-restore.js.map +0 -1
- package/sdk/dist/node/gitvault-snapshot.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-snapshot.js.map +0 -1
- package/sdk/dist/node/gitvault-writer-state.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-writer-state.js.map +0 -1
package/README.md
CHANGED
|
@@ -61,7 +61,7 @@ Every mode (and `run402 deploy`) verifies the files the manifest references befo
|
|
|
61
61
|
|
|
62
62
|
### repos — host-blind encrypted git repos (zero deploy ceremony)
|
|
63
63
|
|
|
64
|
-
One noun,
|
|
64
|
+
One noun, seventeen verbs: KyGit is the brand, a vault is the resource, a repo is what you have.
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
67
|
run402 init # once per machine
|
|
@@ -76,7 +76,7 @@ run402 repos list --org org_1a2b3c
|
|
|
76
76
|
run402 repos delete --project prj_xyz --force # refuses without --force while the vault holds generations
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
A hosted git remote, encrypted before it leaves the machine — no deploy, no manifest, no app. `origin` is claimed additively — an existing `origin` is never touched, the run402 remote falls back to `run402` instead. A directory inside another repository is never scaffolded into that repository: the skip carries a `create_nested_repo` next action, `--nested` makes it its own nested repository (one line appended to the enclosing repository's local `.git/info/exclude`, nothing else touched), and `create` prints a `git push` next action only for a remote it actually added. Every mutating `repos` verb (`create`, `rename`, `delete`, `
|
|
79
|
+
A hosted git remote, encrypted before it leaves the machine — no deploy, no manifest, no app. `origin` is claimed additively — an existing `origin` is never touched, the run402 remote falls back to `run402` instead. A directory inside another repository is never scaffolded into that repository: the skip carries a `create_nested_repo` next action, `--nested` makes it its own nested repository (one line appended to the enclosing repository's local `.git/info/exclude`, nothing else touched), and `create` prints a `git push` next action only for a remote it actually added. Every mutating `repos` verb (`create`, `rename`, `delete`, `capture`, `policy`, `mirror`, `gc`, `handoff`, `resume`, `invite`, `join`) is CLI/OpenClaw-only by design — no MCP tool exists or will exist for them (one-shot recovery receipts, immutable generations, irreversible delete, single-use bearer keys). Three READ-ONLY tools do exist — `repos_view`, `repos_list_heads`, `repos_fsck` — teaching only `repos` spellings. See `run402 repos --help` for the full tiered surface (common: `create`/`view`/`list`; occasional: `capture`/`mirror`/`recover`/`handoff`/`resume`/`invite`/`join`; lifecycle: `rename`/`delete`; maintenance: `fsck`/`gc`/`access`/`policy`), and the CLI reference's `repos` section for the terminal-loss statement and the progressive backup warning.
|
|
80
80
|
|
|
81
81
|
**Handoff / resume.** `run402 repos handoff [--note-file <path>]` captures the actual working tree (staged/unstaged/untracked, like `git stash push -u`) into the vault and mints a single-use bearer key (`kgh1_…`, printed to stdout exactly once); `run402 repos resume <kgh1_…>` claims it on another machine, clones fresh, and reapplies the exact dirty state with `git stash apply --index`. No shared keystore, no shared wallet — the key is the whole handoff. On a wallet with no active tier, `resume` first folds the same cold-start chain `create` does (wallet → faucet → one x402 prototype payment); `--no-init` opts out, and the claim itself never waits on it. Sensitive untracked files (`.env`, `*.pem`, SSH/AWS/GPG dirs, …) are excluded from capture by default (`--include-sensitive <glob>` re-admits one). See the reference `run402.com/llms-cli.txt` for the full note-schema and flag reference.
|
|
82
82
|
|
|
@@ -323,7 +323,7 @@ run402 doctor # { ok, blocking[], warnings[], checks[] }
|
|
|
323
323
|
run402 doctor --refresh # live npm check for a newer run402
|
|
324
324
|
```
|
|
325
325
|
|
|
326
|
-
`ok` is structural: `true` exactly when `blocking[]` is empty. Every check carries `severity: "blocking" | "advisory" | "info"`; advisory findings (an unbound contact passkey, a degraded recovery posture on another org, a stale CLI,
|
|
326
|
+
`ok` is structural: `true` exactly when `blocking[]` is empty. Every check carries `severity: "blocking" | "advisory" | "info"`; advisory findings (an unbound contact passkey, a degraded recovery posture on another org, a stale CLI, vault gaps) land in `warnings[]` without changing `ok` or the exit code. The `tier` check's `status` is a fixed vocabulary (`ok | inactive | frozen | past_due | dormant | purged | missing | unknown | error`, never a tier name; see `value.tier` / `value.lifecycle`), and a wallet whose own org holds no tier but can reach another org's projects reports `missing` as advisory (`TIER_MISSING_ON_OWN_ORG`).
|
|
327
327
|
|
|
328
328
|
## State
|
|
329
329
|
|
package/cli.mjs
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { readFileSync } from "node:fs";
|
|
8
8
|
import * as nodeModule from "node:module";
|
|
9
9
|
|
|
10
|
-
//
|
|
10
|
+
// vault-startup-amortization (D2): on-disk V8 compile cache for the
|
|
11
11
|
// lazily-imported subcommand graphs. Feature-guarded (Node 22.8+) and
|
|
12
12
|
// try/caught — absence or an unwritable cache dir degrade silently.
|
|
13
13
|
try {
|
|
@@ -95,8 +95,6 @@ PLATFORM — everything else, and the things still finding a home
|
|
|
95
95
|
jobs Submit and inspect platform-managed jobs
|
|
96
96
|
transfer Project transfer to a wallet, an email, or an owned org (init, preview, list, accept, cancel)
|
|
97
97
|
archives Portable project archives (create, status, download --target cloud; inspect, verify; import --target core)
|
|
98
|
-
gitvault RETIRED — moved to repos (repo-surface-consolidation); every spelling answers COMMAND_MOVED/COMMAND_REMOVED
|
|
99
|
-
source-access RETIRED — moved into repos (recovery-bundle + access); every spelling answers COMMAND_MOVED
|
|
100
98
|
buzz Buzz human/community/agent control-plane workflows
|
|
101
99
|
apps Browse and manage the app marketplace
|
|
102
100
|
ai AI translation and moderation tools
|
|
@@ -232,14 +230,6 @@ switch (cmd) {
|
|
|
232
230
|
await run(sub, rest);
|
|
233
231
|
break;
|
|
234
232
|
}
|
|
235
|
-
// `repo` singular resolves identically to `repos` (design D1 — agents type
|
|
236
|
-
// what `gh repo` already taught them). Its own case block, not a
|
|
237
|
-
// fall-through, so cli-conventions-gate's per-line family scanner sees it.
|
|
238
|
-
case "repo": {
|
|
239
|
-
const { run } = await import("./lib/repos.mjs");
|
|
240
|
-
await run(sub, rest);
|
|
241
|
-
break;
|
|
242
|
-
}
|
|
243
233
|
case "snapshots": {
|
|
244
234
|
const { run } = await import("./lib/snapshots.mjs");
|
|
245
235
|
await run(sub, rest);
|
|
@@ -325,11 +315,6 @@ switch (cmd) {
|
|
|
325
315
|
await run(sub, rest);
|
|
326
316
|
break;
|
|
327
317
|
}
|
|
328
|
-
case "gitvault": {
|
|
329
|
-
const { run } = await import("./lib/gitvault.mjs");
|
|
330
|
-
await run(sub, rest);
|
|
331
|
-
break;
|
|
332
|
-
}
|
|
333
318
|
case "escalations": {
|
|
334
319
|
const { run } = await import("./lib/escalations.mjs");
|
|
335
320
|
await run(sub, rest);
|
|
@@ -448,11 +433,6 @@ switch (cmd) {
|
|
|
448
433
|
await run([sub, ...rest].filter(Boolean));
|
|
449
434
|
break;
|
|
450
435
|
}
|
|
451
|
-
case "source-access": {
|
|
452
|
-
const { run } = await import("./lib/source-access.mjs");
|
|
453
|
-
await run(sub, rest);
|
|
454
|
-
break;
|
|
455
|
-
}
|
|
456
436
|
case "auth": {
|
|
457
437
|
const { run } = await import("./lib/auth.mjs");
|
|
458
438
|
await run(sub, rest);
|
package/core-dist/keystore.js
CHANGED
|
@@ -190,7 +190,7 @@ export function removeProject(projectId, path) {
|
|
|
190
190
|
* bucket, not "unknown") and PERMANENTLY shadows every later wallet-scoped
|
|
191
191
|
* activation for every caller that reads through this module: `resolveProjectId`
|
|
192
192
|
* / `resolveProject` (cli/lib/config.mjs), `projects current`, and every
|
|
193
|
-
*
|
|
193
|
+
* vault-verb target resolution. The failure it causes: `repos create`
|
|
194
194
|
* calls `projects.provision`, whose `creds.setActiveProject` correctly
|
|
195
195
|
* persists the new project under the real wallet's scoped bucket AND the
|
|
196
196
|
* flat fallback, yet every CLI read of "the active project" resolves the
|
package/git-remote-run402.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* `git-remote-run402` — the THIN CLIENT (
|
|
3
|
+
* `git-remote-run402` — the THIN CLIENT (vault-persistent-helper).
|
|
4
4
|
*
|
|
5
5
|
* git spawns a fresh helper process per remote operation, so everything warm
|
|
6
6
|
* dies per command — Node boot, the SDK graph, the signer, the paid stack,
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* when that is impossible does it load the full session module and run
|
|
11
11
|
* in-process — which is byte-identical to the pre-daemon behavior.
|
|
12
12
|
*
|
|
13
|
-
* INVARIANTS (spec:
|
|
13
|
+
* INVARIANTS (spec: vault-client-surface, "A resident helper engine…"):
|
|
14
14
|
* - The daemon is never load-bearing: any failure to use it — absent,
|
|
15
15
|
* busy, stale, mismatched, dying mid-handshake — falls back silently to
|
|
16
16
|
* the in-process path. The handshake completes BEFORE this client
|
|
@@ -35,7 +35,7 @@ import net from "node:net";
|
|
|
35
35
|
import { spawn } from "node:child_process";
|
|
36
36
|
import { daemonSocketPath, daemonRunnerPath, DAEMON_PROTOCOL_VERSION, cliVersion, forwardableEnv } from "./lib/daemon-path.mjs";
|
|
37
37
|
|
|
38
|
-
//
|
|
38
|
+
// vault-startup-amortization (D2): on-disk V8 compile cache for every
|
|
39
39
|
// module loaded from here on. Feature-guarded (Node 22.8+) and try/caught
|
|
40
40
|
// (a read-only install dir degrades silently).
|
|
41
41
|
try {
|
|
@@ -201,11 +201,11 @@ if (invokedDirectly) {
|
|
|
201
201
|
process.exitCode = code;
|
|
202
202
|
} else {
|
|
203
203
|
// Fallback: today's in-process path, byte-identical. Fire the prewarm
|
|
204
|
-
// BEFORE the heavy graph evaluates (
|
|
204
|
+
// BEFORE the heavy graph evaluates (vault-startup-amortization D1),
|
|
205
205
|
// and leave a daemon behind for next time.
|
|
206
206
|
if (daemonEnabled) spawnDaemon();
|
|
207
|
-
const {
|
|
208
|
-
|
|
207
|
+
const { prewarmVaultConnection } = await import("./sdk/dist/node/vault-prewarm.js");
|
|
208
|
+
prewarmVaultConnection();
|
|
209
209
|
const { runHelperSession } = await import("./lib/remote-helper-session.mjs");
|
|
210
210
|
process.exitCode = await runHelperSession(argv);
|
|
211
211
|
}
|
package/lib/cold-start.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `cold-start.mjs` — the minimal x402/Base-Sepolia cold-start chain
|
|
3
3
|
* (kygit-handoff design D5): wallet → faucet → one x402 prototype
|
|
4
|
-
* payment. `repos create`
|
|
5
|
-
* refused `NO_ACTIVE_TIER`, so `
|
|
4
|
+
* payment. `repos create` folds this in when it is
|
|
5
|
+
* refused `NO_ACTIVE_TIER`, so `run402 repos create` on a genuinely fresh machine
|
|
6
6
|
* ends with a vault, no human signup, no cloud dashboard.
|
|
7
7
|
*
|
|
8
8
|
* This is the SAME shape `run402 init` already walks (create the wallet →
|
package/lib/command-manifest.mjs
CHANGED
|
@@ -281,12 +281,6 @@ export const COMMAND_MANIFEST = [
|
|
|
281
281
|
{ path: ["claims", "list"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub" },
|
|
282
282
|
{ path: ["claims", "release"], positionals: [p("claim_id")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["clm_1"], runStyle: "sub" },
|
|
283
283
|
|
|
284
|
-
// ── gitvault — no manifest entries ──────────────────────
|
|
285
|
-
// `cli/lib/gitvault.mjs`'s dispatcher handles every `gitvault <verb>` and
|
|
286
|
-
// answers a structural COMMAND_MOVED (or, for `push`/`reconcile`,
|
|
287
|
-
// COMMAND_REMOVED) redirect that dispatches nothing — see
|
|
288
|
-
// RESERVED_SUBCOMMANDS below, and "gitvault" in SKIPPED_FAMILIES.
|
|
289
|
-
|
|
290
284
|
// ── repos (the consolidated 15-verb family) ─
|
|
291
285
|
// Every verb needs a real principal keystore and, for most, an allocated
|
|
292
286
|
// repo and a local git working tree, so the gate runs structural checks
|
|
@@ -299,7 +293,7 @@ export const COMMAND_MANIFEST = [
|
|
|
299
293
|
// name, with `--repo`/`--project` addressing.
|
|
300
294
|
{ path: ["repos", "rename"], positionals: [p("new_name")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["my-notes"], runStyle: "sub", skipBehavioral: "claims a per-org-unique repo name against a live project" },
|
|
301
295
|
{ path: ["repos", "delete"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [], runStyle: "sub", skipBehavioral: "irreversibly deletes a project after reading its live non-repo-resource state and vault generation count" },
|
|
302
|
-
{ path: ["repos", "
|
|
296
|
+
{ path: ["repos", "capture"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub", skipBehavioral: "captures the cwd git working tree and publishes a signed head" },
|
|
303
297
|
// kygit-handoff: `handoff` captures a stash-shaped checkpoint and mints a
|
|
304
298
|
// single-use bearer key through a live gateway call; `resume` claims one
|
|
305
299
|
// (a real membership mutation) and writes into a fresh working tree.
|
|
@@ -320,7 +314,7 @@ export const COMMAND_MANIFEST = [
|
|
|
320
314
|
{ path: ["repos", "access", "repair"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--recipient-state-version", "0", "--recipient-revocation-version", "0"], runStyle: "sub", skipBehavioral: "owner+step-up-gated epoch rotation (D193-D203, rev 42) — samples a fresh epoch key and re-seals a live vault's recipients" },
|
|
321
315
|
{ path: ["repos", "access", "revoke-key"], positionals: [p("principal_id")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["prin_00000000000000000000000000000000"], runStyle: "sub", skipBehavioral: "owner+step-up-gated: declares a recipient's key revoked (org-scoped watermark) and drives a real epoch rotation off it" },
|
|
322
316
|
{ path: ["repos", "access", "declare-exposure"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub", skipBehavioral: "owner+step-up-gated: declares this vault's epoch secret exposed, forcing every subsequent ordinary push to refuse until a rotation lands" },
|
|
323
|
-
{ path: ["repos", "access", "sync"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub", skipBehavioral: "
|
|
317
|
+
{ path: ["repos", "access", "sync"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub", skipBehavioral: "vault-multi-writer (rev 47): on-demand writer-admission reconcile — resolves pending candidates' signing keys via the live org encryption-key directory and publishes a real add_writer_key head per candidate" },
|
|
324
318
|
{ path: ["repos", "recover"], positionals: [p("source")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["s3://example-mirror-bucket", "--out", "__SCRATCH_DIR__/recover-out"], runStyle: "sub", skipBehavioral: "materializes a git repository from a mirror source, offline, with no server call" },
|
|
325
319
|
// Principal-scoped (one bundle covers every vault you can read), so no
|
|
326
320
|
// --project — deliberately unlike its eleven vault-scoped siblings.
|
|
@@ -477,7 +471,7 @@ export const COMMAND_MANIFEST = [
|
|
|
477
471
|
{ path: ["service", "health"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
478
472
|
{ path: ["cache", "inspect"], positionals: [p("url")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["https://example.com/"] },
|
|
479
473
|
{ path: ["cache", "invalidate"], positionals: [p("url", { required: false })], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["--all", "--host", "example.com"] },
|
|
480
|
-
// projectScoped: --project targets the
|
|
474
|
+
// projectScoped: --project targets the vault
|
|
481
475
|
// check only (see doctor.mjs's own HELP) — every other check stays
|
|
482
476
|
// wallet/machine-wide, but the gate's contract is "accepts --project
|
|
483
477
|
// without rejecting it," which this satisfies.
|
|
@@ -501,20 +495,6 @@ export const SKIPPED_FAMILIES = {
|
|
|
501
495
|
// Split into `deliveries` / `contacts` / `subscriptions`; every subcommand
|
|
502
496
|
// answers COMMAND_REMOVED naming its successor.
|
|
503
497
|
"notifications": "reserved group; split by legible-cli-surface",
|
|
504
|
-
// The gitvault dispatcher answers COMMAND_MOVED/COMMAND_REMOVED for every
|
|
505
|
-
// `gitvault <verb>` (see RESERVED_SUBCOMMANDS below for the per-verb list)
|
|
506
|
-
// — the family stays dispatched in cli.mjs (so the redirect fires instead
|
|
507
|
-
// of UNKNOWN_COMMAND) but has zero manifest entries, since a redirect
|
|
508
|
-
// dispatches nothing.
|
|
509
|
-
"gitvault": "retired; every subcommand answers COMMAND_MOVED/COMMAND_REMOVED naming its `repos`/git successor",
|
|
510
|
-
// Shipped in exactly one release (v4.54.0, live for hours) before the
|
|
511
|
-
// one-noun review caught it: a gateway route namespace is not a CLI noun.
|
|
512
|
-
// Both verbs answer COMMAND_MOVED into the repos family for one release,
|
|
513
|
-
// then the spelling is reserved and answers nothing.
|
|
514
|
-
"source-access": "retired same-day; `export` -> `repos recovery-bundle`, `status` -> `repos access` (member_custody block)",
|
|
515
|
-
// `repo` singular resolves identically to `repos` — same
|
|
516
|
-
// module, same case block in cli.mjs, so it needs no manifest of its own.
|
|
517
|
-
"repo": "alias for `repos`, resolves identically (design D1)",
|
|
518
498
|
};
|
|
519
499
|
|
|
520
500
|
/**
|
|
@@ -530,23 +510,5 @@ export const SKIPPED_FAMILIES = {
|
|
|
530
510
|
* which the family list cannot express.
|
|
531
511
|
*/
|
|
532
512
|
export const RESERVED_SUBCOMMANDS = {
|
|
533
|
-
"source-access:export": "moved to `repos recovery-bundle` — the artifact `repos recover --bundle` consumes belongs to the repos family",
|
|
534
|
-
"source-access:status": "moved to `repos access` — your own wrapper custody rides its member_custody block; the org advisory is `doctor --only recovery_posture`",
|
|
535
513
|
"escalations:contacts": "merged into `contacts` — the ladder and Telegram channels are one question",
|
|
536
|
-
// Every `gitvault <verb>` spelling. Nine
|
|
537
|
-
// answer COMMAND_MOVED naming their `repos` successor; `push` and
|
|
538
|
-
// `reconcile` answer COMMAND_REMOVED (no equivalent successor for either —
|
|
539
|
-
// `push`'s one-release alias window is over, `reconcile` was a workaround
|
|
540
|
-
// with no permanent replacement, only a read at `repos access`).
|
|
541
|
-
"gitvault:init": "moved to `repos create --project <project_id>`",
|
|
542
|
-
"gitvault:status": "moved to `repos view`",
|
|
543
|
-
"gitvault:snapshot": "moved to `repos snapshot`",
|
|
544
|
-
"gitvault:policy": "moved to `repos policy`",
|
|
545
|
-
"gitvault:compact": "moved to `repos gc`",
|
|
546
|
-
"gitvault:prune": "moved to `repos gc`",
|
|
547
|
-
"gitvault:verify": "moved to `repos fsck`",
|
|
548
|
-
"gitvault:mirror": "moved to `repos mirror`",
|
|
549
|
-
"gitvault:recover": "moved to `repos recover`",
|
|
550
|
-
"gitvault:push": "removed — its one-release deprecation-alias window is over; `git push` / `repos snapshot`",
|
|
551
|
-
"gitvault:reconcile": "removed — a workaround with no permanent successor; read `repos access` instead",
|
|
552
514
|
};
|
package/lib/credentials.mjs
CHANGED
|
@@ -454,7 +454,7 @@ async function issue(args) {
|
|
|
454
454
|
try {
|
|
455
455
|
const res = await getSdk().credentials.issue(projectId, { kind, name, expiresAt: expiresAt || undefined });
|
|
456
456
|
if (importToCache && res?.secret) {
|
|
457
|
-
// The cold-restart re-key path (
|
|
457
|
+
// The cold-restart re-key path (vault-deploy-lane 6.5a): the minted
|
|
458
458
|
// secret goes straight into the local cache the deploy and data-plane
|
|
459
459
|
// commands read, so a fresh machine re-keys in one command per kind
|
|
460
460
|
// instead of the four-command issue-then-project-keys-import dance.
|
package/lib/daemon-path.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Daemon identity + transport addressing (
|
|
2
|
+
* Daemon identity + transport addressing (vault-persistent-helper D4/D5)
|
|
3
3
|
* — the ONE module the thin client's fast path may import beside node
|
|
4
4
|
* builtins (pinned by the import-graph gate test), so it must stay tiny.
|
|
5
5
|
*
|
|
6
6
|
* The socket lives INSIDE the client configuration directory — the same
|
|
7
7
|
* 0700 trust boundary that already holds the wallet private key and the
|
|
8
|
-
*
|
|
8
|
+
* vault keystore — and its path is keyed by CLI version, so a CLI
|
|
9
9
|
* upgrade resolves a NEW path: the new client never reaches the old daemon,
|
|
10
10
|
* which idles out on its own. Windows uses a named pipe whose name carries
|
|
11
11
|
* a hash of the config dir (pipes have no filesystem home) plus the same
|
|
@@ -79,7 +79,7 @@ export function daemonSocketPath() {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
export function daemonRunnerPath() {
|
|
82
|
-
return join(dirname(fileURLToPath(import.meta.url)), "
|
|
82
|
+
return join(dirname(fileURLToPath(import.meta.url)), "vault-daemon-run.mjs");
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
/**
|
package/lib/deploy-v2.mjs
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
import { existsSync, fstatSync, readFileSync } from "node:fs";
|
|
29
29
|
import { resolve, dirname, extname, isAbsolute } from "node:path";
|
|
30
30
|
import {
|
|
31
|
-
|
|
31
|
+
applyWithVault,
|
|
32
32
|
assertLocalFileReferencesExist,
|
|
33
33
|
buildDeployResolveSummary,
|
|
34
34
|
githubActionsCredentials,
|
|
@@ -139,7 +139,7 @@ Options:
|
|
|
139
139
|
--final-only Alias for --quiet; final success/error envelope is still preserved
|
|
140
140
|
--allow-warning <code> Continue past this reviewed warning code (repeatable)
|
|
141
141
|
--allow-warnings Continue past plan warnings that require confirmation
|
|
142
|
-
--allow-dirty
|
|
142
|
+
--allow-dirty vault-required projects only: capture a dirty
|
|
143
143
|
work tree as-is instead of refusing
|
|
144
144
|
SNAPSHOT_DIRTY_TREE. The result discloses exactly
|
|
145
145
|
what was swept in, printed to stderr too — even
|
|
@@ -1328,14 +1328,14 @@ async function deployCmd(args) {
|
|
|
1328
1328
|
const requiredPlan = opts.mode && opts.mode.kind === "applyReviewed"
|
|
1329
1329
|
? { planId: opts.mode.planId, ...(opts.mode.planFingerprint ? { planFingerprint: opts.mode.planFingerprint } : {}) }
|
|
1330
1330
|
: undefined;
|
|
1331
|
-
// A thin shim over the SDK lane (add-
|
|
1332
|
-
// takes the project's `
|
|
1331
|
+
// A thin shim over the SDK lane (add-vault 5.0). `applyWithVault`
|
|
1332
|
+
// takes the project's `vault_policy` into account: a project that is
|
|
1333
1333
|
// not `required` runs the same `apply()` this line always ran, with the
|
|
1334
1334
|
// same options object; a `required` one captures, publishes, mints an
|
|
1335
1335
|
// activation token, and commits with it.
|
|
1336
1336
|
const sdk = getSdk(sdkOpts);
|
|
1337
1337
|
const outcome = await withAutoApprove(() =>
|
|
1338
|
-
|
|
1338
|
+
applyWithVault({
|
|
1339
1339
|
sdk,
|
|
1340
1340
|
spec: releaseSpec,
|
|
1341
1341
|
apply: {
|
|
@@ -1348,7 +1348,7 @@ async function deployCmd(args) {
|
|
|
1348
1348
|
},
|
|
1349
1349
|
target: isCoreApiTarget() ? "core" : "cloud",
|
|
1350
1350
|
...(opts.allowDirty ? { allowDirty: true } : {}),
|
|
1351
|
-
// The `
|
|
1351
|
+
// The `vault_commit` line is printed ALWAYS, and to stderr, so
|
|
1352
1352
|
// `run402 deploy | jq` stays clean (the pipe contract).
|
|
1353
1353
|
onCommitLine: (line) => { if (!opts.quiet) process.stderr.write(`${line}\n`); },
|
|
1354
1354
|
}),
|
|
@@ -1357,29 +1357,29 @@ async function deployCmd(args) {
|
|
|
1357
1357
|
// pass it as an optimization (the gateway defaults to the live release
|
|
1358
1358
|
// without it). Best-effort: a keystore hiccup never fails the deploy.
|
|
1359
1359
|
rememberLastDeployment(releaseSpec.project_id, outcome.deploy?.urls?.deployment_id);
|
|
1360
|
-
if (!outcome.
|
|
1360
|
+
if (!outcome.vault) {
|
|
1361
1361
|
console.log(JSON.stringify({ ...outcome.deploy, stats: sdkStats(sdk) }, null, 2));
|
|
1362
1362
|
printVerboseStats(opts.verbose, sdk);
|
|
1363
1363
|
return;
|
|
1364
1364
|
}
|
|
1365
|
-
const vaulted = outcome.
|
|
1365
|
+
const vaulted = outcome.vault;
|
|
1366
1366
|
// Both `DEPLOYED_*` outcomes activated a release; the override one just
|
|
1367
1367
|
// did it without a vaulted capture and carries a draining advisory.
|
|
1368
1368
|
const activated = vaulted.outcome === "DEPLOYED_AND_VAULTED" || vaulted.outcome === "DEPLOYED_UNVAULTED_OVERRIDE";
|
|
1369
1369
|
console.log(JSON.stringify({
|
|
1370
1370
|
ok: activated,
|
|
1371
1371
|
outcome: vaulted.outcome,
|
|
1372
|
-
|
|
1372
|
+
vault_commit: vaulted.vault_commit,
|
|
1373
1373
|
capture_id: vaulted.capture_id,
|
|
1374
1374
|
operation_id: vaulted.operation_id,
|
|
1375
1375
|
...("generation" in vaulted ? { generation: vaulted.generation } : {}),
|
|
1376
1376
|
...("push_error" in vaulted ? { push_error: vaulted.push_error } : {}),
|
|
1377
1377
|
...("deploy_error" in vaulted ? { deploy_error: vaulted.deploy_error } : {}),
|
|
1378
|
-
// Design D5/D6 (
|
|
1378
|
+
// Design D5/D6 (vault-human-envelopes task 4.1 + vault-mirror):
|
|
1379
1379
|
// present only when this deploy landed a new generation — the SDK
|
|
1380
1380
|
// omits both fields entirely on the other three outcomes rather than
|
|
1381
1381
|
// faking a `skipped_*` value for something that never had a chance to
|
|
1382
|
-
// run. See `
|
|
1382
|
+
// run. See `Repos.deploy`'s doc comment (sdk/src/namespaces/repos.ts).
|
|
1383
1383
|
...("mirror_push" in vaulted ? { mirror_push: vaulted.mirror_push } : {}),
|
|
1384
1384
|
...("reconcile_recipients" in vaulted ? { reconcile_recipients: vaulted.reconcile_recipients } : {}),
|
|
1385
1385
|
next_actions: vaulted.next_actions,
|
|
@@ -1388,11 +1388,11 @@ async function deployCmd(args) {
|
|
|
1388
1388
|
}, null, 2));
|
|
1389
1389
|
// Design D6: the mirror result is reported BESIDE the vault outcome
|
|
1390
1390
|
// above, on its own stderr line — a mirror failure never blocks the
|
|
1391
|
-
// deploy (mirrors `run402
|
|
1391
|
+
// deploy (mirrors `run402 repos capture`'s reporting).
|
|
1392
1392
|
if (vaulted.mirror_push?.outcome === "pushed") {
|
|
1393
1393
|
console.error(`mirror: pushed generation ${vaulted.generation} (${vaulted.mirror_push.summary?.objects_copied ?? 0} object(s) copied)`);
|
|
1394
1394
|
} else if (vaulted.mirror_push?.outcome === "failed") {
|
|
1395
|
-
console.error(`mirror:
|
|
1395
|
+
console.error(`mirror: mirroring this capture FAILED (deploy is unaffected) — ${vaulted.mirror_push.error ?? "see mirror_push.summary.errors"}`);
|
|
1396
1396
|
}
|
|
1397
1397
|
// Dirty-tree disclosure (Tal's decision, "help people not make
|
|
1398
1398
|
// mistakes"): even an explicit --allow-dirty override never captures
|
|
@@ -1502,12 +1502,12 @@ const CI_DEPLOY_ERROR_GUIDANCE = {
|
|
|
1502
1502
|
};
|
|
1503
1503
|
|
|
1504
1504
|
/**
|
|
1505
|
-
* The gateway's envelope for
|
|
1505
|
+
* The gateway's envelope for vault deploy errors — `upgrade_client` first,
|
|
1506
1506
|
* then `grandfather_policy` — is relayed untouched: `deployCmd` deploys
|
|
1507
|
-
* through `
|
|
1507
|
+
* through `applyWithVault`, which declares `{capture_id,
|
|
1508
1508
|
* snapshot_oid_hmac}` at plan time and presents an activation token at
|
|
1509
|
-
* commit, satisfying `
|
|
1510
|
-
* of the envelope is needed. `cli-deploy-
|
|
1509
|
+
* commit, satisfying `vault_policy: required`, so no client-side rewrite
|
|
1510
|
+
* of the envelope is needed. `cli-deploy-vault-lane.test.mjs` is the gate
|
|
1511
1511
|
* for this behavior.
|
|
1512
1512
|
*/
|
|
1513
1513
|
function reportDeployApplyError(err, useGithubActionsOidc) {
|