@mmmbuto/nexuscli 0.9.10 → 0.9.11

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/CHANGELOG.md ADDED
@@ -0,0 +1,74 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [0.9.10] - 2026-01-09
6
+ ### Fixed
7
+ - Added PTY dependency check in postinstall to verify node-pty installation
8
+ - Added pty-termux-utils verification to ensure .cjs files are built
9
+ - Platform detection now installs correct PTY provider:
10
+ - `@mmmbuto/node-pty-android-arm64` for Termux
11
+ - `@lydell/node-pty-linux-arm64` for Linux ARM64
12
+ - Provides helpful error messages when PTY dependencies are missing
13
+ ## [0.9.11] - 2026-01-09
14
+ ### Fixed
15
+ - Added PTY dependency verification in postinstall
16
+ - Added platform-specific PTY provider installation
17
+ - Added @mmmbuto/pty-termux-utils installation check
18
+ - All PTY dependencies now verified during npm install
19
+ - Updated @mmmbuto/pty-termux-utils to ^1.1.2
20
+
21
+
22
+
23
+ ## [0.9.9] - 2026-01-01
24
+ ### Added
25
+ - Auto-update check on `nexuscli start` (npm + GitHub) with interactive prompt.
26
+ - `nexuscli update` / `nexuscli upgrade` command to update and restart server.
27
+ - Warnings when changing config while server is running.
28
+ - Live refresh of default model in UI (periodic + on focus).
29
+
30
+ ## [0.9.8] - 2025-12-30
31
+ ### Changed
32
+ - Update GLM routing to GLM-4.7 for Z.ai in Claude wrapper and model catalog.
33
+ ### Docs
34
+ - README updated for GLM-4.7 and release version.
35
+
36
+ ## [0.9.7004-termux] - 2025-12-28
37
+ ### Fixed
38
+ - Force Qwen model selection so `vision-model` is honored for image prompts.
39
+ - Parse Qwen stream-json tool events to keep statusbar live.
40
+ - Improve light theme contrast and update mobile statusbar theme colors.
41
+
42
+ ## [0.9.7-termux] - 2025-12-28
43
+ ### Added
44
+ - QWEN engine integration (Qwen Code CLI) with SSE streaming.
45
+ - QWEN models in catalog: `coder-model`, `vision-model`.
46
+ - QWEN session import + resume support.
47
+ ### Changed
48
+ - Statusbar now reflects QWEN tool activity in real time (stream-json parsing).
49
+
50
+ ## [0.9.6] - 2025-12-26
51
+ ### Fixed
52
+ - Restore Jobs CLI wrapper and Termux PTY adapter removed during cleanup.
53
+ - Use Termux-safe shell/runtime resolution for job execution (no hardcoded /bin or /usr/bin paths).
54
+ - Surface job stream errors correctly in the UI.
55
+
56
+ ## [0.9.5] - 2025-12-25
57
+ ### Added
58
+ - GPT-5.2 Codex set as default Codex model.
59
+ ### Changed
60
+ - Updated Codex model catalog to match OpenAI CLI.
61
+ ### Fixed
62
+ - i18n import after cleanup.
63
+
64
+ ## [0.9.4] - 2025-12-25
65
+ ### Added
66
+ - Dark/Light theme toggle with CSS variables and localStorage persistence.
67
+ - Rate limiting on chat endpoints (10 req/min per user).
68
+ - Architecture documentation (`docs/ARCHITECTURE.md`).
69
+
70
+ ## [0.9.3] - 2025-12-19
71
+ ### Fixed
72
+ - Normalize Termux workspace paths (auto-correct `/data/data/com/termux/...`) to prevent Claude spawn ENOENT and stalled GLM-4.6/DeepSeek runs.
73
+ - Workspaces API now filters and merges invalid paths to keep the UI dropdown clean.
74
+ - Session importer reads `cwd` from Claude session files when available for accurate workspace mapping.
package/README.md CHANGED
@@ -6,39 +6,18 @@
6
6
 
7
7
  ---
8
8
 
9
- ## Overview
10
-
11
- NexusCLI is a lightweight, Termux-first AI cockpit that orchestrates Claude Code, Codex CLI, Gemini CLI, and Qwen Code CLI from a single web/terminal UI. It supports live streaming, interrupts, session resume, workspace isolation, and remote voice input with auto HTTPS setup.
12
-
13
- ---
14
-
15
9
  [![npm](https://img.shields.io/npm/v/@mmmbuto/nexuscli?style=flat-square&logo=npm)](https://www.npmjs.com/package/@mmmbuto/nexuscli)
16
10
  [![downloads](https://img.shields.io/npm/dt/@mmmbuto/nexuscli?style=flat-square)](https://www.npmjs.com/package/@mmmbuto/nexuscli)
17
11
  [![ko-fi](https://img.shields.io/badge/☕_Support-Ko--fi-FF5E5B?style=flat-square&logo=ko-fi)](https://ko-fi.com/dionanos)
18
12
 
19
13
  ---
20
14
 
21
- ## Screenshots
15
+ ## Overview
22
16
 
23
- <p align="center">
24
- <img src="docs/assets/screenshots/nexuscli-multilang-preview.png" width="45%" />
25
- <img src="docs/assets/screenshots/nexuscli-mobile-glm.png" width="45%" />
26
- </p>
17
+ NexusCLI is a lightweight, Termux-first AI cockpit that orchestrates Claude Code, Codex CLI, Gemini CLI, and Qwen Code CLI from a single web/terminal UI. It supports live streaming, interrupts, session resume, workspace isolation, and remote voice input with auto HTTPS setup.
27
18
 
28
19
  ---
29
20
 
30
- ## Highlights (v0.9.9)
31
-
32
- - **Auto-update**: Update check on start (npm + GitHub) with interactive prompt
33
- - **Update command**: `nexuscli update` / `nexuscli upgrade` (stop → update → restart)
34
- - **Live default model**: UI refreshes config on focus/interval without restart
35
- - **Restart warnings**: CLI warns when changes require stop/start
36
-
37
- ### Stable (v0.9.9)
38
-
39
- - Update check is cached and non-blocking for normal startup
40
- - GitHub-only releases show a notice without prompting
41
-
42
21
  ## Features
43
22
 
44
23
  - Multi-engine orchestration (Claude, Codex, Gemini, Qwen)
@@ -52,6 +31,8 @@ NexusCLI is a lightweight, Termux-first AI cockpit that orchestrates Claude Code
52
31
  - Conversation search + pin/bookmark
53
32
  - Built-in jobs runner API for shell tasks
54
33
  - Config API + rate limiting on chat endpoints
34
+ - Auto-update check on start with interactive prompt
35
+ - `nexuscli update` command to update and restart server
55
36
 
56
37
  ## Supported Engines
57
38
 
@@ -65,6 +46,15 @@ NexusCLI is a lightweight, Termux-first AI cockpit that orchestrates Claude Code
65
46
 
66
47
  ---
67
48
 
49
+ ## Screenshots
50
+
51
+ <p align="center">
52
+ <img src="docs/assets/screenshots/nexuscli-multilang-preview.png" width="45%" />
53
+ <img src="docs/assets/screenshots/nexuscli-mobile-glm.png" width="45%" />
54
+ </p>
55
+
56
+ ---
57
+
68
58
  ## Install
69
59
 
70
60
  ```bash
@@ -128,8 +118,6 @@ nexuscli start
128
118
  | `nexuscli upgrade` | Alias for update |
129
119
  | `nexuscli uninstall` | Remove NexusCLI |
130
120
 
131
- ---
132
-
133
121
  > **Note**: On `nexuscli start`, an update check runs (cached) and will prompt in interactive shells.
134
122
 
135
123
  ## API Keys
@@ -195,8 +183,8 @@ engine CLIs alive in background; it spawns them on demand and resumes sessions.
195
183
  - Install Termux:Boot to auto-restart after reboot or app kill.
196
184
  - Keep a persistent notification (Termux:API helps prevent background kill).
197
185
 
198
- **Reduce battery usage (when you dont need it always-on):**
199
- - Stop the server when idle: `nexuscli stop`.
186
+ **Reduce battery usage (when you don't need it always-on):**
187
+ - Stop server when idle: `nexuscli stop`.
200
188
  - Disable wake-lock and notifications when not needed.
201
189
  - Prefer lighter models and lower reasoning settings.
202
190
 
@@ -240,11 +228,6 @@ npm run dev
240
228
 
241
229
  ---
242
230
 
243
- ## License
244
-
245
- MIT License.
246
- See `LICENSE` for details.
247
-
248
231
  ## PTY Support (Shared Library)
249
232
 
250
233
  NexusCLI uses `@mmmbuto/pty-termux-utils` as a shared library for PTY
@@ -260,3 +243,16 @@ management across all Termux CLI projects (Gemini, Qwen, Nexus).
260
243
  # Enable PTY debug logging
261
244
  PTY_DEBUG=1 nexuscli start
262
245
  ```
246
+
247
+ ---
248
+
249
+ ## Changelog
250
+
251
+ See [CHANGELOG.md](CHANGELOG.md) for version history.
252
+
253
+ ---
254
+
255
+ ## License
256
+
257
+ MIT License.
258
+ See `LICENSE` for details.
@@ -0,0 +1,183 @@
1
+ /**
2
+ * PTY Dependency Check for NexusCLI Post-Install
3
+ * Detects platform and installs appropriate PTY provider
4
+ */
5
+
6
+ const { execSync } = require('child_process');
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+
10
+ const colors = {
11
+ green: (s) => `\x1b[32m${s}\x1b[0m`,
12
+ yellow: (s) => `\x1b[33m${s}\x1b[0m`,
13
+ red: (s) => `\x1b[31m${s}\x1b[0m`,
14
+ cyan: (s) => `\x1b[36m${s}\x1b[0m`,
15
+ gray: (s) => `\x1b[90m${s}\x1b[0m`
16
+ };
17
+
18
+ function log(msg) { console.log(msg); }
19
+ function success(msg) { console.log(colors.green(` ✓ ${msg}`)); }
20
+ function warn(msg) { console.log(colors.yellow(` ⚠ ${msg}`)); }
21
+ function error(msg) { console.log(colors.red(` ✗ ${msg}`)); }
22
+
23
+ /**
24
+ * Detect platform
25
+ */
26
+ function detectPlatform() {
27
+ const isTermux =
28
+ process.env.PREFIX?.includes('com.termux') ||
29
+ fs.existsSync('/data/data/com.termux') ||
30
+ process.env.TERMUX_VERSION !== undefined;
31
+
32
+ const isLinuxArm64 = process.platform === 'linux' && process.arch === 'arm64';
33
+
34
+ if (isTermux) return 'termux';
35
+ if (isLinuxArm64) return 'linux-arm64';
36
+ return 'other';
37
+ }
38
+
39
+ /**
40
+ * Check if npm package is installed
41
+ */
42
+ function isNpmPackageInstalled(packageName) {
43
+ try {
44
+ const nodeModulesPath = path.join(__dirname, '..', '..', 'node_modules', packageName);
45
+ return fs.existsSync(nodeModulesPath);
46
+ } catch {
47
+ return false;
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Check if pty.node exists (native module)
53
+ */
54
+ function checkPtyNode() {
55
+ try {
56
+ const nodeModulesPath = path.join(__dirname, '..', '..', 'node_modules');
57
+
58
+ // Check @mmmbuto/node-pty-android-arm64
59
+ const androidPtyPath = path.join(nodeModulesPath, '@mmmbuto', 'node-pty-android-arm64', 'build', 'Release', 'pty.node');
60
+ if (fs.existsSync(androidPtyPath)) {
61
+ return { found: true, provider: '@mmmbuto/node-pty-android-arm64', path: androidPtyPath };
62
+ }
63
+
64
+ // Check @lydell/node-pty-linux-arm64
65
+ const linuxPtyPath = path.join(nodeModulesPath, '@lydell', 'node-pty-linux-arm64', 'build', 'Release', 'pty.node');
66
+ if (fs.existsSync(linuxPtyPath)) {
67
+ return { found: true, provider: '@lydell/node-pty-linux-arm64', path: linuxPtyPath };
68
+ }
69
+
70
+ return { found: false };
71
+ } catch {
72
+ return { found: false };
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Install PTY provider
78
+ */
79
+ function installPtyProvider(provider) {
80
+ try {
81
+ log(` Installing ${provider}...`);
82
+
83
+ const npmCmd = process.env.npm_execpath || 'npm';
84
+ execSync(`${npmCmd} install ${provider}`, {
85
+ stdio: 'inherit',
86
+ cwd: path.join(__dirname, '..', '..')
87
+ });
88
+
89
+ success(`${provider} installed`);
90
+ return true;
91
+ } catch (err) {
92
+ warn(`${provider} installation failed: ${err.message}`);
93
+ return false;
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Main PTY check function
99
+ */
100
+ function checkPtyDependencies() {
101
+ console.log('');
102
+ console.log(colors.cyan('Checking PTY dependencies:'));
103
+
104
+ const platform = detectPlatform();
105
+ let targetProvider = null;
106
+
107
+ // Determine target provider based on platform
108
+ if (platform === 'termux') {
109
+ targetProvider = '@mmmbuto/node-pty-android-arm64';
110
+ } else if (platform === 'linux-arm64') {
111
+ targetProvider = '@lydell/node-pty-linux-arm64';
112
+ } else {
113
+ log(colors.gray(' Skipped: Unsupported platform for PTY (not Termux/Linux ARM64)'));
114
+ log(colors.gray(' PTY will use fallback adapter (child_process)'));
115
+ return;
116
+ }
117
+
118
+ // Check if PTY native module exists
119
+ const ptyCheck = checkPtyNode();
120
+
121
+ if (ptyCheck.found) {
122
+ success(`Native PTY found: ${ptyCheck.provider}`);
123
+ } else {
124
+ // Check if package is installed but pty.node is missing
125
+ if (isNpmPackageInstalled(targetProvider)) {
126
+ warn(`${targetProvider} installed but pty.node missing - may need rebuild`);
127
+ warn(` Run: npm rebuild ${targetProvider}`);
128
+ } else {
129
+ warn(`${targetProvider} not installed`);
130
+ }
131
+
132
+ // Try to install
133
+ const installed = installPtyProvider(targetProvider);
134
+ if (installed) {
135
+ // Verify installation
136
+ const verify = checkPtyNode();
137
+ if (verify.found) {
138
+ success(`Native PTY verified: ${verify.provider}`);
139
+ } else {
140
+ warn(`PTY package installed but pty.node not found`);
141
+ warn(` You may need to rebuild: npm rebuild ${targetProvider}`);
142
+ }
143
+ } else {
144
+ warn(`Cannot install ${targetProvider} - PTY will use fallback`);
145
+ }
146
+ }
147
+
148
+ console.log('');
149
+ }
150
+
151
+
152
+ /**
153
+ * Check if pty-termux-utils is installed and has .cjs files
154
+ */
155
+ function checkPtyTermuxUtils() {
156
+ try {
157
+ const ptyUtilsPath = path.join(__dirname, '..', '..', 'node_modules', '@mmmbuto', 'pty-termux-utils');
158
+
159
+ if (!fs.existsSync(ptyUtilsPath)) {
160
+ warn('@mmmbuto/pty-termux-utils not installed');
161
+ warn(' This is required for PTY support');
162
+ warn(' Run: npm install @mmmbuto/pty-termux-utils');
163
+ return false;
164
+ }
165
+
166
+ const indexCjsPath = path.join(ptyUtilsPath, 'dist', 'index.cjs');
167
+ if (fs.existsSync(indexCjsPath)) {
168
+ success('@mmmbuto/pty-termux-utils installed with CJS support');
169
+ return true;
170
+ } else {
171
+ warn('@mmmbuto/pty-termux-utils installed but .cjs files missing');
172
+ warn(' Run: cd node_modules/@mmmbuto/pty-termux-utils && npm run build:cjs');
173
+ return false;
174
+ }
175
+ } catch (err) {
176
+ warn('Error checking @mmmbuto/pty-termux-utils: ' + err.message);
177
+ return false;
178
+ }
179
+ }
180
+
181
+ module.exports = { checkPtyDependencies ,
182
+ checkPtyTermuxUtils
183
+ };
@@ -4,6 +4,8 @@
4
4
  * Termux-only: auto-run wizard if not configured
5
5
  */
6
6
 
7
+
8
+ const { checkPtyDependencies, checkPtyTermuxUtils } = require('./postinstall-pty-check');
7
9
  const { execSync, spawn } = require('child_process');
8
10
  const fs = require('fs');
9
11
  const path = require('path');
@@ -22,7 +24,6 @@ const colors = {
22
24
  red: (s) => `\x1b[31m${s}\x1b[0m`,
23
25
  cyan: (s) => `\x1b[36m${s}\x1b[0m`,
24
26
  bold: (s) => `\x1b[1m${s}\x1b[0m`,
25
- gray: (s) => `\x1b[90m${s}\x1b[0m`
26
27
  };
27
28
 
28
29
  function log(msg) {
@@ -144,6 +145,15 @@ async function main() {
144
145
  for (const pkg of packages) {
145
146
  installPackage(pkg);
146
147
  }
148
+
149
+ // Check PTY dependencies
150
+ checkPtyDependencies();
151
+
152
+ // Check pty-termux-utils
153
+ checkPtyTermuxUtils();
154
+
155
+ // Check pty-termux-utils
156
+ checkPtyTermuxUtils();
147
157
  console.log('');
148
158
 
149
159
  // Create directories
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmmbuto/nexuscli",
3
- "version": "0.9.10",
3
+ "version": "0.9.11",
4
4
  "description": "NexusCLI - TRI CLI Control Plane (Claude/Codex/Gemini/Qwen)",
5
5
  "main": "lib/server/server.js",
6
6
  "bin": {
@@ -44,6 +44,7 @@
44
44
  "frontend/dist/",
45
45
  "package.json",
46
46
  "README.md",
47
+ "CHANGELOG.md",
47
48
  "LICENSE"
48
49
  ],
49
50
  "engines": {
@@ -58,7 +59,7 @@
58
59
  "x64"
59
60
  ],
60
61
  "dependencies": {
61
- "@mmmbuto/pty-termux-utils": "^1.1.0",
62
+ "@mmmbuto/pty-termux-utils": "^1.1.2",
62
63
  "bcryptjs": "^3.0.3",
63
64
  "chalk": "^4.1.2",
64
65
  "commander": "^12.1.0",
@@ -80,4 +81,4 @@
80
81
  "optionalDependencies": {
81
82
  "@mmmbuto/node-pty-android-arm64": "~1.1.0"
82
83
  }
83
- }
84
+ }