@braingrid/cli 0.1.1 → 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/README.md +13 -15
- package/dist/cli.js +1 -2
- package/dist/cli.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 +477 -39
- package/dist/handlers/init.handlers.js.map +1 -1
- package/dist/handlers/status.handlers.js +6 -6
- package/dist/handlers/status.handlers.js.map +1 -1
- 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 -0
- 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/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/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/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/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/package.json +1 -1
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-installer.js","sourceRoot":"","sources":["../../src/utils/git-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Repository Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to automate GitHub repository creation and setup using GitHub CLI.
|
|
5
|
+
* Falls back to manual instructions when automation is not available.
|
|
6
|
+
*/
|
|
7
|
+
export interface RepoInfo {
|
|
8
|
+
owner: string;
|
|
9
|
+
name: string;
|
|
10
|
+
url: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Initialize a git repository in the current directory
|
|
14
|
+
*/
|
|
15
|
+
export declare function initGitRepo(): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if GitHub CLI is authenticated
|
|
18
|
+
*/
|
|
19
|
+
export declare function isGhAuthenticated(): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Get the current directory name (for suggesting repository name)
|
|
22
|
+
*/
|
|
23
|
+
export declare function getCurrentDirectoryName(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Create a GitHub repository using GitHub CLI
|
|
26
|
+
*
|
|
27
|
+
* @param name - Repository name
|
|
28
|
+
* @param isPrivate - Whether the repository should be private
|
|
29
|
+
* @returns Repository information or null if failed
|
|
30
|
+
*/
|
|
31
|
+
export declare function createGitHubRepoWithGh(name: string, isPrivate: boolean): Promise<RepoInfo | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Get repository information from git remote
|
|
34
|
+
*
|
|
35
|
+
* @returns Repository info or null if not found
|
|
36
|
+
*/
|
|
37
|
+
export declare function getRepoInfoFromGit(): Promise<RepoInfo | null>;
|
|
38
|
+
/**
|
|
39
|
+
* Check if we can use GitHub CLI automation
|
|
40
|
+
* (both GitHub CLI installed and authenticated)
|
|
41
|
+
*/
|
|
42
|
+
export declare function canUseGhAutomation(): Promise<boolean>;
|
|
43
|
+
//# sourceMappingURL=github-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-repo.d.ts","sourceRoot":"","sources":["../../src/utils/github-repo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO1D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC3C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,OAAO,GAChB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyB1B;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA4BnE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS3D"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Repository Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to automate GitHub repository creation and setup using GitHub CLI.
|
|
5
|
+
* Falls back to manual instructions when automation is not available.
|
|
6
|
+
*/
|
|
7
|
+
import { exec } from 'child_process';
|
|
8
|
+
import { promisify } from 'util';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
/**
|
|
12
|
+
* Initialize a git repository in the current directory
|
|
13
|
+
*/
|
|
14
|
+
export async function initGitRepo() {
|
|
15
|
+
try {
|
|
16
|
+
await execAsync('git init');
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if GitHub CLI is authenticated
|
|
25
|
+
*/
|
|
26
|
+
export async function isGhAuthenticated() {
|
|
27
|
+
try {
|
|
28
|
+
await execAsync('gh auth status');
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get the current directory name (for suggesting repository name)
|
|
37
|
+
*/
|
|
38
|
+
export function getCurrentDirectoryName() {
|
|
39
|
+
return path.basename(process.cwd());
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create a GitHub repository using GitHub CLI
|
|
43
|
+
*
|
|
44
|
+
* @param name - Repository name
|
|
45
|
+
* @param isPrivate - Whether the repository should be private
|
|
46
|
+
* @returns Repository information or null if failed
|
|
47
|
+
*/
|
|
48
|
+
export async function createGitHubRepoWithGh(name, isPrivate) {
|
|
49
|
+
try {
|
|
50
|
+
const visibility = isPrivate ? '--private' : '--public';
|
|
51
|
+
// Create repository with gh CLI
|
|
52
|
+
// --source=. creates repo from current directory and adds remote
|
|
53
|
+
const { stdout } = await execAsync(`gh repo create ${name} ${visibility} --source=. --remote=origin`, { timeout: 60000 });
|
|
54
|
+
// Parse the repository URL from output
|
|
55
|
+
const urlMatch = stdout.match(/https:\/\/github\.com\/([^/]+)\/([^/\s]+)/);
|
|
56
|
+
if (!urlMatch) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
owner: urlMatch[1],
|
|
61
|
+
name: urlMatch[2],
|
|
62
|
+
url: urlMatch[0],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get repository information from git remote
|
|
71
|
+
*
|
|
72
|
+
* @returns Repository info or null if not found
|
|
73
|
+
*/
|
|
74
|
+
export async function getRepoInfoFromGit() {
|
|
75
|
+
try {
|
|
76
|
+
const { stdout } = await execAsync('git config --get remote.origin.url');
|
|
77
|
+
const url = stdout.trim();
|
|
78
|
+
// Parse GitHub URL
|
|
79
|
+
const httpsMatch = url.match(/https?:\/\/github\.com\/([^/]+)\/([^/]+?)(\.git)?$/);
|
|
80
|
+
if (httpsMatch) {
|
|
81
|
+
return {
|
|
82
|
+
owner: httpsMatch[1],
|
|
83
|
+
name: httpsMatch[2],
|
|
84
|
+
url: `https://github.com/${httpsMatch[1]}/${httpsMatch[2]}`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const sshMatch = url.match(/git@github\.com:([^/]+)\/([^/]+?)(\.git)?$/);
|
|
88
|
+
if (sshMatch) {
|
|
89
|
+
return {
|
|
90
|
+
owner: sshMatch[1],
|
|
91
|
+
name: sshMatch[2],
|
|
92
|
+
url: `https://github.com/${sshMatch[1]}/${sshMatch[2]}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Check if we can use GitHub CLI automation
|
|
103
|
+
* (both GitHub CLI installed and authenticated)
|
|
104
|
+
*/
|
|
105
|
+
export async function canUseGhAutomation() {
|
|
106
|
+
const { isGhInstalled } = await import('./gh-installer.js');
|
|
107
|
+
const ghInstalled = await isGhInstalled();
|
|
108
|
+
if (!ghInstalled) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
return isGhAuthenticated();
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=github-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-repo.js","sourceRoot":"","sources":["../../src/utils/github-repo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAQlC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAChC,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACtC,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,IAAY,EACZ,SAAkB;IAElB,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;QAExD,gCAAgC;QAChC,iEAAiE;QACjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CACjC,kBAAkB,IAAI,IAAI,UAAU,6BAA6B,EACjE,EAAE,OAAO,EAAE,KAAK,EAAE,CAClB,CAAC;QAEF,uCAAuC;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACb,CAAC;QAED,OAAO;YACN,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAClB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YACjB,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;SAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACvC,IAAI,CAAC;QACJ,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAE1B,mBAAmB;QACnB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACnF,IAAI,UAAU,EAAE,CAAC;YAChB,OAAO;gBACN,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;gBACpB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;gBACnB,GAAG,EAAE,sBAAsB,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE;aAC3D,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACzE,IAAI,QAAQ,EAAE,CAAC;YACd,OAAO;gBACN,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAClB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACjB,GAAG,EAAE,sBAAsB,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE;aACvD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACvC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,MAAM,aAAa,EAAE,CAAC;IAE1C,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,iBAAiB,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package Manager Detection Utilities
|
|
3
|
+
*
|
|
4
|
+
* Detects package managers on different platforms:
|
|
5
|
+
* - Homebrew on macOS
|
|
6
|
+
* - winget on Windows (typically pre-installed on Windows 10+)
|
|
7
|
+
* - apt/dnf/pacman on Linux
|
|
8
|
+
*/
|
|
9
|
+
export interface PackageManagerInfo {
|
|
10
|
+
name: string;
|
|
11
|
+
command: string;
|
|
12
|
+
available: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if Homebrew is installed (macOS)
|
|
16
|
+
*/
|
|
17
|
+
export declare function isHomebrewInstalled(): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if winget is available (Windows)
|
|
20
|
+
* winget is pre-installed on Windows 10 (version 1809+) and Windows 11
|
|
21
|
+
*/
|
|
22
|
+
export declare function isWingetAvailable(): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* Detect available package manager on Linux
|
|
25
|
+
* Returns the first available package manager found
|
|
26
|
+
*/
|
|
27
|
+
export declare function detectLinuxPackageManager(): Promise<PackageManagerInfo | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Get the appropriate package manager for the current platform
|
|
30
|
+
*/
|
|
31
|
+
export declare function detectPackageManager(): Promise<{
|
|
32
|
+
platform: string;
|
|
33
|
+
packageManager: string | null;
|
|
34
|
+
available: boolean;
|
|
35
|
+
}>;
|
|
36
|
+
//# sourceMappingURL=package-manager-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager-installer.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAW5D;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAW1D;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAsBpF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;CACnB,CAAC,CAsCD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package Manager Detection Utilities
|
|
3
|
+
*
|
|
4
|
+
* Detects package managers on different platforms:
|
|
5
|
+
* - Homebrew on macOS
|
|
6
|
+
* - winget on Windows (typically pre-installed on Windows 10+)
|
|
7
|
+
* - apt/dnf/pacman on Linux
|
|
8
|
+
*/
|
|
9
|
+
import { exec } from 'child_process';
|
|
10
|
+
import { promisify } from 'util';
|
|
11
|
+
const execAsync = promisify(exec);
|
|
12
|
+
/**
|
|
13
|
+
* Check if Homebrew is installed (macOS)
|
|
14
|
+
*/
|
|
15
|
+
export async function isHomebrewInstalled() {
|
|
16
|
+
if (process.platform !== 'darwin') {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
await execAsync('which brew', { timeout: 2000 });
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if winget is available (Windows)
|
|
29
|
+
* winget is pre-installed on Windows 10 (version 1809+) and Windows 11
|
|
30
|
+
*/
|
|
31
|
+
export async function isWingetAvailable() {
|
|
32
|
+
if (process.platform !== 'win32') {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
await execAsync('winget --version', { timeout: 2000 });
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Detect available package manager on Linux
|
|
45
|
+
* Returns the first available package manager found
|
|
46
|
+
*/
|
|
47
|
+
export async function detectLinuxPackageManager() {
|
|
48
|
+
if (process.platform !== 'linux') {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const packageManagers = [
|
|
52
|
+
{ name: 'apt', command: 'apt-get', available: false },
|
|
53
|
+
{ name: 'dnf', command: 'dnf', available: false },
|
|
54
|
+
{ name: 'yum', command: 'yum', available: false },
|
|
55
|
+
{ name: 'pacman', command: 'pacman', available: false },
|
|
56
|
+
];
|
|
57
|
+
for (const pm of packageManagers) {
|
|
58
|
+
try {
|
|
59
|
+
await execAsync(`which ${pm.command}`, { timeout: 2000 });
|
|
60
|
+
return { ...pm, available: true };
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Package manager not found, continue checking
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the appropriate package manager for the current platform
|
|
70
|
+
*/
|
|
71
|
+
export async function detectPackageManager() {
|
|
72
|
+
const platform = process.platform;
|
|
73
|
+
switch (platform) {
|
|
74
|
+
case 'darwin': {
|
|
75
|
+
const hasHomebrew = await isHomebrewInstalled();
|
|
76
|
+
return {
|
|
77
|
+
platform: 'macOS',
|
|
78
|
+
packageManager: 'brew',
|
|
79
|
+
available: hasHomebrew,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
case 'win32': {
|
|
83
|
+
const hasWinget = await isWingetAvailable();
|
|
84
|
+
return {
|
|
85
|
+
platform: 'Windows',
|
|
86
|
+
packageManager: 'winget',
|
|
87
|
+
available: hasWinget,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
case 'linux': {
|
|
91
|
+
const linuxPM = await detectLinuxPackageManager();
|
|
92
|
+
return {
|
|
93
|
+
platform: 'Linux',
|
|
94
|
+
packageManager: linuxPM?.name || null,
|
|
95
|
+
available: linuxPM !== null,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
default:
|
|
99
|
+
return {
|
|
100
|
+
platform: platform,
|
|
101
|
+
packageManager: null,
|
|
102
|
+
available: false,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=package-manager-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager-installer.js","sourceRoot":"","sources":["../../src/utils/package-manager-installer.ts"],"names":[],"mappings":"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"}
|