@localizeaso/cli 0.1.0-preview.3 → 0.1.0-preview.5

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
@@ -11,7 +11,7 @@ npx @localizeaso/cli@preview --help
11
11
  For local desktop or BYO-agent use, sign in once and store a local CLI session:
12
12
 
13
13
  ```sh
14
- printf '%s' "$LOCALIZEASO_PASSWORD" | localizeaso login --email you@example.com --password-stdin --staging
14
+ localizeaso login --staging
15
15
  localizeaso whoami --json
16
16
  ```
17
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@localizeaso/cli",
3
- "version": "0.1.0-preview.3",
3
+ "version": "0.1.0-preview.5",
4
4
  "description": "LocalizeASO command-line tools for agent-assisted App Store review workflows.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -125,19 +125,19 @@ export declare const LOCALIZEASO_AGENT_PASS_PACKAGING_DECISION: {
125
125
  readonly defaultPaidPlanLabel: "Agent Pass";
126
126
  readonly freeToolRole: "acquisition_and_trust";
127
127
  readonly recommendedFreeTool: "pricing_parity_cli";
128
- readonly pricingParityCliRole: "Use pricing parity, Astro CSV import, keyword-context conversion, and manifest generation as the useful free/OSS CLI wedge; charge when the user creates a persistent LocalizeASO review job with consent UI, history, Figma/apply handoffs, app slots, or hosted submit.";
129
- readonly openSourceBoundary: "Open-source local setup, keyword conversion, pricing-parity manifests, prompt/template generation, and already-approved local asc handoff helpers. Keep backend persistence, review history, consent screens, Figma apply plans, hosted AI, app slots, and hosted submit in paid LocalizeASO passes.";
128
+ readonly pricingParityCliRole: "Use pricing parity, Astro CSV import, keyword-context conversion, proposal templates, and one-app BYO agent onboarding as the useful free/OSS CLI wedge; charge when the user creates a persistent LocalizeASO review job with consent UI, history, Figma/apply handoffs, more app slots, or hosted submit.";
129
+ readonly openSourceBoundary: "Open-source local setup, keyword conversion, pricing-parity manifests, prompt/template generation, one-app BYO agent onboarding, and already-approved local asc handoff helpers. Keep backend persistence, review history, consent screens, Figma apply plans, hosted AI, additional app slots, and hosted submit in paid LocalizeASO passes.";
130
130
  readonly primaryRevenueSurface: "Human review/consent screens with current/proposed/final diffs, keyword evidence, warnings, approval receipts, review history, Figma apply plans, app slots, local asc handoffs after approval, and optional hosted AI or hosted submit convenience.";
131
- readonly freeToolIncludes: readonly ["local setup", "Astro/CSV keyword conversion", "prompt/template generation", "pricing parity manifests"];
131
+ readonly freeToolIncludes: readonly ["local setup", "Astro/CSV keyword conversion", "prompt/template generation", "one-app BYO agent onboarding", "pricing parity manifests"];
132
132
  readonly byoPaidIncludes: readonly ["persistent review jobs", "human review/consent screens with diffs and signal evidence", "review history", "approval receipts", "reviewer feedback", "Figma apply plans", "app slots", "local asc handoffs after human approval"];
133
133
  readonly hostedUpsellIncludes: readonly ["hosted submit-only pass for BYO/Codex proposals after human approval", "LocalizeASO-hosted AI proposal generation", "hosted App Store Connect upload/submit convenience after human approval", "larger app or team coverage"];
134
134
  readonly defaultPricingModel: "one_time_or_lifetime_byo_agent_pass";
135
135
  readonly recommendedOneTimePrices: {
136
- readonly agent: "$29";
137
- readonly submit: "$39";
138
- readonly launch: "$49";
139
- readonly global: "$149";
140
- readonly portfolio: "$299";
136
+ readonly agent: "$49";
137
+ readonly submit: "$49";
138
+ readonly launch: "$99";
139
+ readonly global: "$249";
140
+ readonly portfolio: "$499";
141
141
  };
142
142
  readonly avoidPositioning: readonly ["usage-based LocalizeASO AI pricing for BYO Codex/AI runs", "promising hosted submit inside Agent Pass", "requiring App Store Connect credentials for proposal review"];
143
143
  };
@@ -1 +1 @@
1
- {"version":3,"file":"monetization-boundary.d.ts","sourceRoot":"","sources":["../src/monetization-boundary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monetization-boundary.d.ts","sourceRoot":"","sources":["../src/monetization-boundary.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,14 @@ export const LOCALIZEASO_AGENT_PASS_PACKAGING_DECISION = {
3
3
  defaultPaidPlanLabel: 'Agent Pass',
4
4
  freeToolRole: 'acquisition_and_trust',
5
5
  recommendedFreeTool: 'pricing_parity_cli',
6
- pricingParityCliRole: 'Use pricing parity, Astro CSV import, keyword-context conversion, and manifest generation as the useful free/OSS CLI wedge; charge when the user creates a persistent LocalizeASO review job with consent UI, history, Figma/apply handoffs, app slots, or hosted submit.',
7
- openSourceBoundary: 'Open-source local setup, keyword conversion, pricing-parity manifests, prompt/template generation, and already-approved local asc handoff helpers. Keep backend persistence, review history, consent screens, Figma apply plans, hosted AI, app slots, and hosted submit in paid LocalizeASO passes.',
6
+ pricingParityCliRole: 'Use pricing parity, Astro CSV import, keyword-context conversion, proposal templates, and one-app BYO agent onboarding as the useful free/OSS CLI wedge; charge when the user creates a persistent LocalizeASO review job with consent UI, history, Figma/apply handoffs, more app slots, or hosted submit.',
7
+ openSourceBoundary: 'Open-source local setup, keyword conversion, pricing-parity manifests, prompt/template generation, one-app BYO agent onboarding, and already-approved local asc handoff helpers. Keep backend persistence, review history, consent screens, Figma apply plans, hosted AI, additional app slots, and hosted submit in paid LocalizeASO passes.',
8
8
  primaryRevenueSurface: 'Human review/consent screens with current/proposed/final diffs, keyword evidence, warnings, approval receipts, review history, Figma apply plans, app slots, local asc handoffs after approval, and optional hosted AI or hosted submit convenience.',
9
9
  freeToolIncludes: [
10
10
  'local setup',
11
11
  'Astro/CSV keyword conversion',
12
12
  'prompt/template generation',
13
+ 'one-app BYO agent onboarding',
13
14
  'pricing parity manifests',
14
15
  ],
15
16
  byoPaidIncludes: [
@@ -30,11 +31,11 @@ export const LOCALIZEASO_AGENT_PASS_PACKAGING_DECISION = {
30
31
  ],
31
32
  defaultPricingModel: 'one_time_or_lifetime_byo_agent_pass',
32
33
  recommendedOneTimePrices: {
33
- agent: '$29',
34
- submit: '$39',
35
- launch: '$49',
36
- global: '$149',
37
- portfolio: '$299',
34
+ agent: '$49',
35
+ submit: '$49',
36
+ launch: '$99',
37
+ global: '$249',
38
+ portfolio: '$499',
38
39
  },
39
40
  avoidPositioning: [
40
41
  'usage-based LocalizeASO AI pricing for BYO Codex/AI runs',
@@ -76,6 +77,7 @@ function buildLocalizeAsoPackageMatrix(packaging) {
76
77
  'pricing parity JSON and manifest conversion',
77
78
  'Astro/CSV keyword context conversion',
78
79
  'prompt and proposal-template generation from exported bundles',
80
+ 'one-app BYO agent onboarding',
79
81
  'already-approved local asc handoff helpers',
80
82
  ],
81
83
  excludes: [
@@ -86,7 +88,7 @@ function buildLocalizeAsoPackageMatrix(packaging) {
86
88
  'hosted AI',
87
89
  'hosted App Store Connect submit',
88
90
  ],
89
- bestFor: 'Acquisition, trust, and local setup before the user creates a persisted LocalizeASO review job.',
91
+ bestFor: 'Acquisition, trust, and one-app BYO agent setup before the user creates a persisted LocalizeASO review job.',
90
92
  },
91
93
  {
92
94
  id: 'agent_pass',
@@ -338,7 +340,7 @@ export function buildLocalizeAsoMonetizationBoundary(reviewKind, options = {}) {
338
340
  },
339
341
  revenueModel: {
340
342
  defaultMotion: 'Use the free/open CLI as acquisition and trust, sell Agent Pass as the default BYO-agent product, and reserve hosted passes for LocalizeASO-paid AI or hosted App Store Connect convenience.',
341
- freeSurface: 'Keep local setup, Astro CSV conversion, prompt/template generation, pricing-parity manifests, and already-approved local asc handoffs useful without checkout.',
343
+ freeSurface: 'Keep one-app BYO agent setup, local setup, Astro CSV conversion, prompt/template generation, pricing-parity manifests, and already-approved local asc handoffs useful without checkout.',
342
344
  paidSurface: 'Charge for persistent review jobs, human review/consent screens with diffs and signal evidence, approval history, reviewer feedback, Figma apply plans, app slots, hosted proposal allowance, and hosted upload/submit convenience.',
343
345
  primaryRevenueSurface: packaging.primaryRevenueSurface,
344
346
  recommendedDefaultPlan: 'agent',
@@ -358,7 +360,7 @@ export function buildLocalizeAsoMonetizationBoundary(reviewKind, options = {}) {
358
360
  valueLedger: buildLocalizeAsoValueLedger(),
359
361
  packagingDecision: packaging,
360
362
  recommendedOneTimePrices: packaging.recommendedOneTimePrices,
361
- pricingGuidance: 'Keep the CLI/free surface useful for acquisition, sell Agent Pass for BYO human review, approval history, signal evidence, Figma handoffs, and app slots, offer hosted submit as a separate no-hosted-AI convenience pass, and upsell hosted AI only when LocalizeASO pays for proposal generation.',
363
+ pricingGuidance: 'Keep the CLI/free surface useful for one-app BYO agent onboarding and acquisition, sell Agent Pass for BYO human review with persistent approval history, signal evidence, Figma handoffs, and app slots, offer hosted submit as a separate no-hosted-AI convenience pass, and upsell hosted AI only when LocalizeASO pays for proposal generation.',
362
364
  appStoreConnectCredentials: 'Not required for BYO proposal generation, keyword import, or opening the human review/approval screen; only needed for hosted submit convenience or a human-run local asc handoff after explicit approval.',
363
365
  agentInstruction: 'Use local agent-safe steps for research and proposals. Choose Agent Pass for BYO review/history/Figma handoffs, hosted submit pass for BYO proposals plus LocalizeASO App Store Connect convenience, or hosted AI pass when LocalizeASO should spend hosted AI.',
364
366
  };
@@ -180,6 +180,7 @@ Usage:
180
180
  Auto/start/submit aliases return JSON/CLI handoff by default; add --open,
181
181
  or use popup/open, when the human is ready to open a browser window.
182
182
 
183
+ localizeaso login [--staging|--prod] [--backend URL] [--dashboard URL]
183
184
  localizeaso login --email you@example.com --password-stdin [--backend URL] [--dashboard URL] [--staging]
184
185
  localizeaso whoami [--json]
185
186
  localizeaso logout
@@ -1103,8 +1104,8 @@ function configuredToken(env = process.env) {
1103
1104
 
1104
1105
  function stagingUrls() {
1105
1106
  return {
1106
- backend: 'https://staging-api.localizeaso.com',
1107
- dashboard: 'https://staging-dash.localizeaso.com',
1107
+ backend: 'https://api.staging.localizeaso.com',
1108
+ dashboard: 'https://dash.staging.localizeaso.com',
1108
1109
  };
1109
1110
  }
1110
1111
 
@@ -1248,11 +1249,13 @@ function printAuthUsage(command = 'login') {
1248
1249
  return;
1249
1250
  }
1250
1251
  console.log(`Usage:
1252
+ localizeaso login [--staging|--prod] [--backend URL] [--dashboard URL]
1251
1253
  localizeaso login --email you@example.com --password-stdin [--backend URL] [--dashboard URL]
1252
1254
  localizeaso login --email you@example.com --password-stdin --staging
1253
1255
  localizeaso login --email you@example.com --password-stdin --prod
1254
1256
 
1255
1257
  Options:
1258
+ Default Open a browser-based dashboard login and wait for approval.
1256
1259
  --email EMAIL Account email.
1257
1260
  --password-stdin Read password from stdin.
1258
1261
  --password VALUE Local-only convenience; avoid in shared shells.
@@ -1260,6 +1263,8 @@ Options:
1260
1263
  --dashboard URL Dashboard URL for review links.
1261
1264
  --staging Use staging defaults.
1262
1265
  --prod Use production defaults.
1266
+ --no-open Print the dashboard login link without opening a browser.
1267
+ --timeout SECONDS Browser-login wait timeout. Defaults to 600.
1263
1268
  --json Print machine-readable result.
1264
1269
  `);
1265
1270
  }
@@ -1470,6 +1475,136 @@ async function readJsonResponse(response) {
1470
1475
  }
1471
1476
  }
1472
1477
 
1478
+ function shouldOpenBrowser(flags = {}, env = process.env) {
1479
+ if (flags.open === false || flags['no-open'] === true) return false;
1480
+ if (env.LOCALIZEASO_DISABLE_OPEN === '1' || env.LOCALIZEASO_DISABLE_BROWSER_OPEN === '1') return false;
1481
+ return true;
1482
+ }
1483
+
1484
+ function openBrowser(url) {
1485
+ const command = process.platform === 'darwin'
1486
+ ? 'open'
1487
+ : process.platform === 'win32'
1488
+ ? 'cmd'
1489
+ : 'xdg-open';
1490
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
1491
+ const result = spawnSync(command, args, { stdio: 'ignore' });
1492
+ return !result.error && result.status === 0;
1493
+ }
1494
+
1495
+ function delay(ms) {
1496
+ return new Promise((resolve) => setTimeout(resolve, ms));
1497
+ }
1498
+
1499
+ function writeLoginSessionConfig({ profile, backend, dashboard, token, user, session }) {
1500
+ const existing = readCliConfig();
1501
+ const config = {
1502
+ ...existing,
1503
+ profile,
1504
+ backend,
1505
+ ...(dashboard ? { dashboard } : {}),
1506
+ token,
1507
+ user: user ?? null,
1508
+ session: {
1509
+ token_type: session?.token_type || 'bearer',
1510
+ expires_at: session?.expires_at ?? null,
1511
+ },
1512
+ updatedAt: new Date().toISOString(),
1513
+ };
1514
+ const path = writeCliConfig(config);
1515
+ return { config, path };
1516
+ }
1517
+
1518
+ async function browserLoginCommand({ flags, profile, backend, dashboard, json }) {
1519
+ const timeoutSeconds = Number(flags.timeout || flags['timeout-seconds'] || 600);
1520
+ const timeoutMs = Number.isFinite(timeoutSeconds) && timeoutSeconds > 0
1521
+ ? timeoutSeconds * 1000
1522
+ : 600_000;
1523
+
1524
+ const startResponse = await fetch(`${backend}/auth/cli-device/start`, {
1525
+ method: 'POST',
1526
+ headers: { 'content-type': 'application/json' },
1527
+ body: JSON.stringify({ profile: profile.profile }),
1528
+ });
1529
+ const startPayload = await readJsonResponse(startResponse);
1530
+ const loginUrl = typeof startPayload?.loginUrl === 'string' ? startPayload.loginUrl : '';
1531
+ const pollIntervalMs = Number(startPayload?.pollIntervalMs || 2000);
1532
+ const pollEveryMs = Number.isFinite(pollIntervalMs) ? Math.max(250, pollIntervalMs) : 2000;
1533
+ const token = loginUrl ? new URL(loginUrl).searchParams.get('token') || '' : '';
1534
+
1535
+ if (!startResponse.ok || !loginUrl || !token) {
1536
+ console.error(startPayload?.error || `Could not start CLI login with HTTP ${startResponse.status}.`);
1537
+ return 1;
1538
+ }
1539
+
1540
+ const opened = shouldOpenBrowser(flags) ? openBrowser(loginUrl) : false;
1541
+
1542
+ if (json) {
1543
+ console.error(`Open this link to connect the LocalizeASO CLI: ${loginUrl}`);
1544
+ } else {
1545
+ console.log('Open this link to connect the LocalizeASO CLI:');
1546
+ console.log(loginUrl);
1547
+ console.log('');
1548
+ console.log('Waiting for dashboard approval...');
1549
+ }
1550
+
1551
+ const deadline = Date.now() + timeoutMs;
1552
+ while (Date.now() < deadline) {
1553
+ await delay(pollEveryMs);
1554
+ const pollResponse = await fetch(`${backend}/auth/cli-device/poll`, {
1555
+ method: 'POST',
1556
+ headers: { 'content-type': 'application/json' },
1557
+ body: JSON.stringify({ token }),
1558
+ });
1559
+ const pollPayload = await readJsonResponse(pollResponse);
1560
+
1561
+ if (pollResponse.status === 202) continue;
1562
+
1563
+ const sessionToken = typeof pollPayload?.session?.access_token === 'string'
1564
+ ? pollPayload.session.access_token.trim()
1565
+ : '';
1566
+ if (pollResponse.ok && sessionToken) {
1567
+ const { config, path } = writeLoginSessionConfig({
1568
+ profile: profile.profile,
1569
+ backend,
1570
+ dashboard,
1571
+ token: sessionToken,
1572
+ user: pollPayload.user ?? null,
1573
+ session: pollPayload.session ?? null,
1574
+ });
1575
+
1576
+ if (json) {
1577
+ console.log(
1578
+ JSON.stringify(
1579
+ {
1580
+ kind: 'localizeaso_cli_login',
1581
+ ok: true,
1582
+ configPath: path,
1583
+ profile: config.profile,
1584
+ backend,
1585
+ dashboard: dashboard || null,
1586
+ user: config.user,
1587
+ tokenStored: true,
1588
+ },
1589
+ null,
1590
+ 2,
1591
+ ),
1592
+ );
1593
+ } else {
1594
+ console.log(`Logged in${config.user?.email ? ` as ${config.user.email}` : ''}.`);
1595
+ console.log(`Saved CLI session to ${path}.`);
1596
+ }
1597
+ return 0;
1598
+ }
1599
+
1600
+ console.error(pollPayload?.error || `CLI login failed with HTTP ${pollResponse.status}.`);
1601
+ return 1;
1602
+ }
1603
+
1604
+ console.error('CLI login timed out. Run localizeaso login again to create a fresh link.');
1605
+ return 1;
1606
+ }
1607
+
1473
1608
  async function loginCommand(args = []) {
1474
1609
  if (args.includes('--help') || args.includes('-h')) {
1475
1610
  printAuthUsage('login');
@@ -1487,9 +1622,9 @@ async function loginCommand(args = []) {
1487
1622
  console.error('Missing backend URL. Use --backend URL, --staging, or --prod.');
1488
1623
  return 2;
1489
1624
  }
1625
+
1490
1626
  if (!email) {
1491
- console.error('Missing email. Use --email you@example.com.');
1492
- return 2;
1627
+ return browserLoginCommand({ flags, profile, backend, dashboard, json });
1493
1628
  }
1494
1629
  if (!password) {
1495
1630
  console.error('Missing password. Pipe it with --password-stdin or pass --password for local-only tests.');
@@ -1509,21 +1644,14 @@ async function loginCommand(args = []) {
1509
1644
  return 1;
1510
1645
  }
1511
1646
 
1512
- const existing = readCliConfig();
1513
- const config = {
1514
- ...existing,
1647
+ const { config, path } = writeLoginSessionConfig({
1515
1648
  profile: profile.profile,
1516
1649
  backend,
1517
- ...(dashboard ? { dashboard } : {}),
1650
+ dashboard,
1518
1651
  token,
1519
1652
  user: payload.user ?? null,
1520
- session: {
1521
- token_type: payload.session?.token_type || 'bearer',
1522
- expires_at: payload.session?.expires_at ?? null,
1523
- },
1524
- updatedAt: new Date().toISOString(),
1525
- };
1526
- const path = writeCliConfig(config);
1653
+ session: payload.session ?? null,
1654
+ });
1527
1655
 
1528
1656
  if (json) {
1529
1657
  console.log(
@@ -27,8 +27,8 @@ import {
27
27
 
28
28
  const LOCAL_BACKEND_URL = 'http://localhost:8787';
29
29
  const LOCAL_DASHBOARD_URL = 'http://localhost:5174';
30
- const STAGING_BACKEND_URL = 'https://staging-api.localizeaso.com';
31
- const STAGING_DASHBOARD_URL = 'https://staging-dash.localizeaso.com';
30
+ const STAGING_BACKEND_URL = 'https://api.staging.localizeaso.com';
31
+ const STAGING_DASHBOARD_URL = 'https://dash.staging.localizeaso.com';
32
32
  const DEFAULT_CLI_CONFIG_PATH = path.join(homedir(), '.localizeaso', 'config.json');
33
33
  const SAFE_SHELL_TOKEN_RE = /^[A-Za-z0-9_./:@%+=,-]+$/;
34
34
  const REFINE_NEXT_AGENT_RUN_CONTEXT_BOUNDARY =
@@ -13,7 +13,7 @@ const localizeAsoScript = join(__dirname, 'localizeaso.mjs');
13
13
  const astroMcpExportScript = join(__dirname, 'export-astro-mcp-apps.mjs');
14
14
  const repoRoot = join(__dirname, '..');
15
15
  const LOCAL_DASHBOARD_URL = 'http://localhost:5174';
16
- const STAGING_DASHBOARD_URL = 'https://staging-dash.localizeaso.com';
16
+ const STAGING_DASHBOARD_URL = 'https://dash.staging.localizeaso.com';
17
17
 
18
18
  process.stdout.on('error', (error) => {
19
19
  if (error?.code === 'EPIPE') process.exit(0);