cleanyourandroid 0.0.0-stage → 1.0.1

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/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CleanYourAndroid Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md CHANGED
@@ -1,3 +1,171 @@
1
- # Temporary Holding Version
1
+ # CleanYourAndroid
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ <p align="center">
4
+ <img src="https://raw.githubusercontent.com/cleanyourandroid/cleanyourandroid/main/docs/assets/banner.png" alt="CleanYourAndroid Banner" width="800" />
5
+ </p>
6
+
7
+ <p align="center">
8
+ <strong>Production-Grade Android Debloating, Customization, and Device Management Toolkit</strong>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://www.npmjs.com/package/cleanyourandroid"><img src="https://img.shields.io/npm/v/cleanyourandroid.svg?style=flat-square&color=E50914" alt="npm version" /></a>
13
+ <a href="https://github.com/cleanyourandroid/cleanyourandroid/actions"><img src="https://img.shields.io/github/actions/workflow/status/cleanyourandroid/cleanyourandroid/ci.yml?branch=main&style=flat-square" alt="CI Status" /></a>
14
+ <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square" alt="License" /></a>
15
+ <a href="https://www.npmjs.com/package/cleanyourandroid"><img src="https://img.shields.io/npm/dm/cleanyourandroid?style=flat-square&color=black" alt="Downloads" /></a>
16
+ <a href="https://github.com/cleanyourandroid/cleanyourandroid/stargazers"><img src="https://img.shields.io/github/stars/cleanyourandroid/cleanyourandroid.svg?style=flat-square" alt="GitHub stars" /></a>
17
+ </p>
18
+
19
+ ---
20
+
21
+ ## ⚡ Overview
22
+
23
+ **CleanYourAndroid (`cya`)** gives everyday Android users complete control over their smartphones **without requiring root access**.
24
+
25
+ Inspired by the raw industrial elegance of **Nothing OS**, **Linear**, and **Material 3**, CleanYourAndroid lets you connect via **USB** or **Android 11+ Wireless Debugging** to safely inspect hardware sensors, remove OEM bloatware in user-space, tune fluid 0.25x–0.50x lightweight animation curves, adjust display densities, inspect live running processes, mirror screens, and audit your device for Android upgrades and Project Treble GSIs.
26
+
27
+ ---
28
+
29
+ ## 🌟 Key Features
30
+
31
+ ### 🔌 Universal ADB Connection Manager
32
+ - Auto-detects connected USB devices, unauthorized states, and Wi-Fi ADB devices.
33
+ - Connects to Wi-Fi ADB (`cya connect <host> [port]`).
34
+ - Supports **Android 11+ Wireless Debugging Pairing Codes** (`cya pair <host> <port> <code>`).
35
+ - Injection-safe execution using typed array arguments with `child_process.spawn`.
36
+ - Auto-detects local Android SDK platform-tools on Windows, macOS, and Linux without requiring manual PATH exports.
37
+
38
+ ### 🛡️ Evidence-Based Debloater Engine
39
+ - Curated bloatware profiles for **Samsung**, **Xiaomi / Redmi / POCO**, **OnePlus**, **Realme**, **Motorola**, **Google Pixel**, and **Nothing**.
40
+ - Safe non-root user-space isolation (`pm uninstall -k --user 0`).
41
+ - **Universal Safety Guard**: Hardcoded bootloop-protection locks critical Android core components (`SystemUI`, `Settings`, `Telephony`, `PackageInstaller`, `Play Services`).
42
+ - Dry-run simulation mode (`--dry-run`).
43
+ - Instant user-space reinstallation mechanism (`cmd package install-existing <package>`).
44
+
45
+ ### 🪶 Lightweight & Fluid Animations Engine
46
+ - Instant speed presets to eliminate perceived touch latency on 60Hz, 90Hz, and 120Hz displays:
47
+ - **`0.35x` Featherweight Fluid (Best Balance)**: Retains high-refresh-rate motion physics with near-zero latency.
48
+ - **`0.25x` Lightning Snappy**: Ultra-fast UI for older and budget devices.
49
+ - **`0.50x` Nothing OS Crisp**: Snappy, modern dot-matrix pacing.
50
+ - **`1.00x` Stock Android Default**: Standard manufacturer animation duration curves.
51
+ - Custom precision decimal scale slider.
52
+
53
+ ### 📲 OS Modernizer & Android Upgrade Hub
54
+ - Hardware capability diagnostics for **Project Treble**, **VNDK version**, and **A/B Partition Schemes**.
55
+ - **Generic System Image (GSI) target identification** (e.g. `arm64_bvN` for modern Android 15/16).
56
+ - Step-by-step guides for **Dynamic System Updates (DSU)**, bootloader unlocking, and official LineageOS custom ROMs.
57
+
58
+ ### 🖥️ Desktop Studio Dashboard
59
+ - Modern web dashboard built with **React 19**, **Vite**, and **Tailwind CSS**.
60
+ - **📸 Live Screen Mirroring & Capture**: Take instant high-res screenshots over ADB and inspect the phone's live display.
61
+ - **⚡ One-Click App Cache Trimmer**: Free up storage and RAM by clearing inactive app caches via ADB `trim-caches`.
62
+ - **📊 Real-Time Storage & RAM Diagnostics**: Inspect internal storage usage and active physical memory in real time.
63
+ - **⚡ Running Processes Inspector**: Monitor live system tasks, PID, user, `%CPU`, and `%MEM`.
64
+ - **🚀 Deep Settings Intent Launchers**: Remotely trigger Developer Options, Battery Saver, and Display settings directly on your phone screen.
65
+
66
+ ---
67
+
68
+ ## 🚀 Quick Start Guide
69
+
70
+ ### 1. Run Directly with NPX (No Installation Needed)
71
+ ```bash
72
+ npx cleanyourandroid
73
+ ```
74
+
75
+ ### 2. Global Installation
76
+ ```bash
77
+ # Using npm
78
+ npm install -g cleanyourandroid
79
+
80
+ # Using pnpm
81
+ pnpm add -g cleanyourandroid
82
+ ```
83
+
84
+ ---
85
+
86
+ ## 📱 Connecting Your Phone
87
+
88
+ ### Method A: USB Cable (Easiest)
89
+ 1. On your phone, go to **Settings** > **About Phone**.
90
+ 2. Tap **Build Number** 7 times to unlock **Developer Options**.
91
+ 3. Go to **Settings** > **Developer Options** > Turn on **USB Debugging**.
92
+ 4. Connect your phone with a USB cable.
93
+ 5. Tap **"Always allow from this computer"** on your phone screen.
94
+
95
+ ### Method B: Wireless Debugging (No Cable, Android 11+)
96
+ 1. Ensure your PC and phone are on the same Wi-Fi network.
97
+ 2. In **Developer Options**, tap **Wireless Debugging** > **"Pair device with pairing code"**.
98
+ 3. Run the pairing command:
99
+ ```bash
100
+ cya pair <IP> <PAIRING_PORT> <6-DIGIT_CODE>
101
+ ```
102
+ 4. Connect using the main connection port displayed on your phone:
103
+ ```bash
104
+ cya connect <IP> <CONNECTION_PORT>
105
+ ```
106
+
107
+ ---
108
+
109
+ ## 💻 CLI Commands Reference
110
+
111
+ | Command | Description |
112
+ | :--- | :--- |
113
+ | `cya` | Launch the interactive terminal UI |
114
+ | `cya doctor` | Diagnose ADB binary, drivers, and device permissions |
115
+ | `cya devices` | List connected USB and Wi-Fi Android devices |
116
+ | `cya connect <host> [port]` | Connect to a device via IP and port |
117
+ | `cya pair <host> <port> <code>`| Pair through Android 11+ Wireless Debugging |
118
+ | `cya info` | Display hardware, software, display DPI, and battery sensors |
119
+ | `cya apps [--filter <type>]` | List installed applications (`all`, `system`, `3rd-party`, `disabled`) |
120
+ | `cya debloat [--dry-run]` | Inspect and safely remove OEM bloatware |
121
+ | `cya themes [--apply <id>]` | Apply curated aesthetic theme presets |
122
+ | `cya customize` | Tune animation scales, DPI overrides, and system dark mode |
123
+ | `cya backup [-o <dir>]` | Create a snapshot manifest of packages and settings |
124
+ | `cya restore <file>` | Restore packages and appearance settings from manifest |
125
+
126
+ ---
127
+
128
+ ## 🎨 Theme Presets
129
+
130
+ - **Nothing OS Vibe (`nothing-os`)**: Minimalist glyph dot-matrix aesthetic, 0.5x snappy animations, AMOLED dark background, Nothing red accent.
131
+ - **Pixel Material You (`pixel-material-you`)**: Fluid 1.0x expressive physics, rounded shapes, pastel accents.
132
+ - **Samsung One UI (`samsung-oneui`)**: Ergonomic thumb-reach spacing, dense widgets, 0.75x responsive curves.
133
+ - **Pure Monochrome (`minimal-monochrome`)**: Zen distraction-free greyscale focus, 0.25x instant response.
134
+ - **Deep AMOLED Midnight (`amoled-dark`)**: Pitch-black `#000000` background to minimize power draw on OLED screens.
135
+
136
+ ---
137
+
138
+ ## 🖥️ Running the Desktop Studio Locally
139
+
140
+ ```bash
141
+ # Clone the repository
142
+ git clone https://github.com/cleanyourandroid/cleanyourandroid.git
143
+ cd cleanyourandroid
144
+
145
+ # Install dependencies
146
+ pnpm install
147
+
148
+ # Build all packages
149
+ pnpm run build
150
+
151
+ # Start the desktop studio
152
+ pnpm --filter @cleanyourandroid/desktop run dev
153
+ ```
154
+
155
+ Open your browser at **`http://localhost:5173/`**.
156
+
157
+ ---
158
+
159
+ ## 🧪 Automated Testing
160
+
161
+ The project includes unit and integration tests with a custom `MockAdbClient` that requires no physical phone connected:
162
+
163
+ ```bash
164
+ pnpm test
165
+ ```
166
+
167
+ ---
168
+
169
+ ## 📄 License
170
+
171
+ CleanYourAndroid is free and open-source software licensed under the [MIT License](LICENSE).
package/bin/cya.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/index.js';
3
+
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,422 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import inquirer from 'inquirer';
5
+ import { createDeviceManager, THEME_PRESETS } from '@cleanyourandroid/core';
6
+ const program = new Command();
7
+ const manager = createDeviceManager();
8
+ async function resolveTargetDevice(explicitDevice) {
9
+ if (explicitDevice)
10
+ return explicitDevice;
11
+ const devices = await manager.getConnectedDevices();
12
+ if (devices.length === 0) {
13
+ console.log(chalk.red('✕ No Android devices detected.'));
14
+ console.log(chalk.gray(' Run "cya doctor" for connection troubleshooting or connect via USB.'));
15
+ process.exit(1);
16
+ }
17
+ if (devices.length === 1) {
18
+ return devices[0].serial;
19
+ }
20
+ const answer = await inquirer.prompt([
21
+ {
22
+ type: 'list',
23
+ name: 'selected',
24
+ message: 'Multiple devices detected. Select a target device:',
25
+ choices: devices.map((d) => ({
26
+ name: `${d.model || d.product || 'Android Device'} (${d.serial}) [${d.state}]`,
27
+ value: d.serial
28
+ }))
29
+ }
30
+ ]);
31
+ return answer.selected;
32
+ }
33
+ program
34
+ .name('cya')
35
+ .description(chalk.bold('CleanYourAndroid') + ' — Open-Source Android Customization & Debloating Toolkit')
36
+ .version('1.0.0');
37
+ // cya devices
38
+ program
39
+ .command('devices')
40
+ .description('List all connected USB and wireless Android devices')
41
+ .action(async () => {
42
+ const spinner = ora('Detecting connected devices...').start();
43
+ try {
44
+ const devices = await manager.getConnectedDevices();
45
+ spinner.stop();
46
+ if (devices.length === 0) {
47
+ console.log(chalk.yellow('No Android devices found. Make sure USB Debugging is ON.'));
48
+ return;
49
+ }
50
+ console.log(chalk.bold.cyan(`\n📱 Connected Devices (${devices.length}):`));
51
+ console.log('─'.repeat(60));
52
+ for (const d of devices) {
53
+ const stateColor = d.state === 'device' ? chalk.green : chalk.red;
54
+ console.log(`• Serial: ${chalk.bold(d.serial)}\n` +
55
+ ` State: ${stateColor(d.state.toUpperCase())}\n` +
56
+ ` Transport: ${chalk.gray(d.transport)}\n` +
57
+ ` Model: ${d.model || 'Unknown'}\n`);
58
+ }
59
+ }
60
+ catch (err) {
61
+ spinner.fail('Failed to query devices');
62
+ console.error(chalk.red(err.message));
63
+ }
64
+ });
65
+ // cya connect <host> [port]
66
+ program
67
+ .command('connect <host> [port]')
68
+ .description('Connect to a wireless ADB device via IP address')
69
+ .action(async (host, portStr) => {
70
+ const port = portStr ? parseInt(portStr, 10) : 5555;
71
+ const spinner = ora(`Connecting to ${host}:${port}...`).start();
72
+ try {
73
+ const res = await manager.connectDevice(host, port);
74
+ if (res.success) {
75
+ spinner.succeed(chalk.green(`Successfully connected to ${host}:${port}`));
76
+ }
77
+ else {
78
+ spinner.fail(chalk.yellow(`Connection failed: ${res.message}`));
79
+ }
80
+ }
81
+ catch (err) {
82
+ spinner.fail('Connection error');
83
+ console.error(chalk.red(err.message));
84
+ }
85
+ });
86
+ // cya pair <host> <port> <code>
87
+ program
88
+ .command('pair <host> <port> <code>')
89
+ .description('Pair with Android 11+ Wireless Debugging pairing code')
90
+ .action(async (host, portStr, code) => {
91
+ const port = parseInt(portStr, 10);
92
+ const spinner = ora(`Pairing with ${host}:${port}...`).start();
93
+ try {
94
+ const res = await manager.pairDevice(host, port, code);
95
+ if (res.success) {
96
+ spinner.succeed(chalk.green(`Device successfully paired!`));
97
+ }
98
+ else {
99
+ spinner.fail(chalk.red(`Pairing failed: ${res.message}`));
100
+ }
101
+ }
102
+ catch (err) {
103
+ spinner.fail('Pairing failed');
104
+ console.error(chalk.red(err.message));
105
+ }
106
+ });
107
+ // cya info
108
+ program
109
+ .command('info')
110
+ .description('Display detailed hardware, software, and battery information')
111
+ .option('-d, --device <serial>', 'Target device serial')
112
+ .action(async (opts) => {
113
+ try {
114
+ const serial = await resolveTargetDevice(opts.device);
115
+ const spinner = ora('Reading device hardware and telemetry...').start();
116
+ const details = await manager.getDeviceInfo(serial);
117
+ spinner.succeed('Device telemetry retrieved');
118
+ console.log(chalk.bold.green(`\n📊 Device Information [${details.serial}]`));
119
+ console.log('─'.repeat(55));
120
+ console.log(chalk.bold('Hardware:'));
121
+ console.log(` Manufacturer: ${details.hardware.manufacturer}`);
122
+ console.log(` Model: ${details.hardware.model}`);
123
+ console.log(` Screen: ${details.hardware.screenResolution || 'N/A'} @ ${details.hardware.screenDensityDpi || 'N/A'} DPI`);
124
+ console.log(` Battery: ${details.hardware.batteryLevelPercent}% (${details.hardware.batteryStatus || 'N/A'}) - ${details.hardware.batteryTemperatureC ?? 'N/A'}°C`);
125
+ console.log(chalk.bold('\nSoftware:'));
126
+ console.log(` Android Version: ${details.software.androidVersion} (API ${details.software.apiLevel})`);
127
+ console.log(` Build ID: ${details.software.buildId}`);
128
+ console.log(` Security Patch: ${details.software.securityPatch}`);
129
+ console.log(` Root Access: ${details.software.isRooted ? chalk.green('Yes') : chalk.gray('No (Standard Non-Root ADB)')}`);
130
+ }
131
+ catch (err) {
132
+ console.error(chalk.red(err.message));
133
+ }
134
+ });
135
+ // cya apps
136
+ program
137
+ .command('apps')
138
+ .description('List installed packages on the device')
139
+ .option('-d, --device <serial>', 'Target device serial')
140
+ .option('-f, --filter <type>', 'Filter: all, system, 3rd-party, disabled', 'all')
141
+ .action(async (opts) => {
142
+ try {
143
+ const serial = await resolveTargetDevice(opts.device);
144
+ const spinner = ora(`Fetching packages (${opts.filter})...`).start();
145
+ const apps = await manager.getInstalledApps(serial, opts.filter);
146
+ spinner.stop();
147
+ console.log(chalk.bold.cyan(`\n📦 Installed Packages (${apps.length}):`));
148
+ console.log('─'.repeat(60));
149
+ for (const app of apps.slice(0, 50)) {
150
+ const stateStr = app.isEnabled ? chalk.green('ENABLED') : chalk.gray('DISABLED');
151
+ console.log(`• ${chalk.bold(app.packageName)} [${stateStr}]`);
152
+ }
153
+ if (apps.length > 50) {
154
+ console.log(chalk.gray(`... and ${apps.length - 50} more. Use --filter to narrow down.`));
155
+ }
156
+ }
157
+ catch (err) {
158
+ console.error(chalk.red(err.message));
159
+ }
160
+ });
161
+ // cya debloat
162
+ program
163
+ .command('debloat')
164
+ .description('Inspect and safely debloat manufacturer bloatware')
165
+ .option('-d, --device <serial>', 'Target device serial')
166
+ .option('--dry-run', 'Simulate debloating actions without removing packages', false)
167
+ .action(async (opts) => {
168
+ try {
169
+ const serial = await resolveTargetDevice(opts.device);
170
+ const spinner = ora('Detecting device OEM profile & bloatware...').start();
171
+ const details = await manager.getDeviceInfo(serial);
172
+ const bloat = await manager.inspectBloatware(serial, details.hardware.manufacturer);
173
+ spinner.stop();
174
+ if (bloat.length === 0) {
175
+ console.log(chalk.green(`\n✓ No known bloatware detected for ${details.hardware.manufacturer}!`));
176
+ return;
177
+ }
178
+ console.log(chalk.bold.yellow(`\n⚠️ Detected ${bloat.length} Bloatware candidates for ${details.hardware.manufacturer}:`));
179
+ console.log('─'.repeat(70));
180
+ for (const b of bloat) {
181
+ console.log(`• ${chalk.bold(b.applicationLabel)} (${chalk.cyan(b.packageName)})\n` +
182
+ ` Risk: ${b.riskLevel.toUpperCase()} | Category: ${b.category}\n` +
183
+ ` Desc: ${b.description || 'No description'}\n`);
184
+ }
185
+ const answers = await inquirer.prompt([
186
+ {
187
+ type: 'checkbox',
188
+ name: 'selected',
189
+ message: 'Select packages to remove for current user:',
190
+ choices: bloat.map((b) => ({
191
+ name: `${b.applicationLabel} [${b.riskLevel}]`,
192
+ value: b.packageName,
193
+ checked: b.riskLevel === 'safe'
194
+ }))
195
+ },
196
+ {
197
+ type: 'confirm',
198
+ name: 'confirm',
199
+ message: `Are you sure you want to proceed with ${opts.dryRun ? 'DRY-RUN' : 'safe user-space uninstall'}?`,
200
+ default: false
201
+ }
202
+ ]);
203
+ if (!answers.confirm || answers.selected.length === 0) {
204
+ console.log(chalk.gray('Debloating canceled.'));
205
+ return;
206
+ }
207
+ console.log(chalk.blue(`\nProcessing ${answers.selected.length} packages...`));
208
+ for (const pkg of answers.selected) {
209
+ const res = await manager.uninstallPackage(serial, pkg, opts.dryRun);
210
+ if (res.success) {
211
+ console.log(chalk.green(` ✓ [UNINSTALLED] ${pkg}`));
212
+ }
213
+ else {
214
+ console.log(chalk.red(` ✕ [FAILED] ${pkg}: ${res.error}`));
215
+ }
216
+ }
217
+ console.log(chalk.green('\nDebloating batch complete. All operations were user-space reversible.'));
218
+ }
219
+ catch (err) {
220
+ console.error(chalk.red(err.message));
221
+ }
222
+ });
223
+ // cya themes
224
+ program
225
+ .command('themes')
226
+ .description('List and apply aesthetic customization themes')
227
+ .option('-d, --device <serial>', 'Target device serial')
228
+ .option('-a, --apply <themeId>', 'Apply theme directly (nothing-os, pixel-material-you, etc.)')
229
+ .action(async (opts) => {
230
+ try {
231
+ const serial = await resolveTargetDevice(opts.device);
232
+ if (opts.apply) {
233
+ const spinner = ora(`Applying theme '${opts.apply}'...`).start();
234
+ await manager.applyTheme(serial, opts.apply);
235
+ spinner.succeed(chalk.green(`Theme '${opts.apply}' successfully applied!`));
236
+ return;
237
+ }
238
+ const themes = Object.values(THEME_PRESETS);
239
+ console.log(chalk.bold.magenta('\n🎨 Available Aesthetic Themes:'));
240
+ console.log('─'.repeat(60));
241
+ for (const t of themes) {
242
+ console.log(`• ${chalk.bold.cyan(t.name)} (ID: ${chalk.yellow(t.id)})`);
243
+ console.log(` ${t.description}`);
244
+ console.log(` Vibe: ${chalk.gray(t.designVibe)}\n`);
245
+ }
246
+ const answer = await inquirer.prompt([
247
+ {
248
+ type: 'list',
249
+ name: 'chosenTheme',
250
+ message: 'Choose a theme to apply immediately:',
251
+ choices: themes.map((t) => ({ name: t.name, value: t.id }))
252
+ }
253
+ ]);
254
+ const spinner = ora(`Applying ${answer.chosenTheme}...`).start();
255
+ await manager.applyTheme(serial, answer.chosenTheme);
256
+ spinner.succeed(chalk.green(`Applied ${answer.chosenTheme} aesthetic!`));
257
+ }
258
+ catch (err) {
259
+ console.error(chalk.red(err.message));
260
+ }
261
+ });
262
+ // cya customize
263
+ program
264
+ .command('customize')
265
+ .description('Interactively adjust animation speeds, display density, and dark mode')
266
+ .option('-d, --device <serial>', 'Target device serial')
267
+ .action(async (opts) => {
268
+ try {
269
+ const serial = await resolveTargetDevice(opts.device);
270
+ const current = await manager.customizer.getCurrentSettings(serial);
271
+ const answers = await inquirer.prompt([
272
+ {
273
+ type: 'list',
274
+ name: 'animSpeed',
275
+ message: 'Set System Animation Scale:',
276
+ choices: [
277
+ { name: '0.25x (Lightning snappy)', value: 0.25 },
278
+ { name: '0.5x (Recommended Nothing OS speed)', value: 0.5 },
279
+ { name: '1.0x (Android Default)', value: 1.0 },
280
+ { name: 'Keep current', value: current.windowAnimationScale }
281
+ ]
282
+ },
283
+ {
284
+ type: 'confirm',
285
+ name: 'darkMode',
286
+ message: 'Enable System Dark Mode?',
287
+ default: current.darkModeEnabled ?? true
288
+ }
289
+ ]);
290
+ const spinner = ora('Applying customization adjustments...').start();
291
+ await manager.customizer.setAnimationScales(serial, {
292
+ window: answers.animSpeed,
293
+ transition: answers.animSpeed,
294
+ animator: answers.animSpeed
295
+ });
296
+ await manager.customizer.setDarkMode(serial, answers.darkMode);
297
+ spinner.succeed(chalk.green('Customization settings applied!'));
298
+ }
299
+ catch (err) {
300
+ console.error(chalk.red(err.message));
301
+ }
302
+ });
303
+ // cya backup
304
+ program
305
+ .command('backup')
306
+ .description('Snapshot installed packages, state, and appearance settings')
307
+ .option('-d, --device <serial>', 'Target device serial')
308
+ .option('-o, --output <dir>', 'Output directory', './cya-backups')
309
+ .action(async (opts) => {
310
+ try {
311
+ const serial = await resolveTargetDevice(opts.device);
312
+ const spinner = ora('Creating backup snapshot...').start();
313
+ const res = await manager.createBackup(serial, opts.output);
314
+ spinner.succeed(chalk.green(`Backup saved to ${res.manifestPath}`));
315
+ }
316
+ catch (err) {
317
+ console.error(chalk.red(err.message));
318
+ }
319
+ });
320
+ // cya restore <file>
321
+ program
322
+ .command('restore <file>')
323
+ .description('Restore settings and packages from a backup manifest')
324
+ .option('-d, --device <serial>', 'Target device serial')
325
+ .action(async (file, opts) => {
326
+ try {
327
+ const serial = await resolveTargetDevice(opts.device);
328
+ const spinner = ora(`Loading manifest ${file}...`).start();
329
+ const manifest = await manager.backup.loadBackup(file);
330
+ spinner.text = 'Restoring packages and settings...';
331
+ const result = await manager.backup.restoreFromManifest(serial, manifest);
332
+ spinner.succeed(chalk.green(`Restored ${result.reinstalledCount} packages! Settings: ${result.settingsRestored ? 'Restored' : 'Skipped'}`));
333
+ }
334
+ catch (err) {
335
+ console.error(chalk.red(err.message));
336
+ }
337
+ });
338
+ // cya doctor
339
+ program
340
+ .command('doctor')
341
+ .description('Diagnose ADB binary, driver status, device authorization, and permissions')
342
+ .action(async () => {
343
+ console.log(chalk.bold.cyan('\n🩺 CleanYourAndroid Diagnostic Doctor'));
344
+ console.log('═'.repeat(60));
345
+ // 1. ADB check
346
+ console.log(`Checking ADB platform tools:`);
347
+ console.log(` Path: ${chalk.yellow(manager.adb.adbPath)}`);
348
+ try {
349
+ const versionRes = await manager.adb.execute(['version']);
350
+ console.log(` Version: ${chalk.green(versionRes.stdout.split('\n')[0])}`);
351
+ }
352
+ catch {
353
+ console.log(chalk.red(' ✕ ADB binary not executable or not found.'));
354
+ console.log(chalk.gray(' Fix: Install Android SDK Platform-Tools or set ADB_PATH environment variable.'));
355
+ }
356
+ // 2. Connected devices
357
+ console.log('\nChecking Connected Devices:');
358
+ try {
359
+ const devices = await manager.getConnectedDevices();
360
+ if (devices.length === 0) {
361
+ console.log(chalk.yellow(' ⚠️ No devices detected over USB or Wi-Fi.'));
362
+ console.log(chalk.gray(' Troubleshooting Checklist:'));
363
+ console.log(' 1. Open Settings -> About Phone -> Tap "Build Number" 7 times.');
364
+ console.log(' 2. Go to Developer Options -> Enable "USB Debugging".');
365
+ console.log(' 3. Re-plug the USB cable and select "File Transfer / MTP" mode.');
366
+ }
367
+ else {
368
+ for (const d of devices) {
369
+ if (d.state === 'unauthorized') {
370
+ console.log(chalk.yellow(` ⚠️ Device ${d.serial} is UNAUTHORIZED.`));
371
+ console.log(chalk.gray(' Unlock your phone screen and tap "Always allow" on the popup.'));
372
+ }
373
+ else {
374
+ console.log(chalk.green(` ✓ Device ${d.serial} is CONNECTED & AUTHORIZED.`));
375
+ }
376
+ }
377
+ }
378
+ }
379
+ catch (err) {
380
+ console.log(chalk.red(` ✕ Error querying devices: ${err.message}`));
381
+ }
382
+ console.log('\n' + '═'.repeat(60));
383
+ });
384
+ // Default interactive CLI if called with no arguments
385
+ if (process.argv.length <= 2) {
386
+ (async () => {
387
+ console.log(chalk.bold.cyan(`
388
+ _____ _ __ __
389
+ / ____| | \\ \\ / /
390
+ | | | | ___ __ _ _ __ \\ \\_/ /__ _ _ _ __
391
+ | | | |/ _ \\/ _\` | '_ \\ \\ / _ \\| | | | '__|
392
+ | |____| | __/ (_| | | | | | | (_) | |_| | |
393
+ \\_____|_|\\___|\\__,_|_| |_| |_|\\___/ \\__,_|_|
394
+ Android Customization Toolkit v1.0.0
395
+ `));
396
+ const answer = await inquirer.prompt([
397
+ {
398
+ type: 'list',
399
+ name: 'action',
400
+ message: 'What would you like to do?',
401
+ choices: [
402
+ { name: '1. List Connected Devices', value: 'devices' },
403
+ { name: '2. Inspect Device Info & Battery', value: 'info' },
404
+ { name: '3. Inspect & Debloat Bloatware', value: 'debloat' },
405
+ { name: '4. Apply Design Themes (Nothing OS / Pixel / One UI)', value: 'themes' },
406
+ { name: '5. Fast Customization (Animations & Dark Mode)', value: 'customize' },
407
+ { name: '6. Backup Device Settings', value: 'backup' },
408
+ { name: '7. Run Diagnostic Doctor', value: 'doctor' },
409
+ { name: '8. Exit', value: 'exit' }
410
+ ]
411
+ }
412
+ ]);
413
+ if (answer.action === 'exit')
414
+ process.exit(0);
415
+ const cmdArgs = [process.argv[0], process.argv[1], answer.action];
416
+ await program.parseAsync(cmdArgs);
417
+ })();
418
+ }
419
+ else {
420
+ program.parseAsync(process.argv);
421
+ }
422
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}