seek ships as an agent plugin: a router hook rewrites the agent's grep / rg / git grep calls into seek searches, and a seek-search skill teaches the query syntax. No CLI change.
Upgrade. Nothing to do. No Go source,
go.mod, orgo.sumchange since v0.14.0; the binary differs only in the version and build stamps it embeds. No re-index, no cache-layout change, no flag changes. The plugin installs separately and routes nothing until you install it.
What changes for you
- Install, instead of pasting a prompt.
claude plugin marketplace add dualeai/seek, thenclaude plugin install seek-router@seek --scope user. Codex:codex plugin marketplace add dualeai/seek, thencodex plugin add seek-router, and trustseek-routeronce under/hooks. Try it without installing:claude --plugin-dir ./plugins/seek-router. - Shell searches route to seek.
grep,egrep,rg,ag,ack, andgit grepare rewritten in place; seek then runs in the agent's own shell, so its cost and its output stay visible.grep -r "parseToken" --include="*.go" . 2>/dev/null | head -20 -> seek -n 20 'content:parseToken' - Definitions use the symbol index. A pattern shaped like
func Name,def Name,class Name,type Name, orfn Namebecomessym:Name -m 1, so you get the definition, not every mention. - The agent is told what it lost. Every rewrite carries a notice: results are BM25-ranked, capped at 20 files, not exhaustive, and
--includefilters were dropped, which widens scope. The notice names the bypass. - Off switch.
SEEK_ROUTER=offin the environment disables routing for a session; as a command prefix it exempts one call:SEEK_ROUTER=off grep -rn 'PATTERN' .. Use it for renames, refactors, and counting call sites. - Doubt means passthrough. Untouched: pipe filters (
ls | grep foo), counts, redirects, compound commands, unbalanced quotes, any flag the router cannot map,find, and every search a harness runs through its own tool instead of a shell command. The router also does nothing whenseekis not onPATH. - The skill works alone.
seek-searchdocuments the filters, flags, path operands, and pitfalls, so a harness with no pre-tool hook still gets the query syntax.
Dev/test
plugins/seek-router/bin/router.shis POSIXshplusawk, with nojqdependency. Its JSON reader pulls only the keys the rewrite needs;\uXXXXand any other escape it cannot decode fall out as passthrough.- The router always exits 0. Claude Code reads exit 2 as a deny and shows the hook's stderr to the model as the reason, so a crash would block search instead of degrading to grep. Every fixture asserts the exit code as well as the decision.
shq()single-quotes the query and every path operand — the only interpolation points, and the one place where a stray quote would turn a safe command into an injection.- A trailing
2>/dev/nullor| head -Nis peeled off before the compound-command guard, because neither changes which files match.head -Ntightens the file cap only when it asks for fewer than the default 20. make test-plugin(58 assertions: 52 payload fixtures, 8 of them quoting and injection cases, plus manifest and skill-frontmatter checks) now runs insidemake test-static, so a hook regression breaks CI.- Manifests for both harnesses:
.claude-plugin/marketplace.json, the plugin's Claude and agent-plugins.org manifests,hooks/hooks.jsonwith per-command prefilters, and a repo-local.codex/hooks.json. - The README drops its 112-line bootstrap prompt for install commands and a short instruction-file snippet.
CLAUDE.mdgains the project writing rules and a router section;.claude/and.codex/gain committed agent settings.
Full changelog: v0.14.0...v0.15.0