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 +22 -0
- package/README.md +170 -2
- package/bin/cya.js +3 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +422 -0
- package/dist/index.js.map +1 -0
- package/package.json +33 -4
- package/src/index.ts +452 -0
- package/tsconfig.json +14 -0
- package/tsconfig.tsbuildinfo +1 -0
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
|
-
#
|
|
1
|
+
# CleanYourAndroid
|
|
2
2
|
|
|
3
|
-
|
|
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
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,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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"}
|