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
@@ -0,0 +1,11 @@
1
+ # Template bundle contract
2
+
3
+ Each template contains canvas.html, sample-profile.json, style.css, metadata.json and README.md. canvas.html is the sole maintained HTML structure with explicit named slots and no candidate samples. Generate gallery previews with scripts/build/build-gallery.py using the same instantiator and CSS as actual resumes. sample-profile.json is explicitly fictional gallery input, never a runtime default. Generated previews belong in output, not src/templates.
4
+
5
+ The instantiator validates slot completeness and context before binding facts once. Shared profile normalization accepts missing/null fields, rejects unknown or mistyped data, and preserves every supplied education, experience and project entry. Escape candidate text before embedding it. Do not use sample-based regex substitution or default candidate achievements.
6
+
7
+ Inline styles in order: common/base.css, template style.css, common/canvas-bindings.css. Use CSS tokens for tunable spacing and typography; narrow columns must wrap long text and maintain readable contrast. No hidden body text, external assets or image-based body copy.
8
+
9
+ Each explicit .resume-page represents one A4 page. Two-page layouts need two page containers; the current validator deliberately rejects one oversized root flowing implicitly into multiple pages because per-page content acceptance would otherwise be ambiguous. --expected-pages is a maximum of one or two pages.
10
+
11
+ Tests must use temporary directories. Verify actual print layout and final PDF text, plus inspect rendered screenshots after geometry changes. Metadata ATS tiers describe design intent, not universal ATS certification. Read common/resume-contract.md and ../../references/07-artifact-contract.md for the complete contract.
@@ -0,0 +1,25 @@
1
+ # Academic Research Flow Template (`academic-research`)
2
+
3
+ > **定位:面向高校硕博、算法科学家、科研人员与学术求职者的高密度单栏学术风模板。**
4
+
5
+ - **版式风格**:单栏紧凑学术流 (Single-Column Academic Flow)
6
+ - **视觉色系**:牛津海军蓝 (`#1e3a8a`, `--palette-deep-navy`) + 板岩灰阶 (`#0f172a`, `#334155`)
7
+ - **ATS 评级**:Tier 1 (Optimal - 100% 完美解析)
8
+ - **目标页数**:1~2 页 (默认 1 页自包含紧凑布局)
9
+ - **信息密度**:极高 (Ultra)
10
+ - **核心 Tokens**:
11
+ - `--resume-space-section`: `10pt`
12
+ - `--resume-space-item`: `6.5pt`
13
+ - `--resume-space-bullet`: `2.0pt`
14
+ - `--resume-font-size-body`: `9.0pt`
15
+ - `--resume-line-height-body`: `1.40`
16
+ - `--resume-color-accent`: `var(--palette-deep-navy)`
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-academic-research">
11
+ <main>
12
+ <!-- resume:basics -->
13
+ <!-- resume:summary -->
14
+ <!-- resume:education --><!-- resume:certifications -->
15
+ <!-- resume:skills -->
16
+ <!-- resume:experience -->
17
+ <!-- resume:projects -->
18
+ </main>
19
+ </div>
20
+ </body>
21
+ </html>
@@ -0,0 +1,38 @@
1
+ {
2
+ "id": "academic-research",
3
+ "name": "Academic Research Flow",
4
+ "version": "1.0.0",
5
+ "style": "single-column-academic",
6
+ "roleCategory": "research-algorithm",
7
+ "layout": {
8
+ "type": "single-column",
9
+ "targetPages": 1,
10
+ "maxPages": 2,
11
+ "density": "ultra"
12
+ },
13
+ "visualStyle": {
14
+ "tone": "oxford-navy",
15
+ "accentColor": "#1e3a8a",
16
+ "fontFamily": "System Sans-Serif"
17
+ },
18
+ "atsScoreTier": "tier-1-optimal",
19
+ "supportedRoles": [
20
+ "ai-agent-engineer",
21
+ "algorithm-engineer",
22
+ "research-scientist",
23
+ "data-scientist",
24
+ "nlp-engineer",
25
+ "cv-engineer",
26
+ "phd-candidate",
27
+ "postdoc"
28
+ ],
29
+ "languages": ["zh-CN", "en-US"],
30
+ "customizableTokens": [
31
+ "--resume-font-size-body",
32
+ "--resume-line-height-body",
33
+ "--resume-space-section",
34
+ "--resume-space-item",
35
+ "--resume-space-bullet",
36
+ "--resume-color-accent"
37
+ ]
38
+ }
@@ -0,0 +1,86 @@
1
+ {
2
+ "language": "zh-CN",
3
+ "basics": {
4
+ "name": "示例候选人",
5
+ "title": "ai-agent-engineer",
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": "ai-agent-engineer",
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,213 @@
1
+ /**
2
+ * KnowMe CareerForge — Academic Research Template Style
3
+ * Style Tone: Oxford Navy (Single-Column Academic Flow)
4
+ * Inherits: src/templates/common/base.css
5
+ */
6
+
7
+ :root {
8
+ /* === COMPONENT TOKENS (Overrides & Aliases) === */
9
+ --resume-page-padding: 12mm 15mm;
10
+
11
+ /* Color Bindings */
12
+ --resume-color-primary: var(--primitive-color-slate-900);
13
+ --resume-color-secondary: var(--primitive-color-slate-700);
14
+ --resume-color-muted: var(--primitive-color-slate-500);
15
+ --resume-color-accent: var(--palette-deep-navy);
16
+ --resume-color-accent-bg: #eff6ff;
17
+ --resume-color-border: var(--primitive-color-slate-200);
18
+ --resume-color-tag-bg: var(--primitive-color-slate-100);
19
+
20
+ /* Typography Bindings */
21
+ --resume-font-body: var(--primitive-font-sans);
22
+ --resume-font-size-name: var(--primitive-font-size-display);
23
+ --resume-font-size-target: var(--primitive-font-size-h3);
24
+ --resume-font-size-h2: 11.5pt;
25
+ --resume-font-size-body: 9.0pt;
26
+ --resume-font-size-meta: 8.5pt;
27
+ --resume-line-height-body: 1.40;
28
+
29
+ /* Spacing Tokens (Calibratable for Self-Healing) */
30
+ --resume-space-header-bottom: 8pt;
31
+ --resume-space-section: 10pt;
32
+ --resume-space-item: 6.5pt;
33
+ --resume-space-bullet: 2.0pt;
34
+ }
35
+
36
+ .resume-page {
37
+ padding: var(--resume-page-padding);
38
+ }
39
+
40
+ /* Header 模块 */
41
+ .resume-header {
42
+ border-bottom: 2px solid var(--resume-color-accent);
43
+ padding-bottom: var(--resume-space-header-bottom);
44
+ margin-bottom: var(--resume-space-section);
45
+ text-align: center;
46
+ }
47
+
48
+ .candidate-name {
49
+ font-size: var(--resume-font-size-name);
50
+ font-weight: 700;
51
+ color: var(--resume-color-accent);
52
+ margin: 0 0 2pt 0;
53
+ letter-spacing: 0.5px;
54
+ }
55
+
56
+ .job-target {
57
+ font-size: var(--resume-font-size-target);
58
+ color: var(--resume-color-secondary);
59
+ font-weight: 600;
60
+ margin: 0 0 4pt 0;
61
+ }
62
+
63
+ .contact-grid {
64
+ display: flex;
65
+ flex-wrap: wrap;
66
+ justify-content: center;
67
+ gap: 6pt 14pt;
68
+ font-size: var(--resume-font-size-meta);
69
+ color: var(--resume-color-secondary);
70
+ }
71
+
72
+ .contact-item {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ gap: 3pt;
76
+ }
77
+
78
+ .value-prop {
79
+ font-size: var(--resume-font-size-body);
80
+ color: var(--resume-color-secondary);
81
+ line-height: var(--resume-line-height-body);
82
+ margin: 6pt auto 0 auto;
83
+ max-width: 90%;
84
+ font-style: italic;
85
+ }
86
+
87
+ /* 章节通用样式 */
88
+ .resume-section {
89
+ margin-bottom: var(--resume-space-section);
90
+ }
91
+
92
+ .section-title {
93
+ font-size: var(--resume-font-size-h2);
94
+ font-weight: 700;
95
+ color: var(--resume-color-accent);
96
+ border-bottom: 1px solid var(--resume-color-accent);
97
+ padding-bottom: 2pt;
98
+ margin: 0 0 calc(var(--resume-space-item) * 0.8) 0;
99
+ text-transform: uppercase;
100
+ letter-spacing: 0.5px;
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: space-between;
104
+ }
105
+
106
+ /* 技能模块 */
107
+ .skills-content {
108
+ display: flex;
109
+ flex-direction: column;
110
+ gap: 3pt;
111
+ }
112
+
113
+ .skill-row {
114
+ font-size: var(--resume-font-size-body);
115
+ line-height: var(--resume-line-height-body);
116
+ }
117
+
118
+ .skill-category {
119
+ font-weight: 700;
120
+ color: var(--resume-color-primary);
121
+ }
122
+
123
+ .skill-items {
124
+ color: var(--resume-color-secondary);
125
+ }
126
+
127
+ /* 条目通用样式 (Experience, Projects, Education) */
128
+ .experience-item,
129
+ .project-item,
130
+ .education-item {
131
+ margin-bottom: var(--resume-space-item);
132
+ }
133
+
134
+ .item-header {
135
+ display: flex;
136
+ justify-content: space-between;
137
+ align-items: baseline;
138
+ margin-bottom: 2pt;
139
+ }
140
+
141
+ .item-title-group {
142
+ display: flex;
143
+ align-items: center;
144
+ gap: 6pt;
145
+ flex-wrap: wrap;
146
+ }
147
+
148
+ .org-name,
149
+ .project-name {
150
+ font-weight: 700;
151
+ font-size: var(--resume-font-size-body);
152
+ color: var(--resume-color-primary);
153
+ }
154
+
155
+ .role-badge {
156
+ font-size: var(--resume-font-size-meta);
157
+ font-weight: 600;
158
+ color: var(--resume-color-accent);
159
+ }
160
+
161
+ .date-range {
162
+ font-size: var(--resume-font-size-meta);
163
+ color: var(--resume-color-muted);
164
+ font-weight: 500;
165
+ white-space: nowrap;
166
+ }
167
+
168
+ .tech-stack-tags {
169
+ display: flex;
170
+ flex-wrap: wrap;
171
+ gap: 4pt;
172
+ margin: 2pt 0 3pt 0;
173
+ }
174
+
175
+ .tech-tag {
176
+ font-size: 7.5pt;
177
+ background-color: var(--resume-color-tag-bg);
178
+ color: var(--resume-color-secondary);
179
+ padding: 1pt 5pt;
180
+ border-radius: 2pt;
181
+ font-family: var(--primitive-font-mono);
182
+ }
183
+
184
+ .bullet-list {
185
+ margin: 0;
186
+ padding-left: 14pt;
187
+ color: var(--resume-color-secondary);
188
+ font-size: var(--resume-font-size-body);
189
+ line-height: var(--resume-line-height-body);
190
+ }
191
+
192
+ .bullet-list li {
193
+ margin-bottom: var(--resume-space-bullet);
194
+ }
195
+
196
+ .edu-detail {
197
+ font-size: var(--resume-font-size-meta);
198
+ color: var(--resume-color-secondary);
199
+ margin: 2pt 0 0 0;
200
+ }
201
+
202
+ /* 兼容侧边栏容器类名 */
203
+ .sidebar-section {
204
+ margin-bottom: var(--resume-space-section);
205
+ }
206
+
207
+ @media print {
208
+ .resume-page {
209
+ padding: var(--resume-page-padding);
210
+ page-break-after: always;
211
+ page-break-inside: avoid;
212
+ }
213
+ }
@@ -10,3 +10,12 @@
10
10
  - `--resume-cell-padding`: `4.5pt 7pt` (默认)
11
11
  - `--resume-font-size-body`: `9pt` (默认)
12
12
  - `--resume-color-accent`: `#1d4ed8` (默认)
13
+
14
+ ## 文件维护
15
+
16
+ - `canvas.html`:唯一维护的 HTML 布局,包含统一命名槽位。
17
+ - `style.css`:此模板的样式与设计变量。
18
+ - `sample-profile.json`:仅供画廊使用的虚构样例数据,不作为用户简历默认值。
19
+ - `metadata.json`:模板选择与布局元数据。
20
+
21
+ 在项目根目录运行 `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-classic">
11
+ <!-- resume:basics -->
12
+ <table class="resume-grid-table"><tbody>
13
+ <tr><td><!-- resume:summary --></td></tr>
14
+ <tr><td><!-- resume:skills --></td></tr>
15
+ <tr><td><!-- resume:experience --></td></tr>
16
+ <tr><td><!-- resume:projects --></td></tr>
17
+ <tr><td><!-- resume:education --><!-- resume:certifications --></td></tr>
18
+ </tbody></table>
19
+ </div>
20
+ </body>
21
+ </html>
@@ -28,6 +28,9 @@
28
28
  "customizableTokens": [
29
29
  "--resume-font-size-body",
30
30
  "--resume-cell-padding",
31
+ "--resume-space-section",
32
+ "--resume-space-item",
33
+ "--resume-space-bullet",
31
34
  "--resume-color-accent",
32
35
  "--resume-color-label-bg"
33
36
  ]
@@ -0,0 +1,86 @@
1
+ {
2
+ "language": "zh-CN",
3
+ "basics": {
4
+ "name": "示例候选人",
5
+ "title": "frontend",
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": "frontend",
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
+ }
@@ -1,48 +1,38 @@
1
+ /**
2
+ * KnowMe CareerForge — Classic Structured Table Template Style
3
+ * Style Tone: Structured Corporate (Table Grid Matrix)
4
+ * Inherits: src/templates/common/base.css
5
+ */
6
+
1
7
  :root {
2
- /* A4 绝对几何尺寸 */
3
- --resume-page-width: 210mm;
4
- --resume-page-min-height: 297mm;
8
+ /* === COMPONENT TOKENS (Overrides & Aliases) === */
5
9
  --resume-page-padding: 12mm 14mm;
6
10
 
7
- /* 配色系统 */
8
- --resume-color-primary: #0f172a; /* Slate 900 */
9
- --resume-color-secondary: #334155; /* Slate 700 */
10
- --resume-color-muted: #64748b; /* Slate 500 */
11
- --resume-color-accent: #1d4ed8; /* Blue 700 */
12
- --resume-color-border: #cbd5e1; /* Slate 300 稳重边框 */
13
- --resume-color-header-bg: #f8fafc; /* Slate 50 */
14
- --resume-color-label-bg: #f1f5f9; /* Slate 100 */
15
-
16
- /* 字阶系统 */
17
- --resume-font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
18
- --resume-font-size-title: 18pt;
11
+ /* Color Bindings */
12
+ --resume-color-primary: var(--primitive-color-slate-900);
13
+ --resume-color-secondary: var(--primitive-color-slate-700);
14
+ --resume-color-muted: var(--primitive-color-slate-500);
15
+ --resume-color-accent: var(--primitive-color-blue-700);
16
+ --resume-color-border: var(--primitive-color-slate-300);
17
+ --resume-color-header-bg: var(--primitive-color-slate-50);
18
+ --resume-color-label-bg: var(--primitive-color-slate-100);
19
+
20
+ /* Typography Bindings */
21
+ --resume-font-body: var(--primitive-font-sans);
22
+ --resume-font-size-title: var(--primitive-font-size-title);
19
23
  --resume-font-size-body: 9pt;
20
- --resume-font-size-meta: 8.5pt;
24
+ --resume-font-size-meta: var(--primitive-font-size-meta);
21
25
  --resume-line-height-body: 1.4;
22
26
 
23
- /* 单元格内边距 */
27
+ /* Cell & Spacing Tokens (Calibratable for Self-Healing) */
24
28
  --resume-cell-padding: 4.5pt 7pt;
25
- }
26
-
27
- * { box-sizing: border-box; margin: 0; padding: 0; }
28
-
29
- body {
30
- background-color: #e2e8f0;
31
- font-family: var(--resume-font-body);
32
- display: flex;
33
- justify-content: center;
34
- padding: 24px 0;
35
- color: var(--resume-color-primary);
36
- -webkit-font-smoothing: antialiased;
29
+ --resume-space-section: 6pt;
30
+ --resume-space-item: 4.5pt;
31
+ --resume-space-bullet: 2pt;
37
32
  }
38
33
 
39
34
  .resume-page {
40
- width: var(--resume-page-width);
41
- min-height: var(--resume-page-min-height);
42
- background: #ffffff;
43
35
  padding: var(--resume-page-padding);
44
- box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
45
- box-sizing: border-box;
46
36
  }
47
37
 
48
38
  .resume-header {
@@ -91,8 +81,16 @@ body {
91
81
  color: var(--resume-color-primary);
92
82
  }
93
83
 
84
+ .candidate-name {
85
+ font-weight: 700;
86
+ color: var(--resume-color-primary);
87
+ }
88
+
89
+ .job-target {
90
+ color: var(--resume-color-accent);
91
+ }
94
92
  .cell-highlight-bg {
95
- background-color: #eff6ff; /* Blue 50 */
93
+ background-color: var(--primitive-color-blue-50);
96
94
  color: var(--resume-color-accent);
97
95
  }
98
96
 
@@ -136,29 +134,12 @@ body {
136
134
  margin-left: 12pt;
137
135
  margin-top: 2pt;
138
136
  }
139
-
140
137
  .exp-bullets li {
141
- margin-bottom: 2pt;
138
+ margin-bottom: var(--resume-space-bullet);
139
+ line-height: var(--resume-line-height-body);
142
140
  }
143
-
144
141
  .project-desc {
145
142
  font-size: 8.5pt;
146
143
  color: var(--resume-color-secondary);
147
144
  line-height: 1.38;
148
145
  }
149
-
150
- @media print {
151
- body { background: transparent; padding: 0; }
152
- .resume-page {
153
- box-shadow: none;
154
- margin: 0;
155
- width: var(--resume-page-width);
156
- min-height: var(--resume-page-min-height);
157
- page-break-after: always;
158
- page-break-inside: avoid;
159
- }
160
- @page {
161
- size: A4 portrait;
162
- margin: 0;
163
- }
164
- }