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.
Files changed (131) hide show
  1. package/README.md +20 -20
  2. package/cli.mjs +7 -19
  3. package/gitvault-surface.json +2 -2
  4. package/lib/admin.mjs +5 -5
  5. package/lib/ai.mjs +5 -5
  6. package/lib/apps.mjs +9 -9
  7. package/lib/archives.mjs +371 -8
  8. package/lib/argparse.mjs +5 -5
  9. package/lib/assets.mjs +12 -12
  10. package/lib/auth.mjs +34 -34
  11. package/lib/branches.mjs +7 -7
  12. package/lib/buzz-doctor.mjs +1 -1
  13. package/lib/buzz-notifications.mjs +4 -4
  14. package/lib/buzz.mjs +2 -2
  15. package/lib/cache.mjs +1 -1
  16. package/lib/cdn.mjs +2 -2
  17. package/lib/ci.mjs +8 -8
  18. package/lib/claims.mjs +2 -2
  19. package/lib/command-manifest.mjs +35 -36
  20. package/lib/config.mjs +4 -4
  21. package/lib/contacts.mjs +3 -3
  22. package/lib/contracts.mjs +11 -11
  23. package/lib/credentials.mjs +31 -31
  24. package/lib/delegates.mjs +13 -13
  25. package/lib/deliveries.mjs +2 -2
  26. package/lib/deploy-v2.mjs +9 -9
  27. package/lib/dev.mjs +3 -3
  28. package/lib/doctor.mjs +6 -6
  29. package/lib/domains.mjs +27 -27
  30. package/lib/email.mjs +38 -38
  31. package/lib/errors.mjs +40 -24
  32. package/lib/escalations.mjs +4 -4
  33. package/lib/events.mjs +32 -25
  34. package/lib/feedback.mjs +2 -2
  35. package/lib/functions.mjs +34 -34
  36. package/lib/gitvault-scaffold.mjs +2 -2
  37. package/lib/gitvault.mjs +2 -2
  38. package/lib/grants.mjs +7 -7
  39. package/lib/image.mjs +7 -7
  40. package/lib/init.mjs +3 -3
  41. package/lib/jobs.mjs +15 -15
  42. package/lib/live.mjs +1 -1
  43. package/lib/logs.mjs +8 -8
  44. package/lib/messages.mjs +5 -5
  45. package/lib/next-actions.mjs +1 -1
  46. package/lib/org-context.mjs +13 -13
  47. package/lib/{org.mjs → orgs.mjs} +124 -163
  48. package/lib/projects.mjs +45 -56
  49. package/lib/repos.mjs +23 -23
  50. package/lib/rooms.mjs +2 -2
  51. package/lib/sdk-errors.mjs +1 -1
  52. package/lib/secrets.mjs +13 -13
  53. package/lib/sites.mjs +14 -14
  54. package/lib/snapshots.mjs +10 -10
  55. package/lib/subdomains.mjs +12 -12
  56. package/lib/subscriptions.mjs +2 -2
  57. package/lib/transfer.mjs +1 -1
  58. package/lib/up.mjs +7 -7
  59. package/lib/wallet-context.mjs +1 -1
  60. package/lib/wallets.mjs +1 -1
  61. package/lib/webhooks.mjs +8 -8
  62. package/lib/whoami.mjs +32 -5
  63. package/package.json +1 -1
  64. package/sdk/dist/actions.d.ts +3 -3
  65. package/sdk/dist/actions.d.ts.map +1 -1
  66. package/sdk/dist/app-up.d.ts +2 -2
  67. package/sdk/dist/app-up.d.ts.map +1 -1
  68. package/sdk/dist/config.d.ts +1 -2
  69. package/sdk/dist/config.d.ts.map +1 -1
  70. package/sdk/dist/config.js.map +1 -1
  71. package/sdk/dist/credentials.d.ts +1 -1
  72. package/sdk/dist/errors.d.ts +2 -2
  73. package/sdk/dist/errors.d.ts.map +1 -1
  74. package/sdk/dist/errors.js +1 -1
  75. package/sdk/dist/errors.js.map +1 -1
  76. package/sdk/dist/index.js +1 -1
  77. package/sdk/dist/index.js.map +1 -1
  78. package/sdk/dist/namespaces/admin.d.ts +1 -1
  79. package/sdk/dist/namespaces/admin.d.ts.map +1 -1
  80. package/sdk/dist/namespaces/ai.d.ts +1 -1
  81. package/sdk/dist/namespaces/ai.js +2 -2
  82. package/sdk/dist/namespaces/ai.js.map +1 -1
  83. package/sdk/dist/namespaces/assets.js +1 -1
  84. package/sdk/dist/namespaces/assets.js.map +1 -1
  85. package/sdk/dist/namespaces/ci.js +3 -3
  86. package/sdk/dist/namespaces/ci.js.map +1 -1
  87. package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
  88. package/sdk/dist/namespaces/deploy.js +26 -27
  89. package/sdk/dist/namespaces/deploy.js.map +1 -1
  90. package/sdk/dist/namespaces/deploy.types.d.ts +2 -2
  91. package/sdk/dist/namespaces/deploy.types.d.ts.map +1 -1
  92. package/sdk/dist/namespaces/domains.d.ts +10 -2
  93. package/sdk/dist/namespaces/domains.d.ts.map +1 -1
  94. package/sdk/dist/namespaces/domains.js +10 -5
  95. package/sdk/dist/namespaces/domains.js.map +1 -1
  96. package/sdk/dist/namespaces/errors.js +1 -1
  97. package/sdk/dist/namespaces/functions.js +1 -1
  98. package/sdk/dist/namespaces/functions.js.map +1 -1
  99. package/sdk/dist/namespaces/gitvault.d.ts +2 -2
  100. package/sdk/dist/namespaces/gitvault.js +4 -4
  101. package/sdk/dist/namespaces/gitvault.js.map +1 -1
  102. package/sdk/dist/namespaces/tier.d.ts +1 -1
  103. package/sdk/dist/namespaces/transfers.d.ts +46 -15
  104. package/sdk/dist/namespaces/transfers.d.ts.map +1 -1
  105. package/sdk/dist/namespaces/transfers.js.map +1 -1
  106. package/sdk/dist/node/actions-node.js +8 -8
  107. package/sdk/dist/node/actions-node.js.map +1 -1
  108. package/sdk/dist/node/assets-node.js +6 -6
  109. package/sdk/dist/node/assets-node.js.map +1 -1
  110. package/sdk/dist/node/ci.js +1 -1
  111. package/sdk/dist/node/ci.js.map +1 -1
  112. package/sdk/dist/node/credentials.d.ts +1 -1
  113. package/sdk/dist/node/credentials.js +1 -1
  114. package/sdk/dist/node/deploy-manifest.d.ts +3 -5
  115. package/sdk/dist/node/deploy-manifest.d.ts.map +1 -1
  116. package/sdk/dist/node/deploy-manifest.js +3 -12
  117. package/sdk/dist/node/deploy-manifest.js.map +1 -1
  118. package/sdk/dist/node/gitvault-apply.js +1 -1
  119. package/sdk/dist/node/gitvault-apply.js.map +1 -1
  120. package/sdk/dist/node/manifest-export.js +2 -2
  121. package/sdk/dist/node/manifest-export.js.map +1 -1
  122. package/sdk/dist/node/org-adopt.js +1 -1
  123. package/sdk/dist/node/org-adopt.js.map +1 -1
  124. package/sdk/dist/node/sites-node.js +1 -1
  125. package/sdk/dist/node/sites-node.js.map +1 -1
  126. package/sdk/dist/scoped.d.ts +8 -8
  127. package/sdk/dist/scoped.d.ts.map +1 -1
  128. package/sdk/dist/scoped.js +3 -3
  129. package/sdk/dist/scoped.js.map +1 -1
  130. package/lib/cloud.mjs +0 -256
  131. 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 <id>]
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 <id> --code <6 digits>) [--project <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 <id>]
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 <id>]
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 <id>]
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 <id>]
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 <id>]
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 <id> --response <json> [--label <text>] [--project <id>]
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 <id>]
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 <id> --response <json> [--project <id>]
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 <id>]
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 <id>]
45
+ delete-passkey --token <bearer> --id <passkey_id> [--project <project_id>]
46
46
  Delete one authenticated-user passkey.
47
47
 
48
- providers [--project <id>]
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 <id> Project ID (defaults to active 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 <id> Project ID (defaults to active 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 <id> Project ID (defaults to active 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 <id> --code <6 digits> [options]
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 <id> Required with --code: opaque handle from magic-link request
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 <id> Project ID (defaults to active 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 <id> Project ID (defaults to active 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 <id> Project ID (defaults to active 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 <id> Project ID (defaults to active 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 <id> --response <json> [options]
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 <id> Required: challenge_id returned by passkey-register-options
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 <id> Project ID (defaults to active 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 <id> Project ID (defaults to active 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 <id> --response <json> [options]
210
+ run402 auth passkey-login-verify --challenge <challenge_id> --response <json> [options]
211
211
 
212
212
  Options:
213
- --challenge <id> Required: challenge_id returned by passkey-login-options
213
+ --challenge <challenge_id> Required: challenge_id returned by passkey-login-options
214
214
  --response <json> Required: browser PublicKeyCredential JSON
215
- --project <id> Project ID (defaults to active 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 <id> Project ID (defaults to active 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 <id> Project ID (defaults to active 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 <id> Project ID (defaults to active 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 <id>" });
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 <id>" });
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 <id>] [--from-snapshot <snapshot-id>] [--name <label>] [--email-mode sandbox|off] [--enable-cron] [--ttl-days <n>] [--json]
19
- run402 branches list [--project <id>] [--json]
20
- run402 branches renew <branch-project-id> [--project <id>] [--ttl-days <n>] [--json]
21
- run402 branches delete <branch-project-id> [--project <id>] [--json]
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 [project-id] <branch-project-id>");
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 [project-id] <branch-project-id>");
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: `<branch-project-id> [--project <parent-id>]`. Branch ids are
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.
@@ -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", "org whoami", "identity link nostr"],
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 <id> [--project <id> ...] | --all-projects) [--event-type <t> ...] [--event-class <c> ...] [--include-org-events] [--on-call <hex-pubkey> [--on-call-name <display>]]
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 <id> ...]
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 <id> ...]`
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 <id> ...]", missing: "<buzzper_id>",
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 org whoami" returns it (a UUID)
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 <id> [--event-type <t> ...] [--event-class <c> ...] [--include-org-events]
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 <id> (inspect only) Inspect a specific 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 <id>]
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 <id> Project ID (defaults to active 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 <id>] [--manifest <path>] [--repo <owner/repo>] [--branch <name> | --environment <name>] [--repository-id <id>] [--workflow <path>] [--expires-at <iso>] [--route-scope <pattern> ...] [--force]
25
- run402 ci list [--project <id>]
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 <id>] [--manifest <path>] [--repo <owner/repo>] [--branch <name> | --environment <name>] [--repository-id <id>] [--workflow <path>] [--expires-at <iso>] [--route-scope <pattern> ...] [--force]
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 <id> Project ID (defaults to the active 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 <id> Numeric GitHub repository id when API lookup is unavailable
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 <id>]
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 <id>]",
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 <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 <id> for another
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 / 'org use'),
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:
@@ -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 <id>` (precedence: --project > legacy
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 `org use`. The gate drives every
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
- // ── cloud / archives / core ──────────────────────────────────────────────
175
- { path: ["cloud", "archives", "create"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
176
- { path: ["cloud", "archives", "download"], positionals: [p("archive_id")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["arc_gate1", "--output", "__OUT_FILE__"] },
177
- { path: ["cloud", "archives", "status"], positionals: [p("archive_id")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["arc_gate1"] },
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: ["core", "projects", "import"], positionals: [p("archive_path")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["__FIXTURE_FILE__", "--name", "gate-import"] },
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
- // ── org ──────────────────────────────────────────────────────────────────
213
- { path: ["org", "create"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
214
- { path: ["org", "list"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
215
- { path: ["org", "get"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
216
- { path: ["org", "rename"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--name", "Gate"] },
217
- { path: ["org", "payout-wallet"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "0x1111111111111111111111111111111111111111"] },
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 `org use` below already established.
222
- { path: ["org", "slug"], positionals: [p("slug")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["acme", "--org", "11111111-2222-3333-4444-555555555555"] },
223
- { path: ["org", "whoami"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
224
- { path: ["org", "audit"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
225
- { path: ["org", "use"], positionals: [p("org_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["11111111-2222-3333-4444-555555555555"] },
226
- { path: ["org", "current"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
227
- { path: ["org", "clear"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
228
- { path: ["org", "bind"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["--org", "11111111-2222-3333-4444-555555555555"] },
229
- { path: ["org", "unbind"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
230
- { path: ["org", "member", "list"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
231
- { path: ["org", "member", "add"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "0x1111111111111111111111111111111111111111"] },
232
- { path: ["org", "member", "role"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--principal", "prn_gate1", "--role", "viewer"] },
233
- { path: ["org", "member", "rm"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--principal", "prn_gate1"] },
234
- { path: ["org", "invite", "list"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
235
- { path: ["org", "invite", "create"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--email", "gate@example.com"] },
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 / errors (flat, merged runners) ───────────────────────────────
249
- { path: ["events"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "merged" },
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"], positionals: [p("fingerprint_id", { required: false })], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "merged" },
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 <id>`: the optional positional is
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 <id>`",
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 <id> --service-key-stdin`.",
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 || "<id>"}`,
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 <id>, set RUN402_PROJECT_ID, or run: run402 projects use <id>",
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 <id>, set RUN402_PROJECT_ID, or run: run402 projects use <id>",
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 <id>` takes a bare id and works out which backend owns it, because both
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 <id>
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: "<id>",
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();