appshot-cli 0.8.0 → 0.8.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.
Files changed (61) hide show
  1. package/README.md +101 -4
  2. package/dist/cli.js +18 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/device.d.ts +3 -0
  5. package/dist/commands/device.d.ts.map +1 -0
  6. package/dist/commands/device.js +414 -0
  7. package/dist/commands/device.js.map +1 -0
  8. package/dist/commands/unwatch.d.ts +3 -0
  9. package/dist/commands/unwatch.d.ts.map +1 -0
  10. package/dist/commands/unwatch.js +53 -0
  11. package/dist/commands/unwatch.js.map +1 -0
  12. package/dist/commands/watch-status.d.ts +3 -0
  13. package/dist/commands/watch-status.d.ts.map +1 -0
  14. package/dist/commands/watch-status.js +116 -0
  15. package/dist/commands/watch-status.js.map +1 -0
  16. package/dist/commands/watch.d.ts +3 -0
  17. package/dist/commands/watch.d.ts.map +1 -0
  18. package/dist/commands/watch.js +322 -0
  19. package/dist/commands/watch.js.map +1 -0
  20. package/dist/core/compose.d.ts.map +1 -1
  21. package/dist/core/compose.js +4 -0
  22. package/dist/core/compose.js.map +1 -1
  23. package/dist/services/compose-bridge.d.ts +47 -0
  24. package/dist/services/compose-bridge.d.ts.map +1 -0
  25. package/dist/services/compose-bridge.js +222 -0
  26. package/dist/services/compose-bridge.js.map +1 -0
  27. package/dist/services/device-manager.d.ts +14 -0
  28. package/dist/services/device-manager.d.ts.map +1 -0
  29. package/dist/services/device-manager.js +244 -0
  30. package/dist/services/device-manager.js.map +1 -0
  31. package/dist/services/doctor.d.ts +1 -0
  32. package/dist/services/doctor.d.ts.map +1 -1
  33. package/dist/services/doctor.js +94 -2
  34. package/dist/services/doctor.js.map +1 -1
  35. package/dist/services/processing-queue.d.ts +32 -0
  36. package/dist/services/processing-queue.d.ts.map +1 -0
  37. package/dist/services/processing-queue.js +150 -0
  38. package/dist/services/processing-queue.js.map +1 -0
  39. package/dist/services/screenshot-router.d.ts +31 -0
  40. package/dist/services/screenshot-router.d.ts.map +1 -0
  41. package/dist/services/screenshot-router.js +227 -0
  42. package/dist/services/screenshot-router.js.map +1 -0
  43. package/dist/services/system-requirements.d.ts +26 -0
  44. package/dist/services/system-requirements.d.ts.map +1 -0
  45. package/dist/services/system-requirements.js +189 -0
  46. package/dist/services/system-requirements.js.map +1 -0
  47. package/dist/services/watch-service.d.ts +39 -0
  48. package/dist/services/watch-service.d.ts.map +1 -0
  49. package/dist/services/watch-service.js +293 -0
  50. package/dist/services/watch-service.js.map +1 -0
  51. package/dist/types/device.d.ts +52 -0
  52. package/dist/types/device.d.ts.map +1 -0
  53. package/dist/types/device.js +2 -0
  54. package/dist/types/device.js.map +1 -0
  55. package/dist/types.d.ts +9 -0
  56. package/dist/types.d.ts.map +1 -1
  57. package/dist/utils/pid-manager.d.ts +11 -0
  58. package/dist/utils/pid-manager.d.ts.map +1 -0
  59. package/dist/utils/pid-manager.js +76 -0
  60. package/dist/utils/pid-manager.js.map +1 -0
  61. package/package.json +3 -3
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function unwatchCommand(): Command;
3
+ //# sourceMappingURL=unwatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unwatch.d.ts","sourceRoot":"","sources":["../../src/commands/unwatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,CAAC,OAAO,UAAU,cAAc,IAAI,OAAO,CAoDhD"}
@@ -0,0 +1,53 @@
1
+ import { Command } from 'commander';
2
+ import pc from 'picocolors';
3
+ import { PIDManager } from '../utils/pid-manager.js';
4
+ export default function unwatchCommand() {
5
+ return new Command('unwatch')
6
+ .description('Stop watching directories (alias for "watch stop")')
7
+ .action(async () => {
8
+ try {
9
+ const pidManager = new PIDManager('.appshot/watch.pid');
10
+ const pid = await pidManager.readPID();
11
+ if (!pid) {
12
+ console.log(pc.yellow('⚠️ Watch service is not running'));
13
+ return;
14
+ }
15
+ if (!(await pidManager.isProcessRunning(pid))) {
16
+ console.log(pc.yellow('⚠️ Watch service PID file exists but process is not running'));
17
+ await pidManager.cleanup();
18
+ return;
19
+ }
20
+ console.log(pc.cyan(`🛑 Stopping watch service (PID: ${pid})...`));
21
+ try {
22
+ process.kill(pid, 'SIGTERM');
23
+ // Wait for process to stop
24
+ let attempts = 0;
25
+ while (attempts < 10 && await pidManager.isProcessRunning(pid)) {
26
+ await new Promise(resolve => setTimeout(resolve, 500));
27
+ attempts++;
28
+ }
29
+ if (await pidManager.isProcessRunning(pid)) {
30
+ // Force kill if still running
31
+ console.log(pc.yellow('⚠️ Process did not stop gracefully, forcing...'));
32
+ process.kill(pid, 'SIGKILL');
33
+ }
34
+ await pidManager.cleanup();
35
+ console.log(pc.green('✅ Watch service stopped'));
36
+ }
37
+ catch (error) {
38
+ if (error.code === 'ESRCH') {
39
+ console.log(pc.yellow('⚠️ Process already stopped'));
40
+ await pidManager.cleanup();
41
+ }
42
+ else {
43
+ throw error;
44
+ }
45
+ }
46
+ }
47
+ catch (error) {
48
+ console.error(pc.red('❌ Error stopping watch service:'), error);
49
+ process.exit(1);
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=unwatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unwatch.js","sourceRoot":"","sources":["../../src/commands/unwatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,OAAO,UAAU,cAAc;IACpC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,oBAAoB,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;YAEvC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,8DAA8D,CAAC,CAAC,CAAC;gBACvF,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,mCAAmC,GAAG,MAAM,CAAC,CAAC,CAAC;YAEnE,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAE7B,2BAA2B;gBAC3B,IAAI,QAAQ,GAAG,CAAC,CAAC;gBACjB,OAAO,QAAQ,GAAG,EAAE,IAAI,MAAM,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/D,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;oBACvD,QAAQ,EAAE,CAAC;gBACb,CAAC;gBAED,IAAI,MAAM,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3C,8BAA8B;oBAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iDAAiD,CAAC,CAAC,CAAC;oBAC1E,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBAED,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;oBACtD,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,iCAAiC,CAAC,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function watchStatusCommand(): Command;
3
+ //# sourceMappingURL=watch-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-status.d.ts","sourceRoot":"","sources":["../../src/commands/watch-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,MAAM,CAAC,OAAO,UAAU,kBAAkB,IAAI,OAAO,CAsHpD"}
@@ -0,0 +1,116 @@
1
+ import { Command } from 'commander';
2
+ import pc from 'picocolors';
3
+ import fs from 'fs/promises';
4
+ import { PIDManager } from '../utils/pid-manager.js';
5
+ export default function watchStatusCommand() {
6
+ return new Command('watch-status')
7
+ .description('Check the status of the watch service')
8
+ .option('--json', 'Output as JSON')
9
+ .option('--verbose', 'Show detailed information')
10
+ .action(async (options) => {
11
+ try {
12
+ const pidManager = new PIDManager('.appshot/watch.pid');
13
+ const pid = await pidManager.readPID();
14
+ // Basic status
15
+ const status = {
16
+ running: false,
17
+ pid: null,
18
+ pidFile: '.appshot/watch.pid',
19
+ processedCache: false,
20
+ cachedHashes: 0
21
+ };
22
+ if (pid) {
23
+ status.pid = pid;
24
+ status.running = await pidManager.isProcessRunning(pid);
25
+ }
26
+ // Check for processed cache
27
+ try {
28
+ const hashCacheFile = '.appshot/processed/hashes.json';
29
+ const content = await fs.readFile(hashCacheFile, 'utf8');
30
+ const hashes = JSON.parse(content);
31
+ status.processedCache = true;
32
+ status.cachedHashes = hashes.length;
33
+ }
34
+ catch {
35
+ // Cache doesn't exist or is invalid
36
+ }
37
+ if (options.json) {
38
+ console.log(JSON.stringify(status, null, 2));
39
+ return;
40
+ }
41
+ // Human-readable output
42
+ console.log(pc.bold('\n📊 Watch Service Status\n'));
43
+ if (status.running) {
44
+ console.log(pc.green('✅ Service is running'));
45
+ console.log(pc.dim(` PID: ${status.pid}`));
46
+ console.log(pc.dim(` PID file: ${status.pidFile}`));
47
+ }
48
+ else if (status.pid) {
49
+ console.log(pc.yellow('⚠️ Service is not running'));
50
+ console.log(pc.dim(` Stale PID: ${status.pid}`));
51
+ console.log(pc.dim(' Run "appshot watch stop" to clean up'));
52
+ }
53
+ else {
54
+ console.log(pc.gray('⚪ Service is not running'));
55
+ console.log(pc.dim(' Use "appshot watch start" to begin watching'));
56
+ }
57
+ if (options.verbose) {
58
+ console.log(pc.bold('\n📁 Cache Information\n'));
59
+ if (status.processedCache) {
60
+ console.log(pc.dim(` Processed hashes: ${status.cachedHashes}`));
61
+ console.log(pc.dim(' Cache file: .appshot/processed/hashes.json'));
62
+ }
63
+ else {
64
+ console.log(pc.dim(' No processing cache found'));
65
+ }
66
+ // Check for watch directories in config
67
+ try {
68
+ const configPath = '.appshot/config.json';
69
+ const configContent = await fs.readFile(configPath, 'utf8');
70
+ const config = JSON.parse(configContent);
71
+ if (config.watch) {
72
+ console.log(pc.bold('\n⚙️ Watch Configuration\n'));
73
+ if (config.watch.directories) {
74
+ console.log(pc.dim(' Configured directories:'));
75
+ for (const dir of config.watch.directories) {
76
+ const exists = await fs.stat(dir).then(() => true).catch(() => false);
77
+ const indicator = exists ? pc.green('✓') : pc.red('✗');
78
+ console.log(` ${indicator} ${dir}`);
79
+ }
80
+ }
81
+ if (config.watch.devices) {
82
+ console.log(pc.dim('\n Configured devices:'));
83
+ for (const device of config.watch.devices) {
84
+ console.log(` • ${device}`);
85
+ }
86
+ }
87
+ if (config.watch.process !== undefined) {
88
+ console.log(pc.dim(`\n Auto-process: ${config.watch.process ? 'Yes' : 'No'}`));
89
+ if (config.watch.frameOnly) {
90
+ console.log(pc.dim(' Mode: Frame only'));
91
+ }
92
+ }
93
+ }
94
+ }
95
+ catch {
96
+ // No config or invalid config
97
+ }
98
+ }
99
+ // Quick actions
100
+ console.log(pc.bold('\n🎯 Quick Actions\n'));
101
+ if (status.running) {
102
+ console.log(pc.dim(' appshot watch stop - Stop the service'));
103
+ console.log(pc.dim(' appshot watch status -v - Show detailed info'));
104
+ }
105
+ else {
106
+ console.log(pc.dim(' appshot watch start - Start watching'));
107
+ console.log(pc.dim(' appshot watch setup - Interactive setup'));
108
+ }
109
+ }
110
+ catch (error) {
111
+ console.error(pc.red('❌ Error checking status:'), error);
112
+ process.exit(1);
113
+ }
114
+ });
115
+ }
116
+ //# sourceMappingURL=watch-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-status.js","sourceRoot":"","sources":["../../src/commands/watch-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function watchCommand(): Command;
3
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,MAAM,CAAC,OAAO,UAAU,YAAY,IAAI,OAAO,CAuV9C"}
@@ -0,0 +1,322 @@
1
+ import { Command } from 'commander';
2
+ import { spawn } from 'child_process';
3
+ import { platform } from 'os';
4
+ import pc from 'picocolors';
5
+ import fs from 'fs/promises';
6
+ import path from 'path';
7
+ import { select, confirm, checkbox } from '@inquirer/prompts';
8
+ import { watchService, WatchService } from '../services/watch-service.js';
9
+ import { deviceManager } from '../services/device-manager.js';
10
+ import { PIDManager } from '../utils/pid-manager.js';
11
+ export default function watchCommand() {
12
+ const cmd = new Command('watch')
13
+ .description('Monitor directories for new screenshots and auto-process them');
14
+ // Start watching
15
+ cmd
16
+ .command('start')
17
+ .description('Start watching directories for screenshots')
18
+ .option('-d, --dirs <directories...>', 'Directories to watch (default: current directory)')
19
+ .option('--devices <names...>', 'Device names to process for')
20
+ .option('--process', 'Auto-process with frames and gradients')
21
+ .option('--frame-only', 'Apply frames only (no gradient/caption)')
22
+ .option('--verbose', 'Show detailed output')
23
+ .option('--background', 'Run in background (detached process)')
24
+ .action(async (options) => {
25
+ try {
26
+ // Check if already running
27
+ if (await WatchService.isRunning()) {
28
+ const pid = await WatchService.getCurrentPID();
29
+ console.error(pc.red(`❌ Watch service is already running (PID: ${pid})`));
30
+ console.log(pc.dim(' Use "appshot watch stop" to stop it first'));
31
+ process.exit(1);
32
+ }
33
+ // Determine directories to watch
34
+ let directories = options.dirs || [process.cwd()];
35
+ // Validate directories
36
+ for (const dir of directories) {
37
+ try {
38
+ const stat = await fs.stat(dir);
39
+ if (!stat.isDirectory()) {
40
+ console.error(pc.red(`❌ Not a directory: ${dir}`));
41
+ process.exit(1);
42
+ }
43
+ }
44
+ catch {
45
+ console.error(pc.red(`❌ Directory not found: ${dir}`));
46
+ process.exit(1);
47
+ }
48
+ }
49
+ // If devices specified on macOS, validate them
50
+ let validatedDevices = [];
51
+ if (options.devices && platform() === 'darwin') {
52
+ const allDevices = await deviceManager.listAllDevices();
53
+ for (const deviceName of options.devices) {
54
+ const device = allDevices.find(d => d.name.toLowerCase().includes(deviceName.toLowerCase()));
55
+ if (device) {
56
+ validatedDevices.push(device.name);
57
+ }
58
+ else {
59
+ console.warn(pc.yellow(`⚠️ Device not found: ${deviceName}`));
60
+ }
61
+ }
62
+ if (validatedDevices.length === 0 && options.devices.length > 0) {
63
+ console.error(pc.red('❌ No valid devices found'));
64
+ process.exit(1);
65
+ }
66
+ }
67
+ if (options.background) {
68
+ // Start in background
69
+ console.log(pc.cyan('🚀 Starting watch service in background...'));
70
+ // Build command arguments
71
+ const args = ['watch', 'start'];
72
+ if (options.dirs)
73
+ args.push('--dirs', ...options.dirs);
74
+ if (validatedDevices.length > 0)
75
+ args.push('--devices', ...validatedDevices);
76
+ if (options.process)
77
+ args.push('--process');
78
+ if (options.frameOnly)
79
+ args.push('--frame-only');
80
+ if (options.verbose)
81
+ args.push('--verbose');
82
+ // Spawn detached process
83
+ const child = spawn('appshot', args, {
84
+ detached: true,
85
+ stdio: 'ignore',
86
+ env: process.env
87
+ });
88
+ child.unref();
89
+ // Wait a moment to check if it started
90
+ await new Promise(resolve => setTimeout(resolve, 1000));
91
+ if (await WatchService.isRunning()) {
92
+ const pid = await WatchService.getCurrentPID();
93
+ console.log(pc.green(`✅ Watch service started in background (PID: ${pid})`));
94
+ console.log(pc.dim(' Use "appshot watch status" to check status'));
95
+ console.log(pc.dim(' Use "appshot watch stop" to stop watching'));
96
+ }
97
+ else {
98
+ console.error(pc.red('❌ Failed to start watch service'));
99
+ process.exit(1);
100
+ }
101
+ }
102
+ else {
103
+ // Start in foreground
104
+ console.log(pc.cyan('🚀 Starting watch service...'));
105
+ console.log(pc.dim(' Press Ctrl+C to stop\n'));
106
+ await watchService.start({
107
+ directories,
108
+ devices: validatedDevices,
109
+ process: options.process || false,
110
+ frameOnly: options.frameOnly || false,
111
+ verbose: options.verbose || false
112
+ });
113
+ }
114
+ }
115
+ catch (error) {
116
+ console.error(pc.red('❌ Error starting watch service:'), error);
117
+ process.exit(1);
118
+ }
119
+ });
120
+ // Stop watching
121
+ cmd
122
+ .command('stop')
123
+ .description('Stop the watch service')
124
+ .action(async () => {
125
+ try {
126
+ const pidManager = new PIDManager('.appshot/watch.pid');
127
+ const pid = await pidManager.readPID();
128
+ if (!pid) {
129
+ console.log(pc.yellow('⚠️ Watch service is not running'));
130
+ return;
131
+ }
132
+ if (!(await pidManager.isProcessRunning(pid))) {
133
+ console.log(pc.yellow('⚠️ Watch service PID file exists but process is not running'));
134
+ await pidManager.cleanup();
135
+ return;
136
+ }
137
+ console.log(pc.cyan(`🛑 Stopping watch service (PID: ${pid})...`));
138
+ try {
139
+ process.kill(pid, 'SIGTERM');
140
+ // Wait for process to stop
141
+ let attempts = 0;
142
+ while (attempts < 10 && await pidManager.isProcessRunning(pid)) {
143
+ await new Promise(resolve => setTimeout(resolve, 500));
144
+ attempts++;
145
+ }
146
+ if (await pidManager.isProcessRunning(pid)) {
147
+ // Force kill if still running
148
+ console.log(pc.yellow('⚠️ Process did not stop gracefully, forcing...'));
149
+ process.kill(pid, 'SIGKILL');
150
+ }
151
+ await pidManager.cleanup();
152
+ console.log(pc.green('✅ Watch service stopped'));
153
+ }
154
+ catch (error) {
155
+ if (error.code === 'ESRCH') {
156
+ console.log(pc.yellow('⚠️ Process already stopped'));
157
+ await pidManager.cleanup();
158
+ }
159
+ else {
160
+ throw error;
161
+ }
162
+ }
163
+ }
164
+ catch (error) {
165
+ console.error(pc.red('❌ Error stopping watch service:'), error);
166
+ process.exit(1);
167
+ }
168
+ });
169
+ // Check status
170
+ cmd
171
+ .command('status')
172
+ .description('Check watch service status')
173
+ .option('--json', 'Output as JSON')
174
+ .action(async (options) => {
175
+ try {
176
+ const pidManager = new PIDManager('.appshot/watch.pid');
177
+ const pid = await pidManager.readPID();
178
+ if (!pid) {
179
+ if (options.json) {
180
+ console.log(JSON.stringify({ running: false }));
181
+ }
182
+ else {
183
+ console.log(pc.yellow('⚠️ Watch service is not running'));
184
+ }
185
+ return;
186
+ }
187
+ const isRunning = await pidManager.isProcessRunning(pid);
188
+ if (!isRunning) {
189
+ if (options.json) {
190
+ console.log(JSON.stringify({ running: false, stalePid: pid }));
191
+ }
192
+ else {
193
+ console.log(pc.yellow('⚠️ Watch service PID file exists but process is not running'));
194
+ console.log(pc.dim(` Stale PID: ${pid}`));
195
+ console.log(pc.dim(' Run "appshot watch stop" to clean up'));
196
+ }
197
+ return;
198
+ }
199
+ if (options.json) {
200
+ console.log(JSON.stringify({
201
+ running: true,
202
+ pid,
203
+ pidFile: '.appshot/watch.pid'
204
+ }));
205
+ }
206
+ else {
207
+ console.log(pc.green('✅ Watch service is running'));
208
+ console.log(pc.dim(` PID: ${pid}`));
209
+ console.log(pc.dim(' PID file: .appshot/watch.pid'));
210
+ console.log(pc.dim('\n Use "appshot watch stop" to stop watching'));
211
+ }
212
+ }
213
+ catch (error) {
214
+ console.error(pc.red('❌ Error checking status:'), error);
215
+ process.exit(1);
216
+ }
217
+ });
218
+ // Interactive setup
219
+ cmd
220
+ .command('setup')
221
+ .description('Interactive watch configuration')
222
+ .action(async () => {
223
+ try {
224
+ console.log(pc.bold('\n🔧 Watch Service Setup\n'));
225
+ // Select directories
226
+ const currentDir = process.cwd();
227
+ const screenshotsDir = path.join(currentDir, 'screenshots');
228
+ const hasScreenshotsDir = await fs.stat(screenshotsDir).then(() => true).catch(() => false);
229
+ const dirChoices = [
230
+ { name: 'Current directory', value: currentDir }
231
+ ];
232
+ if (hasScreenshotsDir) {
233
+ dirChoices.push({ name: 'screenshots/ directory', value: screenshotsDir });
234
+ }
235
+ dirChoices.push({ name: 'Custom directory...', value: 'custom' });
236
+ const selectedDirs = [];
237
+ const dirChoice = await select({
238
+ message: 'Which directory should we watch?',
239
+ choices: dirChoices
240
+ });
241
+ if (dirChoice === 'custom') {
242
+ console.log(pc.dim('Enter the path to watch (or multiple paths separated by commas)'));
243
+ // Would need text input here, using current dir as fallback for now
244
+ selectedDirs.push(currentDir);
245
+ }
246
+ else {
247
+ selectedDirs.push(dirChoice);
248
+ }
249
+ // Select devices (macOS only)
250
+ let selectedDevices = [];
251
+ if (platform() === 'darwin') {
252
+ const useDevices = await confirm({
253
+ message: 'Process screenshots for specific devices?',
254
+ default: false
255
+ });
256
+ if (useDevices) {
257
+ const devices = await deviceManager.listAllDevices();
258
+ if (devices.length > 0) {
259
+ const deviceChoices = devices.map(d => ({
260
+ name: `${d.name} (${d.category})`,
261
+ value: d.name,
262
+ checked: false
263
+ }));
264
+ selectedDevices = await checkbox({
265
+ message: 'Select devices to process for:',
266
+ choices: deviceChoices
267
+ });
268
+ }
269
+ }
270
+ }
271
+ // Processing options
272
+ const shouldProcess = await confirm({
273
+ message: 'Auto-process screenshots with frames and gradients?',
274
+ default: true
275
+ });
276
+ let frameOnly = false;
277
+ if (shouldProcess) {
278
+ frameOnly = await confirm({
279
+ message: 'Frame only mode? (no gradient/caption)',
280
+ default: false
281
+ });
282
+ }
283
+ // Background mode
284
+ const runInBackground = await confirm({
285
+ message: 'Run in background?',
286
+ default: true
287
+ });
288
+ // Build and execute command
289
+ const args = ['watch', 'start', '--dirs', ...selectedDirs];
290
+ if (selectedDevices.length > 0) {
291
+ args.push('--devices', ...selectedDevices);
292
+ }
293
+ if (shouldProcess) {
294
+ args.push('--process');
295
+ if (frameOnly) {
296
+ args.push('--frame-only');
297
+ }
298
+ }
299
+ if (runInBackground) {
300
+ args.push('--background');
301
+ }
302
+ console.log(pc.cyan('\n📝 Configuration complete!\n'));
303
+ console.log(pc.dim('Running command:'));
304
+ console.log(pc.dim(` appshot ${args.join(' ')}\n`));
305
+ // Execute the command
306
+ const { spawn } = await import('child_process');
307
+ const child = spawn('appshot', args, {
308
+ stdio: 'inherit',
309
+ env: process.env
310
+ });
311
+ child.on('exit', (code) => {
312
+ process.exit(code || 0);
313
+ });
314
+ }
315
+ catch (error) {
316
+ console.error(pc.red('❌ Error in setup:'), error);
317
+ process.exit(1);
318
+ }
319
+ });
320
+ return cmd;
321
+ }
322
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/core/compose.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAoI/E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,CAAC,EAAE,MAAM,CAAC;YACV,CAAC,EAAE,MAAM,CAAC;YACV,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;QACjD,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoyBxF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;QACjD,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuFlB;AAqGD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB7H;AAED,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CA0F1D"}
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/core/compose.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAoI/E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,CAAC,EAAE,MAAM,CAAC;YACV,CAAC,EAAE,MAAM,CAAC;YACV,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;QACjD,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA0yBxF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;QACjD,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuFlB;AAqGD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB7H;AAED,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CA0F1D"}
@@ -270,6 +270,10 @@ export async function composeAppStoreScreenshot(options) {
270
270
  if (!Buffer.isBuffer(frame)) {
271
271
  throw new Error(`Frame is not a valid buffer for ${frameMetadata.displayName || frameMetadata.name}`);
272
272
  }
273
+ // Validate screenshot buffer
274
+ if (!Buffer.isBuffer(screenshot) || screenshot.length === 0) {
275
+ throw new Error('Screenshot is not a valid buffer or is empty');
276
+ }
273
277
  // Calculate scale factor if frame needs to be resized to fit output
274
278
  const originalFrameWidth = frameMetadata.frameWidth;
275
279
  const originalFrameHeight = frameMetadata.frameHeight;