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 +123 -0
- package/README.md +68 -40
- package/dist/cli.js +992 -172
- package/docs/HOW-TO.md +255 -0
- package/package.json +3 -2
- package/release-notes/9.10.0.md +137 -0
- package/release-notes/9.9.0.md +193 -0
- package/src/cli.ts +13 -11
- package/src/errors.ts +35 -11
- package/src/help.ts +21 -4
- package/src/mcp-server.ts +18 -2
- package/src/search-state.ts +8 -10
- package/src/search.ts +683 -11
- package/src/trending.ts +2 -6
- package/src/tui/mouse.ts +349 -0
- package/src/tui.ts +433 -123
- package/src/types.ts +11 -1
- package/src/update-check.ts +72 -6
- package/src/watch.ts +16 -11
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>
|
|
176
|
-
<tr><td><b>Deep-dive</b></td><td>
|
|
177
|
-
<tr><td><b>Compare</b></td><td>
|
|
178
|
-
<tr><td><b>Explore</b></td><td>
|
|
179
|
-
<tr><td><b>History</b></td><td>
|
|
180
|
-
<tr><td><b>Saved</b></td><td>
|
|
181
|
-
<tr><td><b>Export</b></td><td>
|
|
182
|
-
<tr><td><b>Share</b></td><td>
|
|
183
|
-
<tr><td><b>Org profile</b></td><td>
|
|
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>
|
|
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>
|
|
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
|
-
| `
|
|
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 `
|
|
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** (`
|
|
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`, `
|
|
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 #
|
|
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 #
|
|
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
|