run402 3.8.3 → 4.0.1

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.
@@ -1,214 +1,36 @@
1
- import { resolveProjectId } from "./config.mjs";
2
- import { getSdk } from "./sdk.mjs";
3
- import { reportSdkError, fail } from "./sdk-errors.mjs";
4
- import { assertKnownFlags, flagValue, normalizeArgv, positionalArgs } from "./argparse.mjs";
1
+ import { fail } from "./sdk-errors.mjs";
5
2
 
6
- const HELP = `run402 sender-domain — Manage custom email sender domain
3
+ const HELP = `run402 sender-domain — removed
7
4
 
8
5
  Usage:
9
- run402 sender-domain <subcommand> [args...]
6
+ run402 sender-domain --help
10
7
 
11
- Subcommands:
12
- register <domain> [--project <id>] Register a custom sender domain (returns DNS records)
13
- status [--project <id>] Check domain verification status
14
- remove [--project <id>] Remove custom sender domain
15
- inbound-enable <domain> [--project <id>] Enable inbound email (requires DKIM-verified)
16
- inbound-disable <domain> [--project <id>] Disable inbound email
8
+ The split sender-domain workflow has been replaced by ProjectDomain:
17
9
 
18
- Examples:
19
- run402 sender-domain register kysigned.com
20
- run402 sender-domain status
21
- run402 sender-domain remove
22
- run402 sender-domain inbound-enable kysigned.com
23
- run402 sender-domain inbound-disable kysigned.com
10
+ run402 domains connect <domain> --project <id> --email-send --email-receive --mailbox-addresses primary --addresses info
11
+ run402 domains status <domain> --project <id>
12
+ run402 domains repair <domain> --project <id>
24
13
  `;
25
14
 
26
- const SUB_HELP = {
27
- register: `run402 sender-domain register Register a custom sender domain
28
-
29
- Usage:
30
- run402 sender-domain register <domain> [--project <id>]
31
-
32
- Arguments:
33
- <domain> Custom sender domain (e.g. kysigned.com)
34
-
35
- Options:
36
- --project <id> Project ID (defaults to the active project)
37
-
38
- Notes:
39
- - Returns DNS records (DKIM, SPF, DMARC) to add at your DNS provider
40
- - Use 'run402 sender-domain status' to poll until verified
41
-
42
- Examples:
43
- run402 sender-domain register kysigned.com
44
- run402 sender-domain register kysigned.com --project prj_abc123
45
- `,
46
- status: `run402 sender-domain status — Check verification status of the project's sender domain
47
-
48
- Usage:
49
- run402 sender-domain status [--project <id>]
50
-
51
- Options:
52
- --project <id> Project ID (defaults to the active project)
53
-
54
- Examples:
55
- run402 sender-domain status
56
- run402 sender-domain status --project prj_abc123
57
- `,
58
- remove: `run402 sender-domain remove — Remove the project's custom sender domain
59
-
60
- Usage:
61
- run402 sender-domain remove [--project <id>]
62
-
63
- Options:
64
- --project <id> Project ID (defaults to the active project)
65
-
66
- Examples:
67
- run402 sender-domain remove
68
- run402 sender-domain remove --project prj_abc123
69
- `,
70
- "inbound-enable": `run402 sender-domain inbound-enable — Enable inbound email for a sender domain
71
-
72
- Usage:
73
- run402 sender-domain inbound-enable <domain> [--project <id>]
74
-
75
- Arguments:
76
- <domain> Custom sender domain to enable inbound on
77
-
78
- Options:
79
- --project <id> Project ID (defaults to the active project)
80
-
81
- Notes:
82
- - Requires the domain to be DKIM-verified first
83
-
84
- Examples:
85
- run402 sender-domain inbound-enable kysigned.com
86
- `,
87
- "inbound-disable": `run402 sender-domain inbound-disable — Disable inbound email for a sender domain
88
-
89
- Usage:
90
- run402 sender-domain inbound-disable <domain> [--project <id>]
91
-
92
- Arguments:
93
- <domain> Custom sender domain to disable inbound on
94
-
95
- Options:
96
- --project <id> Project ID (defaults to the active project)
97
-
98
- Examples:
99
- run402 sender-domain inbound-disable kysigned.com
100
- `,
101
- };
102
-
103
- function parseFlag(args, flag) {
104
- return flagValue(normalizeArgv(args), flag);
105
- }
106
-
107
- async function register(args) {
108
- const parsedArgs = normalizeArgv(args);
109
- const valueFlags = ["--project"];
110
- assertKnownFlags(parsedArgs, [...valueFlags, "--help", "-h"], valueFlags);
111
- const positionals = positionalArgs(parsedArgs, valueFlags);
112
- let domain = positionals[0] ?? null;
113
- let projectOpt = flagValue(parsedArgs, "--project");
114
- if (positionals.length > 1) {
115
- fail({ code: "BAD_USAGE", message: `Unexpected argument for sender-domain register: ${positionals[1]}` });
116
- }
117
- const projectId = resolveProjectId(projectOpt);
118
-
119
- if (!domain) {
120
- fail({
121
- code: "BAD_USAGE",
122
- message: "Missing domain.",
123
- hint: "run402 sender-domain register <domain>",
124
- });
125
- }
126
-
127
- try {
128
- const data = await getSdk().senderDomain.register(projectId, domain);
129
- console.log(JSON.stringify(data, null, 2));
130
- } catch (err) {
131
- reportSdkError(err);
132
- }
133
- }
134
-
135
- async function status(args) {
136
- const parsedArgs = normalizeArgv(args);
137
- const valueFlags = ["--project"];
138
- assertKnownFlags(parsedArgs, [...valueFlags, "--help", "-h"], valueFlags);
139
- const extra = positionalArgs(parsedArgs, valueFlags);
140
- if (extra.length > 0) {
141
- fail({ code: "BAD_USAGE", message: `Unexpected argument for sender-domain status: ${extra[0]}` });
142
- }
143
- const projectId = resolveProjectId(parseFlag(args, "--project"));
144
- try {
145
- const data = await getSdk().senderDomain.status(projectId);
146
- console.log(JSON.stringify(data, null, 2));
147
- } catch (err) {
148
- reportSdkError(err);
149
- }
15
+ function replacementFor(sub) {
16
+ if (sub === "status") return "run402 domains status <domain> --project <id>";
17
+ if (sub === "remove") return "run402 domains disconnect <domain> --project <id> --confirm";
18
+ if (sub === "inbound-enable") return "run402 domains connect <domain> --project <id> --email-receive";
19
+ if (sub === "inbound-disable") return "run402 domains disconnect <domain> --project <id> --confirm";
20
+ return "run402 domains connect <domain> --project <id> --email-send";
150
21
  }
151
22
 
152
- async function remove(args) {
153
- const parsedArgs = normalizeArgv(args);
154
- const valueFlags = ["--project"];
155
- assertKnownFlags(parsedArgs, [...valueFlags, "--help", "-h"], valueFlags);
156
- const extra = positionalArgs(parsedArgs, valueFlags);
157
- if (extra.length > 0) {
158
- fail({ code: "BAD_USAGE", message: `Unexpected argument for sender-domain remove: ${extra[0]}` });
159
- }
160
- const projectId = resolveProjectId(parseFlag(args, "--project"));
161
- try {
162
- await getSdk().senderDomain.remove(projectId);
163
- console.log(JSON.stringify({ project_id: projectId, removed: true }));
164
- } catch (err) {
165
- reportSdkError(err);
166
- }
167
- }
168
-
169
- async function inboundToggle(action, args) {
170
- const parsedArgs = normalizeArgv(args);
171
- const valueFlags = ["--project"];
172
- assertKnownFlags(parsedArgs, [...valueFlags, "--help", "-h"], valueFlags);
173
- const positionals = positionalArgs(parsedArgs, valueFlags);
174
- let domain = positionals[0] ?? null;
175
- let projectOpt = flagValue(parsedArgs, "--project");
176
- if (positionals.length > 1) {
177
- fail({ code: "BAD_USAGE", message: `Unexpected argument for sender-domain inbound-${action}: ${positionals[1]}` });
178
- }
179
- const projectId = resolveProjectId(projectOpt);
180
-
181
- if (!domain) {
182
- fail({
183
- code: "BAD_USAGE",
184
- message: "Missing domain.",
185
- hint: `run402 sender-domain inbound-${action} <domain>`,
186
- });
187
- }
188
-
189
- try {
190
- if (action === "enable") {
191
- const data = await getSdk().senderDomain.enableInbound(projectId, domain);
192
- console.log(JSON.stringify(data, null, 2));
193
- } else {
194
- await getSdk().senderDomain.disableInbound(projectId, domain);
195
- console.log(JSON.stringify({ project_id: projectId, domain, inbound_enabled: false }));
196
- }
197
- } catch (err) {
198
- reportSdkError(err);
199
- }
200
- }
201
-
202
- export async function run(sub, args) {
203
- if (!sub || sub === "--help" || sub === "-h") { console.log(HELP); process.exit(0); }
204
- if (Array.isArray(args) && (args.includes("--help") || args.includes("-h"))) { console.log(SUB_HELP[sub] || HELP); process.exit(0); }
205
- switch (sub) {
206
- case "register": await register(args); break;
207
- case "status": await status(args); break;
208
- case "remove": await remove(args); break;
209
- case "inbound-enable": await inboundToggle("enable", args); break;
210
- case "inbound-disable": await inboundToggle("disable", args); break;
211
- default:
212
- fail({ code: "UNKNOWN_SUBCOMMAND", message: `Unknown sender-domain subcommand: ${sub}`, hint: "Run `run402 sender-domain --help` for usage.", details: { command: "sender-domain", subcommand: sub } });
213
- }
23
+ export async function run(sub) {
24
+ if (!sub || sub === "--help" || sub === "-h") {
25
+ console.log(HELP);
26
+ process.exit(0);
27
+ }
28
+ const command = `run402 sender-domain ${sub}`;
29
+ const replacement = replacementFor(sub);
30
+ fail({
31
+ code: "COMMAND_REMOVED",
32
+ message: `${command} has been removed. Use ProjectDomain via ${replacement}.`,
33
+ details: { command, replacement },
34
+ next_actions: [{ type: "use_replacement_command", command: replacement }],
35
+ });
214
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "run402",
3
- "version": "3.8.3",
3
+ "version": "4.0.1",
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": {
@@ -17,8 +17,22 @@ export interface Run402DirConfigOptions {
17
17
  ignore?: ReadonlyArray<string>;
18
18
  includeSensitive?: boolean;
19
19
  }
20
- export interface Run402SqlFileConfigOptions {
20
+ export type Run402SqlFileConfigOptions = {
21
21
  id?: string;
22
+ name?: never;
23
+ checksum?: string;
24
+ transaction?: "required" | "none";
25
+ } | {
26
+ /** Content-tracked migration name. The SDK compiles this to
27
+ * `<name>_<sha256(sql)[0:16]>`; SQL MUST be idempotent because changed
28
+ * content applies again against a database with prior versions. */
29
+ name: string;
30
+ id?: never;
31
+ checksum?: string;
32
+ transaction?: "required" | "none";
33
+ };
34
+ export interface Run402SqlFileConfigBaseMigration {
35
+ sql_file: string;
22
36
  checksum?: string;
23
37
  transaction?: "required" | "none";
24
38
  }
@@ -42,12 +56,15 @@ export interface Run402EmailTriggerOptions {
42
56
  export interface Run402FileConfigSource extends FsFileSource {
43
57
  readonly content_type?: string;
44
58
  }
45
- export interface Run402SqlFileConfigMigration {
59
+ export interface Run402SqlFileConfigIdMigration extends Run402SqlFileConfigBaseMigration {
46
60
  id: string;
47
- sql_file: string;
48
- checksum?: string;
49
- transaction?: "required" | "none";
61
+ name?: never;
62
+ }
63
+ export interface Run402SqlFileConfigNameMigration extends Run402SqlFileConfigBaseMigration {
64
+ name: string;
65
+ id?: never;
50
66
  }
67
+ export type Run402SqlFileConfigMigration = Run402SqlFileConfigIdMigration | Run402SqlFileConfigNameMigration;
51
68
  export type Run402ReleaseConfig = Omit<ReleaseSpec, "project"> & {
52
69
  project?: string;
53
70
  project_id?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -23,8 +23,13 @@ export function file(path, options = {}) {
23
23
  };
24
24
  }
25
25
  export function sqlFile(path, options = {}) {
26
+ if (options.id !== undefined && options.name !== undefined) {
27
+ throw new TypeError("sqlFile options must use either id or name, not both.");
28
+ }
26
29
  return {
27
- id: options.id ?? defaultIdFromPath(path),
30
+ ...(options.name !== undefined
31
+ ? { name: options.name }
32
+ : { id: options.id ?? defaultIdFromPath(path) }),
28
33
  sql_file: path,
29
34
  ...(options.checksum !== undefined ? { checksum: options.checksum } : {}),
30
35
  ...(options.transaction !== undefined ? { transaction: options.transaction } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1960,7 +1960,7 @@ const DEPLOYABLE_SPEC_FIELDS = [
1960
1960
  ];
1961
1961
  const BASE_SPEC_FIELDS = new Set(["release", "release_id"]);
1962
1962
  const DATABASE_SPEC_FIELDS = new Set(["migrations", "expose", "zero_downtime"]);
1963
- const MIGRATION_SPEC_FIELDS = new Set(["id", "checksum", "sql", "sql_ref", "transaction"]);
1963
+ const MIGRATION_SPEC_FIELDS = new Set(["id", "name", "checksum", "sql", "sql_ref", "transaction"]);
1964
1964
  const FUNCTIONS_SPEC_FIELDS = new Set(["replace", "patch"]);
1965
1965
  const FUNCTIONS_PATCH_FIELDS = new Set(["set", "delete"]);
1966
1966
  const FUNCTION_SPEC_FIELDS = new Set([
@@ -1995,6 +1995,7 @@ const I18N_LOCALE_TAG_REGEX = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
1995
1995
  const I18N_COOKIE_NAME_REGEX = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
1996
1996
  const I18N_MAX_LOCALES = 50;
1997
1997
  const I18N_MAX_DETECT_SOURCES = 10;
1998
+ const MIGRATION_NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;
1998
1999
  function validateSpec(spec) {
1999
2000
  if (!spec || typeof spec !== "object") {
2000
2001
  throw new Run402DeployError("ReleaseSpec must be an object", {
@@ -2072,15 +2073,38 @@ function validateDatabaseSpec(database) {
2072
2073
  if (!Array.isArray(obj.migrations)) {
2073
2074
  throw invalidSpec("ReleaseSpec.database.migrations must be an array", "database.migrations");
2074
2075
  }
2076
+ const seenNames = new Map();
2075
2077
  for (const [index, migration] of obj.migrations.entries()) {
2076
2078
  const m = requireObject(migration, `database.migrations.${index}`);
2077
2079
  validateKnownFields(m, `database.migrations.${index}`, MIGRATION_SPEC_FIELDS);
2080
+ validateMigrationIdentity(m, index, seenNames);
2078
2081
  }
2079
2082
  }
2080
2083
  if (obj.expose !== undefined) {
2081
2084
  requireObject(obj.expose, "database.expose");
2082
2085
  }
2083
2086
  }
2087
+ function validateMigrationIdentity(migration, index, seenNames) {
2088
+ const resource = `database.migrations.${index}`;
2089
+ const hasId = hasOwn(migration, "id") && migration.id !== undefined;
2090
+ const hasName = hasOwn(migration, "name") && migration.name !== undefined;
2091
+ if (hasId && hasName) {
2092
+ throw invalidSpec(`ReleaseSpec.${resource} declares both id and name; use exactly one`, resource);
2093
+ }
2094
+ if (!hasId && !hasName) {
2095
+ throw invalidSpec(`ReleaseSpec.${resource} must declare exactly one of id or name`, resource);
2096
+ }
2097
+ if (hasName) {
2098
+ if (typeof migration.name !== "string" || !MIGRATION_NAME_RE.test(migration.name)) {
2099
+ throw invalidSpec(`ReleaseSpec.${resource}.name must match /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/`, `${resource}.name`);
2100
+ }
2101
+ const firstIndex = seenNames.get(migration.name);
2102
+ if (firstIndex !== undefined) {
2103
+ throw invalidSpec(`ReleaseSpec.${resource}.name duplicates database.migrations.${firstIndex}.name ${JSON.stringify(migration.name)}`, `${resource}.name`);
2104
+ }
2105
+ seenNames.set(migration.name, index);
2106
+ }
2107
+ }
2084
2108
  function validateFunctionsSpec(functions) {
2085
2109
  if (functions === undefined)
2086
2110
  return;
@@ -3021,6 +3045,7 @@ async function normalizeReleaseSpec(client, spec, opts = {}) {
3021
3045
  }
3022
3046
  if (spec.database.migrations && spec.database.migrations.length > 0) {
3023
3047
  db.migrations = await Promise.all(spec.database.migrations.map(async (m) => normalizeMigration(client, spec.project, m, rememberRelease, opts)));
3048
+ assertUniqueMigrationIds(db.migrations);
3024
3049
  }
3025
3050
  normalized.database = db;
3026
3051
  }
@@ -3438,8 +3463,10 @@ async function normalizeAssetSlice(slice, remember) {
3438
3463
  return out;
3439
3464
  }
3440
3465
  async function normalizeMigration(client, projectId, m, remember, opts = {}) {
3441
- if (!m.id) {
3442
- throw new Run402DeployError("MigrationSpec.id is required", {
3466
+ const originalId = "id" in m ? m.id : undefined;
3467
+ const name = "name" in m ? m.name : undefined;
3468
+ if (!originalId && !name) {
3469
+ throw new Run402DeployError("MigrationSpec.id or MigrationSpec.name is required", {
3443
3470
  code: "INVALID_SPEC",
3444
3471
  phase: "validate",
3445
3472
  resource: "database.migrations",
@@ -3451,37 +3478,42 @@ async function normalizeMigration(client, projectId, m, remember, opts = {}) {
3451
3478
  let sql_ref;
3452
3479
  let sql;
3453
3480
  let checksum;
3481
+ let contentHash;
3482
+ const identityLabel = originalId ?? name ?? "<unknown>";
3454
3483
  if (m.sql_ref) {
3455
3484
  sql_ref = m.sql_ref;
3485
+ contentHash = m.sql_ref.sha256;
3456
3486
  checksum = m.checksum ?? m.sql_ref.sha256;
3457
3487
  }
3458
3488
  else if (m.sql !== undefined) {
3459
3489
  const bytes = new TextEncoder().encode(m.sql);
3460
3490
  const sha256 = await sha256Hex(bytes);
3491
+ contentHash = sha256;
3461
3492
  if (opts.inlineMigrationSql) {
3462
3493
  sql = m.sql;
3463
3494
  }
3464
3495
  else {
3465
3496
  const ref = { sha256, size: bytes.byteLength, contentType: "application/sql" };
3466
- remember({ ref, reader: makeBytesReader(bytes, `migration:${m.id}`) });
3497
+ remember({ ref, reader: makeBytesReader(bytes, `migration:${identityLabel}`) });
3467
3498
  sql_ref = ref;
3468
3499
  }
3469
3500
  checksum = m.checksum ?? sha256;
3470
3501
  }
3471
3502
  else {
3472
- throw new Run402DeployError(`MigrationSpec ${m.id} must include sql or sql_ref`, {
3503
+ throw new Run402DeployError(`MigrationSpec ${identityLabel} must include sql or sql_ref`, {
3473
3504
  code: "INVALID_SPEC",
3474
3505
  phase: "validate",
3475
- resource: `database.migrations.${m.id}`,
3506
+ resource: `database.migrations.${identityLabel}`,
3476
3507
  retryable: false,
3477
3508
  fix: {
3478
3509
  action: "set_field",
3479
- path: `database.migrations.${m.id}.sql`,
3510
+ path: `database.migrations.${identityLabel}.sql`,
3480
3511
  },
3481
3512
  context: "validating spec",
3482
3513
  });
3483
3514
  }
3484
- const out = { id: m.id, checksum };
3515
+ const id = originalId ?? `${name}_${contentHash.slice(0, 16)}`;
3516
+ const out = { id, checksum };
3485
3517
  if (sql_ref)
3486
3518
  out.sql_ref = sql_ref;
3487
3519
  if (sql !== undefined)
@@ -3493,6 +3525,23 @@ async function normalizeMigration(client, projectId, m, remember, opts = {}) {
3493
3525
  void client;
3494
3526
  void projectId;
3495
3527
  }
3528
+ function assertUniqueMigrationIds(migrations) {
3529
+ const seen = new Map();
3530
+ for (const [index, migration] of migrations.entries()) {
3531
+ const firstIndex = seen.get(migration.id);
3532
+ if (firstIndex !== undefined) {
3533
+ throw new Run402DeployError(`ReleaseSpec.database.migrations.${index}.id duplicates database.migrations.${firstIndex}.id ${JSON.stringify(migration.id)}`, {
3534
+ code: "INVALID_SPEC",
3535
+ phase: "validate",
3536
+ resource: `database.migrations.${index}.id`,
3537
+ retryable: false,
3538
+ fix: { action: "set_field", path: `database.migrations.${index}.id` },
3539
+ context: "validating spec",
3540
+ });
3541
+ }
3542
+ seen.set(migration.id, index);
3543
+ }
3544
+ }
3496
3545
  // ─── Content source resolution ───────────────────────────────────────────────
3497
3546
  async function resolveContent(source, label) {
3498
3547
  // Pre-resolved ContentRef — pass through, no reader needed (caller is