Skip to content

feat(cli): add power-user pack — Claude Code skill, commands, welcome#71

Open
amirbahador-hub wants to merge 15 commits into
mainfrom
feature/cli-power-user-pack
Open

feat(cli): add power-user pack — Claude Code skill, commands, welcome#71
amirbahador-hub wants to merge 15 commits into
mainfrom
feature/cli-power-user-pack

Conversation

@amirbahador-hub

@amirbahador-hub amirbahador-hub commented Jun 7, 2026

Copy link
Copy Markdown
Collaborator

What does this PR do?

The headline power-user surface: clone the repo, open Claude Code, run
/evaluate-cv. Everything runs locally — no server, no account, no API keys.

  • .claude/skills/cv-evaluation/ — the skill that runs extract → detect →
    score → validate-claims. Its subfiles point at the package sources
    (packages/prompts, packages/intelligence, packages/schemas) rather than
    duplicating them, so they can't drift.
  • .claude/commands//evaluate-cv (drives the skill) and
  • .claude/settings.json + .claude/welcome.sh — a SessionStart hook that
    greets the user with the available commands on open (degrades silently without
    jq).
  • CLAUDE.md and apps/cli/README.md — orientation for the model and a
    human quickstart.

No build needed to evaluate — the skill reads the prompts and rubric straight
from the repo.

Related issue

Closes #65

Type of change

  • New feature (non-breaking)

Checklist

  • Lint/build/test green
  • Welcome banner verified live (shows on session open)
  • Skill references package sources (no duplication/drift)

Note for reviewers

End-to-end /evaluate-cv is an interactive LLM run, not an automated test —
worth a manual smoke check on a sample resume. Stacked on #64#63#47.

Summary by CodeRabbit

  • New Features

    • CV Builder power-user workflow: interactive /evaluate-cv and /setup-profile for fully local resume evaluation
    • Role archetype detection (Software Engineer, Product Manager, Data & ML Engineer), six-dimension 0–5 rubric scoring, ATS-compatibility check, and unsupported-claim detection with quoted issues and concrete fixes
    • Session-start menu for quick command access; evaluation runs locally with no network calls
  • Documentation

    • Added user guides, prompts, and CLI quickstart for local evaluation
  • Tests

    • Added test coverage for scoring, archetypes, prompts, validators, and schemas

AmirBahador Bahadori added 4 commits June 7, 2026 18:22
   Shared, validated contract for CV Builder surfaces: Resume, JobDescription,
   Archetype, Issue, Claim, and EvalResult (with required rubric/archetype
   versions).

   Closes #47
Scoring brain the prompts reference: rubric v1 (six weighted dimensions
with 0-5 anchors), three role archetypes (Software Engineer, Product
Manager, Data & ML Engineer), keyword-based detectArchetype, and the ATS
and claim validator specs.

Closes #63
The three Phase 1 prompts a power user's agent runs. Markdown templates are
the source of truth; renderers inject the live rubric, archetype weights, and
claim rules so each assembled prompt is self-contained and stays in sync with
the intelligence package. Every prompt asks for JSON matching its schema.

Closes #64
Clone the repo, open Claude Code, run /evaluate-cv: the cv-evaluation skill
runs extract -> detect -> score -> validate-claims locally, reading the prompts
and rubric straight from the repo (no build). A SessionStart hook greets the
user with the available commands on open. Skill subfiles point at the package
sources to avoid drift.

Closes #65
@amirbahador-hub

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 6cf65c7a-d952-4f73-8739-6ef40326f8ef

📥 Commits

Reviewing files that changed from the base of the PR and between 64d4fce and 5b606c0.

📒 Files selected for processing (1)
  • .claude/skills/cv-evaluation/SKILL.md
✅ Files skipped from review due to trivial changes (1)
  • .claude/skills/cv-evaluation/SKILL.md

📝 Walkthrough

Walkthrough

Adds a local CV evaluation stack: Zod schemas, intelligence (rubric/archetypes/validators), prompt templates and renderers, Claude Code skill docs/commands, tests, and CLI docs to run an extract→detect→score→validate-claims pipeline fully locally.

Changes

CV Evaluation Infrastructure

Layer / File(s) Summary
Shared schema definitions
packages/schemas/*, packages/schemas/src/*, packages/schemas/src/__tests__/*, packages/schemas/tsconfig.json, packages/schemas/vitest.config.ts, packages/schemas/README.md
Zod schemas and inferred types for Resume, Archetype, JobDescription, EvaluationDimension, Issue, Claim, and EvalResult; tests verify parsing, constraints, and defaults.
Rubric, archetypes, and validators
packages/intelligence/package.json, packages/intelligence/src/rubric.ts, packages/intelligence/src/archetypes/*.ts, packages/intelligence/src/archetypes/index.ts, packages/intelligence/src/detect.ts, packages/intelligence/src/validators/ats.ts, packages/intelligence/src/validators/claims.ts, packages/intelligence/src/index.ts, packages/intelligence/src/__tests__/*, packages/intelligence/README.md, packages/intelligence/tsconfig.json, packages/intelligence/vitest.config.ts
Defines RUBRIC v1 (six dimensions), three archetypes (software-engineer, product-manager, data-ml-engineer) with evaluationWeights, keyword-count detectArchetype(), ATS compatibility checks, and CLAIM_RULES for claim validation; barrel exports and tests included.
LLM prompt templates and renderers
packages/prompts/package.json, packages/prompts/prompts/extract.md, packages/prompts/prompts/score.md, packages/prompts/prompts/validate-claims.md, packages/prompts/src/index.ts, packages/prompts/src/__tests__/*, packages/prompts/README.md, packages/prompts/tsconfig.json, packages/prompts/vitest.config.ts
Three Phase-1 prompt templates and synchronous renderers: extract → Resume JSON, score → EvalResult JSON (weighted 0–5 dimensions, ≥3 issues with exact quotes and fixes), validate-claims → Claim[]; renderers inject rubric, archetype weights, claim rules, and optional JD keywords.
Claude Code skill and commands
.claude/settings.json, .claude/skills/cv-evaluation/SKILL.md, .claude/skills/cv-evaluation/rubric.md, .claude/skills/cv-evaluation/archetypes.md, .claude/skills/cv-evaluation/scoring.md, .claude/skills/cv-evaluation/claim-validation.md, .claude/commands/evaluate-cv.md, .claude/commands/setup-profile.md, .claude/welcome.sh
Skill docs and command docs implementing the extract→detect→score→validate flow; session welcome.sh emits a menu JSON when jq is available; settings grant Read/Glob/Grep and run the session-start hook.
User documentation and CLI package
CLAUDE.md, apps/cli/README.md, apps/cli/package.json
Top-level CLAUDE.md and CLI README with quickstart, privacy/local-only guarantees, evaluation output format, and a small private CLI package manifest.

Sequence Diagram(s)

sequenceDiagram
  participant ClaudeCommand as Claude Command
  participant PromptRenderer as Prompt Renderer
  participant LLM as Local LLM
  participant Intelligence as Intelligence pkg
  participant SchemaValidator as Schema Validator
  ClaudeCommand->>PromptRenderer: renderExtractPrompt(resume file)
  PromptRenderer->>LLM: run extract prompt
  LLM-->>PromptRenderer: Resume JSON
  ClaudeCommand->>Intelligence: detectArchetype(resume.rawText)
  ClaudeCommand->>PromptRenderer: renderScorePrompt(archetype, jd)
  PromptRenderer->>LLM: run score prompt
  LLM-->>SchemaValidator: EvalResult JSON
  SchemaValidator-->>ClaudeCommand: validated EvalResult
  ClaudeCommand->>PromptRenderer: renderValidateClaimsPrompt()
  PromptRenderer->>LLM: run validate-claims
  LLM-->>SchemaValidator: Claim[] validated
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related issues

  • #67 — Adds CLAUDE.md and CLI README implementing the power-user quickstart/docs requested.
  • #64 — Adds extract/score/validate-claims prompts and renderers consistent with the prompt-pack objectives.
  • #15 — Implements detectArchetype with tests and fallback behavior matching that issue’s request.

Suggested reviewers

  • alexNJF

Poem

"🐰
I hopped through files with careful paws,
schemas, rubrics, prompt-lit laws,
extracted lines and counted flaws,
local scores and helpful claws,
carrots for a resume's cause."

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(cli): add power-user pack — Claude Code skill, commands, welcome' accurately and concisely describes the primary change: adding a complete Claude Code power-user pack with commands, skills, and welcome setup.
Linked Issues check ✅ Passed The PR comprehensively implements all objectives from #65: .claude/skills/cv-evaluation with subfiles (rubric, archetypes, scoring, claim-validation), .claude/commands with /evaluate-cv and /setup-profile, CLAUDE.md and apps/cli/README.md documentation, .claude/settings.json with permissions, and .claude/welcome.sh with session-start hook for local workflow without network dependency.
Out of Scope Changes check ✅ Passed All changes are scoped to the power-user pack deliverable: CLI documentation, Claude Code skill setup, commands configuration, and schema/intelligence/prompts packaging. No job scraping, cover letters, or tailoring code introduced—all changes support the local evaluation workflow defined in #65.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/cli-power-user-pack

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (6)
apps/cli/README.md (1)

21-23: ⚡ Quick win

Add language specifier to fenced code blocks.

Lines 21 and 27 contain bash examples without language specification. Markdown linters and renderers recommend explicit language identifiers for syntax highlighting.

Fix markdown code block language specifiers
- ```
+ ```bash
  git clone https://github.com/TechImmigrants/cv-builder.git
  cd cv-builder
  claude              # open Claude Code at the repo root
- ```
+ ```

And similarly on line 27:

- ```
+ ```bash
  /evaluate-cv ./my-resume.pdf --jd ./job.md
- ```
+ ```
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/cli/README.md` around lines 21 - 23, Add explicit language specifiers to
the two fenced code blocks in README.md that show the CLI examples: change the
opening ``` for the blocks containing "/evaluate-cv ./my-resume.pdf" and
"/evaluate-cv ./my-resume.pdf --jd ./job.md" to ```bash so markdown
linters/renderers can apply shell syntax highlighting.

Source: Linters/SAST tools

packages/intelligence/src/rubric.ts (1)

5-18: ⚡ Quick win

Type-level enforcement gap between key union and RUBRIC_DIMENSIONS.

The RubricDimension.key union (lines 6-12) is manually maintained and separate from the actual RUBRIC_DIMENSIONS array entries. If a dimension is added to the array with a new key, TypeScript won't catch the missing union member, and vice versa.

Consider deriving the union from the array or adding a type assertion to enforce consistency:

♻️ Proposed fix to derive the key union from the array
-export interface RubricDimension {
-  key:
-    | "shippedEvidence"
-    | "quantifiedImpact"
-    | "toolingVisibility"
-    | "atsCompatibility"
-    | "keywordMatch"
-    | "publicProof";
-  name: string;
-  description: string;
-  // What a 0 vs a 5 looks like, used by the score prompt as anchors.
-  low: string;
-  high: string;
-}
-
 export const RUBRIC_DIMENSIONS: RubricDimension[] = [
+export const RUBRIC_DIMENSIONS = [
   {
     key: "shippedEvidence",
     name: "Shipped Evidence",
     description: "Real work that reached production, with named tools and outcomes.",
     low: "Responsibilities only; nothing shows it shipped.",
     high: "Every role names what was built, for whom, and the result.",
   },
   // ... rest of dimensions
-];
+] as const satisfies readonly RubricDimension[];
+
+export interface RubricDimension {
+  key: (typeof RUBRIC_DIMENSIONS)[number]["key"];
+  name: string;
+  description: string;
+  low: string;
+  high: string;
+}

Alternatively, use a satisfies constraint on the array to ensure all keys match the union.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/intelligence/src/rubric.ts` around lines 5 - 18, The
RubricDimension.key union is maintained separately from the RUBRIC_DIMENSIONS
data, so adding/removing keys can become inconsistent; update the code to derive
the key union from the actual RUBRIC_DIMENSIONS entries (or make
RUBRIC_DIMENSIONS the source-of-truth) by converting RUBRIC_DIMENSIONS into a
const array and inferring the key type (e.g., derive a type like typeof
RUBRIC_DIMENSIONS[number]['key'] for RubricDimension['key']) or apply a
satisfies/assertion to ensure RUBRIC_DIMENSIONS elements conform to the
RubricDimension shape; target symbols: RubricDimension, RubricDimension.key, and
RUBRIC_DIMENSIONS.
packages/prompts/src/index.ts (1)

33-58: 💤 Low value

Consider validating that all placeholders were replaced.

The renderScorePrompt function replaces multiple placeholders (lines 50-57), but if a placeholder is misspelled in the template (e.g., {{ARCHTYPE_NAME}}), it will silently remain in the output. While the test suite checks for absence of {{ (line 24 in prompts.test.ts), runtime validation would catch template/renderer mismatches earlier.

🛡️ Optional runtime validation
 export function renderScorePrompt({
   archetype,
   jdKeywords,
 }: ScorePromptOptions): string {
   const weights = Object.entries(archetype.evaluationWeights)
     .map(([key, value]) => `- ${key}: ${value}`)
     .join("\n");

   const rubric = RUBRIC.dimensions
     .map((d) => `- **${d.name}** — ${d.description}\n  - 0: ${d.low}\n  - 5: ${d.high}`)
     .join("\n");

   const keywords =
     jdKeywords && jdKeywords.length > 0
       ? `Match against these JD keywords: ${jdKeywords.join(", ")}.`
       : `No JD provided — match against the role's own keyword set: ${archetype.keywords.join(", ")}.`;

-  return loadTemplate("score")
+  const rendered = loadTemplate("score")
     .replaceAll("{{ARCHETYPE_NAME}}", archetype.name)
     .replaceAll("{{ARCHETYPE_ID}}", archetype.id)
     .replaceAll("{{ARCHETYPE_VERSION}}", archetype.version)
     .replaceAll("{{RUBRIC_VERSION}}", RUBRIC_VERSION)
     .replace("{{WEIGHTS}}", weights)
     .replace("{{RUBRIC}}", rubric)
     .replace("{{JD_KEYWORDS}}", keywords);
+
+  if (rendered.includes("{{")) {
+    throw new Error("Unreplaced placeholder in score prompt");
+  }
+  return rendered;
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/prompts/src/index.ts` around lines 33 - 58, renderScorePrompt
currently performs several .replace/.replaceAll calls on the loaded "score"
template but does not verify that all template placeholders were actually
replaced; add a post-replacement validation in renderScorePrompt that scans the
final string (e.g. for any remaining "{{...}}" tokens) and throws or logs a
clear error including the template name and archetype identifiers (use
ARCHETYPE_NAME/ARCHETYPE_ID/ARCHETYPE_VERSION and RUBRIC_VERSION to give
context) so template/placeholder mismatches are caught at runtime; also make the
replacements consistent (use replaceAll for every placeholder) before performing
the validation.
packages/prompts/prompts/score.md (1)

64-64: ⚡ Quick win

"No code fence" instruction ambiguity in score.md and validate-claims.md.

Both packages/prompts/prompts/score.md (line 64) and packages/prompts/prompts/validate-claims.md (line 32) include instructions that say "Output only the JSON. No prose, no code fence." However, the example schemas immediately above each instruction use code fences (```json). This creates potential confusion for the model about whether code fences are acceptable in the output.

Consider rewording both instructions to be more explicit, e.g., "Return only the raw JSON [object/array] below, with no markdown formatting, no code fence (```json), and no additional text before or after."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/prompts/prompts/score.md` at line 64, The two prompt files
packages/prompts/prompts/score.md and
packages/prompts/prompts/validate-claims.md contain an ambiguous instruction
"Output only the JSON. No prose, no code fence." conflicting with the examples
that use ```json fences; update each file to a clearer instruction such as:
"Return only the raw JSON object/array below, with no markdown formatting, no
code fence (```json), and no additional text before or after." Locate the exact
string "Output only the JSON. No prose, no code fence." in score.md (around the
example schema) and validate-claims.md and replace it with the new explicit
wording so the model knows to emit plain JSON without fences or extra text.
packages/prompts/prompts/extract.md (2)

41-41: 💤 Low value

Consider adding explicit validation guidance to the prompt.

While the JSON-only instruction is clear, the prompt does not explicitly state whether all top-level fields are required or optional, or what the LLM should do if ambiguous/missing data is encountered. Adding an explicit instruction like "All fields must be present in the JSON object; use null or empty arrays for missing values" would reduce the chance of malformed output.

💡 Optional improvement: Add explicit validation guidance
- Output only the JSON. No prose, no code fence.
+ Output only the JSON object. All top-level fields must be present:
+ - Use null for optional string fields that are missing (e.g., "headline": null)
+ - Use [] for array fields that are empty
+ - No prose, no code fence.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/prompts/prompts/extract.md` at line 41, The prompt currently says
"Output only the JSON. No prose, no code fence." but lacks explicit validation
rules; update the prompt in extract.md to require that all top-level fields must
be present in the returned JSON and specify how to represent missing or
ambiguous values (e.g., use null for missing scalar fields and empty arrays for
missing lists), and instruct the model to still output a valid JSON object even
when data is incomplete or ambiguous; reference the existing phrase "Output only
the JSON. No prose, no code fence." as the location to append this validation
guidance.

13-39: Align extract.md inline Resume example with packages/schemas
packages/prompts/prompts/extract.md’s inline JSON matches packages/schemasResumeSchema structure: rawText is required, links[].type uses the same enum values, and experience/education fields (company/role and institution required; date/text fields optional) line up with the Zod schema.

Optional refinement: the prompt example doesn’t reflect Zod defaults (contact, links, experience, education, skills, and bullets can be omitted while still validating due to .default(...)).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/prompts/prompts/extract.md` around lines 13 - 39, Update the inline
JSON in extract.md to match the ResumeSchema in packages/schemas: make rawText
required, ensure links[].type uses the same enum values as ResumeSchema, mark
company and role (in experience) and institution (in education) as required
while keeping date/text fields optional (startDate, endDate, degree, field, year
optional), and reflect that contact, links, experience, education, skills, and
bullets can be omitted due to the Zod .default(...) behavior so the example
shows they are optional/omittable rather than always present; refer to
ResumeSchema in packages/schemas to mirror exact field names and
required/optional status.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/intelligence/src/validators/ats.ts`:
- Line 32: The regex checks in the ATS resume validator use dot (.) which
doesn't match newlines, so multi-line tables or tab-separated columns aren't
detected; update the condition that currently uses the patterns `/\|.*\|/` and
`/\t.*\t/` to use a dotall-aware pattern (either add the `s` flag like
`/\|.*\|/s` and `/\t.*\t/s` or replace `.*` with `[\s\S]*` such as
`/\|[\s\S]*\|/` and `/\t[\s\S]*\t/`) so multi-line markdown tables and tabulated
content are correctly matched in the function containing that if-check.
- Around line 30-35: The regex checks use the original resumeText while a
lowercased version is stored in text, causing inconsistent case handling; update
the table-detection and email-detection tests to run against text (the
lowercased variable) instead of resumeText (or alternatively remove the initial
toLowerCase() assignment if case sensitivity is required), so modify the
conditions that reference resumeText (the /\|.*\|/, /\t.*\t/, and the email
regex) to reference text to ensure consistent behavior.

In `@packages/schemas/package.json`:
- Around line 20-26: The devDependency vitest is pinned to a vulnerable version
("vitest": "^3.0.0"); update the vitest entry in package.json's devDependencies
to a fixed release (e.g., "^3.0.5" or "3.0.4"), then reinstall/update the
lockfile (npm/yarn/pnpm) so the lockfile reflects the patched version and run
the test suite to ensure compatibility; look for the "vitest" token in
package.json and update that value only.

---

Nitpick comments:
In `@apps/cli/README.md`:
- Around line 21-23: Add explicit language specifiers to the two fenced code
blocks in README.md that show the CLI examples: change the opening ``` for the
blocks containing "/evaluate-cv ./my-resume.pdf" and "/evaluate-cv
./my-resume.pdf --jd ./job.md" to ```bash so markdown linters/renderers can
apply shell syntax highlighting.

In `@packages/intelligence/src/rubric.ts`:
- Around line 5-18: The RubricDimension.key union is maintained separately from
the RUBRIC_DIMENSIONS data, so adding/removing keys can become inconsistent;
update the code to derive the key union from the actual RUBRIC_DIMENSIONS
entries (or make RUBRIC_DIMENSIONS the source-of-truth) by converting
RUBRIC_DIMENSIONS into a const array and inferring the key type (e.g., derive a
type like typeof RUBRIC_DIMENSIONS[number]['key'] for RubricDimension['key']) or
apply a satisfies/assertion to ensure RUBRIC_DIMENSIONS elements conform to the
RubricDimension shape; target symbols: RubricDimension, RubricDimension.key, and
RUBRIC_DIMENSIONS.

In `@packages/prompts/prompts/extract.md`:
- Line 41: The prompt currently says "Output only the JSON. No prose, no code
fence." but lacks explicit validation rules; update the prompt in extract.md to
require that all top-level fields must be present in the returned JSON and
specify how to represent missing or ambiguous values (e.g., use null for missing
scalar fields and empty arrays for missing lists), and instruct the model to
still output a valid JSON object even when data is incomplete or ambiguous;
reference the existing phrase "Output only the JSON. No prose, no code fence."
as the location to append this validation guidance.
- Around line 13-39: Update the inline JSON in extract.md to match the
ResumeSchema in packages/schemas: make rawText required, ensure links[].type
uses the same enum values as ResumeSchema, mark company and role (in experience)
and institution (in education) as required while keeping date/text fields
optional (startDate, endDate, degree, field, year optional), and reflect that
contact, links, experience, education, skills, and bullets can be omitted due to
the Zod .default(...) behavior so the example shows they are optional/omittable
rather than always present; refer to ResumeSchema in packages/schemas to mirror
exact field names and required/optional status.

In `@packages/prompts/prompts/score.md`:
- Line 64: The two prompt files packages/prompts/prompts/score.md and
packages/prompts/prompts/validate-claims.md contain an ambiguous instruction
"Output only the JSON. No prose, no code fence." conflicting with the examples
that use ```json fences; update each file to a clearer instruction such as:
"Return only the raw JSON object/array below, with no markdown formatting, no
code fence (```json), and no additional text before or after." Locate the exact
string "Output only the JSON. No prose, no code fence." in score.md (around the
example schema) and validate-claims.md and replace it with the new explicit
wording so the model knows to emit plain JSON without fences or extra text.

In `@packages/prompts/src/index.ts`:
- Around line 33-58: renderScorePrompt currently performs several
.replace/.replaceAll calls on the loaded "score" template but does not verify
that all template placeholders were actually replaced; add a post-replacement
validation in renderScorePrompt that scans the final string (e.g. for any
remaining "{{...}}" tokens) and throws or logs a clear error including the
template name and archetype identifiers (use
ARCHETYPE_NAME/ARCHETYPE_ID/ARCHETYPE_VERSION and RUBRIC_VERSION to give
context) so template/placeholder mismatches are caught at runtime; also make the
replacements consistent (use replaceAll for every placeholder) before performing
the validation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 4b8813fd-e156-4921-964a-025af1b5c279

📥 Commits

Reviewing files that changed from the base of the PR and between 1e258e6 and 131083a.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (45)
  • .claude/commands/evaluate-cv.md
  • .claude/commands/setup-profile.md
  • .claude/settings.json
  • .claude/skills/cv-evaluation/SKILL.md
  • .claude/skills/cv-evaluation/archetypes.md
  • .claude/skills/cv-evaluation/claim-validation.md
  • .claude/skills/cv-evaluation/rubric.md
  • .claude/skills/cv-evaluation/scoring.md
  • .claude/welcome.sh
  • CLAUDE.md
  • apps/cli/README.md
  • apps/cli/package.json
  • packages/intelligence/README.md
  • packages/intelligence/package.json
  • packages/intelligence/src/__tests__/intelligence.test.ts
  • packages/intelligence/src/archetypes/data-ml-engineer.ts
  • packages/intelligence/src/archetypes/index.ts
  • packages/intelligence/src/archetypes/product-manager.ts
  • packages/intelligence/src/archetypes/software-engineer.ts
  • packages/intelligence/src/detect.ts
  • packages/intelligence/src/index.ts
  • packages/intelligence/src/rubric.ts
  • packages/intelligence/src/validators/ats.ts
  • packages/intelligence/src/validators/claims.ts
  • packages/intelligence/tsconfig.json
  • packages/intelligence/vitest.config.ts
  • packages/prompts/README.md
  • packages/prompts/package.json
  • packages/prompts/prompts/extract.md
  • packages/prompts/prompts/score.md
  • packages/prompts/prompts/validate-claims.md
  • packages/prompts/src/__tests__/prompts.test.ts
  • packages/prompts/src/index.ts
  • packages/prompts/tsconfig.json
  • packages/prompts/vitest.config.ts
  • packages/schemas/README.md
  • packages/schemas/package.json
  • packages/schemas/src/__tests__/schemas.test.ts
  • packages/schemas/src/archetype.ts
  • packages/schemas/src/evaluation.ts
  • packages/schemas/src/index.ts
  • packages/schemas/src/job-description.ts
  • packages/schemas/src/resume.ts
  • packages/schemas/tsconfig.json
  • packages/schemas/vitest.config.ts

Comment thread packages/intelligence/src/validators/ats.ts
Comment thread packages/intelligence/src/validators/ats.ts
Comment thread packages/schemas/package.json
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[cli] Claude Code skill + slash commands + power-user pack

1 participant