@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 +26 -1
- package/README.md +31 -8
- package/dist/core/markdown.d.ts +1 -1
- package/dist/core/markdown.js +11 -2
- package/package.json +19 -6
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.
|
|
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
|
[](https://github.com/phuthuycoding/markcv/actions/workflows/ci.yml)
|
|
4
4
|
[](https://www.npmjs.com/package/@phuthuycoding/markcv)
|
|
5
|
+
[](https://phuthuycoding.github.io/markcv/)
|
|
5
6
|
|
|
6
7
|
<p align="center">
|
|
7
|
-
<img src="docs/screenshots/engineering-lead.png" width="640" alt="
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
86
|
-
<td width="33%"><a href="docs/screenshots/engineering-lead.png"><img src="docs/screenshots/engineering-lead.png" alt="Engineering lead
|
|
87
|
-
<td width="33%"><a href="docs/screenshots/data-scientist.png"><img src="docs/screenshots/data-scientist.png" alt="Data scientist
|
|
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="
|
|
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
|
package/dist/core/markdown.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CvDoc } from "../types.js";
|
|
2
|
-
export declare function parseCv(
|
|
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
|
package/dist/core/markdown.js
CHANGED
|
@@ -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(
|
|
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.
|
|
4
|
-
"description": "
|
|
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
|
-
"
|
|
42
|
+
"resume-template",
|
|
43
|
+
"resume-linter",
|
|
44
|
+
"resume-checker",
|
|
39
45
|
"ats",
|
|
40
|
-
"
|
|
41
|
-
"
|
|
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": {
|