knowme-careerforge-skill 0.0.2 → 0.0.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.
Files changed (37) hide show
  1. package/SKILL.md +11 -1
  2. package/agents/claude/knowme-careerforge.md +10 -9
  3. package/agents/codex/knowme-careerforge.yaml +3 -3
  4. package/agents/cursor/knowme-careerforge.mdc +12 -8
  5. package/agents/opencode/skill.yaml +1 -1
  6. package/agents/windsurf/knowme-careerforge.rules +9 -9
  7. package/dist/cli/src/commands/init.js +9 -0
  8. package/dist/cli/src/index.js +17 -0
  9. package/package.json +2 -1
  10. package/scripts/build/sync-version.py +11 -2
  11. package/scripts/template/instantiate-resume.py +8 -2
  12. package/scripts/template/search-template.py +290 -89
  13. package/skill.json +1 -1
  14. package/src/knowledge/index.json +2 -10
  15. package/src/knowledge/templates.json +1 -9
  16. package/src/references/01-evidence-mining.md +41 -0
  17. package/src/references/02-career-goal.md +38 -0
  18. package/src/references/03-jd-analysis.md +44 -0
  19. package/src/references/04-template-selection.md +43 -0
  20. package/src/references/05-html-canvas-tokens.md +51 -0
  21. package/src/references/06-qa-and-rendering.md +54 -0
  22. package/src/templates/classic/style.css +22 -51
  23. package/src/templates/common/base.css +150 -0
  24. package/src/templates/executive/style.css +30 -73
  25. package/src/templates/minimal/style.css +30 -72
  26. package/src/templates/modern/style.css +32 -72
  27. package/src/references/ats.md +0 -17
  28. package/src/references/evidence-first.md +0 -22
  29. package/src/references/pdf.md +0 -40
  30. package/src/references/resume-writing.md +0 -25
  31. package/src/references/template-design.md +0 -57
  32. package/src/workflows/analyze-job.md +0 -16
  33. package/src/workflows/define-goal.md +0 -16
  34. package/src/workflows/forge-resume.md +0 -25
  35. package/src/workflows/know-me.md +0 -21
  36. package/src/workflows/position.md +0 -19
  37. package/src/workflows/review.md +0 -31
@@ -1,55 +1,43 @@
1
+ /**
2
+ * KnowMe CareerForge — Modern Split Sidebar Template Style
3
+ * Style Tone: Modern Deep Navy (Two-Column Sidebar 32:68)
4
+ * Inherits: src/templates/common/base.css
5
+ */
6
+
1
7
  :root {
2
- /* 页面物理约束 */
3
- --resume-page-width: 210mm;
4
- --resume-page-min-height: 297mm;
5
-
6
- /* 配色体系 */
7
- --resume-color-sidebar-bg: #254665; /* 经典深海蓝 Navy */
8
- --resume-color-sidebar-text: #f8fafc; /* 侧边栏反白字 */
9
- --resume-color-sidebar-muted: #94a3b8; /* 侧边栏辅助文字 */
10
- --resume-color-sidebar-accent: #38bdf8;/* 侧边栏亮色高亮 */
8
+ /* === COMPONENT TOKENS (Overrides & Aliases) === */
9
+ --resume-color-sidebar-bg: var(--primitive-color-navy-800);
10
+ --resume-color-sidebar-text: var(--primitive-color-slate-50);
11
+ --resume-color-sidebar-muted: var(--primitive-color-slate-400);
12
+ --resume-color-sidebar-accent: var(--primitive-color-sky-400);
11
13
 
12
- --resume-color-main-bg: #ffffff;
13
- --resume-color-primary: #0f172a; /* Slate 900 */
14
- --resume-color-secondary: #334155; /* Slate 700 */
15
- --resume-color-muted: #64748b; /* Slate 500 */
16
- --resume-color-accent: #254665; /* 主舞台强调色 */
17
- --resume-color-border: #e2e8f0; /* Slate 200 */
18
-
19
- /* 字阶系统 */
20
- --resume-font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
21
- --resume-font-size-name: 22pt;
22
- --resume-font-size-target: 11pt;
23
- --resume-font-size-h2: 12pt;
24
- --resume-font-size-body: 9.2pt;
25
- --resume-font-size-meta: 8.5pt;
26
- --resume-line-height-body: 1.45;
27
-
28
- /* 间距 Tokens (Agent 自愈参数) */
29
- --resume-space-section: 12pt;
30
- --resume-space-item: 8pt;
31
- --resume-space-bullet: 2.5pt;
14
+ --resume-color-main-bg: var(--primitive-color-white);
15
+ --resume-color-primary: var(--primitive-color-slate-900);
16
+ --resume-color-secondary: var(--primitive-color-slate-700);
17
+ --resume-color-muted: var(--primitive-color-slate-500);
18
+ --resume-color-accent: var(--primitive-color-navy-800);
19
+ --resume-color-border: var(--primitive-color-slate-200);
20
+
21
+ /* Typography Bindings */
22
+ --resume-font-body: var(--primitive-font-sans);
23
+ --resume-font-size-name: var(--primitive-font-size-display);
24
+ --resume-font-size-target: var(--primitive-font-size-h3);
25
+ --resume-font-size-h2: var(--primitive-font-size-h2);
26
+ --resume-font-size-body: var(--primitive-font-size-body);
27
+ --resume-font-size-meta: var(--primitive-font-size-meta);
28
+ --resume-line-height-body: var(--primitive-line-height-normal);
29
+
30
+ /* Spacing Tokens (Calibratable for Self-Healing) */
31
+ --resume-space-section: var(--primitive-space-6);
32
+ --resume-space-item: var(--primitive-space-4);
33
+ --resume-space-bullet: var(--primitive-space-1);
32
34
  --resume-sidebar-width: 32%;
33
35
  }
34
36
 
35
- * { box-sizing: border-box; margin: 0; padding: 0; }
36
-
37
- body {
38
- background-color: #e2e8f0;
39
- font-family: var(--resume-font-body);
40
- display: flex;
41
- justify-content: center;
42
- padding: 24px 0;
43
- -webkit-font-smoothing: antialiased;
44
- }
45
-
46
37
  .resume-page {
47
- width: var(--resume-page-width);
48
- min-height: var(--resume-page-min-height);
49
38
  background: var(--resume-color-main-bg);
50
39
  display: grid;
51
40
  grid-template-columns: var(--resume-sidebar-width) 1fr;
52
- box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.15), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
53
41
  overflow: hidden;
54
42
  }
55
43
 
@@ -227,21 +215,14 @@ body {
227
215
  .tech-badge {
228
216
  font-size: 8pt;
229
217
  color: var(--resume-color-muted);
230
- background: #f1f5f9;
218
+ background: var(--primitive-color-slate-100);
231
219
  padding: 1.5pt 4pt;
232
220
  border-radius: 2pt;
233
221
  }
234
222
 
235
- .date-range {
236
- font-size: var(--resume-font-size-meta);
237
- color: var(--resume-color-muted);
238
- font-variant-numeric: tabular-nums;
239
- }
240
-
241
223
  .bullet-list {
242
224
  margin-left: 12pt;
243
225
  font-size: var(--resume-font-size-body);
244
- color: var(--resume-color-secondary);
245
226
  line-height: var(--resume-line-height-body);
246
227
  }
247
228
 
@@ -249,29 +230,8 @@ body {
249
230
  margin-bottom: var(--resume-space-bullet);
250
231
  }
251
232
 
252
- .bullet-list strong {
253
- color: var(--resume-color-primary);
254
- font-weight: 600;
255
- }
256
-
257
233
  .edu-desc {
258
234
  font-size: var(--resume-font-size-body);
259
235
  color: var(--resume-color-secondary);
260
236
  line-height: var(--resume-line-height-body);
261
237
  }
262
-
263
- @media print {
264
- body { background: transparent; padding: 0; }
265
- .resume-page {
266
- box-shadow: none;
267
- margin: 0;
268
- width: var(--resume-page-width);
269
- min-height: var(--resume-page-min-height);
270
- page-break-after: always;
271
- page-break-inside: avoid;
272
- }
273
- @page {
274
- size: A4 portrait;
275
- margin: 0;
276
- }
277
- }
@@ -1,17 +0,0 @@
1
- # Reference Manual: ATS Compatibility (ATS 解析合规手册)
2
-
3
- ---
4
-
5
- ## 1. ATS 友好性标准
6
-
7
- ATS(Applicant Tracking System,求职者追踪系统)在筛选简历时依赖确定性的文本流与标准的标头层次。
8
-
9
- ### 核心合规法则:
10
- 1. **纯文本可提取性**:所有关键文字(姓名、公司、职位、技能词)必须是标准 HTML 文本节点,严禁使用图片代替文字。
11
- 2. **标准标头词典**:模块标题必须使用行业标准词汇:
12
- - `工作经历` / `Work Experience`
13
- - `项目经历` / `Projects`
14
- - `专业技能` / `Skills`
15
- - `教育背景` / `Education`
16
- 3. **线性文档流**:在双栏或复杂布局中,必须保证 DOM 树的逻辑顺序清晰,避免文字抽取时产生词句乱序。
17
- 4. **标准联系方式格式**:电话使用标准连字符或空格(如 `138-0000-0000`),邮箱使用标准格式。
@@ -1,22 +0,0 @@
1
- # Reference Manual: Evidence-First Principle (证据为先与防幻觉准则)
2
-
3
- > **"The goal is not to make the candidate look better than they are. The goal is to make their real strengths visible to the right opportunity."**
4
-
5
- ---
6
-
7
- ## 1. 证据级别判定标准
8
-
9
- | 级别 | 判定标准 | 证据源形态 | 允许使用的表述范例 | 严禁使用的表述 |
10
- | :--- | :--- | :--- | :--- | :--- |
11
- | **Level 1 (直接强证据)** | 代码实现、配置文件、API 契约、文档、测试套件中有直接支撑 | `src/`, `package.json`, `Dockerfile`, CI/CD 脚本, Commit 记录 | "基于 FastAPI 与 Qdrant 研发 RAG 检索流水线,通过双路召回使 Top-3 召回率达 92%" | 夸大超出代码库的业务范围或虚构营收数字 |
12
- | **Level 2 (结构中证据)** | 目录架构、依赖库声明、模块拆分等可推导的技术关联 | 模块命名、依赖版本、数据库 Schema | "参与分布式微服务中台建设,负责商品与订单服务接口研发" | 将仅有依赖包集成的经历包装为从零主导底层自研 |
13
- | **Level 3 (合理弱推论)** | 根据行业通用实践与上下文合理推论得出的辅助动作 | 项目上线流程、团队协同机制 | "协同产品团队推进需求落地,参与敏捷迭代与 Code Review" | 宣称“统筹百人团队进行跨国架构重构” |
14
- | **Unsupported (无支撑)** | 候选人材料与代码库中完全未出现的技术或经历 | 无对应内容 | **严禁写入简历** | 凭空虚构未经证实的项目或大厂背景 |
15
-
16
- ---
17
-
18
- ## 2. 防幻觉门禁执行清单
19
-
20
- 1. **核实关键技术名词**:是否在候选人技能列表或代码中有据可查?
21
- 2. **核实职责边界**:候选人是“主导”、“核心研发”还是“参与协同”?
22
- 3. **核实指标真实性**:百分比提升、QPS 数值、用户规模必须来自真实材料,若无具体数值可聚焦架构与技术攻坚点,严禁捏造虚假数字。
@@ -1,40 +0,0 @@
1
- # Reference Manual: Deterministic PDF Rendering (Playwright 确定性渲染实践)
2
-
3
- ---
4
-
5
- ## 1. 为什么使用 Playwright 而非传统转换器?
6
-
7
- 传统 HTML 到 PDF 工具(如 wkhtmltopdf 或 puppeteer 简易打印)存在两大痛点:
8
- 1. **网络字体未就绪即打印**:导致字体 fallback 变形,字符间距和总高度发生突变;
9
- 2. **跨系统渲染差异**:Linux / macOS / Windows 默认 DPI 与字体抗锯齿不同。
10
-
11
- ---
12
-
13
- ## 2. Playwright 确定性渲染标准配置
14
-
15
- ```typescript
16
- import { chromium } from 'playwright';
17
-
18
- const browser = await chromium.launch({ headless: true });
19
- const context = await browser.newContext({
20
- viewport: { width: 794, height: 1123 }, // A4 at 96 DPI
21
- deviceScaleFactor: 2
22
- });
23
-
24
- const page = await context.newPage();
25
- await page.goto(fileUrl, { waitUntil: 'networkidle' });
26
-
27
- // 严格等待所有 Web 字体与静态资源加载完成
28
- await page.evaluateHandle('document.fonts.ready');
29
-
30
- // 导出标准 A4 矢量 PDF
31
- await page.pdf({
32
- path: outputPath,
33
- format: 'A4',
34
- printBackground: true,
35
- preferCSSPageSize: true,
36
- margin: { top: '0px', right: '0px', bottom: '0px', left: '0px' }
37
- });
38
-
39
- await browser.close();
40
- ```
@@ -1,25 +0,0 @@
1
- # Reference Manual: Resume Writing & FAB Formula (简历撰写与论据模型)
2
-
3
- ---
4
-
5
- ## 1. FAB 论据构造法
6
-
7
- 优质的简历 Bullet 应当同时满足**技术深度**与**业务成效**,标准句式结构如下:
8
-
9
- $$\text{Bullet} = [\text{强动词}] + [\text{Feature: 核心系统/项目}] + [\text{Advantage: 技术亮点/架构选型}] + [\text{Benefit: 量化业务/技术成效}]$$
10
-
11
- ### 范例对比:
12
-
13
- - ❌ **弱表达(平铺直叙,无亮点)**:
14
- > "负责公司 AI 客服系统的后端开发,使用 Python 和大模型编写接口,处理客户问题。"
15
- - ✅ **强表达(FAB 量化,证据充分)**:
16
- > "主导研发基于多 Agent 协同的企业级智能客服系统,采用 LangGraph 状态机与动态剪枝机制优化任务流转,将复杂多轮问答意图识别准确率提升至 94.2%,支撑日均 20 万+ 咨询请求并缩减 Token 成本 35%。"
17
-
18
- ---
19
-
20
- ## 2. 经历重塑的四大要素
21
-
22
- 1. **动词要强**:采用精准主动动词(主导、设计、架构、研发、解耦、优化、压榨)。
23
- 2. **技术要硬**:点出关键选型与技术方案(如异步流式响应、分库分表、双路召回、GC 调优)。
24
- 3. **指标要真**:数字可涵盖性能(Latency / QPS)、业务(转化率 / GMV)、稳定性(Crash 率 / SLA)、研发效能(构建提速 / 交付周期)。
25
- 4. **篇幅要精**:单条 Bullet 长度控制在 1~2 行(约 50~100 字),信息密度最大化。
@@ -1,57 +0,0 @@
1
- # Reference Manual: Template Design & Tokens (模板设计与 Token 体系)
2
-
3
- ---
4
-
5
- ## 1. 物理 A4 印刷尺寸与 CSS Paged Media
6
-
7
- ```css
8
- @page {
9
- size: A4 portrait;
10
- margin: 0; /* 消除默认打印边距,由容器内边距接管 */
11
- }
12
-
13
- @media print {
14
- body { background: transparent; padding: 0; }
15
- .resume-page {
16
- width: 210mm;
17
- height: 297mm;
18
- page-break-after: always;
19
- page-break-inside: avoid;
20
- }
21
- .avoid-break {
22
- break-inside: avoid;
23
- page-break-inside: avoid;
24
- }
25
- }
26
- ```
27
-
28
- ---
29
-
30
- ## 2. 核心 Design Tokens 字典
31
-
32
- ```css
33
- :root {
34
- /* 色彩系统 (Slate / Blue 阶梯) */
35
- --resume-color-primary: #0f172a; /* 正文主要文字 (Slate 900) */
36
- --resume-color-secondary: #334155; /* 次要文字与日期 (Slate 700) */
37
- --resume-color-muted: #64748b; /* 辅助文字 (Slate 500) */
38
- --resume-color-accent: #2563eb; /* 主题强调色 (Blue 600) */
39
- --resume-color-border: #e2e8f0; /* 分隔线与边框 (Slate 200) */
40
- --resume-color-tag-bg: #f1f5f9; /* 技能标签背景 (Slate 100) */
41
-
42
- /* 字阶系统 */
43
- --resume-font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
44
- --resume-font-size-name: 20pt;
45
- --resume-font-size-target: 10.5pt;
46
- --resume-font-size-h2: 12pt;
47
- --resume-font-size-body: 9.2pt;
48
- --resume-font-size-meta: 8.5pt;
49
- --resume-line-height-body: 1.45;
50
-
51
- /* 间距 Tokens (Agent 调参自愈核心变量) */
52
- --resume-space-header-bottom: 11pt;
53
- --resume-space-section: 11pt;
54
- --resume-space-item: 7.5pt;
55
- --resume-space-bullet: 2.5pt;
56
- }
57
- ```
@@ -1,16 +0,0 @@
1
- # Workflow 3: Analyze Job (洞察岗位与需求分析)
2
-
3
- > **目标:深入拆解招聘 JD,提取硬性门槛、加分亮点与招聘信号。**
4
-
5
- ---
6
-
7
- ## 1. JD 结构化提取流程
8
-
9
- 1. **提取必备技能 (Must-Have Skills)**:
10
- - 筛选招聘 JD 中明确要求的核心语言、框架与基础设施(如 Python, RAG, LangGraph, FastAPI)。
11
- 2. **提取加分技能 (Nice-to-Have Skills)**:
12
- - 识别具备竞争优势的加分项(如 K8s, 模型评测 Eval, 论文专利)。
13
- 3. **识别业务痛点与职责关键词 (Responsibilities & Pain Points)**:
14
- - 提取业务痛点词(如“长上下文优化”、“高并发削峰”、“Token 降本”、“团队效能”)。
15
- 4. **提取企业文化与招聘信号 (Hiring Signals)**:
16
- - 分析团队风格(学术研究型、工程落地型、业务敏捷型、架构治理型)。
@@ -1,16 +0,0 @@
1
- # Workflow 2: Define Goal (明确方向与定位)
2
-
3
- > **目标:明确目标岗位、期望职级与核心价值主张,确立职业叙事重心。**
4
-
5
- ---
6
-
7
- ## 1. 目标设定要素
8
-
9
- 1. **目标岗位名称 (Target Role Title)**:
10
- - 明确标准岗位名称(如“资深 AI Agent 研发工程师”、“全栈架构师”)。
11
- 2. **期望职级 (Target Seniority)**:
12
- - 确定表达重心(Junior/Mid/Senior/Lead/Architect/Director)。
13
- 3. **行业细分领域 (Industry Domain)**:
14
- - 锁定行业背景(AI/大模型、企业级 SaaS、金融科技、消费互联网等)。
15
- 4. **核心价值主张 (Core Value Proposition - CVP)**:
16
- - 提炼一句话核心定位(15~25 字),概括候选人独特的技术与业务壁垒。
@@ -1,25 +0,0 @@
1
- # Workflow 5: Forge Resume (简历工程与修改场排版)
2
-
3
- > **目标:以 HTML 为唯一修改场,填充结构化内容,调校 Design Tokens 实现像素级排版。**
4
-
5
- ---
6
-
7
- ## 1. 模板检索与修改场实例化
8
-
9
- 1. **执行模板检索**:
10
- ```bash
11
- python3 scripts/template/search-template.py "<Target Role>" --style "<minimal|modern|executive|classic>" --target-pages 1
12
- ```
13
- 2. **实例化中间修改场**:
14
- ```bash
15
- python3 scripts/template/instantiate-resume.py --template <template_id> --keywords "Python,LLM,RAG,FastAPI" --output workspace/resume.html
16
- ```
17
-
18
- ## 2. 修改场编辑规范
19
-
20
- 1. **内容填充**:
21
- - 保持语义化标签结构:`h1.candidate-name`, `p.job-target`, `section.resume-section`, `div.experience-item`, `ul.bullet-list`。
22
- 2. **Design Tokens 视觉调校**:
23
- - 全局间距:`--resume-space-section`, `--resume-space-item`, `--resume-space-bullet`。
24
- - 正文字号:`--resume-font-size-body`(标准 `9.2pt`,紧凑可微调至 `8.8pt`)。
25
- - 色彩体系:`--resume-color-accent`, `--resume-color-primary`。
@@ -1,21 +0,0 @@
1
- # Workflow 1: Know Me (自我认知与证据挖掘)
2
-
3
- > **目标:全面梳理候选人真实事实,建立可信证据底座,杜绝 AI 凭空捏造。**
4
-
5
- ---
6
-
7
- ## 1. 证据挖掘四步法
8
-
9
- 1. **结构化资产输入**:
10
- - 提取教育背景(学校、专业、学历、时间、GPA/荣誉)。
11
- - 提取职业经历(公司、职位、起止时间、部门/团队定位)。
12
- - 提取代码库与项目档案(GitHub 仓库、系统架构图、核心职责、采用技术栈)。
13
- 2. **客观事实提取**:
14
- - 将主观描述过滤为客观事实实体(技术栈、业务规模、代码量、测试覆盖率、性能指标)。
15
- 3. **L1~L3 证据等级评定**:
16
- - **Level 1 (强证据 - Direct Code/Config)**:在代码库、配置文件、CI/CD、文档中有直接证据支持。
17
- - **Level 2 (中证据 - Structural/Dependency)**:由目录结构、依赖库选型、架构模式合理推导得出。
18
- - **Level 3 (弱推论 - Contextual Inference)**:根据业务上下文合理推测(需使用保守句式,如“参与…的研发”)。
19
- - **Unsupported (无证据支撑)**:候选人档案完全未提及。**严禁写入简历**。
20
- 4. **输出 Master Profile JSON**:
21
- - 沉淀为标准的结构化候选人事实档案(候选人真实经历底座)。
@@ -1,19 +0,0 @@
1
- # Workflow 4: Position (优势对齐与策略设计)
2
-
3
- > **目标:进行差距分析,将真实证据精准对齐 JD 需求,制定本轮简历策略。**
4
-
5
- ---
6
-
7
- ## 1. 策略制定四步法
8
-
9
- 1. **差距分析 (Gap Analysis)**:
10
- - **强匹配区 (Strong Match)**:候选人拥有 L1 强证据且完全契合 JD 必备项(重点大篇幅展开)。
11
- - **潜在匹配区 (Potential Match)**:候选人拥有 L2/L3 证据可迁移关联(合理呼应)。
12
- - **缺失区 (Gap)**:真实经历中未涉及的技能(严禁造假,弱化或引导用户补充真实经历)。
13
- 2. **确定模块优先级 (Section Priority)**:
14
- - 技术研发类:`Skills` ➔ `Projects` ➔ `Experience` ➔ `Education`
15
- - 管理架构类:`Summary` ➔ `Experience` ➔ `Projects` ➔ `Skills` ➔ `Education`
16
- 3. **确定高亮关键词清单 (Highlight Targets)**:
17
- - 提取 8~12 个高频硬核技术词,在 HTML 修改场中注入 `<strong>` 或标签。
18
- 4. **运用 FAB 模型重塑 Bullets**:
19
- - 确保每个经历条目包含:强动词 + Feature(系统) + Advantage(架构创新) + Benefit(量化成效)。
@@ -1,31 +0,0 @@
1
- # Workflow 6: Review & QA (双重质检与自愈闭环)
2
-
3
- > **目标:自动化验证 ATS 纯文本可解析性与 DOM 高度溢出,闭环自愈调参,导出确定性 PDF。**
4
-
5
- ---
6
-
7
- ## 1. 双重 QA 自动化测试
8
-
9
- 1. **测试 1:布局与 DOM 高度溢出检测**:
10
- ```bash
11
- python3 scripts/validation/validate-resume.py --html workspace/resume.html --expected-pages 1
12
- ```
13
- - 单页标准高度:$297\text{mm} \times 96\text{DPI} / 25.4 \approx 1122.5\text{px}$。
14
- 2. **测试 2:ATS 纯文本流解析检测**:
15
- ```bash
16
- npx ts-node scripts/validation/validate-ats.ts --html workspace/resume.html
17
- ```
18
-
19
- ## 2. 自动化自愈修复闭环
20
-
21
- - **若发生页面溢出(如高度 1145px > 1122.5px)**:
22
- 1. 在 `workspace/resume.html` 的 `<style>` 中微调 `--resume-space-section: 9.5pt;`;
23
- 2. 微调 `--resume-font-size-body: 9.0pt;`;
24
- 3. 精简多余空行或过长描述;
25
- 4. 重新运行验证脚本直至 100% 通过。
26
-
27
- ## 3. 确定性无损 PDF 导出
28
-
29
- ```bash
30
- python3 scripts/rendering/render-pdf.py workspace/resume.html workspace/resume.pdf
31
- ```