Metadata-Version: 2.4
Name: laburator
Version: 0.1.0
Summary: CLI job-search assistant powered by LangGraph
Keywords: job-search,cli,langgraph,llm,career
Author: Santiago Kalerman
License-Expression: MIT
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Office/Business :: News/Diary
Requires-Dist: typer>=0.12
Requires-Dist: langgraph>=0.2
Requires-Dist: httpx>=0.28
Requires-Dist: pydantic>=2.0
Requires-Dist: pydantic-settings>=2.0
Requires-Python: >=3.12
Project-URL: Homepage, https://github.com/skalerman/laburator
Project-URL: Repository, https://github.com/skalerman/laburator
Description-Content-Type: text/markdown

# Laburator

CLI job-search assistant powered by LangGraph. Fetches job listings via API, processes them through an LLM, and generates tailored CVs, cover letters, and interview questions for each position.

## Installation

```bash
# Clone the repo
git clone <repo-url>
cd laburator

# Install with pip (editable, recommended)
pip install -e .

# Or with uv
uv pip install -e .

# Verify it works
laburator --help
```

## Setup

Copy `.env.example` to `.env` and fill in your API keys:

```bash
cp .env.example .env
```

### API Keys

Laburator requires two API keys. Both go in the `.env` file.

#### OpenCode Zen (LLM)

Used to generate CVs, cover letters, analysis, etc.

1. Go to **https://opencode.ai/zen** and sign up.
2. Once logged in, create an API key from the dashboard.
3. Copy it into `.env` as `MODEL_API_KEY`.

The endpoint and model are preconfigured in `.env.example`:

```
MODEL_API_KEY=sk-...
MODEL_API_ENDPOINT=https://opencode.ai/zen/v1
MODEL_NAME=deepseek-v4-flash-free
```

#### jsearch API (job search)

Used to fetch live job listings.

1. Go to **https://openwebninja.com** and sign up.
2. Subscribe to the **jsearch API** plan (free tier: 200 requests/month).
3. Copy your API key into `.env` as `JOB_SEARCH_API_KEY`:

```
JOB_SEARCH_API_KEY=ak_...
```

### CV

Create your own `cv.md` at the project root with your personal experience, skills, and education. This is used by the LLM to tailor CVs, cover letters, and interview questions for each job.

A sample is provided as reference:

```bash
cp cv.md.example cv.md   # then edit it with your own data
```

The CV supports any markdown content — sections like Summary, Experience, Education, Skills, and Languages are all parsed and passed as context to every skill.

### LLM Wiki (optional)

If you have reference knowledge — technical notes, company background, industry research — you can place `.md` files in `~/Proyectos/llmwiki/wiki/` (or the path configured as `LLMWIKI_DIR` in `.env`). These files are loaded and injected into every skill prompt as supplementary context, giving the LLM more relevant background to work with.

### Skills (custom prompts)

Skills are **markdown files** containing the system prompt for each LLM call. Built-in skills ship with the package:

| File | Generates |
|------|-----------|
| `jobsynthesis.md` | Job analysis |
| `createcv.md` | Tailored CV |
| `presentationletter.md` | Cover letter |
| `interviewquestions.md` | Interview Q&A |

To customise a skill, create `~/.config/laburator/skills/<name>.md` with the same filename — it will take precedence over the built-in. For example:

```bash
mkdir -p ~/.config/laburator/skills
# Override the CV prompt
cp src/laburator/skills/createcv.md ~/.config/laburator/skills/
# Now edit ~/.config/laburator/skills/createcv.md to your liking
```

Every skill call receives the job listing (JSON), your CV, and the wiki knowledge base as context automatically.

## Output

Results are saved under `~/.local/share/laburator/output/`, organized by date:

```
~/.local/share/laburator/output/
├── cache/                          # cached job listings (JSON)
│   └── python-developer/
│       └── jobs.json
└── 2026-06-19/                     # one folder per run date
    ├── ait-python-developer/       # one folder per job
    │   ├── job.md                  #   job analysis (skills, summary)
    │   ├── cv.md                   #   tailored CV
    │   ├── presentation.md         #   cover letter
    │   └── interview.md            #   interview questions
    ├── randstad-usa-senior-full-stack-python-developer/
    │   └── ...
    └── ...
```

Files appear in real time as each skill completes — you don't have to wait for the full pipeline to finish.

## Usage

```bash
# Search for jobs (fetch-only, no LLM calls)
laburator search "python developer" --pages 1 --remote

# Run the full pipeline: fetch + LLM analysis + output files
laburator synth "python developer" --pages 1 --remote

# List cached searches
laburator list

# Run a single skill on a cached job
laburator run <job-id> --skill createcv

# Show configuration
laburator config
```

## Verification

Run `laburator config` to confirm both keys are loaded (they'll be partially masked in the output).
