appshot-cli 0.2.0 → 0.3.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.
@@ -1,26 +1,162 @@
1
1
  import { Command } from 'commander';
2
+ import { select, confirm } from '@inquirer/prompts';
3
+ import { promises as fs } from 'fs';
4
+ import path from 'path';
2
5
  import pc from 'picocolors';
6
+ import { translationService } from '../services/translation.js';
3
7
  export default function localizeCmd() {
4
8
  return new Command('localize')
5
- .description('Generate translations into specified languages (requires API key)')
9
+ .description('Generate translations for all captions using AI')
6
10
  .requiredOption('--langs <codes>', 'comma-separated language codes (e.g., fr,de,es)')
7
11
  .option('--device <name>', 'specific device (iphone|ipad|mac|watch), or all devices')
8
- .option('--provider <name>', 'translation provider (openai|deepl)', 'openai')
12
+ .option('--model <name>', 'OpenAI model to use', 'gpt-4o-mini')
13
+ .option('--source <lang>', 'source language', 'en')
9
14
  .option('--review', 'review translations before saving')
15
+ .option('--overwrite', 'overwrite existing translations')
10
16
  .action(async (opts) => {
11
17
  try {
12
- console.log(pc.bold('Localization (Coming Soon)'));
13
- console.log('\nThis feature will:');
14
- console.log(' Read existing English captions from captions.json');
15
- console.log(' Translate them using your chosen provider');
16
- console.log(' Save translations back to captions.json');
17
- console.log('\nConfiguration:');
18
- console.log(' Languages:', pc.cyan(opts.langs));
19
- console.log(' Device:', pc.cyan(opts.device || 'all'));
20
- console.log(' Provider:', pc.cyan(opts.provider));
21
- console.log('\n' + pc.dim('Set API keys via environment variables:'));
22
- console.log(pc.dim(' • OPENAI_API_KEY for OpenAI'));
23
- console.log(pc.dim(' • DEEPL_API_KEY for DeepL'));
18
+ // Check for API key
19
+ if (!translationService.hasApiKey()) {
20
+ console.error(pc.red('Error:'), 'OpenAI API key not found');
21
+ console.log(pc.dim('Set the OPENAI_API_KEY environment variable:'));
22
+ console.log(pc.dim(' export OPENAI_API_KEY="your-api-key"'));
23
+ process.exit(1);
24
+ }
25
+ // Parse languages
26
+ const targetLanguages = opts.langs.split(',').map((l) => l.trim());
27
+ const sourceLang = opts.source;
28
+ // Select model
29
+ let selectedModel = opts.model;
30
+ const availableModels = translationService.getAvailableModels();
31
+ if (!availableModels.includes(selectedModel)) {
32
+ console.log(pc.yellow('\nSelect AI model for translation:'));
33
+ selectedModel = await select({
34
+ message: 'Choose model:',
35
+ choices: availableModels.map(m => {
36
+ const info = translationService.getModelInfo(m);
37
+ return {
38
+ value: m,
39
+ name: m,
40
+ description: info ? `Max output: ${info.maxTokens} tokens` : ''
41
+ };
42
+ })
43
+ });
44
+ }
45
+ await translationService.loadConfig();
46
+ console.log(pc.bold('\n📝 Batch Translation'));
47
+ console.log('Source language:', pc.cyan(sourceLang));
48
+ console.log('Target languages:', pc.cyan(targetLanguages.join(', ')));
49
+ console.log('Model:', pc.cyan(selectedModel));
50
+ console.log();
51
+ // Determine which devices to process
52
+ const captionsDir = path.join(process.cwd(), '.appshot', 'captions');
53
+ let devices = [];
54
+ if (opts.device && opts.device !== 'all') {
55
+ devices = [opts.device];
56
+ }
57
+ else {
58
+ // Get all device caption files
59
+ try {
60
+ const files = await fs.readdir(captionsDir);
61
+ devices = files
62
+ .filter(f => f.endsWith('.json'))
63
+ .map(f => f.replace('.json', ''));
64
+ }
65
+ catch {
66
+ console.error(pc.red('Error:'), 'No caption files found');
67
+ console.log(pc.dim('Run'), pc.cyan('appshot caption'), pc.dim('to create captions first'));
68
+ process.exit(1);
69
+ }
70
+ }
71
+ // Process each device
72
+ let totalTranslated = 0;
73
+ let totalSkipped = 0;
74
+ for (const device of devices) {
75
+ const captionsFile = path.join(captionsDir, `${device}.json`);
76
+ try {
77
+ const content = await fs.readFile(captionsFile, 'utf8');
78
+ const captions = JSON.parse(content);
79
+ console.log(pc.cyan(`\n${device.toUpperCase()}`));
80
+ console.log(pc.dim('─'.repeat(40)));
81
+ // Collect unique captions to translate
82
+ const textsToTranslate = new Set();
83
+ for (const [_filename, caption] of Object.entries(captions)) {
84
+ if (typeof caption === 'string') {
85
+ textsToTranslate.add(caption);
86
+ }
87
+ else if (caption && typeof caption === 'object') {
88
+ const sourceText = caption[sourceLang];
89
+ if (sourceText) {
90
+ // Check if we should translate (no existing translations or overwrite enabled)
91
+ const hasExistingTranslations = targetLanguages.some((lang) => caption[lang]);
92
+ if (!hasExistingTranslations || opts.overwrite) {
93
+ textsToTranslate.add(sourceText);
94
+ }
95
+ }
96
+ }
97
+ }
98
+ if (textsToTranslate.size === 0) {
99
+ console.log(pc.yellow(' No captions to translate'));
100
+ totalSkipped++;
101
+ continue;
102
+ }
103
+ console.log(` Found ${textsToTranslate.size} unique caption(s) to translate`);
104
+ // Batch translate
105
+ const translations = await translationService.translateBatch(Array.from(textsToTranslate), targetLanguages, selectedModel, (current, total) => {
106
+ process.stdout.write(`\r Translating: ${current}/${total}`);
107
+ });
108
+ process.stdout.write('\r' + ' '.repeat(50) + '\r'); // Clear progress line
109
+ // Review translations if requested
110
+ if (opts.review) {
111
+ console.log(pc.yellow('\n Review translations:'));
112
+ for (const [text, trans] of translations.entries()) {
113
+ console.log(`\n Original: ${pc.white(text)}`);
114
+ for (const [lang, translation] of Object.entries(trans)) {
115
+ console.log(` ${lang}: ${pc.green(translation)}`);
116
+ }
117
+ const proceed = await confirm({
118
+ message: ' Accept these translations?',
119
+ default: true
120
+ });
121
+ if (!proceed) {
122
+ translations.delete(text);
123
+ }
124
+ }
125
+ }
126
+ // Apply translations to captions
127
+ for (const [filename, caption] of Object.entries(captions)) {
128
+ let sourceText;
129
+ if (typeof caption === 'string') {
130
+ sourceText = caption;
131
+ // Convert to object format
132
+ captions[filename] = { [sourceLang]: caption };
133
+ }
134
+ else if (caption && typeof caption === 'object') {
135
+ sourceText = caption[sourceLang];
136
+ }
137
+ if (sourceText && translations.has(sourceText)) {
138
+ const trans = translations.get(sourceText);
139
+ for (const [lang, translation] of Object.entries(trans)) {
140
+ captions[filename][lang] = translation;
141
+ }
142
+ }
143
+ }
144
+ // Save updated captions
145
+ await fs.writeFile(captionsFile, JSON.stringify(captions, null, 2), 'utf8');
146
+ console.log(pc.green(' ✓'), `Translated ${translations.size} caption(s)`);
147
+ totalTranslated += translations.size;
148
+ }
149
+ catch (error) {
150
+ console.error(pc.red(` Error processing ${device}:`), error instanceof Error ? error.message : String(error));
151
+ }
152
+ }
153
+ // Summary
154
+ console.log(pc.bold('\n📊 Summary'));
155
+ console.log(pc.green('✓'), `Translated ${totalTranslated} unique caption(s)`);
156
+ if (totalSkipped > 0) {
157
+ console.log(pc.yellow('⚠'), `Skipped ${totalSkipped} device(s) with no captions`);
158
+ }
159
+ console.log(pc.dim('\nRun'), pc.cyan('appshot build --langs ' + targetLanguages.join(',')), pc.dim('to generate localized screenshots'));
24
160
  }
25
161
  catch (error) {
26
162
  console.error(pc.red('Error:'), error instanceof Error ? error.message : String(error));
@@ -1 +1 @@
1
- {"version":3,"file":"localize.js","sourceRoot":"","sources":["../../src/commands/localize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,CAAC,OAAO,UAAU,WAAW;IACjC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;SAC3B,WAAW,CAAC,mEAAmE,CAAC;SAChF,cAAc,CAAC,iBAAiB,EAAE,iDAAiD,CAAC;SACpF,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;SACpF,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,QAAQ,CAAC;SAC5E,MAAM,CAAC,UAAU,EAAE,mCAAmC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"localize.js","sourceRoot":"","sources":["../../src/commands/localize.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/commands/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,MAAM,CAAC,OAAO,UAAU,UAAU,YAyBjC"}
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/commands/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,MAAM,CAAC,OAAO,UAAU,UAAU,YAiCjC"}
@@ -10,9 +10,18 @@ export default function presetsCmd() {
10
10
  .option('--generate <ids>', 'generate config for specific preset IDs (comma-separated)')
11
11
  .option('--category <type>', 'filter by category (iphone, ipad, mac, appletv, visionpro, watch)')
12
12
  .option('--output <file>', 'output file for generated config', 'appshot-presets.json')
13
+ .option('--json', 'output as JSON for agent/automation use')
13
14
  .action(async (opts) => {
14
15
  try {
15
- if (opts.list || opts.required) {
16
+ if (opts.json) {
17
+ // JSON output for agents
18
+ const presets = opts.required ? getRequiredPresets() : ALL_PRESETS;
19
+ const filtered = opts.category
20
+ ? { [opts.category]: presets[opts.category] || [] }
21
+ : presets;
22
+ console.log(JSON.stringify(filtered, null, 2));
23
+ }
24
+ else if (opts.list || opts.required) {
16
25
  listPresets(opts);
17
26
  }
18
27
  else if (opts.generate) {
@@ -1 +1 @@
1
- {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/commands/presets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/commands/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG5F,MAAM,CAAC,OAAO,UAAU,UAAU;IAChC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;SAC/B,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,QAAQ,EAAE,4BAA4B,CAAC;SAC9C,MAAM,CAAC,YAAY,EAAE,0CAA0C,CAAC;SAChE,MAAM,CAAC,kBAAkB,EAAE,2DAA2D,CAAC;SACvF,MAAM,CAAC,mBAAmB,EAAE,mEAAmE,CAAC;SAChG,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,EAAE,sBAAsB,CAAC;SACrF,MAAM,CAAC,QAAQ,EAAE,yCAAyC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,yBAAyB;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;gBACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;oBAC5B,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,QAAgC,CAAC,IAAI,EAAE,EAAE;oBAC3E,CAAC,CAAC,OAAO,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtC,WAAW,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACzB,MAAM,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,iCAAiC;gBACjC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,IAA+C;IAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IACnE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE1E,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,eAAe,GAAG,OAAO,CAAC,QAAgC,CAAC,CAAC;QAClE,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEpC,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;YAExD,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACxE,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxH,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,UAAkB;IACjE,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,MAAM,GAA2B;QACrC,MAAM,EAAE,yBAAyB;QACjC,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE;YACR,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;YAC9B,SAAS,EAAE,UAAU;SACtB;QACD,OAAO,EAAE;YACP,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,GAAG;YACf,aAAa,EAAE,EAAE;YACjB,QAAQ,EAAE,OAAO;SAClB;QACD,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEtB,uCAAuC;QACvC,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpC,8DAA8D;QAC9D,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,GAAG,EAAE,WAAW,CAAC;YAClC,MAAM,CAAC,OAAQ,CAAC,QAAQ,CAAC,GAAG;gBAC1B,KAAK,EAAE,iBAAiB,UAAU,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,WAAW;gBAC9F,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ;gBACvC,SAAS,EAAE,IAAI;gBACf,YAAY,EAAE,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM;aAC/D,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,GAAG,EAAE,YAAY,CAAC;YACnC,MAAM,CAAC,OAAQ,CAAC,QAAQ,CAAC,GAAG;gBAC1B,KAAK,EAAE,iBAAiB,UAAU,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,YAAY;gBAC/F,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS;gBACxC,SAAS,EAAE,IAAI;gBACf,YAAY,EAAE,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM;aAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kCAAkC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,MAAM,EAAE,CAAC,SAAS,CAChB,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAC/B,OAAO,CACR,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,wBAAwB,YAAY,CAAC,MAAM,eAAe,UAAU,EAAE,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC3C,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,UAAU,CAAC,CAAC;AAC9D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,CAAC,OAAO,UAAU,WAAW,YAqFlC"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,CAAC,OAAO,UAAU,WAAW,YA6GlC"}
@@ -10,9 +10,12 @@ export default function validateCmd() {
10
10
  .description('Validate screenshots against App Store requirements')
11
11
  .option('--strict', 'validate against required presets only')
12
12
  .option('--fix', 'suggest fixes for invalid screenshots')
13
+ .option('--json', 'output as JSON for agent/automation use')
13
14
  .action(async (opts) => {
14
15
  try {
15
- console.log(pc.bold('🔍 Validating App Store Screenshots...\n'));
16
+ if (!opts.json) {
17
+ console.log(pc.bold('🔍 Validating App Store Screenshots...\n'));
18
+ }
16
19
  const config = await loadConfig();
17
20
  const results = [];
18
21
  // Check each device configuration
@@ -66,12 +69,33 @@ export default function validateCmd() {
66
69
  }
67
70
  }
68
71
  }
69
- // Display results
70
- displayResults(results);
71
- // Check for required presets if strict mode
72
- if (opts.strict) {
73
- console.log(pc.bold('\n📋 Required Presets Check:\n'));
74
- checkRequiredPresets(config);
72
+ // Handle JSON output for agents
73
+ if (opts.json) {
74
+ const requiredCheck = opts.strict ? checkRequiredPresetsJson(config) : null;
75
+ const output = {
76
+ results,
77
+ summary: {
78
+ valid: results.filter(r => r.status === 'valid').length,
79
+ invalid: results.filter(r => r.status === 'invalid').length,
80
+ warnings: results.filter(r => r.status === 'warning').length,
81
+ errors: results.filter(r => r.status === 'error').length
82
+ },
83
+ requiredPresets: requiredCheck
84
+ };
85
+ console.log(JSON.stringify(output, null, 2));
86
+ // Exit with error code if invalid
87
+ if (output.summary.invalid > 0 || output.summary.errors > 0) {
88
+ process.exit(1);
89
+ }
90
+ }
91
+ else {
92
+ // Display results normally
93
+ displayResults(results);
94
+ // Check for required presets if strict mode
95
+ if (opts.strict) {
96
+ console.log(pc.bold('\n📋 Required Presets Check:\n'));
97
+ checkRequiredPresets(config);
98
+ }
75
99
  }
76
100
  }
77
101
  catch (error) {
@@ -180,4 +204,37 @@ function checkRequiredPresets(config) {
180
204
  }
181
205
  }
182
206
  }
207
+ function checkRequiredPresetsJson(config) {
208
+ const required = getRequiredPresets();
209
+ const configured = new Set();
210
+ const result = {};
211
+ // Extract device types from config
212
+ for (const deviceKey of Object.keys(config.devices)) {
213
+ const deviceType = deviceKey.split('-')[0].split('_')[0];
214
+ const resolution = config.devices[deviceKey].resolution;
215
+ configured.add(`${deviceType}-${resolution}`);
216
+ }
217
+ // Check each required preset
218
+ for (const [category, presets] of Object.entries(required)) {
219
+ if (presets.length === 0)
220
+ continue;
221
+ result[category] = presets.map(preset => {
222
+ const hasPortrait = preset.resolutions.portrait &&
223
+ configured.has(`${category}-${preset.resolutions.portrait}`);
224
+ const hasLandscape = preset.resolutions.landscape &&
225
+ configured.has(`${category}-${preset.resolutions.landscape}`);
226
+ return {
227
+ id: preset.id,
228
+ name: preset.name,
229
+ displaySize: preset.displaySize,
230
+ satisfied: hasPortrait || hasLandscape,
231
+ missing: {
232
+ portrait: !hasPortrait && preset.resolutions.portrait ? preset.resolutions.portrait : null,
233
+ landscape: !hasLandscape && preset.resolutions.landscape ? preset.resolutions.landscape : null
234
+ }
235
+ };
236
+ });
237
+ }
238
+ return result;
239
+ }
183
240
  //# sourceMappingURL=validate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { OpenAIModel, ModelConfig, TranslationOptions, TranslationResult, AIConfig } from '../types/ai.js';
2
+ export declare class TranslationService {
3
+ private client;
4
+ private config;
5
+ constructor();
6
+ private initialize;
7
+ hasApiKey(): boolean;
8
+ loadConfig(): Promise<void>;
9
+ saveConfig(config: Partial<AIConfig>): Promise<void>;
10
+ private getCacheKey;
11
+ translate(options: TranslationOptions): Promise<TranslationResult>;
12
+ translateBatch(captions: string[], targetLanguages: string[], model?: OpenAIModel, onProgress?: (current: number, total: number) => void): Promise<Map<string, TranslationResult>>;
13
+ getAvailableModels(): OpenAIModel[];
14
+ getModelInfo(model: OpenAIModel): ModelConfig | undefined;
15
+ clearCache(): void;
16
+ }
17
+ export declare const translationService: TranslationService;
18
+ //# sourceMappingURL=translation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translation.d.ts","sourceRoot":"","sources":["../../src/services/translation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACT,MAAM,gBAAgB,CAAC;AAMxB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAW;;IAYzB,OAAO,CAAC,UAAU;IAQX,SAAS,IAAI,OAAO;IAId,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjE,OAAO,CAAC,WAAW;IAIN,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA8HlE,cAAc,CACzB,QAAQ,EAAE,MAAM,EAAE,EAClB,eAAe,EAAE,MAAM,EAAE,EACzB,KAAK,CAAC,EAAE,WAAW,EACnB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IA+BnC,kBAAkB,IAAI,WAAW,EAAE;IAInC,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS;IAIzD,UAAU,IAAI,IAAI;CAG1B;AAGD,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
@@ -0,0 +1,201 @@
1
+ import OpenAI from 'openai';
2
+ import { promises as fs } from 'fs';
3
+ import path from 'path';
4
+ import pc from 'picocolors';
5
+ import { MODEL_CONFIGS } from '../types/ai.js';
6
+ // Cache for translations to avoid duplicate API calls
7
+ const translationCache = new Map();
8
+ export class TranslationService {
9
+ client = null;
10
+ config;
11
+ constructor() {
12
+ this.config = {
13
+ defaultModel: 'gpt-4o-mini',
14
+ temperature: 0.3,
15
+ cache: true
16
+ };
17
+ this.initialize();
18
+ }
19
+ initialize() {
20
+ const apiKey = process.env.OPENAI_API_KEY;
21
+ if (apiKey) {
22
+ this.client = new OpenAI({ apiKey });
23
+ }
24
+ }
25
+ hasApiKey() {
26
+ return !!process.env.OPENAI_API_KEY;
27
+ }
28
+ async loadConfig() {
29
+ try {
30
+ const configPath = path.join(process.cwd(), '.appshot', 'ai-config.json');
31
+ const content = await fs.readFile(configPath, 'utf8');
32
+ const loadedConfig = JSON.parse(content);
33
+ this.config = { ...this.config, ...loadedConfig };
34
+ }
35
+ catch {
36
+ // Config file doesn't exist, use defaults
37
+ }
38
+ }
39
+ async saveConfig(config) {
40
+ const configPath = path.join(process.cwd(), '.appshot', 'ai-config.json');
41
+ this.config = { ...this.config, ...config };
42
+ await fs.mkdir(path.dirname(configPath), { recursive: true });
43
+ await fs.writeFile(configPath, JSON.stringify(this.config, null, 2), 'utf8');
44
+ }
45
+ getCacheKey(text, languages, model) {
46
+ return `${model}:${languages.sort().join(',')}:${text}`;
47
+ }
48
+ async translate(options) {
49
+ if (!this.client) {
50
+ throw new Error('OpenAI API key not found. Set OPENAI_API_KEY environment variable.');
51
+ }
52
+ const model = options.model || this.config.defaultModel;
53
+ const modelConfig = MODEL_CONFIGS[model];
54
+ if (!modelConfig) {
55
+ throw new Error(`Unknown model: ${model}`);
56
+ }
57
+ // Check cache
58
+ if (this.config.cache) {
59
+ const cacheKey = this.getCacheKey(options.text, options.targetLanguages, model);
60
+ const cached = translationCache.get(cacheKey);
61
+ if (cached) {
62
+ return cached;
63
+ }
64
+ }
65
+ // Build language map for the prompt
66
+ const languageNames = {
67
+ 'es': 'Spanish',
68
+ 'fr': 'French',
69
+ 'de': 'German',
70
+ 'it': 'Italian',
71
+ 'pt': 'Portuguese',
72
+ 'pt-BR': 'Brazilian Portuguese',
73
+ 'ru': 'Russian',
74
+ 'ja': 'Japanese',
75
+ 'ko': 'Korean',
76
+ 'zh-CN': 'Simplified Chinese',
77
+ 'zh-TW': 'Traditional Chinese',
78
+ 'ar': 'Arabic',
79
+ 'hi': 'Hindi',
80
+ 'nl': 'Dutch',
81
+ 'sv': 'Swedish',
82
+ 'no': 'Norwegian',
83
+ 'da': 'Danish',
84
+ 'fi': 'Finnish',
85
+ 'pl': 'Polish',
86
+ 'tr': 'Turkish',
87
+ 'th': 'Thai',
88
+ 'vi': 'Vietnamese',
89
+ 'id': 'Indonesian',
90
+ 'ms': 'Malay',
91
+ 'he': 'Hebrew'
92
+ };
93
+ const targetLangs = options.targetLanguages
94
+ .map(code => `${code}: ${languageNames[code] || code}`)
95
+ .join(', ');
96
+ const systemPrompt = options.systemPrompt || this.config.systemPrompt ||
97
+ `You are a professional app localization expert. Translate the given app screenshot caption into the requested languages.
98
+ The captions are marketing text for mobile app screenshots.
99
+ Keep translations concise, impactful, and culturally appropriate.
100
+ Maintain the marketing tone and appeal of the original text.`;
101
+ const userPrompt = `Translate this app screenshot caption into the following languages: ${targetLangs}
102
+
103
+ Caption: "${options.text}"
104
+
105
+ Return ONLY a JSON object with language codes as keys and translations as values. Example:
106
+ {
107
+ "es": "Spanish translation here",
108
+ "fr": "French translation here"
109
+ }`;
110
+ try {
111
+ // Build the request parameters based on model type
112
+ const params = {
113
+ model: modelConfig.model,
114
+ messages: [
115
+ { role: 'system', content: systemPrompt },
116
+ { role: 'user', content: userPrompt }
117
+ ],
118
+ temperature: modelConfig.temperature,
119
+ response_format: { type: 'json_object' }
120
+ };
121
+ // Use the appropriate max tokens parameter based on model
122
+ if (modelConfig.maxTokensParam === 'max_completion_tokens') {
123
+ params.max_completion_tokens = Math.min(modelConfig.maxTokens, 2000); // Limit for translations
124
+ }
125
+ else {
126
+ params.max_tokens = Math.min(modelConfig.maxTokens, 2000);
127
+ }
128
+ const response = await this.client.chat.completions.create(params);
129
+ const content = response.choices[0]?.message?.content;
130
+ if (!content) {
131
+ throw new Error('No response from OpenAI');
132
+ }
133
+ const translations = JSON.parse(content);
134
+ // Validate that we got all requested languages
135
+ for (const lang of options.targetLanguages) {
136
+ if (!translations[lang]) {
137
+ console.warn(pc.yellow(`Warning: Translation for ${lang} not returned by API`));
138
+ }
139
+ }
140
+ // Cache the result
141
+ if (this.config.cache) {
142
+ const cacheKey = this.getCacheKey(options.text, options.targetLanguages, model);
143
+ translationCache.set(cacheKey, translations);
144
+ }
145
+ return translations;
146
+ }
147
+ catch (error) {
148
+ if (error instanceof OpenAI.APIError) {
149
+ if (error.status === 401) {
150
+ throw new Error('Invalid OpenAI API key');
151
+ }
152
+ else if (error.status === 429) {
153
+ throw new Error('OpenAI API rate limit exceeded. Please try again later.');
154
+ }
155
+ else if (error.status === 404) {
156
+ throw new Error(`Model ${model} not found. You may not have access to this model.`);
157
+ }
158
+ }
159
+ throw error;
160
+ }
161
+ }
162
+ async translateBatch(captions, targetLanguages, model, onProgress) {
163
+ const results = new Map();
164
+ const total = captions.length;
165
+ for (let i = 0; i < captions.length; i++) {
166
+ if (onProgress) {
167
+ onProgress(i + 1, total);
168
+ }
169
+ try {
170
+ const translations = await this.translate({
171
+ text: captions[i],
172
+ targetLanguages,
173
+ model
174
+ });
175
+ results.set(captions[i], translations);
176
+ }
177
+ catch (error) {
178
+ console.error(pc.red(`Failed to translate: "${captions[i]}"`));
179
+ console.error(pc.dim(error instanceof Error ? error.message : String(error)));
180
+ // Continue with other translations
181
+ }
182
+ // Add a small delay to avoid rate limits
183
+ if (i < captions.length - 1) {
184
+ await new Promise(resolve => setTimeout(resolve, 200));
185
+ }
186
+ }
187
+ return results;
188
+ }
189
+ getAvailableModels() {
190
+ return Object.keys(MODEL_CONFIGS);
191
+ }
192
+ getModelInfo(model) {
193
+ return MODEL_CONFIGS[model];
194
+ }
195
+ clearCache() {
196
+ translationCache.clear();
197
+ }
198
+ }
199
+ // Singleton instance
200
+ export const translationService = new TranslationService();
201
+ //# sourceMappingURL=translation.js.map