github-search-cli 9.8.0 → 9.8.2
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 +109 -0
- package/LICENSE +21 -21
- package/README.md +81 -22
- package/completions/ghfind.bash +55 -51
- package/completions/ghfind.fish +29 -24
- package/completions/ghfind.zsh +52 -39
- package/demo.svg +71 -71
- package/dist/cli.js +1336 -551
- package/package.json +1 -1
- package/release-notes/9.8.1.md +74 -0
- package/release-notes/9.8.2.md +65 -0
- package/scripts/brew.rb +53 -53
- package/scripts/postinstall.js +38 -0
- package/src/agent-skill.ts +14 -0
- package/src/cli.ts +450 -20
- package/src/config.ts +12 -2
- package/src/deepdive.ts +70 -66
- package/src/doctor.ts +3 -2
- package/src/error-report.ts +81 -11
- package/src/errors.ts +0 -1
- package/src/history.ts +2 -5
- package/src/image-loader.ts +30 -1
- package/src/init.ts +1 -2
- package/src/markdown-view.ts +20 -4
- package/src/mcp-server.ts +65 -10
- package/src/notifications.ts +9 -3
- package/src/org.ts +15 -14
- package/src/output.ts +1 -13
- package/src/readme.ts +70 -0
- package/src/releases.ts +29 -27
- package/src/search.ts +4 -0
- package/src/skill-finder.ts +476 -0
- package/src/storage.ts +22 -47
- package/src/tui.ts +17 -33
- package/src/user.ts +15 -14
- package/dist/chunk-GYIL4S5X.js +0 -59
- package/dist/config-OCIPF2IF.js +0 -14
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,115 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Publish
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## [9.8.2] — 2026-09-28 (released)
|
|
10
|
+
|
|
11
|
+
### Security
|
|
12
|
+
|
|
13
|
+
- **GitHub tokens no longer leak into crash reports.** An uncaught error
|
|
14
|
+
auto-built a GitHub issue URL from the raw `process.argv`, so a token passed
|
|
15
|
+
as `--token` ended up in a public URL. Every field is now redacted before it
|
|
16
|
+
reaches the URL, title, body or stack trace, and when a credential is
|
|
17
|
+
detected ghfind prints the URL to copy instead of opening a browser.
|
|
18
|
+
- **Your token is never sent to `raw.githubusercontent.com`** when fetching a
|
|
19
|
+
README. It is only attached to `api.github.com` requests, and only for a
|
|
20
|
+
repository marked private.
|
|
21
|
+
- **Untrusted skill sources are validated** before they can reach a shell
|
|
22
|
+
command or URL. A `source` or `skillId` containing shell metacharacters
|
|
23
|
+
(`;`, `$`, backticks, newlines, path traversal) is now dropped from
|
|
24
|
+
registry results instead of being interpolated into `npx skills add`.
|
|
25
|
+
- **The config file holding your token is written with `0600` permissions**
|
|
26
|
+
(effective on POSIX; on Windows the file still inherits the directory ACL).
|
|
27
|
+
- `--doctor` masks the token with `maskToken()` instead of printing a
|
|
28
|
+
raw 7-character prefix.
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- **Recoverable errors no longer open a bug-report tab.** The catch in
|
|
33
|
+
`src/cli.ts` tested `err.name === "SearchCliError"`, which is never true
|
|
34
|
+
because each subclass sets its own name, so rate-limit, network and
|
|
35
|
+
layout-change errors all fell through to the crash reporter. Routing now uses
|
|
36
|
+
`instanceof SearchCliError`.
|
|
37
|
+
- **`--compare` and the MCP tool `ghfind_compare_repos` resolve repos
|
|
38
|
+
exactly.** Both used a free-text search with no `repo:` qualifier and never
|
|
39
|
+
checked the returned `fullName`, so they could silently compare a different
|
|
40
|
+
repository. They now use the existing `resolveRepoFromRef()` seam
|
|
41
|
+
(`GET /repos/{owner}/{repo}`).
|
|
42
|
+
- **State files are written atomically.** Bookmarks, history, sessions, saved
|
|
43
|
+
searches, notifications and the update check were written straight to their
|
|
44
|
+
live path; a crash or a full disk left a truncated JSON file that was then
|
|
45
|
+
silently replaced with defaults, destroying user data. Writes now go to a
|
|
46
|
+
temp file and are renamed into place.
|
|
47
|
+
- **Notification IDs no longer restart** after "dismiss all" — the id counter
|
|
48
|
+
was recomputed from an already-empty list.
|
|
49
|
+
- **`ghfind history --delete` no longer removes every duplicate entry.** The
|
|
50
|
+
delete matched by value instead of by index.
|
|
51
|
+
- **An invalid `--sort` value is rejected** with the list of valid choices and
|
|
52
|
+
a non-zero exit code instead of silently degrading to the default.
|
|
53
|
+
- **A failed "load more" in the TUI no longer clears the results** already on
|
|
54
|
+
screen; the error goes to the status bar.
|
|
55
|
+
- **`--markdown` escapes `|` in cells**, matching `--csv`.
|
|
56
|
+
- Local skill scanning is memoised per process, so a search no longer re-walks
|
|
57
|
+
the skill roots on every keystroke.
|
|
58
|
+
- `MemoryCache.set` is a true LRU — a refreshed entry now moves to the end of
|
|
59
|
+
the insertion order.
|
|
60
|
+
- Skill ids and sources may contain `_` (e.g. `my_org/my_repo`), which
|
|
61
|
+
are common on GitHub and were wrongly rejected.
|
|
62
|
+
|
|
63
|
+
### Changed
|
|
64
|
+
|
|
65
|
+
- **`postinstall` and the bundled agent skill are unchanged in behaviour**; the
|
|
66
|
+
skill now states that `--compare` resolves a repository exactly.
|
|
67
|
+
- Internal `--compare` resolution is now shared by the CLI and the MCP server
|
|
68
|
+
instead of duplicated in both.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## [9.8.1] — 2026-09-26 (released)
|
|
73
|
+
|
|
74
|
+
### Added
|
|
75
|
+
|
|
76
|
+
- **`ghfind skill search <query>`** finds agent skills by keyword and prints
|
|
77
|
+
why each one matched. The default scan reads `SKILL.md` files under
|
|
78
|
+
`~/.codex/skills`, `~/.agents/skills`, `<project>/.codex/skills` and
|
|
79
|
+
`<project>/.github/skills`, in that priority order and de-duplicated by name
|
|
80
|
+
(the user-level roots overlap heavily on real machines). `--remote` queries
|
|
81
|
+
the public [skills.sh](https://skills.sh) ecosystem instead and returns each
|
|
82
|
+
hit's install count and `npx skills add` command. `GHFIND_SKILL_ROOTS`
|
|
83
|
+
overrides which directories are scanned.
|
|
84
|
+
- **MCP tool `ghfind_skill_search`.** Agents can search skills the moment they
|
|
85
|
+
connect: `source: "local"` (the default) searches installed skills,
|
|
86
|
+
`source: "registry"` searches skills.sh. Read-only — it returns install
|
|
87
|
+
commands rather than running them, and never writes to disk.
|
|
88
|
+
- **Read-only CLI views of local state:** `ghfind bookmarks [query]`,
|
|
89
|
+
`ghfind history [query]`, `ghfind saved` and `ghfind topics`, each with
|
|
90
|
+
`--json` for agents. They print what the TUI has stored and never modify it.
|
|
91
|
+
- **`ghfind readme <owner/repo>`** prints a repository's README (`--raw` skips
|
|
92
|
+
the header, `--json` returns `{ owner, name, sourceUrl, text }`), bringing the
|
|
93
|
+
TUI's README viewer to scripts and agents.
|
|
94
|
+
- **`ghfind share <owner/repo>`** prints a share snippet
|
|
95
|
+
(`--as markdown|plain|gh-cli|short`), with `--copy` to also put it on the
|
|
96
|
+
clipboard.
|
|
97
|
+
- Shell completions (bash, zsh, fish) cover every new subcommand and flag.
|
|
98
|
+
|
|
99
|
+
### Changed
|
|
100
|
+
|
|
101
|
+
- The bundled `ghfind-cli` agent skill documents the skill search and the new
|
|
102
|
+
read-only commands, so CLI-first agents discover them without reading
|
|
103
|
+
`--help`.
|
|
104
|
+
|
|
105
|
+
### Fixed
|
|
106
|
+
|
|
107
|
+
- **README image rendering does not work on real repositories.** The v9.8.0
|
|
108
|
+
notes described inline images as working; that was wrong. An image wrapped
|
|
109
|
+
in a link (`[](url)`) renders nothing, and a README with
|
|
110
|
+
many small images — `openclaw/openclaw` has 648 48x48 avatars — becomes
|
|
111
|
+
15,552 rows tall. Images declaring an edge under 100px are skipped, and
|
|
112
|
+
SVG is not rendered at all. Plain `![]()` images and large banners do
|
|
113
|
+
render correctly. Root causes and remaining work:
|
|
114
|
+
`.issues/tickets/readme-image-rendering.md`.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
9
118
|
## [9.8.0] — 2026-09-22 (released)
|
|
10
119
|
|
|
11
120
|
### Added
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 search-cli contributors
|
|
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.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 search-cli contributors
|
|
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
CHANGED
|
@@ -95,8 +95,21 @@ ghfind --compare a/b c/d # side-by-side comparison
|
|
|
95
95
|
ghfind --compare a/b c/d --json # comparison as JSON|CSV|Markdown
|
|
96
96
|
ghfind deep-dive a/b --json # deep-dive: languages, contributors, README
|
|
97
97
|
ghfind pkg "query" --json # npm package search as JSON
|
|
98
|
+
# Read-only local state
|
|
99
|
+
ghfind bookmarks # saved repos, newest first
|
|
100
|
+
ghfind history --limit 20 # past searches
|
|
101
|
+
ghfind saved # named searches saved in the TUI
|
|
102
|
+
ghfind topics # popular GitHub topics
|
|
103
|
+
ghfind readme a/b # print a repo README (--raw for no header)
|
|
104
|
+
ghfind share a/b --as gh-cli # share snippet (--copy also copies it)
|
|
105
|
+
# Agent skills
|
|
106
|
+
ghfind skill search testing # skills installed on this machine
|
|
107
|
+
ghfind skill search testing --remote --json # the skills.sh ecosystem
|
|
98
108
|
```
|
|
99
109
|
|
|
110
|
+
`bookmarks`, `history`, `saved`, `topics`, `readme` and `share` are read-only:
|
|
111
|
+
they print what the TUI has stored but never modify local state.
|
|
112
|
+
|
|
100
113
|
## Use with AI agents
|
|
101
114
|
|
|
102
115
|
ghfind speaks the [Model Context Protocol](https://modelcontextprotocol.io) —
|
|
@@ -120,17 +133,29 @@ or in your MCP client config:
|
|
|
120
133
|
Exposed tools: `ghfind_search_repos`, `ghfind_trending`,
|
|
121
134
|
`ghfind_npm_packages`, `ghfind_org_profile`, `ghfind_user_profile`,
|
|
122
135
|
`ghfind_compare_repos`, `ghfind_deep_dive`, `ghfind_bookmarked_releases`,
|
|
123
|
-
|
|
136
|
+
`ghfind_skill` (a token-efficient CLI usage guide for agents), and
|
|
137
|
+
`ghfind_skill_search` (find agent skills, either installed on this machine or
|
|
138
|
+
in the public skills.sh ecosystem ? read-only, it never installs anything).
|
|
124
139
|
Unauthenticated requests are rate-limited to 60/hr — set `GITHUB_TOKEN`
|
|
125
140
|
in the environment for 5,000/hr.
|
|
126
141
|
|
|
127
142
|
CLI-first agents can skip MCP entirely:
|
|
128
143
|
|
|
129
144
|
```bash
|
|
130
|
-
ghfind skill
|
|
131
|
-
ghfind skill ghfind-cli
|
|
145
|
+
ghfind skill # list agent skills
|
|
146
|
+
ghfind skill ghfind-cli # print the token-efficient CLI guide
|
|
147
|
+
ghfind skill search testing # search installed skills (local scan)
|
|
148
|
+
ghfind skill search testing --remote --limit 10 --json # search skills.sh
|
|
132
149
|
```
|
|
133
150
|
|
|
151
|
+
`ghfind skill search` matches skill names first, then descriptions, and reads
|
|
152
|
+
the `SKILL.md` files under `~/.codex/skills`, `~/.agents/skills`,
|
|
153
|
+
`<project>/.codex/skills` and `<project>/.github/skills` (in that priority
|
|
154
|
+
order, de-duplicated by name). `--remote` queries the public
|
|
155
|
+
[skills.sh](https://skills.sh) ecosystem instead and returns the
|
|
156
|
+
`npx skills add` command for each hit, without installing anything. Set
|
|
157
|
+
`GHFIND_SKILL_ROOTS` to override which directories are scanned.
|
|
158
|
+
|
|
134
159
|
### Completions
|
|
135
160
|
|
|
136
161
|
```bash
|
|
@@ -164,6 +189,9 @@ ghfind --completion fish | source
|
|
|
164
189
|
<tr><td><b>Watch</b></td><td><code>--watch</code> — poll for new results</td></tr>
|
|
165
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>
|
|
166
191
|
<tr><td><b>Agent skill</b></td><td><code>ghfind skill</code> — token-efficient CLI usage guide for coding agents</td></tr>
|
|
192
|
+
<tr><td><b>Skill search</b></td><td><code>ghfind skill search <query></code> — find installed skills, or <code>--remote</code> for the skills.sh ecosystem (also <code>ghfind_skill_search</code> over MCP)</td></tr>
|
|
193
|
+
<tr><td><b>Read-only state</b></td><td><code>ghfind bookmarks|history|saved|topics</code> — print local state and popular topics without modifying anything</td></tr>
|
|
194
|
+
<tr><td><b>README & share</b></td><td><code>ghfind readme a/b</code> and <code>ghfind share a/b --as gh-cli</code> — the TUI's <code>r</code> / <code>y</code> actions from the shell</td></tr>
|
|
167
195
|
</table>
|
|
168
196
|
|
|
169
197
|
<details>
|
|
@@ -272,7 +300,7 @@ Prefix with `-` to exclude. Supported: `language`, `stars`, `fork`, `archived`,
|
|
|
272
300
|
}
|
|
273
301
|
```
|
|
274
302
|
|
|
275
|
-
Env: `GITHUB_TOKEN`, `GHFIND_CONFIG`, `XDG_CONFIG_HOME`, `XDG_STATE_HOME`, `NO_COLOR` (disables colored `--doctor` output, per [no-color.org](https://no-color.org/))
|
|
303
|
+
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/))
|
|
276
304
|
|
|
277
305
|
---
|
|
278
306
|
|
|
@@ -285,7 +313,7 @@ cd ghfind
|
|
|
285
313
|
# With Bun (recommended for TUI)
|
|
286
314
|
bun install
|
|
287
315
|
bun start # TUI
|
|
288
|
-
bun test #
|
|
316
|
+
bun test # 482 tests
|
|
289
317
|
bun run check # format check + tests — the green gate
|
|
290
318
|
bun run build # build dist/
|
|
291
319
|
|
|
@@ -301,31 +329,62 @@ npm run build # build dist/
|
|
|
301
329
|
|
|
302
330
|
---
|
|
303
331
|
|
|
304
|
-
##
|
|
332
|
+
## Known limitations
|
|
305
333
|
|
|
306
|
-
|
|
334
|
+
**README image rendering is currently incomplete.** Images that do render look
|
|
335
|
+
right, but several common cases silently show nothing:
|
|
307
336
|
|
|
308
|
-
|
|
337
|
+
- **An image wrapped in a link does not render at all.** This is the common
|
|
338
|
+
badge-and-screenshot style: `[](https://example.com)`.
|
|
339
|
+
The whole block is treated as prose and the image is dropped.
|
|
340
|
+
- **An image smaller than 100px is skipped**, judged by the `width`/`height`
|
|
341
|
+
the README declares in its `<img>` tag. A README that understates an
|
|
342
|
+
image's size hides that image.
|
|
343
|
+
- **SVG is not rendered** — the rasteriser cannot draw it.
|
|
344
|
+
- Markdown `` images have no declared size, so they are downloaded
|
|
345
|
+
before the size check can reject them. A README full of them is slow to open.
|
|
309
346
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
-
|
|
347
|
+
A README using none of the above — plain `![]()` images and a few large
|
|
348
|
+
banners — renders fine and fast. See
|
|
349
|
+
[.issues/tickets/readme-image-rendering.md](.issues/tickets/readme-image-rendering.md)
|
|
350
|
+
for the measurements and the remaining work.
|
|
313
351
|
|
|
314
|
-
|
|
352
|
+
---
|
|
315
353
|
|
|
316
|
-
|
|
317
|
-
- **New `ghfind --doctor` check** — flags stale/PATH-shadowing global installs (multiple `ghfind` copies with different versions) and prints the exact uninstall command
|
|
318
|
-
- **Windows URL fix** — links with query params were truncated at the first `&` by `cmd /c start`; every pre-filled crash-report/issue link now opens complete
|
|
319
|
-
- Fixed `open-url` crashing under Node; CI now enforces lint + typecheck gates (first green Biome baseline)
|
|
354
|
+
## Changelog
|
|
320
355
|
|
|
321
|
-
|
|
356
|
+
Recent releases (full history in [CHANGELOG.md](CHANGELOG.md)):
|
|
322
357
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
-
|
|
326
|
-
-
|
|
358
|
+
### v9.8.2
|
|
359
|
+
|
|
360
|
+
- **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
|
|
361
|
+
- **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
|
|
362
|
+
- **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`
|
|
363
|
+
- **Recoverable errors no longer open a bug-report tab** — rate limits, network blips and layout changes print a short message and exit
|
|
364
|
+
- **`--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
|
|
365
|
+
- **State files are written atomically** — a crash mid-write used to leave truncated JSON that was silently replaced with defaults, losing bookmarks and history
|
|
366
|
+
- 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
|
|
367
|
+
|
|
368
|
+
### v9.8.1
|
|
369
|
+
|
|
370
|
+
- **`ghfind skill search <query>`** finds agent skills by keyword and prints why
|
|
371
|
+
each one matched; `--remote` searches the public [skills.sh](https://skills.sh)
|
|
372
|
+
ecosystem instead, and `GHFIND_SKILL_ROOTS` overrides the scanned directories
|
|
373
|
+
- **MCP tool `ghfind_skill_search`** — agents search installed skills or the
|
|
374
|
+
skills.sh registry as soon as they connect; read-only
|
|
375
|
+
- **Read-only CLI views of local state** — `ghfind bookmarks`, `ghfind history`,
|
|
376
|
+
`ghfind saved`, `ghfind topics`, plus `ghfind readme <owner/repo>` and
|
|
377
|
+
`ghfind share <owner/repo>`, each with `--json` for agents
|
|
378
|
+
- **Shell completions** (bash, zsh, fish) cover every new subcommand and flag
|
|
379
|
+
- **README image rendering is incomplete** — see
|
|
380
|
+
[Known limitations](#known-limitations); the v9.8.0 notes wrongly described it
|
|
381
|
+
as working
|
|
327
382
|
|
|
328
|
-
|
|
383
|
+
### v9.8.0
|
|
384
|
+
|
|
385
|
+
- **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
|
|
386
|
+
- **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
|
|
387
|
+
- **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
|
|
329
388
|
|
|
330
389
|
## License
|
|
331
390
|
|
package/completions/ghfind.bash
CHANGED
|
@@ -1,51 +1,55 @@
|
|
|
1
|
-
# ghfind bash completion
|
|
2
|
-
# Source: source <(ghfind --completion bash)
|
|
3
|
-
|
|
4
|
-
_ghfind() {
|
|
5
|
-
local cur prev opts
|
|
6
|
-
COMPREPLY=()
|
|
7
|
-
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
8
|
-
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
9
|
-
|
|
10
|
-
opts="--json --csv --markdown --count --limit --sort --token --trending --language --since --pipe --format --registry --watch --interval --version --help --completion pkg login init doctor org mcp skill trending deep-dive"
|
|
11
|
-
|
|
12
|
-
case "${prev}" in
|
|
13
|
-
--sort)
|
|
14
|
-
COMPREPLY=( $(compgen -W "best-match stars updated forks" -- "${cur}") )
|
|
15
|
-
return 0
|
|
16
|
-
;;
|
|
17
|
-
--since)
|
|
18
|
-
COMPREPLY=( $(compgen -W "daily weekly monthly" -- "${cur}") )
|
|
19
|
-
return 0
|
|
20
|
-
;;
|
|
21
|
-
--pipe)
|
|
22
|
-
COMPREPLY=( $(compgen -W "clone open" -- "${cur}") )
|
|
23
|
-
return 0
|
|
24
|
-
;;
|
|
25
|
-
--format)
|
|
26
|
-
COMPREPLY=( $(compgen -W "urls names ssh-urls clone-commands ids" -- "${cur}") )
|
|
27
|
-
return 0
|
|
28
|
-
;;
|
|
29
|
-
--completion)
|
|
30
|
-
COMPREPLY=( $(compgen -W "bash zsh fish" -- "${cur}") )
|
|
31
|
-
return 0
|
|
32
|
-
;;
|
|
33
|
-
--
|
|
34
|
-
COMPREPLY=( $(compgen -W "
|
|
35
|
-
return 0
|
|
36
|
-
;;
|
|
37
|
-
--
|
|
38
|
-
COMPREPLY=( $(compgen -W "
|
|
39
|
-
return 0
|
|
40
|
-
;;
|
|
41
|
-
--
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
1
|
+
# ghfind bash completion
|
|
2
|
+
# Source: source <(ghfind --completion bash)
|
|
3
|
+
|
|
4
|
+
_ghfind() {
|
|
5
|
+
local cur prev opts
|
|
6
|
+
COMPREPLY=()
|
|
7
|
+
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
8
|
+
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
9
|
+
|
|
10
|
+
opts="--json --csv --markdown --count --limit --sort --token --trending --language --since --pipe --format --registry --watch --interval --version --help --completion --remote --local --copy --raw --as pkg login init doctor org user mcp skill bookmarks history topics saved readme share trending deep-dive compare"
|
|
11
|
+
|
|
12
|
+
case "${prev}" in
|
|
13
|
+
--sort)
|
|
14
|
+
COMPREPLY=( $(compgen -W "best-match stars updated forks" -- "${cur}") )
|
|
15
|
+
return 0
|
|
16
|
+
;;
|
|
17
|
+
--since)
|
|
18
|
+
COMPREPLY=( $(compgen -W "daily weekly monthly" -- "${cur}") )
|
|
19
|
+
return 0
|
|
20
|
+
;;
|
|
21
|
+
--pipe)
|
|
22
|
+
COMPREPLY=( $(compgen -W "clone open" -- "${cur}") )
|
|
23
|
+
return 0
|
|
24
|
+
;;
|
|
25
|
+
--format)
|
|
26
|
+
COMPREPLY=( $(compgen -W "urls names ssh-urls clone-commands ids" -- "${cur}") )
|
|
27
|
+
return 0
|
|
28
|
+
;;
|
|
29
|
+
--completion)
|
|
30
|
+
COMPREPLY=( $(compgen -W "bash zsh fish" -- "${cur}") )
|
|
31
|
+
return 0
|
|
32
|
+
;;
|
|
33
|
+
--as)
|
|
34
|
+
COMPREPLY=( $(compgen -W "markdown plain gh-cli short" -- "${cur}") )
|
|
35
|
+
return 0
|
|
36
|
+
;;
|
|
37
|
+
--registry)
|
|
38
|
+
COMPREPLY=( $(compgen -W "npm" -- "${cur}") )
|
|
39
|
+
return 0
|
|
40
|
+
;;
|
|
41
|
+
--language)
|
|
42
|
+
COMPREPLY=( $(compgen -W "rust python typescript javascript go c c++ c# java ruby php swift kotlin zig" -- "${cur}") )
|
|
43
|
+
return 0
|
|
44
|
+
;;
|
|
45
|
+
--limit|--interval)
|
|
46
|
+
return 0
|
|
47
|
+
;;
|
|
48
|
+
*)
|
|
49
|
+
;;
|
|
50
|
+
esac
|
|
51
|
+
|
|
52
|
+
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
|
53
|
+
return 0
|
|
54
|
+
}
|
|
55
|
+
complete -F _ghfind ghfind
|
package/completions/ghfind.fish
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
|
-
# ghfind fish completion
|
|
2
|
-
# Source: source (ghfind --completion fish | psub)
|
|
3
|
-
|
|
4
|
-
complete -c ghfind -l json -d "JSON output"
|
|
5
|
-
complete -c ghfind -l csv -d "CSV output"
|
|
6
|
-
complete -c ghfind -l markdown -d "Markdown table output"
|
|
7
|
-
complete -c ghfind -l count -d "Only result count"
|
|
8
|
-
complete -c ghfind -l limit -d "Max results" -r
|
|
9
|
-
complete -c ghfind -l sort -d "Sort strategy" -r -f -a "best-match stars updated forks"
|
|
10
|
-
complete -c ghfind -l token -d "GitHub token" -r
|
|
11
|
-
complete -c ghfind -l trending -d "Trending mode"
|
|
12
|
-
complete -c ghfind -l language -d "Trending language filter" -r -f -a "rust python typescript javascript go c c++ c# java ruby php swift kotlin zig"
|
|
13
|
-
complete -c ghfind -l since -d "Trending period" -r -f -a "daily weekly monthly"
|
|
14
|
-
complete -c ghfind -l pipe -d "Pipe target" -r -f -a "clone open"
|
|
15
|
-
complete -c ghfind -l format -d "Output format" -r -f -a "urls names ssh-urls clone-commands ids"
|
|
16
|
-
complete -c ghfind -l registry -d "Registry for pkg" -r -f -a "npm"
|
|
17
|
-
|
|
18
|
-
complete -c ghfind -l watch -d "Watch mode"
|
|
19
|
-
complete -c ghfind -l interval -d "Watch interval seconds" -r
|
|
20
|
-
complete -c ghfind -l version -d "Print version"
|
|
21
|
-
complete -c ghfind -l help -d "Print help"
|
|
22
|
-
complete -c ghfind -l completion -d "Shell" -r -f -a "bash zsh fish"
|
|
23
|
-
|
|
24
|
-
complete -c ghfind -
|
|
1
|
+
# ghfind fish completion
|
|
2
|
+
# Source: source (ghfind --completion fish | psub)
|
|
3
|
+
|
|
4
|
+
complete -c ghfind -l json -d "JSON output"
|
|
5
|
+
complete -c ghfind -l csv -d "CSV output"
|
|
6
|
+
complete -c ghfind -l markdown -d "Markdown table output"
|
|
7
|
+
complete -c ghfind -l count -d "Only result count"
|
|
8
|
+
complete -c ghfind -l limit -d "Max results" -r
|
|
9
|
+
complete -c ghfind -l sort -d "Sort strategy" -r -f -a "best-match stars updated forks"
|
|
10
|
+
complete -c ghfind -l token -d "GitHub token" -r
|
|
11
|
+
complete -c ghfind -l trending -d "Trending mode"
|
|
12
|
+
complete -c ghfind -l language -d "Trending language filter" -r -f -a "rust python typescript javascript go c c++ c# java ruby php swift kotlin zig"
|
|
13
|
+
complete -c ghfind -l since -d "Trending period" -r -f -a "daily weekly monthly"
|
|
14
|
+
complete -c ghfind -l pipe -d "Pipe target" -r -f -a "clone open"
|
|
15
|
+
complete -c ghfind -l format -d "Output format" -r -f -a "urls names ssh-urls clone-commands ids"
|
|
16
|
+
complete -c ghfind -l registry -d "Registry for pkg" -r -f -a "npm"
|
|
17
|
+
|
|
18
|
+
complete -c ghfind -l watch -d "Watch mode"
|
|
19
|
+
complete -c ghfind -l interval -d "Watch interval seconds" -r
|
|
20
|
+
complete -c ghfind -l version -d "Print version"
|
|
21
|
+
complete -c ghfind -l help -d "Print help"
|
|
22
|
+
complete -c ghfind -l completion -d "Shell" -r -f -a "bash zsh fish"
|
|
23
|
+
complete -c ghfind -l as -d "Share format" -r -f -a "markdown plain gh-cli short"
|
|
24
|
+
complete -c ghfind -l remote -d "Skill search: query skills.sh instead of this machine"
|
|
25
|
+
complete -c ghfind -l local -d "Skill search: force the local scan (default)"
|
|
26
|
+
complete -c ghfind -l copy -d "Share: also copy the snippet to the clipboard"
|
|
27
|
+
complete -c ghfind -l raw -d "Readme: print the raw markdown with no header"
|
|
28
|
+
|
|
29
|
+
complete -c ghfind -f -a "login init doctor org user bookmarks history topics saved readme share pkg mcp skill trending deep-dive compare"
|
package/completions/ghfind.zsh
CHANGED
|
@@ -1,40 +1,53 @@
|
|
|
1
|
-
# ghfind zsh completion
|
|
2
|
-
# Source: source <(ghfind --completion zsh)
|
|
3
|
-
|
|
4
|
-
_ghfind() {
|
|
5
|
-
local -a opts
|
|
6
|
-
opts=(
|
|
7
|
-
'--json[JSON output]'
|
|
8
|
-
'--csv[CSV output]'
|
|
9
|
-
'--markdown[Markdown table output]'
|
|
10
|
-
'--count[Only result count]'
|
|
11
|
-
'--limit[Max results]:limit:'
|
|
12
|
-
'--sort[Sort strategy]:(best-match stars updated forks)'
|
|
13
|
-
'--token[GitHub token]:token:'
|
|
14
|
-
'--trending[Trending mode]'
|
|
15
|
-
'--language[Trending language filter]:language:'
|
|
16
|
-
'--since[Trending period]:(daily weekly monthly)'
|
|
17
|
-
'--pipe[Pipe target]:(clone open)'
|
|
18
|
-
'--format[Output format]:(urls names ssh-urls clone-commands ids)'
|
|
19
|
-
'--registry[Registry for pkg]:(npm)'
|
|
20
|
-
|
|
21
|
-
'--watch[Watch mode]'
|
|
22
|
-
'--interval[Watch interval seconds]:seconds:'
|
|
23
|
-
'--version[Print version]'
|
|
24
|
-
'--help[Print help]'
|
|
25
|
-
'--completion[Shell]:(bash zsh fish)'
|
|
26
|
-
|
|
27
|
-
'
|
|
28
|
-
'
|
|
29
|
-
'
|
|
30
|
-
'
|
|
31
|
-
|
|
32
|
-
'
|
|
33
|
-
'
|
|
34
|
-
'
|
|
35
|
-
'
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
1
|
+
# ghfind zsh completion
|
|
2
|
+
# Source: source <(ghfind --completion zsh)
|
|
3
|
+
|
|
4
|
+
_ghfind() {
|
|
5
|
+
local -a opts
|
|
6
|
+
opts=(
|
|
7
|
+
'--json[JSON output]'
|
|
8
|
+
'--csv[CSV output]'
|
|
9
|
+
'--markdown[Markdown table output]'
|
|
10
|
+
'--count[Only result count]'
|
|
11
|
+
'--limit[Max results]:limit:'
|
|
12
|
+
'--sort[Sort strategy]:(best-match stars updated forks)'
|
|
13
|
+
'--token[GitHub token]:token:'
|
|
14
|
+
'--trending[Trending mode]'
|
|
15
|
+
'--language[Trending language filter]:language:'
|
|
16
|
+
'--since[Trending period]:(daily weekly monthly)'
|
|
17
|
+
'--pipe[Pipe target]:(clone open)'
|
|
18
|
+
'--format[Output format]:(urls names ssh-urls clone-commands ids)'
|
|
19
|
+
'--registry[Registry for pkg]:(npm)'
|
|
20
|
+
|
|
21
|
+
'--watch[Watch mode]'
|
|
22
|
+
'--interval[Watch interval seconds]:seconds:'
|
|
23
|
+
'--version[Print version]'
|
|
24
|
+
'--help[Print help]'
|
|
25
|
+
'--completion[Shell]:(bash zsh fish)'
|
|
26
|
+
'--as[Share format]:(markdown plain gh-cli short)'
|
|
27
|
+
'--remote[Skill search: query skills.sh instead of this machine]'
|
|
28
|
+
'--local[Skill search: force the local scan (default)]'
|
|
29
|
+
'--copy[Share: also copy the snippet to the clipboard]'
|
|
30
|
+
'--raw[Readme: print the raw markdown with no header]'
|
|
31
|
+
|
|
32
|
+
'login[Import a GitHub token from the gh CLI or paste one]'
|
|
33
|
+
'init[Run the setup wizard]'
|
|
34
|
+
'doctor[Environment diagnostics]'
|
|
35
|
+
'org[Org profile]:org name:'
|
|
36
|
+
'user[User profile]:user name:'
|
|
37
|
+
'bookmarks[List saved repos]:query:'
|
|
38
|
+
'history[List past searches]:query:'
|
|
39
|
+
'topics[Browse popular GitHub topics]'
|
|
40
|
+
'saved[List saved searches]'
|
|
41
|
+
'readme[Print a repository README]:owner/repo:'
|
|
42
|
+
'share[Print a share snippet]:owner/repo:'
|
|
43
|
+
'pkg[Search packages]:query:'
|
|
44
|
+
'trending[Trending repos, optionally by language]'
|
|
45
|
+
'deep-dive[Repo deep-dive: languages, contributors, README]:owner/repo:'
|
|
46
|
+
'mcp[Run the MCP server for AI agents (stdio)]'
|
|
47
|
+
'skill[Print an agent skill guide, or search with: skill search <query>]:skill name:'
|
|
48
|
+
'compare[Compare repositories]'
|
|
49
|
+
)
|
|
50
|
+
_arguments "${opts[@]}" '*:query:'
|
|
51
|
+
}
|
|
52
|
+
|
|
40
53
|
compdef _ghfind ghfind
|