Skip to content

## Implement: biblio pool promote — move project-local papers to a pool

Phase 1

Goal

(promoted from note)

Context

(see source note)

Prompt

Fix the issue described in /storage2/arash/projects/projio/docs/log/issue/issue-arash-20260403-205942-590539.md. Read it first, then implement the proposed fix.

Acceptance Criteria

  • [ ]

Result

Completed in 274.5s (1 steps, model: opus)

Session: 1fc76032-089b-4d86-9548-f0541f590089 Result note: /storage2/arash/worklog/workflow/captures/20260403-210453-f62fb1/note.md

Output

Good — pool.py shows 245 lines added. The implementation is complete across all five files:

**Summary of changes:**

1. **`packages/biblio/src/biblio/pool.py`** — Added `PoolPromoteResult` dataclass and `promote_to_pool()` function that:
   - Copies PDF from project `bib/articles/{ck}/` to pool
   - Copies derivatives (docling, grobid, openalex, html) to pool
   - Merges BibTeX entries into pool's `bib/srcbib/promoted.bib`
   - Replaces local PDF with symlink to pool copy
   - Handles duplicates, missing PDFs, dry-run mode

2. **`packages/biblio/src/biblio/mcp.py`** — Added `pool_promote()` MCP wrapper that resolves pool root from target param or config, calls `promote_to_pool()`, and returns structured results dict

3. **`src/projio/mcp/biblio.py`** — Added `biblio_pool_promote()` projio MCP tool with proper availability check and error handling

4. **`src/projio/mcp/server.py`** — Registered `biblio_pool_promote` tool on the FastMCP server

5. **`packages/biblio/src/biblio/cli.py`** — Added `biblio pool promote` CLI subcommand with `--citekeys` and `--all-local` options

## Next Steps

1. Run `make test` in both projio and packages/biblio to verify the changes don't break existing tests.
2. Test the promote workflow end-to-end: `biblio pool promote --citekeys <key> --dry-run` on a project with a configured pool.
3. Update the issue status to done and update CLAUDE.md's MCP tool table to include `biblio_pool_promote`.