termkit 2.3.0 → 2.4.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
@@ -138,6 +138,31 @@ my-app help
138
138
  my-app serve help
139
139
  ```
140
140
 
141
+ Commands defined without an `.action()` print their help automatically when invoked. This makes parent commands that only group subcommands self-documenting — running `my-app` or `my-app serve` with no further input shows usage instead of erroring.
142
+
143
+ ### Shell
144
+
145
+ Turn a command tree into an interactive REPL. `Program.shell()` runs the root command's subcommands as a live prompt instead of parsing `process.argv` once.
146
+
147
+ ```ts
148
+ import { Program } from 'termkit'
149
+
150
+ // ...define commands with Program.command(...)
151
+
152
+ await Program.shell({ banner: 'myapp shell — type "help", "exit" to quit' })
153
+ ```
154
+
155
+ Two modes:
156
+
157
+ - **`drill`** (default) — step through the tree one level at a time. Each prompt lists the available subcommands; type a name to descend, `..` to go back up, `help` to print usage, or an exit command to quit. Leaf commands prompt for each declared variable in turn, then run. An empty line at the root exits.
158
+ - **`free`** — type full command lines as you would on the CLI, with Tab completion across the command tree. `exit`/`quit` to leave.
159
+
160
+ ```ts
161
+ await Program.shell({ mode: 'free', promptColor: '#a855f7' })
162
+ ```
163
+
164
+ Options: `mode` (`'drill' | 'free'`, default `'drill'`), `prompt` (free-mode prompt label, defaults to the root command name), `promptColor` (named color, hex string, or xterm number), `banner`, `exitCommands` (default `['exit', 'quit']`), `historySize` (default `100`).
165
+
141
166
  ### configure
142
167
 
143
168
  Sets global display options for the entire toolkit — accent color used in help output, tables, charts, and prompts; plus Unicode glyph support.
@@ -193,7 +218,7 @@ Pass `search: true` to add a type-to-filter input. Typing narrows the list; Back
193
218
  const pkg = await select('Pick a package:', packages, { search: true })
194
219
  ```
195
220
 
196
- Pass `maxHeight` to cap the visible rows and enable scrolling. The viewport follows the cursor automatically.
221
+ Pass `maxHeight` to cap the visible rows and enable scrolling. The viewport follows the cursor automatically. Even without `maxHeight`, the list is clamped to the terminal height so a long list never scrolls the screen.
197
222
 
198
223
  ```ts
199
224
  const tz = await select('Timezone?', timezones, { maxHeight: 8 })
@@ -236,7 +261,7 @@ Pass `search: true` to add a type-to-filter input. All printable characters go t
236
261
  const pkgs = await multiSelect('Add dependencies:', packages, { search: true })
237
262
  ```
238
263
 
239
- Pass `maxHeight` to cap the visible rows with auto-scrolling:
264
+ Pass `maxHeight` to cap the visible rows with auto-scrolling. As with `select`, the list is also clamped to the terminal height automatically so it never scrolls the screen.
240
265
 
241
266
  ```ts
242
267
  const regions = await multiSelect('Deploy to:', regions, { maxHeight: 6 })
@@ -521,17 +546,40 @@ console.log('CPU ' + Chart.Sparkline(samples, { style: (s) => Color.green(s) })
521
546
 
522
547
  Options: `min`, `max`, `style`.
523
548
 
524
- ### Bar — ETA and rate tracking
549
+ ### Bar
525
550
 
526
- Attach progress tracking to an animated `Bar` with `.track()` and `.tick()`.
551
+ Animated progress bar. Pass text as the first argument and options second:
527
552
 
528
553
  ```ts
529
554
  import { Bar } from 'termkit'
530
555
 
556
+ const bar = new Bar('Processing…', { progress: 0 })
557
+ bar.start()
558
+ ```
559
+
560
+ Update the inline label while running:
561
+
562
+ ```ts
563
+ bar.update('Uploading assets…')
564
+ ```
565
+
566
+ Write a persistent log line while the bar keeps running. The default glyph is a faint `·`; pass any string — plain or pre-colored — as the second argument to override it:
567
+
568
+ ```ts
569
+ bar.log('Processed batch 3')
570
+ bar.log('Skipped 4 files', '→')
571
+ bar.log('Error on item 12', Color.hex('#ef4444')('✖'))
572
+ bar.log('No glyph line', '')
573
+ ```
574
+
575
+ #### ETA and rate tracking
576
+
577
+ Attach progress tracking with `.track()` and `.tick()`:
578
+
579
+ ```ts
531
580
  const total = 500
532
- const bar = new Bar({ progress: 0 })
581
+ const bar = new Bar('Processing…', { progress: 0 })
533
582
  bar.track(total, { showRate: true, showEta: true, unit: 'files' })
534
- bar.message('Processing…')
535
583
  bar.start()
536
584
 
537
585
  for await (const item of items) {
@@ -539,7 +587,6 @@ for await (const item of items) {
539
587
  bar.tick()
540
588
  }
541
589
 
542
- bar.stop()
543
590
  bar.succeed(`Done — ${total} files processed`)
544
591
  ```
545
592
 
@@ -552,7 +599,23 @@ bar.rate // units per second (number)
552
599
  bar.eta // estimated seconds remaining (number)
553
600
  ```
554
601
 
555
- Options on `track(total, opts?)`: `unit` (label appended to rate), `showRate` (default `true`), `showEta` (default `true`). Both can also be set via constructor: `new Bar({ showRate: true, showEta: true, rateUnit: 'MB' })`.
602
+ Options on `track(total, opts?)`: `unit` (label appended to rate), `showRate` (default `true`), `showEta` (default `true`). Both can also be set via constructor options: `new Bar('Uploading…', { showRate: true, showEta: true, rateUnit: 'MB' })`.
603
+
604
+ #### Bar.current
605
+
606
+ `Bar.current` follows the same pattern as `Spinner.current` — set on `.start()`, cleared on any terminal method. Use it to reach the active bar from deep in processing loops or error handlers:
607
+
608
+ ```ts
609
+ const bar = new Bar('Processing…', { progress: 0 })
610
+ bar.track(total)
611
+ bar.start()
612
+
613
+ // from a utility function
614
+ Bar.current?.update('Flushing cache…')
615
+
616
+ // in a catch block
617
+ Bar.current?.fail(`Failed: ${err.message}`)
618
+ ```
556
619
 
557
620
  ### MultiBar
558
621
 
@@ -581,7 +644,7 @@ deploy.succeed('Deployed')
581
644
  multi.stop()
582
645
  ```
583
646
 
584
- Each `add()` call accepts the same options as `Bar` and returns a `Bar` instance — `.message()`, `.tick()`, `.track()`, `.progress`, and the completion methods all work the same way. Bars must be added before `.start()`.
647
+ Each `add()` call accepts the same options as `Bar` and returns a `Bar` instance — `.update()`, `.tick()`, `.track()`, `.progress`, and the completion methods all work the same way. Bars must be added before `.start()`.
585
648
 
586
649
  Options: `interval`.
587
650
 
@@ -592,7 +655,7 @@ Animated spinner for indeterminate work. Shares the same completion API as `Bar`
592
655
  ```ts
593
656
  import { Spinner } from 'termkit'
594
657
 
595
- const spinner = new Spinner({ text: 'Loading…' })
658
+ const spinner = new Spinner('Loading…')
596
659
  spinner.start()
597
660
 
598
661
  await doWork()
@@ -600,12 +663,30 @@ await doWork()
600
663
  spinner.succeed('Done')
601
664
  ```
602
665
 
666
+ Pass options as the second argument:
667
+
668
+ ```ts
669
+ const spinner = new Spinner('Thinking…', { frames: Spinner.FRAMES.dots, interval: 60 })
670
+ ```
671
+
603
672
  Update the inline label while running:
604
673
 
605
674
  ```ts
606
675
  spinner.update('Still working…')
607
676
  ```
608
677
 
678
+ Use `prefix` and `suffix` to bookend the text independently of the spinner frame, which always stays at the far left. Spaces between the parts are automatic:
679
+
680
+ ```ts
681
+ // renders: ⠋ 0 files copied
682
+ const spinner = new Spinner('files copied')
683
+ spinner.start()
684
+ spinner.prefix(String(count)) // ⠋ 42 files copied
685
+ spinner.suffix('(estimating…)') // ⠋ 42 files copied (estimating…)
686
+ ```
687
+
688
+ All three — `update()`, `prefix()`, and `suffix()` — are chainable and can be called while the spinner is running.
689
+
609
690
  Write a persistent log line while the spinner keeps running. The default glyph is a faint `·`; pass any string — plain or pre-colored — as the second argument to override it:
610
691
 
611
692
  ```ts
@@ -618,20 +699,39 @@ spinner.log('Fetched 42 items', '') // no glyph
618
699
  The completion methods accept a custom glyph color via `successColor`, `failColor`, `warnColor`, and `infoColor` — the glyph is colored, the message text is left unstyled:
619
700
 
620
701
  ```ts
621
- const spinner = new Spinner({ successColor: '#a855f7', failColor: '#ef4444' })
702
+ const spinner = new Spinner('Deploying…', { successColor: '#a855f7', failColor: '#ef4444' })
622
703
  spinner.succeed('Build complete') // purple ✔
623
704
  spinner.fail('Connection refused') // red ✖
624
705
  ```
625
706
 
707
+ #### Spinner.current
708
+
709
+ `Spinner.current` is automatically set to whichever spinner called `.start()` most recently, and cleared when it terminates. Use it to reach the active spinner from helpers, error handlers, or signal listeners without passing the instance around:
710
+
711
+ ```ts
712
+ // top-level handler
713
+ const spinner = new Spinner('Deploying…')
714
+ spinner.start()
715
+
716
+ // anywhere else in your app
717
+ Spinner.current?.update('Uploading assets…')
718
+
719
+ // in a catch block
720
+ Spinner.current?.fail(`Deploy failed: ${err.message}`)
721
+
722
+ // in a SIGTERM handler — ?. is intentional: a spinner may not be running
723
+ process.on('SIGTERM', () => Spinner.current?.stop('Interrupted'))
724
+ ```
725
+
626
726
  Built-in frame sets are available on `Spinner.FRAMES`:
627
727
 
628
728
  ```ts
629
- new Spinner({ frames: Spinner.FRAMES.dots, text: 'Thinking…' }).start()
729
+ new Spinner('Thinking…', { frames: Spinner.FRAMES.dots }).start()
630
730
  ```
631
731
 
632
732
  Frame sets: `braille`, `dots`, `line`, `arrow`, `bounce`.
633
733
 
634
- Options: `frames`, `text`, `prefix`, `suffix`, `reverse`, `interval`, `colors`, `bgColors`, `colorCycle`, `shimmer`, `successColor`, `failColor`, `warnColor`, `infoColor`, `glyphs`.
734
+ Options: `frames`, `prefix`, `suffix`, `reverse`, `interval`, `colors`, `bgColors`, `colorCycle`, `shimmer`, `successColor`, `failColor`, `warnColor`, `infoColor`, `glyphs`.
635
735
 
636
736
  ### Scrollbox
637
737
 
@@ -690,6 +790,7 @@ console.log(wrap(longParagraph, 60))
690
790
  | `Program.middleware` | `(fn) => fn` | Identity helper for typing middleware inline |
691
791
  | `Program.parse` | `(argv) => Promise<void>` | Parse argv using the root command |
692
792
  | `Program.setDefaults` | `(defaults) => void` | Apply middleware/options to all new commands |
793
+ | `Program.shell` | `(options?) => Promise<void>` | Run the command tree as an interactive REPL |
693
794
 
694
795
  ### Functions
695
796
 
@@ -712,11 +813,11 @@ console.log(wrap(longParagraph, 60))
712
813
 
713
814
  ### Classes
714
815
 
715
- `Command`, `Option`, `Variable`, `TermKit`, `Bar`, `MultiBar`, `Spinner`, `Scrollbox`, `Input`, `Select`, `MultiSelect`, `Log`, `Table`, `Column`, `Chart.Bar`, `Chart.VerticalBar`, `Chart.Heatmap`, `Chart.Scatter`, `Chart.Line`
816
+ `Command`, `Option`, `Variable`, `TermKit`, `Shell`, `Bar`, `MultiBar`, `Spinner`, `Scrollbox`, `Input`, `Select`, `MultiSelect`, `Log`, `Table`, `Column`, `Chart.Bar`, `Chart.VerticalBar`, `Chart.Heatmap`, `Chart.Scatter`, `Chart.Line`
716
817
 
717
818
  ### Types
718
819
 
719
- `ActionFn`, `MiddlewareFn`, `ParsedOptions`, `CommandDefaults`, `VariableType`, `BarMode`, `BarOptions`, `MultiBarOptions`, `SpinnerOptions`, `InputOptions`, `InputReturn`, `InputType`, `SelectItem`, `SelectOptions`, `MultiSelectItem`, `MultiSelectOptions`, `LogOptions`, `TableOptions`, `ColumnOptions`, `ColumnAlign`, `MarkupOptions`, `MarkupStyleFn`, `MarkupStyles`, `HelpColor`, `Chart.BarItem`, `Chart.BarOptions`, `Chart.VerticalBarItem`, `Chart.VerticalBarOptions`, `Chart.HeatmapOptions`, `Chart.ScatterPoint`, `Chart.ScatterOptions`, `Chart.LinePoint`, `Chart.LineOptions`, `Chart.SparklineOptions`
820
+ `ActionFn`, `MiddlewareFn`, `ParsedOptions`, `CommandDefaults`, `ShellOptions`, `VariableType`, `BarMode`, `BarOptions`, `MultiBarOptions`, `SpinnerOptions`, `InputOptions`, `InputReturn`, `InputType`, `SelectItem`, `SelectOptions`, `MultiSelectItem`, `MultiSelectOptions`, `LogOptions`, `TableOptions`, `ColumnOptions`, `ColumnAlign`, `MarkupOptions`, `MarkupStyleFn`, `MarkupStyles`, `HelpColor`, `Chart.BarItem`, `Chart.BarOptions`, `Chart.VerticalBarItem`, `Chart.VerticalBarOptions`, `Chart.HeatmapOptions`, `Chart.ScatterPoint`, `Chart.ScatterOptions`, `Chart.LinePoint`, `Chart.LineOptions`, `Chart.SparklineOptions`
720
821
 
721
822
  ## Authors
722
823
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Command } from '@/models/Command';
2
2
  import { Option } from '@/models/Option';
3
+ import type { ShellOptions } from '@/models/Shell';
3
4
  import type { MiddlewareFn } from '@/types';
4
5
  export type { HelpColor } from '@/config';
5
6
  export { configure } from '@/config';
@@ -24,6 +25,8 @@ export type { ScrollboxOptions } from '@/models/Scrollbox';
24
25
  export { Scrollbox, scrollbox } from '@/models/Scrollbox';
25
26
  export type { SelectItem, SelectOptions } from '@/models/Select';
26
27
  export { Select, select } from '@/models/Select';
28
+ export type { ShellOptions } from '@/models/Shell';
29
+ export { Shell } from '@/models/Shell';
27
30
  export type { SpinnerOptions } from '@/models/Spinner';
28
31
  export { Spinner } from '@/models/Spinner';
29
32
  export type { TableOptions } from '@/models/Table';
@@ -48,5 +51,6 @@ export declare const Program: {
48
51
  middleware: (fn: MiddlewareFn) => MiddlewareFn;
49
52
  parse: (arr: string[]) => Promise<void>;
50
53
  setDefaults: (data: CommandDefaults) => void;
54
+ shell: (options?: ShellOptions) => Promise<void>;
51
55
  };
52
56
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}