github-search-cli 9.9.0 → 9.10.1

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,100 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Publish
6
6
 
7
7
  ---
8
8
 
9
+ ## [9.10.1] — 2026-10-08 (released)
10
+
11
+ ### Fixed
12
+
13
+ - **`--interval` is parsed again.** The flag was documented in `--help`, the
14
+ README, the shell completions and `docs/HOW-TO.md`, but `parseArgs` had no
15
+ case for it — so `ghfind --watch --interval 60` silently searched for
16
+ `"--interval 60"` and polled at the default 300s. It now parses a positive
17
+ whole number of seconds and rejects anything else.
18
+ - **`--format` and `--pipe` validate up front.** A typo like `--format jsonn`
19
+ used to throw `Unknown format` mid-run and route into the crash-report flow
20
+ (which prints "ghfind encountered an unexpected error" and opens a GitHub
21
+ issue tab); `--pipe clonee` silently did nothing and exited 0. Both now fail
22
+ fast with the list of valid values and exit 1.
23
+ - **An empty query no longer reaches GitHub.** `ghfind --count` sent `q=" "`,
24
+ got a 422 back, and surfaced it as "⚠ Network error — check your connection.
25
+ Retrying in 5s…". The search/format/pipe/watch handlers now fail fast with a
26
+ usage hint instead.
27
+ - **Bare `ghfind --trending` launches the trending view** (as TRACKER.md
28
+ documents) instead of falling through to the landing menu.
29
+ - **`--since` validates its value** (`daily|weekly|monthly`) instead of
30
+ silently falling back to daily for anything it did not recognize — matching
31
+ the existing `--sort` validation.
32
+ - **Watch mode honors `--since`.** The trending period was derived from the
33
+ query string (`ghfind --watch --trending weekly`), so `--since weekly` was
34
+ ignored in watch-trending. An explicit `--since` now wins; the query-string
35
+ convention still applies when the flag is absent.
36
+ - **The MCP `ghfind_user_profile` tool returns formatted text** like
37
+ `ghfind_org_profile` (and like the CLI's default `ghfind user`), instead of
38
+ raw JSON; the structured profile still rides along in `data`.
39
+ - **Trending TUI footer matches the `/` key** (scroll-to-top: `/ top`, not
40
+ `/ search`), and the quit paths of the main TUI, trending and package browser
41
+ call `renderer.destroy()` before `process.exit(0)` so the terminal is
42
+ released (raw mode, alternate screen).
43
+
44
+ ### Removed
45
+
46
+ - Dead modules with no importers: `src/search-state.ts` (stale
47
+ `config.githubTokens` reference from before token unification),
48
+ `src/export.ts` and `src/pipe.ts` (byte-for-byte duplicates of the formats
49
+ in `src/output.ts`, which is what everything imports), and the unused
50
+ `historyCount()` export.
51
+
52
+ ## [9.10.0] — 2026-10-03 (released)
53
+
54
+ ### Added
55
+
56
+ - **The TUI is now fully clickable.** The mouse was already enabled — OpenTUI
57
+ emits SGR mouse tracking and hit-tests every event — but nothing consumed the
58
+ events, so they were silently discarded. Every list, card, tab and button now
59
+ responds:
60
+ - **Click** selects a row; the detail pane updates exactly as it does with
61
+ `↑`/`↓`, because clicks ride the same `selectionChanged` event the keyboard
62
+ already used.
63
+ - **Double-click** opens the repo in your browser, or runs the overlay's
64
+ action — the same code path as `Enter`, so the two can't drift apart.
65
+ - **Scroll wheel** moves the selection in a list and scrolls long panes
66
+ (README, help, org profile, update notes). This also fixes a pre-existing
67
+ bug: the wheel previously fell through to whichever renderable held focus,
68
+ so scrolling while the README viewer was open scrolled the wrong pane.
69
+ - **Click outside an overlay** dismisses it, the same as `Esc`.
70
+ - Landing cards, trending tabs, the update dialog's buttons, and every
71
+ overlay list (history, bookmarks, saved searches, topics, export, share,
72
+ command menu) are clickable. Hovering shows a pointer cursor and lifts the
73
+ row background.
74
+ - **A <kbd>☰ menu</kbd> button in the bottom-right corner** opens the command
75
+ menu. It floats above the layout and hides while an overlay is open.
76
+
77
+ ### Changed
78
+
79
+ - **`Esc` now opens the command menu; `Space` no longer does.** `Space` opened
80
+ the menu only while the query input was _not_ focused, which made one key mean
81
+ two different things depending on invisible state — and it meant `Space` could
82
+ not type a space in a query. More confusingly, it worked only _after_ you had
83
+ clicked a result row: clicking moved focus to the list as a side effect of
84
+ OpenTUI's auto-focus-on-press, and `Space` was gated on that focus being gone.
85
+ `Esc` is now the sole binding (it already closed overlays), and `Space` always
86
+ types. The bottom-right <kbd>☰ menu</kbd> button covers mouse users.
87
+ - Help, the README keybinding tables and `docs/HOW-TO.md` now document the mouse
88
+ bindings and the `Esc` menu binding.
89
+
90
+ ### Fixed
91
+
92
+ - **Non-interactive text no longer swallows clicks.** Every `TextRenderable`
93
+ defaults to OpenTUI's `selectable: true`, and a left-press on a selectable
94
+ renderable is consumed as a text-selection drag before the app's own handlers
95
+ run. The detail pane, comparison table, tab bar and other read-only text now
96
+ opt out, so clicks over them behave.
97
+ - **A hover highlight no longer painted the list magenta.** OpenTUI's colour
98
+ parser accepts only hex and CSS names; an `rgba(...)` hover tint silently
99
+ resolved to its magenta fallback. Now expressed as 8-digit hex.
100
+
101
+ ---
102
+
9
103
  ## [9.9.0] — 2026-10-01 (released)
10
104
 
11
105
  ### Added
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
 
@@ -337,14 +347,14 @@ cd ghfind
337
347
  # With Bun (recommended for TUI)
338
348
  bun install
339
349
  bun start # TUI
340
- bun test # 624 tests
350
+ bun test # 682 tests
341
351
  bun run check # format check + tests — the green gate
342
352
  bun run build # build dist/
343
353
 
344
354
  # Or with npm
345
355
  npm install
346
356
  npm start # TUI (requires Node 20+)
347
- npm test # 624 tests
357
+ npm test # 682 tests
348
358
  npm run build # build dist/
349
359
 
350
360
  > Want to contribute? See [CONTRIBUTING.md](CONTRIBUTING.md) for commands,
@@ -378,6 +388,28 @@ for the architecture, measurements, and remaining work.
378
388
 
379
389
  Recent releases (full history in [CHANGELOG.md](CHANGELOG.md)):
380
390
 
391
+ ### v9.10.1
392
+
393
+ - **`--interval` is parsed again** — it was documented in `--help`, the README, the how-to guide and all three shell completions, but `parseArgs` had no case for it, so `ghfind --watch --interval 60` searched for the literal string `--interval 60` and polled at the default 300s anyway
394
+ - **A flag typo no longer opens a GitHub issue tab** — `--format jsonn` threw mid-run and routed into the crash-report flow (printing "ghfind encountered an unexpected error" and opening a prefilled issue page); `--pipe clonee` silently did nothing and exited 0; both now validate up front, list the valid values, and exit 1
395
+ - **An empty query fails fast instead of faking a network error** — `ghfind --count` with no query sent `q=" "`, got a 422 back, and looped on `⚠ Network error — check your connection. Retrying in 5s...`; the search/format/pipe/watch handlers now print a usage hint instead
396
+ - **Bare `ghfind --trending` opens the trending view** instead of falling through to the landing menu, as documented
397
+ - **`--since` validates `daily|weekly|monthly`** instead of silently accepting anything and falling back to daily — the same treatment `--sort` already had
398
+ - **`--watch --trending --since weekly` polls weekly** — the trending period used to be derived from the query string, so `--since` was ignored in watch mode
399
+ - **The MCP `ghfind_user_profile` tool returns formatted text**, matching `ghfind_org_profile` and the CLI's default `ghfind user` output; the raw JSON still rides along in `data`
400
+ - **Quit paths release the terminal** — the main TUI, the trending view and the package browser call `renderer.destroy()` before exiting, and the trending footer's `/` hint now matches the scroll-to-top key it actually binds
401
+
402
+ ### v9.10.0
403
+
404
+ - **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
405
+ - **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
406
+ - **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
407
+ - **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
408
+ - **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
409
+ - **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
410
+ - **`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
411
+ - **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
412
+
381
413
  ### v9.9.0
382
414
 
383
415
  - **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
@@ -391,40 +423,6 @@ Recent releases (full history in [CHANGELOG.md](CHANGELOG.md)):
391
423
  - **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
392
424
  - **A new [how-to guide](docs/HOW-TO.md)** — token setup, writing queries, reading results, recovering from errors, and copy-paste recipes
393
425
 
394
- ### v9.8.3
395
-
396
- - **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
397
- - **A rate-limited search no longer looks like an empty one** — the adapter used to swallow the error and render a silent, successful "no repositories found"; the real message reaches the status bar, and the `ghfind_search_repos` MCP tool returns `rateLimited: true` with backoff advice instead of a tool failure
398
- - **Recover from errors without leaving the TUI** — while the matching error is in the status bar, `t` opens an inline token prompt (saves it and re-runs the failed query), `u` clears the token and retries unauthenticated, `c` swaps in a different token, `r` retries
399
- - **A corrupted session no longer hijacks startup** — a `session.json` holding an MCP handshake blob used to skip the landing menu and auto-run that garbage as a search on every launch; the menu always comes first now, and both save and restore sanitize the session
400
- - **Images wrapped in a link render now** — the badge-and-screenshot shape `[![alt](shot.png)](url)` rendered nothing at all, which cost `sst/opencode` its only image and `withastro/astro` 23 of its 25; the image cells carry an OSC 8 hyperlink, so clicking it opens the target
401
- - **A README full of small images no longer floods the screen** — images the README declares under 100px on any edge are skipped before a request is made, and undeclared `![]()` images are measured from the image header before any pixel decode; on `openclaw/openclaw` (648 sponsor avatars) that is 649 fetches / 28.3s → 1 fetch / ~0.5s
402
-
403
- ### v9.8.2
404
-
405
- - **Security: tokens no longer leak into crash reports** — an uncaught error auto-built a GitHub issue URL from raw `process.argv`, so a `--token` value ended up in a public URL; every field is redacted now, and ghfind prints the URL to copy instead of opening a browser when it finds a credential
406
- - **Security: your token is never sent to `raw.githubusercontent.com`** when fetching a README, only to `api.github.com` and only for a private repo
407
- - **Security: untrusted skill sources are validated** before reaching a shell command or URL, so a hostile skills.sh entry cannot inject into `npx skills add`
408
- - **Recoverable errors no longer open a bug-report tab** — rate limits, network blips and layout changes print a short message and exit
409
- - **`--compare` resolves repositories exactly** in both the CLI and the `ghfind_compare_repos` MCP tool; it used a free-text search that could silently compare the wrong repo
410
- - **State files are written atomically** — a crash mid-write used to leave truncated JSON that was silently replaced with defaults, losing bookmarks and history
411
- - 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
412
-
413
- ### v9.8.1
414
-
415
- - **`ghfind skill search <query>`** finds agent skills by keyword and prints why
416
- each one matched; `--remote` searches the public [skills.sh](https://skills.sh)
417
- ecosystem instead, and `GHFIND_SKILL_ROOTS` overrides the scanned directories
418
- - **MCP tool `ghfind_skill_search`** — agents search installed skills or the
419
- skills.sh registry as soon as they connect; read-only
420
- - **Read-only CLI views of local state** — `ghfind bookmarks`, `ghfind history`,
421
- `ghfind saved`, `ghfind topics`, plus `ghfind readme <owner/repo>` and
422
- `ghfind share <owner/repo>`, each with `--json` for agents
423
- - **Shell completions** (bash, zsh, fish) cover every new subcommand and flag
424
- - **README image rendering is incomplete** — see
425
- [Known limitations](#known-limitations); the v9.8.0 notes wrongly described it
426
- as working
427
-
428
426
  ## License
429
427
 
430
428
  MIT