siteplane 0.1.50 → 0.1.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,6 +10,17 @@ policies and check real rendered images after the change. This preparation does
10
10
  Public Siteplane CLI for connected-site setup, field synchronization, Analytics
11
11
  instrumentation and Booking integration.
12
12
 
13
+ ## Controlled guest review
14
+
15
+ After a controlled accountless setup reaches `ready_for_review`, run `siteplane setup review`
16
+ in the same website repository. Its protected local installation key opens access to that project's
17
+ saved review without creating another site or deployment. Give the one-time link to the user;
18
+ they choose **Open review** in their own browser. Do not consume the link on their behalf.
19
+ Issue a fresh link only when needed. The URL fragment is a short-lived credential, so do not
20
+ write it to source, documentation, analytics or shared logs. Guest review can organize and finish
21
+ the setup; activation and account ownership require the later claim step. This entry remains
22
+ controlled while Batch 3 is being completed.
23
+
13
24
  ## Initial setup
14
25
 
15
26
  Copy the setup prompt in Siteplane, then run its exact one-time command in the
@@ -72,8 +83,8 @@ Before starting, add `.siteplane/credentials.json` to the repository’s `.gitig
72
83
  unprotected credentials before any provisioning request.
73
84
 
74
85
  ```bash
75
- npx -y siteplane@0.1.50 setup start --modules editing --instructions-file instructions.txt
76
- npx -y siteplane@0.1.50 setup context
86
+ npx -y siteplane@0.1.51 setup start --modules editing --instructions-file instructions.txt
87
+ npx -y siteplane@0.1.51 setup context
77
88
  ```
78
89
 
79
90
  Start performs read-only preflight and saves the installation key and original request privately before the
@@ -1934,6 +1934,18 @@ var fieldBridgeIdentitySchema = z17.object({
1934
1934
  fieldContractHash: canonicalFieldContractHashSchema,
1935
1935
  deploymentRevision: z17.string().trim().min(1).max(256)
1936
1936
  }).strict();
1937
+ var setupPreviewAccessSchema = z17.object({
1938
+ capability: z17.string().regex(/^v1\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{43}$/u).max(4096),
1939
+ expiresAt: z17.string().datetime()
1940
+ }).strict();
1941
+ var setupPreviewReadSchema = fieldBridgeIdentitySchema.extend({
1942
+ scope: z17.literal("setup_preview"),
1943
+ siteId: z17.string().uuid(),
1944
+ runId: z17.string().uuid(),
1945
+ bridgeSessionId: z17.string().min(1),
1946
+ expiresAt: z17.string().datetime(),
1947
+ contract: siteFieldContractV1Schema
1948
+ }).strict();
1937
1949
  var fieldBridgeBaseSchema = z17.object({
1938
1950
  version: z17.literal(BRIDGE_PROTOCOL_VERSION),
1939
1951
  type: z17.enum(FIELD_BRIDGE_MESSAGE_TYPES),
@@ -1961,7 +1973,8 @@ var fieldBridgeInitMessageSchema = fieldBridgeBaseSchema.extend({
1961
1973
  payload: z17.object({
1962
1974
  adminOrigin: z17.string().url(),
1963
1975
  customerOrigin: z17.string().url(),
1964
- renderedPath: realRenderedPathSchema
1976
+ renderedPath: realRenderedPathSchema,
1977
+ setupPreview: setupPreviewAccessSchema.optional()
1965
1978
  }).strict()
1966
1979
  });
1967
1980
  var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
@@ -1974,7 +1987,7 @@ var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
1974
1987
  z17.literal("preview_values"),
1975
1988
  z17.literal("field_evidence"),
1976
1989
  z17.literal("visual_field_control")
1977
- ]).rest(z17.literal("analytics_preview_readiness")).refine((capabilities) => capabilities.length <= 5)
1990
+ ]).rest(z17.enum(["analytics_preview_readiness", "setup_preview"])).refine((capabilities) => capabilities.length <= 6)
1978
1991
  }).strict()
1979
1992
  });
1980
1993
  var fieldBridgeFieldsMessageSchema = fieldBridgeBaseSchema.extend({
@@ -3880,7 +3893,7 @@ async function inspectSetupLocalProject(projectDir) {
3880
3893
  fail("package_manager_conflict", "Application and workspace packageManager declarations disagree.");
3881
3894
  if (declared && !new RegExp(`^${name2}@\\d+\\.\\d+\\.\\d+$`, "u").test(declared))
3882
3895
  fail("package_manager_conflict", "Declare an exact supported npm/pnpm packageManager version matching the canonical lockfile.");
3883
- const localVersion = (await setupProcess(declared ? "npx" : name2, declared ? ["--yes", declared, "--version"] : ["--version"], { cwd: lockfileRoot })).trim();
3896
+ const localVersion = (await setupProcess(declared ? "npx" : name2, declared ? ["--yes", "--package", declared, name2, "--version"] : ["--version"], { cwd: lockfileRoot })).trim();
3884
3897
  if (!(name2 === "npm" ? stable(localVersion, 10) : stable(localVersion, 9) || stable(localVersion, 10)))
3885
3898
  fail("unsupported_package_manager_version", "Use npm 10 or pnpm 9/10; other versions are outside the initial setup support range.");
3886
3899
  if (declared && declared !== `${name2}@${localVersion}`)
@@ -5296,6 +5309,79 @@ async function exists2(path) {
5296
5309
  }
5297
5310
  }
5298
5311
 
5312
+ // ../cli/dist/commands/setup-review.js
5313
+ import { z as z36 } from "zod";
5314
+ var responseSchema2 = z36.object({
5315
+ ok: z36.literal(true),
5316
+ data: z36.object({
5317
+ reviewUrl: z36.string().url(),
5318
+ expiresAt: z36.string().datetime({ offset: true })
5319
+ }).strict()
5320
+ }).strict();
5321
+ async function setupReviewCommand(input) {
5322
+ const [config, credentials] = await Promise.all([
5323
+ readProjectConfig(input.projectDir),
5324
+ readLocalCredentials(input.projectDir)
5325
+ ]);
5326
+ if (!credentials.installation)
5327
+ return {
5328
+ status: "action_required",
5329
+ code: "local_installation_missing",
5330
+ message: "Open this project's review from your Siteplane workspace. Guest review requires the original local installation credentials."
5331
+ };
5332
+ if (new URL(config.apiBaseUrl).origin !== new URL(credentials.installation.apiBaseUrl).origin)
5333
+ return {
5334
+ status: "action_required",
5335
+ code: "installation_origin_mismatch",
5336
+ message: "The project and its local installation refer to different Siteplane origins. Restore the matching local configuration."
5337
+ };
5338
+ try {
5339
+ const response = await (input.fetcher ?? fetch)(new URL("/api/cli/setup/review", config.apiBaseUrl), {
5340
+ method: "POST",
5341
+ signal: AbortSignal.timeout(2e4),
5342
+ headers: {
5343
+ authorization: `Bearer ${credentials.installation.key}`,
5344
+ "content-type": "application/json",
5345
+ ...input.vercelAutomationBypassSecret ? {
5346
+ "x-vercel-protection-bypass": input.vercelAutomationBypassSecret
5347
+ } : {}
5348
+ },
5349
+ body: JSON.stringify({ siteId: config.siteId, runId: config.runId })
5350
+ });
5351
+ const payload = await response.json();
5352
+ const parsed = responseSchema2.safeParse(payload);
5353
+ if (response.ok && parsed.success) {
5354
+ const url = new URL(parsed.data.data.reviewUrl);
5355
+ if (url.origin !== new URL(config.apiBaseUrl).origin || url.pathname !== "/setup/review" || url.search || !/^#token=[A-Za-z0-9_-]{43}$/u.test(url.hash))
5356
+ throw new Error("Invalid review destination.");
5357
+ return { status: "ready", ...parsed.data.data };
5358
+ }
5359
+ const denied = z36.object({
5360
+ error: z36.object({
5361
+ code: z36.enum([
5362
+ "invalid_installation",
5363
+ "already_claimed",
5364
+ "project_expired",
5365
+ "review_not_ready",
5366
+ "rate_limited",
5367
+ "review_access_unavailable"
5368
+ ])
5369
+ })
5370
+ }).safeParse(payload);
5371
+ return {
5372
+ status: "action_required",
5373
+ code: denied.success ? denied.data.error.code : "review_access_unavailable",
5374
+ message: "The review link is unavailable. Check the existing setup status; do not create another project."
5375
+ };
5376
+ } catch {
5377
+ return {
5378
+ status: "action_required",
5379
+ code: "review_access_unavailable",
5380
+ message: "The review link request was not acknowledged. Run setup review again when the connection is available."
5381
+ };
5382
+ }
5383
+ }
5384
+
5299
5385
  // ../cli/dist/commands/setup-prepare.js
5300
5386
  import { access as access5, lstat as lstat2, mkdir as mkdir6, open as open3, readFile as readFile10, rename as rename3, rm as rm3 } from "fs/promises";
5301
5387
  import { randomUUID as randomUUID5 } from "crypto";
@@ -5461,7 +5547,7 @@ Run setup context for the current user instructions and authorized modules. Keep
5461
5547
  }));
5462
5548
  const packageManifest = JSON.parse(await readFile10(join10(directory, "package.json"), "utf8"));
5463
5549
  const pm = preflight.local.packageManager;
5464
- const command = (args) => setupProcess("npx", ["--yes", `${pm.name}@${pm.version}`, ...args], {
5550
+ const command = (args) => setupProcess("npx", ["--yes", "--package", `${pm.name}@${pm.version}`, pm.name, ...args], {
5465
5551
  cwd: directory,
5466
5552
  timeoutMs: 3e5
5467
5553
  });
@@ -5570,8 +5656,8 @@ async function assertSourcePath(root, target) {
5570
5656
  import { randomUUID as randomUUID6 } from "crypto";
5571
5657
  import { lstat as lstat3, mkdir as mkdir7, open as open4, readFile as readFile11, rm as rm4, rmdir } from "fs/promises";
5572
5658
  import { resolve as resolve2 } from "path";
5573
- import { z as z36 } from "zod";
5574
- var ownerSchema = z36.object({ pid: z36.number().int().positive(), nonce: z36.string().uuid() }).strict();
5659
+ import { z as z37 } from "zod";
5660
+ var ownerSchema = z37.object({ pid: z37.number().int().positive(), nonce: z37.string().uuid() }).strict();
5575
5661
  async function withSetupLock(projectDir, work) {
5576
5662
  const gitPath = (await setupProcess("git", ["rev-parse", "--git-path", "siteplane-setup.lock"], { cwd: projectDir })).trim();
5577
5663
  const path = resolve2(projectDir, gitPath);
@@ -5635,23 +5721,23 @@ import { execFile as execFile3 } from "child_process";
5635
5721
  import { lstat as lstat4, readFile as readFile12, writeFile as writeFile5, mkdir as mkdir8 } from "fs/promises";
5636
5722
  import { dirname as dirname8, isAbsolute as isAbsolute2, join as join11, relative as relative7, resolve as resolve3, sep as sep3 } from "path";
5637
5723
  import { isDeepStrictEqual, promisify as promisify3 } from "util";
5638
- import { z as z37 } from "zod";
5724
+ import { z as z38 } from "zod";
5639
5725
  var execute = promisify3(execFile3);
5640
5726
  var name = ".siteplane/build-source.json";
5641
- var oid = z37.string().regex(/^[0-9a-f]{40}$/u);
5642
- var entrySchema = z37.object({
5643
- path: z37.string().min(1).max(4096),
5644
- mode: z37.enum(["100644", "100755", "120000"]),
5727
+ var oid = z38.string().regex(/^[0-9a-f]{40}$/u);
5728
+ var entrySchema = z38.object({
5729
+ path: z38.string().min(1).max(4096),
5730
+ mode: z38.enum(["100644", "100755", "120000"]),
5645
5731
  oid
5646
5732
  }).strict();
5647
- var schema = z37.object({
5648
- version: z37.literal(2),
5733
+ var schema = z38.object({
5734
+ version: z38.literal(2),
5649
5735
  revision: oid,
5650
- commit: z37.string().min(1).max(1048576),
5651
- entries: z37.array(entrySchema).min(1).max(1e5),
5652
- providerConfigurations: z37.array(z37.object({
5653
- path: z37.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
5654
- source: z37.string().max(1048576)
5736
+ commit: z38.string().min(1).max(1048576),
5737
+ entries: z38.array(entrySchema).min(1).max(1e5),
5738
+ providerConfigurations: z38.array(z38.object({
5739
+ path: z38.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
5740
+ source: z38.string().max(1048576)
5655
5741
  }).strict()).max(1e3)
5656
5742
  }).strict();
5657
5743
  async function writeBuildProvenance(checkout, revision) {
@@ -5700,38 +5786,38 @@ import { createHash as createHash4, randomBytes as randomBytes2, randomUUID as r
5700
5786
  import { access as access6, mkdir as mkdir9, mkdtemp, rm as rm5, writeFile as writeFile6 } from "fs/promises";
5701
5787
  import { tmpdir } from "os";
5702
5788
  import { join as join12 } from "path";
5703
- import { z as z38 } from "zod";
5704
- var envSchema = z38.object({
5705
- id: z38.string(),
5706
- key: z38.string(),
5707
- target: z38.array(z38.string()),
5708
- type: z38.string(),
5709
- comment: z38.string().optional(),
5710
- updatedAt: z38.number().optional()
5789
+ import { z as z39 } from "zod";
5790
+ var envSchema = z39.object({
5791
+ id: z39.string(),
5792
+ key: z39.string(),
5793
+ target: z39.array(z39.string()),
5794
+ type: z39.string(),
5795
+ comment: z39.string().optional(),
5796
+ updatedAt: z39.number().optional()
5711
5797
  });
5712
- var deploymentSchema = z38.object({
5713
- id: z38.string(),
5714
- projectId: z38.string(),
5715
- ownerId: z38.string().optional(),
5716
- target: z38.string().nullable(),
5717
- readyState: z38.string(),
5718
- createdAt: z38.number(),
5719
- url: z38.string(),
5720
- meta: z38.record(z38.string(), z38.unknown()).optional(),
5721
- gitSource: z38.object({ sha: z38.string().optional() }).nullable().optional()
5798
+ var deploymentSchema = z39.object({
5799
+ id: z39.string(),
5800
+ projectId: z39.string(),
5801
+ ownerId: z39.string().optional(),
5802
+ target: z39.string().nullable(),
5803
+ readyState: z39.string(),
5804
+ createdAt: z39.number(),
5805
+ url: z39.string(),
5806
+ meta: z39.record(z39.string(), z39.unknown()).optional(),
5807
+ gitSource: z39.object({ sha: z39.string().optional() }).nullable().optional()
5722
5808
  });
5723
- var buildProofSchema = z38.object({
5724
- node: z38.string(),
5725
- packageManager: z38.enum(["npm", "pnpm"]),
5726
- packageManagerVersion: z38.string(),
5727
- lockfileHash: z38.string(),
5728
- revision: z38.string(),
5729
- fieldContractHash: z38.string(),
5730
- siteplane: z38.string(),
5731
- runtimeNext: z38.string(),
5732
- analytics: z38.string().optional(),
5733
- next: z38.string(),
5734
- react: z38.string()
5809
+ var buildProofSchema = z39.object({
5810
+ node: z39.string(),
5811
+ packageManager: z39.enum(["npm", "pnpm"]),
5812
+ packageManagerVersion: z39.string(),
5813
+ lockfileHash: z39.string(),
5814
+ revision: z39.string(),
5815
+ fieldContractHash: z39.string(),
5816
+ siteplane: z39.string(),
5817
+ runtimeNext: z39.string(),
5818
+ analytics: z39.string().optional(),
5819
+ next: z39.string(),
5820
+ react: z39.string()
5735
5821
  }).strict();
5736
5822
  var digest = (value) => `sha256:${createHash4("sha256").update(stableJsonStringify(value)).digest("hex")}`;
5737
5823
  function fail2(code, message) {
@@ -5816,12 +5902,12 @@ async function setupDeployCommand(input, deps = defaults) {
5816
5902
  remaining();
5817
5903
  return result2;
5818
5904
  };
5819
- const domains = z38.object({
5820
- domains: z38.array(z38.object({
5821
- name: z38.string(),
5822
- verified: z38.boolean(),
5823
- redirect: z38.string().nullable().optional(),
5824
- gitBranch: z38.string().nullable().optional()
5905
+ const domains = z39.object({
5906
+ domains: z39.array(z39.object({
5907
+ name: z39.string(),
5908
+ verified: z39.boolean(),
5909
+ redirect: z39.string().nullable().optional(),
5910
+ gitBranch: z39.string().nullable().optional()
5825
5911
  }))
5826
5912
  }).parse(await api(`/v9/projects/${provider.projectId}/domains?${scope}`)).domains.filter((domain) => domain.verified && !domain.redirect && !domain.gitBranch);
5827
5913
  const origin = record?.origin ?? (domains.length === 1 ? `https://${domains[0].name}` : null);
@@ -5829,7 +5915,7 @@ async function setupDeployCommand(input, deps = defaults) {
5829
5915
  fail2("production_origin_ambiguous", "The linked project needs one verified canonical Production domain, or the existing setup domain must still belong to it.");
5830
5916
  if (record && (record.projectId !== provider.projectId || record.teamId !== provider.teamId))
5831
5917
  fail2("deployment_target_conflict", "This setup already belongs to a different provider project/team. Restore its original local link.");
5832
- const listEnv = async () => z38.object({ envs: z38.array(envSchema) }).parse(await api(`/v10/projects/${provider.projectId}/env?${scope}`)).envs;
5918
+ const listEnv = async () => z39.object({ envs: z39.array(envSchema) }).parse(await api(`/v10/projects/${provider.projectId}/env?${scope}`)).envs;
5833
5919
  let env = await listEnv();
5834
5920
  const owned = (key) => {
5835
5921
  const matches2 = env.filter((item) => item.key === key && item.target.includes("production"));
@@ -5902,9 +5988,9 @@ async function setupDeployCommand(input, deps = defaults) {
5902
5988
  expectedOperationId: record?.operationId ?? null,
5903
5989
  record: next
5904
5990
  });
5905
- const parsed = z38.object({
5906
- ok: z38.literal(true),
5907
- data: z38.object({ record: setupDeploymentRecordSchema }).strict()
5991
+ const parsed = z39.object({
5992
+ ok: z39.literal(true),
5993
+ data: z39.object({ record: setupDeploymentRecordSchema }).strict()
5908
5994
  }).strict().safeParse(result2.payload);
5909
5995
  if (!result2.ok || !parsed.success || stableJsonStringify(parsed.data.data.record) !== stableJsonStringify(next))
5910
5996
  fail2("deployment_record_unconfirmed", "The setup deployment record was not acknowledged. Reload context before continuing; no deployment is blindly repeated.");
@@ -5954,7 +6040,7 @@ async function setupDeployCommand(input, deps = defaults) {
5954
6040
  const item = owned(key);
5955
6041
  if (key === "SITEPLANE_ADMIN_SESSION_SECRET" && item && record.phase === "verified")
5956
6042
  continue;
5957
- const current = item ? z38.object({ key: z38.literal(key), value: z38.string() }).parse(await api(`/v1/projects/${provider.projectId}/env/${encodeURIComponent(item.id)}?${scope}`)).value : null;
6043
+ const current = item ? z39.object({ key: z39.literal(key), value: z39.string() }).parse(await api(`/v1/projects/${provider.projectId}/env/${encodeURIComponent(item.id)}?${scope}`)).value : null;
5958
6044
  if (current !== value)
5959
6045
  pending.push({
5960
6046
  key,
@@ -5979,7 +6065,7 @@ async function setupDeployCommand(input, deps = defaults) {
5979
6065
  const item = owned(key);
5980
6066
  if (!item)
5981
6067
  fail2("environment_write_unconfirmed", "A Siteplane Production binding was not persisted; retry the same configuration.");
5982
- const observed = z38.object({ key: z38.literal(key), value: z38.string() }).parse(await api(`/v1/projects/${provider.projectId}/env/${encodeURIComponent(item.id)}?${scope}`));
6068
+ const observed = z39.object({ key: z39.literal(key), value: z39.string() }).parse(await api(`/v1/projects/${provider.projectId}/env/${encodeURIComponent(item.id)}?${scope}`));
5983
6069
  if (observed.value !== value)
5984
6070
  fail2("environment_write_unconfirmed", "The provider readback does not match the authorized Siteplane value; no deployment was started.");
5985
6071
  }
@@ -5992,7 +6078,7 @@ async function setupDeployCommand(input, deps = defaults) {
5992
6078
  const detail = async (id) => deploymentSchema.parse(await api(`/v13/deployments/${encodeURIComponent(id)}?${scope}&withGitRepoInfo=true`));
5993
6079
  const matches = (deployment2) => deployment2.projectId === provider.projectId && deployment2.target === "production" && (!deployment2.ownerId || deployment2.ownerId === provider.teamId) && deployment2.createdAt >= Date.parse(record.environmentWrittenAt) && (deployment2.meta?.siteplaneOperationId === record.operationId || provider.git && (deployment2.gitSource?.sha ?? deployment2.meta?.githubCommitSha ?? deployment2.meta?.gitlabCommitSha ?? deployment2.meta?.bitbucketCommitSha ?? deployment2.meta?.gitCommitSha) === revision);
5994
6080
  const discover = async () => {
5995
- const result2 = z38.object({ deployments: z38.array(z38.object({ uid: z38.string() })) }).parse(await api(`/v6/deployments?${scope}&projectId=${provider.projectId}&target=production&since=${Date.parse(record.environmentWrittenAt)}&limit=100`));
6081
+ const result2 = z39.object({ deployments: z39.array(z39.object({ uid: z39.string() })) }).parse(await api(`/v6/deployments?${scope}&projectId=${provider.projectId}&target=production&since=${Date.parse(record.environmentWrittenAt)}&limit=100`));
5996
6082
  const candidates = [];
5997
6083
  for (const item of result2.deployments) {
5998
6084
  const found = await detail(item.uid);
@@ -6149,6 +6235,7 @@ async function setupDeployCommand(input, deps = defaults) {
6149
6235
  });
6150
6236
  return {
6151
6237
  status: "ready_for_review",
6238
+ ...task.assignment === "provisional" ? { reviewCommand: `npx -y siteplane@${task.packages.siteplane} setup review` } : {},
6152
6239
  deploymentId: deployment.id,
6153
6240
  origin,
6154
6241
  configurationFingerprint: fingerprint,
@@ -6399,6 +6486,11 @@ async function runSetupCommand(args, dependencies) {
6399
6486
  dependencies.stdout(JSON.stringify(result2, null, 2));
6400
6487
  return { exitCode: result2.status === "action_required" ? 1 : 0 };
6401
6488
  }
6489
+ if (area === "review") {
6490
+ const result2 = await dependencies.commands.setupReviewCommand({ projectDir, ...connectionOptions });
6491
+ dependencies.stdout(JSON.stringify(result2, null, 2));
6492
+ return { exitCode: result2.status === "ready" ? 0 : 1 };
6493
+ }
6402
6494
  if (area === "context") {
6403
6495
  const result2 = await dependencies.commands.siteSetupContextCommand({
6404
6496
  projectDir,
@@ -6445,7 +6537,7 @@ async function runSetupCommand(args, dependencies) {
6445
6537
  return { exitCode: result2.status === "ready_for_review" ? 0 : 1 };
6446
6538
  }
6447
6539
  dependencies.stdout(
6448
- "Usage: siteplane setup <start|preflight|prepare|context|activity|apply|deploy|verify>"
6540
+ "Usage: siteplane setup <start|preflight|prepare|context|activity|apply|deploy|verify|review>"
6449
6541
  );
6450
6542
  return { exitCode: 1 };
6451
6543
  }
@@ -6585,6 +6677,7 @@ function createDefaultDependencies() {
6585
6677
  siteSetupVerifyCommand,
6586
6678
  setupPreflightCommand,
6587
6679
  setupStartCommand,
6680
+ setupReviewCommand,
6588
6681
  setupPrepareCommand,
6589
6682
  setupDeployCommand,
6590
6683
  initCommand,
package/dist/index.js CHANGED
@@ -1662,6 +1662,18 @@ var fieldBridgeIdentitySchema = z17.object({
1662
1662
  fieldContractHash: canonicalFieldContractHashSchema,
1663
1663
  deploymentRevision: z17.string().trim().min(1).max(256)
1664
1664
  }).strict();
1665
+ var setupPreviewAccessSchema = z17.object({
1666
+ capability: z17.string().regex(/^v1\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{43}$/u).max(4096),
1667
+ expiresAt: z17.string().datetime()
1668
+ }).strict();
1669
+ var setupPreviewReadSchema = fieldBridgeIdentitySchema.extend({
1670
+ scope: z17.literal("setup_preview"),
1671
+ siteId: z17.string().uuid(),
1672
+ runId: z17.string().uuid(),
1673
+ bridgeSessionId: z17.string().min(1),
1674
+ expiresAt: z17.string().datetime(),
1675
+ contract: siteFieldContractV1Schema
1676
+ }).strict();
1665
1677
  var fieldBridgeBaseSchema = z17.object({
1666
1678
  version: z17.literal(BRIDGE_PROTOCOL_VERSION),
1667
1679
  type: z17.enum(FIELD_BRIDGE_MESSAGE_TYPES),
@@ -1689,7 +1701,8 @@ var fieldBridgeInitMessageSchema = fieldBridgeBaseSchema.extend({
1689
1701
  payload: z17.object({
1690
1702
  adminOrigin: z17.string().url(),
1691
1703
  customerOrigin: z17.string().url(),
1692
- renderedPath: realRenderedPathSchema
1704
+ renderedPath: realRenderedPathSchema,
1705
+ setupPreview: setupPreviewAccessSchema.optional()
1693
1706
  }).strict()
1694
1707
  });
1695
1708
  var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
@@ -1702,7 +1715,7 @@ var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
1702
1715
  z17.literal("preview_values"),
1703
1716
  z17.literal("field_evidence"),
1704
1717
  z17.literal("visual_field_control")
1705
- ]).rest(z17.literal("analytics_preview_readiness")).refine((capabilities) => capabilities.length <= 5)
1718
+ ]).rest(z17.enum(["analytics_preview_readiness", "setup_preview"])).refine((capabilities) => capabilities.length <= 6)
1706
1719
  }).strict()
1707
1720
  });
1708
1721
  var fieldBridgeFieldsMessageSchema = fieldBridgeBaseSchema.extend({
@@ -2948,7 +2961,7 @@ async function inspectSetupLocalProject(projectDir) {
2948
2961
  fail("package_manager_conflict", "Application and workspace packageManager declarations disagree.");
2949
2962
  if (declared && !new RegExp(`^${name2}@\\d+\\.\\d+\\.\\d+$`, "u").test(declared))
2950
2963
  fail("package_manager_conflict", "Declare an exact supported npm/pnpm packageManager version matching the canonical lockfile.");
2951
- const localVersion = (await setupProcess(declared ? "npx" : name2, declared ? ["--yes", declared, "--version"] : ["--version"], { cwd: lockfileRoot })).trim();
2964
+ const localVersion = (await setupProcess(declared ? "npx" : name2, declared ? ["--yes", "--package", declared, name2, "--version"] : ["--version"], { cwd: lockfileRoot })).trim();
2952
2965
  if (!(name2 === "npm" ? stable(localVersion, 10) : stable(localVersion, 9) || stable(localVersion, 10)))
2953
2966
  fail("unsupported_package_manager_version", "Use npm 10 or pnpm 9/10; other versions are outside the initial setup support range.");
2954
2967
  if (declared && declared !== `${name2}@${localVersion}`)
@@ -3476,6 +3489,16 @@ var bootstrapResponseSchema2 = z35.object({
3476
3489
  data: siteSetupBootstrapDataSchema
3477
3490
  }).strict();
3478
3491
 
3492
+ // ../cli/dist/commands/setup-review.js
3493
+ import { z as z36 } from "zod";
3494
+ var responseSchema2 = z36.object({
3495
+ ok: z36.literal(true),
3496
+ data: z36.object({
3497
+ reviewUrl: z36.string().url(),
3498
+ expiresAt: z36.string().datetime({ offset: true })
3499
+ }).strict()
3500
+ }).strict();
3501
+
3479
3502
  // ../cli/dist/commands/setup-prepare.js
3480
3503
  import { access as access5, lstat as lstat2, mkdir as mkdir6, open as open3, readFile as readFile10, rename as rename3, rm as rm3 } from "fs/promises";
3481
3504
  import { randomUUID as randomUUID5 } from "crypto";
@@ -3486,8 +3509,8 @@ import ts3 from "typescript";
3486
3509
  import { randomUUID as randomUUID6 } from "crypto";
3487
3510
  import { lstat as lstat3, mkdir as mkdir7, open as open4, readFile as readFile11, rm as rm4, rmdir } from "fs/promises";
3488
3511
  import { resolve as resolve2 } from "path";
3489
- import { z as z36 } from "zod";
3490
- var ownerSchema = z36.object({ pid: z36.number().int().positive(), nonce: z36.string().uuid() }).strict();
3512
+ import { z as z37 } from "zod";
3513
+ var ownerSchema = z37.object({ pid: z37.number().int().positive(), nonce: z37.string().uuid() }).strict();
3491
3514
 
3492
3515
  // ../cli/dist/config/build-provenance.js
3493
3516
  import { createHash as createHash3 } from "crypto";
@@ -3495,23 +3518,23 @@ import { execFile as execFile3 } from "child_process";
3495
3518
  import { lstat as lstat4, readFile as readFile12, writeFile as writeFile5, mkdir as mkdir8 } from "fs/promises";
3496
3519
  import { dirname as dirname8, isAbsolute as isAbsolute2, join as join11, relative as relative7, resolve as resolve3, sep as sep3 } from "path";
3497
3520
  import { isDeepStrictEqual, promisify as promisify3 } from "util";
3498
- import { z as z37 } from "zod";
3521
+ import { z as z38 } from "zod";
3499
3522
  var execute = promisify3(execFile3);
3500
3523
  var name = ".siteplane/build-source.json";
3501
- var oid = z37.string().regex(/^[0-9a-f]{40}$/u);
3502
- var entrySchema = z37.object({
3503
- path: z37.string().min(1).max(4096),
3504
- mode: z37.enum(["100644", "100755", "120000"]),
3524
+ var oid = z38.string().regex(/^[0-9a-f]{40}$/u);
3525
+ var entrySchema = z38.object({
3526
+ path: z38.string().min(1).max(4096),
3527
+ mode: z38.enum(["100644", "100755", "120000"]),
3505
3528
  oid
3506
3529
  }).strict();
3507
- var schema = z37.object({
3508
- version: z37.literal(2),
3530
+ var schema = z38.object({
3531
+ version: z38.literal(2),
3509
3532
  revision: oid,
3510
- commit: z37.string().min(1).max(1048576),
3511
- entries: z37.array(entrySchema).min(1).max(1e5),
3512
- providerConfigurations: z37.array(z37.object({
3513
- path: z37.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
3514
- source: z37.string().max(1048576)
3533
+ commit: z38.string().min(1).max(1048576),
3534
+ entries: z38.array(entrySchema).min(1).max(1e5),
3535
+ providerConfigurations: z38.array(z38.object({
3536
+ path: z38.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
3537
+ source: z38.string().max(1048576)
3515
3538
  }).strict()).max(1e3)
3516
3539
  }).strict();
3517
3540
  async function writeBuildProvenance(checkout, revision) {
@@ -3560,38 +3583,38 @@ import { createHash as createHash4, randomBytes as randomBytes2, randomUUID as r
3560
3583
  import { access as access6, mkdir as mkdir9, mkdtemp, rm as rm5, writeFile as writeFile6 } from "fs/promises";
3561
3584
  import { tmpdir } from "os";
3562
3585
  import { join as join12 } from "path";
3563
- import { z as z38 } from "zod";
3564
- var envSchema = z38.object({
3565
- id: z38.string(),
3566
- key: z38.string(),
3567
- target: z38.array(z38.string()),
3568
- type: z38.string(),
3569
- comment: z38.string().optional(),
3570
- updatedAt: z38.number().optional()
3571
- });
3572
- var deploymentSchema = z38.object({
3573
- id: z38.string(),
3574
- projectId: z38.string(),
3575
- ownerId: z38.string().optional(),
3576
- target: z38.string().nullable(),
3577
- readyState: z38.string(),
3578
- createdAt: z38.number(),
3579
- url: z38.string(),
3580
- meta: z38.record(z38.string(), z38.unknown()).optional(),
3581
- gitSource: z38.object({ sha: z38.string().optional() }).nullable().optional()
3582
- });
3583
- var buildProofSchema = z38.object({
3584
- node: z38.string(),
3585
- packageManager: z38.enum(["npm", "pnpm"]),
3586
- packageManagerVersion: z38.string(),
3587
- lockfileHash: z38.string(),
3588
- revision: z38.string(),
3589
- fieldContractHash: z38.string(),
3590
- siteplane: z38.string(),
3591
- runtimeNext: z38.string(),
3592
- analytics: z38.string().optional(),
3593
- next: z38.string(),
3594
- react: z38.string()
3586
+ import { z as z39 } from "zod";
3587
+ var envSchema = z39.object({
3588
+ id: z39.string(),
3589
+ key: z39.string(),
3590
+ target: z39.array(z39.string()),
3591
+ type: z39.string(),
3592
+ comment: z39.string().optional(),
3593
+ updatedAt: z39.number().optional()
3594
+ });
3595
+ var deploymentSchema = z39.object({
3596
+ id: z39.string(),
3597
+ projectId: z39.string(),
3598
+ ownerId: z39.string().optional(),
3599
+ target: z39.string().nullable(),
3600
+ readyState: z39.string(),
3601
+ createdAt: z39.number(),
3602
+ url: z39.string(),
3603
+ meta: z39.record(z39.string(), z39.unknown()).optional(),
3604
+ gitSource: z39.object({ sha: z39.string().optional() }).nullable().optional()
3605
+ });
3606
+ var buildProofSchema = z39.object({
3607
+ node: z39.string(),
3608
+ packageManager: z39.enum(["npm", "pnpm"]),
3609
+ packageManagerVersion: z39.string(),
3610
+ lockfileHash: z39.string(),
3611
+ revision: z39.string(),
3612
+ fieldContractHash: z39.string(),
3613
+ siteplane: z39.string(),
3614
+ runtimeNext: z39.string(),
3615
+ analytics: z39.string().optional(),
3616
+ next: z39.string(),
3617
+ react: z39.string()
3595
3618
  }).strict();
3596
3619
  var defaults = {
3597
3620
  preflight: setupPreflightCommand,
package/dist/next.js CHANGED
@@ -1865,6 +1865,18 @@ var fieldBridgeIdentitySchema = z17.object({
1865
1865
  fieldContractHash: canonicalFieldContractHashSchema,
1866
1866
  deploymentRevision: z17.string().trim().min(1).max(256)
1867
1867
  }).strict();
1868
+ var setupPreviewAccessSchema = z17.object({
1869
+ capability: z17.string().regex(/^v1\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{43}$/u).max(4096),
1870
+ expiresAt: z17.string().datetime()
1871
+ }).strict();
1872
+ var setupPreviewReadSchema = fieldBridgeIdentitySchema.extend({
1873
+ scope: z17.literal("setup_preview"),
1874
+ siteId: z17.string().uuid(),
1875
+ runId: z17.string().uuid(),
1876
+ bridgeSessionId: z17.string().min(1),
1877
+ expiresAt: z17.string().datetime(),
1878
+ contract: siteFieldContractV1Schema
1879
+ }).strict();
1868
1880
  var fieldBridgeBaseSchema = z17.object({
1869
1881
  version: z17.literal(BRIDGE_PROTOCOL_VERSION),
1870
1882
  type: z17.enum(FIELD_BRIDGE_MESSAGE_TYPES),
@@ -1892,7 +1904,8 @@ var fieldBridgeInitMessageSchema = fieldBridgeBaseSchema.extend({
1892
1904
  payload: z17.object({
1893
1905
  adminOrigin: z17.string().url(),
1894
1906
  customerOrigin: z17.string().url(),
1895
- renderedPath: realRenderedPathSchema
1907
+ renderedPath: realRenderedPathSchema,
1908
+ setupPreview: setupPreviewAccessSchema.optional()
1896
1909
  }).strict()
1897
1910
  });
1898
1911
  var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
@@ -1905,7 +1918,7 @@ var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
1905
1918
  z17.literal("preview_values"),
1906
1919
  z17.literal("field_evidence"),
1907
1920
  z17.literal("visual_field_control")
1908
- ]).rest(z17.literal("analytics_preview_readiness")).refine((capabilities) => capabilities.length <= 5)
1921
+ ]).rest(z17.enum(["analytics_preview_readiness", "setup_preview"])).refine((capabilities) => capabilities.length <= 6)
1909
1922
  }).strict()
1910
1923
  });
1911
1924
  var fieldBridgeFieldsMessageSchema = fieldBridgeBaseSchema.extend({
@@ -2757,7 +2770,7 @@ async function inspectSetupLocalProject(projectDir) {
2757
2770
  fail("package_manager_conflict", "Application and workspace packageManager declarations disagree.");
2758
2771
  if (declared && !new RegExp(`^${name2}@\\d+\\.\\d+\\.\\d+$`, "u").test(declared))
2759
2772
  fail("package_manager_conflict", "Declare an exact supported npm/pnpm packageManager version matching the canonical lockfile.");
2760
- const localVersion = (await setupProcess(declared ? "npx" : name2, declared ? ["--yes", declared, "--version"] : ["--version"], { cwd: lockfileRoot })).trim();
2773
+ const localVersion = (await setupProcess(declared ? "npx" : name2, declared ? ["--yes", "--package", declared, name2, "--version"] : ["--version"], { cwd: lockfileRoot })).trim();
2761
2774
  if (!(name2 === "npm" ? stable(localVersion, 10) : stable(localVersion, 9) || stable(localVersion, 10)))
2762
2775
  fail("unsupported_package_manager_version", "Use npm 10 or pnpm 9/10; other versions are outside the initial setup support range.");
2763
2776
  if (declared && declared !== `${name2}@${localVersion}`)
@@ -3836,6 +3849,16 @@ var bootstrapResponseSchema2 = z35.object({
3836
3849
  data: siteSetupBootstrapDataSchema
3837
3850
  }).strict();
3838
3851
 
3852
+ // ../cli/dist/commands/setup-review.js
3853
+ import { z as z36 } from "zod";
3854
+ var responseSchema2 = z36.object({
3855
+ ok: z36.literal(true),
3856
+ data: z36.object({
3857
+ reviewUrl: z36.string().url(),
3858
+ expiresAt: z36.string().datetime({ offset: true })
3859
+ }).strict()
3860
+ }).strict();
3861
+
3839
3862
  // ../cli/dist/commands/setup-prepare.js
3840
3863
  import { access as access5, lstat as lstat2, mkdir as mkdir6, open as open3, readFile as readFile10, rename as rename3, rm as rm3 } from "fs/promises";
3841
3864
  import { randomUUID as randomUUID5 } from "crypto";
@@ -3846,8 +3869,8 @@ import ts3 from "typescript";
3846
3869
  import { randomUUID as randomUUID6 } from "crypto";
3847
3870
  import { lstat as lstat3, mkdir as mkdir7, open as open4, readFile as readFile11, rm as rm4, rmdir } from "fs/promises";
3848
3871
  import { resolve as resolve2 } from "path";
3849
- import { z as z36 } from "zod";
3850
- var ownerSchema = z36.object({ pid: z36.number().int().positive(), nonce: z36.string().uuid() }).strict();
3872
+ import { z as z37 } from "zod";
3873
+ var ownerSchema = z37.object({ pid: z37.number().int().positive(), nonce: z37.string().uuid() }).strict();
3851
3874
 
3852
3875
  // ../cli/dist/config/build-provenance.js
3853
3876
  import { createHash as createHash3 } from "crypto";
@@ -3855,23 +3878,23 @@ import { execFile as execFile3 } from "child_process";
3855
3878
  import { lstat as lstat4, readFile as readFile12, writeFile as writeFile5, mkdir as mkdir8 } from "fs/promises";
3856
3879
  import { dirname as dirname8, isAbsolute as isAbsolute2, join as join11, relative as relative7, resolve as resolve3, sep as sep3 } from "path";
3857
3880
  import { isDeepStrictEqual, promisify as promisify3 } from "util";
3858
- import { z as z37 } from "zod";
3881
+ import { z as z38 } from "zod";
3859
3882
  var execute = promisify3(execFile3);
3860
3883
  var name = ".siteplane/build-source.json";
3861
- var oid = z37.string().regex(/^[0-9a-f]{40}$/u);
3862
- var entrySchema = z37.object({
3863
- path: z37.string().min(1).max(4096),
3864
- mode: z37.enum(["100644", "100755", "120000"]),
3884
+ var oid = z38.string().regex(/^[0-9a-f]{40}$/u);
3885
+ var entrySchema = z38.object({
3886
+ path: z38.string().min(1).max(4096),
3887
+ mode: z38.enum(["100644", "100755", "120000"]),
3865
3888
  oid
3866
3889
  }).strict();
3867
- var schema = z37.object({
3868
- version: z37.literal(2),
3890
+ var schema = z38.object({
3891
+ version: z38.literal(2),
3869
3892
  revision: oid,
3870
- commit: z37.string().min(1).max(1048576),
3871
- entries: z37.array(entrySchema).min(1).max(1e5),
3872
- providerConfigurations: z37.array(z37.object({
3873
- path: z37.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
3874
- source: z37.string().max(1048576)
3893
+ commit: z38.string().min(1).max(1048576),
3894
+ entries: z38.array(entrySchema).min(1).max(1e5),
3895
+ providerConfigurations: z38.array(z38.object({
3896
+ path: z38.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
3897
+ source: z38.string().max(1048576)
3875
3898
  }).strict()).max(1e3)
3876
3899
  }).strict();
3877
3900
  var gitHash = (type, content) => createHash3("sha1").update(`${type} ${content.length}\0`).update(content).digest("hex");
@@ -3971,7 +3994,7 @@ async function readBuildProvenance(projectDirectory) {
3971
3994
  const original = configurations.get(entry.path);
3972
3995
  if (contents && original && entry.mode !== "120000") {
3973
3996
  try {
3974
- const object = z37.record(z37.string(), z37.unknown());
3997
+ const object = z38.record(z38.string(), z38.unknown());
3975
3998
  const actual = object.parse(JSON.parse(contents.toString("utf8")));
3976
3999
  const expected = object.parse(JSON.parse(original));
3977
4000
  if (!Object.hasOwn(expected, "version") && actual.version === 2)
@@ -4025,38 +4048,38 @@ import { createHash as createHash4, randomBytes as randomBytes2, randomUUID as r
4025
4048
  import { access as access6, mkdir as mkdir9, mkdtemp, rm as rm5, writeFile as writeFile6 } from "fs/promises";
4026
4049
  import { tmpdir } from "os";
4027
4050
  import { join as join12 } from "path";
4028
- import { z as z38 } from "zod";
4029
- var envSchema = z38.object({
4030
- id: z38.string(),
4031
- key: z38.string(),
4032
- target: z38.array(z38.string()),
4033
- type: z38.string(),
4034
- comment: z38.string().optional(),
4035
- updatedAt: z38.number().optional()
4051
+ import { z as z39 } from "zod";
4052
+ var envSchema = z39.object({
4053
+ id: z39.string(),
4054
+ key: z39.string(),
4055
+ target: z39.array(z39.string()),
4056
+ type: z39.string(),
4057
+ comment: z39.string().optional(),
4058
+ updatedAt: z39.number().optional()
4036
4059
  });
4037
- var deploymentSchema = z38.object({
4038
- id: z38.string(),
4039
- projectId: z38.string(),
4040
- ownerId: z38.string().optional(),
4041
- target: z38.string().nullable(),
4042
- readyState: z38.string(),
4043
- createdAt: z38.number(),
4044
- url: z38.string(),
4045
- meta: z38.record(z38.string(), z38.unknown()).optional(),
4046
- gitSource: z38.object({ sha: z38.string().optional() }).nullable().optional()
4060
+ var deploymentSchema = z39.object({
4061
+ id: z39.string(),
4062
+ projectId: z39.string(),
4063
+ ownerId: z39.string().optional(),
4064
+ target: z39.string().nullable(),
4065
+ readyState: z39.string(),
4066
+ createdAt: z39.number(),
4067
+ url: z39.string(),
4068
+ meta: z39.record(z39.string(), z39.unknown()).optional(),
4069
+ gitSource: z39.object({ sha: z39.string().optional() }).nullable().optional()
4047
4070
  });
4048
- var buildProofSchema = z38.object({
4049
- node: z38.string(),
4050
- packageManager: z38.enum(["npm", "pnpm"]),
4051
- packageManagerVersion: z38.string(),
4052
- lockfileHash: z38.string(),
4053
- revision: z38.string(),
4054
- fieldContractHash: z38.string(),
4055
- siteplane: z38.string(),
4056
- runtimeNext: z38.string(),
4057
- analytics: z38.string().optional(),
4058
- next: z38.string(),
4059
- react: z38.string()
4071
+ var buildProofSchema = z39.object({
4072
+ node: z39.string(),
4073
+ packageManager: z39.enum(["npm", "pnpm"]),
4074
+ packageManagerVersion: z39.string(),
4075
+ lockfileHash: z39.string(),
4076
+ revision: z39.string(),
4077
+ fieldContractHash: z39.string(),
4078
+ siteplane: z39.string(),
4079
+ runtimeNext: z39.string(),
4080
+ analytics: z39.string().optional(),
4081
+ next: z39.string(),
4082
+ react: z39.string()
4060
4083
  }).strict();
4061
4084
  var defaults = {
4062
4085
  preflight: setupPreflightCommand,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "siteplane",
3
3
  "private": false,
4
- "version": "0.1.50",
4
+ "version": "0.1.52",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
7
7
  "publishConfig": {