@phuthuycoding/markcv 0.1.2 → 0.1.4

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/CHANGELOG.md CHANGED
@@ -7,6 +7,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.4] - 2026-09-06
11
+
12
+ ### Fixed
13
+
14
+ - HTML comments were printed into the PDF instead of being dropped. With
15
+ markdown-it's `html: false`, comments are escaped into visible text rather than
16
+ ignored, so a file carrying `<!-- markcv:no-build -->` rendered that marker at
17
+ the top of the page. Comments are metadata for tooling, never content, and are
18
+ now stripped before rendering.
19
+
20
+ ## [0.1.3] - 2026-09-06
21
+
22
+ ### Changed
23
+
24
+ - Package description and keywords rewritten around what people actually search
25
+ for. `resume-linter` had no package competing for it at all, while `markdown
26
+ resume` is crowded — so the wording leads with the linting and page-fit work
27
+ rather than with rendering, which is the part everyone already does.
28
+ - README opens by stating what the tool does differently, and adds a section
29
+ comparing it with the existing Markdown resume renderers, including when to use
30
+ one of those instead.
31
+ - Image alt text now describes the resumes shown rather than repeating the tool name.
32
+
10
33
  ## [0.1.2] - 2026-09-06
11
34
 
12
35
  ### Fixed
@@ -60,7 +83,9 @@ First release.
60
83
  - Two ATS-safe themes: `classic` and `compact`.
61
84
  - Example CVs in `examples/`, with and without a portrait photo.
62
85
 
63
- [Unreleased]: https://github.com/phuthuycoding/markcv/compare/v0.1.2...HEAD
86
+ [Unreleased]: https://github.com/phuthuycoding/markcv/compare/v0.1.4...HEAD
87
+ [0.1.4]: https://github.com/phuthuycoding/markcv/compare/v0.1.3...v0.1.4
88
+ [0.1.3]: https://github.com/phuthuycoding/markcv/compare/v0.1.2...v0.1.3
64
89
  [0.1.2]: https://github.com/phuthuycoding/markcv/compare/v0.1.1...v0.1.2
65
90
  [0.1.1]: https://github.com/phuthuycoding/markcv/compare/v0.1.0...v0.1.1
66
91
  [0.1.0]: https://github.com/phuthuycoding/markcv/releases/tag/v0.1.0
package/README.md CHANGED
@@ -2,16 +2,17 @@
2
2
 
3
3
  [![CI](https://github.com/phuthuycoding/markcv/actions/workflows/ci.yml/badge.svg)](https://github.com/phuthuycoding/markcv/actions/workflows/ci.yml)
4
4
  [![npm](https://img.shields.io/npm/v/@phuthuycoding/markcv.svg)](https://www.npmjs.com/package/@phuthuycoding/markcv)
5
+ [![docs](https://img.shields.io/badge/docs-markcv-c96442)](https://phuthuycoding.github.io/markcv/)
5
6
 
6
7
  <p align="center">
7
- <img src="docs/screenshots/engineering-lead.png" width="640" alt="A CV rendered by markcv">
8
+ <img src="docs/screenshots/engineering-lead.png" width="640" alt="Two-page ATS-safe resume PDF generated from Markdown by markcv">
8
9
  <br>
9
10
  <sub><code>examples/engineering-lead.md</code> — plain Markdown in, two-page A4 PDF out</sub>
10
11
  </p>
11
12
 
12
- Build a CV from Markdown a CLI **and** an MCP server for AI agents.
13
-
14
- Two things set it apart from ordinary markdown→PDF tools:
13
+ **Markdown resume builder** that does two things other markdown-to-PDF tools do not:
14
+ it tells you *why* your CV will not fit on two pages, and it lints the writing itself.
15
+ Runs as a CLI and as an **MCP server**, so an AI agent can do both on its own.
15
16
 
16
17
  - **`fit`** tells you *why* your CV does not fit on 2 pages. "Content too long" and "bad page break" are different illnesses with opposite cures — trimming words while the real culprit is a heading sitting 31px from the bottom of page 1 just wastes your time.
17
18
  - **`lint`** checks *content*, not formatting. It catches overselling **and underselling** — claiming less than you did is a mistake too, and it costs you something while gaining nothing.
@@ -82,9 +83,9 @@ how the same format stretches. Each one builds with the default theme and no pho
82
83
 
83
84
  <table>
84
85
  <tr>
85
- <td width="33%"><a href="docs/screenshots/backend-engineer.png"><img src="docs/screenshots/backend-engineer.png" alt="Backend engineer CV"></a></td>
86
- <td width="33%"><a href="docs/screenshots/engineering-lead.png"><img src="docs/screenshots/engineering-lead.png" alt="Engineering lead CV"></a></td>
87
- <td width="33%"><a href="docs/screenshots/data-scientist.png"><img src="docs/screenshots/data-scientist.png" alt="Data scientist CV"></a></td>
86
+ <td width="33%"><a href="docs/screenshots/backend-engineer.png"><img src="docs/screenshots/backend-engineer.png" alt="Backend engineer resume built from Markdown"></a></td>
87
+ <td width="33%"><a href="docs/screenshots/engineering-lead.png"><img src="docs/screenshots/engineering-lead.png" alt="Engineering lead resume, two pages, ATS-safe"></a></td>
88
+ <td width="33%"><a href="docs/screenshots/data-scientist.png"><img src="docs/screenshots/data-scientist.png" alt="Data scientist resume, one page"></a></td>
88
89
  </tr>
89
90
  <tr>
90
91
  <td align="center"><a href="examples/backend-engineer.md">backend-engineer.md</a><br><sub>1 page</sub></td>
@@ -101,7 +102,7 @@ Vietnam, Japan or Germany's more traditional employers usually does. Drop a
101
102
 
102
103
  <p align="center">
103
104
  <a href="docs/screenshots/fullstack-engineer-photo.png">
104
- <img src="docs/screenshots/fullstack-engineer-photo.png" width="440" alt="CV with a portrait photo">
105
+ <img src="docs/screenshots/fullstack-engineer-photo.png" width="440" alt="Markdown resume with a portrait photo in the header">
105
106
  </a>
106
107
  <br>
107
108
  <sub><a href="examples/with-photo/fullstack-engineer.md">examples/with-photo/fullstack-engineer.md</a> — one page, photo auto-detected</sub>
@@ -228,6 +229,28 @@ Plain Markdown. The only convention lives in the header:
228
229
 
229
230
  `classic` (default) and `compact`. Both are single-column, emoji-free, with a real text layer — safe for ATS parsers.
230
231
 
232
+ ## How this differs from other Markdown resume tools
233
+
234
+ Rendering Markdown into a good-looking CV is well covered — [`@resumx/resumx`](https://www.npmjs.com/package/@resumx/resumx),
235
+ [`markdown-resume`](https://www.npmjs.com/package/markdown-resume) and others do it well, and if that is all
236
+ you need, use one of them.
237
+
238
+ markcv exists for the part that comes after the rendering works:
239
+
240
+ | | Typical Markdown→PDF tool | markcv |
241
+ |---|---|---|
242
+ | Render to PDF | yes | yes |
243
+ | Themes | yes | two, ATS-safe |
244
+ | **Why it does not fit N pages** | — | names the block, the wasted pixels, and whether length or a page break is at fault |
245
+ | **Content audit** | — | overselling, underselling, tense, unbacked skills, duplicates |
246
+ | **Job-description match** | — | missing requirements, SKILLS-only claims, unrelated bullets |
247
+ | **Usable by an AI agent** | — | MCP server, structured JSON |
248
+
249
+ ## Author
250
+
251
+ Built by [Ta Manh Quyen](https://quyentm.dev) — a staff engineer who got tired of guessing
252
+ why a CV spilled onto a third page. More writing at [quyentm.dev](https://quyentm.dev).
253
+
231
254
  ## License
232
255
 
233
256
  MIT
@@ -1,5 +1,5 @@
1
1
  import type { CvDoc } from "../types.js";
2
- export declare function parseCv(raw: string): CvDoc;
2
+ export declare function parseCv(input: string): CvDoc;
3
3
  /**
4
4
  * Markdown -> page body HTML.
5
5
  * The header (name + contact lines) is wrapped in .header so the portrait can be
@@ -1,10 +1,19 @@
1
1
  import MarkdownIt from "markdown-it";
2
2
  const md = new MarkdownIt({ html: false, linkify: false, typographer: false });
3
+ /**
4
+ * HTML comments carry metadata for tools (markcv:no-build and friends), never
5
+ * content. With `html: false` markdown-it escapes them into visible text rather
6
+ * than dropping them, so strip them before rendering.
7
+ */
8
+ function stripComments(raw) {
9
+ return raw.replace(/<!--[\s\S]*?-->/g, "");
10
+ }
3
11
  /** A header contact line: `**Label:** value` (no `|`, unlike a job-title line). */
4
12
  const CONTACT_RE = /^<p><strong>[^<]+:<\/strong>[^|]*<\/p>$/;
5
13
  /** A job-title line: `**Job Title** | 2020 - 2021`. */
6
14
  const META_RE = /^<p><strong>.*\|.*<\/p>$/;
7
- export function parseCv(raw) {
15
+ export function parseCv(input) {
16
+ const raw = stripComments(input);
8
17
  const lines = raw.split("\n");
9
18
  const sections = [];
10
19
  lines.forEach((line, i) => {
@@ -23,7 +32,7 @@ export function parseCv(raw) {
23
32
  * be laid out as one block.
24
33
  */
25
34
  export function renderBody(raw, photoHtml) {
26
- const html = md.render(raw);
35
+ const html = md.render(stripComments(raw));
27
36
  const blocks = html.split("\n").filter((l) => l.trim() !== "");
28
37
  const out = [];
29
38
  let headerOpen = false;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@phuthuycoding/markcv",
3
- "version": "0.1.2",
4
- "description": "Fit, lint and build a CV from Markdown - CLI + MCP server for AI agents",
3
+ "version": "0.1.4",
4
+ "description": "Markdown resume builder that lints your CV and explains why it will not fit two pages. ATS-safe PDF, job-description tailoring, CLI + MCP server for AI agents.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "markcv": "dist/cli.js",
@@ -31,14 +31,27 @@
31
31
  "changelog": "node scripts/changelog.mjs"
32
32
  },
33
33
  "keywords": [
34
- "cv",
35
34
  "resume",
35
+ "cv",
36
+ "resume-builder",
37
+ "cv-builder",
38
+ "markdown-resume",
36
39
  "markdown",
40
+ "markdown-to-pdf",
37
41
  "pdf",
38
- "mcp",
42
+ "resume-template",
43
+ "resume-linter",
44
+ "resume-checker",
39
45
  "ats",
40
- "lint",
41
- "page-fit"
46
+ "ats-friendly",
47
+ "ats-resume",
48
+ "mcp",
49
+ "mcp-server",
50
+ "model-context-protocol",
51
+ "claude",
52
+ "ai-agent",
53
+ "cli",
54
+ "job-search"
42
55
  ],
43
56
  "license": "MIT",
44
57
  "dependencies": {