run402 4.8.0 → 4.10.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 (64) hide show
  1. package/cli.mjs +20 -8
  2. package/lib/admin.mjs +18 -25
  3. package/lib/agent.mjs +2 -2
  4. package/lib/ai.mjs +2 -2
  5. package/lib/allowance.mjs +2 -2
  6. package/lib/apps.mjs +69 -51
  7. package/lib/archives.mjs +2 -7
  8. package/lib/argparse.mjs +131 -3
  9. package/lib/asset-wire.mjs +59 -0
  10. package/lib/assets.mjs +14 -12
  11. package/lib/auth.mjs +2 -2
  12. package/lib/billing.mjs +17 -13
  13. package/lib/branches.mjs +22 -23
  14. package/lib/cache.mjs +2 -6
  15. package/lib/cdn.mjs +2 -2
  16. package/lib/ci.mjs +4 -1
  17. package/lib/cloud.mjs +27 -28
  18. package/lib/command-manifest.mjs +352 -0
  19. package/lib/contracts.mjs +49 -11
  20. package/lib/core.mjs +3 -13
  21. package/lib/credentials.mjs +3 -13
  22. package/lib/deploy-v2.mjs +21 -8
  23. package/lib/deploy.mjs +2 -5
  24. package/lib/doctor.mjs +32 -4
  25. package/lib/domains.mjs +2 -2
  26. package/lib/email.mjs +2 -2
  27. package/lib/functions.mjs +100 -55
  28. package/lib/grants.mjs +42 -22
  29. package/lib/image.mjs +2 -2
  30. package/lib/jobs.mjs +18 -11
  31. package/lib/message.mjs +2 -2
  32. package/lib/notifications.mjs +6 -12
  33. package/lib/operator.mjs +2 -7
  34. package/lib/org.mjs +88 -49
  35. package/lib/projects.mjs +68 -39
  36. package/lib/secrets.mjs +99 -41
  37. package/lib/service.mjs +3 -2
  38. package/lib/sites.mjs +2 -2
  39. package/lib/snapshots.mjs +22 -24
  40. package/lib/subdomains.mjs +2 -2
  41. package/lib/tier.mjs +2 -2
  42. package/lib/transfer.mjs +2 -1
  43. package/lib/up.mjs +12 -6
  44. package/lib/wallets.mjs +6 -9
  45. package/lib/webhook-secret.mjs +3 -8
  46. package/lib/webhooks.mjs +2 -2
  47. package/package.json +1 -1
  48. package/sdk/dist/actions.d.ts +20 -1
  49. package/sdk/dist/actions.d.ts.map +1 -1
  50. package/sdk/dist/actions.js.map +1 -1
  51. package/sdk/dist/namespaces/projects.d.ts +2 -1
  52. package/sdk/dist/namespaces/projects.d.ts.map +1 -1
  53. package/sdk/dist/namespaces/projects.js +8 -12
  54. package/sdk/dist/namespaces/projects.js.map +1 -1
  55. package/sdk/dist/node/actions-node.d.ts.map +1 -1
  56. package/sdk/dist/node/actions-node.js +114 -8
  57. package/sdk/dist/node/actions-node.js.map +1 -1
  58. package/sdk/dist/node/deploy-manifest.d.ts +36 -0
  59. package/sdk/dist/node/deploy-manifest.d.ts.map +1 -1
  60. package/sdk/dist/node/deploy-manifest.js +112 -3
  61. package/sdk/dist/node/deploy-manifest.js.map +1 -1
  62. package/sdk/dist/node/index.d.ts +1 -1
  63. package/sdk/dist/node/index.d.ts.map +1 -1
  64. package/sdk/dist/node/index.js.map +1 -1
package/lib/secrets.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { readFileSync } from "fs";
2
2
  import { getSdk } from "./sdk.mjs";
3
3
  import { reportSdkError, fail } from "./sdk-errors.mjs";
4
- import { assertKnownFlags, flagValue, normalizeArgv, positionalArgs, validateRegularFile } from "./argparse.mjs";
4
+ import { assertKnownFlags, flagValue, normalizeArgv, positionalArgs, resolveProjectSelector, validateRegularFile, failUnknownSubcommand } from "./argparse.mjs";
5
5
  import { editRequestAction } from "./next-actions.mjs";
6
6
 
7
7
  const HELP = `run402 secrets — Manage project secrets
@@ -10,18 +10,25 @@ Usage:
10
10
  run402 secrets <subcommand> [args...]
11
11
 
12
12
  Subcommands:
13
- set <id> <key> <value> [--file <path>|--stdin] Set a secret on a project
14
- list <id> List all secrets for a project
15
- delete <id> <key> Delete a secret from a project
13
+ set <key> (--value <v> | --file <path> | --stdin) [--project <id>]
14
+ Set a secret on a project
15
+ list [--project <id>] List all secrets for a project
16
+ delete <key> [--project <id>] Delete a secret from a project
17
+
18
+ Legacy (still supported):
19
+ run402 secrets set <prj_id> <key> <value>
20
+ run402 secrets list <prj_id>
21
+ run402 secrets delete <prj_id> <key>
16
22
 
17
23
  Examples:
18
- printf %s "$STRIPE_KEY" | run402 secrets set prj_abc123 STRIPE_KEY --stdin
19
- run402 secrets set prj_abc123 STRIPE_KEY --file ./.secrets/stripe-key
20
- run402 secrets set prj_abc123 TLS_CERT --file cert.pem
21
- run402 secrets list prj_abc123
22
- run402 secrets delete prj_abc123 STRIPE_KEY
24
+ printf %s "$STRIPE_KEY" | run402 secrets set STRIPE_KEY --stdin --project prj_abc123
25
+ run402 secrets set STRIPE_KEY --file ./.secrets/stripe-key --project prj_abc123
26
+ run402 secrets set TLS_CERT --file cert.pem
27
+ run402 secrets list --project prj_abc123
28
+ run402 secrets delete STRIPE_KEY --project prj_abc123
23
29
 
24
30
  Notes:
31
+ - --project defaults to the active project ('run402 projects use')
25
32
  - Secrets are injected as process.env in serverless functions
26
33
  - Values are write-only — list returns keys and timestamps only
27
34
  - Deploy manifests should declare existing keys with secrets.require; never put values in deploy specs
@@ -31,68 +38,86 @@ const SUB_HELP = {
31
38
  set: `run402 secrets set — Set a secret on a project
32
39
 
33
40
  Usage:
34
- run402 secrets set <id> <key> <value>
35
- run402 secrets set <id> <key> --file <path>
36
- run402 secrets set <id> <key> --stdin
41
+ run402 secrets set <key> --value <v> [--project <id>]
42
+ run402 secrets set <key> --file <path> [--project <id>]
43
+ run402 secrets set <key> --stdin [--project <id>]
44
+
45
+ Legacy (still supported):
46
+ run402 secrets set <prj_id> <key> <value>
47
+ run402 secrets set <key> <value>
37
48
 
38
49
  Arguments:
39
- <id> Project ID (from 'run402 projects list')
40
50
  <key> Secret key name (exposed as process.env.<key>)
41
- <value> Inline secret value (omit if using --file or --stdin)
42
51
 
43
52
  Options:
53
+ --project <id> Project ID (defaults to the active project)
54
+ --value <v> Inline secret value (alternative to the legacy positional)
44
55
  --file <path> Read the secret value from a file instead of inline
45
56
  Use --file - or --file /dev/stdin to read from stdin
46
57
  --stdin Read the secret value from stdin until EOF
47
58
 
48
59
  Notes:
60
+ - Provide exactly one value source: --value, --file, --stdin, or the legacy inline positional
49
61
  - Secrets are injected as process.env in serverless functions
50
62
  - Values are write-only; 'list' cannot verify values by hash
51
63
  - Prefer --stdin or --file for real secrets so values do not land in shell history
52
64
 
53
65
  Examples:
54
- printf %s "$STRIPE_KEY" | run402 secrets set prj_abc123 STRIPE_KEY --stdin
55
- cat ./.secrets/stripe-key | run402 secrets set prj_abc123 STRIPE_KEY --file -
56
- run402 secrets set prj_abc123 STRIPE_KEY --file ./.secrets/stripe-key
57
- run402 secrets set prj_abc123 TLS_CERT --file cert.pem
66
+ printf %s "$STRIPE_KEY" | run402 secrets set STRIPE_KEY --stdin --project prj_abc123
67
+ cat ./.secrets/stripe-key | run402 secrets set STRIPE_KEY --file - --project prj_abc123
68
+ run402 secrets set STRIPE_KEY --file ./.secrets/stripe-key
69
+ run402 secrets set TLS_CERT --file cert.pem --project prj_abc123
58
70
  `,
59
71
  list: `run402 secrets list — List all secrets for a project
60
72
 
61
73
  Usage:
62
- run402 secrets list <id>
74
+ run402 secrets list [--project <id>]
63
75
 
64
- Arguments:
65
- <id> Project ID (from 'run402 projects list')
76
+ Legacy (still supported):
77
+ run402 secrets list <prj_id>
78
+
79
+ Options:
80
+ --project <id> Project ID (defaults to the active project)
66
81
 
67
82
  Notes:
68
83
  - Returns secret keys and timestamps only; raw values and value-derived hashes are never returned
69
84
 
70
85
  Examples:
71
- run402 secrets list prj_abc123
86
+ run402 secrets list --project prj_abc123
72
87
  `,
73
88
  delete: `run402 secrets delete — Delete a secret from a project
74
89
 
75
90
  Usage:
76
- run402 secrets delete <id> <key>
91
+ run402 secrets delete <key> [--project <id>]
92
+
93
+ Legacy (still supported):
94
+ run402 secrets delete <prj_id> <key>
77
95
 
78
96
  Arguments:
79
- <id> Project ID (from 'run402 projects list')
80
97
  <key> Secret key name to remove
81
98
 
99
+ Options:
100
+ --project <id> Project ID (defaults to the active project)
101
+
82
102
  Examples:
83
- run402 secrets delete prj_abc123 STRIPE_KEY
103
+ run402 secrets delete STRIPE_KEY --project prj_abc123
84
104
  `,
85
105
  };
86
106
 
107
+ const SET_VALUE_FLAGS = ["--file", "--value", "--project"];
108
+
87
109
  export function readSecretValueForSet(parsedArgs, values, readers = {}) {
88
110
  const readStdin = readers.readStdin ?? (() => readFileSync(0, "utf-8"));
89
111
  const readFile = readers.readFile ?? ((path) => readFileSync(path, "utf-8"));
90
112
  const validateFile = readers.validateFile ?? validateRegularFile;
91
113
  const file = flagValue(parsedArgs, "--file");
114
+ const valueFlagPresent = parsedArgs.includes("--value");
115
+ const valueFlag = valueFlagPresent ? flagValue(parsedArgs, "--value") : null;
92
116
  const stdinRequested = parsedArgs.includes("--stdin");
93
117
  const stdinFile = isStdinAlias(file);
94
118
  const sources = [];
95
119
  if (values.length === 1) sources.push("inline");
120
+ if (valueFlagPresent) sources.push("--value");
96
121
  if (file) sources.push(stdinFile ? "--file stdin" : "--file");
97
122
  if (stdinRequested) sources.push("--stdin");
98
123
 
@@ -101,22 +126,31 @@ export function readSecretValueForSet(parsedArgs, values, readers = {}) {
101
126
  code: "BAD_USAGE",
102
127
  message: "Provide exactly one secret value source.",
103
128
  details: { sources },
104
- hint: "Use one of: inline value, --file <path>, or --stdin.",
129
+ hint: "Use one of: --value <v>, --file <path>, --stdin, or an inline value.",
105
130
  });
106
131
  }
107
132
  if (file && !stdinFile) validateFile(file, "--file");
108
133
 
109
134
  if (stdinRequested || stdinFile) return readStdin();
135
+ if (valueFlagPresent) return valueFlag;
110
136
  if (file) return readFile(file);
111
137
  if (values.length === 1) return values[0];
112
138
  return undefined;
113
139
  }
114
140
 
115
- async function set(projectId, key, args = []) {
141
+ async function set(projectId, args = []) {
116
142
  const parsedArgs = normalizeArgv(args);
117
- const valueFlags = ["--file"];
118
- assertKnownFlags(parsedArgs, [...valueFlags, "--stdin", "--help", "-h"], valueFlags);
119
- const values = positionalArgs(parsedArgs, valueFlags);
143
+ assertKnownFlags(parsedArgs, [...SET_VALUE_FLAGS, "--stdin", "--help", "-h"], SET_VALUE_FLAGS);
144
+ const positionals = positionalArgs(parsedArgs, SET_VALUE_FLAGS);
145
+ const key = positionals[0];
146
+ if (!key) {
147
+ fail({
148
+ code: "BAD_USAGE",
149
+ message: "Missing <key>.",
150
+ hint: "run402 secrets set <key> --value <v> [--project <id>]",
151
+ });
152
+ }
153
+ const values = positionals.slice(1);
120
154
  if (values.length > 1) {
121
155
  fail({ code: "BAD_USAGE", message: `Unexpected argument for secrets set: ${values[1]}` });
122
156
  }
@@ -172,8 +206,8 @@ function failMissingStdin() {
172
206
 
173
207
  async function list(projectId, args = []) {
174
208
  const parsedArgs = normalizeArgv(args);
175
- assertKnownFlags(parsedArgs, ["--help", "-h"]);
176
- const extra = positionalArgs(parsedArgs);
209
+ assertKnownFlags(parsedArgs, ["--project", "--help", "-h"], ["--project"]);
210
+ const extra = positionalArgs(parsedArgs, ["--project"]);
177
211
  if (extra.length > 0) {
178
212
  fail({ code: "BAD_USAGE", message: `Unexpected argument for secrets list: ${extra[0]}` });
179
213
  }
@@ -192,12 +226,20 @@ async function list(projectId, args = []) {
192
226
  }
193
227
  }
194
228
 
195
- async function deleteSecret(projectId, key, args = []) {
229
+ async function deleteSecret(projectId, args = []) {
196
230
  const parsedArgs = normalizeArgv(args);
197
- assertKnownFlags(parsedArgs, ["--help", "-h"]);
198
- const extra = positionalArgs(parsedArgs);
199
- if (extra.length > 0) {
200
- fail({ code: "BAD_USAGE", message: `Unexpected argument for secrets delete: ${extra[0]}` });
231
+ assertKnownFlags(parsedArgs, ["--project", "--help", "-h"], ["--project"]);
232
+ const positionals = positionalArgs(parsedArgs, ["--project"]);
233
+ const key = positionals[0];
234
+ if (!key) {
235
+ fail({
236
+ code: "BAD_USAGE",
237
+ message: "Missing <key>.",
238
+ hint: "run402 secrets delete <key> [--project <id>]",
239
+ });
240
+ }
241
+ if (positionals.length > 1) {
242
+ fail({ code: "BAD_USAGE", message: `Unexpected argument for secrets delete: ${positionals[1]}` });
201
243
  }
202
244
  try {
203
245
  await getSdk().secrets.delete(projectId, key);
@@ -213,11 +255,27 @@ export async function run(sub, args) {
213
255
  console.log(SUB_HELP[sub] || HELP);
214
256
  process.exit(0);
215
257
  }
258
+ if (!["set", "list", "delete"].includes(sub)) {
259
+ failUnknownSubcommand("secrets", sub);
260
+ }
261
+ const parsed = normalizeArgv(Array.isArray(args) ? args : []);
216
262
  switch (sub) {
217
- case "set": await set(args[0], args[1], args.slice(2)); break;
218
- case "list": await list(args[0], args.slice(1)); break;
219
- case "delete": await deleteSecret(args[0], args[1], args.slice(2)); break;
263
+ case "set": {
264
+ const { projectId, rest } = resolveProjectSelector(parsed, { valueFlags: SET_VALUE_FLAGS });
265
+ await set(projectId, rest);
266
+ break;
267
+ }
268
+ case "list": {
269
+ const { projectId, rest } = resolveProjectSelector(parsed, { valueFlags: ["--project"] });
270
+ await list(projectId, rest);
271
+ break;
272
+ }
273
+ case "delete": {
274
+ const { projectId, rest } = resolveProjectSelector(parsed, { valueFlags: ["--project"] });
275
+ await deleteSecret(projectId, rest);
276
+ break;
277
+ }
220
278
  default:
221
- fail({ code: "UNKNOWN_SUBCOMMAND", message: `Unknown secrets subcommand: ${sub}`, hint: "Run `run402 secrets --help` for usage.", details: { command: "secrets", subcommand: sub } });
279
+ failUnknownSubcommand("secrets", sub);
222
280
  }
223
281
  }
package/lib/service.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { getSdk } from "./sdk.mjs";
2
- import { reportSdkError, fail } from "./sdk-errors.mjs";
2
+ import { failUnknownSubcommand } from "./argparse.mjs";
3
+ import { reportSdkError } from "./sdk-errors.mjs";
3
4
 
4
5
  const HELP = `run402 service — Run402 service health and availability
5
6
 
@@ -70,6 +71,6 @@ export async function run(sub, args) {
70
71
  case "status": await status(); break;
71
72
  case "health": await health(); break;
72
73
  default:
73
- fail({ code: "UNKNOWN_SUBCOMMAND", message: `Unknown service subcommand: ${sub}`, hint: "Run `run402 service --help` for usage.", details: { command: "service", subcommand: sub } });
74
+ failUnknownSubcommand("service", sub);
74
75
  }
75
76
  }
package/lib/sites.mjs CHANGED
@@ -6,7 +6,7 @@ import { allowanceAuthHeaders, resolveProjectId, updateProject } from "./config.
6
6
  import { resolveFilePathsInManifest } from "./manifest.mjs";
7
7
  import { getSdk } from "./sdk.mjs";
8
8
  import { reportSdkError, fail } from "./sdk-errors.mjs";
9
- import { assertKnownFlags, flagValue, normalizeArgv, positionalArgs } from "./argparse.mjs";
9
+ import { assertKnownFlags, flagValue, normalizeArgv, positionalArgs, failUnknownSubcommand } from "./argparse.mjs";
10
10
 
11
11
  const SMALL_DIR_THRESHOLD = 5;
12
12
 
@@ -364,6 +364,6 @@ export async function run(sub, args) {
364
364
  case "deploy": await deploy(args); break;
365
365
  case "deploy-dir": await deployDir(args); break;
366
366
  default:
367
- fail({ code: "UNKNOWN_SUBCOMMAND", message: `Unknown sites subcommand: ${sub}`, hint: "Run `run402 sites --help` for usage.", details: { command: "sites", subcommand: sub } });
367
+ failUnknownSubcommand("sites", sub);
368
368
  }
369
369
  }
package/lib/snapshots.mjs CHANGED
@@ -8,24 +8,29 @@ import {
8
8
  normalizeArgv,
9
9
  parseIntegerFlag,
10
10
  positionalArgs,
11
+ resolveProjectSelector,
12
+ failUnknownSubcommand,
11
13
  } from "./argparse.mjs";
12
- import { resolveProjectId } from "./config.mjs";
13
14
 
14
15
  const HELP = `run402 snapshots — Project database restore points
15
16
 
16
17
  Usage:
17
- run402 snapshots create [project-id] [--json]
18
- run402 snapshots list [project-id] [--kind <kind>] [--limit <n>] [--after <cursor>] [--json]
19
- run402 snapshots get [project-id] <snapshot-id> [--json]
20
- run402 snapshots restore [project-id] <snapshot-id> [--include-auth] [--confirm <token>] [--json]
21
- run402 snapshots delete [project-id] <snapshot-id> [--json]
18
+ run402 snapshots create [--project <id>] [--json]
19
+ run402 snapshots list [--project <id>] [--kind <kind>] [--limit <n>] [--after <cursor>] [--json]
20
+ run402 snapshots get <snapshot-id> [--project <id>] [--json]
21
+ run402 snapshots restore <snapshot-id> [--project <id>] [--include-auth] [--confirm <token>] [--json]
22
+ run402 snapshots delete <snapshot-id> [--project <id>] [--json]
23
+
24
+ Legacy (still supported): a leading prj_... positional selects the project,
25
+ e.g. run402 snapshots restore prj_abc123 <snapshot-id>. --project defaults to
26
+ the active project.
22
27
 
23
28
  Restore is a two-step handshake. First call without --confirm to get a
24
29
  restore_plan.confirm.token, then re-run with --confirm after reviewing the
25
30
  data-loss statement.
26
31
  `;
27
32
 
28
- const FLAG_VALUES = ["--kind", "--limit", "--after", "--confirm"];
33
+ const FLAG_VALUES = ["--project", "--kind", "--limit", "--after", "--confirm"];
29
34
  const FLAGS = new Set([...FLAG_VALUES, "--include-auth", "--json", "--help", "-h"]);
30
35
  const SNAPSHOT_KINDS = ["manual", "pre_migration", "pre_restore", "scheduled"];
31
36
 
@@ -44,17 +49,12 @@ export async function run(sub, args = []) {
44
49
  case "restore": return restore(rest);
45
50
  case "delete": return deleteSnapshot(rest);
46
51
  default:
47
- fail({
48
- code: "UNKNOWN_SUBCOMMAND",
49
- message: `Unknown snapshots subcommand: ${sub}`,
50
- hint: "Run `run402 snapshots --help` for usage.",
51
- details: { command: "snapshots", subcommand: sub },
52
- });
52
+ failUnknownSubcommand("snapshots", sub);
53
53
  }
54
54
  }
55
55
 
56
56
  async function create(args) {
57
- const projectId = resolveOptionalProject(positionalArgs(args, FLAG_VALUES)[0]);
57
+ const { projectId } = resolveProjectSelector(args, { valueFlags: FLAG_VALUES });
58
58
  try {
59
59
  const snapshot = await getSdk().snapshots.create(projectId);
60
60
  console.log(JSON.stringify({ ok: snapshot.status === "ready", snapshot }, null, 2));
@@ -64,7 +64,7 @@ async function create(args) {
64
64
  }
65
65
 
66
66
  async function list(args) {
67
- const projectId = resolveOptionalProject(positionalArgs(args, FLAG_VALUES)[0]);
67
+ const { projectId } = resolveProjectSelector(args, { valueFlags: FLAG_VALUES });
68
68
  const kind = flagValue(args, "--kind") ?? undefined;
69
69
  if (kind !== undefined) assertAllowedValue(kind, SNAPSHOT_KINDS, "--kind");
70
70
  const limitFlag = flagValue(args, "--limit");
@@ -124,14 +124,12 @@ async function deleteSnapshot(args) {
124
124
  }
125
125
  }
126
126
 
127
- function resolveOptionalProject(value) {
128
- if (value && String(value).startsWith("prj_")) return value;
129
- return resolveProjectId(null);
130
- }
131
-
132
127
  function resolveProjectAndSnapshot(args, usage) {
133
- const pos = positionalArgs(args, FLAG_VALUES);
134
- if (pos.length === 1) return { projectId: resolveProjectId(null), snapshotId: pos[0] };
135
- if (pos.length === 2 && pos[0].startsWith("prj_")) return { projectId: pos[0], snapshotId: pos[1] };
136
- fail({ code: "BAD_USAGE", message: `Usage: ${usage}` });
128
+ // Canonical: `<snapshot-id> [--project <id>]`; legacy `<prj_id> <snapshot-id>`
129
+ // still works (requireRestPositional keeps a lone snapshot id that happens to
130
+ // start with prj_ from being eaten as the project selector).
131
+ const { projectId, rest } = resolveProjectSelector(args, { valueFlags: FLAG_VALUES, requireRestPositional: true });
132
+ const pos = positionalArgs(rest, FLAG_VALUES);
133
+ if (pos.length !== 1) fail({ code: "BAD_USAGE", message: `Usage: ${usage}` });
134
+ return { projectId, snapshotId: pos[0] };
137
135
  }
@@ -1,7 +1,7 @@
1
1
  import { resolveProject, resolveProjectId } from "./config.mjs";
2
2
  import { getSdk } from "./sdk.mjs";
3
3
  import { reportSdkError, fail } from "./sdk-errors.mjs";
4
- import { assertKnownFlags, flagValue, normalizeArgv, positionalArgs } from "./argparse.mjs";
4
+ import { assertKnownFlags, flagValue, normalizeArgv, positionalArgs, failUnknownSubcommand } from "./argparse.mjs";
5
5
  import { cliCommandAction } from "./next-actions.mjs";
6
6
 
7
7
  const HELP = `run402 subdomains — Manage custom subdomains
@@ -197,6 +197,6 @@ export async function run(sub, args) {
197
197
  case "delete": await deleteSubdomain(args); break;
198
198
  case "list": await list(args); break;
199
199
  default:
200
- fail({ code: "UNKNOWN_SUBCOMMAND", message: `Unknown subdomains subcommand: ${sub}`, hint: "Run `run402 subdomains --help` for usage.", details: { command: "subdomains", subcommand: sub } });
200
+ failUnknownSubcommand("subdomains", sub);
201
201
  }
202
202
  }
package/lib/tier.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { getSdk } from "./sdk.mjs";
2
2
  import { reportSdkError, fail } from "./sdk-errors.mjs";
3
- import { assertKnownFlags, normalizeArgv, positionalArgs, flagValue } from "./argparse.mjs";
3
+ import { assertKnownFlags, normalizeArgv, positionalArgs, flagValue, failUnknownSubcommand } from "./argparse.mjs";
4
4
  import { setTierAction } from "./next-actions.mjs";
5
5
 
6
6
  const HELP = `run402 tier — Manage your Run402 tier subscription
@@ -160,6 +160,6 @@ export async function run(sub, args) {
160
160
  case "status": await status(args); break;
161
161
  case "set": await set(args); break;
162
162
  default:
163
- fail({ code: "UNKNOWN_SUBCOMMAND", message: `Unknown tier subcommand: ${sub}`, hint: "Run `run402 tier --help` for usage.", details: { command: "tier", subcommand: sub } });
163
+ failUnknownSubcommand("tier", sub);
164
164
  }
165
165
  }
package/lib/transfer.mjs CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  normalizeArgv,
9
9
  parseIntegerFlag,
10
10
  positionalArgs,
11
+ failUnknownSubcommand,
11
12
  } from "./argparse.mjs";
12
13
 
13
14
  const HELP = `run402 transfer — Project transfer, one noun for wallet, email, and owned-org recipients
@@ -391,6 +392,6 @@ export async function run(sub, args) {
391
392
  await cancel(args);
392
393
  return;
393
394
  default:
394
- fail({ code: "UNKNOWN_SUBCOMMAND", message: `Unknown transfer subcommand: ${sub}`, hint: "Run `run402 transfer --help` for usage.", details: { command: "transfer", subcommand: sub } });
395
+ failUnknownSubcommand("transfer", sub);
395
396
  }
396
397
  }
package/lib/up.mjs CHANGED
@@ -72,7 +72,10 @@ Examples:
72
72
  run402 up --manifest run402.deploy.ts --require-plan pln_...
73
73
  `;
74
74
 
75
- const VERIFY_HELP = `run402 up verify — Rerun app manifest HTTP verification
75
+ const VERIFY_HELP = `run402 up verify — Rerun manifest HTTP verification (verify.http[])
76
+
77
+ Works for both app manifests (run402.json) and deploy manifests
78
+ (run402.deploy.json / app.json) that declare a top-level verify block.
76
79
 
77
80
  Usage:
78
81
  run402 up verify [repo-or-path] [--project <id>] [--manifest <path>] [--dir <path>] [--name <name>] [--human|--json-stream]
@@ -81,8 +84,9 @@ Options:
81
84
  repo-or-path Local app directory or public Git repository URL. Defaults
82
85
  to the current directory.
83
86
  --project <id> Existing project id. Defaults to .run402/project.json,
84
- run402.json project.id, then active project.
85
- --manifest <path> App manifest path. Defaults to run402.json.
87
+ manifest project id, then active project.
88
+ --manifest <path> Manifest path. Defaults to run402.json, then
89
+ run402.deploy.json, then app.json.
86
90
  --dir <path> Workspace directory to inspect (default: current dir).
87
91
  --name <name> Instance name used only to materialize templated public origins.
88
92
  --propagation-budget-s <n>
@@ -393,9 +397,11 @@ async function runVerify(args = []) {
393
397
  }
394
398
 
395
399
  export function shouldExitNonZeroForUpResult(result) {
396
- return result?.action === "up" &&
397
- result?.mode === "apply" &&
398
- result?.result?.app_result?.status === "deployed_unverified";
400
+ if (result?.action !== "up" || result?.mode !== "apply") return false;
401
+ if (result?.result?.app_result?.status === "deployed_unverified") return true;
402
+ // Deploy-manifest verify.http[]: a hard verify failure (not propagation)
403
+ // mirrors the app path's deployed_unverified exit semantics.
404
+ return result?.result?.verify?.status === "failed";
399
405
  }
400
406
 
401
407
  function parseExecutionMode(args) {
package/lib/wallets.mjs CHANGED
@@ -14,6 +14,7 @@
14
14
  */
15
15
 
16
16
  import { writeFileSync, readFileSync, existsSync, rmSync } from "node:fs";
17
+ import { failUnknownSubcommand } from "./argparse.mjs";
17
18
  import { join } from "node:path";
18
19
  import { fail } from "./sdk-errors.mjs";
19
20
  import { isValidProfileName, getActiveProfile } from "../core-dist/config.js";
@@ -42,7 +43,7 @@ Usage:
42
43
  run402 wallets current Show the resolved active wallet + how it was selected
43
44
  run402 wallets new <name> Create a new named wallet (key stays local)
44
45
  run402 wallets use <name> Set the global default wallet
45
- run402 wallets rename <old> <new> Rename a wallet (migrates the default's files when old=default)
46
+ run402 wallets rename <old> --to <new> Rename a wallet (legacy: rename <old> <new>)
46
47
  run402 wallets bind [<name>] Write ./.run402.json binding this directory to a wallet
47
48
  run402 wallets unbind Remove ./.run402.json
48
49
  run402 wallets import <name> --key <path|-> Adopt an existing private key as a named wallet
@@ -174,9 +175,10 @@ function cmdUse(args) {
174
175
  }
175
176
 
176
177
  async function cmdRename(args) {
177
- const positionals = args.filter((a) => a && !a.startsWith("-"));
178
+ const toFlag = flagVal(args, "--to");
179
+ const positionals = args.filter((a, i) => a && !a.startsWith("-") && args[i - 1] !== "--to");
178
180
  const oldName = requireName(positionals[0], "old wallet name");
179
- const newName = requireName(positionals[1], "new wallet name");
181
+ const newName = requireName(toFlag ?? positionals[1], "new wallet name");
180
182
  if (newName === DEFAULT) {
181
183
  fail({ code: "BAD_WALLET_NAME", message: "Cannot rename a wallet to the reserved name 'default'.", details: { name: newName } });
182
184
  }
@@ -339,11 +341,6 @@ export async function run(sub, args = []) {
339
341
  case "import": return cmdImport(rest);
340
342
  case "rm": return cmdRm(rest);
341
343
  default:
342
- fail({
343
- code: "UNKNOWN_SUBCOMMAND",
344
- message: `Unknown wallets subcommand: ${sub}`,
345
- hint: "Run `run402 wallets --help` for usage.",
346
- details: { command: "wallets", subcommand: sub },
347
- });
344
+ failUnknownSubcommand("wallets", sub);
348
345
  }
349
346
  }
@@ -8,8 +8,8 @@
8
8
 
9
9
  import { allowanceAuthHeaders } from "./config.mjs";
10
10
  import { getSdk } from "./sdk.mjs";
11
- import { reportSdkError, fail } from "./sdk-errors.mjs";
12
- import { assertKnownFlags, normalizeArgv } from "./argparse.mjs";
11
+ import { reportSdkError } from "./sdk-errors.mjs";
12
+ import { assertKnownFlags, normalizeArgv, failUnknownSubcommand } from "./argparse.mjs";
13
13
 
14
14
  const HELP = `run402 webhook-secret — Manage the operator webhook signing secret
15
15
 
@@ -34,12 +34,7 @@ export async function run(sub, args = []) {
34
34
  process.exit(0);
35
35
  }
36
36
  if (sub !== "rotate") {
37
- fail({
38
- code: "UNKNOWN_SUBCOMMAND",
39
- message: `Unknown webhook-secret subcommand: ${sub}`,
40
- hint: "Run `run402 webhook-secret --help` for usage.",
41
- details: { command: "webhook-secret", subcommand: sub },
42
- });
37
+ failUnknownSubcommand("webhook-secret", sub);
43
38
  }
44
39
  const parsedArgs = normalizeArgv(args);
45
40
  assertKnownFlags(parsedArgs, ["--help", "-h"]);
package/lib/webhooks.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { resolveProjectId } from "./config.mjs";
2
2
  import { getSdk } from "./sdk.mjs";
3
3
  import { reportSdkError, fail } from "./sdk-errors.mjs";
4
- import { assertKnownFlags, flagValue, normalizeArgv, positionalArgs, validateWebhookUrl } from "./argparse.mjs";
4
+ import { assertKnownFlags, flagValue, normalizeArgv, positionalArgs, validateWebhookUrl, failUnknownSubcommand } from "./argparse.mjs";
5
5
 
6
6
  const HELP = `run402 email webhooks — Manage mailbox webhooks
7
7
 
@@ -262,6 +262,6 @@ export async function run(sub, args) {
262
262
  case "deliveries": await deliveries(args); break;
263
263
  case "redrive": await redrive(args); break;
264
264
  default:
265
- fail({ code: "UNKNOWN_SUBCOMMAND", message: `Unknown webhooks action: ${sub}`, hint: "Run `run402 webhooks --help` for usage.", details: { command: "webhooks", subcommand: sub } });
265
+ failUnknownSubcommand("email webhooks", sub, { label: "webhooks" });
266
266
  }
267
267
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "run402",
3
- "version": "4.8.0",
3
+ "version": "4.10.0",
4
4
  "description": "CLI for Run402 — provision Postgres databases, deploy static sites, generate images, and manage wallets via x402 and MPP micropayments.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,5 +1,5 @@
1
1
  import type { DeployResult, PlanResponse, ReleaseSpec } from "./namespaces/deploy.types.js";
2
- import type { Run402AppInstallGraph, Run402AppUpResultEnvelope } from "./app-up.js";
2
+ import type { Run402AppInstallGraph, Run402AppInstallNodeStatus, Run402AppUpResultEnvelope, Run402AppUpVerifyResult } from "./app-up.js";
3
3
  import type { ProvisionResult } from "./namespaces/projects.types.js";
4
4
  import type { TierName, TierSetResult } from "./namespaces/tier.js";
5
5
  import type { Run402ExecutionMode } from "./config.js";
@@ -133,6 +133,18 @@ export interface Run402ActionResult<T = unknown> {
133
133
  steps: Run402ActionStep[];
134
134
  result?: T;
135
135
  }
136
+ /** One post-apply HTTP verification result entry (deploy-manifest `verify.http[]`).
137
+ * Same shape as `Run402AppUpResultEnvelope["verification"]["http"][number]`. */
138
+ export interface Run402UpVerificationHttpEntry {
139
+ id: string;
140
+ status: Run402AppInstallNodeStatus;
141
+ path?: string;
142
+ url?: string;
143
+ expected_status: number;
144
+ actual_status?: number | null;
145
+ propagation_wait_ms?: number;
146
+ diagnostic?: Record<string, unknown>;
147
+ }
136
148
  export interface Run402UpResult {
137
149
  project_id: string;
138
150
  manifest_path: string;
@@ -142,6 +154,13 @@ export interface Run402UpResult {
142
154
  spec?: ReleaseSpec;
143
155
  plan?: PlanResponse;
144
156
  deploy?: DeployResult;
157
+ /** Deploy-manifest `verify.http[]` per-check results (app manifests report
158
+ * the same shape under `app_result.verification.http[]`). */
159
+ verification?: {
160
+ http: Run402UpVerificationHttpEntry[];
161
+ };
162
+ /** Deploy-manifest verify rollup (app manifests: `app_result.verify`). */
163
+ verify?: Run402AppUpVerifyResult;
145
164
  }
146
165
  export type Run402ProjectsProvisionActionResult = Run402ActionResult<ProvisionResult>;
147
166
  export type Run402TierSetActionResult = Run402ActionResult<TierSetResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,iBAAiB,EAAE,oBAAoB;IACvC,OAAO,EAAE,UAAU;IACnB,EAAE,EAAE,IAAI;CACA,CAAC"}
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,iBAAiB,EAAE,oBAAoB;IACvC,OAAO,EAAE,UAAU;IACnB,EAAE,EAAE,IAAI;CACA,CAAC"}
@@ -103,7 +103,8 @@ export declare class Projects {
103
103
  * constraints, and RLS policies.
104
104
  */
105
105
  getSchema(id: string): Promise<SchemaReport>;
106
- /** Run SQL against the project's database using the service key. */
106
+ /** Run SQL against the project's database using the service key. Returns
107
+ * the gateway envelope verbatim: `{ status, schema, rows, row_count, fields }`. */
107
108
  sql(id: string, sql: string, params?: unknown[]): Promise<unknown>;
108
109
  /** Query or mutate a project table through PostgREST. */
109
110
  rest<T = unknown>(id: string, table: string, queryOrOptions?: string | ProjectRestOptions): Promise<T>;