Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
7dede93
feat(core): add CV length rule using word count heuristic
May 14, 2026
6527c13
feat: detect inconsistent date formats in CV evaluation
May 15, 2026
13cbf00
feat: detect education-first layout for experienced candidates
May 15, 2026
80046d1
test: add CV length rule coverage and fix CLI test for CI
May 21, 2026
7e1edf7
Merge branch 'main' into feature/date-format-rule
heerrpanchal May 21, 2026
9a43f4f
feat: add machine learning engineer archetype and tests
IKetutWidiyane Jun 1, 2026
7b7be17
Merge branch 'main' into feature/ml-engineer-archetype
IKetutWidiyane Jun 5, 2026
f16790b
feat(schemas): add Zod contract package
Jun 7, 2026
eee572d
feat(intelligence): add rubric v1, archetypes, and validators
Jun 7, 2026
7b09845
feat(prompts): add extract, score, and validate-claims pack
Jun 7, 2026
131083a
feat(cli): add power-user pack — Claude Code skill, commands, welcome
Jun 7, 2026
c44edf1
test(eval): add golden fixtures and pnpm eval harness
Jun 7, 2026
2e07cd9
docs: add power-user quickstart and update structure
Jun 7, 2026
b087ffd
Merge branch 'main' into feature/ml-engineer-archetype
IKetutWidiyane Jun 8, 2026
ce9bef1
rule: add outdated technologies flag
davido-noowin Jun 10, 2026
0ce17c8
rule: add 2 new rules for Heroku
davido-noowin Jun 10, 2026
897f9bb
rule: modify Heroku regex to catch dates better
davido-noowin Jun 10, 2026
2bdedef
test: add tests to validate new universal rules
davido-noowin Jun 10, 2026
aa2ea6a
refactor: ran pnpm format
davido-noowin Jun 10, 2026
a8661ec
Merge branch 'main' into feature/eval-harness
amirbahador-hub Jun 11, 2026
b99db73
chore: expand CodeRabbit config with per-package review guidance
SaharPak Jun 11, 2026
fa014fe
feat: add evaluation form and results page with file upload functiona…
Jun 12, 2026
02a7ce9
Merge branch 'main' into feature/cv-jd-input-page
Jun 12, 2026
daa21ba
fix: update file upload support message and adjust result rendering keys
Jun 12, 2026
1850c49
fix: add missing newline at the end of the results page component
Jun 12, 2026
6748d7e
refactor(schemas): drop maxScore, rubric scale is fixed 0-5
Jun 12, 2026
8344a68
Merge remote-tracking branch 'origin/main' into feature/schemas-zod-c…
Jun 12, 2026
ab36770
chore(schemas): apply biome formatting
Jun 12, 2026
5418e2a
Merge remote-tracking branch 'origin/feature/schemas-zod-contract' in…
Jun 12, 2026
d438cc7
fix(intelligence): match keywords on word boundaries, drop unused zod…
Jun 12, 2026
bcfeff8
Merge remote-tracking branch 'origin/feature/intelligence-rubric-arch…
Jun 12, 2026
f7201ca
docs(prompts): consistent optional notation in extract prompt, runnab…
Jun 12, 2026
9966e80
Merge remote-tracking branch 'origin/feature/prompts-pack' into featu…
Jun 12, 2026
8590a17
docs(cli): add language to bare code fences
Jun 12, 2026
5b9cb76
Merge remote-tracking branch 'origin/feature/cli-power-user-pack' int…
Jun 12, 2026
9b4891f
fix(intelligence): flag embedded images in ats check, correct skill s…
Jun 12, 2026
db22153
Merge remote-tracking branch 'origin/feature/eval-harness' into docs/…
Jun 12, 2026
bcceafe
docs: fix archetype example in contributing, honor custom archetype l…
Jun 12, 2026
64d4fce
docs(skill): say where to run schema validation and add a no-install …
Jun 12, 2026
46ffd70
Merge branch 'feature/cli-power-user-pack' into feature/eval-harness
Jun 12, 2026
370adb0
Merge branch 'feature/eval-harness' into docs/power-user-quickstart
Jun 12, 2026
5b606c0
docs(skill): validate over stdin so resume data never hits the workin…
Jun 12, 2026
3329bb3
Merge branch 'feature/cli-power-user-pack' into feature/eval-harness
Jun 12, 2026
70453d5
Merge branch 'feature/eval-harness' into docs/power-user-quickstart
Jun 12, 2026
3e192e8
Merge branch 'main' into chore/coderabbit-config
amirbahador-hub Jun 12, 2026
881dd1b
Merge branch 'main' into feature/ml-engineer-archetype
IKetutWidiyane Jun 16, 2026
5287b92
Merge branch 'main' into feature/ml-engineer-archetype
IKetutWidiyane Jun 19, 2026
7b5acd0
docs: add no-code contribution paths and ROADMAP.md
Jun 22, 2026
11b52fe
docs(roadmap): remove Spanish translation row (issue #83 closed)
Jun 22, 2026
e51d067
docs: remove README translation from contributor paths
Jun 22, 2026
1d4f380
fix: biome formatting
IKetutWidiyane Jun 22, 2026
8b3b814
feat: add AI Product Manager archetype
IKetutWidiyane Jun 30, 2026
170b92c
Merge PR #68: add Zod schema contract package
Jul 2, 2026
bc46662
Merge PR #69: add intelligence rubric, archetypes, and validators
Jul 2, 2026
d556879
Merge PR #70: add prompts pack (extract, score, validate-claims)
Jul 2, 2026
43fa3b7
Merge PR #72: add eval harness with golden fixtures
Jul 2, 2026
d9cc9d8
Merge PR #75: expand CodeRabbit config with per-package review guidance
Jul 2, 2026
a8f8d71
Merge PR #79: add no-code contribution paths and ROADMAP.md
Jul 2, 2026
9908e9c
Merge PR #73: add power-user quickstart and update structure docs
Jul 2, 2026
3f8096d
Merge PR #76: add CV and JD input screen with file upload
Jul 2, 2026
811674e
Merge PR #27: add CV length rule (word count heuristic)
Jul 2, 2026
630d83a
Merge PR #29: detect inconsistent date formats
Jul 2, 2026
5904d33
Merge PR #30: detect education-first layout for experienced candidates
Jul 2, 2026
b8d455c
Merge PR #84: add AI Product Manager enhancements and ML Engineer arc…
Jul 2, 2026
d5aff70
Auto-fix lint and formatting across newly merged packages
Jul 2, 2026
441df27
Merge PR #74: detect outdated technologies in CVs
Jul 2, 2026
50118c0
Fix lint and build errors from PR #76 merge: web-ui accessibility and…
Jul 2, 2026
9b53bca
docs: add PR cleanup handoff report
Jul 2, 2026
a50e384
docs(handoff): correct merged PR count from 12 to 14
Jul 2, 2026
53886c5
docs: add PR #85 rollback plan with safety tag reference
Jul 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .claude/commands/evaluate-cv.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
description: Score a resume against the CV Builder rubric, fully locally
argument-hint: <path-to-resume> [--jd <path-to-job-description>]
---

Evaluate the resume using the `cv-evaluation` skill.

Arguments: $ARGUMENTS

- The first argument is the path to the resume (PDF, markdown, or text).
- An optional `--jd <path>` adds a job description as keyword context only.

Read the file(s), run the extract → detect → score → validate-claims pipeline,
validate the result against `EvalResultSchema`, then present the overall score,
the per-dimension breakdown, the top issues with fixes, and any unsupported
claims. Nothing leaves this machine.
15 changes: 15 additions & 0 deletions .claude/commands/setup-profile.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
description: Gather a resume to evaluate, three ways
argument-hint: [path-to-file]
---

Help the user get a resume ready for `/evaluate-cv`. Pick the path that fits:

1. **File** — if `$ARGUMENTS` names a file, read it and confirm what you found.
2. **Paste** — if they pasted resume text, use it directly.
3. **Interview** — if they have nothing prepared, ask a short, focused set of
questions (roles, dates, what they built, measurable outcomes, links) and
assemble a plain-text resume from their answers.

Once you have the resume text, save it to a file the user chooses and tell them
to run `/evaluate-cv <that-file>`. Don't invent details they didn't give you.
17 changes: 17 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"permissions": {
"allow": ["Read", "Glob", "Grep"]
},
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR/.claude/welcome.sh\""
}
]
}
]
}
}
46 changes: 46 additions & 0 deletions .claude/skills/cv-evaluation/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
name: cv-evaluation
description: Evaluate a resume against the CV Builder rubric and return a scored, schema-valid EvalResult. Use when the user wants their CV or resume scored, critiqued, or checked for ATS issues and unsupported claims.
---

# CV Evaluation

Run a resume through the same four-step evaluation the hosted product uses,
entirely locally. Everything you need lives in this repo — read the source, don't
guess.

## Inputs

- A resume file (PDF, markdown, or plain text). For PDF, read the text content.
- Optionally a job description, used only as keyword context (Phase 1 does not
fit-score against a JD).

## Pipeline

1. **Extract.** Apply `packages/prompts/prompts/extract.md` to the raw resume
text to produce a structured `Resume`.
2. **Detect archetype.** Match the resume against the role archetypes in
`packages/intelligence/src/archetypes/`. Pick the best fit; default to
Software Engineer when there's no clear signal. See [archetypes](./archetypes.md).
3. **Score.** Apply `packages/prompts/prompts/score.md` with the detected
archetype's weights and the rubric. See [rubric](./rubric.md) and
[scoring](./scoring.md). Surface **at least 3** issues, each quoting the exact
resume text and giving a concrete fix.
4. **Validate claims.** Apply `packages/prompts/prompts/validate-claims.md` to
flag unsupported claims. See [claim-validation](./claim-validation.md).

## Output

Produce one `EvalResult` (schema: `packages/schemas/src/evaluation.ts`). It must
carry `rubricVersion` and `archetypeVersion`. Validate the object against
`EvalResultSchema` before presenting it — never show an unvalidated result.

Run the validation from inside `packages/schemas` (zod only resolves there under
pnpm's layout). Pipe the JSON to node over stdin rather than writing it to a
file, so nothing derived from the resume touches the working tree. If
dependencies aren't installed, don't error out: check the object field by field
against `evaluation.ts` instead, and tell the user that running `pnpm install`
enables strict validation.

Then summarize for the user: overall score, the per-dimension breakdown, the top
issues with their fixes, and any unsupported claims.
10 changes: 10 additions & 0 deletions .claude/skills/cv-evaluation/archetypes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Archetypes

Each role archetype (keywords, dimension weights, action verbs, anti-patterns)
is one file in `packages/intelligence/src/archetypes/`. Read the relevant file —
the weights there drive the overall score, so use them exactly.

To detect the archetype: count how many of each archetype's keywords appear in
the resume and pick the highest. The same heuristic is implemented in
`packages/intelligence/src/detect.ts` (`detectArchetype`). When nothing clearly
matches, use Software Engineer.
9 changes: 9 additions & 0 deletions .claude/skills/cv-evaluation/claim-validation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Claim Validation

The prompt and the rules for what counts as an unsupported claim are in
`packages/prompts/prompts/validate-claims.md` (rules sourced from
`packages/intelligence/src/validators/claims.ts`).

Goal: catch what a recruiter would quietly distrust — a metric with no scope, a
tool listed but never used in a bullet, a seniority claim with no team size or
reach. For each flagged claim, say what's missing, not just that it's weak.
8 changes: 8 additions & 0 deletions .claude/skills/cv-evaluation/rubric.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Rubric

The six dimensions, their 0–5 anchors, and the current `RUBRIC_VERSION` are
defined in `packages/intelligence/src/rubric.ts`. Read that file — it is the
source of truth. Don't reproduce the anchors from memory.

Score each dimension on its own 0–5 scale, then weight by the archetype (see
[archetypes](./archetypes.md)) to get the overall 0–5 score.
12 changes: 12 additions & 0 deletions .claude/skills/cv-evaluation/scoring.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Scoring

The scoring instructions and exact output shape are in
`packages/prompts/prompts/score.md`. Fill its `{{...}}` placeholders from the
detected archetype's weights and the rubric.

Hold the line on quality:

- Every issue quotes the exact resume text it's about — no paraphrasing.
- Every issue has a concrete fix, not "consider improving this".
- Overall score = sum(dimension score × weight), on the 0–5 scale.
- Be honest. A weak resume should score low; inflating it doesn't help anyone.
19 changes: 19 additions & 0 deletions .claude/welcome.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
# Emits the CV Builder menu as a SessionStart hook systemMessage, shown to the
# user when they open Claude Code at the repo root.

# No jq → skip the banner rather than break the session start.
command -v jq >/dev/null 2>&1 || exit 0

read -r -d '' MENU <<'EOF'
CV Builder — evaluate your resume locally and privately. Nothing leaves your machine.

/evaluate-cv <resume.pdf|.md|.txt> [--jd <job.md>] Score a resume against the rubric
/setup-profile Assemble a resume if you don't have a file yet

No build or install needed to evaluate.

What would you like to do?
EOF

jq -n --arg msg "$MENU" '{systemMessage: $msg}'
36 changes: 35 additions & 1 deletion .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# yaml-language-server: $schema=https://docs.coderabbit.ai/schema.json
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
language: en-US
early_access: false

reviews:
profile: chill
request_changes_workflow: false
high_level_summary: true
poem: false
review_status: true
auto_review:
enabled: true
Expand All @@ -13,6 +15,38 @@ reviews:
- main
path_filters:
- "!**/pnpm-lock.yaml"
- "!**/dist/**"
- "!**/.turbo/**"
- "!**/node_modules/**"
- "!**/*.snap"
path_instructions:
- path: "packages/core/**"
instructions: >
This is the core CV evaluation/builder logic. Prioritize correctness of
rules, evaluator scoring, and types. Flag changes to public APIs in
src/index.ts and anything in src/types.ts that could break consumers.
New rules/archetypes/evaluator behavior should have matching vitest tests.
- path: "packages/cli/**"
instructions: >
CLI for the CV builder. Watch for unhandled errors, confusing output,
and missing input validation. Behavior changes should be covered by tests.
- path: "packages/web/**"
instructions: >
Web frontend. Check accessibility, error/loading states, and that UI
stays consistent with the core package's data model.
- path: "**/*.md"
instructions: >
Docs for an open-source project. Check clarity and that setup/commands
match the actual scripts in package.json.
tools:
eslint:
enabled: true
markdownlint:
enabled: true

chat:
auto_reply: true

knowledge_base:
learnings:
scope: auto
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Bug Report
about: Something isn't working correctly
title: "[Bug] "
labels: bug
assignees: ''
assignees: ""
---

## What happened?
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Feature Request
about: Suggest a new feature or improvement
title: "[Feature] "
labels: enhancement
assignees: ''
assignees: ""
---

## Problem
Expand Down
18 changes: 9 additions & 9 deletions .github/ISSUE_TEMPLATE/new_archetype.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: New Role Archetype
about: Add a new role type (e.g., "Mobile Engineer", "Security Engineer")
title: "[Archetype] "
labels: archetype, good first issue
assignees: ''
assignees: ""
---

## Role name
Expand All @@ -26,14 +26,14 @@ List the key terms recruiters look for in this role:

How should the 6 dimensions be weighted for this role?

| Dimension | Suggested weight |
|-----------|-----------------|
| Shipped Evidence | ? |
| Quantified Impact | ? |
| Tooling Visibility | ? |
| ATS Compatibility | ? |
| Keyword Match | ? |
| Public Proof | ? |
| Dimension | Suggested weight |
| ------------------ | ---------------- |
| Shipped Evidence | ? |
| Quantified Impact | ? |
| Tooling Visibility | ? |
| ATS Compatibility | ? |
| Keyword Match | ? |
| Public Proof | ? |

## Action verbs (10+)

Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/new_rule.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: New Evaluation Rule
about: Propose a new CV evaluation rule (anti-pattern or positive pattern)
title: "[Rule] "
labels: rules, good first issue
assignees: ''
assignees: ""
---

## Rule type
Expand Down
6 changes: 3 additions & 3 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Brief description of the change.

## Related issue

Closes #___
Closes #\_\_\_

## Type of change

Expand All @@ -25,5 +25,5 @@ Closes #___

## Screenshots (if UI change)

Before | After
--- | ---
| Before | After |
| ------ | ----- |
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,6 @@ jobs:

- run: pnpm test

- run: pnpm eval

- run: pnpm build
25 changes: 25 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# CV Builder

Open source, privacy-first resume evaluator. This repo doubles as a **power-user
pack**: clone it, open Claude Code here, and evaluate your resume locally with
your own agent — nothing leaves your machine.

## Power-user commands

- `/evaluate-cv <resume.pdf|.md|.txt> [--jd <job.md>]` — score a resume against
the rubric and surface issues + unsupported claims.
- `/setup-profile` — assemble a resume if you don't have a file ready.

## No build needed for evaluation

The `cv-evaluation` skill (`.claude/skills/cv-evaluation/`) reads the prompts in
`packages/prompts/prompts/` and the rubric/archetypes in
`packages/intelligence/src/` straight from the repo, and returns an `EvalResult`
validated against `packages/schemas`. `pnpm install` is only needed to run the
package tests or the web app — not for the power-user flow.

## Repo shape

pnpm + turbo monorepo. `packages/schemas` (contract) → `packages/intelligence`
(rubric + archetypes) → `packages/prompts` (the prompt pack) → the skill ties
them together.
Loading
Loading