Issue #126: Feature Request: Add support for .docx resume files
No open PR fixes this and merges clean
1 fix it but don't merge clean, 1 fix it partly. See the board below.
How it breaks
The path is the model's reasoning. Each box is a citation checked against the code.
What's wrong
The report is accurate. The pipeline has no .docx support. All text extraction goes through PDFHandler, which opens the file with pymupdf and converts it with the PDF-oriented to_markdown. score.py always calls extract_json_from_pdf, and it never checks the file extension.Show full explanation
Nothing in requirements.txt provides python-docx. A .docx passed in is therefore treated as a PDF. It is either rejected or garbled, and extract_text_from_pdf returns None. The run then fails with "Failed to extract text from PDF". The cache-name logic also only strips ".pdf". Adding .docx needs a new extractor, dispatch by extension in score.py, and the dependency.How to reproduce
- cd into the hiring-agent repo and install requirements.txt (pymupdf only; there is no python-docx).
- Run: python score.py resume.docx --role <role>, using any real .docx resume.
- The file passes the os.path.exists check in score.py, then goes to PDFHandler.extract_json_from_pdf.
- pymupdf/to_markdown is applied to the .docx; extraction fails or returns nothing and the 'Failed to extract text from PDF' error is logged.
- Observe that no resume data is produced and no score is given.
Evidence
Each citation was checked against the code at e0ece80.
The only text extractor opens the input with pymupdf and the PDF-to-markdown converter. It has no .docx branch.
Any failure returns None, so a .docx input ends as an extraction failure.
The main flow always uses the PDF handler. There is no dispatch on file extension.
The cache and candidate names assume a .pdf extension. A .docx extension would remain in the names.
The CLI is defined as taking a PDF only.
Only PDF libraries are listed. python-docx is not a dependency.
Pull requests
Verdicts are judged from the diff, not run. Merge status is a real git check against e0ece80.
Adds python-docx, a docx text extractor with extract_json_from_docx, extension dispatch in score.py (raising on unsupported types), and extension-agnostic cache names, covering every part of the cause.
cache_key_for uses Path.stem, so cache and candidate names no longer assume .pdf, but there is still no docx extractor, dispatch, or dependency.
26 PRs that don't fix itShow
Only hardens cache read/write encoding and still calls extract_json_from_pdf with .pdf-only name stripping.
Adds section splitting for PDF markdown text; no docx extractor or dispatch.
Unpins versions in requirements.txt and does not add python-docx.
Only changes cache encoding and empty-cache handling.
Changes GitHub project fetching and cache encoding; no docx extractor, dispatch, or dependency.
Changes logging to print statements only.
Adds certificate and volunteer section extraction on the PDF pipeline.
Adds validation that explicitly rejects any non-.pdf extension, which enforces the PDF-only behavior rather than adding docx support.
Adds YAML config plus the same .pdf-only validation; no docx extraction or dispatch.
Adds blog data fetching; extraction and name handling are unchanged.
Adds PDF validity and keyword checks and keeps the PDF-only flow and .pdf name stripping.
Closes the PyMuPDF document and adds .pdf-only validation; no docx path.
Rewrites PDF extraction and raises ValueError for non-.pdf files; no docx support.
Adds cache validity checks only.
Adds JD-based scoring and batch mode; the JD and resume are still read as PDFs and .pdf stripping is kept.
Adds CLI flags, retries, and cache metadata for the PDF flow; no docx support.
Adds Codeforces/LeetCode integration and unrelated app files; no docx support.
Adds Ollama cloud model support and relaxes the ollama version pin.
Aborts on failed sections and cache errors only.
Swaps PDF extraction for a visible-text extractor to stop hidden-text injection; still PDF-only with no dispatch.
Adds a Flask UI and an OCR fallback for image PDFs; still PDF-only.
Adds role-based scoring limits and CLI args; the input is still a PDF with .pdf stripping.
Adds the rewrite stage and a --resume-json input; the basename logic strips only .pdf/.json and docx is not handled.
Passes ignore_graphics=True to the PDF markdown converter; no docx path.
Adds a model selection flag and benchmark script, leaving file handling unchanged.
Dead-import and config cleanup only.
What this packet does not prove
- Citations are checked against the code. The explanation that links them, the order of the chain, and any claim about outside systems (APIs, libraries) are the model's reasoning and are not checked.
- PR verdicts are judged from the diff, not run. No PR was applied or tested.
- PRs were shortlisted because they change a cited line or mention the issue. A fix in another file, or a PR whose line numbers have drifted, is missed, so this is not proof that no other PR fixes it.