feat: implement issues #48 #50 #78 #79 and ATS enhancements#80
Conversation
Implements GitHub issues #78 and #79: - Add frozen=True to Degree dataclass for immutability - Use object.__setattr__ in __post_init__ for type transformation - Add type_value property with cast() for proper type narrowing - Add test for frozen dataclass immutability The frozen design ensures thread-safety and hashability while maintaining backwards compatibility through object.__setattr__ for type conversion during initialization.
Implements GitHub issue #48: - File path errors now include actionable suggestions - Format validation errors show clear expected values - Empty file path error provides example - File not found error includes helpful guidance These improvements make CLI errors more user-friendly and actionable, helping users understand what went wrong and how to fix it.
Research document evaluating alternative similarity algorithms for resume-job matching beyond Jaccard N-gram: - Comprehensive comparison of 6 algorithms - Analysis of strengths and limitations - Recommendation: current tournament approach is optimal - Suggests Levenshtein as low-effort enhancement for short fields Issue #51 (PDF rendering) already documented in wiki/PDF-Renderer-Evaluation.md Resolves: #61 (research task) Documents: #51 (already exists)
Implements GitHub issue #53: - Add "cover" to TemplateType enum for cover letter templates - Update TemplateType.values() to include cover template - Add test coverage for cover template validation The cover.html template already existed. This change makes it a selectable option for users via --template cover when generating documents from Markdown. Users can now generate cover letters using: simple-resume generate --render-file cover.md --template cover
Implements GitHub issue #50 - add at least three new resume templates Added three new HTML templates with distinct visual styles: 1. resume_modern.html - Clean minimalist design with Helvetica font - Horizontal contact bar - Blue accent color - Tag-based skills display 2. resume_professional.html - Corporate serif design - Georgia font for traditional look - Centered header with double border - Classic two-column skills layout 3. resume_creative.html - Bold gradient sidebar design - Purple gradient sidebar - Card-based entries - Modern sans-serif typography All templates extend resume_base.html and are fully compatible with the existing generation pipeline.
- Add TaxonomyConfig for opt-in API integration (disabled by default) - Add TaxonomyCache with file system caching and TTL - Add SkillsTaxonomyFetcher with graceful fallback to hardcoded list - Add get_enhanced_skills() main entry point - Implement TDD approach with 14 comprehensive tests - Offline-first design: API disabled by default, graceful degradation Closes #59
- Extract TaxonomyCache Protocol in core for interface definition - Add NullTaxonomyCache in core for no-op implementation - Move TaxonomyLocalCache to shell/taxonomy_cache.py for file I/O - Update test regex for improved error message format (issue #48) - Update test imports to use shell layer cache Fixes architecture test violation. All 1728 tests pass, 93% coverage.
Enhance keyword extraction with capitalized word patterns and fallback extraction for documents with minimal technical markers. Add MIN_FALLBACK_WORD_LENGTH constant and percentage flag to score_resume(). Update all sample YAML files with ATS-optimized content featuring realistic tech skills (Python, JavaScript, React, AWS, Docker, Kubernetes, SQL, REST APIs, CI/CD) to serve as better testing fixtures. Add comprehensive taxonomy cache tests covering: - NullTaxonomyCache no-op implementation - Corrupted JSON handling - Write failure resilience - LinkedIn taxonomy stub behavior - Successful API fetch caching
Add TestKeywordExtraction class with 8 tests covering: - Acronym extraction (AWS, API) - CamelCase term extraction - Quoted phrase extraction - Skill pattern extraction - Fallback extraction for plain text - max_keywords limit enforcement - Duplicate removal - Short keyword filtering Improves keyword.py coverage from 68% to 98%.
Bump version to 0.2.3 and update documentation for new features: - Offline-first skills taxonomy API with local caching (7-day TTL) - Percentage parameter for score_resume() producing 0-100 scale - Improved keyword extraction with capitalized word patterns - TaxonomyCache refactored to functional core / imperative shell Update README with new templates (resume_modern, resume_professional, resume_creative) and skills taxonomy documentation. Sync wiki API reference and Getting Started guide with current template list. Fix duplicate [Unreleased] heading in CHANGELOG.
PR Review: feat: implement issues #48 #50 #52 #53 #78 #79Verdict: Changes Requested Scope Analysis
Out-of-scope additions (not in any listed issue):
Blocking Issues1. Duplicate entry in 2. Missing cover letter template file 3. Issue #52 (JSON Resume) claim Non-Blocking Improvements4. 5. f-strings in logging calls 6. 7. 8. Sample YAMLs lost diversity Code Quality
RecommendationFix the 3 blocking issues (duplicate entry, missing cover template, #52 claim), then this is ready to merge. The out-of-scope work is quality code — just needs the PR description updated to accurately reflect what's included. |
Test PlanAutomated Verification
Manual Verification
Blocking Issue Verification
Out-of-Scope Sanity Checks
|
Comprehensive PR Review (5-Agent Analysis)Five specialized analysis agents reviewed this PR independently. Findings have been deduplicated and aggregated below. Critical Issues (must fix before merge)1. Creative term expansion inflates keyword count, distorting ATS scores 2. Bare 3. API stubs are production mocks that silently fail 4. XSS vulnerability in new HTML templates via 5. Important Issues (should fix)6. Duplicate "ninja" entry in 7. 8. Cache write failure logged at wrong severity 9. Cache corruption indistinguishable from cache miss 10. Hidden side effect in 11. Fallback logged at INFO when user action was ignored 12. 13. 14. 15. Mutable global lists can be corrupted Suggestions (nice to have)
Test Coverage Gaps
Type Design Summary
Strengths
Recommended Action (Priority Order)
|
Fix YAML parsing in pre-commit config where unquoted `: ` broke the no-ai-attribution hook and column-1 Python code terminated the wheel-install-test block scalar early. Add __all__ to cli/main.py for mypy export check, use explicit kwargs for ty type safety in generate.py, add missing data_dir/output_dir fields to runtime GenerateOptions, and auto-register shell services in core generate() for standalone Python API usage.
…ignature The _generate_format() function now explicitly passes parallel and browser kwargs to session.generate_all() in batch mode. The two batch-mode test assertions were missing these parameters, causing CI failures.
Summary
Implements multiple backlog issues for v0.2.3 release, plus ATS scoring enhancements.
Fixes #48, fixes #50, fixes #78, fixes #79
Changes
Issue Fixes
object.__setattr__for immutabilityDegree.typefieldATS Enhancements (additional scope)
Architecture
Known Issues (from review)
creative_terms.pyTest Plan