@cimplify/cli 0.3.1 → 0.5.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 (47) hide show
  1. package/dist/{add-OUMIT4YX.mjs → add-MX4655EX.mjs} +3 -3
  2. package/dist/{assets-DMK2QOPD.mjs → assets-EBEMMENZ.mjs} +3 -3
  3. package/dist/auth-step-up-BIUYQJP6.mjs +82 -0
  4. package/dist/{chunk-I6P3I2YJ.mjs → chunk-AY23RQE6.mjs} +5 -5
  5. package/dist/{chunk-YI7UMMM7.mjs → chunk-DBZ3UOQ2.mjs} +1 -1
  6. package/dist/{chunk-IQJ45AK3.mjs → chunk-DCWHOH2S.mjs} +4 -1
  7. package/dist/{chunk-I3XQSSOT.mjs → chunk-E2T2SBP5.mjs} +6 -2
  8. package/dist/{login-7O7ZXKU3.mjs → chunk-GLXONXS3.mjs} +10 -126
  9. package/dist/{chunk-RZQTHTXX.mjs → chunk-ITAFAORS.mjs} +1 -1
  10. package/dist/{chunk-RRY3NEZZ.mjs → chunk-K5464A3L.mjs} +1 -1
  11. package/dist/{chunk-D7WMSGKK.mjs → chunk-MAOO6ZZ5.mjs} +22 -3
  12. package/dist/{chunk-QGBXGDA5.mjs → chunk-R3FDBXR6.mjs} +4 -4
  13. package/dist/{chunk-LS2VTSMQ.mjs → chunk-UBAI443T.mjs} +9 -2
  14. package/dist/{chunk-MOZQODQS.mjs → chunk-VTR5R5NQ.mjs} +1 -1
  15. package/dist/{chunk-42PFJBC6.mjs → chunk-Z5DEA7YM.mjs} +8 -8
  16. package/dist/{deploy-UKOOPJAE.mjs → deploy-3IFXUWPM.mjs} +7 -7
  17. package/dist/{dev-FD4PM3UD.mjs → dev-ONW2S77K.mjs} +4 -4
  18. package/dist/dispatcher.mjs +39 -26
  19. package/dist/{doctor-AY7VDIJZ.mjs → doctor-DGO3UAJB.mjs} +8 -8
  20. package/dist/{domains-JQMV6GAP.mjs → domains-AHH56CL7.mjs} +4 -4
  21. package/dist/{env-EVMYQUIK.mjs → env-7ISJ73YI.mjs} +5 -5
  22. package/dist/{explain-QZVAK5I3.mjs → explain-IJLIQUYJ.mjs} +2 -2
  23. package/dist/introspect-KID4YJYV.mjs +8 -0
  24. package/dist/{link-X3E4UZBF.mjs → link-DZSILT5N.mjs} +3 -3
  25. package/dist/{list-TEQ73IR7.mjs → list-5PMRTZV3.mjs} +2 -2
  26. package/dist/login-3OD4ND2H.mjs +153 -0
  27. package/dist/{logout-DJDINVDF.mjs → logout-3RLBZ33M.mjs} +2 -2
  28. package/dist/{logs-KUKGEXR2.mjs → logs-YNN2PQ24.mjs} +3 -3
  29. package/dist/{projects-364HGWHO.mjs → projects-JSEC2YCX.mjs} +3 -3
  30. package/dist/repo-WOBWKEAO.mjs +8 -0
  31. package/dist/{rollback-5YALPQXL.mjs → rollback-DD4RNRFM.mjs} +4 -4
  32. package/dist/{status-W4HW3CX3.mjs → status-JSYXM5RT.mjs} +3 -3
  33. package/dist/{unlink-HIIW57OO.mjs → unlink-RFK74SFP.mjs} +2 -2
  34. package/dist/{update-2DCENLHM.mjs → update-64K4Z3SF.mjs} +3 -3
  35. package/dist/{whoami-LACWBSNL.mjs → whoami-DNZ7RUTH.mjs} +3 -3
  36. package/package.json +4 -1
  37. package/templates/manifest.json +166 -0
  38. package/templates/storefront-auto/metadata.json +13 -0
  39. package/templates/storefront-bakery/metadata.json +13 -0
  40. package/templates/storefront-fashion/metadata.json +13 -0
  41. package/templates/storefront-grocery/metadata.json +13 -0
  42. package/templates/storefront-pharmacy/metadata.json +13 -0
  43. package/templates/storefront-restaurant/metadata.json +13 -0
  44. package/templates/storefront-retail/metadata.json +13 -0
  45. package/templates/storefront-services/metadata.json +13 -0
  46. package/dist/introspect-MNTC26UY.mjs +0 -8
  47. package/dist/repo-26N2CHF6.mjs +0 -8
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import { pollDeployment } from './chunk-MOZQODQS.mjs';
3
- import { gitDetectRoot, gitStatusPorcelain, gitCurrentBranch, gitCurrentSha, gitGetRemoteUrl, isFreestyleRemote, gitPushToUrl, gitPush } from './chunk-RRY3NEZZ.mjs';
4
- import { fetchCloneToken } from './chunk-QGBXGDA5.mjs';
5
- import { promptYesNo } from './chunk-RZQTHTXX.mjs';
2
+ import { pollDeployment } from './chunk-VTR5R5NQ.mjs';
3
+ import { gitDetectRoot, gitStatusPorcelain, gitCurrentBranch, gitCurrentSha, gitGetRemoteUrl, isFreestyleRemote, gitPushToUrl, gitPush } from './chunk-K5464A3L.mjs';
4
+ import { fetchCloneToken } from './chunk-R3FDBXR6.mjs';
5
+ import { promptYesNo } from './chunk-ITAFAORS.mjs';
6
6
  import { TOKEN_PURPOSE, ENV_SCOPE, DEPLOY_TRIGGER, DEPLOYMENT_STATUS } from './chunk-MXYUAJEW.mjs';
7
7
  import { parseArgs, flagBool, flagString } from './chunk-C4M3DXKC.mjs';
8
- import { ApiClient } from './chunk-D7WMSGKK.mjs';
9
- import { readAuth, readProjectLink, writeProjectState } from './chunk-LS2VTSMQ.mjs';
10
- import { CliError, CLI_ERROR_CODE, step, info, dim, success, result, EXIT_CODE } from './chunk-I3XQSSOT.mjs';
8
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
9
+ import { readAuth, readProjectLink, writeProjectState } from './chunk-UBAI443T.mjs';
10
+ import { CliError, CLI_ERROR_CODE, step, info, dim, success, result, EXIT_CODE } from './chunk-E2T2SBP5.mjs';
11
11
 
12
12
  // src/commands/deploy.ts
13
13
  var FLAG_PROD = "prod";
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { parseEnvFile, formatEnvFile } from './chunk-YI7UMMM7.mjs';
2
+ import { parseEnvFile, formatEnvFile } from './chunk-DBZ3UOQ2.mjs';
3
3
  import { ENV_SCOPE, PUBLIC_ENV_PREFIX } from './chunk-MXYUAJEW.mjs';
4
4
  import { parseArgs, flagBool } from './chunk-C4M3DXKC.mjs';
5
- import { ApiClient } from './chunk-D7WMSGKK.mjs';
6
- import { readAuth, readProjectLink } from './chunk-LS2VTSMQ.mjs';
7
- import { info, CliError, CLI_ERROR_CODE, dim } from './chunk-I3XQSSOT.mjs';
5
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
6
+ import { readAuth, readProjectLink } from './chunk-UBAI443T.mjs';
7
+ import { info, CliError, CLI_ERROR_CODE, dim } from './chunk-E2T2SBP5.mjs';
8
8
  import { spawn } from 'child_process';
9
9
  import { promises } from 'fs';
10
10
  import path from 'path';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { TEMPLATES } from './chunk-42PFJBC6.mjs';
3
- import { package_default } from './chunk-IQJ45AK3.mjs';
2
+ import { TEMPLATES } from './chunk-Z5DEA7YM.mjs';
3
+ import { package_default } from './chunk-DCWHOH2S.mjs';
4
4
 
5
5
  // src/dispatcher.ts
6
6
  var VERSION = package_default.version ?? "unknown";
@@ -121,28 +121,32 @@ Need the mock storefront server? It ships with @cimplify/sdk:
121
121
  bunx @cimplify/sdk mock [flags] Boot the local Cimplify API mock
122
122
  `;
123
123
  var COMMANDS = {
124
- login: () => import('./login-7O7ZXKU3.mjs'),
125
- logout: () => import('./logout-DJDINVDF.mjs'),
126
- whoami: () => import('./whoami-LACWBSNL.mjs'),
127
- projects: () => import('./projects-364HGWHO.mjs'),
128
- link: () => import('./link-X3E4UZBF.mjs'),
129
- unlink: () => import('./unlink-HIIW57OO.mjs'),
130
- deploy: () => import('./deploy-UKOOPJAE.mjs'),
131
- rollback: () => import('./rollback-5YALPQXL.mjs'),
132
- env: () => import('./env-EVMYQUIK.mjs'),
133
- domains: () => import('./domains-JQMV6GAP.mjs'),
134
- logs: () => import('./logs-KUKGEXR2.mjs'),
135
- status: () => import('./status-W4HW3CX3.mjs'),
136
- dev: () => import('./dev-FD4PM3UD.mjs'),
137
- introspect: () => import('./introspect-MNTC26UY.mjs'),
138
- doctor: () => import('./doctor-AY7VDIJZ.mjs'),
139
- explain: () => import('./explain-QZVAK5I3.mjs'),
140
- assets: () => import('./assets-DMK2QOPD.mjs'),
141
- repo: () => import('./repo-26N2CHF6.mjs'),
142
- list: () => import('./list-TEQ73IR7.mjs'),
143
- add: () => import('./add-OUMIT4YX.mjs'),
144
- update: () => import('./update-2DCENLHM.mjs'),
145
- upgrade: () => import('./update-2DCENLHM.mjs')
124
+ login: () => import('./login-3OD4ND2H.mjs'),
125
+ logout: () => import('./logout-3RLBZ33M.mjs'),
126
+ whoami: () => import('./whoami-DNZ7RUTH.mjs'),
127
+ projects: () => import('./projects-JSEC2YCX.mjs'),
128
+ link: () => import('./link-DZSILT5N.mjs'),
129
+ unlink: () => import('./unlink-RFK74SFP.mjs'),
130
+ deploy: () => import('./deploy-3IFXUWPM.mjs'),
131
+ rollback: () => import('./rollback-DD4RNRFM.mjs'),
132
+ env: () => import('./env-7ISJ73YI.mjs'),
133
+ domains: () => import('./domains-AHH56CL7.mjs'),
134
+ logs: () => import('./logs-YNN2PQ24.mjs'),
135
+ status: () => import('./status-JSYXM5RT.mjs'),
136
+ dev: () => import('./dev-ONW2S77K.mjs'),
137
+ introspect: () => import('./introspect-KID4YJYV.mjs'),
138
+ doctor: () => import('./doctor-DGO3UAJB.mjs'),
139
+ explain: () => import('./explain-IJLIQUYJ.mjs'),
140
+ assets: () => import('./assets-EBEMMENZ.mjs'),
141
+ repo: () => import('./repo-WOBWKEAO.mjs'),
142
+ list: () => import('./list-5PMRTZV3.mjs'),
143
+ add: () => import('./add-MX4655EX.mjs'),
144
+ update: () => import('./update-64K4Z3SF.mjs'),
145
+ upgrade: () => import('./update-64K4Z3SF.mjs'),
146
+ "auth-step-up": () => import('./auth-step-up-BIUYQJP6.mjs')
147
+ };
148
+ var COMMAND_PREFIXES = {
149
+ auth: { "step-up": "auth-step-up" }
146
150
  };
147
151
  var GLOBAL_FLAGS = /* @__PURE__ */ new Set(["--json", "--yes", "-y"]);
148
152
  function extractGlobalFlags(argv) {
@@ -180,12 +184,21 @@ async function main() {
180
184
  if (TOP_LEVEL_FLAGS.has(maybeSub)) {
181
185
  return await runDispatcherFlag(maybeSub, cleaned.json);
182
186
  }
183
- const sub = maybeSub;
184
- const args = rest;
187
+ let sub = maybeSub;
188
+ let args = rest;
185
189
  if (sub === "init") {
186
190
  await runInit(args);
187
191
  return;
188
192
  }
193
+ const prefixMap = COMMAND_PREFIXES[sub];
194
+ if (prefixMap && args.length > 0) {
195
+ const sub2 = args[0];
196
+ const mapped = prefixMap[sub2];
197
+ if (mapped) {
198
+ sub = mapped;
199
+ args = args.slice(1);
200
+ }
201
+ }
189
202
  const loader = COMMANDS[sub];
190
203
  if (!loader) {
191
204
  console.error(`cimplify: unknown command "${sub}"`);
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import { gatherIntrospection } from './chunk-I6P3I2YJ.mjs';
3
- import './chunk-RRY3NEZZ.mjs';
4
- import './chunk-YI7UMMM7.mjs';
5
- import './chunk-IQJ45AK3.mjs';
2
+ import { gatherIntrospection } from './chunk-AY23RQE6.mjs';
3
+ import './chunk-K5464A3L.mjs';
4
+ import './chunk-DBZ3UOQ2.mjs';
5
+ import './chunk-DCWHOH2S.mjs';
6
6
  import { parseArgs, flagBool } from './chunk-C4M3DXKC.mjs';
7
- import { ApiClient } from './chunk-D7WMSGKK.mjs';
8
- import { readAuthOrNull } from './chunk-LS2VTSMQ.mjs';
9
- import { bold, dim, info, result, isCliError, CLI_ERROR_CODE, red, yellow, green } from './chunk-I3XQSSOT.mjs';
7
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
8
+ import { readAuthOrNull } from './chunk-UBAI443T.mjs';
9
+ import { bold, dim, info, result, isCliError, CLI_ERROR_CODE, red, yellow, green } from './chunk-E2T2SBP5.mjs';
10
10
  import { promises } from 'fs';
11
11
  import path from 'path';
12
12
 
@@ -200,7 +200,7 @@ async function runRemoteChecks(snapshot, auth) {
200
200
  let authValid;
201
201
  try {
202
202
  const me = await client.get(ENDPOINT_AUTH_ME);
203
- const env = auth.apiKey.startsWith("dk_test_") || auth.apiKey.startsWith("sk_test_") ? "test" : "live";
203
+ const env = auth.apiKey.includes("_test_") ? "test" : "live";
204
204
  authValid = ok("auth_valid", `${env} token \xB7 business ${me.business_id}`);
205
205
  } catch (err) {
206
206
  if (isCliError(err) && err.code === CLI_ERROR_CODE.AUTH_FAILED) {
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { promptYesNo } from './chunk-RZQTHTXX.mjs';
2
+ import { promptYesNo } from './chunk-ITAFAORS.mjs';
3
3
  import { ENV_SCOPE, DOMAIN_TYPE } from './chunk-MXYUAJEW.mjs';
4
4
  import { parseArgs, flagBool, flagString } from './chunk-C4M3DXKC.mjs';
5
- import { ApiClient } from './chunk-D7WMSGKK.mjs';
6
- import { readAuth, readProjectLink } from './chunk-LS2VTSMQ.mjs';
7
- import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-I3XQSSOT.mjs';
5
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
6
+ import { readAuth, readProjectLink } from './chunk-UBAI443T.mjs';
7
+ import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-E2T2SBP5.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-YI7UMMM7.mjs';
3
- import { promptYesNo } from './chunk-RZQTHTXX.mjs';
2
+ import { formatEnvFile, parseEnvFile, parseKeyValueArg } from './chunk-DBZ3UOQ2.mjs';
3
+ import { promptYesNo } from './chunk-ITAFAORS.mjs';
4
4
  import { ENV_SCOPE, PUBLIC_ENV_PREFIX, SECRET_MASK } from './chunk-MXYUAJEW.mjs';
5
5
  import { parseArgs, flagString, flagBool } from './chunk-C4M3DXKC.mjs';
6
- import { ApiClient } from './chunk-D7WMSGKK.mjs';
7
- import { readAuth, readProjectLink } from './chunk-LS2VTSMQ.mjs';
8
- import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-I3XQSSOT.mjs';
6
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
7
+ import { readAuth, readProjectLink } from './chunk-UBAI443T.mjs';
8
+ import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-E2T2SBP5.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-IQJ45AK3.mjs';
2
+ import { package_default } from './chunk-DCWHOH2S.mjs';
3
3
  import { parseArgs } from './chunk-C4M3DXKC.mjs';
4
- import { bold, dim, info, result, CliError, CLI_ERROR_CODE } from './chunk-I3XQSSOT.mjs';
4
+ import { bold, dim, info, result, CliError, CLI_ERROR_CODE } from './chunk-E2T2SBP5.mjs';
5
5
 
6
6
  // src/embedded-docs.ts
7
7
  var TOPICS = [
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export { run as default, extractMockSeed, gatherIntrospection, renderIntrospection } from './chunk-AY23RQE6.mjs';
3
+ import './chunk-K5464A3L.mjs';
4
+ import './chunk-DBZ3UOQ2.mjs';
5
+ import './chunk-DCWHOH2S.mjs';
6
+ import './chunk-C4M3DXKC.mjs';
7
+ import './chunk-UBAI443T.mjs';
8
+ import './chunk-E2T2SBP5.mjs';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { parseArgs } from './chunk-C4M3DXKC.mjs';
3
- import { ApiClient } from './chunk-D7WMSGKK.mjs';
4
- import { readAuth, writeProjectLink } from './chunk-LS2VTSMQ.mjs';
5
- import { CliError, CLI_ERROR_CODE, success, info, dim, result } from './chunk-I3XQSSOT.mjs';
3
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
4
+ import { readAuth, writeProjectLink } from './chunk-UBAI443T.mjs';
5
+ import { CliError, CLI_ERROR_CODE, success, info, dim, result } from './chunk-E2T2SBP5.mjs';
6
6
 
7
7
  // src/commands/link.ts
8
8
  function projectEndpoint(businessId, projectId) {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { REGISTRY_INDEX } from './chunk-42PFJBC6.mjs';
2
+ import { REGISTRY_INDEX } from './chunk-Z5DEA7YM.mjs';
3
3
  import { parseArgs, flagBool } from './chunk-C4M3DXKC.mjs';
4
- import { CliError, CLI_ERROR_CODE, info, bold, dim, green, result } from './chunk-I3XQSSOT.mjs';
4
+ import { CliError, CLI_ERROR_CODE, info, bold, dim, green, result } from './chunk-E2T2SBP5.mjs';
5
5
 
6
6
  // src/commands/list.ts
7
7
  async function run(argv) {
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env node
2
+ import { generatePkcePair, generateState, startLoopbackServer, openBrowser } from './chunk-GLXONXS3.mjs';
3
+ import { parseArgs, flagString, flagBool } from './chunk-C4M3DXKC.mjs';
4
+ import { resolveBaseUrl, ApiClient } from './chunk-MAOO6ZZ5.mjs';
5
+ import { writeAuth } from './chunk-UBAI443T.mjs';
6
+ import { CliError, CLI_ERROR_CODE, success, result, isJsonMode, step, info, dim } from './chunk-E2T2SBP5.mjs';
7
+ import os from 'os';
8
+
9
+ var FLAG_API_KEY = "api-key";
10
+ var FLAG_BASE_URL = "base-url";
11
+ var FLAG_NO_BROWSER = "no-browser";
12
+ var FLAG_SCOPE = "scope";
13
+ var VALID_CLI_SCOPES = /* @__PURE__ */ new Set([
14
+ "cli:read",
15
+ "cli:write",
16
+ "cli:deploy",
17
+ "cli:admin"
18
+ ]);
19
+ var ENDPOINT_AUTH_ME = "/v1/auth/me";
20
+ var ENDPOINT_CLI_START = "/v1/auth/cli/start";
21
+ var ENDPOINT_CLI_TOKEN = "/v1/auth/cli/token";
22
+ var KEY_PREFIX_CAK = "cak_";
23
+ var KEY_PREFIX_CSK = "csk_";
24
+ var PRODUCT_NAME = "cimplify-cli";
25
+ async function run(argv) {
26
+ const args = parseArgs(argv);
27
+ const baseUrl = resolveBaseUrl(flagString(args, FLAG_BASE_URL));
28
+ const explicitKey = flagString(args, FLAG_API_KEY);
29
+ if (explicitKey) {
30
+ await loginWithKey(baseUrl, explicitKey);
31
+ return;
32
+ }
33
+ const scopes = parseScopeFlag(flagString(args, FLAG_SCOPE));
34
+ await loginWithBrowser(baseUrl, flagBool(args, FLAG_NO_BROWSER), scopes);
35
+ }
36
+ function parseScopeFlag(raw) {
37
+ if (!raw) return [];
38
+ const items = raw.split(",").map((s) => s.trim()).filter(Boolean);
39
+ for (const s of items) {
40
+ if (!VALID_CLI_SCOPES.has(s)) {
41
+ throw new CliError(
42
+ CLI_ERROR_CODE.INVALID_INPUT,
43
+ `Unknown scope "${s}". Valid: ${Array.from(VALID_CLI_SCOPES).join(", ")}.`
44
+ );
45
+ }
46
+ }
47
+ return items;
48
+ }
49
+ async function loginWithKey(baseUrl, apiKey) {
50
+ if (!apiKey.startsWith(KEY_PREFIX_CAK) && !apiKey.startsWith(KEY_PREFIX_CSK)) {
51
+ throw new CliError(
52
+ CLI_ERROR_CODE.INVALID_INPUT,
53
+ `API key must start with "${KEY_PREFIX_CAK}" or "${KEY_PREFIX_CSK}".`
54
+ );
55
+ }
56
+ const client = ApiClient.withKey(apiKey, baseUrl);
57
+ const me = await client.get(ENDPOINT_AUTH_ME);
58
+ await writeAuth({
59
+ apiKey,
60
+ apiBaseUrl: baseUrl,
61
+ accountId: me.id,
62
+ businessId: me.business_id,
63
+ email: me.email,
64
+ name: me.name,
65
+ savedAt: (/* @__PURE__ */ new Date()).toISOString()
66
+ });
67
+ success(`Logged in as ${me.email ?? me.name ?? me.id} (business ${me.business_id})`);
68
+ result({
69
+ logged_in: true,
70
+ account: { id: me.id, email: me.email ?? null, name: me.name ?? null },
71
+ business: { id: me.business_id },
72
+ method: "api_key"
73
+ });
74
+ }
75
+ async function loginWithBrowser(baseUrl, noBrowser, requestedScopes) {
76
+ if (isJsonMode()) {
77
+ throw new CliError(
78
+ CLI_ERROR_CODE.INTERACTIVE_REQUIRED,
79
+ "browser login is not supported in --json mode",
80
+ { remediation: "pass --api-key dk_\u2026 (create one in the dashboard or via `cimplify auth keys create`)" }
81
+ );
82
+ }
83
+ const pkce = generatePkcePair();
84
+ const state = generateState();
85
+ const loopback = await startLoopbackServer(baseUrl);
86
+ const startBody = {
87
+ code_challenge: pkce.codeChallenge,
88
+ code_challenge_method: pkce.codeChallengeMethod,
89
+ redirect_uri: loopback.redirectUri,
90
+ state,
91
+ client_meta: {
92
+ hostname: os.hostname(),
93
+ platform: process.platform,
94
+ arch: process.arch,
95
+ node_version: process.version,
96
+ product: PRODUCT_NAME
97
+ },
98
+ requested_scopes: requestedScopes
99
+ };
100
+ const unauthClient = ApiClient.unauthenticated(baseUrl);
101
+ const startResponse = await unauthClient.post(
102
+ ENDPOINT_CLI_START,
103
+ startBody
104
+ );
105
+ step("Opening browser to authorize this CLI...");
106
+ info(dim(startResponse.approval_url));
107
+ if (!noBrowser) {
108
+ openBrowser(startResponse.approval_url);
109
+ } else {
110
+ info("");
111
+ info(dim("Open the URL above in any browser to continue."));
112
+ }
113
+ let callback;
114
+ try {
115
+ callback = await loopback.awaitCallback(startResponse.expires_in_secs * 1e3);
116
+ } catch (err) {
117
+ loopback.close();
118
+ throw err;
119
+ }
120
+ if (callback.state !== state) {
121
+ throw new CliError(
122
+ CLI_ERROR_CODE.UNAUTHORIZED,
123
+ "OAuth state mismatch. Possible CSRF attempt \u2014 try again."
124
+ );
125
+ }
126
+ if (!callback.code) {
127
+ throw new CliError(
128
+ CLI_ERROR_CODE.UNAUTHORIZED,
129
+ "Login callback missing auth_code."
130
+ );
131
+ }
132
+ const token = await unauthClient.post(ENDPOINT_CLI_TOKEN, {
133
+ auth_code: callback.code,
134
+ code_verifier: pkce.codeVerifier,
135
+ redirect_uri: loopback.redirectUri
136
+ });
137
+ await writeAuth({
138
+ apiKey: token.access_token,
139
+ apiBaseUrl: baseUrl,
140
+ accountId: token.account_id,
141
+ businessId: token.business_id,
142
+ savedAt: (/* @__PURE__ */ new Date()).toISOString()
143
+ });
144
+ success(`Logged in (business ${token.business_id})`);
145
+ result({
146
+ logged_in: true,
147
+ account: { id: token.account_id, email: null, name: null },
148
+ business: { id: token.business_id },
149
+ method: "oauth_pkce"
150
+ });
151
+ }
152
+
153
+ export { run as default };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { clearAuth } from './chunk-LS2VTSMQ.mjs';
3
- import { success, info, result } from './chunk-I3XQSSOT.mjs';
2
+ import { clearAuth } from './chunk-UBAI443T.mjs';
3
+ import { success, info, result } from './chunk-E2T2SBP5.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-C4M3DXKC.mjs';
4
- import { ApiClient } from './chunk-D7WMSGKK.mjs';
5
- import { readAuth, readProjectLink, readProjectState } from './chunk-LS2VTSMQ.mjs';
6
- import { CliError, CLI_ERROR_CODE, isJsonMode, failure, result, red } from './chunk-I3XQSSOT.mjs';
4
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
5
+ import { readAuth, readProjectLink, readProjectState } from './chunk-UBAI443T.mjs';
6
+ import { CliError, CLI_ERROR_CODE, isJsonMode, failure, result, red } from './chunk-E2T2SBP5.mjs';
7
7
 
8
8
  // src/commands/logs.ts
9
9
  var FLAG_DEPLOYMENT = "deployment";
@@ -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-C4M3DXKC.mjs';
4
- import { ApiClient } from './chunk-D7WMSGKK.mjs';
5
- import { readAuth } from './chunk-LS2VTSMQ.mjs';
6
- import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-I3XQSSOT.mjs';
4
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
5
+ import { readAuth } from './chunk-UBAI443T.mjs';
6
+ import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-E2T2SBP5.mjs';
7
7
 
8
8
  // src/commands/projects.ts
9
9
  var SUB_LS = "ls";
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export { run as default, fetchCloneToken } from './chunk-R3FDBXR6.mjs';
3
+ import './chunk-ITAFAORS.mjs';
4
+ import './chunk-MXYUAJEW.mjs';
5
+ import './chunk-C4M3DXKC.mjs';
6
+ import './chunk-MAOO6ZZ5.mjs';
7
+ import './chunk-UBAI443T.mjs';
8
+ import './chunk-E2T2SBP5.mjs';
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { pollDeployment } from './chunk-MOZQODQS.mjs';
2
+ import { pollDeployment } from './chunk-VTR5R5NQ.mjs';
3
3
  import { DEPLOYMENT_STATUS, DEPLOY_TRIGGER } from './chunk-MXYUAJEW.mjs';
4
4
  import { parseArgs, flagBool } from './chunk-C4M3DXKC.mjs';
5
- import { ApiClient } from './chunk-D7WMSGKK.mjs';
6
- import { readAuth, readProjectLink, writeProjectState } from './chunk-LS2VTSMQ.mjs';
7
- import { CliError, CLI_ERROR_CODE, step, success, info, dim, result, EXIT_CODE } from './chunk-I3XQSSOT.mjs';
5
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
6
+ import { readAuth, readProjectLink, writeProjectState } from './chunk-UBAI443T.mjs';
7
+ import { CliError, CLI_ERROR_CODE, step, success, info, dim, result, EXIT_CODE } from './chunk-E2T2SBP5.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-C4M3DXKC.mjs';
4
- import { ApiClient } from './chunk-D7WMSGKK.mjs';
5
- import { readAuth, readProjectLink, readProjectState } from './chunk-LS2VTSMQ.mjs';
6
- import { bold, dim, info, result } from './chunk-I3XQSSOT.mjs';
4
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
5
+ import { readAuth, readProjectLink, readProjectState } from './chunk-UBAI443T.mjs';
6
+ import { bold, dim, info, result } from './chunk-E2T2SBP5.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-LS2VTSMQ.mjs';
3
- import { success, info, result } from './chunk-I3XQSSOT.mjs';
2
+ import { clearProjectLink } from './chunk-UBAI443T.mjs';
3
+ import { success, info, result } from './chunk-E2T2SBP5.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-IQJ45AK3.mjs';
3
- import { promptYesNo } from './chunk-RZQTHTXX.mjs';
2
+ import { package_default } from './chunk-DCWHOH2S.mjs';
3
+ import { promptYesNo } from './chunk-ITAFAORS.mjs';
4
4
  import { parseArgs, flagBool, flagString } from './chunk-C4M3DXKC.mjs';
5
- import { success, bold, info, dim, result, failure, CliError, CLI_ERROR_CODE, step, isJsonMode } from './chunk-I3XQSSOT.mjs';
5
+ import { success, bold, info, dim, result, failure, CliError, CLI_ERROR_CODE, step, isJsonMode } from './chunk-E2T2SBP5.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-D7WMSGKK.mjs';
3
- import { readAuth } from './chunk-LS2VTSMQ.mjs';
4
- import { info, bold, dim, result } from './chunk-I3XQSSOT.mjs';
2
+ import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
3
+ import { readAuth } from './chunk-UBAI443T.mjs';
4
+ import { info, bold, dim, result } from './chunk-E2T2SBP5.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.3.1",
3
+ "version": "0.5.0",
4
4
  "description": "Cimplify CLI — deploy, manage env vars, link projects, and scaffold storefronts",
5
5
  "keywords": [
6
6
  "cimplify",
@@ -23,6 +23,8 @@
23
23
  "build:binary": "bun run bundle-assets && bun scripts/build-binaries.ts",
24
24
  "build:binary:local": "bun run bundle-assets && bun scripts/build-binaries.ts --local",
25
25
  "sync:template-pins": "bun scripts/sync-template-pins.ts",
26
+ "publish:templates": "bun scripts/publish-templates.ts",
27
+ "publish:templates:dry": "bun scripts/publish-templates.ts --dry-run",
26
28
  "version": "bun scripts/sync-template-pins.ts && git add templates/*/package.json",
27
29
  "prepublishOnly": "bun scripts/sync-template-pins.ts && bun run build",
28
30
  "dev": "bun run bundle-assets && tsup --watch",
@@ -35,6 +37,7 @@
35
37
  "test:run": "vitest run"
36
38
  },
37
39
  "devDependencies": {
40
+ "@aws-sdk/client-s3": "^3.700.0",
38
41
  "@types/node": "^25.6.0",
39
42
  "@typescript/native-preview": "^7.0.0-dev.20260503.1",
40
43
  "tsup": "^8.5.1",