# paper-gap MVP todo

## Decisions
- Build one Rust crate first; split later only if needed.
- Stateless CLI: stdout by default, optional `--output`.
- Optional env tokens: `GITHUB_TOKEN`, `GITLAB_TOKEN`, Forgejo token if useful.
- `report` formats scan JSON from `--input` or stdin.
- `sources discover` uses DuckDuckGo HTML best-effort, marked brittle/informational.
- Local, on-demand CLI only: no background jobs, scheduler, dashboard, required DB, LLM judgement, preference ranking, hardware-fit scoring.
- Prefer official APIs over scraping; Papers with Code is one signal, not source of truth.

## Phase 1: Inspect repo
- [x] Check existing Rust workspace/files/conventions.
- [x] Reuse existing code if present.
- [x] Confirm crate/dependency baseline.

## Phase 2: CLI skeleton
- [x] Add commands: `scan`, `inspect`, `report`, `sources`, `sources discover`.
- [x] Add shared models/traits in modules, not separate crates yet.

## Phase 3: Paper providers
- [x] arXiv query/category/date/limit search.
- [x] Basic paper normalization.

## Phase 4: Code-link providers
- [x] Papers with Code lookup.
- [x] Preserve PWC as one signal only.

## Phase 5: Repository providers
- [x] GitHub search + inspect.
- [x] GitLab search + inspect.
- [x] Forgejo/Gitea search + inspect.
- [x] Codeberg as default Forgejo instance.

## Phase 6: Analysis/classification
- [x] Basic repo quality signals.
- [x] Deduplicate repos.
- [x] Transparent additive gap score.
- [x] Explain every score component.

## Phase 7: Reports
- [x] Markdown output.
- [x] JSON output.
- [x] `report --input -|file --format markdown|json`.

## Phase 8: Sources
- [x] `sources`, `sources --papers`, `sources --repos`.
- [x] `sources --check` lightweight health checks.
- [x] `sources discover --kind papers|repos|all`.

## Phase 9: Checks
- [x] Small runnable tests/self-checks for scoring, dedupe, report formatting.
- [x] Validate basic CLI paths.

## Later, only if needed
- [ ] Split into workspace crates when modules are painful.
- [ ] Add local storage/seen-paper tracking only if explicitly requested.
