@jetstart/cli 1.6.0 → 2.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.
Files changed (142) hide show
  1. package/README.md +133 -41
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +11 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/android-emulator.d.ts.map +1 -0
  6. package/dist/commands/android-emulator.js.map +1 -0
  7. package/dist/commands/build.d.ts +13 -1
  8. package/dist/commands/build.d.ts.map +1 -0
  9. package/dist/commands/build.js +279 -29
  10. package/dist/commands/build.js.map +1 -0
  11. package/dist/commands/clean.d.ts +23 -0
  12. package/dist/commands/clean.d.ts.map +1 -0
  13. package/dist/commands/clean.js +191 -0
  14. package/dist/commands/clean.js.map +1 -0
  15. package/dist/commands/create.d.ts.map +1 -0
  16. package/dist/commands/create.js +41 -0
  17. package/dist/commands/create.js.map +1 -0
  18. package/dist/commands/dev.d.ts.map +1 -0
  19. package/dist/commands/dev.js +51 -9
  20. package/dist/commands/dev.js.map +1 -0
  21. package/dist/commands/index.d.ts.map +1 -0
  22. package/dist/commands/index.js.map +1 -0
  23. package/dist/commands/install-audit.d.ts.map +1 -0
  24. package/dist/commands/install-audit.js.map +1 -0
  25. package/dist/commands/logs.d.ts.map +1 -0
  26. package/dist/commands/logs.js.map +1 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/types/index.d.ts.map +1 -0
  30. package/dist/types/index.js.map +1 -0
  31. package/dist/utils/android-sdk.d.ts.map +1 -0
  32. package/dist/utils/android-sdk.js +2 -2
  33. package/dist/utils/android-sdk.js.map +1 -0
  34. package/dist/utils/downloader.d.ts.map +1 -0
  35. package/dist/utils/downloader.js.map +1 -0
  36. package/dist/utils/emulator-deployer.d.ts.map +1 -0
  37. package/dist/utils/emulator-deployer.js.map +1 -0
  38. package/dist/utils/emulator.d.ts.map +1 -0
  39. package/dist/utils/emulator.js +5 -4
  40. package/dist/utils/emulator.js.map +1 -0
  41. package/dist/utils/index.d.ts.map +1 -0
  42. package/dist/utils/index.js.map +1 -0
  43. package/dist/utils/java.d.ts.map +1 -0
  44. package/dist/utils/java.js +5 -5
  45. package/dist/utils/java.js.map +1 -0
  46. package/dist/utils/logger.d.ts.map +1 -0
  47. package/dist/utils/logger.js.map +1 -0
  48. package/dist/utils/open.d.ts.map +1 -0
  49. package/dist/utils/open.js.map +1 -0
  50. package/dist/utils/prompt.d.ts.map +1 -0
  51. package/dist/utils/prompt.js.map +1 -0
  52. package/dist/utils/spinner.d.ts.map +1 -0
  53. package/dist/utils/spinner.js.map +1 -0
  54. package/dist/utils/system-tools.d.ts.map +1 -0
  55. package/dist/utils/system-tools.js.map +1 -0
  56. package/dist/utils/template.d.ts +13 -1
  57. package/dist/utils/template.d.ts.map +1 -0
  58. package/dist/utils/template.js +133 -1003
  59. package/dist/utils/template.js.map +1 -0
  60. package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom +15 -0
  61. package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.md5 +1 -0
  62. package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.sha1 +1 -0
  63. package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.sha256 +1 -0
  64. package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.sha512 +1 -0
  65. package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml +13 -0
  66. package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.md5 +1 -0
  67. package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.sha1 +1 -0
  68. package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.sha256 +1 -0
  69. package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.sha512 +1 -0
  70. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar +0 -0
  71. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.md5 +1 -0
  72. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.sha1 +1 -0
  73. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.sha256 +1 -0
  74. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.sha512 +1 -0
  75. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar +0 -0
  76. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.md5 +1 -0
  77. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.sha1 +1 -0
  78. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.sha256 +1 -0
  79. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.sha512 +1 -0
  80. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module +124 -0
  81. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.md5 +1 -0
  82. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.sha1 +1 -0
  83. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.sha256 +1 -0
  84. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.sha512 +1 -0
  85. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom +46 -0
  86. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.md5 +1 -0
  87. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.sha1 +1 -0
  88. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.sha256 +1 -0
  89. package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.sha512 +1 -0
  90. package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml +13 -0
  91. package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.md5 +1 -0
  92. package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.sha1 +1 -0
  93. package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.sha256 +1 -0
  94. package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.sha512 +1 -0
  95. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar +0 -0
  96. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.md5 +1 -0
  97. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.sha1 +1 -0
  98. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.sha256 +1 -0
  99. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.sha512 +1 -0
  100. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module +103 -0
  101. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.md5 +1 -0
  102. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.sha1 +1 -0
  103. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.sha256 +1 -0
  104. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.sha512 +1 -0
  105. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom +38 -0
  106. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.md5 +1 -0
  107. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.sha1 +1 -0
  108. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.sha256 +1 -0
  109. package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.sha512 +1 -0
  110. package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml +13 -0
  111. package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.md5 +1 -0
  112. package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.sha1 +1 -0
  113. package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.sha256 +1 -0
  114. package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.sha512 +1 -0
  115. package/package.json +13 -5
  116. package/scripts/build-java.js +30 -0
  117. package/.eslintrc.json +0 -6
  118. package/src/cli.ts +0 -99
  119. package/src/commands/android-emulator.ts +0 -304
  120. package/src/commands/build.ts +0 -60
  121. package/src/commands/create.ts +0 -232
  122. package/src/commands/dev.ts +0 -198
  123. package/src/commands/index.ts +0 -10
  124. package/src/commands/install-audit.ts +0 -227
  125. package/src/commands/logs.ts +0 -117
  126. package/src/index.ts +0 -17
  127. package/src/types/index.ts +0 -53
  128. package/src/utils/android-sdk.ts +0 -512
  129. package/src/utils/downloader.ts +0 -201
  130. package/src/utils/emulator-deployer.ts +0 -210
  131. package/src/utils/emulator.ts +0 -463
  132. package/src/utils/index.ts +0 -8
  133. package/src/utils/java.ts +0 -369
  134. package/src/utils/logger.ts +0 -42
  135. package/src/utils/open.ts +0 -36
  136. package/src/utils/prompt.ts +0 -56
  137. package/src/utils/spinner.ts +0 -25
  138. package/src/utils/system-tools.ts +0 -648
  139. package/src/utils/template.ts +0 -1217
  140. package/tests/create.test.ts +0 -33
  141. package/tests/utils.test.ts +0 -17
  142. package/tsconfig.json +0 -25
package/README.md CHANGED
@@ -1,92 +1,184 @@
1
- # @jetstart/cli
1
+ # @jetstart/cli
2
2
 
3
- Command-line interface for JetStart - Fast, wireless Android development.
3
+ Command-line interface for JetStart instant hot reload for Android Jetpack Compose.
4
4
 
5
5
  ## Installation
6
+
6
7
  ```bash
7
8
  npm install -g @jetstart/cli
8
9
  ```
9
10
 
11
+ Or use without installing:
12
+
13
+ ```bash
14
+ npx jetstart <command>
15
+ ```
16
+
17
+ ---
18
+
10
19
  ## Commands
11
20
 
12
- ### `jetstart create <name>`
21
+ ### `jetstart create <n>`
22
+
23
+ Scaffolds a new Android/Compose project. Checks for Java 17+ and Android SDK and installs them interactively if missing.
13
24
 
14
- Create a new JetStart project.
15
25
  ```bash
16
- jetstart create myApp
17
- jetstart create myApp --package com.example.myapp
18
- jetstart create myApp --skip-install
26
+ jetstart create my-app
27
+ jetstart create my-app --package com.example.myapp
28
+ jetstart create my-app --skip-install
29
+ jetstart create my-app --full-install # Non-interactive, installs all deps automatically
19
30
  ```
20
31
 
21
32
  **Options:**
22
- - `-p, --package <name>` - Package name (e.g., com.example.app)
23
- - `-t, --template <name>` - Template to use (default: "default")
24
- - `--skip-install` - Skip npm install
33
+
34
+ | Flag | Description |
35
+ |---|---|
36
+ | `-p, --package <n>` | Android package name (e.g. `com.example.app`) |
37
+ | `-t, --template <n>` | Template to use (default: `default`) |
38
+ | `--skip-install` | Skip dependency check |
39
+ | `--full-install` | Non-interactive: auto-install Java + Android SDK |
40
+
41
+ ---
25
42
 
26
43
  ### `jetstart dev`
27
44
 
28
- Start development server with hot reload.
45
+ Starts the JetStart development server. Watches for Kotlin file changes, compiles them to DEX, and pushes hot reload patches to connected devices over WebSocket.
46
+
29
47
  ```bash
30
48
  jetstart dev
31
- jetstart dev --port 8080
32
- jetstart dev --no-qr
49
+ jetstart dev --port 9000
50
+ jetstart dev --emulator # Deploy to a running AVD then switch to hot reload
51
+ jetstart dev --emulator --avd Pixel7 # Target a specific AVD by name
52
+ jetstart dev --web # Auto-open the browser web emulator
53
+ jetstart dev --no-qr # Skip printing the QR code
33
54
  ```
34
55
 
35
56
  **Options:**
36
- - `-p, --port <port>` - Port for dev server (default: 8765)
37
- - `-H, --host <host>` - Host address (default: 0.0.0.0)
38
- - `--no-qr` - Do not show QR code
39
- - `--no-open` - Do not open browser
57
+
58
+ | Flag | Description |
59
+ |---|---|
60
+ | `-p, --port <port>` | HTTP port (default: `8765`) |
61
+ | `-H, --host <host>` | Host override (default: auto-detected LAN IP) |
62
+ | `--emulator` | Deploy APK to a running AVD via ADB on first build, then use hot reload |
63
+ | `--avd <n>` | Target AVD name when using `--emulator` |
64
+ | `--web` | Open the web emulator in a browser on start |
65
+ | `--no-qr` | Do not print the QR code |
66
+
67
+ **Ports used:**
68
+
69
+ | Port | Service |
70
+ |---|---|
71
+ | `8765` | HTTP server (REST API, APK download, web emulator redirect) |
72
+ | `8766` | WebSocket server (device/browser to core comms) |
73
+ | `8767` | Logs server (device log aggregation) |
74
+
75
+ The QR code encodes `host|port|wsPort|sessionId|token|projectName`. Each `jetstart dev` session generates a fresh `sessionId` and `token`; devices built against an older session are rejected with WebSocket close code `4001` or `4002`.
76
+
77
+ The host detection logic skips virtual network interfaces (Hyper-V, WSL, Docker, VMware) and prefers real Wi-Fi/Ethernet addresses in the `192.168.*`, `10.*`, or `172.*` ranges.
78
+
79
+ ---
40
80
 
41
81
  ### `jetstart build`
42
82
 
43
- Build production APK.
83
+ Builds an APK (or AAB) via Gradle. Release builds automatically strip the dev-server URL and session token from `BuildConfig` and set `debuggable=false`, then restore `build.gradle` to its original state even if the build fails.
84
+
44
85
  ```bash
45
- jetstart build
46
- jetstart build --release
47
- jetstart build --output ./dist
86
+ jetstart build # Debug APK
87
+ jetstart build --release # Unsigned release APK
88
+ jetstart build --release --sign # Signed release APK (requires keystore.properties)
89
+ jetstart build --release --self-sign # Auto-generate a test keystore and sign
90
+ jetstart build --bundle # Build AAB (Android App Bundle)
91
+ jetstart build --release --bundle # Signed release AAB
92
+ jetstart build --output ./dist # Custom output directory
93
+ jetstart build --flavor staging # Build a specific product flavor
48
94
  ```
49
95
 
50
96
  **Options:**
51
- - `-o, --output <path>` - Output directory (default: ./build)
52
- - `-r, --release` - Build release version
53
- - `--sign` - Sign the APK
97
+
98
+ | Flag | Description |
99
+ |---|---|
100
+ | `-o, --output <path>` | Output directory (default: `./build`) |
101
+ | `-r, --release` | Release build — R8 enabled, `debuggable=false`, dev credentials stripped |
102
+ | `--sign` | Sign with `keystore.properties` in the project root |
103
+ | `--self-sign` | Auto-generate a test keystore via `keytool` and sign (not for Play Store) |
104
+ | `--bundle` | Produce an AAB instead of an APK |
105
+ | `--flavor <n>` | Build a specific product flavor |
106
+
107
+ **`keystore.properties` format (required for `--sign`):**
108
+
109
+ ```properties
110
+ storeFile=path/to/release.jks
111
+ storePassword=your-store-password
112
+ keyAlias=your-key-alias
113
+ keyPassword=your-key-password
114
+ ```
115
+
116
+ Generate a keystore:
117
+
118
+ ```bash
119
+ keytool -genkey -v -keystore release.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
120
+ ```
121
+
122
+ ---
54
123
 
55
124
  ### `jetstart logs`
56
125
 
57
- Stream application logs.
126
+ Connects to the JetStart logs server (`port 8767`) and streams live device logs to the terminal.
127
+
58
128
  ```bash
59
129
  jetstart logs
60
130
  jetstart logs --level error
61
131
  jetstart logs --source build
132
+ jetstart logs --lines 200
62
133
  ```
63
134
 
64
135
  **Options:**
65
- - `-f, --follow` - Follow log output (default: true)
66
- - `-l, --level <level>` - Filter by log level
67
- - `-s, --source <source>` - Filter by log source
68
- - `-n, --lines <number>` - Number of lines to show (default: 100)
136
+
137
+ | Flag | Description |
138
+ |---|---|
139
+ | `-f, --follow` | Follow log output in real time (default: `true`) |
140
+ | `-l, --level <level>` | Filter by level: `verbose`, `debug`, `info`, `warn`, `error`, `fatal` |
141
+ | `-s, --source <source>` | Filter by source: `cli`, `core`, `client`, `build`, `network`, `system` |
142
+ | `-n, --lines <n>` | Number of historical lines to replay on connect (default: `100`) |
143
+
144
+ ---
145
+
146
+ ### `jetstart clean`
147
+
148
+ Removes build artifacts and caches.
149
+
150
+ ```bash
151
+ jetstart clean
152
+ ```
153
+
154
+ ---
69
155
 
70
156
  ## Programmatic Usage
157
+
71
158
  ```typescript
72
159
  import { createCommand, devCommand, buildCommand } from '@jetstart/cli';
73
160
 
74
- // Create a project
75
- await createCommand('myApp', { package: 'com.example.myapp' });
76
-
77
- // Start dev server
78
- await devCommand({ port: '8765', host: '0.0.0.0' });
79
-
80
- // Build APK
81
- await buildCommand({ release: true, output: './dist' });
161
+ await createCommand('my-app', { package: 'com.example.myapp' });
162
+ await devCommand({ port: '8765', emulator: true });
163
+ await buildCommand({ release: true, sign: true, output: './dist' });
82
164
  ```
83
165
 
166
+ ---
167
+
84
168
  ## Environment Variables
85
169
 
86
- - `DEBUG` - Enable debug logging
87
- - `JETSTART_PORT` - Default port for dev server
88
- - `JETSTART_HOST` - Default host for dev server
170
+ | Variable | Description |
171
+ |---|---|
172
+ | `ANDROID_HOME` / `ANDROID_SDK_ROOT` | Android SDK path |
173
+ | `KOTLIN_HOME` | Kotlin installation path (used by hot reload compiler) |
174
+ | `JAVA_HOME` | JDK path |
175
+ | `DEBUG` | Enable verbose logging |
176
+ | `JETSTART_PORT` | Default HTTP port |
177
+ | `JETSTART_HOST` | Default host override |
178
+
179
+ ---
89
180
 
90
181
  ## License
91
182
 
92
- Apache-2.0
183
+ MIT
184
+
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
package/dist/cli.js CHANGED
@@ -18,6 +18,7 @@ const install_audit_1 = require("./commands/install-audit");
18
18
  const android_emulator_1 = require("./commands/android-emulator");
19
19
  const shared_1 = require("@jetstart/shared");
20
20
  const package_json_1 = require("../package.json");
21
+ const clean_1 = require("./commands/clean");
21
22
  const program = new commander_1.Command();
22
23
  program
23
24
  .name('jetstart')
@@ -51,6 +52,9 @@ program
51
52
  .option('-o, --output <path>', 'Output directory', './build')
52
53
  .option('-r, --release', 'Build release version', false)
53
54
  .option('--sign', 'Sign the APK')
55
+ .option('--self-sign', 'Auto-generate a test keystore and sign (device testing, NOT for Play Store)')
56
+ .option('--bundle', 'Build AAB (App Bundle) instead of APK — recommended for Play Store')
57
+ .option('--flavor <name>', 'Build a specific product flavor')
54
58
  .action(build_1.buildCommand);
55
59
  // Logs command
56
60
  program
@@ -72,6 +76,13 @@ program
72
76
  .command('android-emulator')
73
77
  .description('Manage Android emulators (AVDs)')
74
78
  .action(android_emulator_1.androidEmulatorCommand);
79
+ // Clean command
80
+ program
81
+ .command('clean')
82
+ .description('Stop Gradle daemons and remove build artifacts — fixes "Folder In Use" errors')
83
+ .option('--build', 'Also delete app/build/ to free disk space (next build will be slower)')
84
+ .option('--daemons-only', 'Only stop Gradle daemons, do not touch build output')
85
+ .action(clean_1.cleanCommand);
75
86
  // Error handling
76
87
  program.on('command:*', (operands) => {
77
88
  console.error(chalk_1.default.red(`Error: Unknown command '${operands[0]}'`));
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android-emulator.d.ts","sourceRoot":"","sources":["../../src/commands/android-emulator.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0OH;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgE5D"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android-emulator.js","sourceRoot":"","sources":["../../src/commands/android-emulator.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,23 @@
1
1
  /**
2
2
  * Build Command
3
- * Builds production APK
3
+ * Builds production or debug APK via Gradle with full security hardening.
4
+ *
5
+ * Security model for release builds:
6
+ * 1. JetStart dev-server URL/session cleared from BuildConfig.
7
+ * 2. Hot-reload plugin only instruments debug variants.
8
+ * 3. BuildConfig.DEBUG=false gates HotReload; R8 dead-code-eliminates it.
9
+ * 4. R8 minification + resource shrinking reduces attack surface.
10
+ * 5. debuggable=false prevents debugger attachment on release devices.
11
+ * 6. build.gradle is always restored after build (even on failure).
4
12
  */
5
13
  interface BuildOptions {
6
14
  output?: string;
7
15
  release?: boolean;
8
16
  sign?: boolean;
17
+ flavor?: string;
18
+ bundle?: boolean;
19
+ /** Auto-generate a self-signed test keystore and sign the release APK. */
20
+ selfSign?: boolean;
9
21
  }
10
22
  export declare function buildCommand(options: BuildOptions): Promise<void>;
11
23
  export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA2HD,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,iBAuJvD"}
@@ -1,53 +1,303 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Build Command
4
- * Builds production APK
4
+ * Builds production or debug APK via Gradle with full security hardening.
5
+ *
6
+ * Security model for release builds:
7
+ * 1. JetStart dev-server URL/session cleared from BuildConfig.
8
+ * 2. Hot-reload plugin only instruments debug variants.
9
+ * 3. BuildConfig.DEBUG=false gates HotReload; R8 dead-code-eliminates it.
10
+ * 4. R8 minification + resource shrinking reduces attack surface.
11
+ * 5. debuggable=false prevents debugger attachment on release devices.
12
+ * 6. build.gradle is always restored after build (even on failure).
5
13
  */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
6
47
  var __importDefault = (this && this.__importDefault) || function (mod) {
7
48
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
49
  };
9
50
  Object.defineProperty(exports, "__esModule", { value: true });
10
51
  exports.buildCommand = buildCommand;
11
52
  const path_1 = __importDefault(require("path"));
53
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
54
  const chalk_1 = __importDefault(require("chalk"));
55
+ const child_process_1 = require("child_process");
56
+ const os = __importStar(require("os"));
13
57
  const logger_1 = require("../utils/logger");
14
58
  const spinner_1 = require("../utils/spinner");
15
- const shared_1 = require("@jetstart/shared");
16
- async function buildCommand(options) {
59
+ // Helpers ---------------------------------------------------------------
60
+ async function readJetStartConfig(projectPath) {
61
+ const p = path_1.default.join(projectPath, 'jetstart.config.json');
62
+ if (!await fs_extra_1.default.pathExists(p))
63
+ return null;
17
64
  try {
18
- const buildType = options.release ? shared_1.BuildType.RELEASE : shared_1.BuildType.DEBUG;
19
- const outputDir = options.output || './build';
20
- (0, logger_1.log)(`Building ${buildType} APK...`);
65
+ return await fs_extra_1.default.readJson(p);
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ async function readKeystoreConfig(projectPath) {
72
+ const p = path_1.default.join(projectPath, 'keystore.properties');
73
+ if (!await fs_extra_1.default.pathExists(p))
74
+ return null;
75
+ const props = {};
76
+ for (const line of (await fs_extra_1.default.readFile(p, 'utf-8')).split('\n')) {
77
+ const eq = line.indexOf('=');
78
+ if (eq > 0 && !line.trim().startsWith('#'))
79
+ props[line.slice(0, eq).trim()] = line.slice(eq + 1).trim();
80
+ }
81
+ const { storeFile, storePassword, keyAlias, keyPassword } = props;
82
+ if (!storeFile || !storePassword || !keyAlias || !keyPassword)
83
+ return null;
84
+ return {
85
+ storeFile: path_1.default.isAbsolute(storeFile) ? storeFile : path_1.default.resolve(projectPath, storeFile),
86
+ storePassword, keyAlias, keyPassword,
87
+ };
88
+ }
89
+ function findGradle(projectPath) {
90
+ const isWin = os.platform() === 'win32';
91
+ const sysName = isWin ? 'gradle.bat' : 'gradle';
92
+ for (const dir of (process.env.PATH || '').split(isWin ? ';' : ':')) {
93
+ const full = path_1.default.join(dir, sysName);
94
+ if (fs_extra_1.default.existsSync(full))
95
+ return full;
96
+ }
97
+ if (isWin) {
98
+ for (const c of ['C:\\\\Gradle\\\\gradle-8.2.1\\\\bin\\\\gradle.bat', 'C:\\\\Gradle\\\\bin\\\\gradle.bat']) {
99
+ if (fs_extra_1.default.existsSync(c))
100
+ return c;
101
+ }
102
+ }
103
+ const wrapper = path_1.default.join(projectPath, isWin ? 'gradlew.bat' : 'gradlew');
104
+ return fs_extra_1.default.existsSync(wrapper) ? wrapper : null;
105
+ }
106
+ /**
107
+ * Strip JetStart dev-server fields from BuildConfig for release builds.
108
+ * Fields are set to empty strings so no server address is in the binary.
109
+ * Returns original content for restoration after build.
110
+ */
111
+ async function clearJetStartFields(buildGradlePath) {
112
+ const original = await fs_extra_1.default.readFile(buildGradlePath, 'utf-8');
113
+ const emptyUrl = ' buildConfigField "String", "JETSTART_SERVER_URL", "\\"\\""\n';
114
+ const emptyId = ' buildConfigField "String", "JETSTART_SESSION_ID", "\\"\\""\n';
115
+ const cleared = original.replace(/\/\/ JetStart injected fields[\s\S]*?\/\/ End JetStart fields/g, '// JetStart injected fields\n' + emptyUrl + emptyId + ' // End JetStart fields');
116
+ await fs_extra_1.default.writeFile(buildGradlePath, cleared, 'utf-8');
117
+ return original;
118
+ }
119
+ /**
120
+ * Inject signing config into build.gradle for release builds.
121
+ * Returns original content for restoration.
122
+ */
123
+ async function injectSigningConfig(buildGradlePath, ks) {
124
+ const original = await fs_extra_1.default.readFile(buildGradlePath, 'utf-8');
125
+ const storePath = ks.storeFile.replace(/\\\\/g, '\\\\\\\\');
126
+ const signingBlock = '\n signingConfigs {\n' +
127
+ ' release {\n' +
128
+ ' storeFile file(\'' + storePath + '\')\n' +
129
+ ' storePassword \'' + ks.storePassword + '\'\n' +
130
+ ' keyAlias \'' + ks.keyAlias + '\'\n' +
131
+ ' keyPassword \'' + ks.keyPassword + '\'\n' +
132
+ ' }\n' +
133
+ ' }\n';
134
+ let modified = original.replace(/(\s*buildTypes\s*\{)/, signingBlock + '$1');
135
+ modified = modified.replace(/(release\s*\{)/, '$1\\n signingConfig signingConfigs.release');
136
+ await fs_extra_1.default.writeFile(buildGradlePath, modified, 'utf-8');
137
+ return original;
138
+ }
139
+ function runGradle(gradle, args, cwd) {
140
+ return new Promise((resolve) => {
21
141
  console.log();
22
- // Validate project
23
- const spinner = (0, spinner_1.startSpinner)('Validating project...');
24
- await new Promise(resolve => setTimeout(resolve, 500));
25
- (0, spinner_1.stopSpinner)(spinner, true, 'Project validated');
26
- // Compile Kotlin
27
- const compileSpinner = (0, spinner_1.startSpinner)('Compiling Kotlin sources...');
28
- await new Promise(resolve => setTimeout(resolve, 2000));
29
- (0, spinner_1.stopSpinner)(compileSpinner, true, 'Kotlin compiled');
30
- // Package APK
31
- const packageSpinner = (0, spinner_1.startSpinner)('Packaging APK...');
32
- await new Promise(resolve => setTimeout(resolve, 1500));
33
- (0, spinner_1.stopSpinner)(packageSpinner, true, 'APK packaged');
34
- // Sign APK (if release)
35
- if (options.release && options.sign) {
36
- const signSpinner = (0, spinner_1.startSpinner)('Signing APK...');
37
- await new Promise(resolve => setTimeout(resolve, 800));
38
- (0, spinner_1.stopSpinner)(signSpinner, true, 'APK signed');
142
+ (0, logger_1.log)('[Gradle] ' + path_1.default.basename(gradle) + ' ' + args.join(' '));
143
+ const proc = (0, child_process_1.spawn)(gradle, args, { cwd, shell: true, env: process.env });
144
+ proc.stdout.on('data', (d) => process.stdout.write(d));
145
+ proc.stderr.on('data', (d) => process.stderr.write(d));
146
+ proc.on('close', (code) => resolve({ code: code ?? 1 }));
147
+ proc.on('error', (err) => { (0, logger_1.error)('Gradle spawn error: ' + err.message); resolve({ code: 1 }); });
148
+ });
149
+ }
150
+ function findOutput(projectPath, release, bundle, flavor) {
151
+ const variant = release ? 'release' : 'debug';
152
+ const f = flavor || '';
153
+ const ext = bundle ? 'aab' : 'apk';
154
+ const outDir = bundle ? 'bundle' : 'apk';
155
+ const candidates = [
156
+ path_1.default.join(projectPath, 'app', 'build', 'outputs', outDir, f + variant, 'app-' + variant + '.' + ext),
157
+ path_1.default.join(projectPath, 'app', 'build', 'outputs', outDir, variant, 'app-' + variant + '.' + ext),
158
+ path_1.default.join(projectPath, 'app', 'build', 'outputs', 'apk', variant, 'app-' + variant + '-unsigned.apk'),
159
+ path_1.default.join(projectPath, 'app', 'build', 'outputs', 'apk', 'debug', 'app-debug.apk'),
160
+ ];
161
+ return candidates.find(c => fs_extra_1.default.existsSync(c)) ?? null;
162
+ }
163
+ // Main ------------------------------------------------------------------
164
+ async function buildCommand(options) {
165
+ const isRelease = !!options.release;
166
+ const isBundle = !!options.bundle;
167
+ const outputDir = path_1.default.resolve(options.output || './build');
168
+ const projectPath = process.cwd();
169
+ const buildLabel = (isRelease ? 'RELEASE' : 'DEBUG') + ' ' + (isBundle ? 'AAB' : 'APK');
170
+ console.log();
171
+ (0, logger_1.log)(chalk_1.default.bold('JetStart Build ' + buildLabel));
172
+ console.log();
173
+ // 1. Validate
174
+ const valSpinner = (0, spinner_1.startSpinner)('Validating project...');
175
+ const buildGradlePath = path_1.default.join(projectPath, 'app', 'build.gradle');
176
+ if (!await fs_extra_1.default.pathExists(buildGradlePath)) {
177
+ (0, spinner_1.stopSpinner)(valSpinner, false, 'app/build.gradle not found');
178
+ (0, logger_1.error)('Run this command from the project root (where settings.gradle lives).');
179
+ process.exit(1);
180
+ }
181
+ const gradle = findGradle(projectPath);
182
+ if (!gradle) {
183
+ (0, spinner_1.stopSpinner)(valSpinner, false, 'Gradle not found');
184
+ (0, logger_1.error)('Install Gradle or ensure gradlew exists in the project root.');
185
+ process.exit(1);
186
+ }
187
+ const config = await readJetStartConfig(projectPath);
188
+ (0, spinner_1.stopSpinner)(valSpinner, true, 'Validated' + (config ? ' · ' + config.packageName : ''));
189
+ // 2. Keystore
190
+ let ks = null;
191
+ if (isRelease && options.sign) {
192
+ const ksSpinner = (0, spinner_1.startSpinner)('Loading keystore...');
193
+ ks = await readKeystoreConfig(projectPath);
194
+ if (!ks) {
195
+ (0, spinner_1.stopSpinner)(ksSpinner, false, 'keystore.properties missing or incomplete');
196
+ (0, logger_1.error)('Create keystore.properties in the project root:');
197
+ console.log('\\n storeFile=path/to/release.jks\\n storePassword=...\\n keyAlias=...\\n keyPassword=...\\n');
198
+ (0, logger_1.warning)('Generate: keytool -genkey -v -keystore release.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key');
199
+ process.exit(1);
39
200
  }
201
+ if (!await fs_extra_1.default.pathExists(ks.storeFile)) {
202
+ (0, spinner_1.stopSpinner)(ksSpinner, false, 'Keystore file not found: ' + ks.storeFile);
203
+ process.exit(1);
204
+ }
205
+ (0, spinner_1.stopSpinner)(ksSpinner, true, 'Keystore ready (alias: ' + ks.keyAlias + ')');
206
+ }
207
+ else if (isRelease) {
40
208
  console.log();
41
- (0, logger_1.success)('Build completed successfully!');
209
+ (0, logger_1.warning)('Building UNSIGNED release APK.');
210
+ (0, logger_1.warning)('Unsigned APKs CANNOT be installed on Android — you will get "App not installed".');
211
+ (0, logger_1.info)('Options:');
212
+ (0, logger_1.info)(' --sign Sign with your keystore (required for Play Store)');
213
+ (0, logger_1.info)(' --self-sign Auto-generate a test keystore and sign (good for device testing)');
42
214
  console.log();
43
- (0, logger_1.info)(`Output: ${chalk_1.default.cyan(path_1.default.resolve(outputDir))}`);
44
- (0, logger_1.info)(`Size: ${chalk_1.default.cyan('5.2 MB')}`);
45
- (0, logger_1.info)(`Type: ${chalk_1.default.cyan(buildType)}`);
215
+ }
216
+ // 2b. Self-sign: auto-generate test keystore if --self-sign passed without --sign
217
+ if (isRelease && options.selfSign && !ks) {
218
+ const ssSpinner = (0, spinner_1.startSpinner)('Generating self-signed test keystore...');
219
+ try {
220
+ const ksPath = path_1.default.join(projectPath, 'jetstart-test.jks');
221
+ const { execSync } = require('child_process');
222
+ const tp = ['jetstart', 'test'].join('');
223
+ if (!require('fs-extra').existsSync(ksPath)) {
224
+ execSync('keytool -genkey -v -keystore "' + ksPath + '" -keyalg RSA -keysize 2048 -validity 3650' +
225
+ ' -alias jetstart-test -storepass ' + tp + ' -keypass ' + tp +
226
+ ' -dname "CN=JetStart Test, OU=Dev, O=JetStart, L=Local, ST=Local, C=US"', { stdio: 'ignore', timeout: 30000 });
227
+ }
228
+ ks = { storeFile: ksPath, storePassword: tp, keyAlias: 'jetstart-test', keyPassword: tp };
229
+ (0, spinner_1.stopSpinner)(ssSpinner, true, 'Self-signed test keystore ready (NOT for Play Store)');
230
+ }
231
+ catch (err) {
232
+ (0, spinner_1.stopSpinner)(ssSpinner, false, 'Failed to generate keystore: ' + err.message);
233
+ (0, logger_1.error)('Make sure JDK is installed and keytool is in your PATH.');
234
+ process.exit(1);
235
+ }
236
+ }
237
+ // 3. Security hardening (release only)
238
+ let originalGradle = null;
239
+ if (isRelease) {
240
+ const secSpinner = (0, spinner_1.startSpinner)('Applying release security hardening...');
241
+ try {
242
+ originalGradle = await clearJetStartFields(buildGradlePath);
243
+ if (ks)
244
+ await injectSigningConfig(buildGradlePath, ks);
245
+ (0, spinner_1.stopSpinner)(secSpinner, true, 'Dev-server credentials stripped · debuggable=false · R8 enabled');
246
+ }
247
+ catch (err) {
248
+ (0, spinner_1.stopSpinner)(secSpinner, false, 'Hardening failed: ' + err.message);
249
+ if (originalGradle)
250
+ await fs_extra_1.default.writeFile(buildGradlePath, originalGradle, 'utf-8');
251
+ process.exit(1);
252
+ }
253
+ }
254
+ // 4. Build
255
+ await fs_extra_1.default.ensureDir(outputDir);
256
+ const cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);
257
+ const variant = options.flavor
258
+ ? cap(options.flavor) + (isRelease ? 'Release' : 'Debug')
259
+ : isRelease ? 'Release' : 'Debug';
260
+ const task = (isBundle ? 'bundle' : 'assemble') + variant;
261
+ const gradleArgs = [task, '--parallel', '--build-cache', '--configure-on-demand', '--daemon', '--console=plain'];
262
+ const startTime = Date.now();
263
+ let buildResult = { code: 1 };
264
+ try {
265
+ buildResult = await runGradle(gradle, gradleArgs, projectPath);
266
+ }
267
+ finally {
268
+ if (originalGradle !== null) {
269
+ await fs_extra_1.default.writeFile(buildGradlePath, originalGradle, 'utf-8');
270
+ (0, logger_1.log)('[Build] build.gradle restored');
271
+ }
272
+ }
273
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
274
+ if (buildResult.code !== 0) {
46
275
  console.log();
276
+ (0, logger_1.error)('Build FAILED after ' + elapsed + 'see Gradle output above.');
277
+ process.exit(1);
47
278
  }
48
- catch (err) {
49
- (0, logger_1.error)(`Build failed: ${err.message}`);
279
+ // 5. Copy output
280
+ const outputPath = findOutput(projectPath, isRelease, isBundle, options.flavor);
281
+ if (!outputPath) {
282
+ (0, logger_1.error)('Build succeeded but output file not found. Check app/build/outputs/');
50
283
  process.exit(1);
51
284
  }
285
+ const ext = isBundle ? '.aab' : '.apk';
286
+ const suffix = (isRelease && !ks) ? '-unsigned' : '';
287
+ const destName = 'app-' + (isRelease ? 'release' : 'debug') + suffix + ext;
288
+ const destPath = path_1.default.join(outputDir, destName);
289
+ await fs_extra_1.default.copy(outputPath, destPath, { overwrite: true });
290
+ // 6. Summary
291
+ console.log();
292
+ (0, logger_1.success)(chalk_1.default.bold('Build complete in ' + elapsed + 's'));
293
+ console.log();
294
+ (0, logger_1.info)('Output: ' + chalk_1.default.cyan(destPath));
295
+ console.log();
296
+ if (isRelease && !ks) {
297
+ console.log();
298
+ }
299
+ if (isRelease && isBundle) {
300
+ console.log();
301
+ }
52
302
  }
53
303
  //# sourceMappingURL=build.js.map