@phuthuycoding/markcv 0.1.1 → 0.1.3
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 +25 -1
- package/README.md +25 -8
- package/dist/cli.js +2 -1
- package/dist/mcp/server.js +2 -1
- package/dist/version.d.ts +1 -0
- package/dist/version.js +21 -0
- package/package.json +19 -6
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.1.3] - 2026-09-06
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Package description and keywords rewritten around what people actually search
|
|
15
|
+
for. `resume-linter` had no package competing for it at all, while `markdown
|
|
16
|
+
resume` is crowded — so the wording leads with the linting and page-fit work
|
|
17
|
+
rather than with rendering, which is the part everyone already does.
|
|
18
|
+
- README opens by stating what the tool does differently, and adds a section
|
|
19
|
+
comparing it with the existing Markdown resume renderers, including when to use
|
|
20
|
+
one of those instead.
|
|
21
|
+
- Image alt text now describes the resumes shown rather than repeating the tool name.
|
|
22
|
+
|
|
23
|
+
## [0.1.2] - 2026-09-06
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- `markcv --version` reported the version that was hardcoded in the source rather
|
|
28
|
+
than the one actually installed: 0.1.1 shipped while `--version` still said
|
|
29
|
+
0.1.0. Both the CLI and the MCP server now read it from `package.json`, and a
|
|
30
|
+
test fails if the two ever disagree.
|
|
31
|
+
|
|
10
32
|
## [0.1.1] - 2026-09-06
|
|
11
33
|
|
|
12
34
|
### Added
|
|
@@ -51,6 +73,8 @@ First release.
|
|
|
51
73
|
- Two ATS-safe themes: `classic` and `compact`.
|
|
52
74
|
- Example CVs in `examples/`, with and without a portrait photo.
|
|
53
75
|
|
|
54
|
-
[Unreleased]: https://github.com/phuthuycoding/markcv/compare/v0.1.
|
|
76
|
+
[Unreleased]: https://github.com/phuthuycoding/markcv/compare/v0.1.3...HEAD
|
|
77
|
+
[0.1.3]: https://github.com/phuthuycoding/markcv/compare/v0.1.2...v0.1.3
|
|
78
|
+
[0.1.2]: https://github.com/phuthuycoding/markcv/compare/v0.1.1...v0.1.2
|
|
55
79
|
[0.1.1]: https://github.com/phuthuycoding/markcv/compare/v0.1.0...v0.1.1
|
|
56
80
|
[0.1.0]: https://github.com/phuthuycoding/markcv/releases/tag/v0.1.0
|
package/README.md
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/@phuthuycoding/markcv)
|
|
5
5
|
|
|
6
6
|
<p align="center">
|
|
7
|
-
<img src="docs/screenshots/engineering-lead.png" width="640" alt="
|
|
7
|
+
<img src="docs/screenshots/engineering-lead.png" width="640" alt="Two-page ATS-safe resume PDF generated from Markdown by markcv">
|
|
8
8
|
<br>
|
|
9
9
|
<sub><code>examples/engineering-lead.md</code> — plain Markdown in, two-page A4 PDF out</sub>
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
**Markdown resume builder** that does two things other markdown-to-PDF tools do not:
|
|
13
|
+
it tells you *why* your CV will not fit on two pages, and it lints the writing itself.
|
|
14
|
+
Runs as a CLI and as an **MCP server**, so an AI agent can do both on its own.
|
|
15
15
|
|
|
16
16
|
- **`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
17
|
- **`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 +82,9 @@ how the same format stretches. Each one builds with the default theme and no pho
|
|
|
82
82
|
|
|
83
83
|
<table>
|
|
84
84
|
<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
|
|
85
|
+
<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>
|
|
86
|
+
<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>
|
|
87
|
+
<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
88
|
</tr>
|
|
89
89
|
<tr>
|
|
90
90
|
<td align="center"><a href="examples/backend-engineer.md">backend-engineer.md</a><br><sub>1 page</sub></td>
|
|
@@ -101,7 +101,7 @@ Vietnam, Japan or Germany's more traditional employers usually does. Drop a
|
|
|
101
101
|
|
|
102
102
|
<p align="center">
|
|
103
103
|
<a href="docs/screenshots/fullstack-engineer-photo.png">
|
|
104
|
-
<img src="docs/screenshots/fullstack-engineer-photo.png" width="440" alt="
|
|
104
|
+
<img src="docs/screenshots/fullstack-engineer-photo.png" width="440" alt="Markdown resume with a portrait photo in the header">
|
|
105
105
|
</a>
|
|
106
106
|
<br>
|
|
107
107
|
<sub><a href="examples/with-photo/fullstack-engineer.md">examples/with-photo/fullstack-engineer.md</a> — one page, photo auto-detected</sub>
|
|
@@ -228,6 +228,23 @@ Plain Markdown. The only convention lives in the header:
|
|
|
228
228
|
|
|
229
229
|
`classic` (default) and `compact`. Both are single-column, emoji-free, with a real text layer — safe for ATS parsers.
|
|
230
230
|
|
|
231
|
+
## How this differs from other Markdown resume tools
|
|
232
|
+
|
|
233
|
+
Rendering Markdown into a good-looking CV is well covered — [`@resumx/resumx`](https://www.npmjs.com/package/@resumx/resumx),
|
|
234
|
+
[`markdown-resume`](https://www.npmjs.com/package/markdown-resume) and others do it well, and if that is all
|
|
235
|
+
you need, use one of them.
|
|
236
|
+
|
|
237
|
+
markcv exists for the part that comes after the rendering works:
|
|
238
|
+
|
|
239
|
+
| | Typical Markdown→PDF tool | markcv |
|
|
240
|
+
|---|---|---|
|
|
241
|
+
| Render to PDF | yes | yes |
|
|
242
|
+
| Themes | yes | two, ATS-safe |
|
|
243
|
+
| **Why it does not fit N pages** | — | names the block, the wasted pixels, and whether length or a page break is at fault |
|
|
244
|
+
| **Content audit** | — | overselling, underselling, tense, unbacked skills, duplicates |
|
|
245
|
+
| **Job-description match** | — | missing requirements, SKILLS-only claims, unrelated bullets |
|
|
246
|
+
| **Usable by an AI agent** | — | MCP server, structured JSON |
|
|
247
|
+
|
|
231
248
|
## License
|
|
232
249
|
|
|
233
250
|
MIT
|
package/dist/cli.js
CHANGED
|
@@ -8,8 +8,9 @@ import { lint } from "./core/lint.js";
|
|
|
8
8
|
import { tailor } from "./core/tailor.js";
|
|
9
9
|
import { newVariant, listVariants, diffVariants } from "./core/variants.js";
|
|
10
10
|
import { c, ok, bad, warn, info } from "./ui.js";
|
|
11
|
+
import { VERSION } from "./version.js";
|
|
11
12
|
const program = new Command();
|
|
12
|
-
program.name("markcv").description("Build, fit and audit a CV written in Markdown").version(
|
|
13
|
+
program.name("markcv").description("Build, fit and audit a CV written in Markdown").version(VERSION);
|
|
13
14
|
const pdfNameFor = (md) => md.replace(/\.md$/, ".pdf");
|
|
14
15
|
function printFit(r) {
|
|
15
16
|
const head = r.fits ? ok(`${r.pages} page(s)`) : bad(`${r.pages} pages (target ${r.targetPages})`);
|
package/dist/mcp/server.js
CHANGED
|
@@ -10,7 +10,8 @@ import { analyseFit } from "../core/fit.js";
|
|
|
10
10
|
import { lint } from "../core/lint.js";
|
|
11
11
|
import { tailor } from "../core/tailor.js";
|
|
12
12
|
import { newVariant, listVariants, diffVariants } from "../core/variants.js";
|
|
13
|
-
|
|
13
|
+
import { VERSION } from "../version.js";
|
|
14
|
+
const server = new McpServer({ name: "markcv", version: VERSION });
|
|
14
15
|
/** Every tool returns JSON so an agent can loop on the result, rather than prose for a human. */
|
|
15
16
|
const json = (data) => ({
|
|
16
17
|
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const VERSION: string;
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
/**
|
|
5
|
+
* Read the version from package.json instead of hardcoding it.
|
|
6
|
+
* A hardcoded copy silently goes stale the moment a release is cut, and then
|
|
7
|
+
* `--version` reports one thing while the installed code is another.
|
|
8
|
+
*/
|
|
9
|
+
function readVersion() {
|
|
10
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
for (const rel of ["../package.json", "../../package.json"]) {
|
|
12
|
+
try {
|
|
13
|
+
return JSON.parse(readFileSync(join(here, rel), "utf8")).version;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// try the next candidate: dist/ is one level deeper than src/
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return "0.0.0";
|
|
20
|
+
}
|
|
21
|
+
export const VERSION = readVersion();
|
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.3",
|
|
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": {
|