numux 1.5.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -12
- package/dist/numux.js +12 -8
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -268,18 +268,15 @@ Persistent processes that crash are auto-restarted with exponential backoff (1s
|
|
|
268
268
|
| Key | Action |
|
|
269
269
|
|-----|--------|
|
|
270
270
|
| `Ctrl+C` | Quit (graceful shutdown) |
|
|
271
|
-
| `
|
|
272
|
-
| `
|
|
273
|
-
| `
|
|
274
|
-
| `
|
|
275
|
-
| `
|
|
276
|
-
| `
|
|
277
|
-
| `
|
|
278
|
-
| `PageUp/PageDown` | Scroll output by page
|
|
279
|
-
| `Home/End` | Scroll to top/bottom
|
|
280
|
-
| `Alt+PageUp/PageDown` | Scroll output up/down |
|
|
281
|
-
| `Alt+Home/End` | Scroll to top/bottom |
|
|
282
|
-
| `Alt+F` | Search in active pane output |
|
|
271
|
+
| `R` | Restart active process |
|
|
272
|
+
| `Shift+R` | Restart all processes |
|
|
273
|
+
| `S` | Stop/start active process |
|
|
274
|
+
| `L` | Clear active pane output |
|
|
275
|
+
| `F` | Search in active pane output |
|
|
276
|
+
| `1`–`9` | Jump to tab |
|
|
277
|
+
| `Left/Right` | Cycle tabs |
|
|
278
|
+
| `PageUp/PageDown` | Scroll output by page |
|
|
279
|
+
| `Home/End` | Scroll to top/bottom |
|
|
283
280
|
|
|
284
281
|
While searching: type to filter, `Enter`/`Shift+Enter` to navigate matches, `Escape` to close.
|
|
285
282
|
|
|
@@ -298,6 +295,12 @@ Panes are readonly by default — keyboard input is not forwarded to processes.
|
|
|
298
295
|
| ✖ | Failed |
|
|
299
296
|
| ⊘ | Skipped |
|
|
300
297
|
|
|
298
|
+
## Dependencies
|
|
299
|
+
|
|
300
|
+
### ghostty-opentui
|
|
301
|
+
|
|
302
|
+
Despite the name, [`ghostty-opentui`](https://github.com/user/ghostty-opentui) is **not** a compatibility layer for the [Ghostty](https://ghostty.org) terminal. It uses Ghostty's Zig-based VT parser as the ANSI terminal emulation engine for OpenTUI's terminal renderable. It works in any terminal emulator (iTerm, Kitty, Alacritty, WezTerm, etc.) and adds ~8MB to install size due to native binaries.
|
|
303
|
+
|
|
301
304
|
## License
|
|
302
305
|
|
|
303
306
|
MIT
|
package/dist/numux.js
CHANGED
|
@@ -22,7 +22,7 @@ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports,
|
|
|
22
22
|
var require_package = __commonJS((exports, module) => {
|
|
23
23
|
module.exports = {
|
|
24
24
|
name: "numux",
|
|
25
|
-
version: "1.
|
|
25
|
+
version: "1.6.0",
|
|
26
26
|
description: "Terminal multiplexer with dependency orchestration",
|
|
27
27
|
type: "module",
|
|
28
28
|
license: "MIT",
|
|
@@ -382,15 +382,18 @@ function detectPackageManager(pkgJson, cwd) {
|
|
|
382
382
|
}
|
|
383
383
|
return "npm";
|
|
384
384
|
}
|
|
385
|
+
function isGlobPattern(name) {
|
|
386
|
+
return /[*?[]/.test(name);
|
|
387
|
+
}
|
|
385
388
|
function expandScriptPatterns(config, cwd) {
|
|
386
389
|
const entries = Object.entries(config.processes);
|
|
387
|
-
const hasWildcard = entries.some(([name]) => name.startsWith("npm:"));
|
|
390
|
+
const hasWildcard = entries.some(([name]) => name.startsWith("npm:") || isGlobPattern(name));
|
|
388
391
|
if (!hasWildcard)
|
|
389
392
|
return config;
|
|
390
393
|
const dir = config.cwd ?? cwd ?? process.cwd();
|
|
391
394
|
const pkgPath = resolve(dir, "package.json");
|
|
392
395
|
if (!existsSync(pkgPath)) {
|
|
393
|
-
throw new Error(`
|
|
396
|
+
throw new Error(`Wildcard patterns require a package.json (looked in ${dir})`);
|
|
394
397
|
}
|
|
395
398
|
const pkgJson = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
396
399
|
const scripts = pkgJson.scripts;
|
|
@@ -401,11 +404,11 @@ function expandScriptPatterns(config, cwd) {
|
|
|
401
404
|
const pm = detectPackageManager(pkgJson, dir);
|
|
402
405
|
const expanded = {};
|
|
403
406
|
for (const [name, value] of entries) {
|
|
404
|
-
if (!name.startsWith("npm:")) {
|
|
407
|
+
if (!(name.startsWith("npm:") || isGlobPattern(name))) {
|
|
405
408
|
expanded[name] = value;
|
|
406
409
|
continue;
|
|
407
410
|
}
|
|
408
|
-
const pattern = name.slice(4);
|
|
411
|
+
const pattern = name.startsWith("npm:") ? name.slice(4) : name;
|
|
409
412
|
const template = value ?? {};
|
|
410
413
|
if (template.command) {
|
|
411
414
|
throw new Error(`"${name}": wildcard processes cannot have a "command" field (commands come from package.json scripts)`);
|
|
@@ -2531,10 +2534,11 @@ async function main() {
|
|
|
2531
2534
|
let config;
|
|
2532
2535
|
const warnings = [];
|
|
2533
2536
|
if (parsed.commands.length > 0 || parsed.named.length > 0) {
|
|
2534
|
-
const
|
|
2537
|
+
const isScriptPattern = (c) => c.startsWith("npm:") || /[*?[]/.test(c);
|
|
2538
|
+
const hasNpmPatterns = parsed.commands.some(isScriptPattern);
|
|
2535
2539
|
if (hasNpmPatterns) {
|
|
2536
|
-
const npmPatterns = parsed.commands.filter(
|
|
2537
|
-
const otherCommands = parsed.commands.filter((c) => !c
|
|
2540
|
+
const npmPatterns = parsed.commands.filter(isScriptPattern);
|
|
2541
|
+
const otherCommands = parsed.commands.filter((c) => !isScriptPattern(c));
|
|
2538
2542
|
const processes = {};
|
|
2539
2543
|
for (const pattern of npmPatterns) {
|
|
2540
2544
|
const entry = {};
|