feat: Resume Review Modal + Resume Library Manager #92

Closed
opened 2026-04-12 14:01:13 -07:00 by pyr0ball · 1 comment
Owner

Summary

Shipped in v0.8.6 (2026-04-12). Replaces the inline resume review section in the Apply workspace with a full paged modal, and adds a standalone Resume Library page.

What shipped

Resume Review Modal (ResumeReviewModal.vue)

  • Paged tabbed dialog using <Teleport to="body"> — same pattern as CompanyResearchModal
  • Pages: Skills diff, Summary diff, one page per experience entry, Confirm summary
  • Color-coded tab status: unvisited (gray), in-progress (indigo), accepted (green), partial (amber), skipped (slate)
  • Full ARIA tabs pattern (role="tablist", aria-selected, aria-controls, aria-labelledby)
  • Focus trap via keydown listener with onUnmounted cleanup
  • Save-to-library checkbox + name input on the Confirm page

Resume Library (/resumesResumesView.vue)

  • Two-column layout: list sidebar (260px) + full-text preview pane, single-column below 640px
  • Import: .txt / .pdf / .docx / .odt / .yaml — 5 MB limit
  • Actions: rename (Edit), set as default (star), download (txt/pdf/yaml), delete (disabled when only resume or is default)

ResumeLibraryCard (ResumeLibraryCard.vue)

  • Compact widget above ATS Resume Optimizer in Apply workspace
  • Shows active resume for the job (job-specific or global default)
  • Switch + Manage deep links

Resume API (9 endpoints)

  • GET/POST /api/resumes
  • GET/PATCH/DELETE /api/resumes/{id}
  • POST /api/resumes/{id}/set-default
  • POST /api/resumes/import
  • GET/PATCH /api/jobs/{job_id}/resume
  • approve_resume extended with save_to_library + resume_name

DB migration

  • migrations/005_resumes_table.sqlresumes table (10 columns) + resume_id FK on jobs

Tests

  • tests/test_db_resumes.py — 7 tests
  • tests/test_resumes_api.py — 9 tests
  • web/src/components/__tests__/ResumeReviewModal.test.ts — 8 tests

Commits

a3aaed0f22e713 on main

## Summary Shipped in **v0.8.6** (2026-04-12). Replaces the inline resume review section in the Apply workspace with a full paged modal, and adds a standalone Resume Library page. ## What shipped ### Resume Review Modal (`ResumeReviewModal.vue`) - Paged tabbed dialog using `<Teleport to="body">` — same pattern as `CompanyResearchModal` - Pages: Skills diff, Summary diff, one page per experience entry, Confirm summary - Color-coded tab status: unvisited (gray), in-progress (indigo), accepted (green), partial (amber), skipped (slate) - Full ARIA tabs pattern (`role="tablist"`, `aria-selected`, `aria-controls`, `aria-labelledby`) - Focus trap via `keydown` listener with `onUnmounted` cleanup - Save-to-library checkbox + name input on the Confirm page ### Resume Library (`/resumes` — `ResumesView.vue`) - Two-column layout: list sidebar (260px) + full-text preview pane, single-column below 640px - Import: .txt / .pdf / .docx / .odt / .yaml — 5 MB limit - Actions: rename (Edit), set as default (star), download (txt/pdf/yaml), delete (disabled when only resume or is default) ### ResumeLibraryCard (`ResumeLibraryCard.vue`) - Compact widget above ATS Resume Optimizer in Apply workspace - Shows active resume for the job (job-specific or global default) - Switch + Manage deep links ### Resume API (9 endpoints) - `GET/POST /api/resumes` - `GET/PATCH/DELETE /api/resumes/{id}` - `POST /api/resumes/{id}/set-default` - `POST /api/resumes/import` - `GET/PATCH /api/jobs/{job_id}/resume` - `approve_resume` extended with `save_to_library` + `resume_name` ### DB migration - `migrations/005_resumes_table.sql` — `resumes` table (10 columns) + `resume_id` FK on `jobs` ## Tests - `tests/test_db_resumes.py` — 7 tests - `tests/test_resumes_api.py` — 9 tests - `web/src/components/__tests__/ResumeReviewModal.test.ts` — 8 tests ## Commits `a3aaed0` → `f22e713` on `main`
pyr0ball added this to the Paid Tier GA milestone 2026-04-12 14:01:13 -07:00
pyr0ball added the
vue
frontend
labels 2026-04-12 14:01:13 -07:00
Author
Owner

Released in v0.8.6. Smoke-tested: Resume Library page, Set as Default, Import (.txt), ResumeLibraryCard in Apply workspace — all passing.

Released in [v0.8.6](https://git.opensourcesolarpunk.com/Circuit-Forge/peregrine/releases/tag/v0.8.6). Smoke-tested: Resume Library page, Set as Default, Import (.txt), ResumeLibraryCard in Apply workspace — all passing.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/peregrine#92
No description provided.