{"_id":"@bluepaun/open-beacon-plugin","_rev":"3-abf4901ab9d3e31b7384d331fbd2389a","name":"@bluepaun/open-beacon-plugin","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@bluepaun/open-beacon-plugin","version":"0.1.0","keywords":["opencode","plugin","beacon","semantic-search","code-search"],"license":"MIT","_id":"@bluepaun/open-beacon-plugin@0.1.0","maintainers":[{"name":"bluepaun","email":"bluepaun@gmail.com"}],"homepage":"https://github.com/bluepaun/open-beacon-plugin#readme","bugs":{"url":"https://github.com/bluepaun/open-beacon-plugin/issues"},"dist":{"shasum":"6993abc2a077b6ca5d1230770dc61e122339ce0d","tarball":"https://registry.npmjs.org/@bluepaun/open-beacon-plugin/-/open-beacon-plugin-0.1.0.tgz","fileCount":15,"integrity":"sha512-wWTGXSjjgy4cKlHvyu1zjcVejrnzHlPdt1BTNGYaVPpXmJgs6Ov02yF42DLCYRPSRykS5TmdQP1wWKuenryFgg==","signatures":[{"sig":"MEQCIE0j+xL+WDJT/4zO9g+tpnlQhQeuyNz+XPSGhaNEnYCjAiBRyNg4Q1d5nQpuyfzcUmreZzlE5BwtvZiYlLPaQFkU7A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":622402},"main":"./dist/index.js","type":"module","module":"./dist/index.js","exports":{".":"./dist/index.js"},"gitHead":"621bce62fe446eca181921118eaef632d6c6d7ba","scripts":{"test":"bun test","build":"bun build src/index.ts --outdir dist --target bun --format esm","typecheck":"tsc --noEmit","prepublishOnly":"bun run typecheck && bun test && bun run build"},"_npmUser":{"name":"bluepaun","email":"bluepaun@gmail.com"},"repository":{"url":"git+https://github.com/bluepaun/open-beacon-plugin.git","type":"git"},"_npmVersion":"11.10.1","description":"OpenCode migration of Beacon semantic code search","directories":{},"_nodeVersion":"25.7.0","dependencies":{"zod":"4.1.8","picomatch":"^4.0.3","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.10","typescript":"^5.9.2","@types/picomatch":"^4.0.2","@opencode-ai/plugin":"^1.2.24"},"_npmOperationalInternal":{"tmp":"tmp/open-beacon-plugin_0.1.0_1773385726300_0.48424801208335166","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bluepaun/open-beacon-plugin","version":"0.1.1","keywords":["opencode","plugin","beacon","semantic-search","code-search"],"license":"MIT","_id":"@bluepaun/open-beacon-plugin@0.1.1","maintainers":[{"name":"bluepaun","email":"bluepaun@gmail.com"}],"homepage":"https://github.com/bluepaun/open-beacon-plugin#readme","bugs":{"url":"https://github.com/bluepaun/open-beacon-plugin/issues"},"dist":{"shasum":"faf5889b6ab559cacfe5ddd48317f174497691bd","tarball":"https://registry.npmjs.org/@bluepaun/open-beacon-plugin/-/open-beacon-plugin-0.1.1.tgz","fileCount":16,"integrity":"sha512-PsX2WXZc2YqQkv+++dm1NR+NgGdBdl5W0Z7OhKJEaG3Y2mOb0oBmmJEjFsNsFTz9y6NCcoPIosB0FQ8nYgH4Vw==","signatures":[{"sig":"MEQCIESA7v9hYkYx4l0FFOWhfkP6wl1zgPYDm/2wKzPA8kZhAiBcXg11ciOwQUyJBWMfRi23tssiDHNIbztSe5Vnc8N4Sg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":624272},"main":"./dist/index.js","type":"module","module":"./dist/index.js","exports":{".":"./dist/index.js"},"gitHead":"d15ed11d67449a8a9b73dd499cd37ebc0917df0a","scripts":{"test":"bun test","build":"bun build src/index.ts --outdir dist --target bun --format esm","typecheck":"tsc --noEmit","prepublishOnly":"bun run typecheck && bun test && bun run build"},"_npmUser":{"name":"bluepaun","email":"bluepaun@gmail.com"},"repository":{"url":"git+https://github.com/bluepaun/open-beacon-plugin.git","type":"git"},"_npmVersion":"11.10.1","description":"OpenCode migration of Beacon semantic code search","directories":{},"_nodeVersion":"25.7.0","dependencies":{"zod":"4.1.8","picomatch":"^4.0.3","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.10","typescript":"^5.9.2","@types/picomatch":"^4.0.2","@opencode-ai/plugin":"^1.2.24"},"_npmOperationalInternal":{"tmp":"tmp/open-beacon-plugin_0.1.1_1773387820401_0.5437295569809173","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@bluepaun/open-beacon-plugin","version":"0.1.2","description":"OpenCode migration of Beacon semantic code search","type":"module","main":"./dist/index.js","module":"./dist/index.js","exports":{".":"./dist/index.js"},"scripts":{"build":"bun build src/index.ts --outdir dist --target bun --format esm","test":"bun test","test:coverage":"bun run scripts/check-coverage-threshold.ts","typecheck":"tsc --noEmit","prepare":"husky","prepublishOnly":"bun run typecheck && bun test && bun run build"},"keywords":["opencode","plugin","beacon","semantic-search","code-search"],"repository":{"type":"git","url":"git+https://github.com/bluepaun/open-beacon-plugin.git"},"homepage":"https://github.com/bluepaun/open-beacon-plugin#readme","bugs":{"url":"https://github.com/bluepaun/open-beacon-plugin/issues"},"publishConfig":{"access":"public"},"license":"MIT","dependencies":{"jsonc-parser":"^3.3.1","picomatch":"^4.0.3","zod":"4.1.8"},"devDependencies":{"@opencode-ai/plugin":"^1.2.24","@types/picomatch":"^4.0.2","bun-types":"^1.3.10","husky":"^9.1.7","typescript":"^5.9.2"},"gitHead":"e86a6716b9fd5a855d0803bd9789e20672b6c9eb","_id":"@bluepaun/open-beacon-plugin@0.1.2","_nodeVersion":"25.7.0","_npmVersion":"11.10.1","dist":{"integrity":"sha512-6kuM4Kavagq9VUn53T9thsFRXeLBJ5a5VXPV9sVTu/A2i/Rdy2oHrn3HdIYoS5bgLECOOx5ztdhXgNHMijPqzg==","shasum":"30cb77f8303853f6a41c3f43ed272ecda96ea562","tarball":"https://registry.npmjs.org/@bluepaun/open-beacon-plugin/-/open-beacon-plugin-0.1.2.tgz","fileCount":16,"unpackedSize":630227,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDnvGudH2DOuSE0pi6UwU3bojwK0oJJ1lx84gq492ywnAiEA1XClv3a0GVEAS4wuMCr6N6nrQIK5Q7A2FD02LreW/HA="}]},"_npmUser":{"name":"bluepaun","email":"bluepaun@gmail.com"},"directories":{},"maintainers":[{"name":"bluepaun","email":"bluepaun@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/open-beacon-plugin_0.1.2_1773571338901_0.8218723992544337"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-13T07:08:46.204Z","modified":"2026-03-15T10:42:19.158Z","0.1.0":"2026-03-13T07:08:46.498Z","0.1.1":"2026-03-13T07:43:40.546Z","0.1.2":"2026-03-15T10:42:19.041Z"},"bugs":{"url":"https://github.com/bluepaun/open-beacon-plugin/issues"},"license":"MIT","homepage":"https://github.com/bluepaun/open-beacon-plugin#readme","keywords":["opencode","plugin","beacon","semantic-search","code-search"],"repository":{"type":"git","url":"git+https://github.com/bluepaun/open-beacon-plugin.git"},"description":"OpenCode migration of Beacon semantic code search","maintainers":[{"name":"bluepaun","email":"bluepaun@gmail.com"}],"readme":"<h1 align=\"center\">Open Beacon</h1>\n\n<p align=\"center\">\n  <strong>Turn OpenCode into Beacon-style semantic search.</strong><br>\n  Semantic code search that understands your codebase — find code by meaning, not just string matching.\n</p>\n\n<p align=\"center\">\n  <a href=\"#quick-start\">Quick Start</a> · <a href=\"#usage\">Usage</a> · <a href=\"#embedding-models\">Models</a> · <a href=\"#commands\">Commands</a> · <a href=\"#configuration\">Config</a>\n</p>\n\n---\n\nThis project is an OpenCode port/adaptation of the original Beacon plugin by `sagarmk`.\n\n- Original project: `https://github.com/sagarmk/beacon-plugin`\n- Original local source: `beacon-plugin/`\n- OpenCode migration target: `open-beacon-plugin/`\n\nLicensed under the MIT License. See `LICENSE`.\n\nThe README structure and product language here intentionally follow the original Beacon README closely, with the integration details rewritten for OpenCode.\n\n---\n\n## Quick Start\n\n### 1. Install Ollama (local embeddings, free)\n\n```bash\nbrew install ollama\nollama serve &\nollama pull nomic-embed-text\n```\n\n### 2. Configure the OpenCode plugin\n\nYou can enable the plugin in either place:\n\n- global: `~/.config/opencode/opencode.json` for all projects\n- project-local: `opencode.json` in the repo root for one project only\n\nAdd the plugin entry to whichever config you want to use:\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"plugin\": [\"@bluepaun/open-beacon-plugin\"]\n}\n```\n\nOpenCode installs npm plugins automatically with Bun at startup.\n\n### 3. Add Open Beacon config\n\nOpen Beacon has its own config file separate from `opencode.json`:\n\n- global: `~/.config/opencode/open-beacon.json` for shared defaults across projects\n- project-local: `.opencode/open-beacon.json` in the repo root for project-specific overrides\n\nRecommended setup:\n\nGlobal `~/.config/opencode/open-beacon.json`\n\n```json\n{\n  \"embedding\": {\n    \"api_base\": \"http://localhost:11434/v1\",\n    \"model\": \"nomic-embed-text\",\n    \"api_key_env\": \"\",\n    \"dimensions\": 768,\n    \"batch_size\": 10,\n    \"query_prefix\": \"search_query: \"\n  }\n}\n```\n\nProject-local `.opencode/open-beacon.json`\n\n```json\n{\n  \"storage\": {\n    \"path\": \".opencode/.beacon\"\n  }\n}\n```\n\nYou can use either file by itself, or both together. Project-local values override global ones.\n\n### 4. Start OpenCode\n\nThat is it. On session start, Open Beacon can:\n1. **Index your codebase** automatically in the background\n2. **Re-embed changed files** as you edit\n3. **Use hybrid search** across semantic similarity and keyword matching\n\n## Usage\n\nAfter installing, Open Beacon can index automatically on session start. Here are the essentials:\n\n### Force a full re-index\n\nUse the `beacon_reindex` tool.\n\nDeletes existing embeddings and rebuilds from scratch — useful after switching models or if the index gets stale.\n\n### Check index health\n\nUse the `beacon_index` tool.\n\nExample response shape:\n\n```json\n{\n  \"index\": {\n    \"files_indexed\": 38,\n    \"total_chunks\": 109,\n    \"eligible_files\": 38,\n    \"coverage_percent\": 100,\n    \"avg_chunks_per_file\": 2.9\n  },\n  \"sync\": {\n    \"status\": \"idle\",\n    \"last_sync\": \"2026-03-01T04:30:21.453Z\"\n  },\n  \"config\": {\n    \"model\": \"nomic-embed-text\",\n    \"provider\": \"ollama\"\n  }\n}\n```\n\nFor a quick numeric summary, use `beacon_index_status`.\n\n```json\n{\n  \"files_indexed\": 38,\n  \"total_chunks\": 114,\n  \"last_sync\": \"2026-03-01T04:30:21.453Z\",\n  \"embedding_model\": \"nomic-embed-text\",\n  \"embedding_endpoint\": \"http://localhost:11434/v1\"\n}\n```\n\n### Search your codebase\n\nUse `beacon_search` with a natural-language query:\n\n```text\nauthentication flow\n```\n\nTypical response:\n\n```json\n[\n  {\n    \"file\": \"src/middleware/auth.ts\",\n    \"lines\": \"12-45\",\n    \"similarity\": \"0.820\",\n    \"score\": \"0.740\",\n    \"preview\": \"export async function verifyAuth(req, res, next) { ... }\"\n  },\n  {\n    \"file\": \"src/routes/login.ts\",\n    \"lines\": \"8-32\",\n    \"similarity\": \"0.780\",\n    \"score\": \"0.650\",\n    \"preview\": \"router.post('/login', async (req, res) => { ... }\"\n  }\n]\n```\n\nHybrid search combines **semantic similarity**, **BM25 keyword matching**, and **identifier boosting** — so searching `auth flow` can still find code about authentication even if it never uses the word `auth`.\n\nOptions: `topK`, `threshold`, `path`, and `hybrid=false` for pure vector-style ranking.\n\n---\n\n## Embedding Models\n\nOpen Beacon runs on **open-source models by default** — no API keys, no cloud costs, fully local via [Ollama](https://ollama.com).\n\n| Model | Dims | Context | Speed | Best for |\n|-------|------|---------|-------|----------|\n| **nomic-embed-text** (default) | 768 | 8192 | Fast | General-purpose, great code search |\n| **mxbai-embed-large** | 1024 | 512 | Fast | Higher accuracy, larger vectors |\n| **snowflake-arctic-embed:l** | 1024 | 512 | Medium | Strong retrieval benchmarks |\n| **all-minilm** | 384 | 512 | Very fast | Lightweight, low resource usage |\n\nTo switch models, pull with Ollama and update your config:\n\n```bash\nollama pull mxbai-embed-large\n```\n\n```json\n// .opencode/open-beacon.json\n{\n  \"embedding\": {\n    \"model\": \"mxbai-embed-large\",\n    \"dimensions\": 1024,\n    \"query_prefix\": \"\"\n  }\n}\n```\n\nThen run `beacon_reindex` to rebuild with the new model.\n\n### Cloud Providers\n\nFor cloud-hosted embeddings, create `.opencode/open-beacon.json` in your repo:\n\n<details>\n<summary><strong>OpenAI</strong></summary>\n\n```bash\nexport OPENAI_API_KEY=\"sk-...\"\n```\n\n```json\n{\n  \"embedding\": {\n    \"api_base\": \"https://api.openai.com/v1\",\n    \"model\": \"text-embedding-3-small\",\n    \"api_key_env\": \"OPENAI_API_KEY\",\n    \"dimensions\": 1536,\n    \"batch_size\": 100,\n    \"query_prefix\": \"\"\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Voyage AI</strong></summary>\n\n```bash\nexport VOYAGE_API_KEY=\"pa-...\"\n```\n\n```json\n{\n  \"embedding\": {\n    \"api_base\": \"https://api.voyageai.com/v1\",\n    \"model\": \"voyage-code-3\",\n    \"api_key_env\": \"VOYAGE_API_KEY\",\n    \"dimensions\": 1024,\n    \"batch_size\": 50,\n    \"query_prefix\": \"\"\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>LiteLLM proxy</strong> (Vertex AI, Bedrock, Azure, etc.)</summary>\n\n```bash\npip install litellm\nlitellm --model vertex_ai/text-embedding-004 --port 4000\n```\n\n```json\n{\n  \"embedding\": {\n    \"api_base\": \"http://localhost:4000/v1\",\n    \"model\": \"vertex_ai/text-embedding-004\",\n    \"api_key_env\": \"LITELLM_API_KEY\",\n    \"dimensions\": 1024,\n    \"batch_size\": 50,\n    \"query_prefix\": \"\"\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Custom endpoint</strong></summary>\n\nAny server implementing the OpenAI `/v1/embeddings` API will work. Set `api_base`, `model`, `dimensions`, and optionally `api_key_env` in `.opencode/open-beacon.json`.\n\n</details>\n\n## Commands\n\nOpen Beacon indexes your codebase automatically on session start and re-embeds files as you edit — no manual steps needed.\n\n#### Search\n\n| Tool / Companion Command | Description |\n|---------|-------------|\n| `beacon_search` / `/search-code` | Hybrid code search — semantic + keyword + BM25 matching. Supports path scoping |\n\n#### Index\n\n| Tool / Companion Command | Description |\n|---------|-------------|\n| `beacon_index` / `/index` | Visual overview — files, chunks, coverage, provider |\n| `beacon_index_status` / `/index-status` | Quick health check — file count, chunk count, last sync |\n| `beacon_reindex` / `/reindex` | Force full re-index from scratch |\n| `beacon_run_indexer` / `/run-indexer` | Manually trigger indexing |\n| `beacon_terminate_indexer` / `/terminate-indexer` | Kill a running sync process |\n\n#### Config\n\n| Tool / Companion Command | Description |\n|---------|-------------|\n| `beacon_config` / `/config` | View and modify Open Beacon configuration |\n| `beacon_blacklist` / `/blacklist` | Prevent indexing of specific directories |\n| `beacon_whitelist` / `/whitelist` | Allow indexing in otherwise-blacklisted directories |\n\nOpen Beacon automatically registers bundled slash commands like `/search-code` and `/index`, the **code-explorer** subagent, and the bundled `semantic-search` skill by adding `templates/.opencode/skills` to `config.skills.paths`. Template assets remain bundled under `templates/.opencode/` for reference.\n\n<details>\n<summary><strong>Why Beacon?</strong></summary>\n\n- **Understands your questions** — ask where the auth flow is and get the relevant implementation, not every file containing `auth`\n- **Query expansion** — searches for `auth` can also find `authentication`, `authorize`, and `login`\n- **Stays in sync automatically** — hooks handle full index, incremental re-embedding on edits, and garbage collection\n- **Resilient** — retries with backoff on transient failures and keeps keyword-only fallback available\n- **Works with any embedding provider** — Ollama, OpenAI, Voyage AI, LiteLLM, or any OpenAI-compatible API\n- **Gives OpenCode better context** — tools, companion commands, agent assets, and grep redirection for smarter search\n\n</details>\n\n<details>\n<summary><strong>How It Works</strong></summary>\n\nOpen Beacon uses OpenCode plugin events and hooks to stay in sync with your codebase:\n\n| Hook | Trigger | What it does |\n|------|---------|-------------|\n| `session.created` | Every session | Full index or diff-based catch-up |\n| `file.edited` | File edits | Re-embeds the changed file |\n| `tool.execute.after` | `bash` | Garbage collects embeddings for deleted files |\n| `experimental.session.compacting` | Before context compaction | Injects index status so search capability survives compaction |\n| `tool.execute.before` | `grep` | Redirects grep to Beacon for semantic-style queries when the index is healthy |\n\n</details>\n\n<details>\n<summary><strong>Configuration</strong></summary>\n\nDefault configuration (`src/config/defaults.ts`):\n\n```json\n{\n  \"embedding\": {\n    \"api_base\": \"http://localhost:11434/v1\",\n    \"model\": \"nomic-embed-text\",\n    \"api_key_env\": \"\",\n    \"dimensions\": 768,\n    \"batch_size\": 10,\n    \"query_prefix\": \"search_query: \"\n  },\n  \"chunking\": {\n    \"strategy\": \"hybrid\",\n    \"max_tokens\": 512,\n    \"overlap_tokens\": 50\n  },\n  \"indexing\": {\n    \"include\": [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"...\"],\n    \"exclude\": [\"node_modules/**\", \"dist/**\", \"...\"],\n    \"max_file_size_kb\": 500,\n    \"auto_index\": true,\n    \"max_files\": 10000,\n    \"concurrency\": 4\n  },\n  \"search\": {\n    \"top_k\": 10,\n    \"similarity_threshold\": 0.35,\n    \"hybrid\": {\n      \"enabled\": true,\n      \"weight_vector\": 0.4,\n      \"weight_bm25\": 0.3,\n      \"weight_rrf\": 0.3,\n      \"doc_penalty\": 0.5,\n      \"identifier_boost\": 1.5,\n      \"debug\": false\n    }\n  },\n  \"storage\": {\n    \"path\": \".opencode/.beacon\"\n  }\n}\n```\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `embedding.api_base` | `http://localhost:11434/v1` | Embedding API endpoint |\n| `embedding.model` | `nomic-embed-text` | Embedding model name |\n| `embedding.dimensions` | `768` | Vector dimensions (must match model) |\n| `embedding.query_prefix` | `search_query: ` | Prefix prepended to search queries |\n| `indexing.include` | Common code patterns | Glob patterns for files to index |\n| `indexing.exclude` | `node_modules`, `dist`, etc. | Glob patterns to skip |\n| `indexing.max_file_size_kb` | `500` | Skip files larger than this |\n| `indexing.auto_index` | `true` | Auto-index on session start |\n| `indexing.concurrency` | `4` | Number of files to index in parallel |\n| `search.top_k` | `10` | Max results per query |\n| `search.similarity_threshold` | `0.35` | Minimum similarity score |\n| `search.hybrid.enabled` | `true` | Enable hybrid search |\n\n#### Global and per-repo overrides\n\nOpen Beacon looks for config in these places:\n\n- global: `~/.config/opencode/open-beacon.json`\n- project-local: `.opencode/open-beacon.json`\n\nThese values are deep-merged with the built-in defaults, and project-local values override global ones.\n\nGlobal example:\n\n```json\n{\n  \"embedding\": {\n    \"api_base\": \"http://localhost:11434/v1\",\n    \"model\": \"nomic-embed-text\",\n    \"dimensions\": 768,\n    \"query_prefix\": \"search_query: \"\n  }\n}\n```\n\nProject-local example:\n\n```json\n{\n  \"embedding\": {\n    \"api_base\": \"https://api.openai.com/v1\",\n    \"model\": \"text-embedding-3-small\",\n    \"api_key_env\": \"OPENAI_API_KEY\",\n    \"dimensions\": 1536\n  },\n  \"indexing\": {\n    \"include\": [\"**/*.py\"],\n    \"max_files\": 5000\n  }\n}\n```\n\nLegacy `.claude/beacon.json` is also supported as a fallback while migrating.\n\n#### Storage\n\nOpen Beacon stores its SQLite database at `.opencode/.beacon/embeddings.db` by default. This file is auto-generated and safe to delete — run `beacon_reindex` to rebuild.\n\n</details>\n\n<details>\n<summary><strong>Troubleshooting</strong></summary>\n\n### What if Ollama is down?\n\nOpen Beacon degrades gracefully when the embedding server is unreachable — it never blocks your session.\n\n| Scenario | Behavior |\n|----------|----------|\n| **Session start** | Sync is skipped or marked as failed, session continues normally |\n| **Search** | Falls back to keyword-only FTS/BM25 search |\n| **File edits** | Re-embedding fails and existing embeddings remain |\n| **Status tools** | Work normally from local DB state |\n\nStart Ollama at any time and run `beacon_run_indexer` to catch up.\n\n### Manual indexing\n\n| Tool | What it does |\n|---------|-------------|\n| `beacon_run_indexer` | Manually trigger indexing — useful when `auto_index` is off or after starting Ollama late |\n| `beacon_reindex` | Force a full re-index from scratch |\n| `beacon_terminate_indexer` | Kill a stuck sync process and clean up state |\n\n### Checking index health\n\nRun `beacon_index` for a full overview with coverage, file list, and provider info. For a quick numeric summary, use `beacon_index_status`.\n\nThings to look for:\n- **Low coverage %** — files may be excluded by glob patterns or file-size limits\n- **Sync status errors** — usually means the embedding server was unreachable during the last sync\n- **Stale index** — run `beacon_run_indexer` to refresh\n\n### Verifying search\n\nRun `beacon_search` with a test query to confirm search is working. If results include `FTS-only`, the embedding server is unreachable — search still works, but without semantic ranking.\n\n</details>\n\n## Development\n\n```bash\nbun test\nbun run typecheck\n```\n\nArchitecture notes are documented in `SPEC.md`.\n\n## Publishing\n\nTo publish Open Beacon for other users:\n\n```bash\nbun run typecheck\nbun test\nbun run build\nnpm publish --access public\n```\n\nIf you publish under a different npm scope, update the package name in `package.json` and the install snippet above.\n\n## License\n\nMIT. See `LICENSE`.\n","readmeFilename":"README.md"}