@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 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.1...HEAD
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
  [![npm](https://img.shields.io/npm/v/@phuthuycoding/markcv.svg)](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="A CV rendered by markcv">
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
- 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:
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 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>
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="CV with a portrait photo">
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("0.1.0");
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})`);
@@ -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
- const server = new McpServer({ name: "markcv", version: "0.1.0" });
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;
@@ -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.1",
4
- "description": "Fit, lint and build a CV from Markdown - CLI + MCP server for AI agents",
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
- "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": {