run402 4.94.0 → 4.95.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 +20 -20
- package/cli.mjs +7 -19
- package/gitvault-surface.json +2 -2
- package/lib/admin.mjs +5 -5
- package/lib/ai.mjs +5 -5
- package/lib/apps.mjs +9 -9
- package/lib/archives.mjs +371 -8
- package/lib/argparse.mjs +5 -5
- package/lib/assets.mjs +12 -12
- package/lib/auth.mjs +34 -34
- package/lib/branches.mjs +7 -7
- package/lib/buzz-doctor.mjs +1 -1
- package/lib/buzz-notifications.mjs +4 -4
- package/lib/buzz.mjs +2 -2
- package/lib/cache.mjs +1 -1
- package/lib/cdn.mjs +2 -2
- package/lib/ci.mjs +8 -8
- package/lib/claims.mjs +2 -2
- package/lib/command-manifest.mjs +35 -36
- package/lib/config.mjs +4 -4
- package/lib/contacts.mjs +3 -3
- package/lib/contracts.mjs +11 -11
- package/lib/credentials.mjs +31 -31
- package/lib/delegates.mjs +13 -13
- package/lib/deliveries.mjs +2 -2
- package/lib/deploy-v2.mjs +9 -9
- package/lib/dev.mjs +3 -3
- package/lib/doctor.mjs +6 -6
- package/lib/domains.mjs +27 -27
- package/lib/email.mjs +38 -38
- package/lib/errors.mjs +40 -24
- package/lib/escalations.mjs +4 -4
- package/lib/events.mjs +32 -25
- package/lib/feedback.mjs +2 -2
- package/lib/functions.mjs +34 -34
- package/lib/gitvault-scaffold.mjs +2 -2
- package/lib/gitvault.mjs +2 -2
- package/lib/grants.mjs +7 -7
- package/lib/image.mjs +7 -7
- package/lib/init.mjs +3 -3
- package/lib/jobs.mjs +15 -15
- package/lib/live.mjs +1 -1
- package/lib/logs.mjs +8 -8
- package/lib/messages.mjs +5 -5
- package/lib/next-actions.mjs +1 -1
- package/lib/org-context.mjs +13 -13
- package/lib/{org.mjs → orgs.mjs} +124 -163
- package/lib/projects.mjs +45 -56
- package/lib/repos.mjs +23 -23
- package/lib/rooms.mjs +2 -2
- package/lib/sdk-errors.mjs +1 -1
- package/lib/secrets.mjs +13 -13
- package/lib/sites.mjs +14 -14
- package/lib/snapshots.mjs +10 -10
- package/lib/subdomains.mjs +12 -12
- package/lib/subscriptions.mjs +2 -2
- package/lib/transfer.mjs +1 -1
- package/lib/up.mjs +7 -7
- package/lib/wallet-context.mjs +1 -1
- package/lib/wallets.mjs +1 -1
- package/lib/webhooks.mjs +8 -8
- package/lib/whoami.mjs +32 -5
- package/package.json +1 -1
- package/sdk/dist/actions.d.ts +3 -3
- package/sdk/dist/actions.d.ts.map +1 -1
- package/sdk/dist/app-up.d.ts +2 -2
- package/sdk/dist/app-up.d.ts.map +1 -1
- package/sdk/dist/config.d.ts +1 -2
- package/sdk/dist/config.d.ts.map +1 -1
- package/sdk/dist/config.js.map +1 -1
- package/sdk/dist/credentials.d.ts +1 -1
- package/sdk/dist/errors.d.ts +2 -2
- package/sdk/dist/errors.d.ts.map +1 -1
- package/sdk/dist/errors.js +1 -1
- package/sdk/dist/errors.js.map +1 -1
- package/sdk/dist/index.js +1 -1
- package/sdk/dist/index.js.map +1 -1
- package/sdk/dist/namespaces/admin.d.ts +1 -1
- package/sdk/dist/namespaces/admin.d.ts.map +1 -1
- package/sdk/dist/namespaces/ai.d.ts +1 -1
- package/sdk/dist/namespaces/ai.js +2 -2
- package/sdk/dist/namespaces/ai.js.map +1 -1
- package/sdk/dist/namespaces/assets.js +1 -1
- package/sdk/dist/namespaces/assets.js.map +1 -1
- package/sdk/dist/namespaces/ci.js +3 -3
- package/sdk/dist/namespaces/ci.js.map +1 -1
- package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
- package/sdk/dist/namespaces/deploy.js +26 -27
- package/sdk/dist/namespaces/deploy.js.map +1 -1
- package/sdk/dist/namespaces/deploy.types.d.ts +2 -2
- package/sdk/dist/namespaces/deploy.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/domains.d.ts +10 -2
- package/sdk/dist/namespaces/domains.d.ts.map +1 -1
- package/sdk/dist/namespaces/domains.js +10 -5
- package/sdk/dist/namespaces/domains.js.map +1 -1
- package/sdk/dist/namespaces/errors.js +1 -1
- package/sdk/dist/namespaces/functions.js +1 -1
- package/sdk/dist/namespaces/functions.js.map +1 -1
- package/sdk/dist/namespaces/gitvault.d.ts +2 -2
- package/sdk/dist/namespaces/gitvault.js +4 -4
- package/sdk/dist/namespaces/gitvault.js.map +1 -1
- package/sdk/dist/namespaces/tier.d.ts +1 -1
- package/sdk/dist/namespaces/transfers.d.ts +46 -15
- package/sdk/dist/namespaces/transfers.d.ts.map +1 -1
- package/sdk/dist/namespaces/transfers.js.map +1 -1
- package/sdk/dist/node/actions-node.js +8 -8
- package/sdk/dist/node/actions-node.js.map +1 -1
- package/sdk/dist/node/assets-node.js +6 -6
- package/sdk/dist/node/assets-node.js.map +1 -1
- package/sdk/dist/node/ci.js +1 -1
- package/sdk/dist/node/ci.js.map +1 -1
- package/sdk/dist/node/credentials.d.ts +1 -1
- package/sdk/dist/node/credentials.js +1 -1
- package/sdk/dist/node/deploy-manifest.d.ts +3 -5
- package/sdk/dist/node/deploy-manifest.d.ts.map +1 -1
- package/sdk/dist/node/deploy-manifest.js +3 -12
- package/sdk/dist/node/deploy-manifest.js.map +1 -1
- package/sdk/dist/node/gitvault-apply.js +1 -1
- package/sdk/dist/node/gitvault-apply.js.map +1 -1
- package/sdk/dist/node/manifest-export.js +2 -2
- package/sdk/dist/node/manifest-export.js.map +1 -1
- package/sdk/dist/node/org-adopt.js +1 -1
- package/sdk/dist/node/org-adopt.js.map +1 -1
- package/sdk/dist/node/sites-node.js +1 -1
- package/sdk/dist/node/sites-node.js.map +1 -1
- package/sdk/dist/scoped.d.ts +8 -8
- package/sdk/dist/scoped.d.ts.map +1 -1
- package/sdk/dist/scoped.js +3 -3
- package/sdk/dist/scoped.js.map +1 -1
- package/lib/cloud.mjs +0 -256
- package/lib/core.mjs +0 -123
package/lib/auth.mjs
CHANGED
|
@@ -9,43 +9,43 @@ Usage:
|
|
|
9
9
|
run402 auth <subcommand> [args...]
|
|
10
10
|
|
|
11
11
|
Subcommands:
|
|
12
|
-
magic-link --email <addr> [--delivery link|code|both] [--redirect <url>] [--project <
|
|
12
|
+
magic-link --email <addr> [--delivery link|code|both] [--redirect <url>] [--project <project_id>]
|
|
13
13
|
Request passwordless email authentication. Link remains the default.
|
|
14
14
|
|
|
15
|
-
verify (--token <token> | --challenge-id <
|
|
15
|
+
verify (--token <token> | --challenge-id <challenge_id> --code <6 digits>) [--project <project_id>]
|
|
16
16
|
Exchange one email credential for access_token + refresh_token.
|
|
17
17
|
|
|
18
|
-
create-user --email <addr> [--admin <true|false>] [--invite] [--redirect <url>] [--project <
|
|
18
|
+
create-user --email <addr> [--admin <true|false>] [--invite] [--redirect <url>] [--project <project_id>]
|
|
19
19
|
Create or update a project auth user with the service key.
|
|
20
20
|
|
|
21
|
-
invite-user --email <addr> --redirect <url> [--admin <true|false>] [--project <
|
|
21
|
+
invite-user --email <addr> --redirect <url> [--admin <true|false>] [--project <project_id>]
|
|
22
22
|
Create/update a user and send a trusted invite magic link.
|
|
23
23
|
|
|
24
|
-
set-password --token <bearer> --new <password> [--current <password>] [--project <
|
|
24
|
+
set-password --token <bearer> --new <password> [--current <password>] [--project <project_id>]
|
|
25
25
|
Change, reset, or set a user's password. Requires the user's access_token.
|
|
26
26
|
|
|
27
|
-
settings [--allow-password-set <true|false>] [--preferred <method|null>] [--public-signup <policy>] [--require-admin-passkey <true|false>] [--allowed-email-domains <csv|none>] [--project <
|
|
27
|
+
settings [--allow-password-set <true|false>] [--preferred <method|null>] [--public-signup <policy>] [--require-admin-passkey <true|false>] [--allowed-email-domains <csv|none>] [--project <project_id>]
|
|
28
28
|
Update project auth settings (requires service_key).
|
|
29
29
|
|
|
30
|
-
passkey-register-options --token <bearer> --app-origin <origin> [--project <
|
|
30
|
+
passkey-register-options --token <bearer> --app-origin <origin> [--project <project_id>]
|
|
31
31
|
Create WebAuthn registration options for the authenticated user.
|
|
32
32
|
|
|
33
|
-
passkey-register-verify --token <bearer> --challenge <
|
|
33
|
+
passkey-register-verify --token <bearer> --challenge <challenge_id> --response <json> [--label <text>] [--project <project_id>]
|
|
34
34
|
Verify and store a passkey registration response.
|
|
35
35
|
|
|
36
|
-
passkey-login-options --app-origin <origin> [--email <addr>] [--project <
|
|
36
|
+
passkey-login-options --app-origin <origin> [--email <addr>] [--project <project_id>]
|
|
37
37
|
Create WebAuthn login options.
|
|
38
38
|
|
|
39
|
-
passkey-login-verify --challenge <
|
|
39
|
+
passkey-login-verify --challenge <challenge_id> --response <json> [--project <project_id>]
|
|
40
40
|
Verify a passkey login response and return session tokens.
|
|
41
41
|
|
|
42
|
-
passkeys --token <bearer> [--project <
|
|
42
|
+
passkeys --token <bearer> [--project <project_id>]
|
|
43
43
|
List the authenticated user's passkeys.
|
|
44
44
|
|
|
45
|
-
delete-passkey --token <bearer> --id <passkey_id> [--project <
|
|
45
|
+
delete-passkey --token <bearer> --id <passkey_id> [--project <project_id>]
|
|
46
46
|
Delete one authenticated-user passkey.
|
|
47
47
|
|
|
48
|
-
providers [--project <
|
|
48
|
+
providers [--project <project_id>]
|
|
49
49
|
List available auth providers for the project.
|
|
50
50
|
|
|
51
51
|
scaffold-roles [--table <name>] [--user-col <col>] [--role-col <col>] [--roles <csv>] [--cache-ttl <secs>]
|
|
@@ -73,7 +73,7 @@ Options:
|
|
|
73
73
|
--redirect <url> Required for link/both; optional for code
|
|
74
74
|
--intent <intent> signin (default), invite, claim, or recovery
|
|
75
75
|
--state <value> Optional client_state preserved through verification
|
|
76
|
-
--project <
|
|
76
|
+
--project <project_id> Project ID (defaults to active project)
|
|
77
77
|
|
|
78
78
|
Notes:
|
|
79
79
|
Acceptance does not prove delivery or disclose whether an account exists.
|
|
@@ -95,7 +95,7 @@ Options:
|
|
|
95
95
|
--invite Send a trusted invite magic link
|
|
96
96
|
--redirect <url> Required when --invite is used
|
|
97
97
|
--state <value> Optional client_state for the invite
|
|
98
|
-
--project <
|
|
98
|
+
--project <project_id> Project ID (defaults to active project)
|
|
99
99
|
|
|
100
100
|
Examples:
|
|
101
101
|
run402 auth create-user --email user@example.com
|
|
@@ -112,19 +112,19 @@ Options:
|
|
|
112
112
|
--redirect <url> Required: allowed auth redirect URL
|
|
113
113
|
--admin <bool> Optional: set project_admin status before inviting
|
|
114
114
|
--state <value> Optional client_state for the invite
|
|
115
|
-
--project <
|
|
115
|
+
--project <project_id> Project ID (defaults to active project)
|
|
116
116
|
`,
|
|
117
117
|
verify: `run402 auth verify — Exchange an email credential for session tokens
|
|
118
118
|
|
|
119
119
|
Usage:
|
|
120
120
|
run402 auth verify --token <token> [options]
|
|
121
|
-
run402 auth verify --challenge-id <
|
|
121
|
+
run402 auth verify --challenge-id <challenge_id> --code <6 digits> [options]
|
|
122
122
|
|
|
123
123
|
Options:
|
|
124
124
|
--token <token> Required: the one-time magic-link token
|
|
125
|
-
--challenge-id <
|
|
125
|
+
--challenge-id <challenge_id> Required with --code: opaque handle from magic-link request
|
|
126
126
|
--code <digits> Required with --challenge-id: six-digit email code
|
|
127
|
-
--project <
|
|
127
|
+
--project <project_id> Project ID (defaults to active project)
|
|
128
128
|
|
|
129
129
|
Notes:
|
|
130
130
|
Returns an access_token + refresh_token pair on success.
|
|
@@ -142,7 +142,7 @@ Options:
|
|
|
142
142
|
--token <bearer> Required: the user's access_token (Bearer token)
|
|
143
143
|
--new <password> Required: new password
|
|
144
144
|
--current <pwd> Current password (required when one is already set)
|
|
145
|
-
--project <
|
|
145
|
+
--project <project_id> Project ID (defaults to active project)
|
|
146
146
|
|
|
147
147
|
Examples:
|
|
148
148
|
run402 auth set-password --token eyJ... --new "new-pass" \\
|
|
@@ -159,7 +159,7 @@ Options:
|
|
|
159
159
|
--public-signup <policy> open, known_email, or invite_only
|
|
160
160
|
--require-admin-passkey <true|false> Require passkey auth for project_admin sessions
|
|
161
161
|
--allowed-email-domains <csv|none> Restrict hosted Google sign-in to these domains; 'none' clears (unrestricted)
|
|
162
|
-
--project <
|
|
162
|
+
--project <project_id> Project ID (defaults to active project)
|
|
163
163
|
|
|
164
164
|
Notes:
|
|
165
165
|
Requires the project's service_key (admin-level).
|
|
@@ -180,19 +180,19 @@ Usage:
|
|
|
180
180
|
Options:
|
|
181
181
|
--token <bearer> Required: authenticated user's access_token
|
|
182
182
|
--app-origin <origin> Required: exact app origin for WebAuthn
|
|
183
|
-
--project <
|
|
183
|
+
--project <project_id> Project ID (defaults to active project)
|
|
184
184
|
`,
|
|
185
185
|
"passkey-register-verify": `run402 auth passkey-register-verify — Verify passkey registration
|
|
186
186
|
|
|
187
187
|
Usage:
|
|
188
|
-
run402 auth passkey-register-verify --token <bearer> --challenge <
|
|
188
|
+
run402 auth passkey-register-verify --token <bearer> --challenge <challenge_id> --response <json> [options]
|
|
189
189
|
|
|
190
190
|
Options:
|
|
191
191
|
--token <bearer> Required: authenticated user's access_token
|
|
192
|
-
--challenge <
|
|
192
|
+
--challenge <challenge_id> Required: challenge_id returned by passkey-register-options
|
|
193
193
|
--response <json> Required: browser PublicKeyCredential JSON
|
|
194
194
|
--label <text> Optional passkey label
|
|
195
|
-
--project <
|
|
195
|
+
--project <project_id> Project ID (defaults to active project)
|
|
196
196
|
`,
|
|
197
197
|
"passkey-login-options": `run402 auth passkey-login-options — Create passkey login options
|
|
198
198
|
|
|
@@ -202,17 +202,17 @@ Usage:
|
|
|
202
202
|
Options:
|
|
203
203
|
--app-origin <origin> Required: exact app origin for WebAuthn
|
|
204
204
|
--email <addr> Optional email hint
|
|
205
|
-
--project <
|
|
205
|
+
--project <project_id> Project ID (defaults to active project)
|
|
206
206
|
`,
|
|
207
207
|
"passkey-login-verify": `run402 auth passkey-login-verify — Verify passkey login
|
|
208
208
|
|
|
209
209
|
Usage:
|
|
210
|
-
run402 auth passkey-login-verify --challenge <
|
|
210
|
+
run402 auth passkey-login-verify --challenge <challenge_id> --response <json> [options]
|
|
211
211
|
|
|
212
212
|
Options:
|
|
213
|
-
--challenge <
|
|
213
|
+
--challenge <challenge_id> Required: challenge_id returned by passkey-login-options
|
|
214
214
|
--response <json> Required: browser PublicKeyCredential JSON
|
|
215
|
-
--project <
|
|
215
|
+
--project <project_id> Project ID (defaults to active project)
|
|
216
216
|
`,
|
|
217
217
|
passkeys: `run402 auth passkeys — List passkeys
|
|
218
218
|
|
|
@@ -221,7 +221,7 @@ Usage:
|
|
|
221
221
|
|
|
222
222
|
Options:
|
|
223
223
|
--token <bearer> Required: authenticated user's access_token
|
|
224
|
-
--project <
|
|
224
|
+
--project <project_id> Project ID (defaults to active project)
|
|
225
225
|
`,
|
|
226
226
|
"delete-passkey": `run402 auth delete-passkey — Delete a passkey
|
|
227
227
|
|
|
@@ -231,7 +231,7 @@ Usage:
|
|
|
231
231
|
Options:
|
|
232
232
|
--token <bearer> Required: authenticated user's access_token
|
|
233
233
|
--id <passkey_id> Required: passkey ID to delete
|
|
234
|
-
--project <
|
|
234
|
+
--project <project_id> Project ID (defaults to active project)
|
|
235
235
|
`,
|
|
236
236
|
providers: `run402 auth providers — List available auth providers
|
|
237
237
|
|
|
@@ -239,7 +239,7 @@ Usage:
|
|
|
239
239
|
run402 auth providers [options]
|
|
240
240
|
|
|
241
241
|
Options:
|
|
242
|
-
--project <
|
|
242
|
+
--project <project_id> Project ID (defaults to active project)
|
|
243
243
|
|
|
244
244
|
Examples:
|
|
245
245
|
run402 auth providers
|
|
@@ -609,7 +609,7 @@ async function passkeyRegisterVerify(args) {
|
|
|
609
609
|
const label = parseFlag(args, "--label");
|
|
610
610
|
const projectId = resolveProjectId(parseFlag(args, "--project"));
|
|
611
611
|
if (!accessToken) fail({ code: "BAD_USAGE", message: "Missing --token <bearer_token>" });
|
|
612
|
-
if (!challengeId) fail({ code: "BAD_USAGE", message: "Missing --challenge <
|
|
612
|
+
if (!challengeId) fail({ code: "BAD_USAGE", message: "Missing --challenge <challenge_id>" });
|
|
613
613
|
const response = parseJsonFlag(args, "--response");
|
|
614
614
|
try {
|
|
615
615
|
const data = await getSdk().auth.verifyPasskeyRegistration(projectId, {
|
|
@@ -643,7 +643,7 @@ async function passkeyLoginOptions(args) {
|
|
|
643
643
|
async function passkeyLoginVerify(args) {
|
|
644
644
|
const challengeId = parseFlag(args, "--challenge");
|
|
645
645
|
const projectId = resolveProjectId(parseFlag(args, "--project"));
|
|
646
|
-
if (!challengeId) fail({ code: "BAD_USAGE", message: "Missing --challenge <
|
|
646
|
+
if (!challengeId) fail({ code: "BAD_USAGE", message: "Missing --challenge <challenge_id>" });
|
|
647
647
|
const response = parseJsonFlag(args, "--response");
|
|
648
648
|
try {
|
|
649
649
|
const data = await getSdk().auth.verifyPasskeyLogin(projectId, {
|
package/lib/branches.mjs
CHANGED
|
@@ -15,10 +15,10 @@ import {
|
|
|
15
15
|
const HELP = `run402 branches — Contained project data branches
|
|
16
16
|
|
|
17
17
|
Usage:
|
|
18
|
-
run402 branches create [--project <
|
|
19
|
-
run402 branches list [--project <
|
|
20
|
-
run402 branches renew <
|
|
21
|
-
run402 branches delete <
|
|
18
|
+
run402 branches create [--project <project_id>] [--from-snapshot <snapshot_id>] [--name <label>] [--email-mode sandbox|off] [--enable-cron] [--ttl-days <n>] [--json]
|
|
19
|
+
run402 branches list [--project <project_id>] [--json]
|
|
20
|
+
run402 branches renew <branch_project_id> [--project <project_id>] [--ttl-days <n>] [--json]
|
|
21
|
+
run402 branches delete <branch_project_id> [--project <project_id>] [--json]
|
|
22
22
|
|
|
23
23
|
Legacy (still supported): a leading prj_... parent-project positional,
|
|
24
24
|
e.g. run402 branches renew prj_parent prj_branch. --project defaults to the
|
|
@@ -77,7 +77,7 @@ async function list(args) {
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
async function renew(args) {
|
|
80
|
-
const { projectId, branchProjectId } = resolveProjectAndBranch(args, "run402 branches renew [
|
|
80
|
+
const { projectId, branchProjectId } = resolveProjectAndBranch(args, "run402 branches renew [project_id] <branch_project_id>");
|
|
81
81
|
const ttlDaysFlag = flagValue(args, "--ttl-days");
|
|
82
82
|
const ttlDays = ttlDaysFlag === null ? undefined : parseIntegerFlag("--ttl-days", ttlDaysFlag, { min: 1, max: 30 });
|
|
83
83
|
try {
|
|
@@ -91,7 +91,7 @@ async function renew(args) {
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
async function deleteBranch(args) {
|
|
94
|
-
const { projectId, branchProjectId } = resolveProjectAndBranch(args, "run402 branches delete [
|
|
94
|
+
const { projectId, branchProjectId } = resolveProjectAndBranch(args, "run402 branches delete [project_id] <branch_project_id>");
|
|
95
95
|
try {
|
|
96
96
|
await getSdk().branches.delete(projectId, branchProjectId);
|
|
97
97
|
console.log(JSON.stringify({ ok: true, project_id: projectId, branch_project_id: branchProjectId, deleted: true }, null, 2));
|
|
@@ -101,7 +101,7 @@ async function deleteBranch(args) {
|
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
function resolveProjectAndBranch(args, usage) {
|
|
104
|
-
// Canonical: `<
|
|
104
|
+
// Canonical: `<branch_project_id> [--project <parent_project_id>]`. Branch ids are
|
|
105
105
|
// themselves prj_..., so a leading prj_ positional is only treated as the
|
|
106
106
|
// PARENT project when a second positional follows (requireRestPositional) —
|
|
107
107
|
// the legacy `renew prj_parent prj_branch` form.
|
package/lib/buzz-doctor.mjs
CHANGED
|
@@ -230,7 +230,7 @@ async function checkRun402Cli({ cwd, env, argv, run402Executable, updateCheck })
|
|
|
230
230
|
install_confidence: install.confidence,
|
|
231
231
|
package_manager: install.package_manager,
|
|
232
232
|
compatibility_source: "version_and_capability_probe",
|
|
233
|
-
required_capabilities: ["doctor --buzz", "doctor --buzz-agent", "wallets current", "
|
|
233
|
+
required_capabilities: ["doctor --buzz", "doctor --buzz-agent", "wallets current", "whoami", "identity link nostr"],
|
|
234
234
|
};
|
|
235
235
|
if (update?.status === "warning") {
|
|
236
236
|
const rawAction = update?.value?.next_actions?.[0];
|
|
@@ -22,11 +22,11 @@ import {
|
|
|
22
22
|
const HELP = `run402 buzz notifications — route project events into a Buzz community channel
|
|
23
23
|
|
|
24
24
|
Usage:
|
|
25
|
-
run402 buzz notifications configure --org <uuid> --installation <buzzci_id> --name <route_name> --channel <uuid> (--project <
|
|
25
|
+
run402 buzz notifications configure --org <uuid> --installation <buzzci_id> --name <route_name> --channel <uuid> (--project <project_id> [--project <project_id> ...] | --all-projects) [--event-type <t> ...] [--event-class <c> ...] [--include-org-events] [--on-call <hex-pubkey> [--on-call-name <display>]]
|
|
26
26
|
--all-projects route every project the organization owns, present and future (project_scope org);
|
|
27
27
|
without it the route names its projects explicitly (--project, 1..50)
|
|
28
28
|
--include-org-events also deliver the org's own facts (the platform_payment_received receipt after a Lightning top-up) into the channel
|
|
29
|
-
run402 buzz notifications scope <buzzper_id> --org | --listed [--project <
|
|
29
|
+
run402 buzz notifications scope <buzzper_id> --org | --listed [--project <project_id> ...]
|
|
30
30
|
switch the route to the whole organization, or back to an explicit list (the stored list is kept;
|
|
31
31
|
--listed on a route with no stored list needs --project)
|
|
32
32
|
--on-call <hex> the Buzz agent (64-hex pubkey) a crash or platform incident pages with a p mention — the tag that wakes a managed Buzz agent
|
|
@@ -228,7 +228,7 @@ async function projects(args) {
|
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
/**
|
|
231
|
-
* `run402 buzz notifications scope <buzzper_id> --org | --listed [--project <
|
|
231
|
+
* `run402 buzz notifications scope <buzzper_id> --org | --listed [--project <project_id> ...]`
|
|
232
232
|
* — switch the route between the whole organization and an explicit list.
|
|
233
233
|
* The stored list survives the switch to `org`; `--listed` on a route with
|
|
234
234
|
* nothing stored needs `--project`.
|
|
@@ -238,7 +238,7 @@ async function scope(args) {
|
|
|
238
238
|
const valueFlags = ["--project"];
|
|
239
239
|
assertKnownFlags(a, [...valueFlags, "--org", "--listed", "--help", "-h"], valueFlags);
|
|
240
240
|
const positionals = requirePositionalCount(positionalArgs(a, valueFlags), valueFlags, {
|
|
241
|
-
min: 1, max: 1, command: "run402 buzz notifications scope <buzzper_id> --org | --listed [--project <
|
|
241
|
+
min: 1, max: 1, command: "run402 buzz notifications scope <buzzper_id> --org | --listed [--project <project_id> ...]", missing: "<buzzper_id>",
|
|
242
242
|
});
|
|
243
243
|
const [routeId] = positionals;
|
|
244
244
|
const org = a.includes("--org");
|
package/lib/buzz.mjs
CHANGED
|
@@ -23,7 +23,7 @@ The four independent states are:
|
|
|
23
23
|
Canonical workflows:
|
|
24
24
|
run402 buzz status
|
|
25
25
|
run402 buzz adopt offer --org <org_id> --identity-link <idlnk_id> [--deployment-context-file <json>]
|
|
26
|
-
--org the Run402 organization id as "run402
|
|
26
|
+
--org the Run402 organization id as "run402 whoami" returns it (a UUID)
|
|
27
27
|
--deployment-context-file JSON with exactly these five non-empty strings, and no others:
|
|
28
28
|
project_id, release_id, live_url, source_revision, verified_at
|
|
29
29
|
run402 buzz install --org <org_id> --community <buzz:community:host> [--authority <hex-pubkey>]
|
|
@@ -46,7 +46,7 @@ Explicit consent/decision commands:
|
|
|
46
46
|
run402 buzz revoke <buzzae_id>
|
|
47
47
|
|
|
48
48
|
Project-event routing into a Buzz channel (configure → authorize → test → live):
|
|
49
|
-
run402 buzz notifications configure --org <uuid> --installation <buzzci_id> --name <route_name> --channel <uuid> --project <
|
|
49
|
+
run402 buzz notifications configure --org <uuid> --installation <buzzci_id> --name <route_name> --channel <uuid> --project <project_id> [--event-type <t> ...] [--event-class <c> ...] [--include-org-events]
|
|
50
50
|
run402 buzz notifications status [--org <uuid> | <buzzper_id>]
|
|
51
51
|
run402 buzz notifications test <buzzper_id> [--wait]
|
|
52
52
|
run402 buzz notifications deliveries <buzzper_id> [--limit <n>] [--cursor <c>] [--delivery <buzzped_id>]
|
package/lib/cache.mjs
CHANGED
|
@@ -59,7 +59,7 @@ Subcommands:
|
|
|
59
59
|
Common flags:
|
|
60
60
|
--locale <code> (inspect only) Inspect a specific locale's row
|
|
61
61
|
(default: project's default locale)
|
|
62
|
-
--release-id <
|
|
62
|
+
--release-id <release_id> (inspect only) Inspect a specific release id
|
|
63
63
|
(default: project's active release)
|
|
64
64
|
|
|
65
65
|
Output:
|
package/lib/cdn.mjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* run402 cdn — CloudFront CDN diagnostics for public blob URLs.
|
|
3
3
|
*
|
|
4
4
|
* Usage:
|
|
5
|
-
* run402 cdn wait-fresh <url> --sha <sha256> [--timeout <seconds>] [--project <
|
|
5
|
+
* run402 cdn wait-fresh <url> --sha <sha256> [--timeout <seconds>] [--project <project_id>]
|
|
6
6
|
*
|
|
7
7
|
* Wraps the SDK's `client.project(id).assets.waitFresh(...)`. Polls the gateway diagnose
|
|
8
8
|
* endpoint until the URL serves the expected SHA, then exits 0. On timeout,
|
|
@@ -45,7 +45,7 @@ Arguments:
|
|
|
45
45
|
Options:
|
|
46
46
|
--sha <hex> Expected hex SHA-256. Required.
|
|
47
47
|
--timeout <secs> Max wait in seconds. Default 60.
|
|
48
|
-
--project <
|
|
48
|
+
--project <project_id> Project ID (defaults to active project)
|
|
49
49
|
|
|
50
50
|
Output:
|
|
51
51
|
Prints a JSON result on stdout when polling ends:
|
package/lib/ci.mjs
CHANGED
|
@@ -21,8 +21,8 @@ const { version: RUN402_VERSION } = JSON.parse(
|
|
|
21
21
|
const HELP = `run402 ci — Manage CI/OIDC deploy bindings
|
|
22
22
|
|
|
23
23
|
Usage:
|
|
24
|
-
run402 ci link github [--project <
|
|
25
|
-
run402 ci list [--project <
|
|
24
|
+
run402 ci link github [--project <project_id>] [--manifest <path>] [--repo <owner/repo>] [--branch <name> | --environment <name>] [--repository-id <repository_id>] [--workflow <path>] [--expires-at <iso>] [--route-scope <pattern> ...] [--force]
|
|
25
|
+
run402 ci list [--project <project_id>]
|
|
26
26
|
run402 ci revoke <binding_id>
|
|
27
27
|
run402 ci set-asset-scopes <binding_id> <scope1> [<scope2> ...]
|
|
28
28
|
|
|
@@ -37,15 +37,15 @@ const SUB_HELP = {
|
|
|
37
37
|
link: `run402 ci link github — Link GitHub Actions OIDC for run402 deploy
|
|
38
38
|
|
|
39
39
|
Usage:
|
|
40
|
-
run402 ci link github [--project <
|
|
40
|
+
run402 ci link github [--project <project_id>] [--manifest <path>] [--repo <owner/repo>] [--branch <name> | --environment <name>] [--repository-id <repository_id>] [--workflow <path>] [--expires-at <iso>] [--route-scope <pattern> ...] [--force]
|
|
41
41
|
|
|
42
42
|
Options:
|
|
43
|
-
--project <
|
|
43
|
+
--project <project_id> Project ID (defaults to the active project)
|
|
44
44
|
--manifest <path> Manifest path used by the generated workflow (default: run402.deploy.json)
|
|
45
45
|
--repo <owner/repo> GitHub repo (default: inferred from origin remote)
|
|
46
46
|
--branch <name> Branch subject and push trigger (default: current branch)
|
|
47
47
|
--environment <name> GitHub environment subject; adds job.environment
|
|
48
|
-
--repository-id <
|
|
48
|
+
--repository-id <repository_id> Numeric GitHub repository id when API lookup is unavailable
|
|
49
49
|
--workflow <path> Workflow path (default: .github/workflows/run402-deploy.yml)
|
|
50
50
|
--expires-at <iso> Optional binding expiration timestamp
|
|
51
51
|
--route-scope <pattern> Optional exact path or final wildcard route scope, repeatable (examples: /admin, /api/*)
|
|
@@ -60,7 +60,7 @@ Notes:
|
|
|
60
60
|
list: `run402 ci list — List CI bindings
|
|
61
61
|
|
|
62
62
|
Usage:
|
|
63
|
-
run402 ci list [--project <
|
|
63
|
+
run402 ci list [--project <project_id>]
|
|
64
64
|
`,
|
|
65
65
|
revoke: `run402 ci revoke — Revoke a CI binding
|
|
66
66
|
|
|
@@ -267,7 +267,7 @@ async function linkGithub(args) {
|
|
|
267
267
|
fail({
|
|
268
268
|
code: "BAD_USAGE",
|
|
269
269
|
message: "Missing provider: github.",
|
|
270
|
-
hint: "run402 ci link github [--project <
|
|
270
|
+
hint: "run402 ci link github [--project <project_id>]",
|
|
271
271
|
});
|
|
272
272
|
}
|
|
273
273
|
if (flags.branch && flags.environment) {
|
|
@@ -293,7 +293,7 @@ async function linkGithub(args) {
|
|
|
293
293
|
fail({
|
|
294
294
|
code: "GITHUB_REPOSITORY_ID_REQUIRED",
|
|
295
295
|
message: `Could not fetch the numeric GitHub repository id for ${repo}.`,
|
|
296
|
-
hint: "Set GITHUB_TOKEN/GH_TOKEN or pass --repository-id <
|
|
296
|
+
hint: "Set GITHUB_TOKEN/GH_TOKEN or pass --repository-id <repository_id>.",
|
|
297
297
|
details: { repo },
|
|
298
298
|
});
|
|
299
299
|
}
|
package/lib/claims.mjs
CHANGED
|
@@ -49,10 +49,10 @@ Advisory, always:
|
|
|
49
49
|
presence.
|
|
50
50
|
|
|
51
51
|
Room addressing:
|
|
52
|
-
Default room of the active project with no flags; --project <
|
|
52
|
+
Default room of the active project with no flags; --project <project_id> for another
|
|
53
53
|
project; --org <org_id> --room <key> (or RUN402_ROOM=<org_id>/<key>) for a
|
|
54
54
|
named org room. --room <key> alone works when the org resolves on its own
|
|
55
|
-
(--org / RUN402_ORG / the 'org' key of the nearest .run402.json / '
|
|
55
|
+
(--org / RUN402_ORG / the 'org' key of the nearest .run402.json / 'orgs use'),
|
|
56
56
|
and {"org":"...","room":"..."} in .run402.json binds a whole checkout.
|
|
57
57
|
|
|
58
58
|
Options:
|
package/lib/command-manifest.mjs
CHANGED
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
* positionals canonical positional ATTRIBUTES (post-conventions).
|
|
14
14
|
* A variadic list of the SAME kind counts as one.
|
|
15
15
|
* projectScoped command operates on a project and accepts
|
|
16
|
-
* `--project <
|
|
16
|
+
* `--project <project_id>` (precedence: --project > legacy
|
|
17
17
|
* leading prj_ positional > active project)
|
|
18
18
|
* orgScoped command acts ON an organization and resolves it
|
|
19
19
|
* through the ONE shared chain (cli-org-context):
|
|
20
20
|
* an optional leading <org_id> positional, else
|
|
21
21
|
* --org, else RUN402_ORG, else the .run402.json
|
|
22
|
-
* binding, else `
|
|
22
|
+
* binding, else `orgs use`. The gate drives every
|
|
23
23
|
* such entry through --org AND RUN402_ORG with no
|
|
24
24
|
* positional and fails on any "Missing <org_id>".
|
|
25
25
|
* Any entry with an `org_id` positional MUST be
|
|
@@ -151,7 +151,6 @@ export const COMMAND_MANIFEST = [
|
|
|
151
151
|
{ path: ["projects", "delete"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
|
|
152
152
|
{ path: ["projects", "promote-user"], positionals: [p("email")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["user@example.com"] },
|
|
153
153
|
{ path: ["projects", "demote-user"], positionals: [p("email")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["user@example.com"] },
|
|
154
|
-
{ path: ["projects", "export"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
|
|
155
154
|
|
|
156
155
|
// ── snapshots ────────────────────────────────────────────────────────────
|
|
157
156
|
{ path: ["snapshots", "create"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
|
|
@@ -171,13 +170,13 @@ export const COMMAND_MANIFEST = [
|
|
|
171
170
|
{ path: ["admin", "archive"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["--reason", "gate"] },
|
|
172
171
|
{ path: ["admin", "reactivate"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
|
|
173
172
|
|
|
174
|
-
// ──
|
|
175
|
-
{ path: ["
|
|
176
|
-
{ path: ["
|
|
177
|
-
{ path: ["
|
|
173
|
+
// ── archives ─────────────────────────────────────────────────────────────
|
|
174
|
+
{ path: ["archives", "create"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
|
|
175
|
+
{ path: ["archives", "download"], positionals: [p("archive_id")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["arc_gate1", "--output", "__OUT_FILE__"] },
|
|
176
|
+
{ path: ["archives", "status"], positionals: [p("archive_id")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["arc_gate1"] },
|
|
178
177
|
{ path: ["archives", "inspect"], positionals: [p("archive_path")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["__FIXTURE_FILE__"] },
|
|
179
178
|
{ path: ["archives", "verify"], positionals: [p("archive_path")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["__FIXTURE_FILE__"] },
|
|
180
|
-
{ path: ["
|
|
179
|
+
{ path: ["archives", "import"], positionals: [p("archive_path")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["__FIXTURE_FILE__", "--name", "gate-import"] },
|
|
181
180
|
|
|
182
181
|
// ── deploy (unified deploy v2) ───────────────────────────────────────────
|
|
183
182
|
// Bare `run402 deploy` IS the deploy (a verb); the family's subcommands
|
|
@@ -209,31 +208,30 @@ export const COMMAND_MANIFEST = [
|
|
|
209
208
|
{ path: ["transfer", "accept"], positionals: [p("transfer_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["tr_gate1"] },
|
|
210
209
|
{ path: ["transfer", "cancel"], positionals: [p("transfer_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["tr_gate1"] },
|
|
211
210
|
|
|
212
|
-
// ──
|
|
213
|
-
{ path: ["
|
|
214
|
-
{ path: ["
|
|
215
|
-
{ path: ["
|
|
216
|
-
{ path: ["
|
|
217
|
-
{ path: ["
|
|
211
|
+
// ── orgs ──────────────────────────────────────────────────────────────────
|
|
212
|
+
{ path: ["orgs", "create"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
213
|
+
{ path: ["orgs", "list"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
214
|
+
{ path: ["orgs", "get"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
|
|
215
|
+
{ path: ["orgs", "rename"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--name", "Gate"] },
|
|
216
|
+
{ path: ["orgs", "payout-wallet"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "0x1111111111111111111111111111111111111111"] },
|
|
218
217
|
// `--org` (not a positional org_id
|
|
219
218
|
// like rename/payout-wallet above) goes through resolveOrg's SHAPE
|
|
220
219
|
// validation (a real UUID) — "org_gate1" fails that locally, so this needs
|
|
221
|
-
// the same UUID-shaped fixture `
|
|
222
|
-
{ path: ["
|
|
223
|
-
{ path: ["
|
|
224
|
-
{ path: ["
|
|
225
|
-
{ path: ["
|
|
226
|
-
{ path: ["
|
|
227
|
-
{ path: ["
|
|
228
|
-
{ path: ["
|
|
229
|
-
{ path: ["
|
|
230
|
-
{ path: ["
|
|
231
|
-
{ path: ["
|
|
232
|
-
{ path: ["
|
|
233
|
-
{ path: ["
|
|
234
|
-
{ path: ["
|
|
235
|
-
{ path: ["
|
|
236
|
-
{ path: ["org", "invite", "rm"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--principal", "prn_gate1"] },
|
|
220
|
+
// the same UUID-shaped fixture `orgs use` below already established.
|
|
221
|
+
{ path: ["orgs", "slug"], positionals: [p("slug")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["acme", "--org", "11111111-2222-3333-4444-555555555555"] },
|
|
222
|
+
{ path: ["orgs", "audit"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
|
|
223
|
+
{ path: ["orgs", "use"], positionals: [p("org_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["11111111-2222-3333-4444-555555555555"] },
|
|
224
|
+
{ path: ["orgs", "current"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
225
|
+
{ path: ["orgs", "clear"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
226
|
+
{ path: ["orgs", "bind"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["--org", "11111111-2222-3333-4444-555555555555"] },
|
|
227
|
+
{ path: ["orgs", "unbind"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
228
|
+
{ path: ["orgs", "members", "list"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
|
|
229
|
+
{ path: ["orgs", "members", "add"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "0x1111111111111111111111111111111111111111"] },
|
|
230
|
+
{ path: ["orgs", "members", "role"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--principal", "prn_gate1", "--role", "viewer"] },
|
|
231
|
+
{ path: ["orgs", "members", "rm"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--principal", "prn_gate1"] },
|
|
232
|
+
{ path: ["orgs", "invite", "list"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
|
|
233
|
+
{ path: ["orgs", "invite", "create"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--email", "gate@example.com"] },
|
|
234
|
+
{ path: ["orgs", "invite", "rm"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--principal", "prn_gate1"] },
|
|
237
235
|
|
|
238
236
|
// ── grants ───────────────────────────────────────────────────────────────
|
|
239
237
|
{ path: ["grants", "create"], positionals: [p("wallet")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["0x1111111111111111111111111111111111111111", "--capability", "deploy"] },
|
|
@@ -245,8 +243,8 @@ export const COMMAND_MANIFEST = [
|
|
|
245
243
|
{ path: ["delegates", "revoke"], legacyPositionalProject: false, positionals: [p("delegate_id")], projectScoped: true, minimalArgs: ["dlg_gate1"] },
|
|
246
244
|
{ path: ["delegates", "rotate"], legacyPositionalProject: false, positionals: [p("delegate_id")], projectScoped: true, minimalArgs: ["dlg_gate1"] },
|
|
247
245
|
|
|
248
|
-
// ── events /
|
|
249
|
-
{ path: ["events"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "
|
|
246
|
+
// ── events / live ────────────────────────────────────────────────────────
|
|
247
|
+
{ path: ["events", "list"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub" },
|
|
250
248
|
{ path: ["live"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--tables", "cells", "--once"], runStyle: "merged" },
|
|
251
249
|
{ path: ["deliveries", "list"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub" },
|
|
252
250
|
{ path: ["deliveries", "get"], positionals: [p("notification_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["n_1"], runStyle: "sub" },
|
|
@@ -327,7 +325,8 @@ export const COMMAND_MANIFEST = [
|
|
|
327
325
|
// Principal-scoped (one bundle covers every vault you can read), so no
|
|
328
326
|
// --project — deliberately unlike its eleven vault-scoped siblings.
|
|
329
327
|
{ path: ["repos", "recovery-bundle"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["--out", "-"], runStyle: "sub", skipBehavioral: "exports the caller's live member recovery bundle (stamps recovery-posture export evidence server-side)" },
|
|
330
|
-
{ path: ["errors"
|
|
328
|
+
{ path: ["errors", "list"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub" },
|
|
329
|
+
{ path: ["errors", "get"], positionals: [p("fingerprint_id")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["fp_gate1"], runStyle: "sub" },
|
|
331
330
|
|
|
332
331
|
// ── jobs ─────────────────────────────────────────────────────────────────
|
|
333
332
|
{ path: ["jobs", "submit"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--file", "__FIXTURE_FILE__"] },
|
|
@@ -484,8 +483,8 @@ export const COMMAND_MANIFEST = [
|
|
|
484
483
|
// without rejecting it," which this satisfies.
|
|
485
484
|
{ path: ["doctor"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--no-scan"], runStyle: "merged" },
|
|
486
485
|
{ path: ["webhook-secret", "rotate"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
487
|
-
// `run402 logs [<function>] --request-id <
|
|
488
|
-
// the function name (`run402 errors` samples print it that way); it is
|
|
486
|
+
// `run402 logs [<function>] --request-id <request_id>`: the optional positional is
|
|
487
|
+
// the function name (`run402 errors list` samples print it that way); it is
|
|
489
488
|
// never a project id.
|
|
490
489
|
{ path: ["logs"], positionals: [p("function", { required: false })], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--request-id", "req_gate123"], runStyle: "merged" },
|
|
491
490
|
];
|
|
@@ -539,7 +538,7 @@ export const RESERVED_SUBCOMMANDS = {
|
|
|
539
538
|
// `reconcile` answer COMMAND_REMOVED (no equivalent successor for either —
|
|
540
539
|
// `push`'s one-release alias window is over, `reconcile` was a workaround
|
|
541
540
|
// with no permanent replacement, only a read at `repos access`).
|
|
542
|
-
"gitvault:init": "moved to `repos create --project <
|
|
541
|
+
"gitvault:init": "moved to `repos create --project <project_id>`",
|
|
543
542
|
"gitvault:status": "moved to `repos view`",
|
|
544
543
|
"gitvault:snapshot": "moved to `repos snapshot`",
|
|
545
544
|
"gitvault:policy": "moved to `repos policy`",
|
package/lib/config.mjs
CHANGED
|
@@ -101,11 +101,11 @@ export function findProject(id) {
|
|
|
101
101
|
fail({
|
|
102
102
|
code: "PROJECT_CREDENTIAL_NOT_FOUND",
|
|
103
103
|
message: `No local project credentials cached for ${idStr}.`,
|
|
104
|
-
hint: "Use a principal-auth command, or import project keys with `run402 credentials project-keys import --project <
|
|
104
|
+
hint: "Use a principal-auth command, or import project keys with `run402 credentials project-keys import --project <project_id> --service-key-stdin`.",
|
|
105
105
|
details: { project_id: idStr, source: "local_cache", cache_path: projectCredentialsFile(), wallet: activeProfile(), profile: activeProfile() },
|
|
106
106
|
next_actions: [{
|
|
107
107
|
type: "run_command",
|
|
108
|
-
command: `run402 credentials project-keys status --project ${idStr || "<
|
|
108
|
+
command: `run402 credentials project-keys status --project ${idStr || "<project_id>"}`,
|
|
109
109
|
why: "Inspect the local project-key cache without revealing secrets.",
|
|
110
110
|
}],
|
|
111
111
|
});
|
|
@@ -119,7 +119,7 @@ export function resolveProject(id) {
|
|
|
119
119
|
fail({
|
|
120
120
|
code: "PROJECT_REQUIRED",
|
|
121
121
|
message: "no project specified and no active project set.",
|
|
122
|
-
hint: "Pass --project <
|
|
122
|
+
hint: "Pass --project <project_id>, set RUN402_PROJECT_ID, or run: run402 projects use <project_id>",
|
|
123
123
|
next_actions: [selectProjectAction()],
|
|
124
124
|
});
|
|
125
125
|
}
|
|
@@ -132,7 +132,7 @@ export function resolveProjectId(id) {
|
|
|
132
132
|
fail({
|
|
133
133
|
code: "PROJECT_REQUIRED",
|
|
134
134
|
message: "no project specified and no active project set.",
|
|
135
|
-
hint: "Pass --project <
|
|
135
|
+
hint: "Pass --project <project_id>, set RUN402_PROJECT_ID, or run: run402 projects use <project_id>",
|
|
136
136
|
next_actions: [selectProjectAction()],
|
|
137
137
|
});
|
|
138
138
|
}
|
package/lib/contacts.mjs
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* "how can this human be reached" — not the mechanisms, which really are
|
|
13
13
|
* different and are not pretended otherwise.
|
|
14
14
|
*
|
|
15
|
-
* `rm <
|
|
15
|
+
* `rm <contact_id>` takes a bare id and works out which backend owns it, because both
|
|
16
16
|
* are UUIDs and a caller holding one from `contacts list` should not have to
|
|
17
17
|
* know which subsystem minted it. That costs one extra read and removes a
|
|
18
18
|
* `--kind` flag nobody could answer without looking it up.
|
|
@@ -44,7 +44,7 @@ Usage:
|
|
|
44
44
|
run402 contacts list
|
|
45
45
|
run402 contacts add <email> [--level <1-10>] [--name <display>]
|
|
46
46
|
run402 contacts connect telegram [--label <name>]
|
|
47
|
-
run402 contacts rm <
|
|
47
|
+
run402 contacts rm <contact_id>
|
|
48
48
|
run402 contacts preferences
|
|
49
49
|
run402 contacts preferences set <key>=<value> [<key>=<value> ...]
|
|
50
50
|
run402 contacts test [--source app|platform] [--type <event_type>]
|
|
@@ -339,7 +339,7 @@ async function removeContact(args) {
|
|
|
339
339
|
assertKnownFlags(a, ["--org", "--help", "-h"], ["--org"]);
|
|
340
340
|
const positionals = positionalArgs(a, ["--org"]);
|
|
341
341
|
requirePositionalCount(positionals, ["--org"], {
|
|
342
|
-
min: 1, max: 1, command: "run402 contacts rm", missing: "<
|
|
342
|
+
min: 1, max: 1, command: "run402 contacts rm", missing: "<contact_id>",
|
|
343
343
|
});
|
|
344
344
|
const id = positionals[0];
|
|
345
345
|
const sdk = getSdk();
|