A local CLI agent that analyzes a Job Description (JD), compares it to a candidate profile, and generates a Markdown report with matched skills, gaps, and actionable recommendations.
Runs offline by default and supports text-based JDs in
.txtoradrs/0001-offline-and-pdf-policy.mdfor the offline/PDF policy.
- Python 3.12+
- pip
pip install -r requirements.txt./run_skillscan.shThis script automatically activates your virtual environment (if it exists) and runs SkillScan with the example files.
python -m agent.runner run \
--jd ./src/samples/jd.txt \
--profile ./src/samples/profile.json \
--out ./reports \
--verboseIf installed as a package:
pip install -e .
skillscan run --jd ./src/samples/jd.txt --profile ./src/samples/profile.json --out ./reports --verbose-
JD:
.txtor text-selectable.pdf(exported from a text editor). Scanned/image-only PDFs are not supported in v0.1.0. -
Profile (
.json):
{
"name": "Rafael",
"skills": ["Python", "Flask", "PostgreSQL", "Git", "Docker"],
"languages": ["Portuguese", "English (basic)"]
}2025-10-02_rafael_report.md
The report contains the required sections `Matched Skills`, `Gaps (Missing Skills)`,
and `Recommendations`. It may also include an optional `Extra (Profile-only Skills)`
section when your profile lists skills that don't appear in the JD.
ERROR: JD not found at <path>.ERROR: Could not extract text from PDF (page X).ERROR: profile.json is invalid (e.g., "skills" must be a list of strings).WARNING: No skills identified in the JD.
Exit codes: 0 success, 1 failure, 130 keyboard interrupt.
- Offline-by-default; no external calls.
- JD parsing from
.txtand text-based.pdf(no OCR). - Simple keyword heuristics for skill extraction (PT/EN).
- CLI only (no Web UI / API yet).
For technical scope, I/O and Definition of Done, see project-brief.md.
For purpose, problems and personas, see product-context.md.
For the offline/PDF policy, see ADR adrs/0001-offline-and-pdf-policy.md.
- Only text-selectable PDFs are supported (exported from editors). No OCR.
- Text is extracted page by page; whitespace is normalized.
- If any page has no selectable text, the tool emits:
ERROR: Could not extract text from PDF (page X). - For full rationale, see
adrs/0001-offline-and-pdf-policy.md.
We welcome contributions! Please read our Contributing Guide before opening issues or pull requests.