@localizeaso/cli 0.1.0-preview.10 → 0.1.0-preview.3
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 +2 -7
- package/package.json +3 -3
- package/packages/asc-shared/dist/monetization-boundary.d.ts +8 -8
- package/packages/asc-shared/dist/monetization-boundary.d.ts.map +1 -1
- package/packages/asc-shared/dist/monetization-boundary.js +10 -12
- package/scripts/localizeaso.mjs +17 -155
- package/scripts/review-agent.mjs +2 -2
- package/scripts/review-mcp.mjs +1 -1
package/README.md
CHANGED
|
@@ -11,15 +11,10 @@ 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
|
-
|
|
15
|
-
|
|
16
|
-
npx @localizeaso/cli@preview whoami --json
|
|
14
|
+
printf '%s' "$LOCALIZEASO_PASSWORD" | localizeaso login --email you@example.com --password-stdin --staging
|
|
15
|
+
localizeaso whoami --json
|
|
17
16
|
```
|
|
18
17
|
|
|
19
|
-
The LocalizeASO agent skill is installed through the Vercel Skills CLI from the
|
|
20
|
-
public LocalizeASO agent kit mirror. This package exposes the safe LocalizeASO
|
|
21
|
-
CLI and MCP bridge for Codex, OpenClaw, Cursor, and other coding-agent runtimes.
|
|
22
|
-
|
|
23
18
|
For VPS, CI, and hosted automation, prefer an explicit bearer token:
|
|
24
19
|
|
|
25
20
|
```sh
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@localizeaso/cli",
|
|
3
|
-
"version": "0.1.0-preview.
|
|
3
|
+
"version": "0.1.0-preview.3",
|
|
4
4
|
"description": "LocalizeASO command-line tools for agent-assisted App Store review workflows.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"pack:dry": "npm pack --dry-run"
|
|
23
23
|
},
|
|
24
24
|
"engines": {
|
|
25
|
-
"node": ">=
|
|
25
|
+
"node": ">=22.14.0"
|
|
26
26
|
},
|
|
27
27
|
"publishConfig": {
|
|
28
28
|
"access": "public",
|
|
@@ -36,5 +36,5 @@
|
|
|
36
36
|
"codex",
|
|
37
37
|
"agents"
|
|
38
38
|
],
|
|
39
|
-
"license": "
|
|
39
|
+
"license": "UNLICENSED"
|
|
40
40
|
}
|
|
@@ -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,
|
|
129
|
-
readonly openSourceBoundary: "Open-source local setup, keyword conversion, pricing-parity manifests, prompt/template generation,
|
|
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.";
|
|
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", "
|
|
131
|
+
readonly freeToolIncludes: readonly ["local setup", "Astro/CSV keyword conversion", "prompt/template generation", "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: "$
|
|
137
|
-
readonly submit: "$
|
|
138
|
-
readonly launch: "$
|
|
139
|
-
readonly global: "$
|
|
140
|
-
readonly portfolio: "$
|
|
136
|
+
readonly agent: "$29";
|
|
137
|
+
readonly submit: "$39";
|
|
138
|
+
readonly launch: "$49";
|
|
139
|
+
readonly global: "$149";
|
|
140
|
+
readonly portfolio: "$299";
|
|
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,14 +3,13 @@ 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,
|
|
7
|
-
openSourceBoundary: 'Open-source local setup, keyword conversion, pricing-parity manifests, prompt/template generation,
|
|
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.',
|
|
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',
|
|
14
13
|
'pricing parity manifests',
|
|
15
14
|
],
|
|
16
15
|
byoPaidIncludes: [
|
|
@@ -31,11 +30,11 @@ export const LOCALIZEASO_AGENT_PASS_PACKAGING_DECISION = {
|
|
|
31
30
|
],
|
|
32
31
|
defaultPricingModel: 'one_time_or_lifetime_byo_agent_pass',
|
|
33
32
|
recommendedOneTimePrices: {
|
|
34
|
-
agent: '$
|
|
35
|
-
submit: '$
|
|
36
|
-
launch: '$
|
|
37
|
-
global: '$
|
|
38
|
-
portfolio: '$
|
|
33
|
+
agent: '$29',
|
|
34
|
+
submit: '$39',
|
|
35
|
+
launch: '$49',
|
|
36
|
+
global: '$149',
|
|
37
|
+
portfolio: '$299',
|
|
39
38
|
},
|
|
40
39
|
avoidPositioning: [
|
|
41
40
|
'usage-based LocalizeASO AI pricing for BYO Codex/AI runs',
|
|
@@ -77,7 +76,6 @@ function buildLocalizeAsoPackageMatrix(packaging) {
|
|
|
77
76
|
'pricing parity JSON and manifest conversion',
|
|
78
77
|
'Astro/CSV keyword context conversion',
|
|
79
78
|
'prompt and proposal-template generation from exported bundles',
|
|
80
|
-
'one-app BYO agent onboarding',
|
|
81
79
|
'already-approved local asc handoff helpers',
|
|
82
80
|
],
|
|
83
81
|
excludes: [
|
|
@@ -88,7 +86,7 @@ function buildLocalizeAsoPackageMatrix(packaging) {
|
|
|
88
86
|
'hosted AI',
|
|
89
87
|
'hosted App Store Connect submit',
|
|
90
88
|
],
|
|
91
|
-
bestFor: 'Acquisition, trust, and
|
|
89
|
+
bestFor: 'Acquisition, trust, and local setup before the user creates a persisted LocalizeASO review job.',
|
|
92
90
|
},
|
|
93
91
|
{
|
|
94
92
|
id: 'agent_pass',
|
|
@@ -340,7 +338,7 @@ export function buildLocalizeAsoMonetizationBoundary(reviewKind, options = {}) {
|
|
|
340
338
|
},
|
|
341
339
|
revenueModel: {
|
|
342
340
|
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.',
|
|
343
|
-
freeSurface: 'Keep
|
|
341
|
+
freeSurface: 'Keep local setup, Astro CSV conversion, prompt/template generation, pricing-parity manifests, and already-approved local asc handoffs useful without checkout.',
|
|
344
342
|
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.',
|
|
345
343
|
primaryRevenueSurface: packaging.primaryRevenueSurface,
|
|
346
344
|
recommendedDefaultPlan: 'agent',
|
|
@@ -360,7 +358,7 @@ export function buildLocalizeAsoMonetizationBoundary(reviewKind, options = {}) {
|
|
|
360
358
|
valueLedger: buildLocalizeAsoValueLedger(),
|
|
361
359
|
packagingDecision: packaging,
|
|
362
360
|
recommendedOneTimePrices: packaging.recommendedOneTimePrices,
|
|
363
|
-
pricingGuidance: 'Keep the CLI/free surface useful for
|
|
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.',
|
|
364
362
|
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.',
|
|
365
363
|
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.',
|
|
366
364
|
};
|
package/scripts/localizeaso.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
import { spawnSync } from 'node:child_process';
|
|
4
|
-
import { chmodSync, readFileSync,
|
|
4
|
+
import { chmodSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
5
5
|
import { homedir } from 'node:os';
|
|
6
6
|
import { dirname, join } from 'node:path';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
@@ -180,7 +180,6 @@ 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]
|
|
184
183
|
localizeaso login --email you@example.com --password-stdin [--backend URL] [--dashboard URL] [--staging]
|
|
185
184
|
localizeaso whoami [--json]
|
|
186
185
|
localizeaso logout
|
|
@@ -1104,8 +1103,8 @@ function configuredToken(env = process.env) {
|
|
|
1104
1103
|
|
|
1105
1104
|
function stagingUrls() {
|
|
1106
1105
|
return {
|
|
1107
|
-
backend: 'https://api.
|
|
1108
|
-
dashboard: 'https://dash.
|
|
1106
|
+
backend: 'https://staging-api.localizeaso.com',
|
|
1107
|
+
dashboard: 'https://staging-dash.localizeaso.com',
|
|
1109
1108
|
};
|
|
1110
1109
|
}
|
|
1111
1110
|
|
|
@@ -1249,13 +1248,11 @@ function printAuthUsage(command = 'login') {
|
|
|
1249
1248
|
return;
|
|
1250
1249
|
}
|
|
1251
1250
|
console.log(`Usage:
|
|
1252
|
-
localizeaso login [--staging|--prod] [--backend URL] [--dashboard URL]
|
|
1253
1251
|
localizeaso login --email you@example.com --password-stdin [--backend URL] [--dashboard URL]
|
|
1254
1252
|
localizeaso login --email you@example.com --password-stdin --staging
|
|
1255
1253
|
localizeaso login --email you@example.com --password-stdin --prod
|
|
1256
1254
|
|
|
1257
1255
|
Options:
|
|
1258
|
-
Default Open a browser-based dashboard login and wait for approval.
|
|
1259
1256
|
--email EMAIL Account email.
|
|
1260
1257
|
--password-stdin Read password from stdin.
|
|
1261
1258
|
--password VALUE Local-only convenience; avoid in shared shells.
|
|
@@ -1263,8 +1260,6 @@ Options:
|
|
|
1263
1260
|
--dashboard URL Dashboard URL for review links.
|
|
1264
1261
|
--staging Use staging defaults.
|
|
1265
1262
|
--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.
|
|
1268
1263
|
--json Print machine-readable result.
|
|
1269
1264
|
`);
|
|
1270
1265
|
}
|
|
@@ -1475,136 +1470,6 @@ async function readJsonResponse(response) {
|
|
|
1475
1470
|
}
|
|
1476
1471
|
}
|
|
1477
1472
|
|
|
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
|
-
|
|
1608
1473
|
async function loginCommand(args = []) {
|
|
1609
1474
|
if (args.includes('--help') || args.includes('-h')) {
|
|
1610
1475
|
printAuthUsage('login');
|
|
@@ -1622,9 +1487,9 @@ async function loginCommand(args = []) {
|
|
|
1622
1487
|
console.error('Missing backend URL. Use --backend URL, --staging, or --prod.');
|
|
1623
1488
|
return 2;
|
|
1624
1489
|
}
|
|
1625
|
-
|
|
1626
1490
|
if (!email) {
|
|
1627
|
-
|
|
1491
|
+
console.error('Missing email. Use --email you@example.com.');
|
|
1492
|
+
return 2;
|
|
1628
1493
|
}
|
|
1629
1494
|
if (!password) {
|
|
1630
1495
|
console.error('Missing password. Pipe it with --password-stdin or pass --password for local-only tests.');
|
|
@@ -1644,14 +1509,21 @@ async function loginCommand(args = []) {
|
|
|
1644
1509
|
return 1;
|
|
1645
1510
|
}
|
|
1646
1511
|
|
|
1647
|
-
const
|
|
1512
|
+
const existing = readCliConfig();
|
|
1513
|
+
const config = {
|
|
1514
|
+
...existing,
|
|
1648
1515
|
profile: profile.profile,
|
|
1649
1516
|
backend,
|
|
1650
|
-
dashboard,
|
|
1517
|
+
...(dashboard ? { dashboard } : {}),
|
|
1651
1518
|
token,
|
|
1652
1519
|
user: payload.user ?? null,
|
|
1653
|
-
session:
|
|
1654
|
-
|
|
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);
|
|
1655
1527
|
|
|
1656
1528
|
if (json) {
|
|
1657
1529
|
console.log(
|
|
@@ -2240,17 +2112,7 @@ async function main() {
|
|
|
2240
2112
|
return runNodeScript(reviewAgentScript, mapped.args, { injectLocalDashboard: true });
|
|
2241
2113
|
}
|
|
2242
2114
|
|
|
2243
|
-
|
|
2244
|
-
const entrypoint = process.argv[1];
|
|
2245
|
-
if (!entrypoint) return false;
|
|
2246
|
-
try {
|
|
2247
|
-
return realpathSync(entrypoint) === realpathSync(fileURLToPath(import.meta.url));
|
|
2248
|
-
} catch {
|
|
2249
|
-
return import.meta.url === `file://${entrypoint}`;
|
|
2250
|
-
}
|
|
2251
|
-
}
|
|
2252
|
-
|
|
2253
|
-
if (isCliEntrypoint()) {
|
|
2115
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
2254
2116
|
main()
|
|
2255
2117
|
.then((code) => {
|
|
2256
2118
|
process.exitCode = code;
|
package/scripts/review-agent.mjs
CHANGED
|
@@ -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://api.
|
|
31
|
-
const STAGING_DASHBOARD_URL = 'https://dash.
|
|
30
|
+
const STAGING_BACKEND_URL = 'https://staging-api.localizeaso.com';
|
|
31
|
+
const STAGING_DASHBOARD_URL = 'https://staging-dash.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 =
|
package/scripts/review-mcp.mjs
CHANGED
|
@@ -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://dash.
|
|
16
|
+
const STAGING_DASHBOARD_URL = 'https://staging-dash.localizeaso.com';
|
|
17
17
|
|
|
18
18
|
process.stdout.on('error', (error) => {
|
|
19
19
|
if (error?.code === 'EPIPE') process.exit(0);
|