Sistema locale e modulare per cercare, valutare e compilare candidature di lavoro online, pilotato da un agente AI pluggable tramite MCP. Tutto locale: niente servizi esterni per ricerca, parsing CV, ranking, generazione, automazione browser o storage.
Un daemon locale persistente (FastAPI/uvicorn) è l'unica fonte di verità ed espone:
- MCP via Streamable HTTP (
/mcp) — per l'agente (Claude Code, modello locale, ecc.); - WebSocket (
/ext) — per l'estensione browser MV3 (Fase 5); - HTTP/API + dashboard (
/api,/) — per il supervisore umano.
La logica vive in core/*_service.py (testabile, niente import MCP/HTTP); i tool MCP sono wrapper
sottili; il controllo browser è dietro la porta browser.port.BrowserDriver con implementazioni
intercambiabili (MVP via CDP/claude-in-chrome → estensione custom).
Vedi il piano completo: ~/.claude/plans/voglio-sviluppare-un-sistema-tingly-cook.md.
Requisiti: Python ≥ 3.10, uv.
uv sync # crea .venv e installa le dipendenze
uv run alembic upgrade head # crea il DB SQLite (+ tabelle vec0)
uv run autojobd # avvia il daemon su 127.0.0.1:8765
uv run pytest # testHealth check: GET http://127.0.0.1:8765/health e /ready.
uv sync
uv run alembic upgrade head # DB SQLite + tabelle vec0
uv run autojobd # daemon (cockpit: http://127.0.0.1:8765/ , MCP: /mcp/)- Profilo da CV: dall'agente MCP
parse_cv→normalize_cv(popola profilo con provenance). Richiede LM Studio: parte da solo al primo uso (autostart) con il modello di default; serve anche un modello embedding (es.bge-m3) per il matching. - Ricerca + ranking:
run_search(keywords=..., location=...)(multi-portale → dedup → ranking), oppure incolla un annuncio conextract_job_posting(pasted_text=...)poirank_job_matches. - Review nel cockpit: apri
http://127.0.0.1:8765/→ tab Match, autorizza con un click. - Browser reale: avvia Chrome con
--remote-debugging-port=9222, impostaAUTOJOB_BROWSER_DRIVER=playwrighteAUTOJOB_CDP_URL=http://127.0.0.1:9222(oppure carica l'estensioneextension/e usaAUTOJOB_BROWSER_DRIVER=extension). - Candidatura: naviga alla pagina,
fill_application(job_id)(in manual non invia), poisubmit_application(application_id, force=true)quando confermi.
Il daemon spegne LM Studio e se stesso dopo 30 min di inattività (autojob down per farlo subito).
uv run pytest # tutto (include test con chromium reale)
uv run pytest -m "not browser" # senza chromium (veloce)Fasi 0–6 + lifecycle + cockpit complete e testate (48 test). Roadmap completa e decisioni nel
piano: ~/.claude/plans/voglio-sviluppare-un-sistema-tingly-cook.md.