Release/v1.3.0#23
Merged
Merged
Conversation
…ounding (v1.3 #1) The Tailor Resume core: one LLM op (services/openai/tailor.ts, new 'tailor' model key — full gpt-4.1 on balanced) takes a base resume × JD × application questions and returns an ATS-friendly tailored resume (grounded ONLY in the base resume — never invented experience), grounded answers, and the extracted jobTitle/company. - New applications table (migration 0006, profile-cascade + created_at index) + applicationsRepo (global newest-first page() with LIKE search + profile join; delete() removes the dedicated job + its chunks). - Each application owns a dedicated Job row holding the JD; indexJob now also indexes the application's tailored resume as job-scoped `tailored` chunks, and vectorStore.search drops base `resume` chunks when the selected job has tailored ones — so "Start interview" grounds sessions in the TAILORED resume + JD with the session pipeline untouched. Application-owned jobs are hidden from the regular Interviews list/page/count. - applications:{page,get,tailor,delete} IPC + preload facade. The tailor handler runs ALL model calls before any DB write (an LLM failure persists nothing); an uploaded base resume materializes a real, reusable profile. - tailor.test.ts (+8): request shape, grounding/ATS prompt, defensive parsing. Verified: typecheck · 126 unit · build green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Save any application's tailored resume as an ATS-friendly PDF. A deliberately minimal, dependency-free markdown→HTML converter (resumeHtml.ts — headings, bullets, bold, paragraphs; HTML-escaped first; single column, standard fonts, one inline style, no scripts) renders in a hidden ephemeral BrowserWindow via a data: URL, then webContents.printToPDF (Letter, custom inch margins, tagged PDF) and a native save dialog (sanitized "[name] - [title] at [company].pdf" default). The window is destroyed in a finally so it can never leak. applications:export-pdf IPC + preload; resumeHtml.test.ts (+5, incl. escaping). Verified: typecheck · 131 unit · build green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…(v1.3 #3) New "Tailor Resume" nav page (/tailor): - Form: base resume from a profile OR uploaded/pasted (PDF/DOCX/TXT/MD via the existing extract pipeline); JD via paste/upload/URL fetch; optional application questions (one per line). "Tailor resume" runs the op with a busy overlay. - Result opens in ApplicationModal: the tailored resume (markdown), the grounded application answers, Download PDF, and delete (two-step confirm). - Applications table: dense DataTable, server-paginated + searchable, newest first, labeled "[name] - [jobTitle] at [company]". Per-row "Start interview" launches a live session with the application's (profile, job) — grounded in the TAILORED resume + JD via the tailored-chunk retrieval rule; shows ● live while that session runs. Row click opens the detail view. Verified: typecheck · 131 unit · build green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fixes the 5 confirmed findings from the 4-dimension refute-verify review: - Indexing is now BEST-EFFORT, after every row exists: reindexProfile (new-profile path) + indexJob moved into one try/catch that returns indexError instead of failing the whole op — a 429/network error can no longer orphan a profile, discard the paid tailor result, hide a saved application behind an error banner, or invite duplicate profiles/applications on retry. TailorPage surfaces the partial state with recovery guidance. - New applications:reindex IPC + a "Re-index" button in ApplicationModal — the recovery path for a failed index (application jobs are hidden from the only other re-index trigger), and a way to re-embed after switching embedding models. - The "Interview ended" save/discard prompt is now GLOBAL (SavePromptModal in App): sessions started from Tailor Resume and stopped via the Cue Card get the prompt wherever the user is; InterviewPage's table refreshes off pendingSave clearing (its duplicate modal removed). Docs: IPC map (applications section), OpenAI service (tailor.ts), DB (applications table, tailored chunks, deletion semantics, indexes), session log. Verified: typecheck · 131 unit · build green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-vs-tailored diff (v1.3 #5) Three refinements from live testing: - Row delete: each applications-table row gets a ✕ with a two-step inline confirm (modal delete kept). Hidden for the live application's row; deleteApp guards and the modal's Delete disables — deleting mid-interview would silently downgrade the live session's grounding. - No duplicate operations: the tailor handler resolves the owning profile up front (selected, else an existing profile with the SAME resume text), so repeat tailorings from one uploaded resume reuse one profile instead of creating duplicates; parseResume runs AT MOST ONCE per profile (skipped when already parsed) and reindexProfile only for created/newly-parsed profiles. - Compare with base: ApplicationModal toggle showing side-by-side panes with word-level highlights (red = removed, green = added/rewritten) via a new dependency-free LCS diff (renderer/lib/wordDiff.ts, +6 tests; plain side-by-side fallback for very long resumes). Fixes the 3 confirmed adversarial-review findings: out-of-range page self-heals after deleting the last row of the last page; applications:reindex now also re-embeds the owning profile's base chunks (a failed first index was otherwise unrecoverable); delete-while-live is guarded at row, modal, and handler level. Verified: typecheck · 137 unit · build green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Package Tailor Resume into a versioned release: tailor a base resume × JD into an ATS-friendly resume + grounded application answers, download as PDF, saved as searchable Applications, per-row Start interview grounded in the TAILORED resume + JD, base-vs-tailored comparison, and smart profile reuse. Adds changelog/1.3.0.md (drives APP_VERSION + in-app What's New) and bumps package.json to 1.3.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.