numux 2.17.3 → 2.18.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 CHANGED
@@ -286,6 +286,7 @@ Top-level options apply to all processes (process-level settings override):
286
286
  | `noWatch` | `boolean` | Disable file watching even if processes have watch patterns |
287
287
  | `logDir` | `string` | Directory to write per-process log files |
288
288
  | `theme` | `ThemePref` | TUI color theme. `'auto'` detects the terminal background via OSC 11 (falling back to `COLORFGBG` then dark). `'light'`/`'dark'` skip detection. |
289
+ | `autowrap` | `boolean` | Whether to leave the host terminal's autowrap (DECAWM) enabled. Set `false` to have numux disable host autowrap (`\x1b[?7l`) on startup, restoring it on exit. This works around an OpenTUI renderer bug where a run that fills the last screen column wraps right-pane output into the tab sidebar ([anomalyco/opentui#1187](https://github.com/anomalyco/opentui/issues/1187)). Pane content still wraps within its own grid — only the host emit-cursor wrap is turned off. Leave enabled (the default) unless you hit the smear. |
289
290
  <!-- /generated:config-global -->
290
291
 
291
292
  ```ts
package/dist/man/numux.1 CHANGED
@@ -1,4 +1,4 @@
1
- .TH "NUMUX" "1" "June 2026" "2.17.3" "numux manual"
1
+ .TH "NUMUX" "1" "June 2026" "2.18.0" "numux manual"
2
2
  .SH "NAME"
3
3
  \fBnumux\fR
4
4
  .P
@@ -552,6 +552,18 @@ T}|T{
552
552
  T}|T{
553
553
  TUI color theme\. \fB&#39;auto&#39;\fP detects the terminal background via OSC 11 (falling back to \fBCOLORFGBG\fP then dark)\. \fB&#39;light&#39;\fP/\fB&#39;dark&#39;\fP skip detection\.
554
554
  T}
555
+ _
556
+ T{
557
+ \fBautowrap\fP
558
+ T}|T{
559
+ \fBboolean\fP
560
+ T}|T{
561
+ Whether to leave the host terminal's autowrap (DECAWM) enabled\. Set \fBfalse\fP to have numux disable host autowrap (\fB\\x1b[?7l\fP) on startup, restoring it on exit\. This works around an OpenTUI renderer bug where a run that fills the last screen column wraps right\-pane output into the tab sidebar (
562
+ .UR https://github.com/anomalyco/opentui/issues/1187
563
+ .I anomalyco/opentui#1187
564
+ .UE
565
+ )\. Pane content still wraps within its own grid — only the host emit\-cursor wrap is turned off\. Leave enabled (the default) unless you hit the smear\.
566
+ T}
555
567
  .TE
556
568
  <!\-\- /generated:config\-global \-\->
557
569
 
package/dist/numux.js CHANGED
@@ -292,6 +292,7 @@ numux logs api | tail -f # Follow process log output
292
292
  | \`noWatch\` | \`boolean\` | Disable file watching even if processes have watch patterns |
293
293
  | \`logDir\` | \`string\` | Directory to write per-process log files |
294
294
  | \`theme\` | \`ThemePref\` | TUI color theme. \`'auto'\` detects the terminal background via OSC 11 (falling back to \`COLORFGBG\` then dark). \`'light'\`/\`'dark'\` skip detection. |
295
+ | \`autowrap\` | \`boolean\` | Whether to leave the host terminal's autowrap (DECAWM) enabled. Set \`false\` to have numux disable host autowrap (\`\\x1b[?7l\`) on startup, restoring it on exit. This works around an OpenTUI renderer bug where a run that fills the last screen column wraps right-pane output into the tab sidebar ([anomalyco/opentui#1187](https://github.com/anomalyco/opentui/issues/1187)). Pane content still wraps within its own grid \u2014 only the host emit-cursor wrap is turned off. Leave enabled (the default) unless you hit the smear. |
295
296
  <!-- /generated:config-global -->
296
297
 
297
298
  \`\`\`ts
@@ -885,7 +886,7 @@ var init_help = __esm(() => {
885
886
  var require_package = __commonJS((exports, module) => {
886
887
  module.exports = {
887
888
  name: "numux",
888
- version: "2.17.3",
889
+ version: "2.18.0",
889
890
  description: "Terminal multiplexer with dependency orchestration",
890
891
  type: "module",
891
892
  license: "MIT",
@@ -2133,6 +2134,7 @@ function validateConfig(raw, _warnings) {
2133
2134
  const noWatch = config.noWatch === true ? true : undefined;
2134
2135
  const logDir = typeof config.logDir === "string" && config.logDir.trim() ? config.logDir.trim() : undefined;
2135
2136
  const theme = validateTheme(config.theme);
2137
+ const autowrap = config.autowrap === false ? false : undefined;
2136
2138
  const validated = {};
2137
2139
  for (const name of names) {
2138
2140
  let proc = processes[name];
@@ -2232,6 +2234,7 @@ function validateConfig(raw, _warnings) {
2232
2234
  ...noWatch ? { noWatch } : {},
2233
2235
  ...logDir ? { logDir } : {},
2234
2236
  ...theme ? { theme } : {},
2237
+ ...autowrap === false ? { autowrap: false } : {},
2235
2238
  processes: validated
2236
2239
  };
2237
2240
  }
@@ -4997,7 +5000,9 @@ class App {
4997
5000
  useMouse: true,
4998
5001
  useKittyKeyboard: {}
4999
5002
  });
5000
- this.forceFullRepaints(this.renderer);
5003
+ if (this.config.autowrap === false) {
5004
+ this.disableAutowrap();
5005
+ }
5001
5006
  const { width, height } = this.renderer;
5002
5007
  const maxNameLen = Math.max(...this.names.map((n) => n.length));
5003
5008
  this.sidebarWidth = Math.min(30, Math.max(16, maxNameLen + 5));
@@ -5280,15 +5285,8 @@ class App {
5280
5285
  }
5281
5286
  }
5282
5287
  }
5283
- forceFullRepaints(renderer) {
5284
- const r = renderer;
5285
- if (!("forceFullRepaintRequested" in r)) {
5286
- log("warning: @opentui/core has no forceFullRepaintRequested flag \u2014 render-drift workaround inactive");
5287
- return;
5288
- }
5289
- renderer.setFrameCallback(async () => {
5290
- r.forceFullRepaintRequested = true;
5291
- });
5288
+ disableAutowrap() {
5289
+ process.stdout.write("\x1B[?7l");
5292
5290
  }
5293
5291
  switchPane(name) {
5294
5292
  if (this.activePane === name)
@@ -5390,6 +5388,9 @@ class App {
5390
5388
  for (const pane of this.panes.values()) {
5391
5389
  pane.destroy();
5392
5390
  }
5391
+ if (this.config.autowrap === false) {
5392
+ process.stdout.write("\x1B[?7h");
5393
+ }
5393
5394
  if (!this.renderer.isDestroyed) {
5394
5395
  this.renderer.destroy();
5395
5396
  }
package/dist/types.d.ts CHANGED
@@ -129,6 +129,18 @@ export interface NumuxConfig<K extends string = string> {
129
129
  * @default 'auto'
130
130
  */
131
131
  theme?: ThemePref;
132
+ /**
133
+ * Whether to leave the host terminal's autowrap (DECAWM) enabled.
134
+ *
135
+ * Set `false` to have numux disable host autowrap (`\x1b[?7l`) on startup,
136
+ * restoring it on exit. This works around an OpenTUI renderer bug where a run
137
+ * that fills the last screen column wraps right-pane output into the tab
138
+ * sidebar ([anomalyco/opentui#1187](https://github.com/anomalyco/opentui/issues/1187)).
139
+ * Pane content still wraps within its own grid — only the host emit-cursor
140
+ * wrap is turned off. Leave enabled (the default) unless you hit the smear.
141
+ * @default true
142
+ */
143
+ autowrap?: boolean;
132
144
  processes: Record<K, NumuxProcessConfig<K> | NumuxScriptPattern<K> | string | true>;
133
145
  }
134
146
  export type SortOrder = 'config' | 'alphabetical' | 'topological' | 'status';
@@ -146,6 +158,7 @@ export interface ResolvedNumuxConfig {
146
158
  noWatch?: boolean;
147
159
  logDir?: string;
148
160
  theme?: ThemePref;
161
+ autowrap?: boolean;
149
162
  processes: Record<string, ResolvedProcessConfig>;
150
163
  }
151
164
  export type ProcessStatus = 'pending' | 'starting' | 'ready' | 'running' | 'stopping' | 'stopped' | 'finished' | 'failed' | 'skipped';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "numux",
3
- "version": "2.17.3",
3
+ "version": "2.18.0",
4
4
  "description": "Terminal multiplexer with dependency orchestration",
5
5
  "type": "module",
6
6
  "license": "MIT",