@localizeaso/cli 0.1.0-preview.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 (58) hide show
  1. package/README.md +24 -0
  2. package/package.json +35 -0
  3. package/packages/asc-shared/dist/app-store-review.d.ts +610 -0
  4. package/packages/asc-shared/dist/app-store-review.d.ts.map +1 -0
  5. package/packages/asc-shared/dist/app-store-review.js +242 -0
  6. package/packages/asc-shared/dist/aso-keyword-map.d.ts +94 -0
  7. package/packages/asc-shared/dist/aso-keyword-map.d.ts.map +1 -0
  8. package/packages/asc-shared/dist/aso-keyword-map.js +292 -0
  9. package/packages/asc-shared/dist/constants.d.ts +15 -0
  10. package/packages/asc-shared/dist/constants.d.ts.map +1 -0
  11. package/packages/asc-shared/dist/constants.js +130 -0
  12. package/packages/asc-shared/dist/cross-localization.d.ts +29 -0
  13. package/packages/asc-shared/dist/cross-localization.d.ts.map +1 -0
  14. package/packages/asc-shared/dist/cross-localization.js +189 -0
  15. package/packages/asc-shared/dist/dedupe.d.ts +17 -0
  16. package/packages/asc-shared/dist/dedupe.d.ts.map +1 -0
  17. package/packages/asc-shared/dist/dedupe.js +104 -0
  18. package/packages/asc-shared/dist/design-tokens.d.ts +83 -0
  19. package/packages/asc-shared/dist/design-tokens.d.ts.map +1 -0
  20. package/packages/asc-shared/dist/design-tokens.js +73 -0
  21. package/packages/asc-shared/dist/index.d.ts +16 -0
  22. package/packages/asc-shared/dist/index.d.ts.map +1 -0
  23. package/packages/asc-shared/dist/index.js +16 -0
  24. package/packages/asc-shared/dist/keywords.d.ts +48 -0
  25. package/packages/asc-shared/dist/keywords.d.ts.map +1 -0
  26. package/packages/asc-shared/dist/keywords.js +376 -0
  27. package/packages/asc-shared/dist/limits.d.ts +11 -0
  28. package/packages/asc-shared/dist/limits.d.ts.map +1 -0
  29. package/packages/asc-shared/dist/limits.js +9 -0
  30. package/packages/asc-shared/dist/locales.d.ts +10 -0
  31. package/packages/asc-shared/dist/locales.d.ts.map +1 -0
  32. package/packages/asc-shared/dist/locales.js +314 -0
  33. package/packages/asc-shared/dist/monetization-boundary.d.ts +148 -0
  34. package/packages/asc-shared/dist/monetization-boundary.d.ts.map +1 -0
  35. package/packages/asc-shared/dist/monetization-boundary.js +365 -0
  36. package/packages/asc-shared/dist/post-approval-paths.d.ts +30 -0
  37. package/packages/asc-shared/dist/post-approval-paths.d.ts.map +1 -0
  38. package/packages/asc-shared/dist/post-approval-paths.js +25 -0
  39. package/packages/asc-shared/dist/review-gate-summary.d.ts +166 -0
  40. package/packages/asc-shared/dist/review-gate-summary.d.ts.map +1 -0
  41. package/packages/asc-shared/dist/review-gate-summary.js +354 -0
  42. package/packages/asc-shared/dist/reviewer-feedback.d.ts +19 -0
  43. package/packages/asc-shared/dist/reviewer-feedback.d.ts.map +1 -0
  44. package/packages/asc-shared/dist/reviewer-feedback.js +94 -0
  45. package/packages/asc-shared/dist/screenshot-review.d.ts +478 -0
  46. package/packages/asc-shared/dist/screenshot-review.d.ts.map +1 -0
  47. package/packages/asc-shared/dist/screenshot-review.js +17 -0
  48. package/packages/asc-shared/dist/supabase.types.d.ts +541 -0
  49. package/packages/asc-shared/dist/supabase.types.d.ts.map +1 -0
  50. package/packages/asc-shared/dist/supabase.types.js +5 -0
  51. package/packages/asc-shared/dist/validation.d.ts +42 -0
  52. package/packages/asc-shared/dist/validation.d.ts.map +1 -0
  53. package/packages/asc-shared/dist/validation.js +113 -0
  54. package/scripts/ensure-shared-build.mjs +76 -0
  55. package/scripts/export-astro-mcp-apps.mjs +841 -0
  56. package/scripts/localizeaso.mjs +2100 -0
  57. package/scripts/review-agent.mjs +9092 -0
  58. package/scripts/review-mcp.mjs +5931 -0
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # @localizeaso/cli
2
+
3
+ Agent-safe LocalizeASO CLI for App Store metadata, keyword, screenshot, and pricing review workflows.
4
+
5
+ ## Usage
6
+
7
+ ```sh
8
+ npx @localizeaso/cli@preview --help
9
+ ```
10
+
11
+ For local desktop or BYO-agent use, sign in once and store a local CLI session:
12
+
13
+ ```sh
14
+ printf '%s' "$LOCALIZEASO_PASSWORD" | localizeaso login --email you@example.com --password-stdin --staging
15
+ localizeaso whoami --json
16
+ ```
17
+
18
+ For VPS, CI, and hosted automation, prefer an explicit bearer token:
19
+
20
+ ```sh
21
+ LOCALIZEASO_TOKEN=... LOCALIZEASO_BACKEND=https://api.localizeaso.com localizeaso whoami --json
22
+ ```
23
+
24
+ `LOCALIZEASO_TOKEN`, `LOCALIZEASO_BACKEND`, and `LOCALIZEASO_DASHBOARD` override the local CLI config.
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@localizeaso/cli",
3
+ "version": "0.1.0-preview.0",
4
+ "description": "LocalizeASO command-line tools for agent-assisted App Store review workflows.",
5
+ "type": "module",
6
+ "bin": {
7
+ "localizeaso": "scripts/localizeaso.mjs"
8
+ },
9
+ "files": [
10
+ "README.md",
11
+ "scripts",
12
+ "packages/asc-shared/dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "node ../../scripts/build-localizeaso-cli-package.mjs",
16
+ "prepack": "npm run build",
17
+ "pack:dry": "npm pack --dry-run"
18
+ },
19
+ "engines": {
20
+ "node": ">=22.14.0"
21
+ },
22
+ "publishConfig": {
23
+ "access": "public",
24
+ "registry": "https://registry.npmjs.org/"
25
+ },
26
+ "keywords": [
27
+ "localizeaso",
28
+ "app-store",
29
+ "aso",
30
+ "cli",
31
+ "codex",
32
+ "agents"
33
+ ],
34
+ "license": "UNLICENSED"
35
+ }
@@ -0,0 +1,610 @@
1
+ import type { ReviewerFeedbackRequest } from './reviewer-feedback.js';
2
+ import type { ReviewGateSummary, ReviewSignalContract } from './review-gate-summary.js';
3
+ import type { LocalizeAsoApplyPlanFingerprintRequirement, LocalizeAsoPostApprovalMonetizationBoundary } from './post-approval-paths.js';
4
+ import type { LocalizeAsoMonetizationBoundary } from './monetization-boundary.js';
5
+ import type { AsoKeywordDetectionReport } from './aso-keyword-map.js';
6
+ export declare const APP_STORE_REVIEW_SURFACE_VALUES: readonly ["metadata", "keywords", "screenshots", "pricing"];
7
+ export type AppStoreReviewSurface = (typeof APP_STORE_REVIEW_SURFACE_VALUES)[number];
8
+ export declare const APP_STORE_FIELD_REVIEW_SURFACE_VALUES: readonly ["metadata", "keywords", "pricing"];
9
+ export type AppStoreFieldReviewSurface = (typeof APP_STORE_FIELD_REVIEW_SURFACE_VALUES)[number];
10
+ export declare const APP_STORE_FIELD_REVIEW_DECISION_VALUES: readonly ["pending", "accepted", "edited", "rejected"];
11
+ export type AppStoreFieldReviewDecision = (typeof APP_STORE_FIELD_REVIEW_DECISION_VALUES)[number];
12
+ export type AppStoreFieldReviewTarget = {
13
+ surface: AppStoreFieldReviewSurface;
14
+ locale?: string;
15
+ field?: string;
16
+ entityId?: string;
17
+ territoryId?: string;
18
+ };
19
+ export type AppStoreFieldReviewScreenshotContextJob = {
20
+ id: string;
21
+ fileKey?: string | null;
22
+ fileName?: string | null;
23
+ status?: string | null;
24
+ createdAt?: string;
25
+ updatedAt?: string;
26
+ };
27
+ export type AppStoreFieldReviewScreenshotFrameContext = {
28
+ id: string;
29
+ frameId?: string;
30
+ screenshotJobId?: string;
31
+ locale?: string;
32
+ name?: string;
33
+ displayType?: string;
34
+ previewDataUrl: string;
35
+ sourceTexts: string[];
36
+ layerCount: number;
37
+ };
38
+ export type AppStoreFieldReviewScreenshotContext = {
39
+ source?: string;
40
+ jobs?: AppStoreFieldReviewScreenshotContextJob[];
41
+ frames: AppStoreFieldReviewScreenshotFrameContext[];
42
+ };
43
+ export type AppStoreFieldReviewContext = Record<string, unknown> & {
44
+ screenshotContext?: AppStoreFieldReviewScreenshotContext;
45
+ };
46
+ export type AppStoreFieldReviewChange = {
47
+ target: AppStoreFieldReviewTarget;
48
+ currentValue: string | number | boolean | null;
49
+ proposedValue: string | number | boolean | null;
50
+ finalValue?: string | number | boolean | null;
51
+ decision?: AppStoreFieldReviewDecision;
52
+ assignedKeywords?: string[];
53
+ unassignedKeywords?: string[];
54
+ warnings?: string[];
55
+ rationale?: string;
56
+ };
57
+ export type AppStoreFieldReviewProposal = {
58
+ surface: AppStoreFieldReviewSurface;
59
+ summary?: string;
60
+ appId: string;
61
+ source: 'agent' | 'backend_ai' | 'cli' | 'manual';
62
+ agentName?: string;
63
+ changes: AppStoreFieldReviewChange[];
64
+ };
65
+ export type AppStoreFieldReviewApplyPlanSummary = {
66
+ changeCount: number;
67
+ humanEditedCount: number;
68
+ assignedKeywordCount: number;
69
+ unassignedKeywordCount: number;
70
+ warningCount: number;
71
+ rationaleCount: number;
72
+ skippedTargetCount: number;
73
+ skippedLocaleCount: number;
74
+ skippedFieldCount: number;
75
+ skippedTerritoryCount: number;
76
+ skippedEntityCount: number;
77
+ skippedTargetPreview: string[];
78
+ targetRefs?: string[];
79
+ skippedTargetRefs?: string[];
80
+ surface: AppStoreFieldReviewSurface;
81
+ };
82
+ export type ReviewSignalPreview = {
83
+ assignedKeywords: string[];
84
+ unassignedKeywords: string[];
85
+ warnings: string[];
86
+ rationales: string[];
87
+ };
88
+ export type ReviewSignalPreviewAudit = {
89
+ status: 'complete' | 'missing';
90
+ message: string;
91
+ missingGroups: Array<'Used keywords' | 'Unassigned keywords' | 'Keyword mapping not applicable' | 'Warnings' | 'Rationales'>;
92
+ };
93
+ export type ReviewApprovalSignalAuditSummary = {
94
+ totalTargets: number;
95
+ keywordMappingNotApplicableCount?: number;
96
+ missingKeywordMappingCount: number;
97
+ missingRationaleCount: number;
98
+ noWarningsReportedCount: number;
99
+ targetsNeedingAttentionCount: number;
100
+ allTargetsHaveReviewSignals: boolean;
101
+ };
102
+ export type ReviewHumanReviewEvidence = {
103
+ visibleBeforeApproval: string[];
104
+ reviewContextLabels?: string[];
105
+ reviewContextComplete?: boolean;
106
+ signalGroupsRequired: Array<'assignedKeywords' | 'unassignedKeywords' | 'keywordMappingNotApplicable' | 'warnings' | 'rationales' | 'screenshotEvidence'>;
107
+ signalGroupLabels?: string[];
108
+ screenshotEvidenceRequired?: boolean;
109
+ screenshotEvidenceVisible?: boolean;
110
+ pricingEvidenceRequired?: boolean;
111
+ pricingEvidenceVisible?: boolean;
112
+ signalPreviewAudit: ReviewSignalPreviewAudit | null;
113
+ reviewGateSummary: ReviewGateSummary | null;
114
+ signalAudit: ReviewApprovalSignalAuditSummary;
115
+ signalGapSummary: ReviewSignalGapSummary;
116
+ signalGapConsent: ReviewSignalGapConsentEvidence;
117
+ postApprovalHumanOnly: true;
118
+ protectedActionsRemainHumanOnly: true;
119
+ consentRequiredBeforeExternalMutation: true;
120
+ };
121
+ export type ReviewSignalGapSummary = {
122
+ keywordMappingNotApplicableCount?: number;
123
+ missingKeywordMappingCount: number;
124
+ missingRationaleCount: number;
125
+ noWarningsReportedCount: number;
126
+ screenshotEvidenceGapCount: number;
127
+ screenshotMissingTargetCount?: number;
128
+ screenshotFallbackOnlyTargetCount?: number;
129
+ screenshotContextOnlyTargetCount?: number;
130
+ screenshotStrongEvidenceTargetCount?: number;
131
+ screenshotWeakEvidenceTargetCount?: number;
132
+ targetsNeedingAttentionCount: number;
133
+ allTargetsHaveReviewSignals: boolean;
134
+ };
135
+ export type ReviewSignalGapConsentEvidence = {
136
+ required: boolean;
137
+ granted: boolean;
138
+ humanOnly: true;
139
+ consentField: 'humanSignalGapConsent';
140
+ cliFlag: '--human-signal-gap-consent';
141
+ reasons: string[];
142
+ signalAudit: ReviewApprovalSignalAuditSummary;
143
+ reviewGateSummary: ReviewGateSummary | null;
144
+ agentInstruction: string;
145
+ };
146
+ export declare function approvalSignalPreviewAudit(preview?: Partial<ReviewSignalPreview> | null, options?: {
147
+ reviewSurface?: AppStoreReviewSurface | null;
148
+ }): ReviewSignalPreviewAudit | null;
149
+ export declare function buildReviewHumanReviewEvidence(input: {
150
+ signalPreview?: Partial<ReviewSignalPreview> | null;
151
+ signalAudit: ReviewApprovalSignalAuditSummary;
152
+ reviewGateSummary?: ReviewGateSummary | null;
153
+ reviewSurface?: AppStoreReviewSurface | null;
154
+ signalGapConsentGranted?: boolean;
155
+ }): ReviewHumanReviewEvidence;
156
+ export declare function buildReviewSignalGapSummary(input: {
157
+ signalAudit: ReviewApprovalSignalAuditSummary;
158
+ reviewGateSummary?: ReviewGateSummary | null;
159
+ }): ReviewSignalGapSummary;
160
+ export declare function buildReviewSignalGapConsentEvidence(input: {
161
+ signalAudit: ReviewApprovalSignalAuditSummary;
162
+ reviewGateSummary?: ReviewGateSummary | null;
163
+ granted?: boolean;
164
+ }): ReviewSignalGapConsentEvidence;
165
+ export type ReviewConsentChecklistItem = {
166
+ id: string;
167
+ label: string;
168
+ required: boolean;
169
+ actor: 'agent' | 'human' | 'system';
170
+ };
171
+ export type ReviewConsentHandoff = {
172
+ opensHumanReviewScreen: boolean;
173
+ consentScreen: 'LocalizeASO screenshot review' | 'LocalizeASO field review';
174
+ checklist: ReviewConsentChecklistItem[];
175
+ prohibitedAgentActions: string[];
176
+ nextHumanAction: {
177
+ id: string;
178
+ label: string;
179
+ reviewUrl: string;
180
+ command: string;
181
+ mcpToolCall?: string;
182
+ requiresLocalizeAsoPass: true;
183
+ requiredLocalizeAsoCapabilities: ReadonlyArray<'byoAgent' | 'reviewHistory' | 'figmaPlugin' | 'pricingReview'>;
184
+ requiresHostedAi: false;
185
+ requiresAppStoreConnectCredentials: false;
186
+ };
187
+ };
188
+ export type ReviewPostProposalHumanReview = {
189
+ required: true;
190
+ actor: 'human';
191
+ reviewUrl: string;
192
+ dashboardPath?: string;
193
+ openReviewCommand: string;
194
+ consentBoundary: string;
195
+ consentChecklist?: ReviewConsentChecklistItem[];
196
+ };
197
+ export type ReviewNextHumanAction = {
198
+ id: 'open_review_and_decide';
199
+ label: string;
200
+ reviewUrl: string;
201
+ command: string;
202
+ };
203
+ export type ReviewPostProposalProtectedAction = 'human_approval' | 'review_rejection' | 'figma_apply' | 'metadata_apply' | 'metadata_export' | 'metadata_publish' | 'keyword_apply' | 'pricing_export' | 'pricing_schedule' | 'pricing_publish' | 'screenshot_upload' | 'screenshot_publish' | 'app_store_upload' | 'app_store_submit' | 'app_store_publish' | 'status_update';
204
+ export type ReviewPostProposalHandoffSafety = {
205
+ agentSafe: true;
206
+ humanOnly: false;
207
+ requiresLocalizeAsoPass?: true;
208
+ requiredLocalizeAsoCapabilities?: ReadonlyArray<'byoAgent' | 'reviewHistory' | 'figmaPlugin' | 'pricingReview'>;
209
+ requiresHostedAi?: false;
210
+ requiresAppStoreConnectCredentials?: false;
211
+ mutatesReviewData?: true;
212
+ mutatesPersistentKeywordInventory?: false;
213
+ mutatesAppStoreConnect?: false;
214
+ proposalSubmissionOnly?: true;
215
+ protectedActionsAllowed?: false;
216
+ protectedActionsExecutableByAgent?: false;
217
+ protectedActionsExecutableByMcp?: false;
218
+ postApprovalRunbookExecutionAllowedInMcp?: false;
219
+ approvalAllowed?: false;
220
+ rejectionAllowed?: false;
221
+ figmaApplyAllowed?: false;
222
+ metadataApplyAllowed?: false;
223
+ metadataExportAllowed?: false;
224
+ metadataPublishAllowed?: false;
225
+ keywordApplyAllowed?: false;
226
+ pricingScheduleAllowed?: false;
227
+ pricingExportAllowed?: false;
228
+ pricingPublishAllowed?: false;
229
+ screenshotUploadAllowed?: false;
230
+ screenshotPublishAllowed?: false;
231
+ appStoreUploadAllowed?: false;
232
+ appStoreSubmitAllowed?: false;
233
+ appStorePublishAllowed?: false;
234
+ statusUpdateAllowed?: false;
235
+ postApprovalActionAllowed?: false;
236
+ humanApprovalConsentGranted?: false;
237
+ humanRejectionConsentGranted?: false;
238
+ humanPostApprovalConsentGranted?: false;
239
+ phase: 'post_proposal_human_review';
240
+ protectedActions: ReadonlyArray<ReviewPostProposalProtectedAction>;
241
+ agentInstruction: string;
242
+ notes?: string[];
243
+ };
244
+ export type AppStoreFieldReviewApprovalReceipt = {
245
+ kind: 'localizeaso_review_approval_receipt';
246
+ reviewKind: 'field';
247
+ surface: AppStoreFieldReviewSurface;
248
+ jobId: string;
249
+ proposalId: string;
250
+ proposalVersion: number;
251
+ approvedAt: string;
252
+ humanApprovalConsent: true;
253
+ protectedActionBoundary: string;
254
+ decisionSummary: {
255
+ totalTargets: number;
256
+ reviewedTargets: number;
257
+ pendingTargets: number;
258
+ savedDecisionCount: number;
259
+ acceptedCount?: number;
260
+ editedCount?: number;
261
+ rejectedCount?: number;
262
+ };
263
+ reviewSummary: AppStoreFieldReviewApplyPlanSummary;
264
+ signalPreview?: ReviewSignalPreview;
265
+ reviewSignalContract?: ReviewSignalContract;
266
+ signalAudit: {
267
+ totalTargets: number;
268
+ keywordMappingNotApplicableCount?: number;
269
+ missingKeywordMappingCount: number;
270
+ missingRationaleCount: number;
271
+ noWarningsReportedCount: number;
272
+ targetsNeedingAttentionCount: number;
273
+ allTargetsHaveReviewSignals: boolean;
274
+ };
275
+ reviewGateSummary?: ReviewGateSummary;
276
+ humanReviewEvidence: ReviewHumanReviewEvidence;
277
+ consentChecklist: Array<{
278
+ id: string;
279
+ label: string;
280
+ required: boolean;
281
+ actor: 'agent' | 'human' | 'system';
282
+ }>;
283
+ postApproval: {
284
+ humanOnly: true;
285
+ protectedActionBoundary: string;
286
+ fingerprintRequirement?: LocalizeAsoApplyPlanFingerprintRequirement;
287
+ checklist: string[];
288
+ commands: Array<{
289
+ id: string;
290
+ label: string;
291
+ command: string;
292
+ note?: string;
293
+ }>;
294
+ paths: AppStoreFieldReviewPostApprovalPath[];
295
+ protectedActions: Array<'apply' | 'export' | 'status' | 'submit' | 'metadata_push' | 'metadata_publish' | 'keyword_apply' | 'pricing_schedule' | 'pricing_publish' | 'app_store_upload' | 'app_store_submit' | 'app_store_publish'>;
296
+ };
297
+ };
298
+ export type AppStoreFieldReviewPostApprovalReceipt = {
299
+ kind: 'localizeaso_field_review_post_approval_receipt';
300
+ status: 'applied' | 'exported' | 'submitted';
301
+ jobId: string;
302
+ appId: string;
303
+ surface: AppStoreFieldReviewSurface;
304
+ proposalId: string;
305
+ proposalVersion: number;
306
+ recordedAt?: string;
307
+ applyPlanFingerprint: string;
308
+ expectedApplyPlanFingerprint: string;
309
+ source: 'human_post_approval_status';
310
+ humanPostApprovalConsent: true;
311
+ postApprovalHumanOnly: true;
312
+ protectedActionsRemainHumanOnly: true;
313
+ protectedActionBoundary: string;
314
+ reviewSummary?: AppStoreFieldReviewApplyPlanSummary;
315
+ humanReviewEvidence?: ReviewHumanReviewEvidence;
316
+ };
317
+ export type AppStoreFieldReviewKeywordAutomationHandoff = {
318
+ kind: 'keyword_research';
319
+ requiredWhen: string[];
320
+ coverage?: {
321
+ targetLocales: string[];
322
+ keywordLocales: string[];
323
+ missingLocales: string[];
324
+ hasKeywordContext: boolean;
325
+ recommended: boolean;
326
+ reason: string;
327
+ };
328
+ screenshotEvidence?: {
329
+ source?: string;
330
+ frameCount: number;
331
+ locales: string[];
332
+ seedTextCount: number;
333
+ note: string;
334
+ };
335
+ mcpBridge?: string;
336
+ keywordContextLock?: {
337
+ locked: boolean;
338
+ status: AppStoreFieldReviewAgentBundle['job']['status'];
339
+ message?: string;
340
+ nextHumanAction?: string;
341
+ };
342
+ syncKeywords?: string;
343
+ keywordContextWarnings?: string[];
344
+ keywordAutomation?: string;
345
+ keywordBrief: string;
346
+ keywordPrompt: string;
347
+ astroKeywordContext?: string;
348
+ attachKeywordContext: string;
349
+ attachAstroCsv: string;
350
+ importAstroCsvToAsoKeywords?: string;
351
+ fetchBundleAfterAttach: string;
352
+ automationOptions?: Array<{
353
+ kind: 'astro_csv' | 'astro_mcp_export' | 'mcp_keyword_agent' | 'astro_mcp_prompt' | 'manual_json';
354
+ source: string;
355
+ output: string;
356
+ exportCommand?: string;
357
+ attachCommand: string;
358
+ mcpToolCall?: string;
359
+ note: string;
360
+ safeForAgent?: boolean;
361
+ humanOnly?: boolean;
362
+ requiresHostedAi?: boolean;
363
+ requiresAppStoreConnectCredentials?: boolean;
364
+ mutatesReviewData?: boolean;
365
+ mutatesAppStoreConnect?: boolean;
366
+ blocked?: boolean;
367
+ blockedReason?: string;
368
+ requiresRevision?: boolean;
369
+ }>;
370
+ researchStrategy?: string[];
371
+ guardrails?: string[];
372
+ attachCommands?: string[];
373
+ keywordContextShape?: unknown;
374
+ asoKeywordMap?: AsoKeywordDetectionReport;
375
+ asoKeywordMapCommand?: string;
376
+ mcpAsoKeywordMapTool?: string;
377
+ steps: string[];
378
+ notes: string[];
379
+ };
380
+ export type AppStoreFieldReviewPostApprovalHandoff = {
381
+ actor: 'human';
382
+ commands: string[];
383
+ notes: string[];
384
+ };
385
+ export type AppStoreFieldReviewPostApprovalPath = {
386
+ id: string;
387
+ label: string;
388
+ mode: 'local_asc' | 'localizeaso_draft' | 'hosted_submit' | 'keyword_store' | 'status_only';
389
+ available: boolean;
390
+ humanOnly: true;
391
+ description: string;
392
+ guidance?: string;
393
+ commands: string[];
394
+ nextStatus?: 'applied' | 'submitted';
395
+ requires?: string[];
396
+ warnings?: string[];
397
+ monetizationBoundary?: LocalizeAsoPostApprovalMonetizationBoundary;
398
+ };
399
+ export type AppStoreFieldReviewCommandHandoff = {
400
+ id: string;
401
+ label: string;
402
+ command: string;
403
+ note?: string;
404
+ };
405
+ export type AppStoreFieldReviewHandoffSafety = {
406
+ humanOnly: true;
407
+ requiresLocalizeAsoPass?: true;
408
+ requiredLocalizeAsoCapabilities?: ReadonlyArray<'byoAgent' | 'reviewHistory' | 'pricingReview'>;
409
+ requiresHostedAi?: false;
410
+ protectedActionsAllowed?: true;
411
+ postApprovalActionAllowed?: true;
412
+ humanOnlyExecutionScope?: 'dashboard_or_cli_after_explicit_human_consent';
413
+ protectedActionsExecutableByAgent?: false;
414
+ protectedActionsExecutableByMcp?: false;
415
+ postApprovalRunbookExecutionAllowedInMcp?: false;
416
+ metadataApplyAllowed?: true;
417
+ metadataExportAllowed?: true;
418
+ metadataPublishAllowed?: true;
419
+ keywordApplyAllowed?: true;
420
+ pricingScheduleAllowed?: true;
421
+ pricingExportAllowed?: true;
422
+ pricingPublishAllowed?: true;
423
+ appStoreUploadAllowed?: true;
424
+ appStoreSubmitAllowed?: true;
425
+ localAscHandoffAllowed?: true;
426
+ hostedAppStoreSubmitAllowed?: boolean;
427
+ appStorePublishAllowed?: true;
428
+ humanApprovalConsentGranted?: true;
429
+ humanRejectionConsentGranted?: false;
430
+ humanPostApprovalConsentGranted?: false;
431
+ requiresHumanApprovalBeforeProtectedActions?: true;
432
+ requiresHumanRejectionConsentForReviewRejection?: true;
433
+ requiresHumanApprovalBeforePostApprovalActions?: true;
434
+ applyPlanFingerprintRequiredForPostApproval?: true;
435
+ applyPlanFingerprintFlag?: string;
436
+ applyPlanFingerprintGuidance?: string;
437
+ protectedActionBoundary?: string;
438
+ postApprovalPathsHumanOnly?: true;
439
+ usesHumanFinalValues: true;
440
+ valueSource: 'approved_human_decisions';
441
+ phase: 'post_approval';
442
+ protectedActions: ReadonlyArray<'apply' | 'export' | 'status' | 'submit' | 'metadata_push' | 'metadata_publish' | 'keyword_apply' | 'pricing_schedule' | 'pricing_publish' | 'app_store_upload' | 'app_store_submit' | 'app_store_publish'>;
443
+ agentInstruction: string;
444
+ notes: string[];
445
+ };
446
+ export type AppStoreFieldReviewAgentBundle = {
447
+ monetizationBoundary?: LocalizeAsoMonetizationBoundary;
448
+ appId: string;
449
+ surface: AppStoreFieldReviewSurface;
450
+ job: {
451
+ id: string;
452
+ appId: string;
453
+ surface: AppStoreFieldReviewSurface;
454
+ source: 'dashboard' | 'cli' | 'backend_ai' | 'agent';
455
+ status: 'draft' | 'awaiting_agent' | 'proposal_ready' | 'changes_requested' | 'approved' | 'applied' | 'submitted' | 'rejected';
456
+ instructions?: string | null;
457
+ approvedProposalId?: string | null;
458
+ createdAt?: string;
459
+ updatedAt?: string;
460
+ };
461
+ context: AppStoreFieldReviewContext;
462
+ asoKeywordMap?: AsoKeywordDetectionReport;
463
+ reviewConstraints?: {
464
+ appStoreFieldLimits?: Record<string, number>;
465
+ editableFields?: string[];
466
+ notes?: string[];
467
+ };
468
+ existingProposalVersions?: number[];
469
+ proposalHistory?: Array<{
470
+ id: string;
471
+ version: number;
472
+ source: 'agent' | 'backend_ai' | 'cli' | 'manual';
473
+ agentName?: string | null;
474
+ prompt?: string | null;
475
+ payload: AppStoreFieldReviewProposal;
476
+ approved: boolean;
477
+ createdAt?: string;
478
+ updatedAt?: string;
479
+ }>;
480
+ decisionHistory?: Array<{
481
+ kind: 'localizeaso_field_review_decision_batch';
482
+ jobId: string;
483
+ proposalId: string;
484
+ proposalVersion: number;
485
+ savedAt?: string;
486
+ humanReviewConsent?: boolean;
487
+ savedDecisionCount: number;
488
+ decisions: Array<{
489
+ target?: AppStoreFieldReviewTarget | unknown;
490
+ targetKey?: string;
491
+ decision: AppStoreFieldReviewDecision | string;
492
+ editedValue?: unknown;
493
+ note?: string | null;
494
+ }>;
495
+ }>;
496
+ reviewerFeedback?: Array<{
497
+ proposalId: string;
498
+ target: AppStoreFieldReviewTarget;
499
+ decision: AppStoreFieldReviewDecision;
500
+ editedValue?: string | number | boolean | null;
501
+ currentValue?: string | number | boolean | null;
502
+ proposedValue?: string | number | boolean | null;
503
+ finalValue?: string | number | boolean | null;
504
+ valueSource?: 'accepted_agent_proposal' | 'human_edited_final' | 'rejected_target';
505
+ note?: string | null;
506
+ }>;
507
+ reviewerFeedbackRequests?: ReviewerFeedbackRequest[];
508
+ agentInstructions: string[];
509
+ reviewSignalContract?: ReviewSignalContract;
510
+ proposalShape: AppStoreFieldReviewProposal;
511
+ proposalRequestShape: {
512
+ endpoint: string;
513
+ method: 'POST';
514
+ body: {
515
+ source: 'agent' | 'cli';
516
+ agentName: string;
517
+ prompt: string;
518
+ payload: AppStoreFieldReviewProposal;
519
+ };
520
+ };
521
+ handoff: {
522
+ dashboardPath: string;
523
+ reviewUrl: string;
524
+ dashboardUrl?: string;
525
+ reviewInstruction?: string;
526
+ localReviewEnvironment?: {
527
+ doctorCommand: string;
528
+ mcpDoctorCommand?: string;
529
+ recommendedEnvironmentKeys: Array<'LOCALIZEASO_BACKEND' | 'LOCALIZEASO_DASHBOARD' | 'LOCALIZEASO_DISABLE_OPEN'>;
530
+ browserOpenDefault: 'disabled_for_agents';
531
+ dashboardTestFallback: string;
532
+ agentInstruction: string;
533
+ };
534
+ agentPrompt?: string;
535
+ reviewSignalContract?: ReviewSignalContract;
536
+ keywordAutomation?: AppStoreFieldReviewKeywordAutomationHandoff;
537
+ postApprovalCommands?: AppStoreFieldReviewPostApprovalHandoff;
538
+ postApprovalFingerprintRequirement?: LocalizeAsoApplyPlanFingerprintRequirement;
539
+ postApprovalPaths?: AppStoreFieldReviewPostApprovalPath[];
540
+ handoffSafety?: AppStoreFieldReviewHandoffSafety;
541
+ agentSafeCommands?: AppStoreFieldReviewCommandHandoff[];
542
+ humanOnlyCommands?: AppStoreFieldReviewCommandHandoff[];
543
+ postApprovalChecklist?: string[];
544
+ consentChecklist?: ReviewConsentChecklistItem[];
545
+ reviewConsent?: ReviewConsentHandoff;
546
+ bundleEndpoint: string;
547
+ proposalEndpoint: string;
548
+ decisionsEndpointTemplate: string;
549
+ readinessEndpointTemplate: string;
550
+ approveEndpointTemplate: string;
551
+ refineEndpoint: string;
552
+ applyPlanEndpoint: string;
553
+ applyEndpoint?: string;
554
+ submitEndpoint?: string;
555
+ pricingSubmitEndpoint?: string;
556
+ statusEndpoint: string;
557
+ cli: {
558
+ mcpBridge?: string;
559
+ agentPrompt?: string;
560
+ mcpAgentPrompt?: string;
561
+ handoffSummary?: string;
562
+ mcpHandoffSummary?: string;
563
+ jobs?: string;
564
+ openNext?: string;
565
+ mcpJobs?: string;
566
+ mcpOpenNext?: string;
567
+ workspaceJobs?: string;
568
+ workspaceOpenNext?: string;
569
+ workspaceBoundary?: string;
570
+ mcpWorkspaceJobs?: string;
571
+ mcpWorkspaceOpenNext?: string;
572
+ mcpWorkspaceBoundary?: string;
573
+ bundle: string;
574
+ openReview?: string;
575
+ keywordAutomation?: string;
576
+ keywordBrief?: string;
577
+ keywordPrompt?: string;
578
+ pricingBrief?: string;
579
+ astroKeywordContext?: string;
580
+ astroMcpExport?: string;
581
+ keywordContext?: string;
582
+ keywordContextFromCsv?: string;
583
+ importAstroCsvToAsoKeywords?: string;
584
+ syncKeywords?: string;
585
+ proposalTemplate?: string;
586
+ mcpProposalTemplate?: string;
587
+ submitProposal: string;
588
+ mcpSubmitProposal?: string;
589
+ saveDecisions: string;
590
+ readiness: string;
591
+ approve: string;
592
+ approveWithSignalGapConsent?: string;
593
+ refine: string;
594
+ applyPlan: string;
595
+ metadataFiles?: string;
596
+ apply?: string;
597
+ submitMetadata?: string;
598
+ submitPricing?: string;
599
+ markRejected: string;
600
+ markApplied?: string;
601
+ markSubmitted?: string;
602
+ };
603
+ runbook: {
604
+ environment: string[];
605
+ commands: string[];
606
+ notes: string[];
607
+ };
608
+ };
609
+ };
610
+ //# sourceMappingURL=app-store-review.d.ts.map