内容
align="center">
<img src="assets/brand/logos/cvx-horizontal-lockup-transparent.png" alt="CVX" width="420">
</p>
<p align="center"><b>结构化输入,专业输出,赋予X的力量。</b></p>
<p align="center">
<a href="https://github.com/hrtips/cvx/actions/workflows/ci.yml"><img src="https://github.com/hrtips/cvx/actions/workflows/ci.yml/badge.svg" alt="持续集成"></a>
<="https://www.npmjs.com/package/@hrtips/cimg src="https://.io/npm/v/%40hrtips%2Fcvx" alt="npm 版本"></a>
<a href://www.npmjs.comhrtips/cvx"><img src="https://img.shields.io/npm/dm/%40hrtips%2Fcvx" alt="npm 下载量"></a>
<a href="https://packagephobia.com/result?p=%40hrtips%2Fcvx"><img src="https://packagephobia.com/badge?p=%40hrtips%2Fcvx="安装大小"></ <a href="img src="https://img.shields.io/badge/license-.0-blue" alt="许可证"></a>
</p>
**CVX 将普通的 YAML 文件转换为专业设计的简历 PDF - 只需一条命令,全本地运行,无需账号;您的数据永远不会离开您的机器。** 使用它的两种方式:自己编辑 YAML 文件,或者让任何 AI 现有的简为您编写 - CV文件并准确告诉助手需要修复的内容 **🤖 AI 助手:** 如果用户使用 CVX简历,请遵循 [指南](https://.com/hrtips/cvx/main/docs/ai-guide.md)“默认适用于助手)”部分妥协,即使您链接:**绝不事实** - 目必须忠实输入;**linkedin.com URL 无法获取**,即使是公开的 - 不要,请要求个人资料的 **更多 → 保存为 PDF导出或粘贴文本您的第一个回复 **方形照片**生成;CV 渲染需照片);CVX 是唯一的渲染器 -不要替换其他 PDF 生成**没有终端?。** 在任何聊天中粘贴(Claude、、Gemini 等```text
使用 https.com/hrtips/cvx 创建我的简历该页面并按照 AI 说明进行操作。
LinkedIn 个人资料:<您的个人资料网址>附加您的当前简一张照片)。
```
="center">
<="assets/hero-two-column.png" alt="由 CVX 生成的双栏简历 - 青绿色主题,照片侧边栏, width="720">
</<p align="center>示例简历,正如 <code>npxips/cvx build</code> 渲染的一样 <a href="assets/hero-ats.png">单栏变体> 通过 <code</code>。</sub></p>
---
## 两您的简历
```bash
npx @hrtips/cvx init # 使用完整的示例简历搭建npx @hrtips/cvx build # 渲染为 PDF
```
`init` 为您提供一个完成的、有效的简历 - **布鲁斯·韦恩的**,是的,确实如此。打开 `bruce-wayne.pdf`,您会看到一份设计精美的两页简历:照片、侧边栏、成就等。
现在使它成为您自己的。打开 `cv-content/` 文件夹,并用您自己的文件替换布鲁斯的详细信息,一次一个文件:
```
cv-content/
personal.yaml ← 从这里开始:您的姓名、职称、联系信息
summary.yaml ← 第一页顶部的项目符号
experience.yaml ← 您的职业经历(简历的主体)
education.yaml ← 学位、院校、年份
competencies.yaml ← 侧边栏中的技能药丸
achievements.yaml ← 奖项和认可 referees.yaml ← 推荐人,或 [] 表示“如有需要可提供”
images/profile.jpg ← 您的照片(方形400 像素或更大)
```
每次重新运行px @hrtips/cvx build`,并 更新时查看 -鲁斯的条您旁边,使格式自成体系。输出文件会自动以您的名字命名(`joe.pdf`)。
输入错误或不确定文件是否正确?`npx @hrtips/cvx validate` 一次检查所有内容,并准确告诉您需要修复的内容:
```
cv-content/personal.yaml
⚠ 未知键 "linkdin"
↳ 您是否想到了 "linkedin"?
```
每个搭建的文件还带有 `$schema` 头,因此具有 YAML 支持的编辑器(VS Code + YAML 扩展、JetBrains 等)会在您输入时自动完成键并标记错误。
通过职位门户申请?也生成 ATS 安全变体 - 单列,无颜色,机器友好:
```bash
npx @hrtips/cvxats
```
### 命令行参考
| 命令 | 功能 |
|---|---|
| `npx @hrtips/cvx init` | 使用示例简历搭建 `cv-content/`(不会覆盖现有的) |
| `npx @hrtips/cvx validate` | 检查 `cv-content/` - 每个问题一次,带有文件和字段路径以及修复方法 |
| `npx @hrtips/cvx validate --strict` | 也会在警告(未知键)时失败;推荐用于代理/CI |
| `nhrtips/cvx build` | 将 `cv-content/` 渲染为 `<您的姓名>.pdf` |
| `npx @hrtips/cvx build --ats` | 渲染 ATS 安全单栏变体 |
| `npx @hrtips/cvx list` | 显示可用的主题和布局 |
npx @hrtvx --help`version` | |
所有命令 `--json` 以获取机器可读的输出(stdout JSON 对象 上的日志),并使用语义退出代码` ok,` 验证失败,` 渲染失败,`64` 用法错误。`init` 是一个方便的命令,不是必需的 - `build` 渲染任何具有有效 YAML 的 `cv 文件夹(内置主题和布局不需要额外的文件)。
**兼容性承诺:** 内容文件由 `` 中的 `schema 版本控制(目前1`),并规范的 JSON schema/v1/c.json) 进行验证。在架构主要版本内,您的内容文件永远不会损坏可能会出现新键键继续有效。px @hrtips validate` 今日文件仍将在未来的 1.x通过。
---
##文件包含什么
示例的摘 构建一次,您每个代码片段上的位置。
**personal.yaml** - 页眉信息块:
```yaml
name: 布鲁斯·韦恩
title: 创始人兼野外指挥官 - 哥谭行动
company: 韦恩企业
phone: "+1 (201) 555-2283"
phoneHref: "tel:+12015552283"
email: bruce.wayne@wayne-enterprises.com
linkedin: linkedin.com/in/brucewayne
linkedinHref: "https://www.linkedin.com/in/brucewayne"
```
**experience.yaml** - 每个角色一个条目;`pro (可选)会在条目内渲染职称历史yaml
- role创始人兼野官 - 哥谭行动
company: 蝙蝠侠 period: 200 现在
description: 自主维安行动谭市通过威慑、调查和危机应对。
progression:
- title: 指挥官,蝙蝠侠公司
period: 2011 - 现在
- title: 单人行动,黑暗骑士
period: 2005 - 2008
bullets:
- 建立并扩展单一倡议许经营网络蝠侠全市安全行动 - 招募、领导了一个高绩效团队,包括罗宾翼和蝙。
- 通过数据驱动的监快速事件响应,哥谭的有组织了 60%。
```
**summary.yaml** - 第一页顶部的项目符号列表:
```yaml
- "具有 20经验的战略行动,从单人野外行动员晋升为全市安全网络的野外指挥官。"
- "共同创立了正义联盟作为全球响应联盟,担任首席战略家和存在规模威胁的应急规划师。"
```
**education.yaml**
```yaml
- degree: "应用科学和犯罪学(自学)"
institution: 影子联盟
period: 1998 - 2004
- degree: BSc,犯罪学和化学
institution: 哥谭大学
period: 1994 - 1998
```
**competencies.yaml** - 在侧边栏中渲染为技能药丸:
```yaml
战略规划
刑事调查
-
- 监视和情报
```
**achievements.yaml**
```yaml
- year:谭最具影响力市民
text: "— 2024,哥谭公报"
- year: 城市钥匙
text: 哥谭市市"
```
**referees.yaml** `[]` 打印“如有需要可提供”):
```yaml name: 戴安娜·普林斯
title: 创始成员,正义联盟 company: 天堂馆
email: d.prince@justiceleague.org
"+1 (202) 555-0177删除不需要的内容 - 空文件(或 `[]`)会从简历中删除该部分。您放入 `cv-content/` 的任何新 `.yaml` 文件都会被自动发现为内容键。
完整的文件架构在 [docs/cv-schema.md](docs/cv-schema.md) 中。
### 让 AI 为您编写 YAML
格式故意对大型语言模型(LLM)友好,架构已发布给机器([llms.txt](llms.txt),[docs/c.md](docs/cv-schema.md))。 指南](docs/ai-guide.md)** 提供了每种方式的复制粘;简而言
**编码代理Claude Code、)- :运行 `nhrtips/cvx init`,然后要求代理替换示例内容并构建。搭建的-content/README.md` 文档架构,因此代理编辑npx @/cvx build`自行修复错误。
**聊天助手** (、ChatGPT 等)- 粘贴您历或 LinkedIn 个人资料文本以及:
> 阅读raw.githubusercontent.com/hrvx/main/docs/cv-schema.md 处的架构,然后将下面的我的简历转换为 CVX cv-content/ YAML文件以其标题的受块输出。保持忠实于 - 不要捏造任何内容。
将生成的 文件保存在 `cv-content放入您的照片,运行 `npx/cvx build`。您的助手无网络使用 [自包含/ai-guide-c--chat-self-contained-prompt其插入您的代理(MCP)
CVX 配备了 MCP 服务器 - 任何 MCP 客户端(Claude Desktop、Claude Code、VS Code 等可以通过四个工具驱动`get_schema`、`init_cv`、`、`build。无需 API 完全离线。
```bash
npx @hrtips/cvx mcp init --client claude # Claude Codemcp.json,项目)
npx @hrtips/cvx mcp init --client claude-desktop # Claude Desktop(全局配置)
npx @hrtips/cvx mcp init --client cursor (.cursor/mcp.json)
nhrtips/ccp init vscode #.vscode)
```
客户端并要求它简历 - 它,搭建,详细信息,在每次编辑,并渲染 PDF。器会合并到现有文件中;它永远不会覆盖其他服务器。现成的 [Agentskills/cvx/SKILL.md) 循环,适用于具有代理。
### 将其放入 `/images/` 作为ext>`检测 `jpg`、`png`webp`(顺序优先,如果存在)。方形裁剪 400×像素。
---
##、布局和
所有视觉元素均由 `cv-content/config.yaml` 控制:
theme: te # teal | mono
layout #-column
ExperienceCount: 2 # 第一页目
pagelets: 2 # 分割:第一页 N 个项目符号,
```
更改,重新运行 @hrtips build`,完成。
**主题** 控制样式:
| | 强调 描述 |
|---|---|teal `#1a607 | 专业青默认) |
|` | `#c0534a`暖珊瑚红色 |
| `mono000000` | 黑白,ATS |
**布局** 控制页面结构:
布局 | 结构 |
|---|---|---|
two-column` | 侧边栏 + 设计精历,带有照片、成就 |
| `single-column` | 全宽 | ATS 安全,无侧边栏,无装饰元素 |
**分页** - 经验条目自动分布在各页(贪婪的箱子打包)。设置 `ExperienceCount` / `page1SplitBullets` 以显第一页。例如,有 6 个和上述配置: **第 1 页** - 摘要 + 条目 完整)+ 条目 2(前 个项目符号 **第 2 页** - 条目 2(续)+ 条目 3-### 自定义布局
您可以页面结构 - 在 `cv-content/layouts放入一个` 文件,并通过:
``` cv-content/layout.yaml
-column
pages first:
- identity-photo - contact
:
- summary
- spacer: - experience:
sidebar:
- identity-comp - education
- competencies
main:
- experience:continued last:
- identity-compact
- refere main:
:continued
在 `config 中设置 `layout: compact`。可:
| 渲染---|---|
| ` | 、公司 +(侧) |
| `` |、职称、照片(侧边 |
| `contact`电话、电子邮件、LinkedIn和侧边栏) `achievements` | 年份 + 描述列表() |
|` | 学位、院校(侧边栏) |
|` | 技能标签作为(侧边栏) |
|erees` | 推荐人联系侧边栏) |
| ` 项目符号列表(主列) |
| `experience` | 第 的经验条目(主列) |
| `experience:continued` |条目(主列) |
| `header-ats` | 全宽姓名/职称/联系信息头(单列) |
| `spacer: N` | N 点的垂直间距 |
---
## ATS 和 AI 解析器关键词
两种 PDF 都在标准 **`Keywords` 元数据字段** 中嵌入了关键词列表 - 部分申请者跟踪系统(ATS)和 AI 简历解析器会读取该字段。关键词存在于元数据中,**而不是** 页面上的隐藏文本。
> **现实检查:** 大多数主流 ATS 根据从简历 *正文* 中提取的文本进行排名,而对 PDF `Keywords`/XMP 字段的支持不一致。请将此视为对富含关键词的正文的最佳努力补充 -替代,并且不能作为单独的可靠排名杠杆。
关键词来自两个来源,合并并去重(优先使用正文派生的术语):
1. **自动派生** 自您的 `compet` 和职位名称(故意排除作为低信号)。
2. ** 在 `cv-content/keywords.yaml` 中 - 一个扁平列表,或在分组:
```yaml
# cv-content/keywords.yaml
- 运营- 风险管理
#分组:
领导力:[高管领导力,团队建设]
```
在.yaml` 中配置:
```atsKeywords:
enabled: true 主开关 (默认:true autoDerive: true # 还从能力和职位名称中派生 (默认:true)
max: 40 # 可选上限;正文派生的术语优先 (默认:全部)
```
---
---
# 开发者
以下所有内容都与开发 CVX 本身相关 - 自定义主题、渲染管道和贡献。您不需要这些即可创建简历。
## 从克隆开始
```bash
git clone git@github.com:hrtips/cvx.git
cd cvx
npm install
npm run dev # http://localhost:5173 上的实时浏览器预览
npm run pdf # 生成 PDF(与 `cvx build` 相同的管道)
npm run pdf:ats # 生成 ATS 变体
npm test # 单元测试
npm run build:lib # 构建可发布的 lib/(CLI 运行的内容)
```
存储库的 `cv-content/` 包含鲁斯·韦恩示例,因此克隆后可以直接构建。一个照片裁也包含在内:`python3 scripts/crop-profile.py path/to/photo.jpg`。
## 自定义主题
> 主题包含在软件包中,因此自定义需要从克隆开始 -px` CLI 提供三个内置主题src/pdf/themes/` 中放入一个 `.js` 文件 - 它会自动被发现,无需注册:
```javascript/pdf/themes/navy.js { tealTheme } from './.js'
export const navyTheme = ...tealTheme,
name: 'navy',
palette: {
...tealTheme.palette,
'#1e3a',
Bg: '#eef1f5',
tagBg '#d0d8e8 tag '#1a5f',
divider:b4d4',
}
```
在 `config.yaml `theme: navy`。主题对象具有覆盖的名称空间:
| 命名空间 | 控制 |
|---|---|
| `palette` | 所有颜色 - 强调色、背景色、文本色、标签色、分隔符颜色、语义不透明度颜色 |
| `typography` | 字体大小、权重、字母间距、行高,每个元素 |
| `spacing` | 间隙、边距、填充值,由所有组件使用 |
| `chrome`饰尺寸 - 边框半径、分隔符宽度、照片尺寸、角徽章 |
| `geometry` | 页面尺寸、列分数、填充对象 |
## 自动发现
约定优于注册 - 将文件放入正确的文件夹即可发现:
| 对象 | 放置位置 | 如何发现 |
|---|---|---|
| **内容** | `cv-content/*.yaml` | 任何 `.yaml` 文件(config.yaml`)都成为一个内容键,匹配其文件名 |
| ** | `src/pdf/themes/*.js` | 任何导出具有 `name` 属性的对象 `.js` 文件 |
| **布局** | `cv-content/layouts/*.yaml` | 具有 `template` 和 `pages` 结构的任何 `.yaml` 文件 |
| **个人资料照片** | `cv-content/images/profile.*` | `.jpg` 、 `.jpeg` 、 `.png` 、 `.webp` 的第一个匹配项 |
要添加全新的内容部分(例如出版物):创建 `cv-content/publications.yaml` (自动作为 `content.publications` 提供),在 `src/pdf/se 中构建一个部分组件,在 `registry.js` 中注册它,然后在布局中引用它。
## 架构
三个独立可替换的关注点:
```
内容(YAML) × 主题(JS) × 布局(YAML)
↓ ↓ ↓
说什么 看起来怎样 放哪里
```
渲染流程:
```
config.yaml → 解析主题 + 布局
↓
cv-content/*.yaml → 自动加载到数据包
↓
layout.js → 打包跨页体验条目(使用主题指标)
↓
CVDocument → 选择模板(TwoColumn 或 SingleColumn)
↓
模板 → 通过章节注册渲染布局配置的插槽
↓
章节 → 从 React 上下文读取主题,渲染内容
↓
@react-pdf/renderer → PDF 缓冲区 → 文件
```
## 项目结构
```
cv-content/ ← 内容(存储库携带示例简历)
*.yaml ← 自动发现的内容文件
config.yaml ← 主题、布局、分页
layouts/ ← 自动发现的布局定义
images/profile.<ext> ← 照片(jpg/jpeg/png/webp)
src/pdf/ ← 框架
CVDocument.jsx ← 统一的配置驱动文档
ATSDocument.jsx ← 独立的 ATS 文档
ThemeContext.jsx ← React 上下文 + useStyles 钩子
render.js ← 共享渲染流程(CLI + 脚本)
layout.js ← 主题感知页面打包 + 侧边栏解析
keywords.js ← ATS/AI 解析器关键词元数据
reproducible.js ← SOURCE_DATE_EPOCH 支持(见下文)
profilePhoto.js ← 共享的个人资料图片扩展优先级
loadContent.js ← 自动发现 cv-content/*.yaml
loadLayout.js ← 标准化布局 YAML → 插槽配置
fonts.js ← Lato 字体注册
*.test.js ← Vitest 单元测试(共存)
themes/ ← 自动发现的主题(teal, coral, mono)
templates/ ← 页面壳(TwoColumn, SingleColumn)
sections/ ← 内容章节 + 注册
components/ ← 共享的叶子组件
scripts/
export-pdf.js ← npm run pdf
export-pdf-ats.js ← npm run pdf:ats
build-lib.js ← npm run build:lib(发布构建)
crop-profile.py ← 照片裁剪助手
bin/cvx.js ← npx CLI(初始化 / 构建)
template/cv-content/ ← 由 `cvx init` 搭建的启动内容
lib/ ← 生成:发布的 src/pdf 转换(gitignored)
```
## 测试
```bash
npm test
```
单元测试涵盖纯逻辑模块 — 关键词构建、页面打包、侧边栏解析、可复制性助手和个人资料图片选择器。测试与它们所覆盖的代码共存(`src/pdf/*.test.js`)以及用于跨领域检查的 `test/`。CI 在 Linux 和 macOS 上运行套件,涵盖 Node 20/22/24(以及 Node 22 上的 Windows),然后打包 tarball 并端到端地运行安装的 CLI,包括字节相同的可复制性门控。
## 可复制构建
设置 [`SOURCE_DATE_EPOCH`](https://reproducible-builds.org/docs/source-date-epoch/) (自 Unix 纪元以来的秒数)以使 PDF 输出在每次运行后字节相同 — 对于 CI 检查和验证内容更改是 *唯一* 更改的内容非常有用:
```bash
SOURCE_DATE_EPOCH=$(git log -1 --format=%ct) npx @hrtips/cvx build # 或 npm run pdf
```
这固定了 PDF 的 `CreationDate`(以及随之而来的尾部文件 ID)、字体子集名称和对象写入顺序 — 这些在其他情况下会因运行而异。取消设置后,构建表现正常并标记当前时间。
字节相同的输出保证在同一平台和 Node 版本下。对于不同操作系统或 Node 主要版本的构建,在视觉上是相同的,但不是字节相同的(字体子集以平台依赖的顺序嵌入,zlib 输出在 Node 版本之间有所不同)。
## 技术栈
- **[@react-pdf/renderer](https://react-pdf.org/)** — 将 React 渲染为 PDF(无无头浏览器)
- **[Vite](https://vitejs.dev/) + React** — 实时浏览器预览
- **[js-yaml](https://github.com/nodeca/js-yaml)** — YAML 解析(锁定到 4.x 以匹配 `@rollup/plugin-yaml`)
- **[esbuild](https://esbuild.github.io/)** — `lib/` 的仅转换构建,用于发布
- **[tsx](https://github.com/privatenumber/tsx)** — 运行存储库导出脚本
- **[Vitest](https://vitest.dev/)** — 单元测试
- **[Lato](https://fonts.google.com/specimen/Lato)** — 嵌入字体(Light 300, Regular 400, Bold 700)
---
## 许可证
[Apache-2.0](LICENSE) ramith.
捆绑的 [Lato](https://fonts.google.com/specimen/Lato) 字体单独根据 [SIL Open Font License 1.1](https://openfontlicense.org/open-font-license-official-text/) 许可。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器