@cimplify/cli 0.13.5 → 0.15.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 (51) hide show
  1. package/dist/{add-NZ47GUMD.mjs → add-EPY25NNV.mjs} +3 -3
  2. package/dist/{assets-OEY6FHHZ.mjs → assets-CWB72PZG.mjs} +3 -3
  3. package/dist/{auth-step-up-ALEUQUCE.mjs → auth-step-up-VL742AS7.mjs} +4 -4
  4. package/dist/{cancel-FD66LTTS.mjs → cancel-ZHVVILOU.mjs} +3 -3
  5. package/dist/{chunk-IK6NQHTG.mjs → chunk-3KRSHO6J.mjs} +1 -1
  6. package/dist/{chunk-4O4G2CDE.mjs → chunk-3QUK5BPY.mjs} +7 -3
  7. package/dist/{chunk-GOTWRZVM.mjs → chunk-5SMYK3U2.mjs} +5 -5
  8. package/dist/{chunk-OE7YRDLH.mjs → chunk-A6WHBSXZ.mjs} +26 -8
  9. package/dist/{dev-L3W6UXYN.mjs → chunk-F2UI225N.mjs} +5 -5
  10. package/dist/{chunk-5YVMA7A5.mjs → chunk-GCQKTUXN.mjs} +2 -2
  11. package/dist/{chunk-RU53TQLZ.mjs → chunk-I2UP7YTG.mjs} +1 -1
  12. package/dist/{chunk-MLVBE5V2.mjs → chunk-KN2YSKXZ.mjs} +16 -2
  13. package/dist/{chunk-6CHBU7O4.mjs → chunk-MLE4MVYC.mjs} +1 -1
  14. package/dist/{chunk-PDGKBATF.mjs → chunk-NK6VC264.mjs} +1 -1
  15. package/dist/{chunk-TOQGLBWF.mjs → chunk-NYXA6X56.mjs} +1 -1
  16. package/dist/{chunk-5ZQURRIM.mjs → chunk-TH4XENKH.mjs} +1 -1
  17. package/dist/{chunk-BDC7XQIL.mjs → chunk-YJDQYKZU.mjs} +9 -9
  18. package/dist/{deploy-SLRFPGTH.mjs → deploy-JE6TUYCL.mjs} +86 -9
  19. package/dist/dev-V7JSUVOI.mjs +8 -0
  20. package/dist/dispatcher.mjs +29 -29
  21. package/dist/{doctor-6NI2XNTD.mjs → doctor-TTI237ZY.mjs} +7 -7
  22. package/dist/{domains-7D7WJAMC.mjs → domains-BZKGIDF4.mjs} +4 -4
  23. package/dist/{env-PAENNABF.mjs → env-FZNXKLGL.mjs} +5 -5
  24. package/dist/{explain-HPRJBFHS.mjs → explain-HVK5ZNTV.mjs} +3 -3
  25. package/dist/{inspect-MGVG4Z44.mjs → inspect-X3M7WSTL.mjs} +2 -2
  26. package/dist/introspect-KTB4BXU5.mjs +8 -0
  27. package/dist/{link-KGNQWCSZ.mjs → link-4NM2QMI5.mjs} +21 -4
  28. package/dist/{lint-EYKIQ6RO.mjs → lint-DDZ7HUQN.mjs} +1 -1
  29. package/dist/{list-QNEUCCP5.mjs → list-L6FMY3AF.mjs} +2 -2
  30. package/dist/{login-NCO4P5G5.mjs → login-ZTSWYO5G.mjs} +4 -4
  31. package/dist/{logout-MF6SOLPE.mjs → logout-Z57X6HPE.mjs} +2 -2
  32. package/dist/{logs-76TCJBIQ.mjs → logs-36BLYJHJ.mjs} +3 -3
  33. package/dist/{mock-CAWNXSGC.mjs → mock-EVER34IX.mjs} +1 -1
  34. package/dist/{projects-U75DOOR7.mjs → projects-4XRNHJAH.mjs} +5 -5
  35. package/dist/repo-X3KZ5R64.mjs +9 -0
  36. package/dist/{rollback-ZL3V7SYH.mjs → rollback-WCRWXSE3.mjs} +4 -4
  37. package/dist/{status-52HG63FE.mjs → status-VA326DWD.mjs} +3 -3
  38. package/dist/{unlink-TCG3NBAR.mjs → unlink-H3BO3DOQ.mjs} +2 -2
  39. package/dist/{update-47HG7LN7.mjs → update-XUDRJZDE.mjs} +3 -3
  40. package/dist/{whoami-B5Y5KSOZ.mjs → whoami-ZWTJMEDB.mjs} +3 -3
  41. package/package.json +2 -2
  42. package/templates/storefront-auto/package.json +1 -1
  43. package/templates/storefront-bakery/package.json +1 -1
  44. package/templates/storefront-fashion/package.json +1 -1
  45. package/templates/storefront-grocery/package.json +1 -1
  46. package/templates/storefront-pharmacy/package.json +1 -1
  47. package/templates/storefront-restaurant/package.json +1 -1
  48. package/templates/storefront-retail/package.json +1 -1
  49. package/templates/storefront-services/package.json +1 -1
  50. package/dist/introspect-3OYRCVUF.mjs +0 -8
  51. package/dist/repo-IE5IOLR5.mjs +0 -8
@@ -1,23 +1,94 @@
1
1
  #!/usr/bin/env node
2
- import { isFreestyleRemote, gitDetectRoot, gitStatusPorcelain, gitCurrentBranch, gitCurrentSha, gitGetRemoteUrl, gitPushToUrl, gitPush } from './chunk-MLVBE5V2.mjs';
3
- import { pollDeployment } from './chunk-PDGKBATF.mjs';
4
- import { fetchRepoRecord, fetchCloneToken } from './chunk-OE7YRDLH.mjs';
5
- import { promptYesNo } from './chunk-5ZQURRIM.mjs';
2
+ import { detectPackageManager } from './chunk-F2UI225N.mjs';
3
+ import { fetchRepoRecord, fetchCloneToken } from './chunk-A6WHBSXZ.mjs';
4
+ import { pollDeployment } from './chunk-NK6VC264.mjs';
5
+ import './chunk-I2UP7YTG.mjs';
6
+ import { promptYesNo } from './chunk-TH4XENKH.mjs';
6
7
  import { REPO_PROVIDER, ENV_SCOPE, DEPLOY_TRIGGER, DEPLOYMENT_STATUS, TOKEN_PURPOSE } from './chunk-MXYUAJEW.mjs';
8
+ import { isFreestyleRemote, gitDetectRoot, gitStatusPorcelain, gitCurrentBranch, gitCurrentSha, gitGetRemoteUrl, gitPushToUrl, gitPush } from './chunk-KN2YSKXZ.mjs';
7
9
  import { parseArgs, flagBool, flagString } from './chunk-5KYR6WJB.mjs';
8
- import { ApiClient } from './chunk-TOQGLBWF.mjs';
9
- import { readAuth, readProjectLink, writeProjectState } from './chunk-6CHBU7O4.mjs';
10
- import { CliError, CLI_ERROR_CODE, info, dim, step, success, result, EXIT_CODE } from './chunk-4O4G2CDE.mjs';
10
+ import { ApiClient } from './chunk-NYXA6X56.mjs';
11
+ import { readAuth, readProjectLink, writeProjectState } from './chunk-MLE4MVYC.mjs';
12
+ import { info, dim, step, CliError, CLI_ERROR_CODE, success, result, EXIT_CODE } from './chunk-3QUK5BPY.mjs';
13
+ import { spawn } from 'child_process';
14
+ import { promises } from 'fs';
15
+ import path from 'path';
11
16
 
12
- // src/commands/deploy.ts
13
17
  var FLAG_PROD = "prod";
14
18
  var FLAG_REF = "ref";
15
19
  var FLAG_NO_PUSH = "no-push";
16
20
  var FLAG_ALLOW_DIRTY = "allow-dirty";
17
21
  var FLAG_NO_POLL = "no-poll";
22
+ var FLAG_SKIP_ENV_CHECK = "skip-env-check";
23
+ var FLAG_SKIP_BUILD = "skip-build";
24
+ var SCRIPT_BUILD = "build";
25
+ var NODE_MODULES_DIR = "node_modules";
26
+ var PACKAGE_JSON_FILE = "package.json";
18
27
  function deployEndpoint(businessId, projectId) {
19
28
  return `/v1/businesses/${encodeURIComponent(businessId)}/projects/${encodeURIComponent(projectId)}/deploy`;
20
29
  }
30
+ function envEndpoint(businessId, projectId) {
31
+ return `/v1/businesses/${encodeURIComponent(businessId)}/projects/${encodeURIComponent(projectId)}/env-vars`;
32
+ }
33
+ function missingProductionKeys(preview, production) {
34
+ const productionKeys = new Set(production.map((record) => record.key));
35
+ return [...new Set(preview.map((record) => record.key))].filter((key) => !productionKeys.has(key)).sort();
36
+ }
37
+ async function runLocalBuildCheck(cwd) {
38
+ let pkg;
39
+ try {
40
+ pkg = JSON.parse(await promises.readFile(path.join(cwd, PACKAGE_JSON_FILE), "utf8"));
41
+ } catch {
42
+ return "skipped_no_package";
43
+ }
44
+ if (!pkg.scripts?.[SCRIPT_BUILD]) {
45
+ return "skipped_no_script";
46
+ }
47
+ try {
48
+ await promises.stat(path.join(cwd, NODE_MODULES_DIR));
49
+ } catch {
50
+ info(dim("Dependencies not installed locally \u2014 skipping the local build check."));
51
+ return "skipped_no_modules";
52
+ }
53
+ const pm = await detectPackageManager(cwd);
54
+ step(`Building locally first (${pm} run ${SCRIPT_BUILD}) to catch failures before the cloud`);
55
+ const code = await new Promise((resolve, reject) => {
56
+ const child = spawn(pm, ["run", SCRIPT_BUILD], { cwd, stdio: "inherit" });
57
+ child.on("error", reject);
58
+ child.on("close", (exit) => resolve(exit ?? 1));
59
+ });
60
+ if (code !== 0) {
61
+ throw new CliError(
62
+ CLI_ERROR_CODE.BUILD_FAILED,
63
+ `Local build failed (exit ${code}), so the deploy was not started.
64
+ Fix the build errors above, or deploy anyway with --${FLAG_SKIP_BUILD} if your machine is the problem.`
65
+ );
66
+ }
67
+ success("Local build passed");
68
+ return "passed";
69
+ }
70
+ async function checkProductionEnv(client, businessId, projectId) {
71
+ const [preview, production] = await Promise.all([
72
+ client.get(envEndpoint(businessId, projectId), {
73
+ query: { scope: ENV_SCOPE.PREVIEW }
74
+ }),
75
+ client.get(envEndpoint(businessId, projectId), {
76
+ query: { scope: ENV_SCOPE.PRODUCTION }
77
+ })
78
+ ]);
79
+ const missing = missingProductionKeys(preview, production);
80
+ if (missing.length === 0) return;
81
+ const lines = missing.map(
82
+ (key) => ` cimplify env add ${key}=<value> --scope ${ENV_SCOPE.PRODUCTION}`
83
+ );
84
+ throw new CliError(
85
+ CLI_ERROR_CODE.INVALID_INPUT,
86
+ `Production is missing ${missing.length} env var${missing.length === 1 ? "" : "s"} that preview has: ${missing.join(", ")}.
87
+ Set them first:
88
+ ${lines.join("\n")}
89
+ Or deploy anyway with --${FLAG_SKIP_ENV_CHECK}.`
90
+ );
91
+ }
21
92
  function resolvePushStrategy(originUrl, linkRemoteUrl, repo) {
22
93
  if (isFreestyleRemote(originUrl) || isFreestyleRemote(linkRemoteUrl)) {
23
94
  return { kind: "managed" };
@@ -88,6 +159,10 @@ async function run(argv) {
88
159
  const branch = await gitCurrentBranch(root);
89
160
  const localSha = await gitCurrentSha(root);
90
161
  const gitRef = explicitRef ?? localSha;
162
+ if (flagBool(args, FLAG_PROD) && !flagBool(args, FLAG_SKIP_ENV_CHECK)) {
163
+ await checkProductionEnv(client, link.businessId, link.projectId);
164
+ }
165
+ const buildCheck = flagBool(args, FLAG_SKIP_BUILD) ? "skipped_flag" : await runLocalBuildCheck(cwd);
91
166
  if (!flagBool(args, FLAG_NO_PUSH)) {
92
167
  await pushForDeploy(client, link.businessId, link.projectId, root, branch, link.remoteUrl);
93
168
  } else {
@@ -121,6 +196,7 @@ async function run(argv) {
121
196
  }
122
197
  if (flagBool(args, FLAG_NO_POLL)) {
123
198
  result({
199
+ build_check: buildCheck,
124
200
  deployment: {
125
201
  id: enqueued.deployment_id,
126
202
  git_sha: enqueued.git_sha,
@@ -138,6 +214,7 @@ async function run(argv) {
138
214
  enqueued.deployment_id
139
215
  );
140
216
  result({
217
+ build_check: buildCheck,
141
218
  deployment: {
142
219
  id: enqueued.deployment_id,
143
220
  git_sha: enqueued.git_sha,
@@ -158,4 +235,4 @@ async function run(argv) {
158
235
  process.exitCode = EXIT_CODE.ERROR;
159
236
  }
160
237
 
161
- export { run as default, resolvePushStrategy };
238
+ export { run as default, missingProductionKeys, resolvePushStrategy, runLocalBuildCheck };
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export { run as default, detectPackageManager, mergeEnvEntries } from './chunk-F2UI225N.mjs';
3
+ import './chunk-I2UP7YTG.mjs';
4
+ import './chunk-MXYUAJEW.mjs';
5
+ import './chunk-5KYR6WJB.mjs';
6
+ import './chunk-NYXA6X56.mjs';
7
+ import './chunk-MLE4MVYC.mjs';
8
+ import './chunk-3QUK5BPY.mjs';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { TEMPLATES } from './chunk-BDC7XQIL.mjs';
3
- import { package_default } from './chunk-5YVMA7A5.mjs';
2
+ import { TEMPLATES } from './chunk-YJDQYKZU.mjs';
3
+ import { package_default } from './chunk-GCQKTUXN.mjs';
4
4
 
5
5
  // src/dispatcher.ts
6
6
  var VERSION = package_default.version ?? "unknown";
@@ -134,33 +134,33 @@ Local mock server (custom demo data, no fork needed):
134
134
  cimplify mock --seed-module ./seed.ts Boot from a seed module (defineSeed from @cimplify/sdk/mock)
135
135
  `;
136
136
  var COMMANDS = {
137
- login: () => import('./login-NCO4P5G5.mjs'),
138
- logout: () => import('./logout-MF6SOLPE.mjs'),
139
- whoami: () => import('./whoami-B5Y5KSOZ.mjs'),
140
- projects: () => import('./projects-U75DOOR7.mjs'),
141
- link: () => import('./link-KGNQWCSZ.mjs'),
142
- unlink: () => import('./unlink-TCG3NBAR.mjs'),
143
- deploy: () => import('./deploy-SLRFPGTH.mjs'),
144
- cancel: () => import('./cancel-FD66LTTS.mjs'),
145
- rollback: () => import('./rollback-ZL3V7SYH.mjs'),
146
- env: () => import('./env-PAENNABF.mjs'),
147
- domains: () => import('./domains-7D7WJAMC.mjs'),
148
- logs: () => import('./logs-76TCJBIQ.mjs'),
149
- status: () => import('./status-52HG63FE.mjs'),
150
- dev: () => import('./dev-L3W6UXYN.mjs'),
151
- mock: () => import('./mock-CAWNXSGC.mjs'),
152
- introspect: () => import('./introspect-3OYRCVUF.mjs'),
153
- inspect: () => import('./inspect-MGVG4Z44.mjs'),
154
- doctor: () => import('./doctor-6NI2XNTD.mjs'),
155
- lint: () => import('./lint-EYKIQ6RO.mjs'),
156
- explain: () => import('./explain-HPRJBFHS.mjs'),
157
- assets: () => import('./assets-OEY6FHHZ.mjs'),
158
- repo: () => import('./repo-IE5IOLR5.mjs'),
159
- list: () => import('./list-QNEUCCP5.mjs'),
160
- add: () => import('./add-NZ47GUMD.mjs'),
161
- update: () => import('./update-47HG7LN7.mjs'),
162
- upgrade: () => import('./update-47HG7LN7.mjs'),
163
- "auth-step-up": () => import('./auth-step-up-ALEUQUCE.mjs')
137
+ login: () => import('./login-ZTSWYO5G.mjs'),
138
+ logout: () => import('./logout-Z57X6HPE.mjs'),
139
+ whoami: () => import('./whoami-ZWTJMEDB.mjs'),
140
+ projects: () => import('./projects-4XRNHJAH.mjs'),
141
+ link: () => import('./link-4NM2QMI5.mjs'),
142
+ unlink: () => import('./unlink-H3BO3DOQ.mjs'),
143
+ deploy: () => import('./deploy-JE6TUYCL.mjs'),
144
+ cancel: () => import('./cancel-ZHVVILOU.mjs'),
145
+ rollback: () => import('./rollback-WCRWXSE3.mjs'),
146
+ env: () => import('./env-FZNXKLGL.mjs'),
147
+ domains: () => import('./domains-BZKGIDF4.mjs'),
148
+ logs: () => import('./logs-36BLYJHJ.mjs'),
149
+ status: () => import('./status-VA326DWD.mjs'),
150
+ dev: () => import('./dev-V7JSUVOI.mjs'),
151
+ mock: () => import('./mock-EVER34IX.mjs'),
152
+ introspect: () => import('./introspect-KTB4BXU5.mjs'),
153
+ inspect: () => import('./inspect-X3M7WSTL.mjs'),
154
+ doctor: () => import('./doctor-TTI237ZY.mjs'),
155
+ lint: () => import('./lint-DDZ7HUQN.mjs'),
156
+ explain: () => import('./explain-HVK5ZNTV.mjs'),
157
+ assets: () => import('./assets-CWB72PZG.mjs'),
158
+ repo: () => import('./repo-X3KZ5R64.mjs'),
159
+ list: () => import('./list-L6FMY3AF.mjs'),
160
+ add: () => import('./add-EPY25NNV.mjs'),
161
+ update: () => import('./update-XUDRJZDE.mjs'),
162
+ upgrade: () => import('./update-XUDRJZDE.mjs'),
163
+ "auth-step-up": () => import('./auth-step-up-VL742AS7.mjs')
164
164
  };
165
165
  var COMMAND_PREFIXES = {
166
166
  auth: { "step-up": "auth-step-up" }
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import { gatherIntrospection } from './chunk-GOTWRZVM.mjs';
3
- import './chunk-MLVBE5V2.mjs';
4
- import './chunk-RU53TQLZ.mjs';
5
- import './chunk-5YVMA7A5.mjs';
2
+ import { gatherIntrospection } from './chunk-5SMYK3U2.mjs';
3
+ import './chunk-I2UP7YTG.mjs';
4
+ import './chunk-GCQKTUXN.mjs';
5
+ import './chunk-KN2YSKXZ.mjs';
6
6
  import { parseArgs, flagBool } from './chunk-5KYR6WJB.mjs';
7
- import { SDK_ENV_API_URL, DEFAULT_API_BASE_URL, ApiClient, ENV_API_BASE_URL } from './chunk-TOQGLBWF.mjs';
8
- import { readAuthOrNull } from './chunk-6CHBU7O4.mjs';
9
- import { bold, dim, info, result, isCliError, CLI_ERROR_CODE, red, yellow, green } from './chunk-4O4G2CDE.mjs';
7
+ import { SDK_ENV_API_URL, DEFAULT_API_BASE_URL, ApiClient, ENV_API_BASE_URL } from './chunk-NYXA6X56.mjs';
8
+ import { readAuthOrNull } from './chunk-MLE4MVYC.mjs';
9
+ import { bold, dim, info, result, isCliError, CLI_ERROR_CODE, red, yellow, green } from './chunk-3QUK5BPY.mjs';
10
10
  import { promises } from 'fs';
11
11
  import path from 'path';
12
12
 
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { promptYesNo } from './chunk-5ZQURRIM.mjs';
2
+ import { promptYesNo } from './chunk-TH4XENKH.mjs';
3
3
  import { ENV_SCOPE, DOMAIN_TYPE } from './chunk-MXYUAJEW.mjs';
4
4
  import { parseArgs, flagBool, flagString } from './chunk-5KYR6WJB.mjs';
5
- import { ApiClient } from './chunk-TOQGLBWF.mjs';
6
- import { readAuth, readProjectLink } from './chunk-6CHBU7O4.mjs';
7
- import { CliError, CLI_ERROR_CODE, result, info, dim, bold, success } from './chunk-4O4G2CDE.mjs';
5
+ import { ApiClient } from './chunk-NYXA6X56.mjs';
6
+ import { readAuth, readProjectLink } from './chunk-MLE4MVYC.mjs';
7
+ import { CliError, CLI_ERROR_CODE, result, info, dim, bold, success } from './chunk-3QUK5BPY.mjs';
8
8
 
9
9
  // src/commands/domains.ts
10
10
  var SUB_LS = "ls";
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import { formatEnvFile, parseEnvFile, parseKeyValueArg } from './chunk-RU53TQLZ.mjs';
3
- import { promptYesNo } from './chunk-5ZQURRIM.mjs';
2
+ import { formatEnvFile, parseEnvFile, parseKeyValueArg } from './chunk-I2UP7YTG.mjs';
3
+ import { promptYesNo } from './chunk-TH4XENKH.mjs';
4
4
  import { ENV_SCOPE, PUBLIC_ENV_PREFIX, SECRET_MASK } from './chunk-MXYUAJEW.mjs';
5
5
  import { parseArgs, flagString, flagBool } from './chunk-5KYR6WJB.mjs';
6
- import { ApiClient } from './chunk-TOQGLBWF.mjs';
7
- import { readAuth, readProjectLink } from './chunk-6CHBU7O4.mjs';
8
- import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-4O4G2CDE.mjs';
6
+ import { ApiClient } from './chunk-NYXA6X56.mjs';
7
+ import { readAuth, readProjectLink } from './chunk-MLE4MVYC.mjs';
8
+ import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-3QUK5BPY.mjs';
9
9
  import { promises } from 'fs';
10
10
  import path from 'path';
11
11
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { package_default } from './chunk-5YVMA7A5.mjs';
2
+ import { package_default } from './chunk-GCQKTUXN.mjs';
3
3
  import { parseArgs } from './chunk-5KYR6WJB.mjs';
4
- import { bold, dim, info, result, CliError, CLI_ERROR_CODE } from './chunk-4O4G2CDE.mjs';
4
+ import { bold, dim, info, result, CliError, CLI_ERROR_CODE } from './chunk-3QUK5BPY.mjs';
5
5
 
6
6
  // src/embedded-docs.ts
7
7
  var TOPICS = [
@@ -129,7 +129,7 @@ var TOPICS = [
129
129
  "title": "Assets",
130
130
  "description": "Storefront brand assets \u2014 upload to CDN, build URLs, render through next/image",
131
131
  "source_url": "https://cimplify.dev/docs/sdk/assets",
132
- "body": 'The asset surface on the SDK is **read-side only**: building URLs for images you\'ve already uploaded via [`cimplify assets upload`](/docs/cli/assets). Customer-runtime uploads still go through `client.uploads.upload(file)`.\n\n## `assetUrl(path, opts?)`\n\nPure URL builder. Prepends the CDN base for relative paths, passes absolute URLs through with the transform query contract appended.\n\n```ts\n\nassetUrl("hero/main.jpg")\n// "https://storefrontassetscdn.cimplify.io/hero/main.jpg"\n\nassetUrl("hero/main.jpg", { w: 1200, format: "webp", quality: 80 })\n// "https://storefrontassetscdn.cimplify.io/hero/main.jpg?w=1200&format=webp&quality=80"\n\nassetUrl("hero/main.jpg", { base: "http://localhost:8787/storage" })\n// "http://localhost:8787/storage/hero/main.jpg"\n\nassetUrl("https://res.cloudinary.com/foo/bar.jpg")\n// "https://res.cloudinary.com/foo/bar.jpg" (absolute \u2192 passthrough)\n```\n\n### Options\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `base` | `string` | Override the CDN base. Defaults to `DEFAULT_CDN_BASE_URL`. |\n| `w` / `h` | `number` | Width / height in pixels (on-the-fly resizing) |\n| `quality` | `number` | 0\u2013100 |\n| `format` | `"auto" \\| "webp" \\| "avif" \\| "jpeg"` | `"auto"` lets the CDN pick by `Accept` header |\n\nThe transform query is only meaningful when the URL terminates on the Cimplify storefront CDN (which supports on-the-fly resizing). For external hosts, unknown params are typically ignored; the image still loads at its original size.\n\n## `isCimplifyAsset(src, base?)`\n\nDecides whether `src` is hosted on a Cimplify CDN. Used by the storefront\'s `next/image` loader to skip transforms for external URLs.\n\n```ts\n\nisCimplifyAsset("hero/main.jpg") // true (relative \u2192 ours)\nisCimplifyAsset("/img/seed/bakery/x.jpg") // true (dev mock passthrough)\nisCimplifyAsset("https://storefrontassetscdn.cimplify.io/x.jpg") // true\nisCimplifyAsset("https://cdn.cimplify.io/x.jpg") // true\nisCimplifyAsset("https://static-tmp.cimplify.io/seed/x.jpg") // true\nisCimplifyAsset("https://res.cloudinary.com/demo/upload/x.jpg") // false\nisCimplifyAsset("https://images.unsplash.com/photo-xyz") // false\n```\n\n## Built-in `next/image` loader\n\nEvery storefront template scaffolded by `cimplify init` ships `lib/cimplify-loader.ts` and points `images.loaderFile` at it. The loader:\n\n```ts\n\nconst cdnBase = process.env.NEXT_PUBLIC_CIMPLIFY_CDN_URL?.trim() || undefined;\n\nconst cimplifyImageLoader: ImageLoader = ({ src, width, quality }) => {\n if (isCimplifyAsset(src, cdnBase)) {\n return assetUrl(src, { base: cdnBase, w: width, quality, format: "auto" });\n }\n return src;\n};\n\nexport default cimplifyImageLoader;\n```\n\n**Cloudinary URLs from `client.catalogue.getProducts()` flow through untouched.** Cimplify-hosted URLs get the transform query. The result: every `<Image>` works regardless of where its asset lives, and Cimplify-hosted ones get edge-optimized.\n\nTo point the loader at a different CDN (for testing, multi-CDN setups, etc.) set `NEXT_PUBLIC_CIMPLIFY_CDN_URL` in your `.env.local`:\n\n```\nNEXT_PUBLIC_CIMPLIFY_CDN_URL=http://localhost:8787/storage\n```\n\n## `useImage(path, opts?)` (React)\n\nThin hook that returns `{ src, loader }` for `<Image>`:\n\n```tsx\n\nexport function Hero() {\n const { src, loader } = useImage("hero/main.jpg", { format: "webp", quality: 85 });\n return <Image src={src} loader={loader} alt="..." width={1200} height={800} />;\n}\n```\n\nIf `images.loaderFile` is already set globally in your `next.config.ts`, you typically don\'t need `useImage`; just `<Image src={assetUrl("hero/main.jpg")} />` works. `useImage` is useful when you want per-component transform overrides on a project that doesn\'t use a global loader.\n\n### Options\n\n| Field | Notes |\n| --- | --- |\n| `base` | Per-call CDN base override |\n| `w`, `h` | Default transform values; per-image `width` from `<Image>` still wins |\n| `format`, `quality` | Default transform values |\n\n`useImage` is `useMemo`-stable across renders when the path + opts don\'t change.\n\n## Constants\n\n```ts\n\nDEFAULT_CDN_BASE_URL // "https://storefrontassetscdn.cimplify.io"\nCIMPLIFY_CDN_HOSTS // readonly ["storefrontassetscdn.cimplify.io", "cdn.cimplify.io", "static-tmp.cimplify.io"]\n```\n\n## What\'s not in v1\n\n- **`useUpload` hook**: runtime customer-facing uploads with progress + cancel. Deferred to v1.1. Customer uploads today go through `client.uploads.upload(file)` (no progress, no cancel; just `await`).\n- **`SEED_IDS` typed const tree**: demo-only convenience for referencing seed-image slugs in code. Generate-from-seed-source step deferred to v1.1; today demos use `seedImage(industry, slug)` from the SDK\'s mock module.\n- **Cloudinary / S3 path-transform support**: the loader passes external hosts through unchanged; Cloudinary\'s `c_fill,w_500/` path transforms aren\'t synthesized.\n- **`assets rm` server-side delete**: CLI removes manifest entries; the remote blob stays until v1.1\'s media-manager `DELETE` wiring.\n\n## Where it lives in the platform\n\n- Wire format: `POST /v1/businesses/{id}/assets/{init,confirm}`; see the management API reference\n- Backend service: `crate::uploads::service::UploadService::init_storefront_asset`\n- Served from the Cimplify asset CDN at `storefrontassetscdn.cimplify.io`\n- Storage key: `assets/{business_id}/{folder}/{filename}`: deterministic, idempotent, agent-predictable\n\n## Related\n\n- [`cimplify assets`](/docs/cli/assets): CLI surface for upload/ls/rm\n- [Uploads (customer-runtime)](/docs/sdk/uploads): `client.uploads.upload(file)` for private 7-day-presigned uploads\n'
132
+ "body": 'The asset surface on the SDK is **read-side only**: building URLs for images you\'ve already uploaded via [`cimplify assets upload`](/docs/cli/assets). Customer-runtime uploads still go through `client.uploads.upload(file)`.\n\n## `assetUrl(path, opts?)`\n\nPure URL builder. Prepends the CDN base for relative paths, passes absolute URLs through with the transform query contract appended.\n\n```ts\n\nassetUrl("hero/main.jpg")\n// "https://storefrontassetscdn.cimplify.io/hero/main.jpg"\n\nassetUrl("hero/main.jpg", { w: 1200, format: "webp", quality: 80 })\n// "https://storefrontassetscdn.cimplify.io/hero/main.jpg?w=1200&format=webp&quality=80"\n\nassetUrl("hero/main.jpg", { base: "http://localhost:8787/storage" })\n// "http://localhost:8787/storage/hero/main.jpg"\n\nassetUrl("https://res.cloudinary.com/foo/bar.jpg")\n// "https://res.cloudinary.com/foo/bar.jpg" (absolute \u2192 passthrough)\n```\n\n### Options\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `base` | `string` | Override the CDN base. Defaults to `DEFAULT_CDN_BASE_URL`. |\n| `w` / `h` | `number` | Width / height in pixels (on-the-fly resizing) |\n| `quality` | `number` | 0\u2013100 |\n| `format` | `"auto" \\| "webp" \\| "avif" \\| "jpeg"` | `"auto"` lets the CDN pick by `Accept` header |\n\nThe transform query is only meaningful when the URL terminates on the Cimplify storefront CDN (which supports on-the-fly resizing). For external hosts, unknown params are typically ignored; the image still loads at its original size.\n\n## `isCimplifyAsset(src, base?)`\n\nDecides whether `src` is hosted on a Cimplify CDN. Used by the storefront\'s `next/image` loader to skip transforms for external URLs.\n\n```ts\n\nisCimplifyAsset("hero/main.jpg") // true (relative \u2192 ours)\nisCimplifyAsset("/img/seed/bakery/x.jpg") // true (dev mock passthrough)\nisCimplifyAsset("https://storefrontassetscdn.cimplify.io/x.jpg") // true\nisCimplifyAsset("https://cdn.cimplify.io/x.jpg") // true\nisCimplifyAsset("https://static-tmp.cimplify.io/seed/x.jpg") // true\nisCimplifyAsset("https://res.cloudinary.com/demo/upload/x.jpg") // false\nisCimplifyAsset("https://images.unsplash.com/photo-xyz") // false\n```\n\n## Built-in `next/image` loader\n\nEvery storefront template scaffolded by `cimplify init` ships `lib/cimplify-loader.ts` and points `images.loaderFile` at it. The loader:\n\n```ts\n\nconst cdnBase = process.env.NEXT_PUBLIC_CIMPLIFY_CDN_URL?.trim() || undefined;\n\nconst cimplifyImageLoader: ImageLoader = ({ src, width, quality }) => {\n if (isCimplifyAsset(src, cdnBase)) {\n return assetUrl(src, { base: cdnBase, w: width, quality, format: "auto" });\n }\n return src;\n};\n\nexport default cimplifyImageLoader;\n```\n\n**Cloudinary URLs from `client.catalogue.getProducts()` flow through untouched.** Cimplify-hosted URLs get the transform query. The result: every `<Image>` works regardless of where its asset lives, and Cimplify-hosted ones get edge-optimized.\n\nTo point the loader at a different CDN (for testing, multi-CDN setups, etc.) set `NEXT_PUBLIC_CIMPLIFY_CDN_URL` in your `.env.local`:\n\n```\nNEXT_PUBLIC_CIMPLIFY_CDN_URL=http://localhost:8787/storage\n```\n\n## `useImage(path, opts?)` (React)\n\nThin hook that returns `{ src, loader }` for `<Image>`:\n\n```tsx\n\nexport function Hero() {\n const { src, loader } = useImage("hero/main.jpg", { format: "webp", quality: 85 });\n return <Image src={src} loader={loader} alt="..." width={1200} height={800} />;\n}\n```\n\nIf `images.loaderFile` is already set globally in your `next.config.ts`, you typically don\'t need `useImage`; just `<Image src={assetUrl("hero/main.jpg")} />` works. `useImage` is useful when you want per-component transform overrides on a project that doesn\'t use a global loader.\n\n### Options\n\n| Field | Notes |\n| --- | --- |\n| `base` | Per-call CDN base override |\n| `w`, `h` | Default transform values; per-image `width` from `<Image>` still wins |\n| `format`, `quality` | Default transform values |\n\n`useImage` is `useMemo`-stable across renders when the path + opts don\'t change.\n\n## Constants\n\n```ts\n\nDEFAULT_CDN_BASE_URL // "https://storefrontassetscdn.cimplify.io"\nCIMPLIFY_CDN_HOSTS // readonly ["storefrontassetscdn.cimplify.io", "cdn.cimplify.io", "static-tmp.cimplify.io"]\n```\n\n## What\'s not in v1\n\n- **`useUpload` hook**: runtime customer-facing uploads with progress + cancel. Deferred to v1.1. Customer uploads today go through `client.uploads.upload(file)` (no progress, no cancel; just `await`).\n- **`SEED_IDS` typed const tree**: demo-only convenience for referencing seed-image slugs in code. Generate-from-seed-source step deferred to v1.1; today demos use `seedImage(industry, slug)` from the SDK\'s mock module.\n- **Cloudinary / S3 path-transform support**: the loader passes external hosts through unchanged; Cloudinary\'s `c_fill,w_500/` path transforms aren\'t synthesized.\n- **`assets rm` server-side delete**: CLI removes manifest entries; the remote blob stays until v1.1\'s media-manager `DELETE` wiring.\n\n## Where it lives in the platform\n\n- Wire format: `POST /v1/businesses/{id}/assets/{init,confirm}`; see the management API reference\n- Backend service: `crate::uploads::service::UploadService::init_storefront_asset`\n- Served from the Cimplify asset CDN at `storefrontassetscdn.cimplify.io`\n- Storage key: `assets/{business_id}/{folder}/{upload_id}/{filename}`: immutable per upload; use the returned preview URL\n\n## Related\n\n- [`cimplify assets`](/docs/cli/assets): CLI surface for upload/ls/rm\n- [Uploads (customer-runtime)](/docs/sdk/uploads): `client.uploads.upload(file)` for private 7-day-presigned uploads\n'
133
133
  },
134
134
  {
135
135
  "name": "exit-codes",
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { parseEnvFile } from './chunk-RU53TQLZ.mjs';
2
+ import { parseEnvFile } from './chunk-I2UP7YTG.mjs';
3
3
  import { parseArgs, flagString, flagBool } from './chunk-5KYR6WJB.mjs';
4
- import { CliError, CLI_ERROR_CODE, isJsonMode, result, info, bold, dim, yellow, green, red } from './chunk-4O4G2CDE.mjs';
4
+ import { CliError, CLI_ERROR_CODE, isJsonMode, result, info, bold, dim, yellow, green, red } from './chunk-3QUK5BPY.mjs';
5
5
  import { promises } from 'fs';
6
6
  import path from 'path';
7
7
  import { createCimplifyClient } from '@cimplify/sdk';
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export { run as default, extractMockSeed, gatherIntrospection, renderIntrospection } from './chunk-5SMYK3U2.mjs';
3
+ import './chunk-I2UP7YTG.mjs';
4
+ import './chunk-GCQKTUXN.mjs';
5
+ import './chunk-KN2YSKXZ.mjs';
6
+ import './chunk-5KYR6WJB.mjs';
7
+ import './chunk-MLE4MVYC.mjs';
8
+ import './chunk-3QUK5BPY.mjs';
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
+ import { gitDetectRoot, gitGetRemoteUrl, gitAddRemote } from './chunk-KN2YSKXZ.mjs';
2
3
  import { parseArgs } from './chunk-5KYR6WJB.mjs';
3
- import { ApiClient } from './chunk-TOQGLBWF.mjs';
4
- import { readAuth, writeProjectLink } from './chunk-6CHBU7O4.mjs';
5
- import { CliError, CLI_ERROR_CODE, success, info, dim, result } from './chunk-4O4G2CDE.mjs';
4
+ import { ApiClient } from './chunk-NYXA6X56.mjs';
5
+ import { readAuth, writeProjectLink } from './chunk-MLE4MVYC.mjs';
6
+ import { CliError, CLI_ERROR_CODE, success, info, dim, result } from './chunk-3QUK5BPY.mjs';
6
7
 
7
8
  // src/commands/link.ts
8
9
  function projectEndpoint(businessId, projectId) {
@@ -32,14 +33,30 @@ async function run(argv) {
32
33
  linkedAt: (/* @__PURE__ */ new Date()).toISOString()
33
34
  };
34
35
  await writeProjectLink(link);
36
+ const originConfigured = await configureOrigin(link.remoteUrl);
35
37
  success(`Linked to ${project.name} (${project.id})`);
36
38
  if (link.remoteUrl) info(dim(`remote: ${link.remoteUrl}`));
37
39
  result({
38
40
  project: { id: project.id, name: project.name },
39
41
  business: { id: project.business_id },
40
42
  remote_url: link.remoteUrl ?? null,
41
- default_branch: link.defaultBranch ?? null
43
+ default_branch: link.defaultBranch ?? null,
44
+ origin_configured: originConfigured
42
45
  });
43
46
  }
47
+ async function configureOrigin(remoteUrl) {
48
+ if (!remoteUrl) return false;
49
+ const root = await gitDetectRoot(process.cwd());
50
+ if (!root) return false;
51
+ const existing = await gitGetRemoteUrl(root);
52
+ if (existing === remoteUrl) return true;
53
+ if (existing) {
54
+ info(dim(`origin already points at ${existing}; project remote is ${remoteUrl}`));
55
+ return false;
56
+ }
57
+ await gitAddRemote(root, remoteUrl);
58
+ info(dim(`origin \u2192 ${remoteUrl}`));
59
+ return true;
60
+ }
44
61
 
45
62
  export { run as default };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { parseArgs, flagBool, flagString } from './chunk-5KYR6WJB.mjs';
3
- import { isJsonMode, result, info, CliError, CLI_ERROR_CODE, configureOutput, OUTPUT_MODE } from './chunk-4O4G2CDE.mjs';
3
+ import { isJsonMode, result, info, CliError, CLI_ERROR_CODE, configureOutput, OUTPUT_MODE } from './chunk-3QUK5BPY.mjs';
4
4
  import { promises } from 'fs';
5
5
  import path from 'path';
6
6
  import { parse } from '@babel/parser';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { REGISTRY_INDEX } from './chunk-BDC7XQIL.mjs';
2
+ import { REGISTRY_INDEX } from './chunk-YJDQYKZU.mjs';
3
3
  import { parseArgs, flagBool } from './chunk-5KYR6WJB.mjs';
4
- import { CliError, CLI_ERROR_CODE, info, bold, dim, green, result } from './chunk-4O4G2CDE.mjs';
4
+ import { CliError, CLI_ERROR_CODE, info, bold, dim, green, result } from './chunk-3QUK5BPY.mjs';
5
5
 
6
6
  // src/commands/list.ts
7
7
  async function run(argv) {
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import { generatePkcePair, openBrowser } from './chunk-IK6NQHTG.mjs';
2
+ import { generatePkcePair, openBrowser } from './chunk-3KRSHO6J.mjs';
3
3
  import { parseArgs, flagString, flagBool } from './chunk-5KYR6WJB.mjs';
4
- import { resolveBaseUrl, ApiClient } from './chunk-TOQGLBWF.mjs';
5
- import { writeAuth } from './chunk-6CHBU7O4.mjs';
6
- import { CliError, CLI_ERROR_CODE, success, result, isJsonMode, step, info, dim } from './chunk-4O4G2CDE.mjs';
4
+ import { resolveBaseUrl, ApiClient } from './chunk-NYXA6X56.mjs';
5
+ import { writeAuth } from './chunk-MLE4MVYC.mjs';
6
+ import { CliError, CLI_ERROR_CODE, success, result, isJsonMode, step, info, dim } from './chunk-3QUK5BPY.mjs';
7
7
  import os from 'os';
8
8
 
9
9
  var FLAG_API_KEY = "api-key";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { clearAuth } from './chunk-6CHBU7O4.mjs';
3
- import { success, info, result } from './chunk-4O4G2CDE.mjs';
2
+ import { clearAuth } from './chunk-MLE4MVYC.mjs';
3
+ import { success, info, result } from './chunk-3QUK5BPY.mjs';
4
4
 
5
5
  // src/commands/logout.ts
6
6
  async function run(_argv) {
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { TERMINAL_DEPLOYMENT_STATUSES } from './chunk-MXYUAJEW.mjs';
3
3
  import { parseArgs, flagString, flagBool } from './chunk-5KYR6WJB.mjs';
4
- import { ApiClient } from './chunk-TOQGLBWF.mjs';
5
- import { readAuth, readProjectLink, readProjectState } from './chunk-6CHBU7O4.mjs';
6
- import { CliError, CLI_ERROR_CODE, isJsonMode, failure, result, red } from './chunk-4O4G2CDE.mjs';
4
+ import { ApiClient } from './chunk-NYXA6X56.mjs';
5
+ import { readAuth, readProjectLink, readProjectState } from './chunk-MLE4MVYC.mjs';
6
+ import { CliError, CLI_ERROR_CODE, isJsonMode, failure, result, red } from './chunk-3QUK5BPY.mjs';
7
7
 
8
8
  // src/commands/logs.ts
9
9
  var FLAG_DEPLOYMENT = "deployment";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { parseArgs, flagString, flagBool } from './chunk-5KYR6WJB.mjs';
3
- import { CliError, CLI_ERROR_CODE, info, dim } from './chunk-4O4G2CDE.mjs';
3
+ import { CliError, CLI_ERROR_CODE, info, dim } from './chunk-3QUK5BPY.mjs';
4
4
  import { spawn } from 'child_process';
5
5
  import { existsSync, writeFileSync } from 'fs';
6
6
  import path from 'path';
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { REPO_PROVIDER } from './chunk-MXYUAJEW.mjs';
3
3
  import { parseArgs, flagString, flagBool } from './chunk-5KYR6WJB.mjs';
4
- import { ApiClient } from './chunk-TOQGLBWF.mjs';
5
- import { readAuth } from './chunk-6CHBU7O4.mjs';
6
- import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-4O4G2CDE.mjs';
4
+ import { ApiClient } from './chunk-NYXA6X56.mjs';
5
+ import { readAuth } from './chunk-MLE4MVYC.mjs';
6
+ import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-3QUK5BPY.mjs';
7
7
 
8
8
  // src/commands/projects.ts
9
9
  var SUB_LS = "ls";
@@ -176,8 +176,8 @@ async function createProject(client, businessId, name, options = {}) {
176
176
  info(dim(` remote: ${repo.remote_url}`));
177
177
  info("");
178
178
  info(dim("Wire your local repo:"));
179
- info(dim(` cimplify link ${project.id}`));
180
- info(dim(` git init && git remote add origin ${repo.remote_url}`));
179
+ info(dim(" git init"));
180
+ info(dim(` cimplify link ${project.id} # configures origin for you`));
181
181
  info(dim(` git add . && git commit -m "Initial commit"`));
182
182
  info(dim(` cimplify deploy`));
183
183
  result({
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ export { run as default, fetchCloneToken, fetchRepoRecord } from './chunk-A6WHBSXZ.mjs';
3
+ import './chunk-TH4XENKH.mjs';
4
+ import './chunk-MXYUAJEW.mjs';
5
+ import './chunk-KN2YSKXZ.mjs';
6
+ import './chunk-5KYR6WJB.mjs';
7
+ import './chunk-NYXA6X56.mjs';
8
+ import './chunk-MLE4MVYC.mjs';
9
+ import './chunk-3QUK5BPY.mjs';
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { pollDeployment } from './chunk-PDGKBATF.mjs';
2
+ import { pollDeployment } from './chunk-NK6VC264.mjs';
3
3
  import { DEPLOYMENT_STATUS, DEPLOY_TRIGGER } from './chunk-MXYUAJEW.mjs';
4
4
  import { parseArgs, flagBool } from './chunk-5KYR6WJB.mjs';
5
- import { ApiClient } from './chunk-TOQGLBWF.mjs';
6
- import { readAuth, readProjectLink, writeProjectState } from './chunk-6CHBU7O4.mjs';
7
- import { CliError, CLI_ERROR_CODE, step, success, info, dim, result, EXIT_CODE } from './chunk-4O4G2CDE.mjs';
5
+ import { ApiClient } from './chunk-NYXA6X56.mjs';
6
+ import { readAuth, readProjectLink, writeProjectState } from './chunk-MLE4MVYC.mjs';
7
+ import { CliError, CLI_ERROR_CODE, step, success, info, dim, result, EXIT_CODE } from './chunk-3QUK5BPY.mjs';
8
8
 
9
9
  // src/commands/rollback.ts
10
10
  var FLAG_NO_POLL = "no-poll";
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { DEPLOYMENT_STATUS } from './chunk-MXYUAJEW.mjs';
3
3
  import { parseArgs } from './chunk-5KYR6WJB.mjs';
4
- import { ApiClient } from './chunk-TOQGLBWF.mjs';
5
- import { readAuth, readProjectLink, readProjectState } from './chunk-6CHBU7O4.mjs';
6
- import { bold, dim, info, result } from './chunk-4O4G2CDE.mjs';
4
+ import { ApiClient } from './chunk-NYXA6X56.mjs';
5
+ import { readAuth, readProjectLink, readProjectState } from './chunk-MLE4MVYC.mjs';
6
+ import { bold, dim, info, result } from './chunk-3QUK5BPY.mjs';
7
7
 
8
8
  // src/commands/status.ts
9
9
  var QUERY_LIMIT = "limit";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { clearProjectLink } from './chunk-6CHBU7O4.mjs';
3
- import { success, info, result } from './chunk-4O4G2CDE.mjs';
2
+ import { clearProjectLink } from './chunk-MLE4MVYC.mjs';
3
+ import { success, info, result } from './chunk-3QUK5BPY.mjs';
4
4
 
5
5
  // src/commands/unlink.ts
6
6
  async function run(_argv) {
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { package_default } from './chunk-5YVMA7A5.mjs';
3
- import { promptYesNo } from './chunk-5ZQURRIM.mjs';
2
+ import { promptYesNo } from './chunk-TH4XENKH.mjs';
3
+ import { package_default } from './chunk-GCQKTUXN.mjs';
4
4
  import { parseArgs, flagBool, flagString } from './chunk-5KYR6WJB.mjs';
5
- import { success, bold, info, dim, result, failure, CliError, CLI_ERROR_CODE, step, isJsonMode } from './chunk-4O4G2CDE.mjs';
5
+ import { success, bold, info, dim, result, failure, CliError, CLI_ERROR_CODE, step, isJsonMode } from './chunk-3QUK5BPY.mjs';
6
6
  import { spawn } from 'child_process';
7
7
  import { basename, dirname } from 'path';
8
8
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { ApiClient } from './chunk-TOQGLBWF.mjs';
3
- import { readAuth } from './chunk-6CHBU7O4.mjs';
4
- import { info, bold, dim, result } from './chunk-4O4G2CDE.mjs';
2
+ import { ApiClient } from './chunk-NYXA6X56.mjs';
3
+ import { readAuth } from './chunk-MLE4MVYC.mjs';
4
+ import { info, bold, dim, result } from './chunk-3QUK5BPY.mjs';
5
5
 
6
6
  // src/commands/whoami.ts
7
7
  var ENDPOINT_AUTH_ME = "/v1/auth/me";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cimplify/cli",
3
- "version": "0.13.5",
3
+ "version": "0.15.0",
4
4
  "description": "Cimplify CLI — deploy, manage env vars, link projects, and scaffold storefronts",
5
5
  "keywords": [
6
6
  "cimplify",
@@ -41,7 +41,7 @@
41
41
  "@babel/parser": "^8.0.4",
42
42
  "@babel/traverse": "^8.0.4",
43
43
  "@babel/types": "^8.0.4",
44
- "@cimplify/sdk": "^0.100.5",
44
+ "@cimplify/sdk": "^0.102.0",
45
45
  "re2js": "^1.4.0"
46
46
  },
47
47
  "devDependencies": {
@@ -17,7 +17,7 @@
17
17
  "check": "bun run typecheck && bun run test:run"
18
18
  },
19
19
  "dependencies": {
20
- "@cimplify/sdk": "^0.100.5",
20
+ "@cimplify/sdk": "^0.102.0",
21
21
  "next": "^16.2.6",
22
22
  "react": "^19.0.0",
23
23
  "react-dom": "^19.0.0"
@@ -17,7 +17,7 @@
17
17
  "check": "bun run typecheck && bun run test:run"
18
18
  },
19
19
  "dependencies": {
20
- "@cimplify/sdk": "^0.100.5",
20
+ "@cimplify/sdk": "^0.102.0",
21
21
  "next": "^16.2.6",
22
22
  "react": "^19.0.0",
23
23
  "react-dom": "^19.0.0"
@@ -19,7 +19,7 @@
19
19
  "check": "bun run typecheck && bun run test:run"
20
20
  },
21
21
  "dependencies": {
22
- "@cimplify/sdk": "^0.100.5",
22
+ "@cimplify/sdk": "^0.102.0",
23
23
  "next": "^16.2.6",
24
24
  "react": "^19.0.0",
25
25
  "react-dom": "^19.0.0"
@@ -17,7 +17,7 @@
17
17
  "check": "bun run typecheck && bun run test:run"
18
18
  },
19
19
  "dependencies": {
20
- "@cimplify/sdk": "^0.100.5",
20
+ "@cimplify/sdk": "^0.102.0",
21
21
  "next": "^16.2.6",
22
22
  "react": "^19.0.0",
23
23
  "react-dom": "^19.0.0"
@@ -17,7 +17,7 @@
17
17
  "check": "bun run typecheck && bun run test:run"
18
18
  },
19
19
  "dependencies": {
20
- "@cimplify/sdk": "^0.100.5",
20
+ "@cimplify/sdk": "^0.102.0",
21
21
  "next": "^16.2.6",
22
22
  "react": "^19.0.0",
23
23
  "react-dom": "^19.0.0"