{"owner":"TideDra","repo":"zotero-arxiv-daily","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["CLAUDE.md"],"skills":{"CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nZotero-arXiv-Daily recommends new arXiv/bioRxiv/medRxiv papers based on a user's Zotero library. It computes embedding similarity between new papers and the user's existing library, generates TLDRs via LLM, and delivers results by email. Designed to run as a GitHub Actions workflow at zero cost.\n\n## Commands\n\n```bash\n# Run the application\nuv run src/zotero_arxiv_daily/main.py\n\n# Run tests (excludes slow tests by default)\nuv run pytest\n\n# Run all tests including slow ones\nuv run pytest -m \"\"\n\n# Run a single test\nuv run pytest tests/test_utils.py::TestGlobMatch -v\n\n# Install/sync dependencies\nuv sync\n```\n\nNo linter or formatter is configured.\n\n## Architecture\n\nThe app follows a linear pipeline orchestrated by `Executor` (`src/zotero_arxiv_daily/executor.py`):\n\n1. **Fetch Zotero corpus** — retrieves user's library papers via pyzotero API\n2. **Filter corpus** — applies `include_path` glob patterns to select relevant collections\n3. **Retrieve new papers** — fetches from configured sources (arXiv RSS, bioRxiv/medRxiv REST API)\n4. **Rerank** — scores candidates by weighted similarity to corpus (newer Zotero papers weighted higher)\n5. **Generate TLDRs + affiliations** — via OpenAI-compatible LLM API\n6. **Render + send email** — HTML email via SMTP\n\n### Plugin Systems\n\n**Retrievers** (`src/zotero_arxiv_daily/retriever/`): Register via `@register_retriever` decorator, discovered by `get_retriever_cls()`. Each retriever implements `_retrieve_raw_papers()` and `convert_to_paper()`.\n\n**Rerankers** (`src/zotero_arxiv_daily/reranker/`): Register via `@register_reranker` decorator, discovered by `get_reranker_cls()`. Two implementations: `local` (sentence-transformers) and `api` (OpenAI-compatible embeddings endpoint).\n\n### Configuration\n\nUses Hydra + OmegaConf. Config is composed from `config/base.yaml` (defaults) + `config/custom.yaml` (user overrides). Environment variables are interpolated via `${oc.env:VAR_NAME,default}` syntax. Entry point uses `@hydra.main`.\n\n### Data Classes\n\n`Paper` and `CorpusPaper` in `src/zotero_arxiv_daily/protocol.py`. `Paper` has LLM-powered methods (`generate_tldr`, `generate_affiliations`) that call the OpenAI API directly.\n\n## Testing\n\nTests marked `@pytest.mark.slow` require heavy dependencies (e.g., sentence-transformers model download) and are skipped locally by default (`addopts = \"-m 'not slow'\"` in pyproject.toml). All other tests run with pure Python stubs (no Docker containers needed).\n\n```bash\n# Run tests (excludes slow tests)\nuv run pytest\n\n# Run all tests including slow ones\nuv run pytest -m \"\"\n\n# Run with coverage\nuv run pytest --cov=src/zotero_arxiv_daily --cov-report=term-missing\n```\n\n## gstack\n\nUse the `/browse` skill from gstack for all web browsing. Never use `mcp__claude-in-chrome__*` tools.\n\nAvailable skills: `/office-hours`, `/plan-ceo-review`, `/plan-eng-review`, `/plan-design-review`, `/design-consultation`, `/design-shotgun`, `/design-html`, `/review`, `/ship`, `/land-and-deploy`, `/canary`, `/benchmark`, `/browse`, `/connect-chrome`, `/qa`, `/qa-only`, `/design-review`, `/setup-browser-cookies`, `/setup-deploy`, `/retro`, `/investigate`, `/document-release`, `/codex`, `/cso`, `/autoplan`, `/plan-devex-review`, `/devex-review`, `/careful`, `/freeze`, `/guard`, `/unfreeze`, `/gstack-upgrade`, `/learn`.\n\nIf gstack skills aren't working, run `cd .claude/skills/gstack && ./setup` to build the binary and register skills.\n\n## Git Workflow\n\n- PRs should target the `dev` branch, not `main`\n- Current development branch: `dev`\n"},"files":{"CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nZotero-arXiv-Daily recommends new arXiv/bioRxiv/medRxiv papers based on a user's Zotero library. It computes embedding similarity between new papers and the user's existing library, generates TLDRs via LLM, and delivers results by email. Designed to run as a GitHub Actions workflow at zero cost.\n\n## Commands\n\n```bash\n# Run the application\nuv run src/zotero_arxiv_daily/main.py\n\n# Run tests (excludes slow tests by default)\nuv run pytest\n\n# Run all tests including slow ones\nuv run pytest -m \"\"\n\n# Run a single test\nuv run pytest tests/test_utils.py::TestGlobMatch -v\n\n# Install/sync dependencies\nuv sync\n```\n\nNo linter or formatter is configured.\n\n## Architecture\n\nThe app follows a linear pipeline orchestrated by `Executor` (`src/zotero_arxiv_daily/executor.py`):\n\n1. **Fetch Zotero corpus** — retrieves user's library papers via pyzotero API\n2. **Filter corpus** — applies `include_path` glob patterns to select relevant collections\n3. **Retrieve new papers** — fetches from configured sources (arXiv RSS, bioRxiv/medRxiv REST API)\n4. **Rerank** — scores candidates by weighted similarity to corpus (newer Zotero papers weighted higher)\n5. **Generate TLDRs + affiliations** — via OpenAI-compatible LLM API\n6. **Render + send email** — HTML email via SMTP\n\n### Plugin Systems\n\n**Retrievers** (`src/zotero_arxiv_daily/retriever/`): Register via `@register_retriever` decorator, discovered by `get_retriever_cls()`. Each retriever implements `_retrieve_raw_papers()` and `convert_to_paper()`.\n\n**Rerankers** (`src/zotero_arxiv_daily/reranker/`): Register via `@register_reranker` decorator, discovered by `get_reranker_cls()`. Two implementations: `local` (sentence-transformers) and `api` (OpenAI-compatible embeddings endpoint).\n\n### Configuration\n\nUses Hydra + OmegaConf. Config is composed from `config/base.yaml` (defaults) + `config/custom.yaml` (user overrides). Environment variables are interpolated via `${oc.env:VAR_NAME,default}` syntax. Entry point uses `@hydra.main`.\n\n### Data Classes\n\n`Paper` and `CorpusPaper` in `src/zotero_arxiv_daily/protocol.py`. `Paper` has LLM-powered methods (`generate_tldr`, `generate_affiliations`) that call the OpenAI API directly.\n\n## Testing\n\nTests marked `@pytest.mark.slow` require heavy dependencies (e.g., sentence-transformers model download) and are skipped locally by default (`addopts = \"-m 'not slow'\"` in pyproject.toml). All other tests run with pure Python stubs (no Docker containers needed).\n\n```bash\n# Run tests (excludes slow tests)\nuv run pytest\n\n# Run all tests including slow ones\nuv run pytest -m \"\"\n\n# Run with coverage\nuv run pytest --cov=src/zotero_arxiv_daily --cov-report=term-missing\n```\n\n## gstack\n\nUse the `/browse` skill from gstack for all web browsing. Never use `mcp__claude-in-chrome__*` tools.\n\nAvailable skills: `/office-hours`, `/plan-ceo-review`, `/plan-eng-review`, `/plan-design-review`, `/design-consultation`, `/design-shotgun`, `/design-html`, `/review`, `/ship`, `/land-and-deploy`, `/canary`, `/benchmark`, `/browse`, `/connect-chrome`, `/qa`, `/qa-only`, `/design-review`, `/setup-browser-cookies`, `/setup-deploy`, `/retro`, `/investigate`, `/document-release`, `/codex`, `/cso`, `/autoplan`, `/plan-devex-review`, `/devex-review`, `/careful`, `/freeze`, `/guard`, `/unfreeze`, `/gstack-upgrade`, `/learn`.\n\nIf gstack skills aren't working, run `cd .claude/skills/gstack && ./setup` to build the binary and register skills.\n\n## Git Workflow\n\n- PRs should target the `dev` branch, not `main`\n- Current development branch: `dev`\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nZotero-arXiv-Daily recommends new arXiv/bioRxiv/medRxiv papers based on a user's Zotero library. It computes embedding similarity between new papers and the user's existing library, generates TLDRs via LLM, and delivers results by email. Designed to run as a GitHub Actions workflow at zero cost.\n\n## Commands\n\n```bash\n# Run the application\nuv run src/zotero_arxiv_daily/main.py\n\n# Run tests (excludes slow tests by default)\nuv run pytest\n\n# Run all tests including slow ones\nuv run pytest -m \"\"\n\n# Run a single test\nuv run pytest tests/test_utils.py::TestGlobMatch -v\n\n# Install/sync dependencies\nuv sync\n```\n\nNo linter or formatter is configured.\n\n## Architecture\n\nThe app follows a linear pipeline orchestrated by `Executor` (`src/zotero_arxiv_daily/executor.py`):\n\n1. **Fetch Zotero corpus** — retrieves user's library papers via pyzotero API\n2. **Filter corpus** — applies `include_path` glob patterns to select relevant collections\n3. **Retrieve new papers** — fetches from configured sources (arXiv RSS, bioRxiv/medRxiv REST API)\n4. **Rerank** — scores candidates by weighted similarity to corpus (newer Zotero papers weighted higher)\n5. **Generate TLDRs + affiliations** — via OpenAI-compatible LLM API\n6. **Render + send email** — HTML email via SMTP\n\n### Plugin Systems\n\n**Retrievers** (`src/zotero_arxiv_daily/retriever/`): Register via `@register_retriever` decorator, discovered by `get_retriever_cls()`. Each retriever implements `_retrieve_raw_papers()` and `convert_to_paper()`.\n\n**Rerankers** (`src/zotero_arxiv_daily/reranker/`): Register via `@register_reranker` decorator, discovered by `get_reranker_cls()`. Two implementations: `local` (sentence-transformers) and `api` (OpenAI-compatible embeddings endpoint).\n\n### Configuration\n\nUses Hydra + OmegaConf. Config is composed from `config/base.yaml` (defaults) + `config/custom.yaml` (user overrides). Environment variables are interpolated via `${oc.env:VAR_NAME,default}` syntax. Entry point uses `@hydra.main`.\n\n### Data Classes\n\n`Paper` and `CorpusPaper` in `src/zotero_arxiv_daily/protocol.py`. `Paper` has LLM-powered methods (`generate_tldr`, `generate_affiliations`) that call the OpenAI API directly.\n\n## Testing\n\nTests marked `@pytest.mark.slow` require heavy dependencies (e.g., sentence-transformers model download) and are skipped locally by default (`addopts = \"-m 'not slow'\"` in pyproject.toml). All other tests run with pure Python stubs (no Docker containers needed).\n\n```bash\n# Run tests (excludes slow tests)\nuv run pytest\n\n# Run all tests including slow ones\nuv run pytest -m \"\"\n\n# Run with coverage\nuv run pytest --cov=src/zotero_arxiv_daily --cov-report=term-missing\n```\n\n## gstack\n\nUse the `/browse` skill from gstack for all web browsing. Never use `mcp__claude-in-chrome__*` tools.\n\nAvailable skills: `/office-hours`, `/plan-ceo-review`, `/plan-eng-review`, `/plan-design-review`, `/design-consultation`, `/design-shotgun`, `/design-html`, `/review`, `/ship`, `/land-and-deploy`, `/canary`, `/benchmark`, `/browse`, `/connect-chrome`, `/qa`, `/qa-only`, `/design-review`, `/setup-browser-cookies`, `/setup-deploy`, `/retro`, `/investigate`, `/document-release`, `/codex`, `/cso`, `/autoplan`, `/plan-devex-review`, `/devex-review`, `/careful`, `/freeze`, `/guard`, `/unfreeze`, `/gstack-upgrade`, `/learn`.\n\nIf gstack skills aren't working, run `cd .claude/skills/gstack && ./setup` to build the binary and register skills.\n\n## Git Workflow\n\n- PRs should target the `dev` branch, not `main`\n- Current development branch: `dev`\n","category":"root","tokens":916}]}