@libtmux/workspace-cli 0.1.0-alpha.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026- Tony Narlock
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,330 @@
1
+ # Workspace CLI
2
+
3
+ Manage tmux workspaces from YAML and JSON with Node.js 22.12+ or Bun 1.3.14+.
4
+ This local implementation is in development.
5
+
6
+ ## Build
7
+
8
+ Run from the repository root:
9
+
10
+ ```console
11
+ $ bun run --cwd packages/libtmux build
12
+ ```
13
+
14
+ ```console
15
+ $ bun run --cwd packages/workspace-cli build
16
+ ```
17
+
18
+ ```console
19
+ $ node packages/workspace-cli/dist/main.js --help
20
+ ```
21
+
22
+ ## Load and capture
23
+
24
+ Save this document as `workspace.yaml`:
25
+
26
+ ```yaml
27
+ session_name: dev
28
+ windows:
29
+ - window_name: editor
30
+ layout: main-vertical
31
+ panes:
32
+ - vim
33
+ - top
34
+ ```
35
+
36
+ Load on a separate tmux socket:
37
+
38
+ ```console
39
+ $ node packages/workspace-cli/dist/main.js load ./workspace.yaml \
40
+ -L workspace-cli-demo \
41
+ -d \
42
+ --json
43
+ ```
44
+
45
+ Capture its live topology:
46
+
47
+ ```console
48
+ $ node packages/workspace-cli/dist/main.js freeze dev \
49
+ -L workspace-cli-demo \
50
+ --json
51
+ ```
52
+
53
+ All native input layouts are checked before scripts run or sessions change.
54
+ Names accept unique abbreviations supported by the running daemon. Only
55
+ version-sensitive names query it; a cold endpoint uses the selected client.
56
+ Saved layouts require a valid checksum, a nonempty tree and enough pane cells.
57
+ tmux still owns geometry correction and pruning, and may reject a layout when
58
+ it is applied.
59
+ The CLI limits custom layouts to 8192 characters and 256 nested groups;
60
+ these are application limits, separate from tmux's parser.
61
+
62
+ One default differs from tmuxp on purpose: a window that names no `layout`
63
+ tiles its panes, where tmuxp stacks them by halving the last one. Explicit
64
+ `layout` and `focus` agree with tmuxp, and so does the pane left active when
65
+ nothing sets `focus`: the last pane created in the focused window.
66
+
67
+ [`@libtmux/workspace`](../workspace) is a separate implementation, not this
68
+ command's engine: it converges a session that already exists, and its strict
69
+ schema rejects `environment`, `before_script`, `window_index`,
70
+ `suppress_history`, `x-` keys and the other fields below. A document written
71
+ here is not necessarily one that package accepts.
72
+
73
+ Loading reuses an existing session, and compares it against the document rather
74
+ than rebuilding it: a window the document names that the session does not hold
75
+ is reported, exit 1, and nothing is changed. Without `-d`, load attaches the
76
+ final workspace or switches the current tmux client. Attachment uses the
77
+ controlling terminal, including when standard streams are redirected; no
78
+ terminal means failure before creating sessions. Inside tmux, attached load
79
+ stays on the current server; use `-d` to load on another server. Explicit append
80
+ adds windows to the current pane's session. A load that cannot finish a session
81
+ it created removes it, so a rerun starts clean; an append keeps the windows it
82
+ added and names them.
83
+
84
+ When clients share a session, tmux selects its most recently active client before
85
+ loading. The CLI captures that client and targets the switch explicitly.
86
+
87
+ Two `load`s racing on the same session name are not coordinated: tmux offers no
88
+ lock on a session that does not exist yet, so the loser's create can fail after
89
+ the winner's session exists, or both can observe no session and each start one.
90
+ Run concurrent loads against distinct session names.
91
+
92
+ `load -2` forces 256-color terminal handling. Legacy `-8` is rejected before
93
+ calling tmux because supported tmux versions do not implement that legacy flag.
94
+
95
+ Pane readiness waits apply before sending commands, whatever the pane's shell
96
+ is. Empty panes skip the wait, including with
97
+ `workspace_builder_options.pane_readiness: always`.
98
+
99
+ Explicit `window_index` values reserve their slots before implicit windows are
100
+ allocated from the effective `base-index`; `null` leaves the index unspecified.
101
+ Append also reserves indexes from later input files. Removing the temporary bootstrap window preserves requested
102
+ indexes and restores the prior local or inherited `renumber-windows` setting.
103
+ A failed restoration appears as `renumber_restore_error` in the load result.
104
+
105
+ Native `load` rejects unsupported fields before any input runs scripts or changes
106
+ tmux. The diagnostic includes the field path. For example, `entter: false` in a
107
+ command is an error; use `enter: false` to leave that command unsubmitted. A
108
+ key starting with `x-`, at any scope, is the exception: it is accepted,
109
+ ignored at load, and left alone by `convert`. The refusal for any other
110
+ unknown key names that prefix as the way to keep it.
111
+
112
+ | Scope | Accepted fields |
113
+ | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
114
+ | Workspace | `session_name`, `windows`, `start_directory`, `environment`, `shell_command_before`, `suppress_history`, `options`, `global_options`, `before_script`, `workspace_builder_options`, `plugins`, `workspace_builder`, `workspace_builder_paths`, `description` |
115
+ | Window | `window_name`, `window_index`, `panes`, `start_directory`, `environment`, `shell_command_before`, `suppress_history`, `options`, `options_after`, `layout`, `window_shell`, `focus`, `description` |
116
+ | Pane | `shell_command`, `shell_command_before`, `start_directory`, `environment`, `suppress_history`, `shell`, `focus`, `enter`, `sleep_before`, `sleep_after`, `description` |
117
+ | Command object | `cmd`, `enter`, `sleep_before`, `sleep_after` |
118
+ | `workspace_builder_options` | `pane_readiness` |
119
+
120
+ `description` is neutral metadata at workspace, window, and pane scope. Option
121
+ and environment maps retain their native names. Conversion preserves arbitrary
122
+ fields without applying the native execution contract. Documents delegated to
123
+ Python plugins or custom builders retain their extension fields; empty plugin
124
+ lists and blank builder names still use native validation.
125
+
126
+ ## Inspect a workspace through MCP
127
+
128
+ The separate [MCP server](../mcp/README.md) inspects loaded workspaces on the
129
+ same tmux socket. Build it from the repository root:
130
+
131
+ ```console
132
+ $ bun run --cwd packages/mcp build
133
+ ```
134
+
135
+ After the detached load above, configure your MCP client to launch `node` with
136
+ the built `packages/mcp/dist/server.js` as its argument. Use an absolute program
137
+ path if the client starts outside this repository. Set `LIBTMUX_SOCKET` to
138
+ `workspace-cli-demo` and `LIBTMUX_TOOLSETS` to `inspect` in that subprocess's
139
+ environment. The socket is selected when the MCP server starts.
140
+
141
+ For a workspace loaded with `-S`, set `LIBTMUX_SOCKET_PATH` to the same absolute
142
+ socket path instead of `LIBTMUX_SOCKET`. If the CLI uses `TMUX_BIN`, select that
143
+ executable with the MCP server's `LIBTMUX_TMUX_BIN` too.
144
+
145
+ Discover tools with `tools/list`, then call `list_sessions` and `list_panes`.
146
+ Call `list_windows` with `session` set to `dev`, the configuration's session
147
+ name. Pass a returned pane ID as `paneId` to `capture_pane` or `wait_for_text`;
148
+ bound output with `maxLines` and waits with `timeoutMs`. A pending text wait allows
149
+ other inspection requests on the same connection. Read `tmux://capabilities`
150
+ through `resources/read` to verify the selected socket and advertised tools.
151
+ See the [capture guide](../mcp/README.md#read-what-panes-show) for incremental
152
+ reads and cursors.
153
+
154
+ Closing the MCP subprocess's stdin cancels pending waits and joins its control
155
+ connections. The loaded workspace remains available in tmux.
156
+
157
+ ## Imports
158
+
159
+ `import tmuxinator` and `import teamocil` translate source documents and validate
160
+ native configuration fields before previewing or saving. Unknown fields,
161
+ conflicting non-null aliases and malformed command shapes fail without
162
+ replacing a destination. Generic `convert` preserves arbitrary fields.
163
+
164
+ Tmuxinator window command arrays stay in one pane. Explicit `panes` lists create
165
+ separate panes. Project `pre_window` arrays form one `; `-joined command; window
166
+ `pre` arrays form one `&&`-joined command before each explicit pane. Window
167
+ `pre` requires nonempty explicit panes. `synchronize: true` and `before` apply
168
+ before sequential pane creation and command delivery; `after` applies afterward.
169
+
170
+ Teamocil `commands` arrays form one `; `-joined command. Legacy `cmd` and `splits`
171
+ are accepted. Window options apply before pane commands. The first requested
172
+ window and pane focus wins; absent focus selects the first item. Both formats
173
+ retain window order, pane order and layouts.
174
+
175
+ Imports save an absolute project root relative to the invocation directory,
176
+ including when the source omits it. Window roots resolve relative to that root, so
177
+ moving the saved file preserves working directories. Import requires neither
178
+ tmux nor Python and does not check directory existence. Layout compatibility
179
+ is checked against the selected tmux during load. Commands use native load's
180
+ environment expansion from the invoking process before shell delivery.
181
+
182
+ Project lifecycle hooks, endpoint/runtime overrides, named pane titles,
183
+ Teamocil `clear`, filters and pane widths are refused. Use an explicit native
184
+ workspace or the source tool for those behaviors.
185
+
186
+ Tmuxinator expands ERB through Ruby before parsing; unexpanded `<%` markup in a
187
+ Tmuxinator key or value fails before output or overwrite. Teamocil evaluates no
188
+ templates, so `<%` in a Teamocil source is ordinary text and is preserved.
189
+
190
+ ## Output
191
+
192
+ Every command accepts `--json` and `--ndjson` before or after the command name.
193
+ NDJSON takes precedence when both are present. Machine load requires `-d` or
194
+ `--append`. Machine commands never prompt. Human output honors `--color` and
195
+ `NO_COLOR`; machine output contains encoded data without terminal styling.
196
+
197
+ `convert`, import commands, and machine `freeze` return a document when no
198
+ destination is given. `--save-to` writes a file; `--force` permits replacement.
199
+ The file format is separate from the JSON/NDJSON output mode.
200
+ `freeze` infers JSON from a `.json` destination and otherwise saves YAML;
201
+ `-f` overrides the inferred format. `--quiet` suppresses its human save message
202
+ and preserves machine results.
203
+ Capture accepts an exact session name or ID. Without one, it uses the authenticated
204
+ current pane's session or the sole session on the selected server. Several sessions
205
+ outside tmux require an explicit target.
206
+ Capture reads honor cancellation. Saves check for cancellation before publishing;
207
+ publication already in progress may still complete.
208
+
209
+ Human `load` shows progress on terminal stderr. `--progress-format` accepts
210
+ `default`, `minimal`, `window`, `pane`, `verbose`, or a template with tokens such
211
+ as `{session}`, `{window}`, and `{session_pane_progress}`. Pane counts advance
212
+ after configured commands are sent; they do not wait for those commands to exit.
213
+ `--progress-lines` controls the recent script-output panel: default 3, 0 forwards
214
+ each stream directly, and -1 uses the available terminal height. Retention is
215
+ bounded to 64 KiB of characters for completed lines and each partial stream.
216
+ `TMUXP_PROGRESS_FORMAT` and `TMUXP_PROGRESS_LINES` set defaults; explicit flags
217
+ take precedence. `--no-progress`, `TMUXP_PROGRESS=0`, a dumb terminal, or redirected
218
+ stderr disables the display. Frames update from build events without timing
219
+ sleeps, clip to terminal width, and clear before results or attachment.
220
+
221
+ `--log-level` filters diagnostics on stderr: `debug`, `info`, `warning` (default),
222
+ `error`, or `critical`. Machine diagnostics are NDJSON. `load --log-file` appends
223
+ the selected diagnostics as NDJSON, including script output at `info` level.
224
+ New log files use owner-only permissions. Nonregular destinations are rejected
225
+ before session creation; existing log contents are preserved.
226
+ If logging fails during execution, stderr reports `log_error` and the command
227
+ keeps its result and exit status. Cancellation closes the owned log handle.
228
+ Interrupting a blocked output write still joins owned children and exits 130.
229
+ An interrupted load allows up to 100ms to emit its final machine result before
230
+ exiting; an unread pipe cannot hold the process open. Cancelled output may be
231
+ incomplete.
232
+
233
+ Bootstrap and editor commands use quoted argv directly. Child output is UTF-8
234
+ with replacement for invalid bytes. Captured results retain at most 64 KiB of
235
+ source bytes per stream and report truncation; NDJSON forwards output as it
236
+ arrives. A nonzero editor status becomes the CLI exit status.
237
+ After a captured child exits, its streams have 100ms to drain before owned
238
+ descendants are stopped. Remaining capture streams close after group cleanup.
239
+
240
+ ## Python compatibility
241
+
242
+ Search uses native JavaScript regular expressions. `-F` treats patterns as
243
+ literal text; `-w` applies whole-word matching to the complete expression.
244
+ Python-specific regex syntax is outside the native search contract.
245
+
246
+ `shell` uses an interpreter with tmuxp 1.74.0 installed. Set
247
+ `TMUX_WORKSPACE_PYTHON` to choose its executable; otherwise it uses `python3`.
248
+ Code passed with `-c` runs in tmuxp's Python context. An interactive shell needs
249
+ a controlling terminal.
250
+
251
+ `load` uses the same optional interpreter when a workspace selects Python
252
+ `plugins` or a `workspace_builder`. Ordinary workspaces, empty plugin lists,
253
+ and blank builder names use the native builder without starting Python.
254
+ `workspace_builder_paths` adds existing import directories relative to the
255
+ workspace file. These directories contain executable extension code.
256
+
257
+ The adapter expands common configuration fields and supplies the tmuxp builder
258
+ protocol. Explicit custom builders may omit `windows` and consume their own
259
+ configuration. Append retains the authenticated current session across input
260
+ files. Python extension append rejects `before_script`; run that script
261
+ separately. Native append retains its bootstrap support.
262
+
263
+ Extension output uses the bounded child streams described above. Human progress
264
+ shows a workspace label and script output without native pane counters.
265
+ Extension results report `effects_scope: "observed"`, `effects_unknown: true`,
266
+ and newly observed window and pane IDs. These observations include concurrent
267
+ changes and do not establish ownership; failures do not roll back opaque
268
+ extension effects. Cancellation joins the owned Python process group, then
269
+ allows up to one second to observe surviving topology. A changed daemon or
270
+ failed observation is reported without comparing IDs across daemon lifetimes.
271
+
272
+ ## Reference and completion
273
+
274
+ The [command reference](docs/command-reference.md) and
275
+ [command metadata](docs/commands.json) come from the native parser. Regenerate
276
+ them after changing command definitions:
277
+
278
+ ```console
279
+ $ bun run --cwd packages/workspace-cli docs:generate
280
+ ```
281
+
282
+ The build checks that the reference and packaged completion scripts are current.
283
+ The scripts complete commands, options, enum values, and file paths without
284
+ starting Node, Bun, or tmux. Saved workspace names and live sessions are outside
285
+ their completion scope.
286
+
287
+ Completion is tested on Linux with Bash 5.2, Zsh 5.9, and fish 4.8. Bash 3.2 is
288
+ a syntax target; older shells and filenames containing newlines remain unverified.
289
+
290
+ After installing the local package, load the script for your shell. Bash:
291
+
292
+ ```console
293
+ $ source <(tmux-workspace completion bash)
294
+ ```
295
+
296
+ Zsh, with its completion system initialized:
297
+
298
+ ```console
299
+ $ autoload -Uz compinit && compinit && source <(tmux-workspace completion zsh)
300
+ ```
301
+
302
+ fish:
303
+
304
+ ```console
305
+ $ tmux-workspace completion fish | source
306
+ ```
307
+
308
+ For automation, `--json` and `--ndjson` wrap the script in a structured result.
309
+
310
+ ## Development status
311
+
312
+ Native discovery, conversion, imports, common searches, detached load, append,
313
+ capture, editor invocation, diagnostics, and the Python shell have executable
314
+ tests. The Linux installed-package check packs the CLI and core, installs both
315
+ offline into an empty project, and exercises every command in JSON and NDJSON
316
+ on Node 22 and Bun. It needs the optional Python runtime described above:
317
+
318
+ ```console
319
+ $ bun run --cwd packages/workspace-cli test:install
320
+ ```
321
+
322
+ Plugin and custom-builder execution has output, cancellation and borrowed-state
323
+ tests using the optional interpreter. Confirmation and destination choices use
324
+ explicit command-line flags. Native process and terminal evidence covers Linux;
325
+ macOS coverage is a package canary. Benchmark results cover isolated Linux
326
+ fixtures.
327
+
328
+ The core library keeps its zero-runtime-dependency contract. Commander, YAML,
329
+ and terminal text helpers are bundled into this CLI; `libtmux` remains a separate
330
+ package. Machine commands skip loading the progress renderer.
@@ -0,0 +1,183 @@
1
+ # Third-party notices
2
+
3
+ `tmux-workspace` is distributed as a bundle: the packages below are compiled
4
+ into `dist/` and their license terms are reproduced here in full, as those
5
+ terms require. `libtmux` is not bundled and carries its own notice.
6
+
7
+ ## ansi-regex 5.0.1
8
+
9
+ License: MIT
10
+
11
+ ```text
12
+ MIT License
13
+
14
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
15
+
16
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+ ```
22
+
23
+ ## ansi-styles 6.2.3
24
+
25
+ License: MIT
26
+
27
+ ```text
28
+ MIT License
29
+
30
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
31
+
32
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
33
+
34
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
35
+
36
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37
+ ```
38
+
39
+ ## cli-truncate 6.1.1
40
+
41
+ License: MIT
42
+
43
+ ```text
44
+ MIT License
45
+
46
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
47
+
48
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
49
+
50
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
51
+
52
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
53
+ ```
54
+
55
+ ## commander 15.0.0
56
+
57
+ License: MIT
58
+
59
+ ```text
60
+ (The MIT License)
61
+
62
+ Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
63
+
64
+ Permission is hereby granted, free of charge, to any person obtaining
65
+ a copy of this software and associated documentation files (the
66
+ 'Software'), to deal in the Software without restriction, including
67
+ without limitation the rights to use, copy, modify, merge, publish,
68
+ distribute, sublicense, and/or sell copies of the Software, and to
69
+ permit persons to whom the Software is furnished to do so, subject to
70
+ the following conditions:
71
+
72
+ The above copyright notice and this permission notice shall be
73
+ included in all copies or substantial portions of the Software.
74
+
75
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
76
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
77
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
78
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
79
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
80
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
81
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
82
+ ```
83
+
84
+ ## get-east-asian-width 1.6.0
85
+
86
+ License: MIT
87
+
88
+ ```text
89
+ MIT License
90
+
91
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
92
+
93
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
94
+
95
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
96
+
97
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
98
+ ```
99
+
100
+ ## is-fullwidth-code-point 5.1.0
101
+
102
+ License: MIT
103
+
104
+ ```text
105
+ MIT License
106
+
107
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
108
+
109
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
110
+
111
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
112
+
113
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
114
+ ```
115
+
116
+ ## slice-ansi 9.0.0
117
+
118
+ License: MIT
119
+
120
+ ```text
121
+ MIT License
122
+
123
+ Copyright (c) DC <threedeecee@gmail.com>
124
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
125
+
126
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
127
+
128
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
129
+
130
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
131
+ ```
132
+
133
+ ## string-width 8.2.2
134
+
135
+ License: MIT
136
+
137
+ ```text
138
+ MIT License
139
+
140
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
141
+
142
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
143
+
144
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
145
+
146
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
147
+ ```
148
+
149
+ ## strip-ansi 7.2.0
150
+
151
+ License: MIT
152
+
153
+ ```text
154
+ MIT License
155
+
156
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
157
+
158
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
159
+
160
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
161
+
162
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
163
+ ```
164
+
165
+ ## yaml 2.9.0
166
+
167
+ License: ISC
168
+
169
+ ```text
170
+ Copyright Eemeli Aro <eemeli@gmail.com>
171
+
172
+ Permission to use, copy, modify, and/or distribute this software for any purpose
173
+ with or without fee is hereby granted, provided that the above copyright notice
174
+ and this permission notice appear in all copies.
175
+
176
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
177
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
178
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
179
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
180
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
181
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
182
+ THIS SOFTWARE.
183
+ ```