skills/exa-search/SKILL.md
Semantic web search, content extraction, and code-context retrieval via Exa AI. Use for intent-based search ("Python async job queue libraries"), fetching clean page content from URLs, or pulling GitHub / Stack Overflow / docs as a single LLM-ready code block. Stronger than keyword search for agent workflows.
npx skillsauth add junghan0611/agent-config exa-searchInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Three subcommands wrapping the Exa AI API:
search.js — neural web search (/search, via official exa-js SDK)contents.js — extract clean text from known URLs (/contents, via exa-js)code.js — token-efficient code context aggregated from GitHub + Stack Overflow + docs (/context, direct fetch — not yet in SDK)~/.env.local if you source it, or ~/.profile):
export EXA_API_KEY="your-key-here"
cd {baseDir}
pnpm install
| Goal | Command |
|------|---------|
| Find pages by meaning (not exact keywords) | search.js |
| Pull specific code patterns / API usage into context | code.js |
| You already have a URL and want clean text | contents.js |
| Get a structured JSON answer with citations | search.js --output-schema |
code.js is usually right when the user wants to write code against a library or pattern: it returns one merged block with snippets and explanations, ready to paste into an LLM context. search.js returns URL-keyed result objects and is right for "what's the latest news / paper / discussion on X".
{baseDir}/search.js "intent-based query" [options]
By default returns highlights only (token-efficient per Exa's guide for coding agents). Combine flags to add content modes — they are not mutually exclusive.
| Flag | Purpose |
|------|---------|
| -n, --num-results <n> | Default 10 |
| --type <type> | auto (default) | fast (~450ms) | instant (~250ms) | deep-lite | deep (multi-step) | deep-reasoning (hardest synthesis) |
| --text | Include full text (capped by --max-chars) |
| --highlights | Include query-relevant excerpts (default if no content flag set) |
| --summary | Include AI-written summary |
| --max-chars <n> | Cap text length, default 20000 |
| --category <cat> | company | research paper | news | pdf | tweet | personal site | financial report | people |
| --include-domains <list> | Comma-separated |
| --exclude-domains <list> | Comma-separated |
| --start-date <iso> / --end-date <iso> | Filter by published date |
| --output-schema <file> | Path to JSON schema → structured grounded output |
| --json | Raw JSON instead of formatted markdown |
# Default: 10 results with highlights
search.js "Python async job queue libraries"
# Deep research with full text
search.js "transformer scaling laws" --type deep --text
# Filter by source + date
search.js "AI safety policy" --category news --start-date 2026-01-01
# Domain-scoped
search.js "vector index benchmarks" --include-domains "arxiv.org,papers.nips.cc"
# Structured output (grounded JSON with citations)
search.js "top open source vector DBs" --output-schema ./vectordb.schema.json
--output-schema (structured output)Pass a JSON schema; Exa returns output.content matching the schema plus output.grounding with field-level citations. Max nesting depth 2, max 10 total properties. Do not add citation/confidence fields to the schema — they come back automatically.
Schema example:
{
"type": "object",
"required": ["companies"],
"properties": {
"companies": {
"type": "array",
"items": {
"type": "object",
"required": ["name"],
"properties": {
"name": { "type": "string" },
"description": { "type": "string" }
}
}
}
}
}
Works on every search --type; deep / deep-reasoning gives higher-quality synthesis for complex queries.
{baseDir}/contents.js <url> [<url> ...] [options]
Use when you already have URLs (from another search, a database, user input, RSS). Defaults to --text since /contents has no useful default.
| Flag | Purpose |
|------|---------|
| --text | Full text (default if no content flag) |
| --highlights | Excerpts only |
| --summary | AI summary |
| --max-chars <n> | Default 20000 |
| --max-age-hours <n> | Cache freshness: 0 = always livecrawl, -1 = cache only, 24 = livecrawl if older than 1 day, omit = default |
| --json | Raw JSON |
contents.js https://example.com/article
contents.js https://a.com/1 https://a.com/2 --highlights
contents.js https://example.com --text --max-chars 5000 --max-age-hours 0
{baseDir}/code.js "what you want to learn" [--tokens-num <n|dynamic>] [--json]
Returns a single merged block of code snippets + explanations from GitHub, Stack Overflow, and official docs. Designed for direct pasting into an LLM context window.
| Flag | Purpose |
|------|---------|
| --tokens-num <n\|dynamic> | Token budget: dynamic (default) or 50–100000. 5000 recommended, 10000 for extensive context |
| --json | Raw JSON (default prints just the response text) |
code.js "how to use cobra CLI in Go"
code.js "React useEffect cleanup pattern" --tokens-num 5000
code.js "postgres connection pooling in Go"
The default output is just the merged response text (no metadata), so it pipes cleanly into other tools or directly into a prompt.
All three commands print to stdout. Cost / token metadata goes to stderr, so it stays visible without polluting piped output:
search.js "query" > results.md # results only
search.js "query" 2>&1 | tee log # results + cost line
From the Exa coding-agents guide:
useAutoprompt is deprecated — do not pass itincludeUrls / excludeUrls do not exist — use --include-domains / --exclude-domainstokensNum is only for code.js (/context endpoint), not for /searchlivecrawl: "always" is deprecated — use --max-age-hours 0 on contents.jscategory: "company" | "people" does not support --exclude-domains or any date filtersearch.js --output-schema over the legacy /answer endpoint for grounded answersbrave-searchcode.js)search.js --output-schema)Brave is still right for: cheap broad-keyword lookups, country-scoped results, freshness windows (pd/pw/pm).
exa-js SDK — official, MIT, actively maintaineddocumentation
Cut an OpenClaw-style CalVer tag for a repo — gather commits, refresh CHANGELOG, promote, tag, push, stamp. Use when the user says '태그 박자', '릴리즈 컷', 'changelog 정리', 'cut a release/tag', or wants a vYYYY.M.D[-suffix] snapshot.
development
멀티하네스용 /recall 래퍼. native custom command surface가 없는 하네스(예: Antigravity, Codex)에서도 /recall에 해당하는 다축 맥락 복원을 skill로 호출한다. session-recap, NEXT.md·ROADMAP.md, git status/log, semantic-memory를 조합해 어제/오늘의 작업축을 되살린다.
tools
포지(forge) — 셀프호스팅 Forgejo 이슈/PR/라벨/코멘트 작업면. 힣 에이전트가 코드 면에서 일하는 공유 손. botment의 자식 패턴(가든 댓글면 → 코드 댓글면 endpoint swap). 'forge', 'forgejo', '포지', 'issue', 'pull request', '이슈', '풀리퀘', '코드 댓글', '라벨'.
tools
sync entwurf 자식을 들여다보는 손. 호출자가 'Mattering...'에 묶여있을 때 자식 분신이 무엇을 하는지 확인. entwurf_peers는 control socket 있는 세션만 보여주는데, 이 스킬은 자식 entwurf 세션(이름 태그 entwurf)까지 합쳐서 본다. 트리거: 'entwurf-peek', '분신 들여다보기', '진행 중 세션', 'sync entwurf 안에서', 'peek session', 'live session map', '분신 추적'.