github-search-cli 9.10.1 → 9.10.3
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 +24 -0
- package/README.md +9 -24
- package/dist/cli.js +15 -1
- package/package.json +1 -1
- package/release-notes/9.10.2.md +26 -0
- package/release-notes/9.10.3.md +27 -0
- package/src/help.ts +4 -0
- package/src/tui.ts +14 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,30 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Publish
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## [9.10.3] — 2026-10-14 (released)
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- **The help overlay documents `Ctrl+E`.** The utility-keys section listed `t`,
|
|
14
|
+
`Ctrl+X` and `Ctrl+C` but not the export shortcut, so the keybinding
|
|
15
|
+
reference was the one place `Ctrl+E` went unmentioned — the startup tip and
|
|
16
|
+
the README both advertised it. It now appears alongside the other utility
|
|
17
|
+
keys as `Ctrl+E` — "Export results (CSV / Markdown / JSON / text)".
|
|
18
|
+
|
|
19
|
+
## [9.10.2] — 2026-10-14 (released)
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- **`Ctrl+E` opens the export chooser.** The startup tip list advertises
|
|
24
|
+
"Press Ctrl+E to export results as CSV or Markdown", but no handler ever
|
|
25
|
+
claimed the chord: `Ctrl+E` did nothing on the results screen, and while the
|
|
26
|
+
query input was focused its emacs binding read the same chord as "move to
|
|
27
|
+
line end". The key handler now claims `Ctrl+E` before the input sees it and
|
|
28
|
+
opens the export overlay (JSON / CSV / Markdown / plain text). With results on
|
|
29
|
+
screen that is the shortest route to a `ghfind-export-<ts>.<ext>` file; with
|
|
30
|
+
an empty result list the status bar reports "No results to export — run a
|
|
31
|
+
search first" instead of opening an empty chooser.
|
|
32
|
+
|
|
9
33
|
## [9.10.1] — 2026-10-08 (released)
|
|
10
34
|
|
|
11
35
|
### Fixed
|
package/README.md
CHANGED
|
@@ -216,6 +216,7 @@ ghfind --completion fish | source
|
|
|
216
216
|
| `↑` / `↓` — `j` / `k` | Navigate results & menus |
|
|
217
217
|
| `Esc` | Open / close leader menu (contextual actions) |
|
|
218
218
|
| `Tab` | Auto-complete search qualifier |
|
|
219
|
+
| `Ctrl+E` | Export results (JSON / CSV / Markdown / text) |
|
|
219
220
|
| `?` or `Ctrl+H` | Help overlay |
|
|
220
221
|
| `1`–`5` | Switch trending tabs (Today → All) |
|
|
221
222
|
| `←` / `→` — `h` / `l` | Switch trending tabs (left/right) |
|
|
@@ -388,6 +389,14 @@ for the architecture, measurements, and remaining work.
|
|
|
388
389
|
|
|
389
390
|
Recent releases (full history in [CHANGELOG.md](CHANGELOG.md)):
|
|
390
391
|
|
|
392
|
+
### v9.10.3
|
|
393
|
+
|
|
394
|
+
- **The help overlay lists `Ctrl+E`** — the utility-keys section documented `t`, `Ctrl+X` and `Ctrl+C` but not the export shortcut the startup tip and the README already advertised
|
|
395
|
+
|
|
396
|
+
### v9.10.2
|
|
397
|
+
|
|
398
|
+
- **`Ctrl+E` opens the export chooser** — the startup tip advertised "Press Ctrl+E to export results as CSV or Markdown", but nothing bound the chord: it was ignored on the results screen and, while the query input had focus, its emacs binding read it as "move to line end"; it now opens the export overlay (JSON / CSV / Markdown / plain text), or reports that there is nothing to export yet
|
|
399
|
+
|
|
391
400
|
### v9.10.1
|
|
392
401
|
|
|
393
402
|
- **`--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
|
|
@@ -399,30 +408,6 @@ Recent releases (full history in [CHANGELOG.md](CHANGELOG.md)):
|
|
|
399
408
|
- **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
409
|
- **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
410
|
|
|
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
|
-
|
|
413
|
-
### v9.9.0
|
|
414
|
-
|
|
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
|
|
416
|
-
- **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
|
|
417
|
-
- **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
|
|
418
|
-
- **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
|
|
419
|
-
- **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
|
|
420
|
-
- **`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
|
|
421
|
-
- **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
|
|
422
|
-
- **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
|
|
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
|
|
424
|
-
- **A new [how-to guide](docs/HOW-TO.md)** — token setup, writing queries, reading results, recovering from errors, and copy-paste recipes
|
|
425
|
-
|
|
426
411
|
## License
|
|
427
412
|
|
|
428
413
|
MIT
|
package/dist/cli.js
CHANGED
|
@@ -2154,7 +2154,7 @@ var cached = null;
|
|
|
2154
2154
|
function getVersion() {
|
|
2155
2155
|
if (cached) return cached;
|
|
2156
2156
|
if (true) {
|
|
2157
|
-
cached = "9.10.
|
|
2157
|
+
cached = "9.10.3";
|
|
2158
2158
|
return cached;
|
|
2159
2159
|
}
|
|
2160
2160
|
try {
|
|
@@ -4177,6 +4177,10 @@ function buildHelpSections() {
|
|
|
4177
4177
|
title: " Utility Keys ",
|
|
4178
4178
|
titleColor: "muted",
|
|
4179
4179
|
rows: [
|
|
4180
|
+
{
|
|
4181
|
+
keys: "Ctrl+E",
|
|
4182
|
+
action: "Export results (CSV / Markdown / JSON / text)"
|
|
4183
|
+
},
|
|
4180
4184
|
{ keys: "t", action: "Cycle theme (light / dark / solarized)" },
|
|
4181
4185
|
{ keys: "Ctrl+X", action: "Copy repo URL to clipboard" },
|
|
4182
4186
|
{ keys: "Ctrl+C", action: "Copy search query to clipboard" }
|
|
@@ -8000,6 +8004,16 @@ ${pack.description ?? ""}`;
|
|
|
8000
8004
|
showOverlay("help");
|
|
8001
8005
|
return;
|
|
8002
8006
|
}
|
|
8007
|
+
if (key.ctrl && key.name === "e") {
|
|
8008
|
+
key.stopPropagation();
|
|
8009
|
+
if (currentRepos.length > 0) {
|
|
8010
|
+
showOverlay("export");
|
|
8011
|
+
} else {
|
|
8012
|
+
setStatus("No results to export \u2014 run a search first");
|
|
8013
|
+
}
|
|
8014
|
+
renderer.requestRender();
|
|
8015
|
+
return;
|
|
8016
|
+
}
|
|
8003
8017
|
if (key.name === "tab") {
|
|
8004
8018
|
if (searchBox.visible) {
|
|
8005
8019
|
const val = searchInput.value;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "github-search-cli",
|
|
3
|
-
"version": "9.10.
|
|
3
|
+
"version": "9.10.3",
|
|
4
4
|
"description": "Search GitHub from your terminal — repo search, trending repos, npm package search, bookmarks, deep-dive, compare, export. Keyboard + mouse TUI + pipeable CLI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "bun@1",
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# v9.10.2
|
|
2
|
+
|
|
3
|
+
A one-key release: the export shortcut the app has been advertising in its own
|
|
4
|
+
startup tips now exists.
|
|
5
|
+
|
|
6
|
+
## `Ctrl+E` exported nothing
|
|
7
|
+
|
|
8
|
+
The tip list in `src/tips.ts` advertises _"Press Ctrl+E to export results as
|
|
9
|
+
CSV or Markdown"_. Nothing bound the chord. On the results screen `Ctrl+E` was
|
|
10
|
+
ignored outright, and while the query input had focus the line editor's default
|
|
11
|
+
emacs binding claimed the same chord as "move to line end" — the one place it
|
|
12
|
+
did something, it did the wrong thing.
|
|
13
|
+
|
|
14
|
+
The key handler now claims `Ctrl+E` before the input ever sees it, and opens
|
|
15
|
+
the export overlay: JSON, CSV, Markdown, or plain text.
|
|
16
|
+
|
|
17
|
+
- With results on screen, `Ctrl+E` goes straight to the chooser — no detour
|
|
18
|
+
through the leader menu (`Esc` → Navigate → Export) — and writes the same
|
|
19
|
+
`ghfind-export-<ts>.<ext>` file the overlay always wrote.
|
|
20
|
+
- With an empty result list it does not open an empty chooser: the status bar
|
|
21
|
+
says `No results to export — run a search first`.
|
|
22
|
+
|
|
23
|
+
## Nothing else changed
|
|
24
|
+
|
|
25
|
+
The export overlay itself is untouched — the shortcut drives the existing
|
|
26
|
+
overlay rather than growing a second code path that could drift from it.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# v9.10.3
|
|
2
|
+
|
|
3
|
+
A one-row documentation release: the in-app help screen now lists the export
|
|
4
|
+
shortcut.
|
|
5
|
+
|
|
6
|
+
## The help overlay skipped `Ctrl+E`
|
|
7
|
+
|
|
8
|
+
`?` (or `Ctrl+H`) opens the keybinding reference. Its **Utility Keys** section
|
|
9
|
+
read `t`, `Ctrl+X`, `Ctrl+C` — and stopped there. So `Ctrl+E` was the one key
|
|
10
|
+
that ghfind never documented in the place you actually look keys up, even
|
|
11
|
+
though everything else already mentioned it: the startup tip rotates through
|
|
12
|
+
_"Press Ctrl+E to export results as CSV or Markdown"_, and the README's global
|
|
13
|
+
shortcut table carries the row.
|
|
14
|
+
|
|
15
|
+
It is now the first row of that section, with the other utility keys:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Ctrl+E Export results (CSV / Markdown / JSON / text)
|
|
19
|
+
t Cycle theme (light / dark / solarized)
|
|
20
|
+
Ctrl+X Copy repo URL to clipboard
|
|
21
|
+
Ctrl+C Copy search query to clipboard
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Nothing else changed
|
|
25
|
+
|
|
26
|
+
The shortcut itself landed in 9.10.2; this release only documents it. No
|
|
27
|
+
behaviour, output, or CLI surface changes.
|
package/src/help.ts
CHANGED
|
@@ -173,6 +173,10 @@ export function buildHelpSections(): HelpSection[] {
|
|
|
173
173
|
title: " Utility Keys ",
|
|
174
174
|
titleColor: "muted",
|
|
175
175
|
rows: [
|
|
176
|
+
{
|
|
177
|
+
keys: "Ctrl+E",
|
|
178
|
+
action: "Export results (CSV / Markdown / JSON / text)",
|
|
179
|
+
},
|
|
176
180
|
{ keys: "t", action: "Cycle theme (light / dark / solarized)" },
|
|
177
181
|
{ keys: "Ctrl+X", action: "Copy repo URL to clipboard" },
|
|
178
182
|
{ keys: "Ctrl+C", action: "Copy search query to clipboard" },
|
package/src/tui.ts
CHANGED
|
@@ -3458,6 +3458,20 @@ ${pack.description ?? ""}`;
|
|
|
3458
3458
|
showOverlay("help");
|
|
3459
3459
|
return;
|
|
3460
3460
|
}
|
|
3461
|
+
// Ctrl+E opens the export chooser (CSV / Markdown / JSON / plain text)
|
|
3462
|
+
// straight from the results — the shortcut the startup tip advertises.
|
|
3463
|
+
// Claim the chord first: while the query input is focused its default
|
|
3464
|
+
// emacs binding would otherwise also treat Ctrl+E as "move to line end".
|
|
3465
|
+
if (key.ctrl && key.name === "e") {
|
|
3466
|
+
key.stopPropagation();
|
|
3467
|
+
if (currentRepos.length > 0) {
|
|
3468
|
+
showOverlay("export");
|
|
3469
|
+
} else {
|
|
3470
|
+
setStatus("No results to export — run a search first");
|
|
3471
|
+
}
|
|
3472
|
+
renderer.requestRender();
|
|
3473
|
+
return;
|
|
3474
|
+
}
|
|
3461
3475
|
|
|
3462
3476
|
// Tab auto-completes qualifiers in search input
|
|
3463
3477
|
if (key.name === "tab") {
|