github dualeai/seek v0.15.0

latest releases: v0.15.2, v0.15.1
8 hours ago

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, or go.sum change 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, then claude plugin install seek-router@seek --scope user. Codex: codex plugin marketplace add dualeai/seek, then codex plugin add seek-router, and trust seek-router once under /hooks. Try it without installing: claude --plugin-dir ./plugins/seek-router.
  • Shell searches route to seek. grep, egrep, rg, ag, ack, and git grep are 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, or fn Name becomes sym: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 --include filters were dropped, which widens scope. The notice names the bypass.
  • Off switch. SEEK_ROUTER=off in 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 when seek is not on PATH.
  • The skill works alone. seek-search documents 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.sh is POSIX sh plus awk, with no jq dependency. Its JSON reader pulls only the keys the rewrite needs; \uXXXX and 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/null or | head -N is peeled off before the compound-command guard, because neither changes which files match. head -N tightens 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 inside make 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.json with 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.md gains the project writing rules and a router section; .claude/ and .codex/ gain committed agent settings.

Full changelog: v0.14.0...v0.15.0

Don't miss a new seek release

NewReleases is sending notifications on new releases.