knowme-careerforge-skill 0.0.7 → 0.0.8

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 (68) hide show
  1. package/AGENT.md +7 -6
  2. package/ARCHITECTURE.md +18 -15
  3. package/README.md +23 -15
  4. package/README.zh-CN.md +23 -15
  5. package/SKILL.md +26 -33
  6. package/agents/codex/knowme-careerforge.yaml +1 -1
  7. package/agents/opencode/skill.yaml +1 -1
  8. package/dist/cli/src/index.js +22 -14
  9. package/package.json +1 -1
  10. package/references/01-evidence-mining.md +80 -3
  11. package/references/02-career-goal.md +35 -15
  12. package/references/03-jd-analysis.md +10 -0
  13. package/references/04-template-selection.md +7 -2
  14. package/references/05-html-canvas-tokens.md +4 -2
  15. package/references/06-qa-and-rendering.md +39 -5
  16. package/references/07-artifact-contract.md +21 -7
  17. package/scripts/Agent.md +3 -3
  18. package/scripts/build/build-gallery.py +2 -1
  19. package/scripts/build/release.py +3 -2
  20. package/scripts/evidence/analyze-jd.py +49 -8
  21. package/scripts/evidence/extract-evidence.py +17 -391
  22. package/scripts/pipeline/forge.py +159 -85
  23. package/scripts/rendering/browser-engine.js +5 -1
  24. package/scripts/template/instantiate-resume.py +5 -3
  25. package/skill.json +1 -1
  26. package/src/knowledge/career/seniority-signals.json +1 -0
  27. package/src/knowledge/index.json +176 -2
  28. package/src/knowledge/resume/action-verbs.json +3 -2
  29. package/src/knowledge/resume/fab-model.json +5 -4
  30. package/src/knowledge/resume-schema.json +1 -1
  31. package/src/knowledge/templates.json +174 -0
  32. package/src/references/01-evidence-mining.md +80 -3
  33. package/src/references/02-career-goal.md +35 -15
  34. package/src/references/03-jd-analysis.md +10 -0
  35. package/src/references/04-template-selection.md +7 -2
  36. package/src/references/05-html-canvas-tokens.md +4 -2
  37. package/src/references/06-qa-and-rendering.md +39 -5
  38. package/src/references/07-artifact-contract.md +21 -7
  39. package/src/templates/academic-research/canvas.html +2 -1
  40. package/src/templates/classic/canvas.html +2 -1
  41. package/src/templates/classic/style.css +90 -28
  42. package/src/templates/common/base.css +19 -3
  43. package/src/templates/common/canvas-bindings.css +247 -12
  44. package/src/templates/compact-dense/style.css +5 -1
  45. package/src/templates/creative-tech/style.css +30 -1
  46. package/src/templates/data-analyst/style.css +31 -1
  47. package/src/templates/editorial/README.md +7 -0
  48. package/src/templates/editorial/canvas.html +22 -0
  49. package/src/templates/editorial/metadata.json +36 -0
  50. package/src/templates/editorial/sample-profile.json +86 -0
  51. package/src/templates/editorial/style.css +24 -0
  52. package/src/templates/executive/style.css +52 -18
  53. package/src/templates/graduate/README.md +7 -0
  54. package/src/templates/graduate/canvas.html +22 -0
  55. package/src/templates/graduate/metadata.json +38 -0
  56. package/src/templates/graduate/sample-profile.json +60 -0
  57. package/src/templates/graduate/style.css +24 -0
  58. package/src/templates/international-flow/canvas.html +2 -1
  59. package/src/templates/minimal/canvas.html +3 -2
  60. package/src/templates/minimal/style.css +6 -0
  61. package/src/templates/modern/style.css +43 -55
  62. package/src/templates/project-focus/README.md +7 -0
  63. package/src/templates/project-focus/canvas.html +22 -0
  64. package/src/templates/project-focus/metadata.json +36 -0
  65. package/src/templates/project-focus/sample-profile.json +93 -0
  66. package/src/templates/project-focus/style.css +24 -0
  67. package/src/templates/startup-generalist/canvas.html +2 -1
  68. package/src/templates/startup-generalist/style.css +15 -8
@@ -0,0 +1,36 @@
1
+ {
2
+ "id": "editorial",
3
+ "name": "Editorial · 经历叙事",
4
+ "version": "1.0.0",
5
+ "style": "single-column-editorial",
6
+ "roleCategory": "professional",
7
+ "description": "经历优先,左侧章节索引与右侧正文对齐;适合已有连续工作经历的候选人。",
8
+ "layout": {
9
+ "type": "single-column",
10
+ "targetPages": 1,
11
+ "maxPages": 1,
12
+ "density": "balanced"
13
+ },
14
+ "visualStyle": {
15
+ "tone": "editorial-readable",
16
+ "accentColor": "#254665",
17
+ "fontFamily": "System Sans-Serif"
18
+ },
19
+ "atsScoreTier": "tier-1-optimal",
20
+ "supportedRoles": [
21
+ "professional",
22
+ "consultant"
23
+ ],
24
+ "languages": [
25
+ "zh-CN",
26
+ "en-US"
27
+ ],
28
+ "customizableTokens": [
29
+ "--resume-font-size-body",
30
+ "--resume-line-height-body",
31
+ "--resume-space-section",
32
+ "--resume-space-item",
33
+ "--resume-space-bullet",
34
+ "--resume-color-accent"
35
+ ]
36
+ }
@@ -0,0 +1,86 @@
1
+ {
2
+ "language": "zh-CN",
3
+ "basics": {
4
+ "name": "示例候选人",
5
+ "title": "后端开发工程师",
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": "后端开发工程师",
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,24 @@
1
+ /* Component tokens; shared reading components live in common/canvas-bindings.css. */
2
+ :root {
3
+ --resume-page-padding: 14mm 16mm;
4
+ --resume-font-body: var(--primitive-font-sans);
5
+ --resume-font-size-name: 22pt;
6
+ --resume-font-size-target: 10.5pt;
7
+ --resume-font-size-h2: 11pt;
8
+ --resume-font-size-body: 9.2pt;
9
+ --resume-font-size-meta: 8.5pt;
10
+ --resume-line-height-body: 1.45;
11
+ --resume-space-header-bottom: 10pt;
12
+ --resume-space-section: 11pt;
13
+ --resume-space-item: 7pt;
14
+ --resume-space-bullet: 2pt;
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-600);
18
+ --resume-color-border: var(--primitive-color-slate-200);
19
+ --resume-color-tag-bg: var(--primitive-color-slate-50);
20
+ --resume-color-accent: #254665;
21
+ }
22
+ .canvas-editorial .resume-section { display: grid; grid-template-columns: 25mm minmax(0, 1fr); column-gap: 6mm; }
23
+ .canvas-editorial .resume-section > :not(.section-title) { grid-column: 2; }
24
+ .canvas-editorial .resume-section > .section-title { grid-column: 1; grid-row: 1 / span 20; }
@@ -41,36 +41,65 @@
41
41
  .executive-banner {
42
42
  background-color: var(--resume-color-banner-bg);
43
43
  color: var(--resume-color-banner-text);
44
- padding: 12mm 16mm 10mm 16mm;
45
- display: flex;
46
- justify-content: space-between;
47
- align-items: center;
44
+ padding: 10mm 16mm 8mm 16mm;
48
45
  border-bottom: 3.5px solid var(--resume-color-accent);
49
46
  }
50
47
 
51
- .banner-left {
52
- flex: 1;
48
+ .executive-banner .resume-header {
49
+ width: 100%;
50
+ display: grid;
51
+ grid-template-columns: 1fr auto;
52
+ grid-template-areas:
53
+ "name contacts"
54
+ "target contacts";
55
+ row-gap: 2pt;
56
+ column-gap: 16pt;
57
+ align-items: center;
53
58
  }
54
59
 
55
- .candidate-name {
60
+ .executive-banner .candidate-name, .candidate-name {
61
+ grid-area: name;
56
62
  font-size: var(--resume-font-size-name);
57
63
  font-weight: 800;
58
- letter-spacing: 1px;
64
+ letter-spacing: 0.5px;
65
+ color: #ffffff;
66
+ margin: 0;
59
67
  }
60
68
 
61
- .candidate-title {
62
- font-size: var(--resume-font-size-title);
69
+ .executive-banner .job-target, .candidate-title {
70
+ grid-area: target;
71
+ font-size: var(--resume-font-size-target);
63
72
  color: var(--primitive-color-sky-400);
64
73
  font-weight: 600;
65
- margin-top: 2pt;
74
+ margin: 0;
66
75
  }
67
76
 
68
- .value-prop {
77
+ .executive-banner .contact-grid {
78
+ grid-area: contacts;
79
+ display: flex;
80
+ flex-direction: column;
81
+ align-items: flex-end;
82
+ gap: 3pt;
69
83
  font-size: 8.5pt;
70
- color: var(--resume-color-banner-muted);
71
- margin-top: 4pt;
72
- max-width: 480pt;
73
- line-height: 1.4;
84
+ color: var(--resume-color-banner-muted, #cbd5e1);
85
+ margin: 0;
86
+ }
87
+
88
+ .executive-banner .contact-item {
89
+ display: inline-flex;
90
+ align-items: center;
91
+ color: inherit;
92
+ white-space: nowrap;
93
+ }
94
+
95
+ .banner-left {
96
+ flex: 1;
97
+ }
98
+
99
+ .value-prop {
100
+ font-size: 8.8pt;
101
+ color: var(--resume-color-secondary);
102
+ line-height: 1.45;
74
103
  }
75
104
 
76
105
  .banner-right {
@@ -81,7 +110,6 @@
81
110
  font-size: 8pt;
82
111
  color: var(--resume-color-banner-muted);
83
112
  }
84
-
85
113
  .badge-item {
86
114
  display: flex;
87
115
  align-items: center;
@@ -121,7 +149,7 @@
121
149
  gap: var(--resume-space-section);
122
150
  }
123
151
 
124
- .sub-title, .main-title {
152
+ .section-title, .sub-title, .main-title {
125
153
  font-size: 11pt;
126
154
  font-weight: 700;
127
155
  color: var(--resume-color-accent);
@@ -242,3 +270,9 @@
242
270
  .education-item {
243
271
  margin-bottom: var(--resume-space-item);
244
272
  }
273
+ .edu-detail {
274
+ font-size: var(--resume-font-size-body);
275
+ color: var(--resume-color-secondary);
276
+ line-height: var(--resume-line-height-body);
277
+ margin-top: 2pt;
278
+ }
@@ -0,0 +1,7 @@
1
+ # Graduate · 校园起点
2
+
3
+ 教育与项目优先,宽松单栏;适合应届生、实习申请和较少工作经历。
4
+
5
+ 单页 A4,正文默认 9.2pt。适用中等篇幅;长经历应先做内容取舍或另建显式分页,不能直接流出第二页。所有字段可缺省,空章节由正式绑定器省略。
6
+
7
+ 只维护 canvas.html;样例全部虚构。style.css 声明模板 Token,正文组件复用 common/canvas-bindings.css。画廊由正式实例化器构建,ATS 标签仅为设计意图。
@@ -0,0 +1,22 @@
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-reading canvas-graduate">
11
+ <main>
12
+ <!-- resume:basics -->
13
+ <!-- resume:summary -->
14
+ <!-- resume:education -->
15
+ <!-- resume:projects -->
16
+ <!-- resume:experience -->
17
+ <!-- resume:skills -->
18
+ <!-- resume:certifications -->
19
+ </main>
20
+ </div>
21
+ </body>
22
+ </html>
@@ -0,0 +1,38 @@
1
+ {
2
+ "id": "graduate",
3
+ "name": "Graduate · 校园起点",
4
+ "version": "1.0.0",
5
+ "style": "single-column-education-first",
6
+ "roleCategory": "early-career",
7
+ "description": "教育与项目优先,宽松单栏;适合应届生、实习申请和较少工作经历。",
8
+ "layout": {
9
+ "type": "single-column",
10
+ "targetPages": 1,
11
+ "maxPages": 1,
12
+ "density": "balanced"
13
+ },
14
+ "visualStyle": {
15
+ "tone": "editorial-readable",
16
+ "accentColor": "#0f766e",
17
+ "fontFamily": "System Sans-Serif"
18
+ },
19
+ "atsScoreTier": "tier-1-optimal",
20
+ "supportedRoles": [
21
+ "graduate",
22
+ "intern",
23
+ "应届",
24
+ "实习"
25
+ ],
26
+ "languages": [
27
+ "zh-CN",
28
+ "en-US"
29
+ ],
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,60 @@
1
+ {
2
+ "language": "zh-CN",
3
+ "basics": {
4
+ "name": "示例候选人",
5
+ "title": "软件开发实习生",
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
+ "projects": [
31
+ {
32
+ "name": "课程协作平台(虚构课程项目)",
33
+ "role": "课程项目成员",
34
+ "techStack": [
35
+ "TypeScript",
36
+ "Python",
37
+ "PostgreSQL"
38
+ ],
39
+ "startDate": "2024.01",
40
+ "endDate": "2024.10",
41
+ "bullets": [
42
+ {
43
+ "text": "实现任务分配、进度记录与报表导出,建立可复用的数据访问接口。"
44
+ },
45
+ {
46
+ "text": "补充自动化校验和部署说明,支持团队复现开发环境。"
47
+ }
48
+ ]
49
+ }
50
+ ],
51
+ "education": [
52
+ {
53
+ "institution": "示例大学(虚构)",
54
+ "degree": "学士",
55
+ "field": "计算机科学",
56
+ "startDate": "2022.09",
57
+ "endDate": "2026.06"
58
+ }
59
+ ]
60
+ }
@@ -0,0 +1,24 @@
1
+ /* Component tokens; shared reading components live in common/canvas-bindings.css. */
2
+ :root {
3
+ --resume-page-padding: 14mm 16mm;
4
+ --resume-font-body: var(--primitive-font-sans);
5
+ --resume-font-size-name: 22pt;
6
+ --resume-font-size-target: 10.5pt;
7
+ --resume-font-size-h2: 11pt;
8
+ --resume-font-size-body: 9.2pt;
9
+ --resume-font-size-meta: 8.5pt;
10
+ --resume-line-height-body: 1.45;
11
+ --resume-space-header-bottom: 10pt;
12
+ --resume-space-section: 11pt;
13
+ --resume-space-item: 7pt;
14
+ --resume-space-bullet: 2pt;
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-600);
18
+ --resume-color-border: var(--primitive-color-slate-200);
19
+ --resume-color-tag-bg: var(--primitive-color-slate-50);
20
+ --resume-color-accent: #0f766e;
21
+ }
22
+ .canvas-graduate .resume-header { border-top: 3pt solid var(--resume-color-accent); padding-top: 10pt; }
23
+ .canvas-graduate .section-title { border-bottom: 1px solid var(--resume-color-border); padding-bottom: 5pt; }
24
+ .canvas-graduate .edu-detail { font-size: 8.8pt; color: var(--resume-color-secondary); font-weight: 500; margin-top: 2pt; }
@@ -14,7 +14,8 @@
14
14
  <!-- resume:skills -->
15
15
  <!-- resume:experience -->
16
16
  <!-- resume:projects -->
17
- <!-- resume:education --><!-- resume:certifications -->
17
+ <!-- resume:education -->
18
+ <!-- resume:certifications -->
18
19
  </main>
19
20
  </div>
20
21
  </body>
@@ -11,10 +11,11 @@
11
11
  <main>
12
12
  <!-- resume:basics -->
13
13
  <!-- resume:summary -->
14
- <!-- resume:skills -->
15
14
  <!-- resume:experience -->
16
15
  <!-- resume:projects -->
17
- <!-- resume:education --><!-- resume:certifications -->
16
+ <!-- resume:skills -->
17
+ <!-- resume:education -->
18
+ <!-- resume:certifications -->
18
19
  </main>
19
20
  </div>
20
21
  </body>
@@ -199,3 +199,9 @@
199
199
  color: var(--resume-color-secondary);
200
200
  line-height: var(--resume-line-height-body);
201
201
  }
202
+ .value-prop {
203
+ font-size: var(--resume-font-size-body);
204
+ color: var(--resume-color-secondary);
205
+ line-height: var(--resume-line-height-body);
206
+ margin-bottom: 4pt;
207
+ }
@@ -51,25 +51,6 @@
51
51
  gap: 14pt;
52
52
  }
53
53
 
54
- .sidebar-avatar-wrapper {
55
- display: flex;
56
- justify-content: center;
57
- margin-bottom: 4pt;
58
- }
59
-
60
- .avatar-placeholder {
61
- width: 76pt;
62
- height: 98pt;
63
- border-radius: 4pt;
64
- background: rgba(255, 255, 255, 0.15);
65
- border: 1px dashed rgba(255, 255, 255, 0.4);
66
- display: flex;
67
- align-items: center;
68
- justify-content: center;
69
- font-size: 8.5pt;
70
- color: var(--resume-color-sidebar-muted);
71
- }
72
-
73
54
  .sidebar-title {
74
55
  font-size: 11pt;
75
56
  font-weight: 700;
@@ -94,37 +75,6 @@
94
75
  color: var(--resume-color-sidebar-muted);
95
76
  }
96
77
 
97
- .skill-meter-group {
98
- display: flex;
99
- flex-direction: column;
100
- gap: 6pt;
101
- }
102
-
103
- .skill-meter-item {
104
- font-size: 8pt;
105
- }
106
-
107
- .skill-meter-label {
108
- display: flex;
109
- justify-content: space-between;
110
- margin-bottom: 2pt;
111
- color: var(--resume-color-sidebar-text);
112
- }
113
-
114
- .meter-bar {
115
- width: 100%;
116
- height: 4pt;
117
- background: rgba(255, 255, 255, 0.2);
118
- border-radius: 2pt;
119
- overflow: hidden;
120
- }
121
-
122
- .meter-fill {
123
- height: 100%;
124
- background: var(--resume-color-sidebar-accent);
125
- border-radius: 2pt;
126
- }
127
-
128
78
  .sidebar-tags-list {
129
79
  list-style: none;
130
80
  font-size: 8.5pt;
@@ -141,10 +91,10 @@
141
91
  color: var(--resume-color-primary);
142
92
  }
143
93
 
144
- .main-header {
145
- margin-bottom: 12pt;
94
+ .main-header, .resume-header {
95
+ margin-bottom: 10pt;
146
96
  border-bottom: 2px solid var(--resume-color-border);
147
- padding-bottom: 8pt;
97
+ padding-bottom: 7pt;
148
98
  }
149
99
 
150
100
  .candidate-name {
@@ -161,6 +111,22 @@
161
111
  margin-top: 2pt;
162
112
  }
163
113
 
114
+ .contact-grid {
115
+ display: flex;
116
+ flex-wrap: wrap;
117
+ gap: 3pt 12pt;
118
+ margin-top: 4pt;
119
+ font-size: var(--resume-font-size-meta);
120
+ color: var(--resume-color-muted);
121
+ }
122
+
123
+ .contact-item {
124
+ display: inline-flex;
125
+ align-items: center;
126
+ gap: 2pt;
127
+ white-space: nowrap;
128
+ }
129
+
164
130
  .resume-section {
165
131
  margin-bottom: var(--resume-space-section);
166
132
  }
@@ -175,14 +141,28 @@
175
141
  margin-bottom: 6pt;
176
142
  }
177
143
 
178
- .title-bar {
144
+ .resume-main .section-title::before {
145
+ content: "";
179
146
  display: inline-block;
180
147
  width: 3.5pt;
181
148
  height: 11pt;
182
149
  background-color: var(--resume-color-accent);
183
150
  border-radius: 1pt;
151
+ margin-right: 2pt;
152
+ flex-shrink: 0;
153
+ }
154
+
155
+ .resume-sidebar .section-title::before {
156
+ display: none;
184
157
  }
185
158
 
159
+ .title-bar {
160
+ display: inline-block;
161
+ width: 3.5pt;
162
+ height: 11pt;
163
+ background-color: var(--resume-color-accent);
164
+ border-radius: 1pt;
165
+ }
186
166
  .timeline-item {
187
167
  margin-bottom: var(--resume-space-item);
188
168
  }
@@ -232,10 +212,18 @@
232
212
  margin-bottom: var(--resume-space-bullet);
233
213
  }
234
214
 
235
- .edu-desc {
215
+ .edu-desc, .edu-detail {
236
216
  font-size: var(--resume-font-size-body);
237
217
  color: var(--resume-color-secondary);
238
218
  line-height: var(--resume-line-height-body);
219
+ margin-top: 2pt;
220
+ }
221
+
222
+ .value-prop {
223
+ font-size: var(--resume-font-size-body);
224
+ color: var(--resume-color-secondary);
225
+ line-height: var(--resume-line-height-body);
226
+ margin-bottom: 6pt;
239
227
  }
240
228
 
241
229
  /* === GENERATED HTML COMPONENT CLASSES ===
@@ -0,0 +1,7 @@
1
+ # Project Focus · 项目实践
2
+
3
+ 项目优先,项目条目以细边线分隔;适合项目证据比工作履历更突出的候选人。
4
+
5
+ 单页 A4,正文默认 9.2pt。适用中等篇幅;长经历应先做内容取舍或另建显式分页,不能直接流出第二页。所有字段可缺省,空章节由正式绑定器省略。
6
+
7
+ 只维护 canvas.html;样例全部虚构。style.css 声明模板 Token,正文组件复用 common/canvas-bindings.css。画廊由正式实例化器构建,ATS 标签仅为设计意图。
@@ -0,0 +1,22 @@
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-reading canvas-project-focus">
11
+ <main>
12
+ <!-- resume:basics -->
13
+ <!-- resume:summary -->
14
+ <!-- resume:projects -->
15
+ <!-- resume:experience -->
16
+ <!-- resume:skills -->
17
+ <!-- resume:education -->
18
+ <!-- resume:certifications -->
19
+ </main>
20
+ </div>
21
+ </body>
22
+ </html>
@@ -0,0 +1,36 @@
1
+ {
2
+ "id": "project-focus",
3
+ "name": "Project Focus · 项目实践",
4
+ "version": "1.0.0",
5
+ "style": "single-column-project-first",
6
+ "roleCategory": "portfolio",
7
+ "description": "项目优先,项目条目以细边线分隔;适合项目证据比工作履历更突出的候选人。",
8
+ "layout": {
9
+ "type": "single-column",
10
+ "targetPages": 1,
11
+ "maxPages": 1,
12
+ "density": "balanced"
13
+ },
14
+ "visualStyle": {
15
+ "tone": "editorial-readable",
16
+ "accentColor": "#334155",
17
+ "fontFamily": "System Sans-Serif"
18
+ },
19
+ "atsScoreTier": "tier-1-optimal",
20
+ "supportedRoles": [
21
+ "project-engineer",
22
+ "portfolio"
23
+ ],
24
+ "languages": [
25
+ "zh-CN",
26
+ "en-US"
27
+ ],
28
+ "customizableTokens": [
29
+ "--resume-font-size-body",
30
+ "--resume-line-height-body",
31
+ "--resume-space-section",
32
+ "--resume-space-item",
33
+ "--resume-space-bullet",
34
+ "--resume-color-accent"
35
+ ]
36
+ }