linkedin-applylisted
Install: claude install-skill Roxabi/roxabi-plugins
# LinkedIn Apply Skill
Analyze a LinkedIn job offer against your candidate profile and get an LLM-powered decision: **APPLY**, **REVIEW**, or **SKIP**.
Let:
VL := ~/.roxabi-vault/linkedin-apply/
SD := `$CLAUDE_PLUGIN_ROOT/../../scripts/`
## Phase 1 — Validate Arguments and Prerequisites
Extract LinkedIn URL from $ARGUMENTS. ¬URL → "Usage: /linkedin-apply <linkedin-job-url>" → stop.
URL valid ⟺ contains `linkedin.com` ∧ (`/jobs/view/` ∨ `/jobs/`).
Check prerequisites:
1. `VL/candidate.yaml` exists — ¬exists → run `/linkedin-apply-init` first
2. `python3 -c "import playwright, playwright_stealth, jinja2" 2>&1` — missing → `pip install playwright playwright-stealth jinja2 pyyaml`
3. Playwright Chromium installed — missing → `playwright install chromium`
## Phase 2 — Scrape the Job
```bash
cd <scripts_dir> && python3 scraper.py "<url>"
```
Capture stdout (JSON) + stderr (logs). Errors: `SessionExpiredError` → run `/linkedin-apply-init`; `PlaywrightNotAvailableError` → install playwright; `JobNotFoundError` → job no longer available; other → show message. Parse JSON output → job data dict.
## Phase 3 — Load Candidate and Criteria
```bash
cat ~/.roxabi-vault/linkedin-apply/candidate.yaml
```
Criteria (user override ≻ plugin default): `VL/criteria.yaml` if ∃, else `<plugin_dir>/config/criteria.yaml`.
## Phase 4 — Run LLM Matching
CV path: `~/.roxabi-vault/cv/cv_data.json` if ∃, else construct minimal JSON from `candidate.yaml`.
```bash
# Tempfile per ${CLAUDE_PLUG