github-search-cli 9.8.3 → 9.10.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/CHANGELOG.md CHANGED
@@ -6,6 +6,129 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Publish
6
6
 
7
7
  ---
8
8
 
9
+ ## [9.10.0] — 2026-10-03 (released)
10
+
11
+ ### Added
12
+
13
+ - **The TUI is now fully clickable.** The mouse was already enabled — OpenTUI
14
+ emits SGR mouse tracking and hit-tests every event — but nothing consumed the
15
+ events, so they were silently discarded. Every list, card, tab and button now
16
+ responds:
17
+ - **Click** selects a row; the detail pane updates exactly as it does with
18
+ `↑`/`↓`, because clicks ride the same `selectionChanged` event the keyboard
19
+ already used.
20
+ - **Double-click** opens the repo in your browser, or runs the overlay's
21
+ action — the same code path as `Enter`, so the two can't drift apart.
22
+ - **Scroll wheel** moves the selection in a list and scrolls long panes
23
+ (README, help, org profile, update notes). This also fixes a pre-existing
24
+ bug: the wheel previously fell through to whichever renderable held focus,
25
+ so scrolling while the README viewer was open scrolled the wrong pane.
26
+ - **Click outside an overlay** dismisses it, the same as `Esc`.
27
+ - Landing cards, trending tabs, the update dialog's buttons, and every
28
+ overlay list (history, bookmarks, saved searches, topics, export, share,
29
+ command menu) are clickable. Hovering shows a pointer cursor and lifts the
30
+ row background.
31
+ - **A <kbd>☰ menu</kbd> button in the bottom-right corner** opens the command
32
+ menu. It floats above the layout and hides while an overlay is open.
33
+
34
+ ### Changed
35
+
36
+ - **`Esc` now opens the command menu; `Space` no longer does.** `Space` opened
37
+ the menu only while the query input was _not_ focused, which made one key mean
38
+ two different things depending on invisible state — and it meant `Space` could
39
+ not type a space in a query. More confusingly, it worked only _after_ you had
40
+ clicked a result row: clicking moved focus to the list as a side effect of
41
+ OpenTUI's auto-focus-on-press, and `Space` was gated on that focus being gone.
42
+ `Esc` is now the sole binding (it already closed overlays), and `Space` always
43
+ types. The bottom-right <kbd>☰ menu</kbd> button covers mouse users.
44
+ - Help, the README keybinding tables and `docs/HOW-TO.md` now document the mouse
45
+ bindings and the `Esc` menu binding.
46
+
47
+ ### Fixed
48
+
49
+ - **Non-interactive text no longer swallows clicks.** Every `TextRenderable`
50
+ defaults to OpenTUI's `selectable: true`, and a left-press on a selectable
51
+ renderable is consumed as a text-selection drag before the app's own handlers
52
+ run. The detail pane, comparison table, tab bar and other read-only text now
53
+ opt out, so clicks over them behave.
54
+ - **A hover highlight no longer painted the list magenta.** OpenTUI's colour
55
+ parser accepts only hex and CSS names; an `rgba(...)` hover tint silently
56
+ resolved to its magenta fallback. Now expressed as 8-digit hex.
57
+
58
+ ---
59
+
60
+ ## [9.9.0] — 2026-10-01 (released)
61
+
62
+ ### Added
63
+
64
+ - **Queries are understood instead of passed through.** Every surface —
65
+ TUI, CLI, MCP, `--watch` — now parses and checks a query before spending an
66
+ API call, so a typo or a malformed value fails with a specific, actionable
67
+ message instead of an opaque 422 or a misleading "network error".
68
+ - Misspelled qualifiers are corrected: `langauge:Rust` → `language:Rust`,
69
+ `star:1000` → `stars:1000`, `push:>2024-01-01` → `pushed:>2024-01-01`.
70
+ Correction is scoped to the qualifiers ghfind knows, so a qualifier it has
71
+ never heard of (`is:`, `has:`, `props.*`) is passed through untouched
72
+ rather than mangled into something else.
73
+ - Counts accept `k`/`m` sugar: `stars:10k` → `stars:>=10000`,
74
+ `size:1m` → `size:>=1000000`, `stars:1k..10k` → `stars:1000..10000`.
75
+ A bare count keeps GitHub's exact-match meaning — `stars:100` still means
76
+ exactly 100.
77
+ - Values are validated per qualifier: numeric counts, `fork:true|false|only`,
78
+ `archived:true|false`, ISO8601 dates for `created`/`pushed`/`updated`,
79
+ the `visibility:` enum, and the `in:` searchable fields. An invalid value
80
+ reports the bad token and the fix, e.g. `⚠ Invalid query: "stars:abc" is
81
+ not a number — use stars:100, stars:>=100, or stars:1k..10k`.
82
+ - `validateQuery` is now called by the CLI, the MCP server and `--watch`, not
83
+ just the TUI. Previously only the TUI enforced the one existing rule.
84
+ - **Zero-result searches now suggest how to loosen the query.** Qualifiers are
85
+ ranked by how sharply they narrow results — a star or size threshold empties
86
+ a result set outright, so those are loosened first — and each suggestion
87
+ rewrites one qualifier rather than dropping it: `No results for "rust
88
+ stars:>=5000000"` now offers `Try: rust stars:>=500000`.
89
+ - **`GHFIND_LOG=<path>` writes TUI diagnostics to a file.** The TUI owns the
90
+ screen and cannot print diagnostics into it, and its logger was previously a
91
+ silent no-op — which made API failures undiagnosable. Token values are
92
+ redacted from logged URLs. Unset by default, so there is no cost in normal
93
+ use.
94
+ - **`docs/HOW-TO.md`** — a task-oriented guide: setting up a token, writing
95
+ queries, reading results, and what to do when a search returns nothing or an
96
+ error appears.
97
+
98
+ ### Fixed
99
+
100
+ - **A forbidden response no longer claims SSO is the cause.** Three unrelated
101
+ conditions return 403 with rate-limit budget remaining — SSO not authorizing
102
+ the token, a secondary/abuse rate limit, and org resource restrictions —
103
+ and the message asserted the SSO case unconditionally, sending people to fix
104
+ a credential problem that did not exist. The message now reports GitHub's
105
+ own reason and names both plausible causes; the response headers and body
106
+ (which identify the real one) are written to `GHFIND_LOG`.
107
+ - **`forks` is recognised as a qualifier.** Only `fork` was listed, so
108
+ `forks:100` was fuzzy-matched into `fork:100` and lost its numeric
109
+ validation. `forks`, `topics` and `followers` are now known too, and
110
+ `fork` (boolean) stays distinct from `forks` (count).
111
+ - **Custom-property qualifiers are no longer misread as keywords.**
112
+ `props.environment:production` contains a dot, which the parser rejected, so
113
+ it silently became a literal search term instead of a qualifier.
114
+ - **`--watch` fails fast on a malformed query** instead of retrying the same
115
+ non-transient error five times.
116
+ - **The post-upgrade panel no longer reappears on every launch.** It is
117
+ triggered by `lastInstalledVersion !== currentVersion`, and nothing ever
118
+ cleared `lastInstalledVersion` — so after one upgrade the "Updated ghfind
119
+ X → Y" panel showed again on every single launch, including after dismissing
120
+ it with **later** or **never** (neither touched that field). The panel now
121
+ acknowledges itself when shown. A recorded version _newer_ than the running
122
+ one is deliberately left alone, so a rollback or a mid-session update is
123
+ still reported.
124
+ - **A prerelease is no longer offered as an upgrade.** The Node/compiled
125
+ fallback in the version comparison treated `9.9.0-beta.1` as newer than
126
+ `9.9.0` — advertising a downgrade. Comparison now follows npm ordering: a
127
+ prerelease counts only when its numeric core is genuinely ahead, and build
128
+ metadata (`+build.5`) is ignored rather than corrupting the parse.
129
+
130
+ ---
131
+
9
132
  ## [9.8.3] — 2026-10-01 (released)
10
133
 
11
134
  ### Fixed
package/README.md CHANGED
@@ -172,19 +172,19 @@ ghfind --completion fish | source
172
172
  <tr><td><b>Search</b></td><td>Free-text + qualifiers (<code>language:</code>, <code>stars:</code>, <code>topic:</code>), sort by stars/updated/forks</td></tr>
173
173
  <tr><td><b>Trending</b></td><td>Today, week, month, year — filter by language</td></tr>
174
174
  <tr><td><b>Packages</b></td><td>npm registry search (beta) — <code>ghfind pkg "query"</code></td></tr>
175
- <tr><td><b>Bookmarks</b></td><td>Space → Bookmark / Bookmarks panel — save repos, tag them</td></tr>
176
- <tr><td><b>Deep-dive</b></td><td>Space → Deep-dive — languages, contributors, README, activity chart</td></tr>
177
- <tr><td><b>Compare</b></td><td>Space → Compare select / Compare view — side-by-side, select 2+ repos</td></tr>
178
- <tr><td><b>Explore</b></td><td>Space → Topics — browse popular GitHub topics</td></tr>
179
- <tr><td><b>History</b></td><td>Space → History — recall past searches</td></tr>
180
- <tr><td><b>Saved</b></td><td>Space → Saved searches — load or save queries</td></tr>
181
- <tr><td><b>Export</b></td><td>Space → Export — JSON, CSV, Markdown to file</td></tr>
182
- <tr><td><b>Share</b></td><td>Space → Share repo — copy repo link to clipboard</td></tr>
183
- <tr><td><b>Org profile</b></td><td>Space → Org profile — org summary: repos, stars, top languages (<code>ghfind org <name></code> in CLI)</td></tr>
175
+ <tr><td><b>Bookmarks</b></td><td>Menu → Bookmark / Bookmarks panel — save repos, tag them</td></tr>
176
+ <tr><td><b>Deep-dive</b></td><td>Menu → Deep-dive — languages, contributors, README, activity chart</td></tr>
177
+ <tr><td><b>Compare</b></td><td>Menu → Compare select / Compare view — side-by-side, select 2+ repos</td></tr>
178
+ <tr><td><b>Explore</b></td><td>Menu → Topics — browse popular GitHub topics</td></tr>
179
+ <tr><td><b>History</b></td><td>Menu → History — recall past searches</td></tr>
180
+ <tr><td><b>Saved</b></td><td>Menu → Saved searches — load or save queries</td></tr>
181
+ <tr><td><b>Export</b></td><td>Menu → Export — JSON, CSV, Markdown to file</td></tr>
182
+ <tr><td><b>Share</b></td><td>Menu → Share repo — copy repo link to clipboard</td></tr>
183
+ <tr><td><b>Org profile</b></td><td>Menu → Org profile — org summary: repos, stars, top languages (<code>ghfind org <name></code> in CLI)</td></tr>
184
184
  <tr><td><b>User profile</b></td><td>User summary like org profile — repos, stars, followers, top languages (<code>ghfind user <name></code>)</td></tr>
185
- <tr><td><b>Notifications</b></td><td>Space → Notifications — view & dismiss alerts</td></tr>
185
+ <tr><td><b>Notifications</b></td><td>Menu → Notifications — view & dismiss alerts</td></tr>
186
186
  <tr><td><b>Releases</b></td><td><code>--releases</code> — new-release feed for bookmarked repos</td></tr>
187
- <tr><td><b>Graph</b></td><td>Space → Activity graph — commit chart, fullscreen toggle</td></tr>
187
+ <tr><td><b>Graph</b></td><td>Menu → Activity graph — commit chart, fullscreen toggle</td></tr>
188
188
  <tr><td><b>Help</b></td><td><code>?</code> / <code>Ctrl+H</code> — keybindings reference</td></tr>
189
189
  <tr><td><b>Watch</b></td><td><code>--watch</code> — poll for new results</td></tr>
190
190
  <tr><td><b>MCP server</b></td><td><code>ghfind mcp</code> — GitHub search as tools for AI agents (Claude Code, Cursor, …)</td></tr>
@@ -214,16 +214,26 @@ ghfind --completion fish | source
214
214
  | `/` | Focus search input |
215
215
  | `Enter` | Execute search / open selected repo in browser |
216
216
  | `↑` / `↓` — `j` / `k` | Navigate results & menus |
217
- | `Space` | Open leader menu (contextual actions) |
217
+ | `Esc` | Open / close leader menu (contextual actions) |
218
218
  | `Tab` | Auto-complete search qualifier |
219
219
  | `?` or `Ctrl+H` | Help overlay |
220
220
  | `1`–`5` | Switch trending tabs (Today → All) |
221
221
  | `←` / `→` — `h` / `l` | Switch trending tabs (left/right) |
222
222
  | `PageUp` | Jump to top of results |
223
223
  | `PageDown` | Load next page of results |
224
- | `Esc` | Close current overlay |
225
224
  | `q` | Quit ghfind |
226
225
 
226
+ **Mouse** — every list is clickable, and the keyboard and mouse are interchangeable
227
+
228
+ | Input | Action |
229
+ | --------------------------------------- | ----------------------------------------- |
230
+ | Click | Select a row / card / trending tab |
231
+ | Double-click | Open the repo, or run the action |
232
+ | Scroll wheel | Move the selection, or scroll a long pane |
233
+ | Click outside an overlay | Dismiss it (same as `Esc`) |
234
+ | Click the query box | Focus the search input |
235
+ | Click <kbd>☰ menu</kbd> (bottom-right) | Open the leader menu |
236
+
227
237
  **Error recovery** — active only while the matching error is in the status bar
228
238
 
229
239
  | Key | Action |
@@ -233,7 +243,7 @@ ghfind --completion fish | source
233
243
  | `u` | Search without a token (401) |
234
244
  | `c` | Change token (rate limit) |
235
245
 
236
- **Leader menu** — press `Space`, navigate with `↑`/`↓`, press `Enter` to dispatch
246
+ **Leader menu** — press `Esc` (or click <kbd>☰ menu</kbd>), navigate with `↑`/`↓`, press `Enter` to dispatch
237
247
 
238
248
  Actions shown depend on current mode (search vs trending) and selection:
239
249
 
@@ -277,7 +287,7 @@ Actions shown depend on current mode (search vs trending) and selection:
277
287
 
278
288
  Trending tabs: `1`–`5` (Today → All) or `←`/`→` — `h`/`l`
279
289
 
280
- > Most actions are accessed via the **leader menu** (`Space`). This keeps the keymap minimal while providing a full command palette. The leader menu filters actions contextually — items that don't apply (e.g., Bookmark with no repo selected) are hidden.
290
+ > Most actions are accessed via the **leader menu** (`Esc`, or the <kbd>☰ menu</kbd> button in the bottom-right corner). This keeps the keymap minimal while providing a full command palette. The leader menu filters actions contextually — items that don't apply (e.g., Bookmark with no repo selected) are hidden.
281
291
 
282
292
  </details>
283
293
 
@@ -292,7 +302,22 @@ topic:cli -language:JavaScript
292
302
  org:rust-lang language:Rust
293
303
  ```
294
304
 
295
- Prefix with `-` to exclude. Supported: `language`, `stars`, `fork`, `archived`, `topic`, `user`, `org`, `repo`, `updated`, `pushed`, `visibility`, `license`, `created`, `size`, `in`.
305
+ Prefix with `-` to exclude. Supported: `language`, `stars`, `forks`, `topics`, `followers`, `size`, `fork`, `archived`, `topic`, `user`, `org`, `repo`, `updated`, `pushed`, `visibility`, `license`, `created`, `in`.
306
+
307
+ Queries are parsed and checked before the request is sent:
308
+
309
+ - **Qualifier typos are corrected** — `langauge:Rust` → `language:Rust`,
310
+ `star:1000` → `stars:1000`. Correction is limited to the qualifiers listed
311
+ above, so `is:`, `has:` and `props.*` pass through untouched.
312
+ - **Counts accept `k`/`m`** — `stars:10k` means 10,000 or more. A bare count
313
+ keeps GitHub's exact-match meaning, so use `stars:>=100` or `stars:10k`
314
+ rather than `stars:100`.
315
+ - **An invalid value is rejected with the fix**, not sent to GitHub:
316
+ `⚠ Invalid query: "stars:abc" is not a number — use stars:100, stars:>=100, or stars:1k..10k`
317
+ - **An empty result suggests how to loosen the query** — qualifiers are ranked
318
+ by how sharply they narrow results, and the message offers a concrete retry.
319
+
320
+ See [docs/HOW-TO.md](docs/HOW-TO.md) for a task-oriented walkthrough.
296
321
 
297
322
  ---
298
323
 
@@ -309,7 +334,7 @@ Prefix with `-` to exclude. Supported: `language`, `stars`, `fork`, `archived`,
309
334
  }
310
335
  ```
311
336
 
312
- Env: `GITHUB_TOKEN`, `GHFIND_CONFIG`, `GHFIND_SKILL_ROOTS` (path-separator separated skill directories for `ghfind skill search`), `XDG_CONFIG_HOME`, `XDG_STATE_HOME`, `NO_COLOR` (disables colored `--doctor` output, per [no-color.org](https://no-color.org/))
337
+ Env: `GITHUB_TOKEN`, `GHFIND_CONFIG`, `GHFIND_LOG` (path — write TUI diagnostics there; unset by default), `GHFIND_SKILL_ROOTS` (path-separator separated skill directories for `ghfind skill search`), `XDG_CONFIG_HOME`, `XDG_STATE_HOME`, `NO_COLOR` (disables colored `--doctor` output, per [no-color.org](https://no-color.org/))
313
338
 
314
339
  ---
315
340
 
@@ -322,14 +347,14 @@ cd ghfind
322
347
  # With Bun (recommended for TUI)
323
348
  bun install
324
349
  bun start # TUI
325
- bun test # 516 tests
350
+ bun test # 657 tests
326
351
  bun run check # format check + tests — the green gate
327
352
  bun run build # build dist/
328
353
 
329
354
  # Or with npm
330
355
  npm install
331
356
  npm start # TUI (requires Node 20+)
332
- npm test # 516 tests
357
+ npm test # 657 tests
333
358
  npm run build # build dist/
334
359
 
335
360
  > Want to contribute? See [CONTRIBUTING.md](CONTRIBUTING.md) for commands,
@@ -363,6 +388,30 @@ for the architecture, measurements, and remaining work.
363
388
 
364
389
  Recent releases (full history in [CHANGELOG.md](CHANGELOG.md)):
365
390
 
391
+ ### v9.10.0
392
+
393
+ - **The TUI is now fully clickable** — the mouse was already enabled (OpenTUI emitted and hit-tested every event) but nothing consumed them, so they were silently discarded; click selects, double-click opens, the wheel scrolls, and clicking outside an overlay closes it
394
+ - **Clicks reuse the keyboard's own code paths** — a click calls `setSelectedIndex`, which emits the same `selectionChanged` event `↑`/`↓` does, so the detail pane, graph and packages view work identically with no parallel mouse branch to drift
395
+ - **Every surface responds** — results, landing mode cards, trending tabs, the update dialog's buttons, and all seven overlay lists (history, bookmarks, saved searches, topics, export, share, command menu), with hover highlighting and a pointer cursor
396
+ - **A <kbd>☰ menu</kbd> button in the bottom-right corner** opens the command menu; it floats above the layout and hides while an overlay is open
397
+ - **The scroll wheel no longer scrolls the wrong pane** — a pre-existing bug: scroll events that hit nothing fell through to the focused renderable, so scrolling in the README viewer moved the _result selection_ instead of the README
398
+ - **Clicks over read-only text now register** — every `TextRenderable` defaults to OpenTUI's text-selection mode, which consumed left-presses as a selection drag before ghfind's handlers ran, so the detail pane and comparison table ignored clicks entirely
399
+ - **`Space` now always types a space, and `Esc` opens the command menu** — `Space` opened the menu only while the query input was unfocused, and the only thing that unfocused it was clicking a result row, so `Space` worked only after a mouse click; `Esc` already closed every overlay, so it gains a meaning rather than losing one
400
+ - **A hover highlight no longer painted lists magenta** — OpenTUI's colour parser accepts only hex and CSS names, so an `rgba()` tint fell through to its magenta fallback
401
+
402
+ ### v9.9.0
403
+
404
+ - **Queries are understood before they are sent** — every surface (TUI, CLI, MCP, `--watch`) parses and checks a query first, so a typo or bad value fails with a specific message and a fix instead of an opaque GitHub 422 or a misleading "network error"; previously only the TUI ran validation at all
405
+ - **Qualifier typos are corrected** — `langauge:Rust` → `language:Rust`, `star:1000` → `stars:1000`, `push:>` → `pushed:>`; correction is limited to the qualifiers ghfind knows, so `is:`, `has:` and `props.*` are never mangled
406
+ - **Counts accept `k`/`m`** — `stars:10k` → `stars:>=10000`, `size:1m`, `stars:1k..10k`; a bare count keeps GitHub's exact-match meaning, so `stars:100` is still exactly 100
407
+ - **Values are validated per qualifier** — numeric counts, `fork:true|false|only`, `archived:true|false`, calendar-checked ISO8601 dates for `created`/`pushed`/`updated`, the `visibility:` enum, and `in:` fields; documented comma-lists like `in:name,description` still work
408
+ - **Zero results suggest how to loosen the query** — `No results for "rust stars:>=5000000"` now offers `Try: rust stars:>=500000`, ranked by how sharply each qualifier narrows results
409
+ - **`GHFIND_LOG=<path>` writes TUI diagnostics to a file** — the TUI's logger was a silent no-op, making API failures undiagnosable; token values are redacted from logged URLs
410
+ - **A 403 no longer claims SSO is the cause** — SSO enforcement, secondary rate limits and org restrictions all produce it, and the message asserted the first one unconditionally; it now reports GitHub's own reason
411
+ - **The post-upgrade panel no longer reappears on every launch** — it was triggered by a version inequality nothing ever cleared, so it showed after every single launch _including_ after "later" or "never"; it now acknowledges itself once shown
412
+ - **A prerelease is no longer offered as an upgrade** — the version comparison used by Node and the compiled binaries reported `9.9.0-beta.1` as newer than `9.9.0`, i.e. a downgrade; it now follows npm ordering and ignores build metadata
413
+ - **A new [how-to guide](docs/HOW-TO.md)** — token setup, writing queries, reading results, recovering from errors, and copy-paste recipes
414
+
366
415
  ### v9.8.3
367
416
 
368
417
  - **401/403 say what actually happened** — a rejected token and an authenticated-but-forbidden request (e.g. SAML/SSO enforcement) both used to report "Network error", naming a connectivity problem you didn't have; only genuine connectivity and server failures keep that message now
@@ -382,27 +431,6 @@ Recent releases (full history in [CHANGELOG.md](CHANGELOG.md)):
382
431
  - **State files are written atomically** — a crash mid-write used to leave truncated JSON that was silently replaced with defaults, losing bookmarks and history
383
432
  - Fixed notification IDs restarting after "dismiss all", `history --delete` removing every duplicate, an invalid `--sort` degrading silently, a failed "load more" clearing the TUI's results, `--markdown` not escaping `|`, and a not-quite-LRU memory cache
384
433
 
385
- ### v9.8.1
386
-
387
- - **`ghfind skill search <query>`** finds agent skills by keyword and prints why
388
- each one matched; `--remote` searches the public [skills.sh](https://skills.sh)
389
- ecosystem instead, and `GHFIND_SKILL_ROOTS` overrides the scanned directories
390
- - **MCP tool `ghfind_skill_search`** — agents search installed skills or the
391
- skills.sh registry as soon as they connect; read-only
392
- - **Read-only CLI views of local state** — `ghfind bookmarks`, `ghfind history`,
393
- `ghfind saved`, `ghfind topics`, plus `ghfind readme <owner/repo>` and
394
- `ghfind share <owner/repo>`, each with `--json` for agents
395
- - **Shell completions** (bash, zsh, fish) cover every new subcommand and flag
396
- - **README image rendering is incomplete** — see
397
- [Known limitations](#known-limitations); the v9.8.0 notes wrongly described it
398
- as working
399
-
400
- ### v9.8.0
401
-
402
- - **README viewer renders real markdown** — headings, emphasis, links, lists, blockquotes, boxed tables, and fenced code now come from OpenTUI's markdown renderable with a theme-derived syntax style instead of a box-drawing text approximation
403
- - **Images render inline — see [Known limitations](#known-limitations)** — relative and `/`-rooted paths resolve against the README's branch, `github.com/.../blob/...` links are rewritten to raw content, downloads are cached and size-capped, SVG and badge-service images are skipped, and anything unloadable falls back to an `🖼 alt` caption; press `i` in the viewer to toggle images
404
- - **No new dependencies** — the PNG decoder, image-to-cells rasteriser, and fetch cache are plain TypeScript, and images draw with truecolor half blocks, so they work on any truecolor terminal without image-protocol support
405
-
406
434
  ## License
407
435
 
408
436
  MIT