resuml 2.0.0 → 3.0.0

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/DOCS.md CHANGED
@@ -18,13 +18,13 @@
18
18
 
19
19
  ## Why YAML
20
20
 
21
- | | YAML | JSON |
22
- |---|---|---|
23
- | **Comments** | ✅ `# explain your choices` | ❌ Not supported |
24
- | **Multi-line strings** | ✅ `summary: >-` block syntax | ❌ Escape everything |
25
- | **Readability** | ✅ Clean, minimal syntax | ⚠️ Brackets & quotes everywhere |
26
- | **Diffing** | ✅ Clean git diffs | ⚠️ Noisy diffs |
27
- | **Compatibility** | ✅ Valid JSON Resume schema | ✅ Native |
21
+ | | YAML | JSON |
22
+ | ---------------------- | ----------------------------- | ------------------------------- |
23
+ | **Comments** | ✅ `# explain your choices` | ❌ Not supported |
24
+ | **Multi-line strings** | ✅ `summary: >-` block syntax | ❌ Escape everything |
25
+ | **Readability** | ✅ Clean, minimal syntax | ⚠️ Brackets & quotes everywhere |
26
+ | **Diffing** | ✅ Clean git diffs | ⚠️ Noisy diffs |
27
+ | **Compatibility** | ✅ Valid JSON Resume schema | ✅ Native |
28
28
 
29
29
  YAML is a superset of JSON, so your resume stays fully compatible with the [JSON Resume](https://jsonresume.org/) ecosystem.
30
30
 
@@ -38,30 +38,30 @@ Requires Node.js ≥ 20 and npm ≥ 10.
38
38
 
39
39
  ## CLI commands and options
40
40
 
41
- | Command | Description |
42
- |---------|-------------|
43
- | `validate` | Validate resume data against the JSON Resume schema |
44
- | `validate --ats` | Run ATS compatibility analysis |
45
- | `tojson` | Convert YAML to JSON |
46
- | `render` | Render the resume to HTML using a theme |
47
- | `pdf` | Render to PDF |
48
- | `dev` | Dev server with hot-reload |
49
- | `mcp` | Start the MCP server for AI agents |
41
+ | Command | Description |
42
+ | ---------------- | --------------------------------------------------- |
43
+ | `validate` | Validate resume data against the JSON Resume schema |
44
+ | `validate --ats` | Run ATS compatibility analysis |
45
+ | `tojson` | Convert YAML to JSON |
46
+ | `render` | Render the resume to HTML using a theme |
47
+ | `pdf` | Render to PDF |
48
+ | `dev` | Dev server with hot-reload |
49
+ | `mcp` | Start the MCP server for AI agents |
50
50
 
51
51
  ### Options
52
52
 
53
- | Option | Alias | Description |
54
- |--------|-------|-------------|
55
- | `--resume` | `-r` | Input YAML file(s) or directory |
56
- | `--output` | `-o` | Output file path |
57
- | `--theme` | `-t` | Theme name |
58
- | `--port` | `-p` | Dev server port (default: 3000) |
59
- | `--language` | | Locale (default: `en`) |
60
- | `--debug` | | Detailed errors |
61
- | `--ats` | | Run ATS analysis (with `validate`) |
62
- | `--jd` | | Path to job description file (with `--ats`) |
63
- | `--ats-threshold` | | Minimum score (0-100); exits 1 if below |
64
- | `--format` | | Output format for validate: `text` or `json` |
53
+ | Option | Alias | Description |
54
+ | ----------------- | ----- | -------------------------------------------- |
55
+ | `--resume` | `-r` | Input YAML file(s) or directory |
56
+ | `--output` | `-o` | Output file path |
57
+ | `--theme` | `-t` | Theme name |
58
+ | `--port` | `-p` | Dev server port (default: 3000) |
59
+ | `--language` | | Locale (default: `en`) |
60
+ | `--debug` | | Detailed errors |
61
+ | `--ats` | | Run ATS analysis (with `validate`) |
62
+ | `--jd` | | Path to job description file (with `--ats`) |
63
+ | `--ats-threshold` | | Minimum score (0-100); exits 1 if below |
64
+ | `--format` | | Output format for validate: `text` or `json` |
65
65
 
66
66
  ### Quick start
67
67
 
@@ -94,10 +94,12 @@ resuml validate --resume resume.yaml --ats --format json
94
94
  11 deterministic checks across 3 categories.
95
95
 
96
96
  **Contact information**
97
+
97
98
  - Complete contact details (name, email, phone, city)
98
99
  - LinkedIn profile present
99
100
 
100
101
  **Content quality**
102
+
101
103
  - Professional summary (length and presence)
102
104
  - Work highlights (≥ 2 per entry)
103
105
  - Action verbs (highlights start with strong verbs)
@@ -105,6 +107,7 @@ resuml validate --resume resume.yaml --ats --format json
105
107
  - No first-person pronouns
106
108
 
107
109
  **Resume structure**
110
+
108
111
  - Date consistency (no unexplained gaps > 6 months)
109
112
  - Skills populated (≥ 3 categories with keywords)
110
113
  - Education completeness
@@ -121,12 +124,12 @@ Passing `--jd` extracts keywords from the job description using TF-based ranking
121
124
 
122
125
  ### Scoring
123
126
 
124
- | Score | Rating | Meaning |
125
- |-------|--------|---------|
126
- | 90-100 | Excellent | Well-optimized for ATS |
127
- | 75-89 | Good | Minor improvements possible |
128
- | 60-74 | Needs Work | Several issues to address |
129
- | 0-59 | Poor | Significant improvements needed |
127
+ | Score | Rating | Meaning |
128
+ | ------ | ---------- | ------------------------------- |
129
+ | 90-100 | Excellent | Well-optimized for ATS |
130
+ | 75-89 | Good | Minor improvements possible |
131
+ | 60-74 | Needs Work | Several issues to address |
132
+ | 0-59 | Poor | Significant improvements needed |
130
133
 
131
134
  With a JD: final score = 60% generic checks + 40% keyword match.
132
135
 
@@ -147,13 +150,13 @@ npm install jsonresume-theme-stackoverflow
147
150
  resuml render --resume resume.yaml --theme stackoverflow
148
151
  ```
149
152
 
150
- | Theme | Install | Style |
151
- |-------|---------|-------|
153
+ | Theme | Install | Style |
154
+ | ---------------------------------------------------------------------------------- | -------------------------------------- | ------------------- |
152
155
  | [stackoverflow](https://github.com/francoislaberge/jsonresume-theme-stackoverflow) | `npm i jsonresume-theme-stackoverflow` | Clean, professional |
153
- | [elegant](https://github.com/mudassir0909/jsonresume-theme-elegant) | `npm i jsonresume-theme-elegant` | Modern |
154
- | [kendall](https://github.com/LinuxBozo/jsonresume-theme-kendall) | `npm i jsonresume-theme-kendall` | Minimal |
155
- | [flat](https://github.com/erming/jsonresume-theme-flat) | `npm i jsonresume-theme-flat` | Flat |
156
- | [onepage](https://github.com/aonemd/jsonresume-theme-onepage) | `npm i jsonresume-theme-onepage` | Single-page |
156
+ | [elegant](https://github.com/mudassir0909/jsonresume-theme-elegant) | `npm i jsonresume-theme-elegant` | Modern |
157
+ | [kendall](https://github.com/LinuxBozo/jsonresume-theme-kendall) | `npm i jsonresume-theme-kendall` | Minimal |
158
+ | [flat](https://github.com/erming/jsonresume-theme-flat) | `npm i jsonresume-theme-flat` | Flat |
159
+ | [onepage](https://github.com/aonemd/jsonresume-theme-onepage) | `npm i jsonresume-theme-onepage` | Single-page |
157
160
 
158
161
  Browse all at [jsonresume.org/themes](https://jsonresume.org/themes/). The web app at [resuml.app](https://resuml.app) bundles 300+ of them and renders live.
159
162
 
@@ -274,41 +277,44 @@ Claude Code will:
274
277
 
275
278
  ### Tools
276
279
 
277
- | Tool | Purpose |
278
- |------|---------|
279
- | `resuml_init_resume` | Generate a starter YAML template |
280
- | `resuml_validate` | Validate resume YAML against the JSON Resume schema |
281
- | `resuml_ats_check` | ATS analysis + JD keyword matching |
282
- | `resuml_render` | Render to HTML using a theme (supports `locale`) |
283
- | `resuml_list_themes` | List available themes and install status |
284
- | `resuml_export_pdf` | Export as PDF (supports `margin`, `locale`) |
280
+ | Tool | Purpose |
281
+ | -------------------- | --------------------------------------------------- |
282
+ | `resuml_init_resume` | Generate a starter YAML template |
283
+ | `resuml_validate` | Validate resume YAML against the JSON Resume schema |
284
+ | `resuml_ats_check` | ATS analysis + JD keyword matching |
285
+ | `resuml_render` | Render to HTML using a theme (supports `locale`) |
286
+ | `resuml_list_themes` | List available themes and install status |
287
+ | `resuml_export_pdf` | Export as PDF (supports `margin`, `locale`) |
285
288
 
286
289
  ### Resources
287
290
 
288
- | URI | Description |
289
- |-----|-------------|
290
- | `resuml://schema/json-resume` | Full JSON Resume schema reference |
291
- | `resuml://docs/ats-scoring` | ATS scoring rubric, checks, weights, and tips |
292
- | `resuml://themes/catalog` | Available themes with descriptions |
291
+ | URI | Description |
292
+ | ----------------------------- | --------------------------------------------- |
293
+ | `resuml://schema/json-resume` | Full JSON Resume schema reference |
294
+ | `resuml://docs/ats-scoring` | ATS scoring rubric, checks, weights, and tips |
295
+ | `resuml://themes/catalog` | Available themes with descriptions |
293
296
 
294
297
  ### Prompts
295
298
 
296
- | Prompt | Description |
297
- |--------|-------------|
298
- | `tailor-resume-to-jd` | Tailor a resume for a specific job description |
299
- | `optimize-ats-score` | Analyze and improve an existing resume's ATS score |
300
- | `review-resume` | Comprehensive review + improvement suggestions |
299
+ | Prompt | Description |
300
+ | --------------------- | -------------------------------------------------- |
301
+ | `tailor-resume-to-jd` | Tailor a resume for a specific job description |
302
+ | `optimize-ats-score` | Analyze and improve an existing resume's ATS score |
303
+ | `review-resume` | Comprehensive review + improvement suggestions |
301
304
 
302
305
  ## Troubleshooting
303
306
 
304
307
  **Validation errors**
308
+
305
309
  - Check YAML indentation and required fields
306
310
  - Run with `--debug` for stack traces
307
311
 
308
312
  **Theme rendering issues**
313
+
309
314
  - Ensure the theme is installed (`npm install jsonresume-theme-<name>`)
310
315
  - Third-party themes may have their own bugs. Try a different theme.
311
316
  - The web app at [resuml.app](https://resuml.app) pre-checks themes and flags broken ones
312
317
 
313
318
  **Dev server issues**
319
+
314
320
  - The default port is 3000. Pass `--port` to override.
@@ -28,14 +28,23 @@
28
28
  { "canonical": "Jotai", "type": "library" },
29
29
  { "canonical": "Recoil", "type": "library" },
30
30
  { "canonical": "MobX", "type": "library" },
31
- { "canonical": "React Query", "aliases": ["TanStack Query", "tanstack-query"], "type": "library" },
31
+ {
32
+ "canonical": "React Query",
33
+ "aliases": ["TanStack Query", "tanstack-query"],
34
+ "type": "library"
35
+ },
32
36
  { "canonical": "TanStack", "type": "library" },
33
37
  { "canonical": "SWR", "type": "library" },
34
38
  { "canonical": "tRPC", "type": "library" },
35
39
  { "canonical": "GraphQL", "type": "library", "hot": true },
36
40
  { "canonical": "Apollo", "aliases": ["Apollo Client", "Apollo GraphQL"], "type": "library" },
37
41
  { "canonical": "Relay", "type": "library" },
38
- { "canonical": "Tailwind CSS", "aliases": ["Tailwind", "TailwindCSS"], "type": "framework", "hot": true },
42
+ {
43
+ "canonical": "Tailwind CSS",
44
+ "aliases": ["Tailwind", "TailwindCSS"],
45
+ "type": "framework",
46
+ "hot": true
47
+ },
39
48
  { "canonical": "shadcn/ui", "aliases": ["shadcn", "shadcn ui"], "type": "library" },
40
49
  { "canonical": "Radix UI", "aliases": ["Radix"], "type": "library" },
41
50
  { "canonical": "Headless UI", "type": "library" },
@@ -69,7 +78,11 @@
69
78
  { "canonical": "Vitest", "type": "tool" },
70
79
  { "canonical": "Playwright", "type": "tool" },
71
80
  { "canonical": "Cypress", "type": "tool" },
72
- { "canonical": "Testing Library", "aliases": ["React Testing Library", "RTL"], "type": "library" },
81
+ {
82
+ "canonical": "Testing Library",
83
+ "aliases": ["React Testing Library", "RTL"],
84
+ "type": "library"
85
+ },
73
86
  { "canonical": "Mocha", "type": "tool" },
74
87
  { "canonical": "Chai", "type": "tool" },
75
88
 
@@ -113,7 +126,12 @@
113
126
  { "canonical": "NoSQL", "type": "language" },
114
127
 
115
128
  { "canonical": "AWS", "aliases": ["Amazon Web Services"], "type": "platform", "hot": true },
116
- { "canonical": "Google Cloud", "aliases": ["GCP", "Google Cloud Platform"], "type": "platform", "hot": true },
129
+ {
130
+ "canonical": "Google Cloud",
131
+ "aliases": ["GCP", "Google Cloud Platform"],
132
+ "type": "platform",
133
+ "hot": true
134
+ },
117
135
  { "canonical": "Microsoft Azure", "aliases": ["Azure"], "type": "platform", "hot": true },
118
136
  { "canonical": "Vercel", "type": "platform" },
119
137
  { "canonical": "Netlify", "type": "platform" },
@@ -157,7 +175,11 @@
157
175
  { "canonical": "dbt", "aliases": ["data build tool"], "type": "tool" },
158
176
  { "canonical": "Spark", "aliases": ["Apache Spark", "PySpark"], "type": "framework" },
159
177
  { "canonical": "Kafka", "aliases": ["Apache Kafka"], "type": "platform" },
160
- { "canonical": "RAG", "aliases": ["Retrieval Augmented Generation", "retrieval-augmented generation"], "type": "practice" },
178
+ {
179
+ "canonical": "RAG",
180
+ "aliases": ["Retrieval Augmented Generation", "retrieval-augmented generation"],
181
+ "type": "practice"
182
+ },
161
183
  { "canonical": "Vector Search", "type": "practice" },
162
184
  { "canonical": "Embeddings", "type": "practice" },
163
185
 
@@ -173,15 +195,28 @@
173
195
  { "canonical": "Sketch", "type": "tool" },
174
196
  { "canonical": "Miro", "type": "tool" },
175
197
 
176
- { "canonical": "CI/CD", "aliases": ["CICD", "Continuous Integration", "Continuous Delivery", "Continuous Deployment"], "type": "practice", "hot": true },
177
- { "canonical": "REST API", "aliases": ["RESTful API", "REST APIs", "REST"], "type": "practice" },
198
+ {
199
+ "canonical": "CI/CD",
200
+ "aliases": ["CICD", "Continuous Integration", "Continuous Delivery", "Continuous Deployment"],
201
+ "type": "practice",
202
+ "hot": true
203
+ },
204
+ {
205
+ "canonical": "REST API",
206
+ "aliases": ["RESTful API", "REST APIs", "REST"],
207
+ "type": "practice"
208
+ },
178
209
  { "canonical": "gRPC", "type": "practice" },
179
210
  { "canonical": "WebSockets", "aliases": ["WebSocket"], "type": "practice" },
180
211
  { "canonical": "Microservices", "type": "practice", "hot": true },
181
212
  { "canonical": "Monorepo", "aliases": ["monorepos"], "type": "practice" },
182
213
  { "canonical": "Serverless", "type": "practice" },
183
214
  { "canonical": "Edge Computing", "aliases": ["edge functions"], "type": "practice" },
184
- { "canonical": "Event-Driven Architecture", "aliases": ["EDA", "event-driven"], "type": "practice" },
215
+ {
216
+ "canonical": "Event-Driven Architecture",
217
+ "aliases": ["EDA", "event-driven"],
218
+ "type": "practice"
219
+ },
185
220
  { "canonical": "Domain-Driven Design", "aliases": ["DDD"], "type": "practice" },
186
221
  { "canonical": "Test-Driven Development", "aliases": ["TDD"], "type": "practice" },
187
222
  { "canonical": "Agile", "aliases": ["Scrum", "Kanban"], "type": "practice" },
@@ -196,12 +231,25 @@
196
231
  { "canonical": "Accessibility", "aliases": ["a11y", "WCAG"], "type": "practice", "hot": true },
197
232
  { "canonical": "Internationalization", "aliases": ["i18n"], "type": "practice" },
198
233
  { "canonical": "Observability", "type": "practice" },
199
- { "canonical": "Design Systems", "aliases": ["Design System"], "type": "practice", "hot": true },
234
+ {
235
+ "canonical": "Design Systems",
236
+ "aliases": ["Design System"],
237
+ "type": "practice",
238
+ "hot": true
239
+ },
200
240
  { "canonical": "Data Modeling", "aliases": ["Data Model", "Data Models"], "type": "practice" },
201
- { "canonical": "Technical Leadership", "aliases": ["Tech Lead", "Tech Leadership"], "type": "practice" },
241
+ {
242
+ "canonical": "Technical Leadership",
243
+ "aliases": ["Tech Lead", "Tech Leadership"],
244
+ "type": "practice"
245
+ },
202
246
  { "canonical": "Mentoring", "type": "practice" },
203
247
  { "canonical": "Code Review", "aliases": ["Code Reviews"], "type": "practice" },
204
248
  { "canonical": "Stakeholder Management", "type": "practice" },
205
- { "canonical": "Cross-functional Collaboration", "aliases": ["cross-functional"], "type": "practice" }
249
+ {
250
+ "canonical": "Cross-functional Collaboration",
251
+ "aliases": ["cross-functional"],
252
+ "type": "practice"
253
+ }
206
254
  ]
207
255
  }