@braingrid/cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/README.md +26 -24
- package/dist/cli.js +37 -17
- package/dist/cli.js.map +1 -1
- package/dist/handlers/agent.handlers.d.ts +12 -0
- package/dist/handlers/agent.handlers.d.ts.map +1 -0
- package/dist/handlers/agent.handlers.js +130 -0
- package/dist/handlers/agent.handlers.js.map +1 -0
- package/dist/handlers/index.d.ts +1 -0
- package/dist/handlers/index.d.ts.map +1 -1
- package/dist/handlers/index.js +1 -0
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/init.handlers.d.ts +0 -1
- package/dist/handlers/init.handlers.d.ts.map +1 -1
- package/dist/handlers/init.handlers.js +481 -43
- package/dist/handlers/init.handlers.js.map +1 -1
- package/dist/handlers/project.handlers.d.ts +2 -3
- package/dist/handlers/project.handlers.d.ts.map +1 -1
- package/dist/handlers/project.handlers.js +80 -71
- package/dist/handlers/project.handlers.js.map +1 -1
- package/dist/handlers/requirement.handlers.d.ts.map +1 -1
- package/dist/handlers/requirement.handlers.js +21 -20
- package/dist/handlers/requirement.handlers.js.map +1 -1
- package/dist/handlers/status.handlers.d.ts.map +1 -1
- package/dist/handlers/status.handlers.js +11 -8
- package/dist/handlers/status.handlers.js.map +1 -1
- package/dist/handlers/task.handlers.d.ts.map +1 -1
- package/dist/handlers/task.handlers.js +45 -26
- package/dist/handlers/task.handlers.js.map +1 -1
- package/dist/rpc/server.d.ts +2 -0
- package/dist/rpc/server.d.ts.map +1 -1
- package/dist/rpc/server.js +28 -11
- package/dist/rpc/server.js.map +1 -1
- package/dist/services/agent-service.d.ts +29 -0
- package/dist/services/agent-service.d.ts.map +1 -0
- package/dist/services/agent-service.js +273 -0
- package/dist/services/agent-service.js.map +1 -0
- package/dist/services/credential-store.d.ts.map +1 -1
- package/dist/services/credential-store.js +1 -0
- package/dist/services/credential-store.js.map +1 -1
- package/dist/services/internal/github-service.d.ts +67 -0
- package/dist/services/internal/github-service.d.ts.map +1 -0
- package/dist/services/internal/github-service.js +81 -0
- package/dist/services/internal/github-service.js.map +1 -0
- package/dist/services/internal/repository-service.d.ts +79 -0
- package/dist/services/internal/repository-service.d.ts.map +1 -0
- package/dist/services/internal/repository-service.js +88 -0
- package/dist/services/internal/repository-service.js.map +1 -0
- package/dist/types/github.d.ts +105 -0
- package/dist/types/github.d.ts.map +1 -0
- package/dist/types/github.js +6 -0
- package/dist/types/github.js.map +1 -0
- package/dist/types/project.d.ts +1 -0
- package/dist/types/project.d.ts.map +1 -1
- package/dist/utils/cli-tools.d.ts.map +1 -1
- package/dist/utils/cli-tools.js +9 -1
- package/dist/utils/cli-tools.js.map +1 -1
- package/dist/utils/config.d.ts +1 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +18 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/gh-installer.d.ts +31 -0
- package/dist/utils/gh-installer.d.ts.map +1 -0
- package/dist/utils/gh-installer.js +296 -0
- package/dist/utils/gh-installer.js.map +1 -0
- package/dist/utils/git-installer.d.ts +31 -0
- package/dist/utils/git-installer.d.ts.map +1 -0
- package/dist/utils/git-installer.js +290 -0
- package/dist/utils/git-installer.js.map +1 -0
- package/dist/utils/git.d.ts +5 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +13 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/github-repo.d.ts +43 -0
- package/dist/utils/github-repo.d.ts.map +1 -0
- package/dist/utils/github-repo.js +113 -0
- package/dist/utils/github-repo.js.map +1 -0
- package/dist/utils/id-normalization.d.ts +26 -0
- package/dist/utils/id-normalization.d.ts.map +1 -0
- package/dist/utils/id-normalization.js +45 -0
- package/dist/utils/id-normalization.js.map +1 -0
- package/dist/utils/local-store.d.ts +7 -7
- package/dist/utils/local-store.d.ts.map +1 -1
- package/dist/utils/local-store.js +29 -17
- package/dist/utils/local-store.js.map +1 -1
- package/dist/utils/package-manager-installer.d.ts +36 -0
- package/dist/utils/package-manager-installer.d.ts.map +1 -0
- package/dist/utils/package-manager-installer.js +106 -0
- package/dist/utils/package-manager-installer.js.map +1 -0
- package/dist/utils/projects.d.ts +23 -0
- package/dist/utils/projects.d.ts.map +1 -0
- package/dist/utils/projects.js +36 -0
- package/dist/utils/projects.js.map +1 -0
- package/dist/utils/repository-access.d.ts +89 -0
- package/dist/utils/repository-access.d.ts.map +1 -0
- package/dist/utils/repository-access.js +132 -0
- package/dist/utils/repository-access.js.map +1 -0
- package/dist/utils/requirements.d.ts +15 -0
- package/dist/utils/requirements.d.ts.map +1 -1
- package/dist/utils/requirements.js +32 -7
- package/dist/utils/requirements.js.map +1 -1
- package/dist/utils/spinner.d.ts +47 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +101 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/tasks.d.ts +12 -0
- package/dist/utils/tasks.d.ts.map +1 -1
- package/dist/utils/tasks.js +31 -6
- package/dist/utils/tasks.js.map +1 -1
- package/dist/utils/workspace-manager.d.ts +65 -0
- package/dist/utils/workspace-manager.d.ts.map +1 -0
- package/dist/utils/workspace-manager.js +98 -0
- package/dist/utils/workspace-manager.js.map +1 -0
- package/package.json +4 -1
- package/dist/services/context-manager.d.ts +0 -170
- package/dist/services/context-manager.d.ts.map +0 -1
- package/dist/services/context-manager.js +0 -261
- package/dist/services/context-manager.js.map +0 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub CLI Installer Utility
|
|
3
|
+
*
|
|
4
|
+
* Automatically installs GitHub CLI on the user's system using platform-specific methods:
|
|
5
|
+
* - macOS: Homebrew (if installed) or Webi (automated installer)
|
|
6
|
+
* - Windows: winget
|
|
7
|
+
* - Linux: apt/dnf/pacman (auto-detected)
|
|
8
|
+
*/
|
|
9
|
+
export interface GhInstallResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
message: string;
|
|
12
|
+
version?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if GitHub CLI is installed
|
|
16
|
+
*/
|
|
17
|
+
export declare function isGhInstalled(): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Get GitHub CLI version if installed
|
|
20
|
+
*/
|
|
21
|
+
export declare function getGhVersion(): Promise<string | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Install GitHub CLI on the current platform
|
|
24
|
+
* Auto-detects platform and uses appropriate installation method
|
|
25
|
+
*/
|
|
26
|
+
export declare function installGh(): Promise<GhInstallResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Get manual installation instructions for the current platform
|
|
29
|
+
*/
|
|
30
|
+
export declare function getGhManualInstallInstructions(): string;
|
|
31
|
+
//# sourceMappingURL=gh-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh-installer.d.ts","sourceRoot":"","sources":["../../src/utils/gh-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAEtD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK3D;AAgPD;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAsB1D;AAED;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CA8CvD"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub CLI Installer Utility
|
|
3
|
+
*
|
|
4
|
+
* Automatically installs GitHub CLI on the user's system using platform-specific methods:
|
|
5
|
+
* - macOS: Homebrew (if installed) or Webi (automated installer)
|
|
6
|
+
* - Windows: winget
|
|
7
|
+
* - Linux: apt/dnf/pacman (auto-detected)
|
|
8
|
+
*/
|
|
9
|
+
import { exec } from 'child_process';
|
|
10
|
+
import { promisify } from 'util';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import { isCliInstalled, getCliVersion } from './cli-tools.js';
|
|
13
|
+
import { isHomebrewInstalled, isWingetAvailable, detectLinuxPackageManager, } from './package-manager-installer.js';
|
|
14
|
+
const execAsync = promisify(exec);
|
|
15
|
+
/**
|
|
16
|
+
* Check if GitHub CLI is installed
|
|
17
|
+
*/
|
|
18
|
+
export async function isGhInstalled() {
|
|
19
|
+
return isCliInstalled('gh');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get GitHub CLI version if installed
|
|
23
|
+
*/
|
|
24
|
+
export async function getGhVersion() {
|
|
25
|
+
return getCliVersion('gh', '--version', output => {
|
|
26
|
+
const match = output.match(/gh version ([\d.]+)/);
|
|
27
|
+
return match ? match[1] : null;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Install GitHub CLI on macOS via Homebrew (when Homebrew is already installed)
|
|
32
|
+
*/
|
|
33
|
+
async function installViaHomebrew() {
|
|
34
|
+
console.log(chalk.blue('📦 Installing GitHub CLI via Homebrew...'));
|
|
35
|
+
try {
|
|
36
|
+
await execAsync('brew install gh', {
|
|
37
|
+
timeout: 300000, // 5 minutes
|
|
38
|
+
});
|
|
39
|
+
// Verify installation
|
|
40
|
+
const version = await getGhVersion();
|
|
41
|
+
if (!version) {
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
message: chalk.red('❌ GitHub CLI installation completed but gh command not found'),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
success: true,
|
|
49
|
+
message: chalk.green(`✅ GitHub CLI installed successfully (version ${version})!`),
|
|
50
|
+
version,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
55
|
+
return {
|
|
56
|
+
success: false,
|
|
57
|
+
message: chalk.red('❌ Failed to install GitHub CLI via Homebrew\n\n') +
|
|
58
|
+
chalk.dim('Error: ') +
|
|
59
|
+
errorMsg +
|
|
60
|
+
'\n\n' +
|
|
61
|
+
chalk.dim('Please install GitHub CLI manually from: ') +
|
|
62
|
+
chalk.cyan('https://cli.github.com/'),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Install GitHub CLI on macOS via Webi (automated installer, no Homebrew needed)
|
|
68
|
+
*/
|
|
69
|
+
async function installViaWebi() {
|
|
70
|
+
console.log(chalk.blue('📦 Installing GitHub CLI via Webi...'));
|
|
71
|
+
console.log(chalk.dim('This will install gh to ~/.local/bin/\n'));
|
|
72
|
+
try {
|
|
73
|
+
await execAsync('curl -sS https://webi.sh/gh | sh', {
|
|
74
|
+
timeout: 300000, // 5 minutes
|
|
75
|
+
});
|
|
76
|
+
// Verify installation
|
|
77
|
+
const version = await getGhVersion();
|
|
78
|
+
if (!version) {
|
|
79
|
+
// Installation succeeded but PATH not updated yet
|
|
80
|
+
return {
|
|
81
|
+
success: true,
|
|
82
|
+
message: chalk.green('✅ GitHub CLI installed successfully!\n') +
|
|
83
|
+
chalk.dim('Note: You may need to restart your terminal for the gh command to be available.'),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
success: true,
|
|
88
|
+
message: chalk.green(`✅ GitHub CLI installed successfully (version ${version})!`),
|
|
89
|
+
version,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
94
|
+
return {
|
|
95
|
+
success: false,
|
|
96
|
+
message: chalk.red('❌ Failed to install GitHub CLI via Webi\n\n') +
|
|
97
|
+
chalk.dim('Error: ') +
|
|
98
|
+
errorMsg +
|
|
99
|
+
'\n\n' +
|
|
100
|
+
chalk.dim('Please install GitHub CLI manually from: ') +
|
|
101
|
+
chalk.cyan('https://cli.github.com/'),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Install GitHub CLI on macOS using best available method
|
|
107
|
+
* Strategy: Use Homebrew if installed, otherwise use Webi
|
|
108
|
+
*/
|
|
109
|
+
async function installGhMacOS() {
|
|
110
|
+
// Check if Homebrew is already installed
|
|
111
|
+
const hasHomebrew = await isHomebrewInstalled();
|
|
112
|
+
if (hasHomebrew) {
|
|
113
|
+
// User already has Homebrew - use it (fast and familiar)
|
|
114
|
+
return installViaHomebrew();
|
|
115
|
+
}
|
|
116
|
+
// No Homebrew - use Webi (automated installer, no package manager needed)
|
|
117
|
+
return installViaWebi();
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Install GitHub CLI on Windows using winget
|
|
121
|
+
*/
|
|
122
|
+
async function installGhWindows() {
|
|
123
|
+
// Check if winget is available
|
|
124
|
+
const hasWinget = await isWingetAvailable();
|
|
125
|
+
if (!hasWinget) {
|
|
126
|
+
return {
|
|
127
|
+
success: false,
|
|
128
|
+
message: chalk.red('❌ winget is not available on this system\n\n') +
|
|
129
|
+
chalk.dim('winget is included in Windows 10 (version 1809+) and Windows 11.\n') +
|
|
130
|
+
chalk.dim('Please install GitHub CLI manually from: ') +
|
|
131
|
+
chalk.cyan('https://cli.github.com/'),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
console.log(chalk.blue('📦 Installing GitHub CLI via winget...'));
|
|
135
|
+
try {
|
|
136
|
+
await execAsync('winget install --id GitHub.cli --silent', {
|
|
137
|
+
timeout: 300000, // 5 minutes
|
|
138
|
+
});
|
|
139
|
+
// Verify installation
|
|
140
|
+
const version = await getGhVersion();
|
|
141
|
+
if (!version) {
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
message: chalk.red('❌ GitHub CLI installation completed but gh command not found'),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
success: true,
|
|
149
|
+
message: chalk.green(`✅ GitHub CLI installed successfully (version ${version})!`),
|
|
150
|
+
version,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
155
|
+
return {
|
|
156
|
+
success: false,
|
|
157
|
+
message: chalk.red('❌ Failed to install GitHub CLI via winget\n\n') +
|
|
158
|
+
chalk.dim('Error: ') +
|
|
159
|
+
errorMsg +
|
|
160
|
+
'\n\n' +
|
|
161
|
+
chalk.dim('Please install GitHub CLI manually from: ') +
|
|
162
|
+
chalk.cyan('https://cli.github.com/'),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Install GitHub CLI on Linux using detected package manager
|
|
168
|
+
*/
|
|
169
|
+
async function installGhLinux() {
|
|
170
|
+
const packageManager = await detectLinuxPackageManager();
|
|
171
|
+
if (!packageManager) {
|
|
172
|
+
return {
|
|
173
|
+
success: false,
|
|
174
|
+
message: chalk.red('❌ Could not detect a supported package manager\n\n') +
|
|
175
|
+
chalk.dim('Supported package managers: apt, dnf, yum, pacman\n') +
|
|
176
|
+
chalk.dim('Please install GitHub CLI manually from: ') +
|
|
177
|
+
chalk.cyan('https://cli.github.com/'),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
console.log(chalk.blue(`📦 Installing GitHub CLI via ${packageManager.name}...`));
|
|
181
|
+
console.log(chalk.dim('This may prompt for your sudo password.\n'));
|
|
182
|
+
try {
|
|
183
|
+
let installCommand;
|
|
184
|
+
switch (packageManager.name) {
|
|
185
|
+
case 'apt':
|
|
186
|
+
// Add GitHub CLI repository and install
|
|
187
|
+
installCommand =
|
|
188
|
+
'curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && ' +
|
|
189
|
+
'sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && ' +
|
|
190
|
+
'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null && ' +
|
|
191
|
+
'sudo apt update && sudo apt install gh -y';
|
|
192
|
+
break;
|
|
193
|
+
case 'dnf':
|
|
194
|
+
installCommand = 'sudo dnf install gh -y';
|
|
195
|
+
break;
|
|
196
|
+
case 'yum':
|
|
197
|
+
installCommand = 'sudo yum install gh -y';
|
|
198
|
+
break;
|
|
199
|
+
case 'pacman':
|
|
200
|
+
installCommand = 'sudo pacman -S --noconfirm github-cli';
|
|
201
|
+
break;
|
|
202
|
+
default:
|
|
203
|
+
return {
|
|
204
|
+
success: false,
|
|
205
|
+
message: chalk.red(`❌ Unsupported package manager: ${packageManager.name}`),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
await execAsync(installCommand, {
|
|
209
|
+
timeout: 300000, // 5 minutes
|
|
210
|
+
});
|
|
211
|
+
// Verify installation
|
|
212
|
+
const version = await getGhVersion();
|
|
213
|
+
if (!version) {
|
|
214
|
+
return {
|
|
215
|
+
success: false,
|
|
216
|
+
message: chalk.red('❌ GitHub CLI installation completed but gh command not found'),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
success: true,
|
|
221
|
+
message: chalk.green(`✅ GitHub CLI installed successfully (version ${version})!`),
|
|
222
|
+
version,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
227
|
+
return {
|
|
228
|
+
success: false,
|
|
229
|
+
message: chalk.red('❌ Failed to install GitHub CLI\n\n') +
|
|
230
|
+
chalk.dim('Error: ') +
|
|
231
|
+
errorMsg +
|
|
232
|
+
'\n\n' +
|
|
233
|
+
chalk.dim('Please install GitHub CLI manually from: ') +
|
|
234
|
+
chalk.cyan('https://cli.github.com/'),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Install GitHub CLI on the current platform
|
|
240
|
+
* Auto-detects platform and uses appropriate installation method
|
|
241
|
+
*/
|
|
242
|
+
export async function installGh() {
|
|
243
|
+
const platform = process.platform;
|
|
244
|
+
switch (platform) {
|
|
245
|
+
case 'darwin':
|
|
246
|
+
return installGhMacOS();
|
|
247
|
+
case 'win32':
|
|
248
|
+
return installGhWindows();
|
|
249
|
+
case 'linux':
|
|
250
|
+
return installGhLinux();
|
|
251
|
+
default:
|
|
252
|
+
return {
|
|
253
|
+
success: false,
|
|
254
|
+
message: chalk.red(`❌ Unsupported platform: ${platform}\n\n`) +
|
|
255
|
+
chalk.dim('Please install GitHub CLI manually from: ') +
|
|
256
|
+
chalk.cyan('https://cli.github.com/'),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get manual installation instructions for the current platform
|
|
262
|
+
*/
|
|
263
|
+
export function getGhManualInstallInstructions() {
|
|
264
|
+
const platform = process.platform;
|
|
265
|
+
switch (platform) {
|
|
266
|
+
case 'darwin':
|
|
267
|
+
return (chalk.yellow('📖 Manual GitHub CLI Installation (macOS)\n\n') +
|
|
268
|
+
chalk.dim('Option 1 - Webi (recommended, no Homebrew needed):\n') +
|
|
269
|
+
chalk.cyan(' curl -sS https://webi.sh/gh | sh\n\n') +
|
|
270
|
+
chalk.dim('Option 2 - Homebrew:\n') +
|
|
271
|
+
chalk.cyan(' brew install gh\n\n') +
|
|
272
|
+
chalk.dim('Option 3 - Direct download:\n') +
|
|
273
|
+
chalk.cyan(' Download from: https://cli.github.com/'));
|
|
274
|
+
case 'win32':
|
|
275
|
+
return (chalk.yellow('📖 Manual GitHub CLI Installation (Windows)\n\n') +
|
|
276
|
+
chalk.dim('Option 1 - winget (Windows 10+):\n') +
|
|
277
|
+
chalk.cyan(' winget install --id GitHub.cli\n\n') +
|
|
278
|
+
chalk.dim('Option 2 - Direct download:\n') +
|
|
279
|
+
chalk.cyan(' Download from: https://cli.github.com/'));
|
|
280
|
+
case 'linux':
|
|
281
|
+
return (chalk.yellow('📖 Manual GitHub CLI Installation (Linux)\n\n') +
|
|
282
|
+
chalk.dim('Debian/Ubuntu:\n') +
|
|
283
|
+
chalk.cyan(' See instructions at: https://github.com/cli/cli/blob/trunk/docs/install_linux.md#debian-ubuntu-linux-raspberry-pi-os-apt\n\n') +
|
|
284
|
+
chalk.dim('Fedora/RHEL:\n') +
|
|
285
|
+
chalk.cyan(' sudo dnf install gh\n\n') +
|
|
286
|
+
chalk.dim('Arch Linux:\n') +
|
|
287
|
+
chalk.cyan(' sudo pacman -S github-cli\n\n') +
|
|
288
|
+
chalk.dim('Or download from: ') +
|
|
289
|
+
chalk.cyan('https://cli.github.com/'));
|
|
290
|
+
default:
|
|
291
|
+
return (chalk.yellow('📖 Manual GitHub CLI Installation\n\n') +
|
|
292
|
+
chalk.dim('Download from: ') +
|
|
293
|
+
chalk.cyan('https://cli.github.com/'));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=gh-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh-installer.js","sourceRoot":"","sources":["../../src/utils/gh-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Installer Utility
|
|
3
|
+
*
|
|
4
|
+
* Automatically installs Git on the user's system using platform-specific package managers:
|
|
5
|
+
* - macOS: Homebrew (if installed) or Xcode Command Line Tools
|
|
6
|
+
* - Windows: winget
|
|
7
|
+
* - Linux: apt/dnf/pacman (auto-detected)
|
|
8
|
+
*/
|
|
9
|
+
export interface GitInstallResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
message: string;
|
|
12
|
+
version?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if Git is installed
|
|
16
|
+
*/
|
|
17
|
+
export declare function isGitInstalled(): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Get Git version if installed
|
|
20
|
+
*/
|
|
21
|
+
export declare function getGitVersion(): Promise<string | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Install Git on the current platform
|
|
24
|
+
* Auto-detects platform and uses appropriate package manager
|
|
25
|
+
*/
|
|
26
|
+
export declare function installGit(): Promise<GitInstallResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Get manual installation instructions for the current platform
|
|
29
|
+
*/
|
|
30
|
+
export declare function getManualInstallInstructions(): string;
|
|
31
|
+
//# sourceMappingURL=git-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-installer.d.ts","sourceRoot":"","sources":["../../src/utils/git-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAEvD;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK5D;AAsOD;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAsB5D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CA+CrD"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Installer Utility
|
|
3
|
+
*
|
|
4
|
+
* Automatically installs Git on the user's system using platform-specific package managers:
|
|
5
|
+
* - macOS: Homebrew (if installed) or Xcode Command Line Tools
|
|
6
|
+
* - Windows: winget
|
|
7
|
+
* - Linux: apt/dnf/pacman (auto-detected)
|
|
8
|
+
*/
|
|
9
|
+
import { exec } from 'child_process';
|
|
10
|
+
import { promisify } from 'util';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import { isCliInstalled, getCliVersion } from './cli-tools.js';
|
|
13
|
+
import { isHomebrewInstalled, isWingetAvailable, detectLinuxPackageManager, } from './package-manager-installer.js';
|
|
14
|
+
const execAsync = promisify(exec);
|
|
15
|
+
/**
|
|
16
|
+
* Check if Git is installed
|
|
17
|
+
*/
|
|
18
|
+
export async function isGitInstalled() {
|
|
19
|
+
return isCliInstalled('git');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get Git version if installed
|
|
23
|
+
*/
|
|
24
|
+
export async function getGitVersion() {
|
|
25
|
+
return getCliVersion('git', '--version', output => {
|
|
26
|
+
const match = output.match(/git version ([\d.]+)/);
|
|
27
|
+
return match ? match[1] : null;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Install Git on macOS via Homebrew (when Homebrew is already installed)
|
|
32
|
+
*/
|
|
33
|
+
async function installViaHomebrew() {
|
|
34
|
+
console.log(chalk.blue('📦 Installing Git via Homebrew...'));
|
|
35
|
+
try {
|
|
36
|
+
await execAsync('brew install git', {
|
|
37
|
+
timeout: 300000, // 5 minutes
|
|
38
|
+
});
|
|
39
|
+
// Verify installation
|
|
40
|
+
const version = await getGitVersion();
|
|
41
|
+
if (!version) {
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
message: chalk.red('❌ Git installation completed but git command not found'),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
success: true,
|
|
49
|
+
message: chalk.green(`✅ Git installed successfully (version ${version})!`),
|
|
50
|
+
version,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
55
|
+
return {
|
|
56
|
+
success: false,
|
|
57
|
+
message: chalk.red('❌ Failed to install Git via Homebrew\n\n') +
|
|
58
|
+
chalk.dim('Error: ') +
|
|
59
|
+
errorMsg +
|
|
60
|
+
'\n\n' +
|
|
61
|
+
chalk.dim('Please install Git manually from: ') +
|
|
62
|
+
chalk.cyan('https://git-scm.com/download/mac'),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Install Git on macOS via Xcode Command Line Tools
|
|
68
|
+
*/
|
|
69
|
+
async function installViaXcodeSelect() {
|
|
70
|
+
console.log(chalk.blue('📦 Installing Git via Xcode Command Line Tools...'));
|
|
71
|
+
console.log(chalk.dim('A system dialog will appear - click "Install" to continue.\n'));
|
|
72
|
+
try {
|
|
73
|
+
await execAsync('xcode-select --install', {
|
|
74
|
+
timeout: 600000, // 10 minutes (user interaction required)
|
|
75
|
+
});
|
|
76
|
+
// Verify installation
|
|
77
|
+
const version = await getGitVersion();
|
|
78
|
+
if (!version) {
|
|
79
|
+
return {
|
|
80
|
+
success: false,
|
|
81
|
+
message: chalk.red('❌ Git installation completed but git command not found'),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
success: true,
|
|
86
|
+
message: chalk.green(`✅ Git installed successfully (version ${version})!`),
|
|
87
|
+
version,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
message: chalk.red('❌ Failed to install Git via Xcode Command Line Tools\n\n') +
|
|
95
|
+
chalk.dim('Error: ') +
|
|
96
|
+
errorMsg +
|
|
97
|
+
'\n\n' +
|
|
98
|
+
chalk.dim('Please install Git manually from: ') +
|
|
99
|
+
chalk.cyan('https://git-scm.com/download/mac'),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Install Git on macOS using best available method
|
|
105
|
+
* Strategy: Use Homebrew if installed, otherwise use xcode-select
|
|
106
|
+
*/
|
|
107
|
+
async function installGitMacOS() {
|
|
108
|
+
// Check if Homebrew is already installed
|
|
109
|
+
const hasHomebrew = await isHomebrewInstalled();
|
|
110
|
+
if (hasHomebrew) {
|
|
111
|
+
// User already has Homebrew - use it (fast and familiar)
|
|
112
|
+
return installViaHomebrew();
|
|
113
|
+
}
|
|
114
|
+
// No Homebrew - use Xcode Command Line Tools (no need to install Homebrew)
|
|
115
|
+
return installViaXcodeSelect();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Install Git on Windows using winget
|
|
119
|
+
*/
|
|
120
|
+
async function installGitWindows() {
|
|
121
|
+
// Check if winget is available
|
|
122
|
+
const hasWinget = await isWingetAvailable();
|
|
123
|
+
if (!hasWinget) {
|
|
124
|
+
return {
|
|
125
|
+
success: false,
|
|
126
|
+
message: chalk.red('❌ winget is not available on this system\n\n') +
|
|
127
|
+
chalk.dim('winget is included in Windows 10 (version 1809+) and Windows 11.\n') +
|
|
128
|
+
chalk.dim('Please install Git manually from: ') +
|
|
129
|
+
chalk.cyan('https://git-scm.com/download/win'),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
console.log(chalk.blue('📦 Installing Git via winget...'));
|
|
133
|
+
try {
|
|
134
|
+
await execAsync('winget install --id Git.Git -e --source winget --silent', {
|
|
135
|
+
timeout: 300000, // 5 minutes
|
|
136
|
+
});
|
|
137
|
+
// Verify installation
|
|
138
|
+
const version = await getGitVersion();
|
|
139
|
+
if (!version) {
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
message: chalk.red('❌ Git installation completed but git command not found'),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
success: true,
|
|
147
|
+
message: chalk.green(`✅ Git installed successfully (version ${version})!`),
|
|
148
|
+
version,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
153
|
+
return {
|
|
154
|
+
success: false,
|
|
155
|
+
message: chalk.red('❌ Failed to install Git via winget\n\n') +
|
|
156
|
+
chalk.dim('Error: ') +
|
|
157
|
+
errorMsg +
|
|
158
|
+
'\n\n' +
|
|
159
|
+
chalk.dim('Please install Git manually from: ') +
|
|
160
|
+
chalk.cyan('https://git-scm.com/download/win'),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Install Git on Linux using detected package manager
|
|
166
|
+
*/
|
|
167
|
+
async function installGitLinux() {
|
|
168
|
+
const packageManager = await detectLinuxPackageManager();
|
|
169
|
+
if (!packageManager) {
|
|
170
|
+
return {
|
|
171
|
+
success: false,
|
|
172
|
+
message: chalk.red('❌ Could not detect a supported package manager\n\n') +
|
|
173
|
+
chalk.dim('Supported package managers: apt, dnf, yum, pacman\n') +
|
|
174
|
+
chalk.dim('Please install Git manually from: ') +
|
|
175
|
+
chalk.cyan('https://git-scm.com/download/linux'),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
console.log(chalk.blue(`📦 Installing Git via ${packageManager.name}...`));
|
|
179
|
+
console.log(chalk.dim('This may prompt for your sudo password.\n'));
|
|
180
|
+
try {
|
|
181
|
+
let installCommand;
|
|
182
|
+
switch (packageManager.name) {
|
|
183
|
+
case 'apt':
|
|
184
|
+
installCommand = 'sudo apt-get update && sudo apt-get install -y git';
|
|
185
|
+
break;
|
|
186
|
+
case 'dnf':
|
|
187
|
+
installCommand = 'sudo dnf install -y git';
|
|
188
|
+
break;
|
|
189
|
+
case 'yum':
|
|
190
|
+
installCommand = 'sudo yum install -y git';
|
|
191
|
+
break;
|
|
192
|
+
case 'pacman':
|
|
193
|
+
installCommand = 'sudo pacman -S --noconfirm git';
|
|
194
|
+
break;
|
|
195
|
+
default:
|
|
196
|
+
return {
|
|
197
|
+
success: false,
|
|
198
|
+
message: chalk.red(`❌ Unsupported package manager: ${packageManager.name}`),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
await execAsync(installCommand, {
|
|
202
|
+
timeout: 300000, // 5 minutes
|
|
203
|
+
});
|
|
204
|
+
// Verify installation
|
|
205
|
+
const version = await getGitVersion();
|
|
206
|
+
if (!version) {
|
|
207
|
+
return {
|
|
208
|
+
success: false,
|
|
209
|
+
message: chalk.red('❌ Git installation completed but git command not found'),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
success: true,
|
|
214
|
+
message: chalk.green(`✅ Git installed successfully (version ${version})!`),
|
|
215
|
+
version,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
220
|
+
return {
|
|
221
|
+
success: false,
|
|
222
|
+
message: chalk.red('❌ Failed to install Git\n\n') +
|
|
223
|
+
chalk.dim('Error: ') +
|
|
224
|
+
errorMsg +
|
|
225
|
+
'\n\n' +
|
|
226
|
+
chalk.dim('Please install Git manually from: ') +
|
|
227
|
+
chalk.cyan('https://git-scm.com/download/linux'),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Install Git on the current platform
|
|
233
|
+
* Auto-detects platform and uses appropriate package manager
|
|
234
|
+
*/
|
|
235
|
+
export async function installGit() {
|
|
236
|
+
const platform = process.platform;
|
|
237
|
+
switch (platform) {
|
|
238
|
+
case 'darwin':
|
|
239
|
+
return installGitMacOS();
|
|
240
|
+
case 'win32':
|
|
241
|
+
return installGitWindows();
|
|
242
|
+
case 'linux':
|
|
243
|
+
return installGitLinux();
|
|
244
|
+
default:
|
|
245
|
+
return {
|
|
246
|
+
success: false,
|
|
247
|
+
message: chalk.red(`❌ Unsupported platform: ${platform}\n\n`) +
|
|
248
|
+
chalk.dim('Please install Git manually from: ') +
|
|
249
|
+
chalk.cyan('https://git-scm.com/downloads'),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Get manual installation instructions for the current platform
|
|
255
|
+
*/
|
|
256
|
+
export function getManualInstallInstructions() {
|
|
257
|
+
const platform = process.platform;
|
|
258
|
+
switch (platform) {
|
|
259
|
+
case 'darwin':
|
|
260
|
+
return (chalk.yellow('📖 Manual Git Installation (macOS)\n\n') +
|
|
261
|
+
chalk.dim('Option 1 - Xcode Command Line Tools (recommended):\n') +
|
|
262
|
+
chalk.cyan(' xcode-select --install\n\n') +
|
|
263
|
+
chalk.dim('Option 2 - Homebrew (if you use package managers):\n') +
|
|
264
|
+
chalk.cyan(' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n') +
|
|
265
|
+
chalk.cyan(' brew install git\n\n') +
|
|
266
|
+
chalk.dim('Option 3 - Official installer:\n') +
|
|
267
|
+
chalk.cyan(' Download from: https://git-scm.com/download/mac'));
|
|
268
|
+
case 'win32':
|
|
269
|
+
return (chalk.yellow('📖 Manual Git Installation (Windows)\n\n') +
|
|
270
|
+
chalk.dim('Option 1 - winget (Windows 10+):\n') +
|
|
271
|
+
chalk.cyan(' winget install --id Git.Git -e --source winget\n\n') +
|
|
272
|
+
chalk.dim('Option 2 - Official installer:\n') +
|
|
273
|
+
chalk.cyan(' Download from: https://git-scm.com/download/win'));
|
|
274
|
+
case 'linux':
|
|
275
|
+
return (chalk.yellow('📖 Manual Git Installation (Linux)\n\n') +
|
|
276
|
+
chalk.dim('Debian/Ubuntu:\n') +
|
|
277
|
+
chalk.cyan(' sudo apt-get update && sudo apt-get install -y git\n\n') +
|
|
278
|
+
chalk.dim('Fedora/RHEL:\n') +
|
|
279
|
+
chalk.cyan(' sudo dnf install -y git\n\n') +
|
|
280
|
+
chalk.dim('Arch Linux:\n') +
|
|
281
|
+
chalk.cyan(' sudo pacman -S git\n\n') +
|
|
282
|
+
chalk.dim('Or download from: ') +
|
|
283
|
+
chalk.cyan('https://git-scm.com/download/linux'));
|
|
284
|
+
default:
|
|
285
|
+
return (chalk.yellow('📖 Manual Git Installation\n\n') +
|
|
286
|
+
chalk.dim('Download from: ') +
|
|
287
|
+
chalk.cyan('https://git-scm.com/downloads'));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=git-installer.js.map
|