@getkrafter/resume-toolkit 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,29 +6,14 @@ Deterministic resume scoring, ATS keyword matching, and AI-powered resume tailor
6
6
 
7
7
  ## Quick Start — Skills (no account needed)
8
8
 
9
- ### Claude Code
9
+ ### All platforms (Claude Code, Cursor, Windsurf, OpenCode, Codex)
10
10
 
11
11
  ```bash
12
- /install-plugin @getkrafter/resume-toolkit
12
+ npx skills add getkrafter/resume-toolkit
13
13
  ```
14
14
 
15
15
  Then use `/score` or `/tailor` in any conversation.
16
16
 
17
- ### Cursor
18
-
19
- Add to Settings → Remote Rule:
20
-
21
- ```
22
- https://github.com/getkrafter/resume-toolkit/blob/master/skills/score/SKILL.md
23
- https://github.com/getkrafter/resume-toolkit/blob/master/skills/tailor/SKILL.md
24
- ```
25
-
26
- Or copy the `skills/` directory to `.cursor/skills/` in your project.
27
-
28
- ### Windsurf
29
-
30
- Copy the `skills/` directory to `.windsurf/skills/` or `.agents/skills/` in your project.
31
-
32
17
  ## Quick Start — MCP Server
33
18
 
34
19
  ### Without API key (scoring tools only)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getkrafter/resume-toolkit",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Deterministic resume scoring, ATS keyword matching, and AI-powered resume tailoring",
5
5
  "type": "module",
6
6
  "exports": {
@@ -69,9 +69,11 @@ You do NOT need to do this manually. The `score_resume` MCP tool handles parsing
69
69
 
70
70
  ---
71
71
 
72
- ## Step 5 — Call the Scoring Tool
72
+ ## Step 5 — Score the Resume
73
73
 
74
- **Standard path** (pasted text or file):
74
+ Choose the method that matches your environment:
75
+
76
+ **Option A — MCP tools available** (user has the MCP server configured):
75
77
 
76
78
  Call the `score_resume` MCP tool:
77
79
  ```json
@@ -81,9 +83,7 @@ Call the `score_resume` MCP tool:
81
83
  }
82
84
  ```
83
85
 
84
- **Krafter path** (user selected a Krafter resume):
85
-
86
- Call the `score_krafter_resume` MCP tool:
86
+ Or for Krafter resumes, call `score_krafter_resume`:
87
87
  ```json
88
88
  {
89
89
  "id": "<the resume ID from list_resumes>",
@@ -91,6 +91,30 @@ Call the `score_krafter_resume` MCP tool:
91
91
  }
92
92
  ```
93
93
 
94
+ **Option B — No MCP server** (skill installed without MCP):
95
+
96
+ Run this inline script to score the resume. Replace the `resumeText` and `jdText` values with the actual content:
97
+
98
+ ```bash
99
+ node --input-type=module -e "
100
+ import { scoreResume, scoreATS } from '@getkrafter/resume-toolkit';
101
+
102
+ const resumeText = process.env.RESUME_TEXT;
103
+ const jdText = process.env.JD_TEXT || '';
104
+
105
+ const lines = resumeText.split('\n');
106
+ const bullets = lines.filter(l => /^\s*[-*•]|\d+[.)]/.test(l)).map(l => l.replace(/^\s*[-*•]\s*|\d+[.)]\s*/, '').trim());
107
+ const sections = lines.filter(l => l.trim().length < 50 && l.trim().length > 0 && !(/^\s*[-*•]|\d+[.)]/.test(l)) && (l.trim() === l.trim().toUpperCase() || /^[A-Z][a-z]/.test(l.trim()))).map(l => l.trim().toLowerCase());
108
+
109
+ const result = scoreResume({ rawText: resumeText, bullets, sections }, jdText || undefined);
110
+ console.log(JSON.stringify(result, null, 2));
111
+ " <<< ""
112
+ ```
113
+
114
+ Pass `RESUME_TEXT` and `JD_TEXT` as environment variables containing the resume and job description text. Parse the JSON output and present results per Step 6.
115
+
116
+ If `@getkrafter/resume-toolkit` is not installed as a dependency, install it first: `npm install @getkrafter/resume-toolkit`
117
+
94
118
  ---
95
119
 
96
120
  ## Step 6 — Present the Results
@@ -56,27 +56,39 @@ transformation internally via `toResumeData`.
56
56
 
57
57
  ### Step 4 -- Run Scoring Tools
58
58
 
59
- Run **both** scoring tools to get the full picture:
59
+ Run **both** scoring tools to get the full picture. Choose the method that matches your environment:
60
60
 
61
- **For pasted/file resumes:**
61
+ **Option A — MCP tools available** (user has the MCP server configured):
62
62
 
63
- 1. `score_ats` with `{ resumeText, jdText }` -- returns `ATSResult` with:
64
- - `score` (0-100)
65
- - `matched` keywords (array)
66
- - `missing` keywords (array)
67
- - `details.bigramsMatched`, `details.unigramsMatched`, `details.bigramsMissing`, `details.unigramsMissing`
63
+ For pasted/file resumes:
64
+ 1. `score_ats` with `{ resumeText, jdText }` -- returns `ATSResult` with `score`, `matched`, `missing`, and `details` breakdown.
65
+ 2. `score_resume` with `{ resumeText, jdText }` -- returns `ResumeScore` with `total`, `mode`, `breakdown`, `ats`, and `flags`.
68
66
 
69
- 2. `score_resume` with `{ resumeText, jdText }` -- returns `ResumeScore` with:
70
- - `total` (0-100)
71
- - `mode` ("with-jd")
72
- - `breakdown` per dimension (quantification, verbStrength, ats, bulletStructure, sectionCompleteness)
73
- - `ats` (embedded ATSResult)
74
- - `flags` (diagnostic messages)
67
+ For Krafter resumes:
68
+ 1. `score_krafter_resume` with `{ id, jdText }` -- returns the full `ResumeScore` including the embedded `ATSResult`.
75
69
 
76
- **For Krafter resumes:**
70
+ **Option B — No MCP server** (skill installed without MCP):
77
71
 
78
- 1. `score_krafter_resume` with `{ id, jdText }` -- returns the full `ResumeScore` including the embedded `ATSResult`.
79
- 2. Optionally also call `score_ats` directly if you need the standalone ATS breakdown.
72
+ Run this inline script. Pass `RESUME_TEXT` and `JD_TEXT` as environment variables:
73
+
74
+ ```bash
75
+ node --input-type=module -e "
76
+ import { scoreResume, scoreATS } from '@getkrafter/resume-toolkit';
77
+
78
+ const resumeText = process.env.RESUME_TEXT;
79
+ const jdText = process.env.JD_TEXT;
80
+
81
+ const lines = resumeText.split('\n');
82
+ const bullets = lines.filter(l => /^\s*[-*•]|\d+[.)]/.test(l)).map(l => l.replace(/^\s*[-*•]\s*|\d+[.)]\s*/, '').trim());
83
+ const sections = lines.filter(l => l.trim().length < 50 && l.trim().length > 0 && !(/^\s*[-*•]|\d+[.)]/.test(l)) && (l.trim() === l.trim().toUpperCase() || /^[A-Z][a-z]/.test(l.trim()))).map(l => l.trim().toLowerCase());
84
+
85
+ const atsResult = scoreATS(resumeText, jdText);
86
+ const scoreResult = scoreResume({ rawText: resumeText, bullets, sections }, jdText);
87
+ console.log(JSON.stringify({ atsResult, scoreResult }, null, 2));
88
+ " <<< ""
89
+ ```
90
+
91
+ If `@getkrafter/resume-toolkit` is not installed, run `npm install @getkrafter/resume-toolkit` first. Parse the JSON output and continue to Step 5.
80
92
 
81
93
  ### Step 5 -- Gap Analysis
82
94