amlei-skills 0.1.0
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.
- package/.claude-plugin/plugin.json +16 -0
- package/LICENSE +21 -0
- package/README.md +21 -0
- package/package.json +35 -0
- package/skills/academic-ref-retrieval/SKILL.md +103 -0
- package/skills/academic-ref-retrieval/resources/arxiv-api-example.py +42 -0
- package/skills/academic-ref-retrieval/resources/cnki-scraper-example.py +58 -0
- package/skills/amlei-git-gh/SKILL.md +156 -0
- package/skills/amlei-resume/SKILL.md +204 -0
- package/skills/amlei-resume/assets/preview-shell.html +438 -0
- package/skills/amlei-resume/assets/sample-preview.html +361 -0
- package/skills/amlei-resume/assets/sample-resume.md +57 -0
- package/skills/amlei-resume/references/export.md +76 -0
- package/skills/amlei-resume/references/icons.md +35 -0
- package/skills/amlei-resume/references/profile-evaluator.md +44 -0
- package/skills/amlei-resume/references/profile.md +43 -0
- package/skills/amlei-resume/references/projects.md +76 -0
- package/skills/amlei-resume/references/resume-evaluator.md +121 -0
- package/skills/amlei-resume/references/revise.md +11 -0
- package/skills/amlei-resume/references/themes/theme-academic.md +238 -0
- package/skills/amlei-resume/references/themes/theme-content-green.md +138 -0
- package/skills/amlei-resume/references/themes/theme-english-mnc.md +127 -0
- package/skills/amlei-resume/references/themes/theme-index.md +46 -0
- package/skills/amlei-resume/references/themes/theme-sidebar-creative.md +163 -0
- package/skills/amlei-resume/references/themes/theme-soe-formal.md +153 -0
- package/skills/amlei-resume/references/themes/theme-tech-dense.md +157 -0
- package/skills/amlei-resume/references/write.md +14 -0
- package/skills/amlei-resume/scripts/boss_zhipin.py +676 -0
- package/skills/amlei-resume/scripts/extract_avatar.py +157 -0
- package/skills/amlei-resume/scripts/profile.py +465 -0
- package/skills/amlei-resume/scripts/validate_resume.py +195 -0
- package/skills/amlei-resume/scripts/wrap_preview.py +104 -0
- package/skills/amlei-story-generator/SKILL.md +67 -0
- package/skills/amlei-story-generator/resources/narrative-craft.md +74 -0
- package/skills/amlei-story-generator/resources/rubric.md +28 -0
- package/skills/amlei-story-generator/resources/source-frameworks.md +89 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>张昀 · 简历 A4 预览</title>
|
|
7
|
+
<!--
|
|
8
|
+
主题无关的预览外壳(chrome):
|
|
9
|
+
· 顶部"导出 PDF"工具条(屏幕可见 / 打印隐藏)
|
|
10
|
+
· A4 舞台(.viewport/.doc-stage/.scaler/.page)+ 自动分页 JS
|
|
11
|
+
· 打印规则(每页严格 A4、工具条隐藏)
|
|
12
|
+
主题的视觉(设计令牌 + 组件 class 样式)由 wrap_preview.py 把
|
|
13
|
+
渲染产物里的 <style> 注入到下方的 <style>
|
|
14
|
+
:root{
|
|
15
|
+
--bg:oklch(94% .003 255);--paper:oklch(99.4% .002 255);--ink:oklch(19% .015 255);--muted:oklch(43% .012 255);
|
|
16
|
+
--faint:oklch(55% .010 255);--border:oklch(87% .008 255);--hair:oklch(90% .006 255);
|
|
17
|
+
--accent:oklch(33% .05 258);--accent-ink:oklch(26% .05 258);
|
|
18
|
+
--font-sans:'PingFang SC','HarmonyOS Sans SC','Microsoft YaHei','Hiragino Sans GB',-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;
|
|
19
|
+
--font-mono:'JetBrains Mono','SF Mono',ui-monospace,Menlo,Consolas,monospace;
|
|
20
|
+
}
|
|
21
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
22
|
+
body{background:var(--bg);color:var(--ink);font-family:var(--font-sans);font-size:12.5px;line-height:1.58;-webkit-font-smoothing:antialiased;font-feature-settings:'tnum' on;text-rendering:optimizeLegibility}
|
|
23
|
+
.resume-header{display:grid;grid-template-columns:1fr auto;gap:18px;align-items:center;padding-bottom:12px;border-bottom:1.5px solid var(--ink)}
|
|
24
|
+
.name-row{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
|
|
25
|
+
.name-row .name{font-weight:700;font-size:25px;letter-spacing:.04em}
|
|
26
|
+
.name-row .role{font-size:12px;font-weight:600;color:var(--accent-ink)}
|
|
27
|
+
.contact{margin-top:8px;font-family:var(--font-mono);font-size:10px;color:var(--muted)}
|
|
28
|
+
.contact .sep{color:var(--accent);margin:0 6px}
|
|
29
|
+
.contact a{color:var(--accent-ink);text-decoration:none}
|
|
30
|
+
.photo{width:26mm;height:36mm;border:1px solid var(--border);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;color:var(--faint);overflow:hidden}
|
|
31
|
+
.photo img{width:100%;height:100%;object-fit:cover;display:block}
|
|
32
|
+
.photo svg{width:26px;height:26px;opacity:.45}
|
|
33
|
+
.photo span{font-size:9px;letter-spacing:.1em}
|
|
34
|
+
.sec-head{display:flex;align-items:center;gap:9px;margin-top:15px;margin-bottom:8px}
|
|
35
|
+
.sec-head .ico{width:15px;height:15px;color:var(--accent);flex-shrink:0}
|
|
36
|
+
.sec-head h2{font-weight:700;font-size:12.5px;color:var(--ink);letter-spacing:.1em}
|
|
37
|
+
.sec-head h2 .en{font-weight:400;font-size:10px;color:var(--faint);letter-spacing:.12em;margin-left:6px}
|
|
38
|
+
.sec-head::after{content:"";flex:1;height:1px;background:var(--hair)}
|
|
39
|
+
.summary p{font-size:11.5px;line-height:1.75;text-align:justify;text-wrap:pretty}
|
|
40
|
+
.summary p b{color:var(--accent-ink);font-weight:600}
|
|
41
|
+
.interests{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
|
|
42
|
+
.interests .it{font-size:11px;color:var(--accent-ink);background:oklch(95% .01 258);border:1px solid var(--border);padding:2px 8px}
|
|
43
|
+
.entry{margin-bottom:8px}
|
|
44
|
+
.entry-main{display:grid;grid-template-columns:1fr auto;align-items:baseline;gap:14px}
|
|
45
|
+
.entry-title{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
|
|
46
|
+
.entry-title .org,.entry-title .proj{font-weight:700;font-size:12.5px}
|
|
47
|
+
.entry-title .role{font-size:11.5px;color:var(--accent-ink)}
|
|
48
|
+
.entry-date{font-family:var(--font-mono);font-size:10px;color:var(--faint);white-space:nowrap}
|
|
49
|
+
.entry-meta{margin-top:2px;font-size:10.5px;color:var(--muted);display:flex;gap:14px;flex-wrap:wrap}
|
|
50
|
+
.entry-meta b{color:var(--ink);font-weight:600}
|
|
51
|
+
.entry-list{list-style:none;margin-top:4px}
|
|
52
|
+
.entry-list li{position:relative;padding-left:13px;font-size:11px;line-height:1.62;color:var(--ink);margin-bottom:2px;text-align:justify;text-wrap:pretty}
|
|
53
|
+
.entry-list li::before{content:"•";position:absolute;left:1px;top:5px;color:var(--accent);font-size:10px;line-height:1}
|
|
54
|
+
.entry-list .num{font-family:var(--font-mono);color:var(--accent-ink);font-weight:600}
|
|
55
|
+
.pubs{list-style:none}
|
|
56
|
+
.pubs li{font-size:11px;line-height:1.6;padding:5px 0 5px 26px;border-bottom:1px dashed var(--hair);position:relative;text-align:justify;text-wrap:pretty}
|
|
57
|
+
.pubs li .tag{position:absolute;left:0;top:6px;font-family:var(--font-mono);font-size:9.5px;color:var(--accent-ink);font-weight:600}
|
|
58
|
+
.pubs li .ven{font-style:italic;color:var(--accent-ink)}
|
|
59
|
+
.pubs li .yr{font-family:var(--font-mono);color:var(--faint)}
|
|
60
|
+
.pubs li .me{text-decoration:underline;text-decoration-color:var(--accent);text-underline-offset:2px}
|
|
61
|
+
.awards{display:grid;grid-template-columns:1fr 1fr;gap:2px 22px}
|
|
62
|
+
.award{display:grid;grid-template-columns:42px 1fr auto;gap:8px;align-items:baseline;font-size:11px;padding:3px 0;border-bottom:1px dashed var(--hair)}
|
|
63
|
+
.award .yr{font-family:var(--font-mono);font-size:9.5px;color:var(--accent)}
|
|
64
|
+
.award .lvl{font-size:10px;color:var(--accent-ink);font-weight:600}
|
|
65
|
+
.skills-row{display:grid;grid-template-columns:84px 1fr;gap:12px;padding:4px 0;border-bottom:1px dashed var(--hair)}
|
|
66
|
+
.skills-row .cat{font-size:11px;font-weight:600;color:var(--muted)}
|
|
67
|
+
.skills-row .tags{font-size:11px;color:var(--ink)}
|
|
68
|
+
.skills-row .tags b{color:var(--accent-ink)}
|
|
69
|
+
</style> 槽位。
|
|
70
|
+
本文件不持有任何主题色 / 组件样式,换主题无需改这里。
|
|
71
|
+
-->
|
|
72
|
+
<style>
|
|
73
|
+
/* —— 工具条(chrome,用字面色,不依赖主题令牌)—— */
|
|
74
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
75
|
+
html{-webkit-text-size-adjust:100%}
|
|
76
|
+
body{
|
|
77
|
+
background:#e9ebef;
|
|
78
|
+
font-family:'PingFang SC','HarmonyOS Sans SC','Microsoft YaHei',-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;
|
|
79
|
+
color:#1b1f24;
|
|
80
|
+
-webkit-font-smoothing:antialiased;
|
|
81
|
+
}
|
|
82
|
+
.rv-toolbar{
|
|
83
|
+
position:sticky;top:0;z-index:99;
|
|
84
|
+
display:flex;align-items:center;justify-content:space-between;gap:12px;
|
|
85
|
+
padding:10px 18px;background:#fff;border-bottom:1px solid #d7dbe0;
|
|
86
|
+
box-shadow:0 1px 10px rgba(20,24,30,.05);
|
|
87
|
+
}
|
|
88
|
+
.rv-toolbar .rv-hint{font-size:12.5px;color:#5a6470;line-height:1.4}
|
|
89
|
+
.rv-toolbar .rv-hint b{color:#1b1f24}
|
|
90
|
+
.rv-toolbar .rv-actions{display:flex;align-items:center;gap:8px}
|
|
91
|
+
.rv-btn{
|
|
92
|
+
border:1px solid #d7dbe0;background:#fff;color:#1b1f24;
|
|
93
|
+
border-radius:8px;padding:8px 14px;font-size:13px;font-weight:600;
|
|
94
|
+
font-family:inherit;cursor:pointer;white-space:nowrap;line-height:1;
|
|
95
|
+
transition:background .15s,border-color .15s,transform .06s;
|
|
96
|
+
}
|
|
97
|
+
.rv-btn:hover{background:#eef1f4;border-color:#aab2bb}
|
|
98
|
+
.rv-btn:active{transform:translateY(1px)}
|
|
99
|
+
.rv-btn--primary{background:#2b5bd6;color:#fff;border-color:#2b5bd6}
|
|
100
|
+
.rv-btn--primary:hover{background:#234cba;border-color:#234cba}
|
|
101
|
+
.rv-toast{
|
|
102
|
+
position:fixed;top:60px;left:50%;transform:translateX(-50%);
|
|
103
|
+
background:#1b1f24;color:#fff;padding:10px 18px;border-radius:9px;
|
|
104
|
+
font-size:13px;font-weight:600;opacity:0;pointer-events:none;
|
|
105
|
+
transition:opacity .25s;z-index:100;box-shadow:0 6px 20px rgba(20,24,30,.25);
|
|
106
|
+
max-width:88vw;text-align:center;
|
|
107
|
+
}
|
|
108
|
+
.rv-toast.show{opacity:1}
|
|
109
|
+
|
|
110
|
+
/* —— A4 舞台结构(所有主题共用)—— */
|
|
111
|
+
.viewport{width:100%;overflow-x:auto;overflow-y:visible}
|
|
112
|
+
.doc-stage{position:relative;width:100%;margin:0 auto}
|
|
113
|
+
.scaler{
|
|
114
|
+
display:flex;flex-direction:column;align-items:center;gap:26px;
|
|
115
|
+
padding:30px 0;width:210mm;margin:0 auto;
|
|
116
|
+
transform:scale(var(--scale,1));transform-origin:top center;
|
|
117
|
+
}
|
|
118
|
+
.page{
|
|
119
|
+
width:210mm;height:297mm;background:#fff;position:relative;
|
|
120
|
+
overflow:hidden;flex-shrink:0;
|
|
121
|
+
box-shadow:0 1px 2px rgba(20,24,30,.05),0 18px 44px -22px rgba(20,24,30,.28);
|
|
122
|
+
}
|
|
123
|
+
.page-content{position:absolute;inset:0;padding:14mm 16mm 13mm}
|
|
124
|
+
.page-content>*:first-child{margin-top:0!important}
|
|
125
|
+
#source{position:absolute;left:-100000px;top:0;width:178mm;opacity:0;pointer-events:none}
|
|
126
|
+
|
|
127
|
+
/* —— 打印 / 导出 PDF —— */
|
|
128
|
+
@media print{
|
|
129
|
+
@page{size:A4;margin:0}
|
|
130
|
+
html,body{background:#fff!important}
|
|
131
|
+
.rv-toolbar,.rv-toast{display:none!important}
|
|
132
|
+
.viewport{overflow:visible!important}
|
|
133
|
+
.doc-stage{height:auto!important}
|
|
134
|
+
.scaler{transform:none!important;gap:0!important;padding:0!important;width:auto!important;display:block!important}
|
|
135
|
+
.page{width:210mm!important;height:297mm!important;box-shadow:none!important;page-break-after:always;break-after:page}
|
|
136
|
+
.page:last-child{page-break-after:auto;break-after:auto}
|
|
137
|
+
}
|
|
138
|
+
</style>
|
|
139
|
+
<style>
|
|
140
|
+
:root{
|
|
141
|
+
--bg:oklch(94% .003 255);--paper:oklch(99.4% .002 255);--ink:oklch(19% .015 255);--muted:oklch(43% .012 255);
|
|
142
|
+
--faint:oklch(55% .010 255);--border:oklch(87% .008 255);--hair:oklch(90% .006 255);
|
|
143
|
+
--accent:oklch(33% .05 258);--accent-ink:oklch(26% .05 258);
|
|
144
|
+
--font-sans:'PingFang SC','HarmonyOS Sans SC','Microsoft YaHei','Hiragino Sans GB',-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;
|
|
145
|
+
--font-mono:'JetBrains Mono','SF Mono',ui-monospace,Menlo,Consolas,monospace;
|
|
146
|
+
}
|
|
147
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
148
|
+
body{background:var(--bg);color:var(--ink);font-family:var(--font-sans);font-size:12.5px;line-height:1.58;-webkit-font-smoothing:antialiased;font-feature-settings:'tnum' on;text-rendering:optimizeLegibility}
|
|
149
|
+
.resume-header{display:grid;grid-template-columns:1fr auto;gap:18px;align-items:center;padding-bottom:12px;border-bottom:1.5px solid var(--ink)}
|
|
150
|
+
.name-row{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
|
|
151
|
+
.name-row .name{font-weight:700;font-size:25px;letter-spacing:.04em}
|
|
152
|
+
.name-row .role{font-size:12px;font-weight:600;color:var(--accent-ink)}
|
|
153
|
+
.contact{margin-top:8px;font-family:var(--font-mono);font-size:10px;color:var(--muted)}
|
|
154
|
+
.contact .sep{color:var(--accent);margin:0 6px}
|
|
155
|
+
.contact a{color:var(--accent-ink);text-decoration:none}
|
|
156
|
+
.photo{width:26mm;height:36mm;border:1px solid var(--border);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;color:var(--faint);overflow:hidden}
|
|
157
|
+
.photo img{width:100%;height:100%;object-fit:cover;display:block}
|
|
158
|
+
.photo svg{width:26px;height:26px;opacity:.45}
|
|
159
|
+
.photo span{font-size:9px;letter-spacing:.1em}
|
|
160
|
+
.sec-head{display:flex;align-items:center;gap:9px;margin-top:15px;margin-bottom:8px}
|
|
161
|
+
.sec-head .ico{width:15px;height:15px;color:var(--accent);flex-shrink:0}
|
|
162
|
+
.sec-head h2{font-weight:700;font-size:12.5px;color:var(--ink);letter-spacing:.1em}
|
|
163
|
+
.sec-head h2 .en{font-weight:400;font-size:10px;color:var(--faint);letter-spacing:.12em;margin-left:6px}
|
|
164
|
+
.sec-head::after{content:"";flex:1;height:1px;background:var(--hair)}
|
|
165
|
+
.summary p{font-size:11.5px;line-height:1.75;text-align:justify;text-wrap:pretty}
|
|
166
|
+
.summary p b{color:var(--accent-ink);font-weight:600}
|
|
167
|
+
.interests{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
|
|
168
|
+
.interests .it{font-size:11px;color:var(--accent-ink);background:oklch(95% .01 258);border:1px solid var(--border);padding:2px 8px}
|
|
169
|
+
.entry{margin-bottom:8px}
|
|
170
|
+
.entry-main{display:grid;grid-template-columns:1fr auto;align-items:baseline;gap:14px}
|
|
171
|
+
.entry-title{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
|
|
172
|
+
.entry-title .org,.entry-title .proj{font-weight:700;font-size:12.5px}
|
|
173
|
+
.entry-title .role{font-size:11.5px;color:var(--accent-ink)}
|
|
174
|
+
.entry-date{font-family:var(--font-mono);font-size:10px;color:var(--faint);white-space:nowrap}
|
|
175
|
+
.entry-meta{margin-top:2px;font-size:10.5px;color:var(--muted);display:flex;gap:14px;flex-wrap:wrap}
|
|
176
|
+
.entry-meta b{color:var(--ink);font-weight:600}
|
|
177
|
+
.entry-list{list-style:none;margin-top:4px}
|
|
178
|
+
.entry-list li{position:relative;padding-left:13px;font-size:11px;line-height:1.62;color:var(--ink);margin-bottom:2px;text-align:justify;text-wrap:pretty}
|
|
179
|
+
.entry-list li::before{content:"•";position:absolute;left:1px;top:5px;color:var(--accent);font-size:10px;line-height:1}
|
|
180
|
+
.entry-list .num{font-family:var(--font-mono);color:var(--accent-ink);font-weight:600}
|
|
181
|
+
.pubs{list-style:none}
|
|
182
|
+
.pubs li{font-size:11px;line-height:1.6;padding:5px 0 5px 26px;border-bottom:1px dashed var(--hair);position:relative;text-align:justify;text-wrap:pretty}
|
|
183
|
+
.pubs li .tag{position:absolute;left:0;top:6px;font-family:var(--font-mono);font-size:9.5px;color:var(--accent-ink);font-weight:600}
|
|
184
|
+
.pubs li .ven{font-style:italic;color:var(--accent-ink)}
|
|
185
|
+
.pubs li .yr{font-family:var(--font-mono);color:var(--faint)}
|
|
186
|
+
.pubs li .me{text-decoration:underline;text-decoration-color:var(--accent);text-underline-offset:2px}
|
|
187
|
+
.awards{display:grid;grid-template-columns:1fr 1fr;gap:2px 22px}
|
|
188
|
+
.award{display:grid;grid-template-columns:42px 1fr auto;gap:8px;align-items:baseline;font-size:11px;padding:3px 0;border-bottom:1px dashed var(--hair)}
|
|
189
|
+
.award .yr{font-family:var(--font-mono);font-size:9.5px;color:var(--accent)}
|
|
190
|
+
.award .lvl{font-size:10px;color:var(--accent-ink);font-weight:600}
|
|
191
|
+
.skills-row{display:grid;grid-template-columns:84px 1fr;gap:12px;padding:4px 0;border-bottom:1px dashed var(--hair)}
|
|
192
|
+
.skills-row .cat{font-size:11px;font-weight:600;color:var(--muted)}
|
|
193
|
+
.skills-row .tags{font-size:11px;color:var(--ink)}
|
|
194
|
+
.skills-row .tags b{color:var(--accent-ink)}
|
|
195
|
+
</style>
|
|
196
|
+
</head>
|
|
197
|
+
<body data-od-id="resume-preview">
|
|
198
|
+
|
|
199
|
+
<!-- 顶部工具条:屏幕可见,打印隐藏 -->
|
|
200
|
+
<div class="rv-toolbar">
|
|
201
|
+
<span class="rv-hint">👇 下方是 A4 简历效果 · 点右侧 <b>导出 PDF</b> 可直接打印或另存为 PDF</span>
|
|
202
|
+
<div class="rv-actions">
|
|
203
|
+
<button class="rv-btn" id="rvZoomOut" title="缩小查看">-</button>
|
|
204
|
+
<button class="rv-btn" id="rvZoomIn" title="放大查看">+</button>
|
|
205
|
+
<button class="rv-btn rv-btn--primary" id="rvPdfBtn" onclick="rvPrint()">📄 导出 PDF</button>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
<div class="rv-toast" id="rvToast"></div>
|
|
209
|
+
|
|
210
|
+
<!-- A4 舞台:分页 JS 把 #source 里的原子分配到各 .page -->
|
|
211
|
+
<div class="viewport" id="viewport"><div class="doc-stage" id="docStage"><div class="scaler" id="scaler"></div></div></div>
|
|
212
|
+
|
|
213
|
+
<!-- 简历正文原子(由 wrap_preview.py 注入;渲染器=LLM 按所选主题的组件库装配) -->
|
|
214
|
+
<div id="source">
|
|
215
|
+
<header class="resume-header">
|
|
216
|
+
<div class="ident">
|
|
217
|
+
<div class="name-row"><span class="name">张昀</span><span class="role">申请方向 · 计算机科学 直博(PhD)</span></div>
|
|
218
|
+
<div class="contact">男<span class="sep">·</span>北京<span class="sep">·</span>139-0108-2025<span class="sep">·</span>zhangyun@example.com<span class="sep">·</span><a href="https://yunzhang.io">yunzhang.io</a></div>
|
|
219
|
+
</div>
|
|
220
|
+
<div class="photo" aria-label="证件照占位"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8.5" r="3.5"/><path d="M5 20c0-3.6 3.1-6 7-6s7 2.4 7 6"/></svg><span>证件照</span></div>
|
|
221
|
+
</header>
|
|
222
|
+
|
|
223
|
+
<div class="sec-head" data-stick="1"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="3.4"/><path d="M5.5 19.5c0-3.3 2.9-6 6.5-6s6.5 2.7 6.5 6"/></svg><h2>个人简介<span class="en">Profile</span></h2></div>
|
|
224
|
+
<div class="summary"><p>清华大学计算机科学实验班(姚班)本科四年级,连续三年专业第 <b>1</b>。专注<b>大模型对齐与多模态学习</b>方向,以<b>共一 / 一作</b>发表 NeurIPS、CVPR 各一篇;曾在微软亚洲研究院(MSRA)实习,参与 RLHF 算法改进。希望加入顶尖科研团队攻读博士学位,在<b>可信大模型</b>方向做出系统性贡献。</p></div>
|
|
225
|
+
|
|
226
|
+
<div class="sec-head" data-stick="1"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18h6"/><path d="M10 21h4"/><path d="M12 3a6 6 0 0 0-4 10.5c.8.8 1.3 1.8 1.5 3h5c.2-1.2.7-2.2 1.5-3A6 6 0 0 0 12 3z"/></svg><h2>研究兴趣<span class="en">Research Interests</span></h2></div>
|
|
227
|
+
<div class="interests"><span class="it">大模型对齐与 RLHF</span><span class="it">多模态学习</span><span class="it">高效预训练</span><span class="it">检索增强生成</span></div>
|
|
228
|
+
|
|
229
|
+
<div class="sec-head" data-stick="1"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M2 9.5l10-4 10 4-10 4z"/><path d="M6 11.3v3.7c0 1.6 2.7 3 6 3s6-1.4 6-3v-3.7"/><path d="M22 9.5v4"/></svg><h2>教育背景<span class="en">Education</span></h2></div>
|
|
230
|
+
<div class="entry">
|
|
231
|
+
<div class="entry-main"><div class="entry-title"><span class="org">清华大学</span><span class="role">计算机科学实验班(姚班)· 本科</span></div><span class="entry-date">2022.09 — 2026.06</span></div>
|
|
232
|
+
<div class="entry-meta"><span>GPA <b>3.97 / 4.0</b></span><span>专业排名 <b>1 / 60</b></span><span>核心课:机器学习(97)· 深度学习(98)· 凸优化(96)</span></div>
|
|
233
|
+
</div>
|
|
234
|
+
|
|
235
|
+
<div class="sec-head" data-stick="1"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M9 3.5h6"/><path d="M10 3.5v5.5L5.5 17a2 2 0 0 0 1.8 3h9.4a2 2 0 0 0 1.8-3L14 9V3.5"/><path d="M7.8 14h8.4"/></svg><h2>科研经历<span class="en">Research Experience</span></h2></div>
|
|
236
|
+
<div class="entry">
|
|
237
|
+
<div class="entry-main"><div class="entry-title"><span class="org">微软亚洲研究院(MSRA)</span><span class="role">自然语言计算组 · 研究实习生</span></div><span class="entry-date">2025.04 — 2025.11</span></div>
|
|
238
|
+
<ul class="entry-list">
|
|
239
|
+
<li>提出基于过程奖励的 RLHF 改进算法,在数学推理任务上胜率较基线提升 <span class="num">9.2%</span>,成果投递 NeurIPS 2025。</li>
|
|
240
|
+
<li>构建 <span class="num">2 万</span>条高质量过程标注数据,开源内部评测基准被组内 <span class="num">3</span> 个项目复用。</li>
|
|
241
|
+
</ul>
|
|
242
|
+
</div>
|
|
243
|
+
<div class="entry">
|
|
244
|
+
<div class="entry-main"><div class="entry-title"><span class="org">清华大学交互式人工智能组</span><span class="role">本科科研助理 · 导师:Y 教授</span></div><span class="entry-date">2023.09 — 至今</span></div>
|
|
245
|
+
<ul class="entry-list">
|
|
246
|
+
<li>主导多模态检索增强框架设计与实验,论文被 CVPR 2024 Workshop 录用(一作)。</li>
|
|
247
|
+
</ul>
|
|
248
|
+
</div>
|
|
249
|
+
|
|
250
|
+
<div class="sec-head" data-stick="1"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M6.5 3.5h7l4 4v13a1 1 0 0 1-1 1H6.5a1 1 0 0 1-1-1V4.5a1 1 0 0 1 1-1z"/><path d="M13 3.5v4h4"/><path d="M8 13h8M8 16.5h5"/></svg><h2>论文发表<span class="en">Publications</span></h2></div>
|
|
251
|
+
<ul class="pubs">
|
|
252
|
+
<li><span class="tag">[C]</span> <span class="me">Yun Zhang*</span>, H. Li, X. Wang, et al. <b>Process-Reward RLHF for Faithful Mathematical Reasoning.</b> <span class="ven">Advances in Neural Information Processing Systems (NeurIPS)</span>, <span class="yr">2025.</span> (*共一)</li>
|
|
253
|
+
<li><span class="tag">[W]</span> <span class="me">Yun Zhang</span>, X. Wang. <b>Adaptive Multimodal Retrieval for Open-Domain VQA.</b> <span class="ven">CVPR Workshop on Vision-Language Models</span>, <span class="yr">2024.</span> (一作)</li>
|
|
254
|
+
</ul>
|
|
255
|
+
|
|
256
|
+
<div class="sec-head" data-stick="1"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="9" r="5"/><path d="M9 13.5l-2.2 6.5 5.2-3 5.2 3-2.2-6.5"/></svg><h2>荣誉与奖项<span class="en">Honors</span></h2></div>
|
|
257
|
+
<div class="awards">
|
|
258
|
+
<div class="award"><span class="yr">2024</span><span>国家奖学金</span><span class="lvl">国家级</span></div>
|
|
259
|
+
<div class="award"><span class="yr">2024</span><span>清华大学特等奖学金</span><span class="lvl">提名</span></div>
|
|
260
|
+
<div class="award"><span class="yr">2023</span><span>ACM-ICPC 亚洲区域赛</span><span class="lvl">金牌</span></div>
|
|
261
|
+
<div class="award"><span class="yr">2024</span><span>全国大学生数学竞赛</span><span class="lvl">一等奖</span></div>
|
|
262
|
+
<div class="award"><span class="yr">2023</span><span>清华大学优秀学生</span><span class="lvl">校级</span></div>
|
|
263
|
+
<div class="award"><span class="yr">2022</span><span>高考省理科前 10 / 姚班录取</span><span class="lvl">省级</span></div>
|
|
264
|
+
</div>
|
|
265
|
+
|
|
266
|
+
<div class="sec-head" data-stick="1"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M12 2.5v2.5M12 19v2.5M21.5 12H19M5 12H2.5M18.3 5.7l-1.7 1.7M7.4 16.6l-1.7 1.7M18.3 18.3l-1.7-1.7M7.4 7.4 5.7 5.7"/></svg><h2>技能与英语<span class="en">Skills</span></h2></div>
|
|
267
|
+
<div class="skills">
|
|
268
|
+
<div class="skills-row"><span class="cat">科研工具</span><span class="tags"><b>PyTorch</b> · <b>JAX</b> · HuggingFace · DeepSpeed · CUDA · <b>LaTeX</b> · Linux · Git</span></div>
|
|
269
|
+
<div class="skills-row"><span class="cat">编程语言</span><span class="tags">Python · C++ · Julia · SQL</span></div>
|
|
270
|
+
<div class="skills-row"><span class="cat">英语</span><span class="tags">TOEFL <b>112</b>(口语 26)· GRE <b>328</b>(V158 Q170)· 可全英文科研交流</span></div>
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
|
|
274
|
+
<script>
|
|
275
|
+
var rvUserScale=1;
|
|
276
|
+
function rvShowToast(msg){
|
|
277
|
+
var t=document.getElementById('rvToast');
|
|
278
|
+
t.textContent=msg;t.classList.add('show');
|
|
279
|
+
clearTimeout(t._timer);t._timer=setTimeout(function(){t.classList.remove('show');},2600);
|
|
280
|
+
}
|
|
281
|
+
function rvPrint(){
|
|
282
|
+
rvShowToast('在弹出的打印窗口里选"另存为 PDF"即可导出 A4 简历');
|
|
283
|
+
setTimeout(function(){ window.print(); },120);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* ============================================================
|
|
287
|
+
A4 自动分页:测量 #source 每个原子高度,按可用内容高分配页。
|
|
288
|
+
data-stick="1" 的 sec-head 不会和紧随其后的条目被拆到两页。
|
|
289
|
+
============================================================ */
|
|
290
|
+
(function(){
|
|
291
|
+
var PX_PER_MM=96/25.4,PAGE_H_MM=297,PAD_TOP_MM=14,PAD_BOTTOM_MM=13;
|
|
292
|
+
var CONTENT_H_PX=(PAGE_H_MM-PAD_TOP_MM-PAD_BOTTOM_MM)*PX_PER_MM;
|
|
293
|
+
var GAP_PX=26,PAD_STAGE_PX=30;
|
|
294
|
+
var source=document.getElementById('source'),
|
|
295
|
+
scaler=document.getElementById('scaler'),
|
|
296
|
+
docStage=document.getElementById('docStage'),
|
|
297
|
+
viewport=document.getElementById('viewport');
|
|
298
|
+
function collect(){
|
|
299
|
+
return Array.prototype.slice.call(source.children).filter(function(el){
|
|
300
|
+
return el.nodeType===1;
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
function candidate(){
|
|
304
|
+
var el=source.querySelector('.name-row .name')||source.querySelector('h1')||source.querySelector('h2');
|
|
305
|
+
return (el?el.textContent.trim():'简历')+' · 简历';
|
|
306
|
+
}
|
|
307
|
+
function outerHeight(el){
|
|
308
|
+
var st=getComputedStyle(el);
|
|
309
|
+
return el.offsetHeight+parseFloat(st.marginTop||0)+parseFloat(st.marginBottom||0);
|
|
310
|
+
}
|
|
311
|
+
function distribute(atoms){
|
|
312
|
+
var heights=atoms.map(outerHeight),pages=[[]],used=0;
|
|
313
|
+
for(var i=0;i<atoms.length;i++){
|
|
314
|
+
var h=heights[i],
|
|
315
|
+
stick=atoms[i].getAttribute && atoms[i].getAttribute('data-stick')==='1',
|
|
316
|
+
nextH=(i+1<atoms.length)?heights[i+1]:0,
|
|
317
|
+
placeOnNew=false;
|
|
318
|
+
if(used!==0){
|
|
319
|
+
if(used+h>CONTENT_H_PX) placeOnNew=true;
|
|
320
|
+
else if(stick && nextH>0 && (used+h+nextH>CONTENT_H_PX)) placeOnNew=true;
|
|
321
|
+
}
|
|
322
|
+
if(placeOnNew){pages.push([]);used=0;}
|
|
323
|
+
pages[pages.length-1].push(i);used+=h;
|
|
324
|
+
}
|
|
325
|
+
return pages;
|
|
326
|
+
}
|
|
327
|
+
function makePage(){
|
|
328
|
+
var p=document.createElement('section');p.className='page';
|
|
329
|
+
p.innerHTML='<div class="page-content"></div>';return p;
|
|
330
|
+
}
|
|
331
|
+
function render(){
|
|
332
|
+
var atoms=collect(); if(!atoms.length){fitScale();return;}
|
|
333
|
+
var pages=distribute(atoms);
|
|
334
|
+
scaler.innerHTML='';
|
|
335
|
+
pages.forEach(function(idxs){
|
|
336
|
+
var page=makePage(),content=page.querySelector('.page-content');
|
|
337
|
+
idxs.forEach(function(i){content.appendChild(atoms[i].cloneNode(true));});
|
|
338
|
+
scaler.appendChild(page);
|
|
339
|
+
});
|
|
340
|
+
fitScale();
|
|
341
|
+
}
|
|
342
|
+
function fitScale(){
|
|
343
|
+
var pageWPx=210*PX_PER_MM,s=Math.min(1,viewport.clientWidth/pageWPx)*rvUserScale;
|
|
344
|
+
scaler.style.setProperty('--scale',s);
|
|
345
|
+
var n=scaler.querySelectorAll('.page').length,
|
|
346
|
+
fullH=PAD_STAGE_PX*2+n*(297*PX_PER_MM)+Math.max(0,n-1)*GAP_PX;
|
|
347
|
+
docStage.style.height=(fullH*s)+'px';
|
|
348
|
+
}
|
|
349
|
+
function init(){render();try{document.title=candidate();}catch(e){}}
|
|
350
|
+
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init);else init();
|
|
351
|
+
if(document.fonts&&document.fonts.ready)document.fonts.ready.then(render);
|
|
352
|
+
window.addEventListener('load',render);
|
|
353
|
+
window.addEventListener('resize',fitScale);
|
|
354
|
+
document.getElementById('rvZoomIn').addEventListener('click',function(){
|
|
355
|
+
rvUserScale=Math.min(2,+(rvUserScale+0.1).toFixed(2));fitScale();});
|
|
356
|
+
document.getElementById('rvZoomOut').addEventListener('click',function(){
|
|
357
|
+
rvUserScale=Math.max(0.5,+(rvUserScale-0.1).toFixed(2));fitScale();});
|
|
358
|
+
})();
|
|
359
|
+
</script>
|
|
360
|
+
</body>
|
|
361
|
+
</html>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# self-intro
|
|
2
|
+
|
|
3
|
+
name: 张昀
|
|
4
|
+
role: 申请方向 · 计算机科学 直博(PhD)
|
|
5
|
+
gender: 男
|
|
6
|
+
location: 北京
|
|
7
|
+
phone: 139-0108-2025
|
|
8
|
+
email: zhangyun@example.com
|
|
9
|
+
site: yunzhang.io
|
|
10
|
+
avatar:
|
|
11
|
+
|
|
12
|
+
# 教育背景
|
|
13
|
+
|
|
14
|
+
## 清华大学 | 计算机科学实验班(姚班)· 本科
|
|
15
|
+
date: 2022.09 — 2026.06
|
|
16
|
+
meta: GPA 3.97/4.0 · 专业排名 1/60 · 核心课:机器学习(97)、深度学习(98)、凸优化(96)
|
|
17
|
+
|
|
18
|
+
# 技能与英语
|
|
19
|
+
|
|
20
|
+
科研工具: **PyTorch** · **JAX** · HuggingFace · DeepSpeed · CUDA · **LaTeX** · Linux · Git
|
|
21
|
+
编程语言: Python · C++ · Julia · SQL
|
|
22
|
+
英语: TOEFL **112**(口语 26)· GRE **328**(V158 Q170)· 可全英文科研交流
|
|
23
|
+
|
|
24
|
+
# 科研经历
|
|
25
|
+
|
|
26
|
+
## 微软亚洲研究院(MSRA) | 自然语言计算组 · 研究实习生
|
|
27
|
+
date: 2025.04 — 2025.11
|
|
28
|
+
|
|
29
|
+
- 提出基于过程奖励的 RLHF 改进算法,在数学推理任务上胜率较基线提升 9.2%,成果投递 NeurIPS 2025。
|
|
30
|
+
- 构建 2 万条高质量过程标注数据,开源内部评测基准被组内 3 个项目复用。
|
|
31
|
+
|
|
32
|
+
## 清华大学交互式人工智能组 | 本科科研助理 · 导师:Y 教授
|
|
33
|
+
date: 2023.09 — 至今
|
|
34
|
+
|
|
35
|
+
- 主导多模态检索增强框架设计与实验,论文被 CVPR 2024 Workshop 录用(一作)。
|
|
36
|
+
|
|
37
|
+
# 论文发表
|
|
38
|
+
|
|
39
|
+
[C] Yun Zhang*, H. Li, X. Wang, et al. **Process-Reward RLHF for Faithful Mathematical Reasoning.** *Advances in Neural Information Processing Systems (NeurIPS)*, 2025. (*共一)
|
|
40
|
+
[W] Yun Zhang, X. Wang. **Adaptive Multimodal Retrieval for Open-Domain VQA.** *CVPR Workshop on Vision-Language Models*, 2024. (一作)
|
|
41
|
+
|
|
42
|
+
# 荣誉与奖项
|
|
43
|
+
|
|
44
|
+
2024 | 国家奖学金 | 国家级
|
|
45
|
+
2024 | 清华大学特等奖学金 | 提名
|
|
46
|
+
2023 | ACM-ICPC 亚洲区域赛 | 金牌
|
|
47
|
+
2024 | 全国大学生数学竞赛 | 一等奖
|
|
48
|
+
2023 | 清华大学优秀学生 | 校级
|
|
49
|
+
2022 | 高考省理科前 10 / 姚班录取 | 省级
|
|
50
|
+
|
|
51
|
+
# 研究兴趣
|
|
52
|
+
|
|
53
|
+
大模型对齐与 RLHF, 多模态学习, 高效预训练, 检索增强生成
|
|
54
|
+
|
|
55
|
+
# 个人简介
|
|
56
|
+
|
|
57
|
+
清华大学计算机科学实验班(姚班)本科四年级,连续三年专业第 1。专注**大模型对齐与多模态学习**方向,以**共一 / 一作**发表 NeurIPS、CVPR 各一篇;曾在微软亚洲研究院(MSRA)实习,参与 RLHF 算法改进。希望加入顶尖科研团队攻读博士学位,在**可信大模型**方向做出系统性贡献。
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# 预览与导出
|
|
2
|
+
|
|
3
|
+
用户要求导出 PDF 时执行。先校验格式,再装配 HTML。
|
|
4
|
+
|
|
5
|
+
## 产物目录
|
|
6
|
+
|
|
7
|
+
所有产物归集到 `resume/{姓名}/{求职岗位}/`——相对引用不会断、换岗位/换照片互不干扰。
|
|
8
|
+
|
|
9
|
+
## 校验
|
|
10
|
+
|
|
11
|
+
用 `scripts/validate_resume.py <简历.md>` 校验,ERROR 清零才算通过。校验不过不往下走。校验项:self-intro 首模块 / name 必填 / 教育背景 / 标题层级 / 空模块 / date 格式。
|
|
12
|
+
|
|
13
|
+
## 选主题
|
|
14
|
+
|
|
15
|
+
读 [themes/theme-index.md](themes/theme-index.md),据目标岗位 / 行业推荐最契合的主题:
|
|
16
|
+
- 用户已指定主题 → 直接用。
|
|
17
|
+
- 岗位有明确契合 → 推荐 + 1~2 个备选让用户选。
|
|
18
|
+
- 无明显倾向 → 默认 `academic`。
|
|
19
|
+
- `sidebar-creative` 是双栏单页,内容多不要选。
|
|
20
|
+
|
|
21
|
+
## 读组件库
|
|
22
|
+
|
|
23
|
+
读所选主题的 `references/theme-{标识}.md` + 共用的 [icons.md](icons.md)(按模块语义选 SVG 图标)。**装配 HTML 一律从所选主题的组件库取,不凭记忆手写。**
|
|
24
|
+
|
|
25
|
+
## 装配 HTML
|
|
26
|
+
|
|
27
|
+
按主题库的简历骨架装配:主题 `<style>`(整段照抄)放最前,再依次:
|
|
28
|
+
|
|
29
|
+
1. `# self-intro` → **Header** 组件(name/role/education/contact/photo;不渲染成 SectionHead)。`education:` 字段单独一行 `.edu-line`,子项用 ` · ` 拼接(如「学校 · 专业 · 学历 · 届」),不在 contact 行混排。
|
|
30
|
+
2. 每个 `# 模块` → **SectionHead**(icon 按 icons.md 选,`data-stick="1"` 必带)+ 模块正文组件。
|
|
31
|
+
3. `## 机构 | 角色` → **Entry**(加 `data-stick="1"`,防末尾孤立);
|
|
32
|
+
`- bullet` → 每条拆成独立 **Bullet** 原子(不再包在 Entry 内)。
|
|
33
|
+
`##` 下的描述段(项目说明文字)→ `<p class="desc">` **放在 Entry 内**(与 header 同原子),不单独置于外部。
|
|
34
|
+
4. 行内强调:`**词**` → 强调字色;关键数字 → 等宽强调(如 `<span class="num">`)。
|
|
35
|
+
|
|
36
|
+
产物 = `<style>…</style>` + 各原子,**不要**包 `<!DOCTYPE>/<html>/<head>/<body>`(预览壳负责)。
|
|
37
|
+
|
|
38
|
+
## 装配后审查
|
|
39
|
+
|
|
40
|
+
读取产物 HTML 和 `简历.md`,逐模块对比结构、模块标题、bullet 内容,确认无遗漏、无顺序错乱。发现缺失回「装配 HTML」修复,通过才走下一步。
|
|
41
|
+
|
|
42
|
+
## 套预览壳
|
|
43
|
+
|
|
44
|
+
用 `scripts/wrap_preview.py`(`--help` 看参数)。产出 `resume/{姓名}/{求职岗位}/预览.html`(自动建目录,带「导出 PDF」工具条 + A4 自动分页),`document.title` = `姓名-岗位`(=「另存为 PDF」默认文件名);用 `--name` 覆盖。
|
|
45
|
+
|
|
46
|
+
**预览后检查**:
|
|
47
|
+
|
|
48
|
+
1. **打开浏览器预览页**(可用 Playwright 自动化检查)。
|
|
49
|
+
2. **确认 bullet 已原子化**:`#source` 里每一条 `- bullet` 是独立 `.bullet` 原子,而非包在 `<ul>` 内。若未拆分,先拆再继续。
|
|
50
|
+
3. **检查页数**:Playwright 统计 `#scaler .page` 个数和每页填充率。参考标准:
|
|
51
|
+
- 应届/初级:≤ 2 页
|
|
52
|
+
- 有经验/资深:≤ 3 页
|
|
53
|
+
4. **检查末页填充率**:
|
|
54
|
+
- ≥ 50% → 合理
|
|
55
|
+
- 30–50% → 可接受
|
|
56
|
+
- < 30% → 精简 bullet 内容重装(不调 spacing)
|
|
57
|
+
5. **检查行尾空白**(逐条 bullet 扫描):单行 bullet `getClientRects()` 填充率 < 55% 视为过短,合并相邻短 bullet 或补全内容后重装。
|
|
58
|
+
|
|
59
|
+
参考产物:[sample-preview.html](../assets/sample-preview.html)(academic 主题渲染 sample-resume.md)。
|
|
60
|
+
|
|
61
|
+
## 配色方案
|
|
62
|
+
|
|
63
|
+
预览页工具条「配色」下拉:8 套点缀色(墨蓝 / 工程蓝 / 森林绿 / 酒红 / 藏青 / 紫 / 琥珀 / 石墨黑)+「主题原色」。选择记在 localStorage,「导出 PDF」沿用——同一份简历可出多套配色。
|
|
64
|
+
|
|
65
|
+
## A4 与 PDF 导出
|
|
66
|
+
|
|
67
|
+
- 分页自动:内容超出 A4 自动溢出。
|
|
68
|
+
- 「导出 PDF」走浏览器原生打印:工具条自动隐藏,输出像素级 A4。
|
|
69
|
+
|
|
70
|
+
## 视觉红线
|
|
71
|
+
|
|
72
|
+
- **不做报刊排版**:无首字下沉、无报头巨标题;姓名 ≈24–26px。
|
|
73
|
+
- **单点缀色**:一个 `--accent` + 同色系强调字色。
|
|
74
|
+
- **默认单栏**;sidebar-creative 用侧栏双栏。
|
|
75
|
+
- **可扫描层级**:SectionHead 用发丝线;经历条目三段对齐;bullet 用 `•`。
|
|
76
|
+
- **量化成就**:经历 bullet 带数字结果,关键数字用强调样式。
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# SVG 图标库(所有主题共用)
|
|
2
|
+
|
|
3
|
+
> 简历模块标题(SectionHead)左侧的小图标。**全部 24×24、`fill="none" stroke="currentColor" stroke-width="1.6"` 描边风格**,靠 `color` 继承主题 `--accent`,所以换主题不用换图标。
|
|
4
|
+
>
|
|
5
|
+
> **怎么选**:按**模块的语义**(不是标题里的字)从下表挑一个;中英文关键词任一命中即用。拿不准就用末尾的默认图标 `star`。图标整段 `<svg class="ico" …>…</svg>` 原样贴进 SectionHead 的 `{{icon}}` 槽位。
|
|
6
|
+
|
|
7
|
+
## 图标 → 语义对照
|
|
8
|
+
|
|
9
|
+
| 语义 | 关键词(命中即用) | SVG(贴进 `<svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">…</svg>` 的内部) |
|
|
10
|
+
|------|------|-----|
|
|
11
|
+
| 个人简介 / 自我介绍 | 简介 / 个人简介 / profile / about / summary / 自我评价 | `<circle cx="12" cy="8" r="3.4"/><path d="M5.5 19.5c0-3.3 2.9-6 6.5-6s6.5 2.7 6.5 6"/>` |
|
|
12
|
+
| 教育 / 学历 | 教育 / 学历 / education / 学校 / 学习 | `<path d="M2 9.5l10-4 10 4-10 4z"/><path d="M6 11.3v3.7c0 1.6 2.7 3 6 3s6-1.4 6-3v-3.7"/><path d="M22 9.5v4"/>` |
|
|
13
|
+
| 实习 / 工作 / 经历 | 实习 / 工作 / 职业 / 经历 / experience / intern / career / work | `<rect x="3" y="7.5" width="18" height="12.5" rx="1.6"/><path d="M9 7.5V6a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v1.5"/><path d="M3 12.5h18"/>` |
|
|
14
|
+
| 科研 / 研究 | 科研 / 研究 / research / 课题 | `<path d="M9 3.5h6"/><path d="M10 3.5v5.5L5.5 17a2 2 0 0 0 1.8 3h9.4a2 2 0 0 0 1.8-3L14 9V3.5"/><path d="M7.8 14h8.4"/>` |
|
|
15
|
+
| 项目 / 工程 | 项目 / 工程 / project / 开源 | `<path d="M8.5 7.5l-4.5 4.5 4.5 4.5"/><path d="M15.5 7.5l4.5 4.5-4.5 4.5"/>` |
|
|
16
|
+
| 技能 / 技术栈 | 技能 / 技术栈 / 技术 / skill / stack / tech | `<circle cx="12" cy="12" r="3"/><path d="M12 2.5v2.5M12 19v2.5M21.5 12H19M5 12H2.5M18.3 5.7l-1.7 1.7M7.4 16.6l-1.7 1.7M18.3 18.3l-1.7-1.7M7.4 7.4 5.7 5.7"/>` |
|
|
17
|
+
| 论文 / 发表 | 论文 / 发表 / 著作 / publication / paper | `<path d="M6.5 3.5h7l4 4v13a1 1 0 0 1-1 1H6.5a1 1 0 0 1-1-1V4.5a1 1 0 0 1 1-1z"/><path d="M13 3.5v4h4"/><path d="M8 13h8M8 16.5h5"/>` |
|
|
18
|
+
| 获奖 / 荣誉 | 获奖 / 荣誉 / 奖学金 / award / honor | `<circle cx="12" cy="9" r="5"/><path d="M9 13.5l-2.2 6.5 5.2-3 5.2 3-2.2-6.5"/>` |
|
|
19
|
+
| 证书 / 资质 | 证书 / 资格 / 资质 / certificate / cert / 执业 | `<circle cx="12" cy="9" r="5"/><path d="M8.5 13l-1.5 6 5-2.2 5 2.2-1.5-6"/>` |
|
|
20
|
+
| 兴趣 / 方向 | 兴趣 / 研究方向 / 爱好 / interest | `<path d="M9 18h6"/><path d="M10 21h4"/><path d="M12 3a6 6 0 0 0-4 10.5c.8.8 1.3 1.8 1.5 3h5c.2-1.2.7-2.2 1.5-3A6 6 0 0 0 12 3z"/>` |
|
|
21
|
+
| 自我评价(引号) | 自我评价 / 评价 / 寄语 | `<path d="M7 7h4v6c0 2-1.5 3.5-4 4M13 7h4v6c0 2-1.5 3.5-4 4"/>` |
|
|
22
|
+
| 默认(无匹配) | —— | `<path d="M12 3l2.6 5.6 6.1.7-4.5 4.2 1.2 6L12 16.8 6.6 19.5l1.2-6L3.3 9.3l6.1-.7z"/>` |
|
|
23
|
+
|
|
24
|
+
## 证件照占位图标(Header 用,无真实头像时)
|
|
25
|
+
|
|
26
|
+
贴进 Header 的 `{{photo}}` 槽位(不带真实照片时):
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<div class="photo" aria-label="证件照占位">
|
|
30
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8.5" r="3.5"/><path d="M5 20c0-3.6 3.1-6 7-6s7 2.4 7 6"/></svg>
|
|
31
|
+
<span>证件照</span>
|
|
32
|
+
</div>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
> 有真实头像时改成 `<div class="photo"><img src="{{avatar}}" alt="证件照"></div>`(路径来自 `self-intro` 的 `avatar:` 字段)。
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# profile 评估 agent
|
|
2
|
+
|
|
3
|
+
> 独立判断"一条新的个人信息值不值得写进 `profile.json`"的评估者。**只评估、给结论、不写入**。独立上下文,避免用户/主 agent 自评偏袒。
|
|
4
|
+
>
|
|
5
|
+
> 本文件只定义它的**角色、输入、评估标准、输出格式**——平台无关。主流程(SKILL「个人资料」一节)负责用当前环境的方式起这个独立 agent、传输入、拿结论。
|
|
6
|
+
|
|
7
|
+
## 角色
|
|
8
|
+
|
|
9
|
+
你是用户个人资料的**守门评估者**。用户每次补充新信息(新技能 / 新项目 / 新成果 / 软实力自我评价 / 经历更新),由你判断要不要记入 `profile.json`。倾向**保守**:宁可少记、不可记错。
|
|
10
|
+
|
|
11
|
+
## 输入(主流程传给你)
|
|
12
|
+
|
|
13
|
+
1. **用户新描述**(原话)。
|
|
14
|
+
2. **相关已有个人资料**(主流程先 `profile.py find` 拉相关条目,避免重复 / 冲突)。
|
|
15
|
+
3. **目标岗位方向**(用户的在投岗位 / tags,判断"岗位核心"用)。
|
|
16
|
+
|
|
17
|
+
## 评估标准(逐条判断)
|
|
18
|
+
|
|
19
|
+
1. **硬实力 / 软实力**:技术、项目、可量化成果(硬)优先记;性格、沟通、态度等自我认知(软)也值得记,但需更严格判断是否真有长期价值。
|
|
20
|
+
2. **长期价值**:跨岗位、跨项目长期复用的才记;一次性、纯情境性的细节不记。
|
|
21
|
+
3. **岗位核心方向**:是目标岗位核心能力的,记并打对应 tags;与目标岗位无关的,标 `long_term=true` 但不打岗位 tag(备用,不强写进当前简历)。
|
|
22
|
+
4. **是否过时 / 冲突**:与已有条目冲突、或比已有更陈旧的 → 建议 **update** 那条,而非 add 新条目。判断「陈旧」看 `find` 结果里的 `age`(脚本真实时钟算的距今,如「3 个月前」)——**别用自己的时间感估**。
|
|
23
|
+
|
|
24
|
+
## 额外把关
|
|
25
|
+
|
|
26
|
+
- **保留语境、防过度包装**:用户说"最近在学 / 了解 / 接触"的,value 里要保留"起步 / 学习中"语境,**绝不**让简历据此写成"精通"。
|
|
27
|
+
- **数字要核**:成果数字(star 数、QPS、提升%)若用户没给或记忆里没有,标"待用户确认",不要替他编。
|
|
28
|
+
- **项目地址**:给了 URL 的项目,建议主流程访问核实成果数据后再决定怎么记。
|
|
29
|
+
|
|
30
|
+
## 输出格式(严格按此返回)
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
值得记:是 / 否
|
|
34
|
+
记成:ability / project # 不值得则此项省略
|
|
35
|
+
key:<英文 slug>
|
|
36
|
+
value:<一句话;保留起步语境 / 待确认标注>
|
|
37
|
+
category:hard / soft # 仅 ability
|
|
38
|
+
tags:<逗号分隔,从目标岗位方向选,如 backend,AI,product>
|
|
39
|
+
long_term:true / false
|
|
40
|
+
理由:<2-3 句,结合上面四条 + 把关点>
|
|
41
|
+
建议:add(新增)/ update(更新已有:<type>/<key>)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
不值得时:`值得记:否` + `理由:…`(告诉用户为什么——如"与已有 X 重复"、"一次性细节")。
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 个人资料(素材库)
|
|
2
|
+
|
|
3
|
+
个人资料是由 `scripts/profile.py` 管理,位置优先项目级、否则用户根目录:
|
|
4
|
+
|
|
5
|
+
- 项目级:`<项目>/.amlei-skill/resume/profile.json`
|
|
6
|
+
- 根目录:`~/.amlei-skill/resume/profile.json`
|
|
7
|
+
|
|
8
|
+
全部命令见 `python3 scripts/profile.py --help`,每条 `<命令> --help` 看参数。
|
|
9
|
+
|
|
10
|
+
**关键命令:**
|
|
11
|
+
- `profile` — 姓名 / 联系方式等基本信息
|
|
12
|
+
- `preference` — 求职偏好(城市、职位类型、薪资、经验、学历、公司规模、行业)
|
|
13
|
+
- `target` — 在投岗位(城市、年限、标签)
|
|
14
|
+
- `target-company` — 关注的目标公司及 JD(作为调研锚点)
|
|
15
|
+
- `experience` — 工作过的公司(公司名、岗位、时间段、行业)
|
|
16
|
+
- `education` — 教育经历(学校、学位、专业、毕业年份/届)
|
|
17
|
+
- `add` / `update` / `find` — 能力与项目条目的增改查
|
|
18
|
+
- `batch` — **(优先使用)** 批量操作(传 `--json` 字符串或 stdin),一次保存一份备份
|
|
19
|
+
|
|
20
|
+
**写简历前必须先有个人资料**——`path` 查不到就问用户选项目级 / 根目录,`init` 创建后再引导补充;没有个人资料不往下走。写简历时从 `profile` 取姓名 / 联系方式填 self-intro;`target list` 看在投哪几岗,生成 / 换岗按对应 target 的城市 / 年限 / tags 来。
|
|
21
|
+
|
|
22
|
+
个人资料可包含用户感兴趣的公司及 JD(`company add --key 公司名 --position 岗位 --industry 行业 --jd "JD描述" --url 链接`),作为写简历时对标调研的锚点。工作过的公司用 `experience add --key 公司名 --position 岗位 --period "2024.07 — 2025.03" --industry 行业` 记录。
|
|
23
|
+
|
|
24
|
+
## 触发写入 profile 的时机
|
|
25
|
+
|
|
26
|
+
聊的过程中发现任何跟用户相关的**新信息**(个人信息、能力、项目、教育经历、偏好、获奖等),一律经评估 + 用户确认后写入 profile。
|
|
27
|
+
|
|
28
|
+
| 场景 | 行为 |
|
|
29
|
+
|------|------|
|
|
30
|
+
| 导入旧简历(.docx/.pdf) | 直接写入(不经过评估 agent) |
|
|
31
|
+
| 聊出可跨岗位复用的能力/成果 | 评估 agent + 用户确认后写入 |
|
|
32
|
+
| 用户主动说"帮我记一下" | 评估 agent + 用户确认后写入 |
|
|
33
|
+
| 改完简历发现 profile 里没有的新信息 | 问用户"要不要同步进 profile?"→ 用户同意后评估 + 写入 |
|
|
34
|
+
|
|
35
|
+
## 写入流程
|
|
36
|
+
|
|
37
|
+
用户补充个人信息(含软实力自我评价),**写入前先派一个独立评估 agent 判断「值不值得进 profile」**(独立上下文、避免自评偏袒),再由用户确认才写:
|
|
38
|
+
|
|
39
|
+
- 用你当前环境里「创建子 agent」的方式,起一个**独立上下文**的评估 agent——**具体调用哪个工具不在本规则里固定**(不同 Agent 平台机制不同,由 LLM 自行选用),目的是拿到一个不带自评偏袒的独立判断。
|
|
40
|
+
- 评估标准、输入与输出格式见 [profile-evaluator.md](profile-evaluator.md)。
|
|
41
|
+
- **评估通过且用户确认后**,才调 `profile.py add` / `update`;不通过就告诉用户为什么不记。
|
|
42
|
+
|
|
43
|
+
> 脚本写入前会自动备份(带时间戳,保留最近 10 份)。
|