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,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
+ }
@@ -0,0 +1,208 @@
1
+ /**
2
+ * KnowMe CareerForge — International Text Flow Template Style
3
+ * Style Tone: Neutral Slate & Charcoal (Anti-Discrimination Pure Text Flow)
4
+ * Inherits: src/templates/common/base.css
5
+ */
6
+
7
+ :root {
8
+ /* === COMPONENT TOKENS (Overrides & Aliases) === */
9
+ --resume-page-padding: 14mm 16mm;
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-slate-minimal);
16
+ --resume-color-accent-bg: var(--primitive-color-slate-100);
17
+ --resume-color-border: var(--primitive-color-slate-300);
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: 20pt;
23
+ --resume-font-size-target: 10.5pt;
24
+ --resume-font-size-h2: 11pt;
25
+ --resume-font-size-body: 9.2pt;
26
+ --resume-font-size-meta: 8.5pt;
27
+ --resume-line-height-body: 1.45;
28
+
29
+ /* Spacing Tokens (Calibratable for Self-Healing) */
30
+ --resume-space-header-bottom: 10pt;
31
+ --resume-space-section: 11pt;
32
+ --resume-space-item: 7.5pt;
33
+ --resume-space-bullet: 2.2pt;
34
+ }
35
+
36
+ .resume-page {
37
+ padding: var(--resume-page-padding);
38
+ }
39
+
40
+ /* Header 纯文字流居中排版 */
41
+ .resume-header {
42
+ border-bottom: 1px solid var(--resume-color-border);
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-primary);
52
+ margin: 0 0 3pt 0;
53
+ text-transform: uppercase;
54
+ letter-spacing: 1px;
55
+ }
56
+
57
+ .job-target {
58
+ font-size: var(--resume-font-size-target);
59
+ color: var(--resume-color-secondary);
60
+ font-weight: 600;
61
+ margin: 0 0 5pt 0;
62
+ }
63
+
64
+ .contact-grid {
65
+ display: flex;
66
+ flex-wrap: wrap;
67
+ justify-content: center;
68
+ align-items: center;
69
+ gap: 4pt 12pt;
70
+ font-size: var(--resume-font-size-meta);
71
+ color: var(--resume-color-muted);
72
+ }
73
+
74
+ .contact-item {
75
+ display: inline-flex;
76
+ align-items: center;
77
+ }
78
+
79
+ .value-prop {
80
+ font-size: var(--resume-font-size-body);
81
+ color: var(--resume-color-secondary);
82
+ line-height: var(--resume-line-height-body);
83
+ margin: 6pt auto 0 auto;
84
+ text-align: left;
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-primary);
96
+ border-bottom: 1px solid var(--resume-color-border);
97
+ padding-bottom: 2pt;
98
+ margin: 0 0 calc(var(--resume-space-item) * 0.75) 0;
99
+ text-transform: uppercase;
100
+ letter-spacing: 0.8px;
101
+ }
102
+
103
+ /* 技能模块 */
104
+ .skills-content {
105
+ display: flex;
106
+ flex-direction: column;
107
+ gap: 3.5pt;
108
+ }
109
+
110
+ .skill-row {
111
+ font-size: var(--resume-font-size-body);
112
+ line-height: var(--resume-line-height-body);
113
+ }
114
+
115
+ .skill-category {
116
+ font-weight: 700;
117
+ color: var(--resume-color-primary);
118
+ }
119
+
120
+ .skill-items {
121
+ color: var(--resume-color-secondary);
122
+ }
123
+
124
+ /* 条目通用样式 */
125
+ .experience-item,
126
+ .project-item,
127
+ .education-item {
128
+ margin-bottom: var(--resume-space-item);
129
+ }
130
+
131
+ .item-header {
132
+ display: flex;
133
+ justify-content: space-between;
134
+ align-items: baseline;
135
+ margin-bottom: 2pt;
136
+ }
137
+
138
+ .item-title-group {
139
+ display: flex;
140
+ align-items: center;
141
+ gap: 6pt;
142
+ flex-wrap: wrap;
143
+ }
144
+
145
+ .org-name,
146
+ .project-name {
147
+ font-weight: 700;
148
+ font-size: var(--resume-font-size-body);
149
+ color: var(--resume-color-primary);
150
+ }
151
+
152
+ .role-badge {
153
+ font-size: var(--resume-font-size-meta);
154
+ font-weight: 600;
155
+ color: var(--resume-color-secondary);
156
+ }
157
+
158
+ .date-range {
159
+ font-size: var(--resume-font-size-meta);
160
+ color: var(--resume-color-muted);
161
+ font-weight: 500;
162
+ }
163
+
164
+ .tech-stack-tags {
165
+ display: flex;
166
+ flex-wrap: wrap;
167
+ gap: 4pt;
168
+ margin: 2pt 0 3pt 0;
169
+ }
170
+
171
+ .tech-tag {
172
+ font-size: 7.5pt;
173
+ background-color: var(--resume-color-tag-bg);
174
+ color: var(--resume-color-secondary);
175
+ padding: 1pt 5pt;
176
+ border-radius: 2pt;
177
+ font-family: var(--primitive-font-mono);
178
+ }
179
+
180
+ .bullet-list {
181
+ margin: 0;
182
+ padding-left: 14pt;
183
+ color: var(--resume-color-secondary);
184
+ font-size: var(--resume-font-size-body);
185
+ line-height: var(--resume-line-height-body);
186
+ }
187
+
188
+ .bullet-list li {
189
+ margin-bottom: var(--resume-space-bullet);
190
+ }
191
+
192
+ .edu-detail {
193
+ font-size: var(--resume-font-size-meta);
194
+ color: var(--resume-color-secondary);
195
+ margin: 2pt 0 0 0;
196
+ }
197
+
198
+ .sidebar-section {
199
+ margin-bottom: var(--resume-space-section);
200
+ }
201
+
202
+ @media print {
203
+ .resume-page {
204
+ padding: var(--resume-page-padding);
205
+ page-break-after: always;
206
+ page-break-inside: avoid;
207
+ }
208
+ }
@@ -10,3 +10,12 @@
10
10
  - `--resume-space-section`: `11pt` (默认)
11
11
  - `--resume-font-size-body`: `9.2pt` (默认)
12
12
  - `--resume-space-item`: `7.5pt` (默认)
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-minimal">
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,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,53 +1,40 @@
1
+ /**
2
+ * KnowMe CareerForge — Minimal Tech Template Style
3
+ * Style Tone: Geek Minimal (Single-Column Flow)
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: 14mm 16mm;
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: #2563eb; /* Tech Blue 600 */
12
- --resume-color-accent-bg: #eff6ff; /* Blue 50 */
13
- --resume-color-border: #e2e8f0; /* Slate 200 */
14
- --resume-color-tag-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-name: 20pt;
19
- --resume-font-size-target: 10.5pt;
20
- --resume-font-size-h2: 12pt;
21
- --resume-font-size-body: 9.2pt;
22
- --resume-font-size-meta: 8.5pt;
23
- --resume-line-height-body: 1.45;
24
-
25
- /* 间距 Tokens (Agent 自愈关键参数) */
26
- --resume-space-header-bottom: 11pt;
27
- --resume-space-section: 11pt;
28
- --resume-space-item: 7.5pt;
29
- --resume-space-bullet: 2.5pt;
30
- }
31
-
32
- * { box-sizing: border-box; margin: 0; padding: 0; }
33
-
34
- body {
35
- background-color: #f1f5f9;
36
- font-family: var(--resume-font-body);
37
- color: var(--resume-color-primary);
38
- display: flex;
39
- justify-content: center;
40
- padding: 24px 0;
41
- -webkit-font-smoothing: antialiased;
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-600);
16
+ --resume-color-accent-bg: var(--primitive-color-blue-50);
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: var(--primitive-font-size-h2);
25
+ --resume-font-size-body: var(--primitive-font-size-body);
26
+ --resume-font-size-meta: var(--primitive-font-size-meta);
27
+ --resume-line-height-body: var(--primitive-line-height-normal);
28
+
29
+ /* Spacing Tokens (Calibratable for Self-Healing) */
30
+ --resume-space-header-bottom: var(--primitive-space-5);
31
+ --resume-space-section: var(--primitive-space-5);
32
+ --resume-space-item: var(--primitive-space-4);
33
+ --resume-space-bullet: var(--primitive-space-1);
42
34
  }
43
35
 
44
36
  .resume-page {
45
- width: var(--resume-page-width);
46
- min-height: var(--resume-page-min-height);
47
- background: #ffffff;
48
37
  padding: var(--resume-page-padding);
49
- box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
50
- box-sizing: border-box;
51
38
  }
52
39
 
53
40
  /* Header 模块 */
@@ -88,7 +75,31 @@ body {
88
75
  .contact-item {
89
76
  display: inline-flex;
90
77
  align-items: center;
78
+ gap: 2pt;
79
+ }
80
+
81
+ .contact-label {
82
+ color: var(--resume-color-muted);
83
+ font-weight: 500;
84
+ }
85
+
86
+ /* Tech stack tag row container */
87
+ .tech-stack-tags {
88
+ display: flex;
89
+ flex-wrap: wrap;
91
90
  gap: 3pt;
91
+ margin: 3pt 0 4pt;
92
+ }
93
+
94
+ /* Individual tech stack pill */
95
+ .tech-tag {
96
+ font-size: 7.5pt;
97
+ color: var(--resume-color-muted);
98
+ background: var(--resume-color-tag-bg);
99
+ padding: 1.5pt 4.5pt;
100
+ border-radius: 2pt;
101
+ white-space: nowrap;
102
+ line-height: 1.35;
92
103
  }
93
104
 
94
105
  /* Section 结构 */
@@ -173,17 +184,9 @@ body {
173
184
  border-radius: 3pt;
174
185
  }
175
186
 
176
- .date-range {
177
- font-size: var(--resume-font-size-meta);
178
- color: var(--resume-color-muted);
179
- font-variant-numeric: tabular-nums;
180
- }
181
-
182
187
  /* Bullet 清单 */
183
188
  .bullet-list {
184
- margin-left: 14pt;
185
189
  font-size: var(--resume-font-size-body);
186
- color: var(--resume-color-secondary);
187
190
  line-height: var(--resume-line-height-body);
188
191
  }
189
192
 
@@ -191,29 +194,8 @@ body {
191
194
  margin-bottom: var(--resume-space-bullet);
192
195
  }
193
196
 
194
- .bullet-list strong {
195
- color: var(--resume-color-primary);
196
- font-weight: 600;
197
- }
198
-
199
197
  .edu-detail {
200
198
  font-size: var(--resume-font-size-body);
201
199
  color: var(--resume-color-secondary);
202
200
  line-height: var(--resume-line-height-body);
203
201
  }
204
-
205
- @media print {
206
- body { background: transparent; padding: 0; }
207
- .resume-page {
208
- box-shadow: none;
209
- margin: 0;
210
- width: var(--resume-page-width);
211
- min-height: var(--resume-page-min-height);
212
- page-break-after: always;
213
- page-break-inside: avoid;
214
- }
215
- @page {
216
- size: A4 portrait;
217
- margin: 0;
218
- }
219
- }
@@ -10,3 +10,12 @@
10
10
  - `--resume-sidebar-width`: `32%` (默认)
11
11
  - `--resume-space-section`: `12pt` (默认)
12
12
  - `--resume-font-size-body`: `9.2pt` (默认)
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,15 @@
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-modern">
11
+ <aside class="resume-sidebar"><!-- resume:skills --></aside>
12
+ <main class="resume-main"><!-- resume:basics --><!-- resume:summary --><!-- resume:experience --><!-- resume:projects --><!-- resume:education --><!-- resume:certifications --></main>
13
+ </div>
14
+ </body>
15
+ </html>
@@ -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
+ }