knowme-careerforge-skill 0.0.2 → 0.0.6

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 (127) hide show
  1. package/AGENT.md +276 -0
  2. package/ARCHITECTURE.md +216 -0
  3. package/README.md +34 -54
  4. package/README.zh-CN.md +35 -57
  5. package/SKILL.md +28 -137
  6. package/agents/claude/knowme-careerforge.md +2 -16
  7. package/agents/codex/knowme-careerforge.yaml +5 -7
  8. package/agents/cursor/knowme-careerforge.mdc +4 -9
  9. package/agents/opencode/skill.yaml +1 -1
  10. package/agents/windsurf/knowme-careerforge.rules +2 -12
  11. package/dist/cli/src/commands/init.js +9 -0
  12. package/dist/cli/src/index.js +40 -19
  13. package/dist/scripts/rendering/engine-loader.d.ts +2 -0
  14. package/dist/scripts/rendering/engine-loader.js +46 -0
  15. package/dist/scripts/rendering/render-pdf.d.ts +3 -8
  16. package/dist/scripts/rendering/render-pdf.js +7 -103
  17. package/dist/scripts/rendering/runtime.d.ts +9 -0
  18. package/dist/scripts/rendering/runtime.js +63 -0
  19. package/dist/scripts/validation/validate-ats.d.ts +2 -22
  20. package/dist/scripts/validation/validate-ats.js +6 -168
  21. package/dist/scripts/validation/validate-layout.d.ts +2 -23
  22. package/dist/scripts/validation/validate-layout.js +5 -159
  23. package/package.json +16 -4
  24. package/references/01-evidence-mining.md +5 -0
  25. package/references/02-career-goal.md +38 -0
  26. package/references/03-jd-analysis.md +44 -0
  27. package/references/04-template-selection.md +43 -0
  28. package/references/05-html-canvas-tokens.md +12 -0
  29. package/references/06-qa-and-rendering.md +14 -0
  30. package/references/07-artifact-contract.md +64 -0
  31. package/scripts/Agent.md +9 -136
  32. package/scripts/build/build-gallery.py +66 -56
  33. package/scripts/build/run-all-tests.py +1 -0
  34. package/scripts/build/sync-version.py +37 -10
  35. package/scripts/contracts/profile.py +101 -0
  36. package/scripts/evidence/extract-evidence.py +109 -62
  37. package/scripts/pipeline/forge.py +266 -136
  38. package/scripts/rendering/README.md +65 -0
  39. package/scripts/rendering/browser-engine.d.ts +15 -0
  40. package/scripts/rendering/browser-engine.js +366 -0
  41. package/scripts/rendering/browser_engine.py +39 -0
  42. package/scripts/rendering/engine-loader.ts +11 -0
  43. package/scripts/rendering/render-pdf.py +26 -151
  44. package/scripts/rendering/render-pdf.ts +7 -83
  45. package/scripts/template/instantiate-resume.py +266 -167
  46. package/scripts/template/search-template.py +367 -89
  47. package/scripts/validation/measure-dom.js +5 -0
  48. package/scripts/validation/validate-ats.ts +6 -174
  49. package/scripts/validation/validate-layout.ts +5 -159
  50. package/scripts/validation/validate-resume.py +23 -134
  51. package/skill.json +1 -1
  52. package/src/knowledge/index.json +390 -10
  53. package/src/knowledge/resume-schema.json +377 -71
  54. package/src/knowledge/templates.json +388 -8
  55. package/src/references/01-evidence-mining.md +5 -0
  56. package/src/references/02-career-goal.md +38 -0
  57. package/src/references/03-jd-analysis.md +44 -0
  58. package/src/references/04-template-selection.md +43 -0
  59. package/src/references/05-html-canvas-tokens.md +12 -0
  60. package/src/references/06-qa-and-rendering.md +14 -0
  61. package/src/references/07-artifact-contract.md +64 -0
  62. package/src/templates/Agent.md +11 -0
  63. package/src/templates/academic-research/README.md +25 -0
  64. package/src/templates/academic-research/canvas.html +21 -0
  65. package/src/templates/academic-research/metadata.json +38 -0
  66. package/src/templates/academic-research/sample-profile.json +86 -0
  67. package/src/templates/academic-research/style.css +213 -0
  68. package/src/templates/classic/README.md +9 -0
  69. package/src/templates/classic/canvas.html +21 -0
  70. package/src/templates/classic/metadata.json +3 -0
  71. package/src/templates/classic/sample-profile.json +86 -0
  72. package/src/templates/classic/style.css +35 -54
  73. package/src/templates/common/base.css +182 -0
  74. package/src/templates/common/canvas-bindings.css +41 -0
  75. package/src/templates/common/resume-contract.md +8 -0
  76. package/src/templates/compact-dense/README.md +25 -0
  77. package/src/templates/compact-dense/canvas.html +14 -0
  78. package/src/templates/compact-dense/metadata.json +38 -0
  79. package/src/templates/compact-dense/sample-profile.json +86 -0
  80. package/src/templates/compact-dense/style.css +218 -0
  81. package/src/templates/creative-tech/README.md +26 -0
  82. package/src/templates/creative-tech/canvas.html +15 -0
  83. package/src/templates/creative-tech/metadata.json +39 -0
  84. package/src/templates/creative-tech/sample-profile.json +86 -0
  85. package/src/templates/creative-tech/style.css +257 -0
  86. package/src/templates/data-analyst/README.md +26 -0
  87. package/src/templates/data-analyst/canvas.html +15 -0
  88. package/src/templates/data-analyst/metadata.json +39 -0
  89. package/src/templates/data-analyst/sample-profile.json +86 -0
  90. package/src/templates/data-analyst/style.css +285 -0
  91. package/src/templates/executive/README.md +9 -0
  92. package/src/templates/executive/canvas.html +15 -0
  93. package/src/templates/executive/sample-profile.json +86 -0
  94. package/src/templates/executive/style.css +83 -74
  95. package/src/templates/international-flow/README.md +26 -0
  96. package/src/templates/international-flow/canvas.html +21 -0
  97. package/src/templates/international-flow/metadata.json +37 -0
  98. package/src/templates/international-flow/sample-profile.json +86 -0
  99. package/src/templates/international-flow/style.css +208 -0
  100. package/src/templates/minimal/README.md +9 -0
  101. package/src/templates/minimal/canvas.html +21 -0
  102. package/src/templates/minimal/sample-profile.json +86 -0
  103. package/src/templates/minimal/style.css +54 -72
  104. package/src/templates/modern/README.md +9 -0
  105. package/src/templates/modern/canvas.html +15 -0
  106. package/src/templates/modern/sample-profile.json +86 -0
  107. package/src/templates/modern/style.css +78 -71
  108. package/src/templates/startup-generalist/README.md +25 -0
  109. package/src/templates/startup-generalist/canvas.html +21 -0
  110. package/src/templates/startup-generalist/metadata.json +37 -0
  111. package/src/templates/startup-generalist/sample-profile.json +86 -0
  112. package/src/templates/startup-generalist/style.css +237 -0
  113. package/src/references/ats.md +0 -17
  114. package/src/references/evidence-first.md +0 -22
  115. package/src/references/pdf.md +0 -40
  116. package/src/references/resume-writing.md +0 -25
  117. package/src/references/template-design.md +0 -57
  118. package/src/templates/classic/template.html +0 -133
  119. package/src/templates/executive/template.html +0 -101
  120. package/src/templates/minimal/template.html +0 -114
  121. package/src/templates/modern/template.html +0 -139
  122. package/src/workflows/analyze-job.md +0 -16
  123. package/src/workflows/define-goal.md +0 -16
  124. package/src/workflows/forge-resume.md +0 -25
  125. package/src/workflows/know-me.md +0 -21
  126. package/src/workflows/position.md +0 -19
  127. 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,51 +215,70 @@ 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
- margin-left: 12pt;
224
+ margin: 0;
225
+ padding-left: 14pt;
243
226
  font-size: var(--resume-font-size-body);
244
- color: var(--resume-color-secondary);
245
227
  line-height: var(--resume-line-height-body);
228
+ color: var(--resume-color-secondary);
246
229
  }
247
230
 
248
231
  .bullet-list li {
249
232
  margin-bottom: var(--resume-space-bullet);
250
233
  }
251
234
 
252
- .bullet-list strong {
253
- color: var(--resume-color-primary);
254
- font-weight: 600;
255
- }
256
-
257
235
  .edu-desc {
258
236
  font-size: var(--resume-font-size-body);
259
237
  color: var(--resume-color-secondary);
260
238
  line-height: var(--resume-line-height-body);
261
239
  }
262
240
 
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
- }
241
+ /* === GENERATED HTML COMPONENT CLASSES ===
242
+ * These classes are emitted by instantiate-resume.py at runtime.
243
+ * Must stay in sync with the HTML generator output.
244
+ */
245
+
246
+ /* Sidebar section grouping container */
247
+ .sidebar-section {
248
+ display: flex;
249
+ flex-direction: column;
250
+ }
251
+
252
+ /* Experience / project card wrappers (alias of timeline-item) */
253
+ .experience-item,
254
+ .project-item {
255
+ margin-bottom: var(--resume-space-item);
256
+ }
257
+
258
+ /* Role badge next to company/project name in instantiated cards */
259
+ .role-badge {
260
+ font-size: 9pt;
261
+ font-weight: 500;
262
+ color: #0284c7; /* Sky 600 — matches .role-title */
263
+ white-space: nowrap;
264
+ }
265
+
266
+ /* Tech stack tag row container */
267
+ .tech-stack-tags {
268
+ display: flex;
269
+ flex-wrap: wrap;
270
+ gap: 3pt;
271
+ margin: 3pt 0 5pt;
272
+ }
273
+
274
+ /* Individual tech stack pill */
275
+ .tech-tag {
276
+ font-size: 7.5pt;
277
+ color: var(--resume-color-secondary);
278
+ background: var(--primitive-color-slate-100);
279
+ padding: 1pt 5pt;
280
+ border-radius: 2pt;
281
+ white-space: nowrap;
282
+ line-height: 1.35;
283
+ font-family: var(--primitive-font-mono);
277
284
  }
@@ -0,0 +1,25 @@
1
+ # Startup Generalist Cards Template (`startup-generalist`)
2
+
3
+ > **定位:面向早期初创公司 0~1 核心骨干、独立开发者与增长工程师的模块化卡片流模板。**
4
+
5
+ - **版式风格**:模块化卡片流 (Modular Cards Flow)
6
+ - **视觉色系**:活力翡翠绿 (`#059669`, `--palette-emerald-fresh`) + 板岩灰阶 (`#1e293b`, `#334155`)
7
+ - **ATS 评级**:Tier 1 (Optimal - 100% 完美解析)
8
+ - **目标页数**:1 页
9
+ - **信息密度**:高 (High)
10
+ - **核心 Tokens**:
11
+ - `--resume-space-section`: `10pt`
12
+ - `--resume-space-item`: `7pt`
13
+ - `--resume-space-bullet`: `2.0pt`
14
+ - `--resume-font-size-body`: `9.0pt`
15
+ - `--resume-line-height-body`: `1.42`
16
+ - `--resume-color-accent`: `var(--palette-emerald-fresh)`
17
+
18
+ ## 文件维护
19
+
20
+ - `canvas.html`:唯一维护的 HTML 布局,包含统一命名槽位。
21
+ - `style.css`:此模板的样式与设计变量。
22
+ - `sample-profile.json`:仅供画廊使用的虚构样例数据,不作为用户简历默认值。
23
+ - `metadata.json`:模板选择与布局元数据。
24
+
25
+ 在项目根目录运行 `python3 scripts/build/build-gallery.py` 生成画廊。预览与实际简历共用实例化器及完整 CSS 链;生成的 HTML 位于 `output/templates_gallery/`,不回写到模板源目录。
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html>
2
+ <html lang="{{ resume:language }}">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title><!-- resume:document-title --></title>
7
+ <!-- resume:styles -->
8
+ </head>
9
+ <body>
10
+ <div class="resume-page bound-canvas canvas-startup-generalist">
11
+ <main>
12
+ <!-- resume:basics -->
13
+ <!-- resume:summary -->
14
+ <!-- resume:skills -->
15
+ <!-- resume:experience -->
16
+ <!-- resume:projects -->
17
+ <!-- resume:education --><!-- resume:certifications -->
18
+ </main>
19
+ </div>
20
+ </body>
21
+ </html>
@@ -0,0 +1,37 @@
1
+ {
2
+ "id": "startup-generalist",
3
+ "name": "Startup Generalist Cards",
4
+ "version": "1.0.0",
5
+ "style": "modular-cards",
6
+ "roleCategory": "startup-growth",
7
+ "layout": {
8
+ "type": "modular-cards",
9
+ "targetPages": 1,
10
+ "maxPages": 1,
11
+ "density": "high"
12
+ },
13
+ "visualStyle": {
14
+ "tone": "emerald-green",
15
+ "accentColor": "#059669",
16
+ "fontFamily": "System Sans-Serif"
17
+ },
18
+ "atsScoreTier": "tier-1-optimal",
19
+ "supportedRoles": [
20
+ "fullstack",
21
+ "indie-hacker",
22
+ "startup-cto",
23
+ "growth-engineer",
24
+ "product-engineer",
25
+ "frontend",
26
+ "backend"
27
+ ],
28
+ "languages": ["zh-CN", "en-US"],
29
+ "customizableTokens": [
30
+ "--resume-font-size-body",
31
+ "--resume-line-height-body",
32
+ "--resume-space-section",
33
+ "--resume-space-item",
34
+ "--resume-space-bullet",
35
+ "--resume-color-accent"
36
+ ]
37
+ }
@@ -0,0 +1,86 @@
1
+ {
2
+ "language": "zh-CN",
3
+ "basics": {
4
+ "name": "示例候选人",
5
+ "title": "fullstack",
6
+ "email": "candidate@example.com",
7
+ "phone": "138-0000-0000",
8
+ "location": "示例城市",
9
+ "summary": "本页为虚构排版样例,姓名、机构和经历均不代表真实候选人。"
10
+ },
11
+ "skills": [
12
+ {
13
+ "category": "工程实践",
14
+ "items": [
15
+ "Python",
16
+ "TypeScript",
17
+ "SQL"
18
+ ]
19
+ },
20
+ {
21
+ "category": "协作与交付",
22
+ "items": [
23
+ "需求分析",
24
+ "质量验证",
25
+ "技术文档"
26
+ ]
27
+ }
28
+ ],
29
+ "experience": [
30
+ {
31
+ "company": "示例科技公司(虚构)",
32
+ "role": "fullstack",
33
+ "startDate": "2022.07",
34
+ "endDate": "2025.06",
35
+ "bullets": [
36
+ {
37
+ "text": "负责示例业务模块的需求分析、实现与交付,整理接口约定和验收标准。"
38
+ },
39
+ {
40
+ "text": "与产品和测试协作完成版本迭代,补充异常场景验证及使用文档。"
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ "company": "示例工作室(虚构)",
46
+ "role": "项目成员",
47
+ "startDate": "2020.07",
48
+ "endDate": "2022.06",
49
+ "bullets": [
50
+ {
51
+ "text": "参与内部工具开发,梳理业务流程并维护数据校验规则。"
52
+ }
53
+ ]
54
+ }
55
+ ],
56
+ "projects": [
57
+ {
58
+ "name": "业务协作平台(虚构项目)",
59
+ "role": "核心开发",
60
+ "techStack": [
61
+ "TypeScript",
62
+ "Python",
63
+ "PostgreSQL"
64
+ ],
65
+ "startDate": "2024.01",
66
+ "endDate": "2024.10",
67
+ "bullets": [
68
+ {
69
+ "text": "实现任务分配、进度记录与报表导出,建立可复用的数据访问接口。"
70
+ },
71
+ {
72
+ "text": "补充自动化校验和部署说明,支持团队复现开发环境。"
73
+ }
74
+ ]
75
+ }
76
+ ],
77
+ "education": [
78
+ {
79
+ "institution": "示例大学(虚构)",
80
+ "degree": "学士",
81
+ "field": "计算机科学",
82
+ "startDate": "2016.09",
83
+ "endDate": "2020.06"
84
+ }
85
+ ]
86
+ }
@@ -0,0 +1,237 @@
1
+ /**
2
+ * KnowMe CareerForge — Startup Generalist Cards Template Style
3
+ * Style Tone: Emerald Green (Modular Cards Flow)
4
+ * Inherits: src/templates/common/base.css
5
+ */
6
+
7
+ :root {
8
+ /* === COMPONENT TOKENS (Overrides & Aliases) === */
9
+ --resume-page-padding: 12mm 14mm;
10
+
11
+ /* Color Bindings */
12
+ --resume-color-primary: #0f172a;
13
+ --resume-color-secondary: #334155;
14
+ --resume-color-muted: #64748b;
15
+ --resume-color-accent: var(--palette-emerald-fresh);
16
+ --resume-color-accent-bg: #ecfdf5;
17
+ --resume-color-card-border: #e2e8f0;
18
+ --resume-color-card-bg: #f8fafc;
19
+ --resume-color-tag-bg: #e6f4ea;
20
+ --resume-color-border: #cbd5e1;
21
+
22
+ /* Typography Bindings */
23
+ --resume-font-body: var(--primitive-font-sans);
24
+ --resume-font-size-name: 20pt;
25
+ --resume-font-size-target: 10pt;
26
+ --resume-font-size-h2: 11pt;
27
+ --resume-font-size-body: 9.0pt;
28
+ --resume-font-size-meta: 8.5pt;
29
+ --resume-line-height-body: 1.42;
30
+
31
+ /* Spacing Tokens (Calibratable for Self-Healing) */
32
+ --resume-space-header-bottom: 8pt;
33
+ --resume-space-section: 10pt;
34
+ --resume-space-item: 7pt;
35
+ --resume-space-bullet: 2.0pt;
36
+ }
37
+
38
+ .resume-page {
39
+ padding: var(--resume-page-padding);
40
+ }
41
+
42
+ /* Header 模块 */
43
+ .resume-header {
44
+ border-bottom: 2px solid var(--resume-color-accent);
45
+ padding-bottom: var(--resume-space-header-bottom);
46
+ margin-bottom: var(--resume-space-section);
47
+ }
48
+
49
+ .header-top {
50
+ display: flex;
51
+ justify-content: space-between;
52
+ align-items: baseline;
53
+ flex-wrap: wrap;
54
+ gap: 6pt;
55
+ }
56
+
57
+ .candidate-name {
58
+ font-size: var(--resume-font-size-name);
59
+ font-weight: 700;
60
+ color: var(--resume-color-accent);
61
+ margin: 0;
62
+ letter-spacing: 0.5px;
63
+ }
64
+
65
+ .job-target {
66
+ font-size: var(--resume-font-size-target);
67
+ color: var(--resume-color-secondary);
68
+ font-weight: 600;
69
+ margin: 0;
70
+ }
71
+
72
+ .contact-grid {
73
+ display: flex;
74
+ flex-wrap: wrap;
75
+ gap: 4pt 12pt;
76
+ font-size: var(--resume-font-size-meta);
77
+ color: var(--resume-color-muted);
78
+ margin-top: 4pt;
79
+ }
80
+
81
+ .contact-item {
82
+ display: inline-flex;
83
+ align-items: center;
84
+ }
85
+
86
+ .value-prop {
87
+ font-size: var(--resume-font-size-body);
88
+ color: var(--resume-color-secondary);
89
+ line-height: var(--resume-line-height-body);
90
+ margin: 5pt 0 0 0;
91
+ }
92
+
93
+ /* 章节通用样式 */
94
+ .resume-section {
95
+ margin-bottom: var(--resume-space-section);
96
+ }
97
+
98
+ .section-title {
99
+ font-size: var(--resume-font-size-h2);
100
+ font-weight: 700;
101
+ color: var(--resume-color-primary);
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 6pt;
105
+ margin: 0 0 calc(var(--resume-space-item) * 0.75) 0;
106
+ text-transform: uppercase;
107
+ letter-spacing: 0.5px;
108
+ }
109
+
110
+ .section-title::before {
111
+ content: "";
112
+ display: inline-block;
113
+ width: 4pt;
114
+ height: 11pt;
115
+ background-color: var(--resume-color-accent);
116
+ border-radius: 1pt;
117
+ }
118
+
119
+ /* 技能模块 */
120
+ .skills-content {
121
+ display: flex;
122
+ flex-direction: column;
123
+ gap: 3pt;
124
+ background-color: var(--resume-color-card-bg);
125
+ border: 1px solid var(--resume-color-card-border);
126
+ border-radius: 4pt;
127
+ padding: 6pt 10pt;
128
+ }
129
+
130
+ .skill-row {
131
+ font-size: var(--resume-font-size-body);
132
+ line-height: var(--resume-line-height-body);
133
+ }
134
+
135
+ .skill-category {
136
+ font-weight: 700;
137
+ color: var(--resume-color-primary);
138
+ }
139
+
140
+ .skill-items {
141
+ color: var(--resume-color-secondary);
142
+ }
143
+
144
+ /* 卡片风格条目 */
145
+ .experience-item,
146
+ .project-item,
147
+ .education-item {
148
+ margin-bottom: var(--resume-space-item);
149
+ background-color: #ffffff;
150
+ border: 1px solid var(--resume-color-card-border);
151
+ border-radius: 4pt;
152
+ padding: 6pt 10pt;
153
+ }
154
+
155
+ .item-header {
156
+ display: flex;
157
+ justify-content: space-between;
158
+ align-items: baseline;
159
+ margin-bottom: 2pt;
160
+ }
161
+
162
+ .item-title-group {
163
+ display: flex;
164
+ align-items: center;
165
+ gap: 6pt;
166
+ flex-wrap: wrap;
167
+ }
168
+
169
+ .org-name,
170
+ .project-name {
171
+ font-weight: 700;
172
+ font-size: var(--resume-font-size-body);
173
+ color: var(--resume-color-primary);
174
+ }
175
+
176
+ .role-badge {
177
+ font-size: var(--resume-font-size-meta);
178
+ font-weight: 600;
179
+ color: var(--resume-color-accent);
180
+ background-color: var(--resume-color-accent-bg);
181
+ padding: 1pt 5pt;
182
+ border-radius: 3pt;
183
+ }
184
+
185
+ .date-range {
186
+ font-size: var(--resume-font-size-meta);
187
+ color: var(--resume-color-muted);
188
+ font-weight: 500;
189
+ white-space: nowrap;
190
+ }
191
+
192
+ .tech-stack-tags {
193
+ display: flex;
194
+ flex-wrap: wrap;
195
+ gap: 3pt;
196
+ margin: 2pt 0 3pt 0;
197
+ }
198
+
199
+ .tech-tag {
200
+ font-size: 7.5pt;
201
+ background-color: var(--resume-color-tag-bg);
202
+ color: var(--resume-color-accent);
203
+ padding: 1pt 5pt;
204
+ border-radius: 3pt;
205
+ font-family: var(--primitive-font-mono);
206
+ font-weight: 600;
207
+ }
208
+
209
+ .bullet-list {
210
+ margin: 0;
211
+ padding-left: 13pt;
212
+ color: var(--resume-color-secondary);
213
+ font-size: var(--resume-font-size-body);
214
+ line-height: var(--resume-line-height-body);
215
+ }
216
+
217
+ .bullet-list li {
218
+ margin-bottom: var(--resume-space-bullet);
219
+ }
220
+
221
+ .edu-detail {
222
+ font-size: var(--resume-font-size-meta);
223
+ color: var(--resume-color-secondary);
224
+ margin: 2pt 0 0 0;
225
+ }
226
+
227
+ .sidebar-section {
228
+ margin-bottom: var(--resume-space-section);
229
+ }
230
+
231
+ @media print {
232
+ .resume-page {
233
+ padding: var(--resume-page-padding);
234
+ page-break-after: always;
235
+ page-break-inside: avoid;
236
+ }
237
+ }
@@ -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
- ```