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.
Files changed (3) hide show
  1. package/README.md +15 -12
  2. package/dist/numux.js +12 -8
  3. 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
- | `Alt+R` | Restart active process |
272
- | `Alt+Shift+R` | Restart all processes |
273
- | `Alt+S` | Stop/start active process |
274
- | `Alt+L` | Clear active pane output |
275
- | `Alt+1`–`Alt+9` | Jump to tab |
276
- | `Alt+Left/Right` | Cycle tabs |
277
- | `Up/Down` | Navigate between tabs |
278
- | `PageUp/PageDown` | Scroll output by page (non-interactive panes) |
279
- | `Home/End` | Scroll to top/bottom (non-interactive panes) |
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.5.2",
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(`npm: patterns require a package.json (looked in ${dir})`);
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 hasNpmPatterns = parsed.commands.some((c) => c.startsWith("npm:"));
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((c) => c.startsWith("npm:"));
2537
- const otherCommands = parsed.commands.filter((c) => !c.startsWith("npm:"));
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 = {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "numux",
3
- "version": "1.5.2",
3
+ "version": "1.6.0",
4
4
  "description": "Terminal multiplexer with dependency orchestration",
5
5
  "type": "module",
6
6
  "license": "MIT",