diff --git a/custom-skills/31-notion-organizer/code/CLAUDE.md b/custom-skills/31-notion-organizer/code/CLAUDE.md index 7249819..a64e338 100644 --- a/custom-skills/31-notion-organizer/code/CLAUDE.md +++ b/custom-skills/31-notion-organizer/code/CLAUDE.md @@ -16,6 +16,42 @@ python scripts/schema_migrator.py --source [DB_ID] --target [DB_ID] --dry-run python scripts/async_organizer.py --database [DB_ID] --action cleanup ``` +## Semantic Search + +```bash +# Default browse mode (terminal table) +python scripts/notion_search.py "AI agents in 2026" + +# JSON output for piping +python scripts/notion_search.py "AI agents" --json | jq '.[].id' + +# Constrain to specific databases +python scripts/notion_search.py "MCP" --databases f8f19ede-32bd-43ac-9f60-0651f6f40afe + +# Property filter +python scripts/notion_search.py "MCP" --databases ID \ + --filter '{"Status": "Done", "Topic": "AI"}' + +# Fast mode (skip LLM stages) +python scripts/notion_search.py "exact term" --no-rerank --no-expand +``` + +The search runs four stages: + +1. **Expand** — Claude Haiku generates up to 5 query variants (synonyms + cross-language KR↔EN) +2. **Search** — Notion API searched per variant; results unioned + deduped at 30 candidates +3. **Enrich** — title, properties, and 200-char excerpt fetched per candidate +4. **Rerank** — Claude Haiku scores candidates against the *original* query; top N returned + +Results are cached for 24h (SHA256 of query + candidate IDs). Bypass with `--no-cache`. + +### Requirements + +| Env var | Purpose | +|---------|---------| +| `NOTION_API_KEY` (or legacy `NOTION_TOKEN`) | Notion integration token | +| `ANTHROPIC_API_KEY` (optional) | Use Claude SDK directly. If missing, the skill falls back to `claude -p` CLI. | + ## Scripts | Script | Purpose | diff --git a/custom-skills/31-notion-organizer/code/scripts/requirements.txt b/custom-skills/31-notion-organizer/code/scripts/requirements.txt index 3646af1..9e8a0fa 100644 --- a/custom-skills/31-notion-organizer/code/scripts/requirements.txt +++ b/custom-skills/31-notion-organizer/code/scripts/requirements.txt @@ -24,3 +24,7 @@ tqdm==4.66.1 # Optional: Fuzzy matching for duplicates # rapidfuzz==3.5.2 + +# Optional: required only for direct Anthropic SDK use. +# If missing, the search skill falls back to `claude -p` CLI. +anthropic>=0.40.0 diff --git a/custom-skills/31-notion-organizer/commands/notion-search.md b/custom-skills/31-notion-organizer/commands/notion-search.md new file mode 100644 index 0000000..edc0abe --- /dev/null +++ b/custom-skills/31-notion-organizer/commands/notion-search.md @@ -0,0 +1,50 @@ +--- +description: Search Notion workspace semantically (LLM-expanded + reranked). +argument-hint: " [--databases ID,...] [--filter JSON] [--limit N] [--no-rerank] [--no-expand] [--no-cache] [--json]" +--- + +Search the user's Notion workspace using semantic search powered by Claude Haiku query expansion and result reranking. Closes the gap left by Notion's keyword-only native search — handles synonyms, related concepts, and Korean ↔ English cross-language queries. + +## Usage + +Run the search script with the user's arguments: + +```bash +cd ~/Project/our-claude-skills/custom-skills/31-notion-organizer/code/scripts +python3 notion_search.py "$ARGUMENTS" +``` + +## Common patterns + +- **Default browse mode** (terminal table): `notion-search "AI agents in 2026"` +- **JSON for piping** (e.g. into the future notion-to-notebooklm push skill): `notion-search "AI agents" --json | jq '.[].id'` +- **Constrain to specific databases**: `notion-search "MCP" --databases f8f19ede-32bd-43ac-9f60-0651f6f40afe` +- **Property filter** (per-database mode): `notion-search "MCP" --databases ID --filter '{"Status": "Done"}'` +- **Fast mode (no LLM)**: `notion-search "exact phrase" --no-rerank --no-expand` + +## Requirements + +- `NOTION_API_KEY` or `NOTION_TOKEN` env var +- One of: + - `anthropic` SDK installed + `ANTHROPIC_API_KEY` env var, or + - Claude Code CLI (`claude` on PATH) + +The skill auto-detects which is available; SDK is preferred when both are present. + +## Output schema (JSON mode) + +```json +[ + { + "id": "abc-def-...", + "url": "https://notion.so/...", + "title": "Page title", + "relevance": 0.94, + "snippet": "Why it matched", + "excerpt": "First paragraph text...", + "properties": {"Status": "Done", "Topic": ["AI", "MCP"]} + } +] +``` + +`relevance` and `snippet` are `null` when `--no-rerank` is set. This schema is the contract for downstream tools (e.g., the future `notion-to-notebooklm` push skill).