vibecodingmachine-cli 2025.11.2-9.855 → 2025.12.6-1702

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.
@@ -0,0 +1,146 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('path');
3
+ const os = require('os');
4
+ const { spawn } = require('child_process');
5
+ const ora = require('ora');
6
+ const chalk = require('chalk');
7
+
8
+ // Placeholder check - this should ideally check for the actual application path
9
+ // On macOS, typically /Applications/AWS Kiro.app or similar
10
+ // For now, we'll check a simulated path or just return false to test the flow
11
+ function isKiroInstalled() {
12
+ const platform = os.platform();
13
+ if (platform === 'darwin') {
14
+ return fs.existsSync('/Applications/AWS Kiro.app') || fs.existsSync('/Applications/Kiro.app');
15
+ }
16
+ // Add Windows/Linux checks if needed
17
+ return false;
18
+ }
19
+
20
+ async function installKiro() {
21
+ console.log(chalk.cyan('\n🚀 Initiating AWS Kiro AI IDE Installation...'));
22
+
23
+ const spinner = ora('Checking system requirements...').start();
24
+ await new Promise(resolve => setTimeout(resolve, 1000));
25
+
26
+ // Detect architecture
27
+ const arch = process.arch;
28
+ const isArm = arch === 'arm64';
29
+
30
+ // Verified working URL for ARM64 (v202507161958)
31
+ // For x64, we don't have the exact timestamp/hash, so recent failures suggest we might need to fallback to manual
32
+ const downloadUrl = isArm
33
+ ? 'https://prod.download.desktop.kiro.dev/releases/202507161958-Kiro-dmg-darwin-arm64.dmg'
34
+ : 'https://kiro.dev/downloads/'; // Fallback to downloads page for x64 until we find the direct link
35
+
36
+ spinner.succeed(`System requirements met (${isArm ? 'Apple Silicon' : 'Intel'}).`);
37
+
38
+ // for x64, we can't automate yet
39
+ if (!isArm) {
40
+ console.log(chalk.yellow('\n⚠️ Automated installation is currently only available for Apple Silicon (M1/M2/M3).'));
41
+ console.log(chalk.cyan('Opening download page...'));
42
+ // open v11+ is ESM only
43
+ const open = (await import('open')).default;
44
+ await open(downloadUrl);
45
+ return false;
46
+ }
47
+
48
+ try {
49
+ const fetch = require('node-fetch');
50
+ const fs = require('fs-extra');
51
+ const path = require('path');
52
+ const os = require('os');
53
+ const { execSync } = require('child_process');
54
+
55
+ console.log(chalk.cyan(`\n⬇️ Downloading AWS Kiro for macOS (${arch})...`));
56
+ const downloadSpinner = ora('Downloading... (this may take a moment)').start();
57
+
58
+ const response = await fetch(downloadUrl);
59
+ if (!response.ok) {
60
+ downloadSpinner.fail(`Failed to download: ${response.statusText}`);
61
+ console.log(chalk.red(`\nURL: ${downloadUrl}`));
62
+ throw new Error(`Download failed with status ${response.status}`);
63
+ }
64
+
65
+ const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'kiro-install-'));
66
+ const dmgPath = path.join(tempDir, 'Kiro.dmg');
67
+ const fileStream = fs.createWriteStream(dmgPath);
68
+
69
+ await new Promise((resolve, reject) => {
70
+ response.body.pipe(fileStream);
71
+ response.body.on('error', (err) => {
72
+ downloadSpinner.fail('Download error');
73
+ reject(err);
74
+ });
75
+ fileStream.on('finish', resolve);
76
+ });
77
+
78
+ downloadSpinner.succeed('Download complete.');
79
+
80
+ const installSpinner = ora('Installing AWS Kiro...').start();
81
+
82
+ try {
83
+ // Mount DMG
84
+ installSpinner.text = 'Mounting disk image...';
85
+ // -nobrowse to prevent opening Finder window, -noverify to speed up
86
+ execSync(`hdiutil attach "${dmgPath}" -nobrowse -noverify -mountpoint "${tempDir}/mount"`);
87
+
88
+ // Copy App
89
+ installSpinner.text = 'Copying to Applications...';
90
+
91
+ // Look for .app file
92
+ const files = await fs.readdir(path.join(tempDir, 'mount'));
93
+ const appName = files.find(f => f.endsWith('.app'));
94
+
95
+ if (!appName) {
96
+ throw new Error('Could not find .app file in the downloaded DMG.');
97
+ }
98
+
99
+ const fullSourcePath = path.join(tempDir, 'mount', appName);
100
+ const destinationPath = path.join('/Applications', appName);
101
+
102
+ // Remove existing if any
103
+ if (await fs.pathExists(destinationPath)) {
104
+ installSpinner.text = 'Replacing existing installation...';
105
+ await fs.remove(destinationPath);
106
+ }
107
+
108
+ await fs.copy(fullSourcePath, destinationPath);
109
+
110
+ // Unmount
111
+ installSpinner.text = 'Cleaning up...';
112
+ execSync(`hdiutil detach "${tempDir}/mount" -force`);
113
+ await fs.remove(tempDir);
114
+
115
+ installSpinner.succeed('AWS Kiro successfully installed!');
116
+ console.log(chalk.green(`\n✅ Installed to ${destinationPath}`));
117
+
118
+ return true;
119
+ } catch (installError) {
120
+ installSpinner.fail('Installation failed during file operations');
121
+ // Try to cleanup even if install failed
122
+ try {
123
+ if (fs.existsSync(path.join(tempDir, 'mount'))) {
124
+ execSync(`hdiutil detach "${tempDir}/mount" -force`);
125
+ }
126
+ await fs.remove(tempDir);
127
+ } catch (cleanupError) {
128
+ // Ignore cleanup errors
129
+ }
130
+ throw installError;
131
+ }
132
+
133
+ } catch (error) {
134
+ // If error was thrown, spinners should have been handled, but just in case
135
+ // The main catch block for installKiro should not call ora().fail()
136
+ // as specific spinners (downloadSpinner, installSpinner) would have already failed.
137
+ // We log the manual download link
138
+ console.log(chalk.red('\nYou may need to download manually from: https://kiro.dev'));
139
+ return false;
140
+ }
141
+ }
142
+
143
+ module.exports = {
144
+ isKiroInstalled,
145
+ installKiro
146
+ };
@@ -62,6 +62,14 @@ const PROVIDER_DEFINITIONS = [
62
62
  ide: 'antigravity',
63
63
  estimatedSpeed: 90000
64
64
  },
65
+ {
66
+ id: 'kiro',
67
+ name: 'AWS Kiro AI IDE',
68
+ type: 'ide',
69
+ category: 'ide',
70
+ ide: 'kiro',
71
+ estimatedSpeed: 90000
72
+ },
65
73
  {
66
74
  id: 'ollama',
67
75
  name: 'Ollama (Local)',
@@ -64,7 +64,8 @@ function renderStatusCard(status) {
64
64
  borderStyle: 'round',
65
65
  borderColor: 'magenta',
66
66
  title: 'Auto Mode Status',
67
- titleAlignment: 'center'
67
+ titleAlignment: 'center',
68
+ width: 80
68
69
  });
69
70
  }
70
71