droid-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +268 -0
- package/dist/commands/build.d.ts +12 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +375 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/device.d.ts +2 -0
- package/dist/commands/device.d.ts.map +1 -0
- package/dist/commands/device.js +177 -0
- package/dist/commands/device.js.map +1 -0
- package/dist/commands/gradle.d.ts +11 -0
- package/dist/commands/gradle.d.ts.map +1 -0
- package/dist/commands/gradle.js +147 -0
- package/dist/commands/gradle.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +231 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logcat.d.ts +6 -0
- package/dist/commands/logcat.d.ts.map +1 -0
- package/dist/commands/logcat.js +131 -0
- package/dist/commands/logcat.js.map +1 -0
- package/dist/commands/variant.d.ts +3 -0
- package/dist/commands/variant.d.ts.map +1 -0
- package/dist/commands/variant.js +77 -0
- package/dist/commands/variant.js.map +1 -0
- package/dist/config/config-manager.d.ts +33 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +219 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/schema.d.ts +21 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +41 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/adb.d.ts +48 -0
- package/dist/core/adb.d.ts.map +1 -0
- package/dist/core/adb.js +431 -0
- package/dist/core/adb.js.map +1 -0
- package/dist/core/android-project.d.ts +25 -0
- package/dist/core/android-project.d.ts.map +1 -0
- package/dist/core/android-project.js +155 -0
- package/dist/core/android-project.js.map +1 -0
- package/dist/core/gradle-wrapper.d.ts +21 -0
- package/dist/core/gradle-wrapper.d.ts.map +1 -0
- package/dist/core/gradle-wrapper.js +221 -0
- package/dist/core/gradle-wrapper.js.map +1 -0
- package/dist/core/terminal.d.ts +20 -0
- package/dist/core/terminal.d.ts.map +1 -0
- package/dist/core/terminal.js +186 -0
- package/dist/core/terminal.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/interactive-menu.d.ts +2 -0
- package/dist/ui/interactive-menu.d.ts.map +1 -0
- package/dist/ui/interactive-menu.js +272 -0
- package/dist/ui/interactive-menu.js.map +1 -0
- package/dist/ui/logger.d.ts +20 -0
- package/dist/ui/logger.d.ts.map +1 -0
- package/dist/ui/logger.js +59 -0
- package/dist/ui/logger.js.map +1 -0
- package/dist/utils/process.d.ts +53 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +62 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/validators.d.ts +11 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +84 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AndroidProject } from './android-project';
|
|
2
|
+
export interface GradleBuildResult {
|
|
3
|
+
success: boolean;
|
|
4
|
+
duration: number;
|
|
5
|
+
apkPath?: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class GradleWrapper {
|
|
9
|
+
private project;
|
|
10
|
+
private spinner;
|
|
11
|
+
constructor(project: AndroidProject);
|
|
12
|
+
build(variant?: string, showProgress?: boolean): Promise<GradleBuildResult>;
|
|
13
|
+
clean(): Promise<boolean>;
|
|
14
|
+
syncProject(): Promise<boolean>;
|
|
15
|
+
runTask(taskName: string, args?: string[]): Promise<boolean>;
|
|
16
|
+
getTasks(): Promise<string[]>;
|
|
17
|
+
private parseTasksList;
|
|
18
|
+
getProjectDependencies(): Promise<string[]>;
|
|
19
|
+
private parseDependencies;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=gradle-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradle-wrapper.d.ts","sourceRoot":"","sources":["../../src/core/gradle-wrapper.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,cAAc;IAI7B,KAAK,CAAC,OAAO,GAAE,MAAgB,EAAE,YAAY,GAAE,OAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAoE1F,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAiCzB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAiC/B,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAuChE,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAyBnC,OAAO,CAAC,cAAc;IAoBhB,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAyBjD,OAAO,CAAC,iBAAiB;CAgB1B"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GradleWrapper = void 0;
|
|
7
|
+
const process_1 = require("../utils/process");
|
|
8
|
+
const logger_1 = require("../ui/logger");
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
class GradleWrapper {
|
|
11
|
+
constructor(project) {
|
|
12
|
+
this.spinner = (0, ora_1.default)();
|
|
13
|
+
this.project = project;
|
|
14
|
+
}
|
|
15
|
+
async build(variant = 'debug', showProgress = true) {
|
|
16
|
+
const startTime = Date.now();
|
|
17
|
+
if (showProgress) {
|
|
18
|
+
this.spinner.start(`Building ${variant} variant...`);
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const gradleCommand = this.project.getGradleCommand();
|
|
22
|
+
const taskName = `assemble${variant.charAt(0).toUpperCase() + variant.slice(1)}`;
|
|
23
|
+
logger_1.Logger.build(`Running: ${gradleCommand} ${taskName}`);
|
|
24
|
+
const result = await process_1.ProcessManager.run(gradleCommand, [taskName, '--build-cache', '--daemon'], {
|
|
25
|
+
cwd: this.project.getRootPath(),
|
|
26
|
+
stdio: showProgress ? 'pipe' : 'inherit',
|
|
27
|
+
});
|
|
28
|
+
const duration = Date.now() - startTime;
|
|
29
|
+
if (result.success) {
|
|
30
|
+
const apkPath = await this.project.getApkPath(variant);
|
|
31
|
+
if (showProgress) {
|
|
32
|
+
this.spinner.succeed(`Build completed in ${(duration / 1000).toFixed(1)}s`);
|
|
33
|
+
}
|
|
34
|
+
logger_1.Logger.success(`Build successful! APK: ${apkPath}`);
|
|
35
|
+
return {
|
|
36
|
+
success: true,
|
|
37
|
+
duration,
|
|
38
|
+
apkPath,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
if (showProgress) {
|
|
43
|
+
this.spinner.fail('Build failed');
|
|
44
|
+
}
|
|
45
|
+
logger_1.Logger.error('Build failed:', result.stderr);
|
|
46
|
+
return {
|
|
47
|
+
success: false,
|
|
48
|
+
duration,
|
|
49
|
+
error: result.stderr,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const duration = Date.now() - startTime;
|
|
55
|
+
if (showProgress) {
|
|
56
|
+
this.spinner.fail('Build failed');
|
|
57
|
+
}
|
|
58
|
+
logger_1.Logger.error('Build error:', error);
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
duration,
|
|
62
|
+
error: error instanceof Error ? error.message : String(error),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async clean() {
|
|
67
|
+
this.spinner.start('Cleaning project...');
|
|
68
|
+
try {
|
|
69
|
+
const gradleCommand = this.project.getGradleCommand();
|
|
70
|
+
logger_1.Logger.gradle('Running clean task...');
|
|
71
|
+
const result = await process_1.ProcessManager.run(gradleCommand, ['clean'], {
|
|
72
|
+
cwd: this.project.getRootPath(),
|
|
73
|
+
stdio: 'pipe',
|
|
74
|
+
});
|
|
75
|
+
if (result.success) {
|
|
76
|
+
this.spinner.succeed('Clean completed');
|
|
77
|
+
logger_1.Logger.success('Project cleaned successfully');
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this.spinner.fail('Clean failed');
|
|
82
|
+
logger_1.Logger.error('Clean failed:', result.stderr);
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
this.spinner.fail('Clean failed');
|
|
88
|
+
logger_1.Logger.error('Clean error:', error);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async syncProject() {
|
|
93
|
+
this.spinner.start('Syncing Gradle files...');
|
|
94
|
+
try {
|
|
95
|
+
const gradleCommand = this.project.getGradleCommand();
|
|
96
|
+
logger_1.Logger.gradle('Syncing project dependencies...');
|
|
97
|
+
const result = await process_1.ProcessManager.run(gradleCommand, ['build', '--dry-run'], {
|
|
98
|
+
cwd: this.project.getRootPath(),
|
|
99
|
+
stdio: 'pipe',
|
|
100
|
+
});
|
|
101
|
+
if (result.success) {
|
|
102
|
+
this.spinner.succeed('Gradle sync completed');
|
|
103
|
+
logger_1.Logger.success('Project synced successfully');
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
this.spinner.fail('Gradle sync failed');
|
|
108
|
+
logger_1.Logger.error('Sync failed:', result.stderr);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
this.spinner.fail('Gradle sync failed');
|
|
114
|
+
logger_1.Logger.error('Sync error:', error);
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async runTask(taskName, args = []) {
|
|
119
|
+
this.spinner.start(`Running Gradle task: ${taskName}...`);
|
|
120
|
+
try {
|
|
121
|
+
const gradleCommand = this.project.getGradleCommand();
|
|
122
|
+
const allArgs = [taskName, ...args];
|
|
123
|
+
logger_1.Logger.gradle(`Running: ${gradleCommand} ${allArgs.join(' ')}`);
|
|
124
|
+
const result = await process_1.ProcessManager.run(gradleCommand, allArgs, {
|
|
125
|
+
cwd: this.project.getRootPath(),
|
|
126
|
+
stdio: 'pipe',
|
|
127
|
+
});
|
|
128
|
+
if (result.success) {
|
|
129
|
+
this.spinner.succeed(`Task ${taskName} completed`);
|
|
130
|
+
logger_1.Logger.success(`Task ${taskName} completed successfully`);
|
|
131
|
+
if (result.stdout) {
|
|
132
|
+
console.log(result.stdout);
|
|
133
|
+
}
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.spinner.fail(`Task ${taskName} failed`);
|
|
138
|
+
logger_1.Logger.error(`Task ${taskName} failed:`, result.stderr);
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
this.spinner.fail(`Task ${taskName} failed`);
|
|
144
|
+
logger_1.Logger.error(`Task ${taskName} error:`, error);
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async getTasks() {
|
|
149
|
+
try {
|
|
150
|
+
const gradleCommand = this.project.getGradleCommand();
|
|
151
|
+
const result = await process_1.ProcessManager.run(gradleCommand, ['tasks', '--all'], {
|
|
152
|
+
cwd: this.project.getRootPath(),
|
|
153
|
+
stdio: 'pipe',
|
|
154
|
+
});
|
|
155
|
+
if (result.success) {
|
|
156
|
+
return this.parseTasksList(result.stdout);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
logger_1.Logger.error('Failed to get tasks:', result.stderr);
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
logger_1.Logger.error('Error getting tasks:', error);
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
parseTasksList(output) {
|
|
169
|
+
const tasks = [];
|
|
170
|
+
const lines = output.split('\n');
|
|
171
|
+
for (const line of lines) {
|
|
172
|
+
const trimmed = line.trim();
|
|
173
|
+
if (trimmed && !trimmed.startsWith('-') && !trimmed.includes('Rule based tasks:')) {
|
|
174
|
+
const taskMatch = trimmed.match(/^(\w+)/);
|
|
175
|
+
if (taskMatch) {
|
|
176
|
+
const taskName = taskMatch[1];
|
|
177
|
+
if (!tasks.includes(taskName) && taskName !== 'tasks') {
|
|
178
|
+
tasks.push(taskName);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return tasks.sort();
|
|
184
|
+
}
|
|
185
|
+
async getProjectDependencies() {
|
|
186
|
+
try {
|
|
187
|
+
const gradleCommand = this.project.getGradleCommand();
|
|
188
|
+
const result = await process_1.ProcessManager.run(gradleCommand, ['dependencies'], {
|
|
189
|
+
cwd: this.project.getRootPath(),
|
|
190
|
+
stdio: 'pipe',
|
|
191
|
+
});
|
|
192
|
+
if (result.success) {
|
|
193
|
+
return this.parseDependencies(result.stdout);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
logger_1.Logger.error('Failed to get dependencies:', result.stderr);
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
logger_1.Logger.error('Error getting dependencies:', error);
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
parseDependencies(output) {
|
|
206
|
+
const dependencies = [];
|
|
207
|
+
const lines = output.split('\n');
|
|
208
|
+
for (const line of lines) {
|
|
209
|
+
const dependencyMatch = line.match(/[\+\\`]-+ (.+):(.+):(.+)/);
|
|
210
|
+
if (dependencyMatch) {
|
|
211
|
+
const dependency = `${dependencyMatch[1]}:${dependencyMatch[2]}:${dependencyMatch[3]}`;
|
|
212
|
+
if (!dependencies.includes(dependency)) {
|
|
213
|
+
dependencies.push(dependency);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return dependencies.sort();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
exports.GradleWrapper = GradleWrapper;
|
|
221
|
+
//# sourceMappingURL=gradle-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradle-wrapper.js","sourceRoot":"","sources":["../../src/core/gradle-wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type TerminalType = 'auto' | 'iterm2' | 'terminal' | 'gnome-terminal' | 'konsole' | 'xterm' | 'wt';
|
|
2
|
+
export declare class TerminalManager {
|
|
3
|
+
private static supportedTerminals;
|
|
4
|
+
static detectTerminal(): Promise<TerminalType | null>;
|
|
5
|
+
static isTerminalAvailable(terminal: TerminalType): Promise<boolean>;
|
|
6
|
+
static spawnTerminal(command: string, args?: string[], options?: {
|
|
7
|
+
title?: string;
|
|
8
|
+
workingDirectory?: string;
|
|
9
|
+
terminal?: TerminalType;
|
|
10
|
+
}): Promise<boolean>;
|
|
11
|
+
private static spawnITerm2;
|
|
12
|
+
private static spawnTerminalApp;
|
|
13
|
+
private static spawnGnomeTerminal;
|
|
14
|
+
private static spawnKonsole;
|
|
15
|
+
private static spawnXterm;
|
|
16
|
+
private static spawnWindowsTerminal;
|
|
17
|
+
static getAvailableTerminals(): Promise<TerminalType[]>;
|
|
18
|
+
private static escapeShellArg;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/core/terminal.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;AAE1G,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAI/B;WAEW,cAAc,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;WAe9C,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;WAmB7D,aAAa,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,YAAY,CAAC;KACpB,GACL,OAAO,CAAC,OAAO,CAAC;mBAuCE,WAAW;mBAiBX,gBAAgB;mBAahB,kBAAkB;mBASlB,YAAY;mBASZ,UAAU;mBAQV,oBAAoB;IASzC,MAAM,CAAC,qBAAqB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAYvD,OAAO,CAAC,MAAM,CAAC,cAAc;CAQ9B"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.TerminalManager = void 0;
|
|
37
|
+
const process_1 = require("../utils/process");
|
|
38
|
+
const logger_1 = require("../ui/logger");
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
class TerminalManager {
|
|
41
|
+
static async detectTerminal() {
|
|
42
|
+
const platform = os.platform();
|
|
43
|
+
const terminals = TerminalManager.supportedTerminals[platform] || [];
|
|
44
|
+
for (const terminal of terminals) {
|
|
45
|
+
if (await TerminalManager.isTerminalAvailable(terminal)) {
|
|
46
|
+
logger_1.Logger.debug(`Detected terminal: ${terminal}`);
|
|
47
|
+
return terminal;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
logger_1.Logger.debug('No supported terminal detected');
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
static async isTerminalAvailable(terminal) {
|
|
54
|
+
switch (terminal) {
|
|
55
|
+
case 'iterm2':
|
|
56
|
+
return await process_1.ProcessManager.checkCommand('osascript');
|
|
57
|
+
case 'terminal':
|
|
58
|
+
return os.platform() === 'darwin';
|
|
59
|
+
case 'gnome-terminal':
|
|
60
|
+
return await process_1.ProcessManager.checkCommand('gnome-terminal');
|
|
61
|
+
case 'konsole':
|
|
62
|
+
return await process_1.ProcessManager.checkCommand('konsole');
|
|
63
|
+
case 'xterm':
|
|
64
|
+
return await process_1.ProcessManager.checkCommand('xterm');
|
|
65
|
+
case 'wt':
|
|
66
|
+
return await process_1.ProcessManager.checkCommand('wt');
|
|
67
|
+
default:
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
static async spawnTerminal(command, args = [], options = {}) {
|
|
72
|
+
const terminal = options.terminal || await TerminalManager.detectTerminal();
|
|
73
|
+
if (!terminal) {
|
|
74
|
+
logger_1.Logger.error('No supported terminal found');
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const title = options.title || 'Android CLI';
|
|
78
|
+
const workingDirectory = options.workingDirectory || process.cwd();
|
|
79
|
+
const escapedArgs = args.map(arg => TerminalManager.escapeShellArg(arg));
|
|
80
|
+
const fullCommand = `${command} ${escapedArgs.join(' ')}`;
|
|
81
|
+
logger_1.Logger.debug(`Spawning terminal: ${terminal}, command: ${fullCommand}`);
|
|
82
|
+
try {
|
|
83
|
+
switch (terminal) {
|
|
84
|
+
case 'iterm2':
|
|
85
|
+
return await TerminalManager.spawnITerm2(fullCommand, title, workingDirectory);
|
|
86
|
+
case 'terminal':
|
|
87
|
+
return await TerminalManager.spawnTerminalApp(fullCommand, title, workingDirectory);
|
|
88
|
+
case 'gnome-terminal':
|
|
89
|
+
return await TerminalManager.spawnGnomeTerminal(fullCommand, title, workingDirectory);
|
|
90
|
+
case 'konsole':
|
|
91
|
+
return await TerminalManager.spawnKonsole(fullCommand, title, workingDirectory);
|
|
92
|
+
case 'xterm':
|
|
93
|
+
return await TerminalManager.spawnXterm(fullCommand, title, workingDirectory);
|
|
94
|
+
case 'wt':
|
|
95
|
+
return await TerminalManager.spawnWindowsTerminal(fullCommand, title, workingDirectory);
|
|
96
|
+
default:
|
|
97
|
+
logger_1.Logger.error(`Unsupported terminal: ${terminal}`);
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
logger_1.Logger.error(`Failed to spawn terminal: ${error}`);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
static async spawnITerm2(command, title, workingDirectory) {
|
|
107
|
+
const appleScript = `
|
|
108
|
+
tell application "iTerm"
|
|
109
|
+
create window with default profile
|
|
110
|
+
tell current session of current window
|
|
111
|
+
set name to "${title}"
|
|
112
|
+
write text "cd '${workingDirectory}'"
|
|
113
|
+
write text "${command}"
|
|
114
|
+
end tell
|
|
115
|
+
activate
|
|
116
|
+
end tell
|
|
117
|
+
`;
|
|
118
|
+
const result = await process_1.ProcessManager.run('osascript', ['-e', appleScript]);
|
|
119
|
+
return result.success;
|
|
120
|
+
}
|
|
121
|
+
static async spawnTerminalApp(command, title, workingDirectory) {
|
|
122
|
+
const appleScript = `
|
|
123
|
+
tell application "Terminal"
|
|
124
|
+
do script "cd '${workingDirectory}' && ${command}"
|
|
125
|
+
set custom title of front window to "${title}"
|
|
126
|
+
activate
|
|
127
|
+
end tell
|
|
128
|
+
`;
|
|
129
|
+
const result = await process_1.ProcessManager.run('osascript', ['-e', appleScript]);
|
|
130
|
+
return result.success;
|
|
131
|
+
}
|
|
132
|
+
static async spawnGnomeTerminal(command, title, workingDirectory) {
|
|
133
|
+
const result = await process_1.ProcessManager.run('gnome-terminal', [
|
|
134
|
+
'--title', title,
|
|
135
|
+
'--working-directory', workingDirectory,
|
|
136
|
+
'--', 'bash', '-c', `${command}; exec bash`
|
|
137
|
+
]);
|
|
138
|
+
return result.success;
|
|
139
|
+
}
|
|
140
|
+
static async spawnKonsole(command, title, workingDirectory) {
|
|
141
|
+
const result = await process_1.ProcessManager.run('konsole', [
|
|
142
|
+
'--title', title,
|
|
143
|
+
'--workdir', workingDirectory,
|
|
144
|
+
'-e', 'bash', '-c', `${command}; exec bash`
|
|
145
|
+
]);
|
|
146
|
+
return result.success;
|
|
147
|
+
}
|
|
148
|
+
static async spawnXterm(command, title, workingDirectory) {
|
|
149
|
+
const result = await process_1.ProcessManager.run('xterm', [
|
|
150
|
+
'-title', title,
|
|
151
|
+
'-e', 'bash', '-c', `cd '${workingDirectory}' && ${command}; exec bash`
|
|
152
|
+
]);
|
|
153
|
+
return result.success;
|
|
154
|
+
}
|
|
155
|
+
static async spawnWindowsTerminal(command, title, workingDirectory) {
|
|
156
|
+
const result = await process_1.ProcessManager.run('wt', [
|
|
157
|
+
'--title', title,
|
|
158
|
+
'--startingDirectory', workingDirectory,
|
|
159
|
+
'cmd', '/c', command
|
|
160
|
+
]);
|
|
161
|
+
return result.success;
|
|
162
|
+
}
|
|
163
|
+
static getAvailableTerminals() {
|
|
164
|
+
const platform = os.platform();
|
|
165
|
+
const terminals = TerminalManager.supportedTerminals[platform] || [];
|
|
166
|
+
return Promise.all(terminals.map(async (terminal) => {
|
|
167
|
+
const available = await TerminalManager.isTerminalAvailable(terminal);
|
|
168
|
+
return available ? terminal : null;
|
|
169
|
+
})).then(results => results.filter((t) => t !== null));
|
|
170
|
+
}
|
|
171
|
+
static escapeShellArg(arg) {
|
|
172
|
+
// If the argument contains special shell characters, quote it
|
|
173
|
+
if (/[*?\s'"$`\\|&;<>(){}[\]]/.test(arg)) {
|
|
174
|
+
// Use single quotes and escape any single quotes within the argument
|
|
175
|
+
return `'${arg.replace(/'/g, "'\"'\"'")}'`;
|
|
176
|
+
}
|
|
177
|
+
return arg;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
exports.TerminalManager = TerminalManager;
|
|
181
|
+
TerminalManager.supportedTerminals = {
|
|
182
|
+
darwin: ['iterm2', 'terminal'],
|
|
183
|
+
linux: ['gnome-terminal', 'konsole', 'xterm'],
|
|
184
|
+
win32: ['wt'], // Windows Terminal
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/core/terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const interactive_menu_1 = require("./ui/interactive-menu");
|
|
44
|
+
const build_1 = require("./commands/build");
|
|
45
|
+
const device_1 = require("./commands/device");
|
|
46
|
+
const logcat_1 = require("./commands/logcat");
|
|
47
|
+
const gradle_1 = require("./commands/gradle");
|
|
48
|
+
const init_1 = require("./commands/init");
|
|
49
|
+
const variant_1 = require("./commands/variant");
|
|
50
|
+
const config_manager_1 = require("./config/config-manager");
|
|
51
|
+
const program = new commander_1.Command();
|
|
52
|
+
program
|
|
53
|
+
.name('droid-cli')
|
|
54
|
+
.description('Interactive CLI for Android development')
|
|
55
|
+
.version('1.0.0')
|
|
56
|
+
.option('-p, --project <path>', 'Path to Android project directory');
|
|
57
|
+
// Helper function to wrap command actions with project path handling
|
|
58
|
+
function wrapCommand(commandFn) {
|
|
59
|
+
return async (...args) => {
|
|
60
|
+
const globalOptions = program.opts();
|
|
61
|
+
if (globalOptions.project) {
|
|
62
|
+
const projectPath = path.resolve(globalOptions.project);
|
|
63
|
+
// Validate project path exists
|
|
64
|
+
try {
|
|
65
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
|
|
66
|
+
if (!(await fs.pathExists(projectPath))) {
|
|
67
|
+
console.error(chalk_1.default.red(`Error: Project path does not exist: ${projectPath}`));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
if (!(await fs.stat(projectPath)).isDirectory()) {
|
|
71
|
+
console.error(chalk_1.default.red(`Error: Project path is not a directory: ${projectPath}`));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error(chalk_1.default.red(`Error: Cannot access project path: ${projectPath}`));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
// Initialize config manager with the specified project path
|
|
80
|
+
config_manager_1.ConfigManager.getInstance(projectPath);
|
|
81
|
+
// Change working directory context for relative paths to work
|
|
82
|
+
process.chdir(projectPath);
|
|
83
|
+
}
|
|
84
|
+
const result = await commandFn(...args);
|
|
85
|
+
// Handle BuildResult specifically for build command
|
|
86
|
+
if (result && typeof result === 'object' && 'success' in result) {
|
|
87
|
+
if (!result.success) {
|
|
88
|
+
console.error(chalk_1.default.red(`Command failed: ${result.error || 'Unknown error'}`));
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
program
|
|
95
|
+
.command('build')
|
|
96
|
+
.description('Build and run the Android app')
|
|
97
|
+
.option('-v, --variant <variant>', 'Build variant (debug/release)', 'debug')
|
|
98
|
+
.option('-d, --device <device>', 'Target device ID')
|
|
99
|
+
.action(wrapCommand(build_1.buildCommand));
|
|
100
|
+
program
|
|
101
|
+
.command('device')
|
|
102
|
+
.description('Select target device')
|
|
103
|
+
.action(wrapCommand(device_1.deviceCommand));
|
|
104
|
+
program
|
|
105
|
+
.command('logcat')
|
|
106
|
+
.description('Open logcat for the app')
|
|
107
|
+
.option('-d, --device <device>', 'Target device ID')
|
|
108
|
+
.action(wrapCommand(logcat_1.logcatCommand));
|
|
109
|
+
program
|
|
110
|
+
.command('gradle')
|
|
111
|
+
.description('Run gradle task')
|
|
112
|
+
.argument('<task>', 'Gradle task to run')
|
|
113
|
+
.option('-a, --args <args>', 'Additional gradle arguments')
|
|
114
|
+
.action(wrapCommand(gradle_1.gradleCommand));
|
|
115
|
+
program
|
|
116
|
+
.command('init')
|
|
117
|
+
.description('Initialize droid-cli configuration')
|
|
118
|
+
.action(wrapCommand(init_1.initCommand));
|
|
119
|
+
program
|
|
120
|
+
.command('variant')
|
|
121
|
+
.description('Select default build variant')
|
|
122
|
+
.action(wrapCommand(variant_1.variantCommand));
|
|
123
|
+
// If no command is provided, start interactive mode
|
|
124
|
+
async function startInteractiveMode() {
|
|
125
|
+
// Handle project path for interactive mode
|
|
126
|
+
const projectIndex = process.argv.indexOf('--project') !== -1 ? process.argv.indexOf('--project') : process.argv.indexOf('-p');
|
|
127
|
+
if (projectIndex !== -1 && process.argv[projectIndex + 1]) {
|
|
128
|
+
const projectPath = path.resolve(process.argv[projectIndex + 1]);
|
|
129
|
+
// Validate project path exists
|
|
130
|
+
try {
|
|
131
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
|
|
132
|
+
if (!(await fs.pathExists(projectPath))) {
|
|
133
|
+
console.error(chalk_1.default.red(`Error: Project path does not exist: ${projectPath}`));
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
if (!(await fs.stat(projectPath)).isDirectory()) {
|
|
137
|
+
console.error(chalk_1.default.red(`Error: Project path is not a directory: ${projectPath}`));
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
console.error(chalk_1.default.red(`Error: Cannot access project path: ${projectPath}`));
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
config_manager_1.ConfigManager.getInstance(projectPath);
|
|
146
|
+
process.chdir(projectPath);
|
|
147
|
+
}
|
|
148
|
+
console.log(chalk_1.default.cyan('🤖 Welcome to Android Interactive CLI'));
|
|
149
|
+
await (0, interactive_menu_1.interactiveMenu)();
|
|
150
|
+
}
|
|
151
|
+
if (process.argv.length <= 2 || (process.argv.length === 4 && (process.argv[2] === '--project' || process.argv[2] === '-p'))) {
|
|
152
|
+
startInteractiveMode();
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
program.parse();
|
|
156
|
+
}
|
|
157
|
+
// Handle unhandled promise rejections
|
|
158
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
159
|
+
console.error(chalk_1.default.red('Unhandled Rejection at:'), promise, 'reason:', reason);
|
|
160
|
+
process.exit(1);
|
|
161
|
+
});
|
|
162
|
+
// Handle uncaught exceptions
|
|
163
|
+
process.on('uncaughtException', (error) => {
|
|
164
|
+
console.error(chalk_1.default.red('Uncaught Exception:'), error);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
});
|
|
167
|
+
//# sourceMappingURL=index.js.map
|