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.
Files changed (36) hide show
  1. package/.claude-plugin/plugin.json +16 -0
  2. package/LICENSE +21 -0
  3. package/README.md +21 -0
  4. package/package.json +35 -0
  5. package/skills/academic-ref-retrieval/SKILL.md +103 -0
  6. package/skills/academic-ref-retrieval/resources/arxiv-api-example.py +42 -0
  7. package/skills/academic-ref-retrieval/resources/cnki-scraper-example.py +58 -0
  8. package/skills/amlei-git-gh/SKILL.md +156 -0
  9. package/skills/amlei-resume/SKILL.md +204 -0
  10. package/skills/amlei-resume/assets/preview-shell.html +438 -0
  11. package/skills/amlei-resume/assets/sample-preview.html +361 -0
  12. package/skills/amlei-resume/assets/sample-resume.md +57 -0
  13. package/skills/amlei-resume/references/export.md +76 -0
  14. package/skills/amlei-resume/references/icons.md +35 -0
  15. package/skills/amlei-resume/references/profile-evaluator.md +44 -0
  16. package/skills/amlei-resume/references/profile.md +43 -0
  17. package/skills/amlei-resume/references/projects.md +76 -0
  18. package/skills/amlei-resume/references/resume-evaluator.md +121 -0
  19. package/skills/amlei-resume/references/revise.md +11 -0
  20. package/skills/amlei-resume/references/themes/theme-academic.md +238 -0
  21. package/skills/amlei-resume/references/themes/theme-content-green.md +138 -0
  22. package/skills/amlei-resume/references/themes/theme-english-mnc.md +127 -0
  23. package/skills/amlei-resume/references/themes/theme-index.md +46 -0
  24. package/skills/amlei-resume/references/themes/theme-sidebar-creative.md +163 -0
  25. package/skills/amlei-resume/references/themes/theme-soe-formal.md +153 -0
  26. package/skills/amlei-resume/references/themes/theme-tech-dense.md +157 -0
  27. package/skills/amlei-resume/references/write.md +14 -0
  28. package/skills/amlei-resume/scripts/boss_zhipin.py +676 -0
  29. package/skills/amlei-resume/scripts/extract_avatar.py +157 -0
  30. package/skills/amlei-resume/scripts/profile.py +465 -0
  31. package/skills/amlei-resume/scripts/validate_resume.py +195 -0
  32. package/skills/amlei-resume/scripts/wrap_preview.py +104 -0
  33. package/skills/amlei-story-generator/SKILL.md +67 -0
  34. package/skills/amlei-story-generator/resources/narrative-craft.md +74 -0
  35. package/skills/amlei-story-generator/resources/rubric.md +28 -0
  36. package/skills/amlei-story-generator/resources/source-frameworks.md +89 -0
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "amlei-skills",
3
+ "description": "简历全流程 + Boss直聘搜岗 + 故事生成 + Git 工作流",
4
+ "skills": [
5
+ {
6
+ "name": "amlei-resume",
7
+ "file-path": ".opencode/skills/amlei-resume/SKILL.md",
8
+ "description": "简历全流程:0→1 写/改/换岗/迭代 + Boss直聘搜岗 + 装配 HTML 导出 PDF"
9
+ },
10
+ {
11
+ "name": "amlei-story-generator",
12
+ "file-path": "skills/amlei-story-generator/SKILL.md",
13
+ "description": "故事生成——书/人/事/物/理/案,联网核实后写成引人入胜的长文"
14
+ },
15
+ ]
16
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 amlei
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # Amlei Skills
2
+
3
+ | Skill | Description |
4
+ |-------|-------------|
5
+ | [amlei-resume](skills/amlei-resume/SKILL.md) | 简历全流程:0→1 写/改/换岗/迭代 + Boss直聘搜岗 + 装配 HTML 导出 PDF |
6
+ | [amlei-story-generator](skills/amlei-story-generator/SKILL.md) | 故事生成——书/人/事/物/理/案,联网核实后写成引人入胜的长文 |
7
+ | [amlei-git-gh](skills/amlei-git-gh/SKILL.md) | Git commit + push + PR 工作流 |
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ # As Claude Code plugin
13
+ claude plugin install npm:amlei-skills
14
+
15
+ # Or copy skills manually
16
+ cp -r .skills/amlei-resume .claude/skills/
17
+ ```
18
+
19
+ ## License
20
+
21
+ MIT
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "amlei-skills",
3
+ "version": "0.1.0",
4
+ "description": "简历全流程 + Boss直聘搜岗 + 故事生成 + Git 工作流 — Claude Code skills",
5
+ "main": "index.js",
6
+ "scripts": {},
7
+ "keywords": [
8
+ "claude-code",
9
+ "claude",
10
+ "skills",
11
+ "resume",
12
+ "boss-zhipin",
13
+ "求职"
14
+ ],
15
+ "files": [
16
+ ".claude-plugin/plugin.json",
17
+ "skills/amlei-resume/SKILL.md",
18
+ "skills/amlei-resume/assets/",
19
+ "skills/amlei-resume/references/",
20
+ "skills/amlei-resume/scripts/boss_zhipin.py",
21
+ "skills/amlei-resume/scripts/extract_avatar.py",
22
+ "skills/amlei-resume/scripts/profile.py",
23
+ "skills/amlei-resume/scripts/validate_resume.py",
24
+ "skills/amlei-resume/scripts/wrap_preview.py",
25
+ "skills/amlei-story-generator/",
26
+ "skills/amlei-git-gh/",
27
+ "skills/academic-ref-retrieval/"
28
+ ],
29
+ "author": "amlei",
30
+ "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/amlei/amlei-skills.git"
34
+ }
35
+ }
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: academic-ref-retrieval
3
+ description: 学术论文参考文献检索与格式输出。根据论文主题拆解核心技术,编写脚从权威期刊/数据库(知网、维普、arXiv等)爬取或提取真实论文信息,按标准参考文献格式输出。触发:写论文 / 参考文献 / 查文献 / 检索论文 / 论文参考 / reference retrieval / academic reference。
4
+ argument-hint: "USER_DEFINE DIRECTION THEME ENGLISH_PAPER_NUMBER COUNT_NUMBER"
5
+ ---
6
+
7
+ # Academic Reference Retrieval
8
+
9
+ 你是一名高知 `{USER_DEFINE}`,你的研究方向是 `{DIRECTION}`,需要写一篇以 `{THEME}` 为题的论文。你的任务是检索权威、真实的参考文献。
10
+
11
+ ## 工作流
12
+
13
+ ### 1. 技术分片
14
+
15
+ 将论文主题拆解、分片,提炼出最核心的技术,同时辅以技术泛化。以技术为导向,分析完成该论文需要使用到什么技术,将其设定为参考文献方向。
16
+
17
+ **示例:**
18
+ > 用户: 写一篇以《基于大语言模型的校园信息智能响应 Agent 系统设计与实现》为题的毕业论文
19
+ > 分片: `LLM`, `AI Model`, `Agent`, `Agent Tool`, `RAG`, `Prompt Engineering`, `Context Engineering`
20
+
21
+ 将分片结果作为后续检索关键词。
22
+
23
+ ### 2. 检索脚本
24
+
25
+ 对每个技术关键词,编写代码脚本从官方权威渠道获取真实论文信息。**不得有预设、手动、模拟行为**——必须真实访问并提取数据。
26
+
27
+ #### 中文期刊源
28
+ - **知网 CNKI** (`https://www.cnki.net/`):优先使用其开放 API 或搜索页面爬取
29
+ - **维普** (`https://qikan.cqvip.com/`):备用中文期刊源
30
+
31
+ #### 英文期刊源
32
+ - **arXiv** (`https://arxiv.org/`):开放获取,支持 API 批量查询
33
+ - 其他开放学术数据库(如 IEEE Xplore 开放论文、ACL Anthology、DBLP、PubMed Central 等)
34
+
35
+ #### 提取信息
36
+
37
+ 每篇文献需提取:
38
+ - **标题** (论文完整标题)
39
+ - **作者** (全部作者)
40
+ - **期刊/出版社/会议**
41
+ - **日期** (发表年份/月份)
42
+ - **DOI / URL** (用于引用和核查)
43
+
44
+ #### 实现方式
45
+
46
+ - 检索结果为 **HTML**:用 `python3` + `requests` + `BeautifulSoup` (或 `lxml`) 编写爬虫解析
47
+ - 检索结果为 **PDF**:用 `python3` + `PyMuPDF` (`fitz`) 或 `pdfplumber` 提取元数据和参考文献
48
+ - 优先使用官方 API(如 arXiv API: `http://export.arxiv.org/api/query?search_query=all:{keyword}&start=0&max_results=10`)
49
+ - arXiv API 返回 XML,用 `xml.etree.ElementTree` 解析
50
+
51
+ #### 示例脚本片段
52
+
53
+ ```python
54
+ # arXiv API 检索
55
+ import urllib.request, xml.etree.ElementTree as ET
56
+
57
+ keyword = "RAG"
58
+ url = f"http://export.arxiv.org/api/query?search_query=all:{keyword}&start=0&max_results=10"
59
+ with urllib.request.urlopen(url) as f:
60
+ root = ET.fromstring(f.read())
61
+ ns = {"a": "http://www.w3.org/2005/Atom"}
62
+ for entry in root.findall("a:entry", ns):
63
+ title = entry.find("a:title", ns).text.strip().replace("\n", " ")
64
+ authors = [a.find("a:name", ns).text for a in entry.findall("a:author", ns)]
65
+ published = entry.find("a:published", ns).text[:4]
66
+ link = entry.find("a:id", ns).text
67
+ print(f"{', '.join(authors)}. {title}[J]. arXiv, {published}. {link}")
68
+ ```
69
+
70
+ ### 3. 筛选与格式
71
+
72
+ - 文献总数:**至少 `{COUNT_NUMBER}` 篇**(含中英文)
73
+ - 英文文献:**至少 `{ENGLISH_PAPER_NUMBER}` 篇**
74
+ - 以中文文献为主
75
+ - **所有参考文献必须来自权威期刊、学术会议论文集或学术专著** — 不得引用网络文章、新闻、博客、微信公众号、非学术网站等
76
+
77
+ ### 4. 输出格式
78
+
79
+ 按标准参考文献格式输出,每条末尾附 Source URL 供核查:
80
+
81
+ ```
82
+ [1] 作者1, 作者2, 作者3. 论文标题[J]. 期刊名称, 年份, 卷号(期号): 起止页码. https://doi.org/xxx
83
+ [2] Author A, Author B. Paper Title[C]. Proceedings of Conference, Year: 页码. https://arxiv.org/abs/xxxx
84
+ ```
85
+
86
+ **文献类型标识:**
87
+ - `[J]` — 期刊论文 (Journal)
88
+ - `[C]` — 会议论文 (Conference)
89
+ - `[M]` — 专著/图书 (Monograph)
90
+ - `[D]` — 学位论文 (Dissertation)
91
+ - `[P]` — 专利 (Patent)
92
+
93
+ ## 约束
94
+
95
+ 1. **绝对真实**:不得编造作者、标题、出处、页码、DOI — 所有信息必须从检索结果中提取。检索不到的不引用。
96
+ 2. **代码先行**:必须先编写并执行检索脚本,拿到结果后再整理输出。禁止凭知识或记忆手动列出参考文献。
97
+ 3. **来源权威**:只从学术期刊、会议论文集、学术专著中引用。行业报告、技术博客、官方文档等仅作为背景参考,不作为参考文献。
98
+ 4. **数量达标**:总文献数不低于 `{COUNT_NUMBER}`,英文不低于 `{ENGLISH_PAPER_NUMBER}`。不足则更换关键词或扩展检索范围。
99
+
100
+ ## 资源
101
+
102
+ - `resources/arxiv-api-example.py` — arXiv API 检索示例脚本
103
+ - `resources/cnki-scraper-example.py` — 知网检索示例脚本(需处理反爬)
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env python3
2
+ """arXiv API 检索示例 — 按关键词查论文并输出参考文献格式."""
3
+
4
+ import sys
5
+ import xml.etree.ElementTree as ET
6
+ from urllib.request import urlopen
7
+ from urllib.parse import quote
8
+
9
+ API = "http://export.arxiv.org/api/query?search_query=all:{kw}&start=0&max_results={n}"
10
+ NS = {"a": "http://www.w3.org/2005/Atom"}
11
+
12
+
13
+ def fetch(keyword, max_results=10):
14
+ url = API.format(kw=quote(keyword), n=max_results)
15
+ with urlopen(url) as f:
16
+ return ET.fromstring(f.read())
17
+
18
+
19
+ def parse(root):
20
+ papers = []
21
+ for entry in root.findall("a:entry", NS):
22
+ title = entry.find("a:title", NS).text.strip().replace("\n", " ").replace(" ", " ")
23
+ authors = [a.find("a:name", NS).text for a in entry.findall("a:author", NS)]
24
+ published = entry.find("a:published", NS).text[:10]
25
+ link = entry.find("a:id", NS).text
26
+ papers.append({"title": title, "authors": authors, "date": published, "url": link})
27
+ return papers
28
+
29
+
30
+ def format_ref(papers, start=1):
31
+ for i, p in enumerate(papers, start):
32
+ authors = ", ".join(p["authors"])
33
+ year = p["date"][:4]
34
+ print(f"[{i}] {authors}. {p['title']}[J]. arXiv, {year}. {p['url']}")
35
+
36
+
37
+ if __name__ == "__main__":
38
+ kw = sys.argv[1] if len(sys.argv) > 1 else "RAG"
39
+ n = int(sys.argv[2]) if len(sys.argv) > 2 else 10
40
+ root = fetch(kw, n)
41
+ papers = parse(root)
42
+ format_ref(papers)
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env python3
2
+ """知网 CNKI 检索示例 — 按关键词搜索并提取论文元信息.
3
+
4
+ 知网有反爬机制,此脚本演示基础请求 + HTML 解析思路。
5
+ 实际使用时可能需要处理 cookie / session / 验证码。
6
+ """
7
+
8
+ import sys
9
+ import re
10
+ import urllib.parse
11
+ from urllib.request import urlopen, Request
12
+
13
+ SEARCH_URL = (
14
+ "https://kns.cnki.net/kcms2/article/adv search?"
15
+ "dbcode=CJFD&filename=&tab=AdvanceSearch&"
16
+ "keyword={kw}&searchType=AdvanceSearch"
17
+ )
18
+
19
+
20
+ def fetch(keyword):
21
+ url = SEARCH_URL.format(kw=urllib.parse.quote(keyword))
22
+ req = Request(url, headers={"User-Agent": "Mozilla/5.0"})
23
+ with urlopen(req) as f:
24
+ return f.read().decode("utf-8", "ignore")
25
+
26
+
27
+ def parse(html):
28
+ """极简示例:从 HTML 提取论文条目(知网页面结构复杂,实际需精细解析)。"""
29
+ papers = []
30
+ # 匹配典型条目模式:标题链接 + 作者 + 来源 + 日期
31
+ blocks = re.findall(
32
+ r'<tr[^>]*>.*?<a[^>]*href="([^"]*)"[^>]*>([^<]+)</a>.*?'
33
+ r'<td[^>]*>([^<]+)</td>.*?'
34
+ r'<td[^>]*>([^<]+)</td>.*?'
35
+ r'<td[^>]*>(\d{4})</td>',
36
+ html, re.S
37
+ )
38
+ for href, title, authors, source, year in blocks:
39
+ papers.append({
40
+ "title": title.strip(),
41
+ "authors": authors.strip(),
42
+ "source": source.strip(),
43
+ "year": year,
44
+ "url": "https://kns.cnki.net" + href if href.startswith("/") else href,
45
+ })
46
+ return papers
47
+
48
+
49
+ def format_ref(papers, start=1):
50
+ for i, p in enumerate(papers, start):
51
+ print(f"[{i}] {p['authors']}. {p['title']}[J]. {p['source']}, {p['year']}. {p['url']}")
52
+
53
+
54
+ if __name__ == "__main__":
55
+ kw = sys.argv[1] if len(sys.argv) > 1 else "大语言模型"
56
+ html = fetch(kw)
57
+ papers = parse(html)
58
+ format_ref(papers)
@@ -0,0 +1,156 @@
1
+ ---
2
+ name: amlei-git-gh
3
+ description: Guide for git commit, push, and PR using gh CLI (GitHub). Use when committing code, pushing to remote, creating pull requests, managing branches, or any git workflow. Covers commit message conventions, push strategies, and PR creation with confirmation gates.
4
+ argument-hint: "[回车=commit&push] 1=staged files 2=unstaged files"
5
+ disable-model-invocation: true
6
+ ---
7
+ # Git & GitHub Workflow
8
+ Use `gh` CLI (GitHub) for all remote operations. Commit and push directly without confirmation. Only PR requires explicit user approval.
9
+ ## ⚠️ CRITICAL CONSTRAINT
10
+ **NEVER automatically commit and push after making edits.**
11
+ This skill should ONLY activate when:
12
+ - User explicitly asks: "commit", "push", "create PR", "提交", "推送"
13
+ - User invokes: `/git-gh` command
14
+ - User explicitly requests git operations
15
+ **DO NOT:**
16
+ - Auto-commit after editing files
17
+ - Suggest committing after each change
18
+ - Be proactive about git operations
19
+ **WAIT for the user to initiate.**
20
+ ## Interactive Mode
21
+ When this skill is invoked, immediately run `git status --short` in the background, then ask the user to choose via `AskUserQuestion`:
22
+ **Options:**
23
+ | # | Option | Action |
24
+ |---|--------|--------|
25
+ | 默认/回车 | Commit & Push | Execute full commit + push flow (Section 1 + 2) |
26
+ | 1 | Staged Files | Show `git diff --cached --stat` + `git diff --cached`, then ask next action |
27
+ | 2 | Unstaged Files | Show `git status --short` + `git diff --stat`, then ask next action |
28
+ **Flow after viewing files (option 1 or 2):**
29
+ - Ask user: proceed to commit & push / stage or unstage specific files / go back
30
+ - After staging/unstaging, loop back to the choice menu
31
+ ## 1. Commit
32
+ ### Before Committing
33
+ Run in parallel to gather context:
34
+ - `git status` — untracked and modified files
35
+ - `git diff` — staged and unstaged changes
36
+ - `git log --oneline -10` — recent commit style
37
+ ### Commit Message Rules
38
+ - Write in **Chinese or English** depending on the project's existing commit style
39
+ - Format: `type: short summary` — one line, concise, human-readable
40
+ - Types: `feat`, `fix`, `refactor`, `docs`, `chore`, `test`, `style`, `perf`
41
+ - Focus on **what changed and why**, not how
42
+ - No emojis unless user requests
43
+ ### Good Examples
44
+ ```
45
+ feat: add user login with email verification
46
+ fix: resolve race condition in batch processing
47
+ refactor: extract validation logic into shared module
48
+ docs: update API endpoint descriptions
49
+ chore: upgrade dependencies to latest stable
50
+ ```
51
+ ### Bad Examples
52
+ ```
53
+ update files # too vague
54
+ feat: add feature # which feature?
55
+ wip # meaningless
56
+ fix bug # what bug?
57
+ ```
58
+ ### Steps
59
+ 1. Gather context (status, diff, recent log) — run in parallel
60
+ 2. Stage specific files by name (`git add <file>`), avoid `git add -A`
61
+ 3. Draft commit message based on actual changes
62
+ 4. Create commit directly
63
+ 5. Run `git status` to verify
64
+ Never commit files that likely contain secrets (.env, credentials).
65
+ ## 2. Push
66
+ ### Steps
67
+ 1. Check if branch tracks a remote: `git branch -vv`
68
+ 2. If no upstream, push with: `git push -u origin <branch>`
69
+ 3. If upstream exists: `git push`
70
+ 4. **Never force push** unless user explicitly requests
71
+ ### Current Branch Check
72
+ After commit, check if current branch is not `main`/`master`. If on a feature branch and commit + push succeeded, proceed to step 3.
73
+ ## 3. Pull Request
74
+ ### When to Ask
75
+ After a successful commit + push on a **non-main branch**, ask the user:
76
+ > Commit and push completed. Would you like to create a pull request?
77
+ **Never create a PR automatically.** Always wait for explicit user confirmation.
78
+ ### When NOT to Ask
79
+ - Already on `main` or `master`
80
+ - User only asked to commit (not push)
81
+ - PR already exists for this branch
82
+ ### PR Creation Steps
83
+ 1. Run in parallel to gather full context:
84
+ - `git status`
85
+ - `git diff`
86
+ - `git log main..HEAD --oneline` — all commits on this branch
87
+ - `git diff main...HEAD` — full diff from base
88
+ 2. Analyze all changes, draft title and body
89
+ 3. PR title: under 70 chars, concise summary of the change
90
+ 4. PR body format:
91
+ ```markdown
92
+ ## Summary
93
+ - Bullet points of key changes (1-3 items)
94
+ ## Test plan
95
+ - Checklist of verification steps
96
+ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
97
+ ```
98
+ 5. Present to user for approval — include suggested labels, assignees, reviewers
99
+ 6. Push with `-u` if needed, then create via `gh pr create`
100
+ 7. Return the PR URL
101
+ ### PR Metadata
102
+ When creating a PR, suggest and apply labels, assignees, and reviewers:
103
+ | Parameter | Flag | Example |
104
+ |-----------|------|---------|
105
+ | Labels | `--label` | `--label "enhancement,backend"` |
106
+ | Assignees | `--assignee` | `--assignee "user1,user2"` |
107
+ | Reviewers | `--reviewer` | `--reviewer "user1"` |
108
+ | Milestone | `--milestone` | `--milestone "v2.0"` |
109
+ | Project | `--project` | `--project "Roadmap"` |
110
+ **How to suggest metadata:**
111
+ - **Labels**: infer from change type (`feat` → `enhancement`, `fix` → `bug`, `docs` → `documentation`)
112
+ - **Assignees**: default to the current user (`@me`) unless the user specifies others
113
+ - **Reviewers**: ask the user who should review
114
+ **When presenting the PR for approval**, include the metadata:
115
+ ```
116
+ Title: feat: add user login
117
+ Labels: enhancement
118
+ Assignees: @me
119
+ Reviewers: (ask user)
120
+ ```
121
+ **To update an existing PR's metadata:**
122
+ ```bash
123
+ gh pr edit <number> --add-label "enhancement" --add-assignee "username"
124
+ ```
125
+ ### gh pr create Template
126
+ ```bash
127
+ gh pr create --title "the title" \
128
+ --label "enhancement" \
129
+ --assignee "@me" \
130
+ --body "$(cat <<'EOF'
131
+ ## Summary
132
+ <bullets>
133
+ ## Test plan
134
+ <checklist>
135
+ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
136
+ EOF
137
+ )"
138
+ ```
139
+ ## Quick Reference
140
+ | Action | Command |
141
+ |---|---|
142
+ | Check status | `git status` |
143
+ | Stage files | `git add <file>` |
144
+ | Commit | `git commit -m "msg"` |
145
+ | Push (new branch) | `git push -u origin <branch>` |
146
+ | Push (existing) | `git push` |
147
+ | Create PR | `gh pr create --title "..." --body "..." --label "..." --assignee "..."` |
148
+ | Edit PR metadata | `gh pr edit <n> --add-label "..." --add-assignee "..."` |
149
+ | Check existing PRs | `gh pr list` |
150
+ | View PR | `gh pr view <number>` |
151
+ ## Safety Rules
152
+ - Never force push to main/master
153
+ - Never auto-create PRs
154
+ - Never commit secret files (.env, credentials)
155
+ - Never use `git add -A` — stage specific files
156
+ - Never skip pre-commit hooks (`--no-verify`)
@@ -0,0 +1,204 @@
1
+ ---
2
+ name: amlei-resume
3
+ description: 当用户需要写简历、改简历、投简历、换岗位重定向,或把简历导出为 A4 PDF 时使用。涵盖从素材挖掘、JD 对齐、质量评估到装配 HTML 并导出的完整流程。
4
+ argument-hint: "[求职岗位] [意向城市] [工作年限]"
5
+ ---
6
+
7
+ # amlei-resume
8
+
9
+ `profile.json` 是整个 SKILL 的核心数据——用户的技能、经历、偏好、项目都记录在此。简历是基于 profile 内容,针对目标岗位裁剪组装而来的产出。
10
+
11
+ **使用本 SKILL 时,必须先加载 [references/profile.md](references/profile.md)(个人资料管理流程)和 [references/projects.md](references/projects.md)(素材挖掘流程),这两份是每次操作的前置依赖。**
12
+
13
+ 核心原则:**不直接问"你要改哪"——通过聊项目、聊做事方式、聊自我认知,帮用户挖出他们自己都忘了的亮点,再落成简历文字。**
14
+
15
+ ## 开始前
16
+
17
+ 在开始任何操作前,先用 `todowrite` 列出当前任务的所有步骤、预期产物和注意事项,逐条推进。完成一项标记一项,确保不遗漏。
18
+
19
+ ### 工作流程
20
+
21
+ 根据用户需求选择对应流程,每步对应一个 Todo 条目。
22
+
23
+ **写简历(0→1):**
24
+
25
+ 1. 检查 profile
26
+ 2. 检查/导入旧简历
27
+ 3. 存 JD + 岗位调研
28
+ 4. 挖素材
29
+ 5. 共创(逐节/整篇)
30
+ 6. 评估迭代 → 不通过回到 4 或 5
31
+ 7. 用户确认保存
32
+ 8. 导出(如需)
33
+
34
+ **改简历:**
35
+
36
+ 1. 检查 profile
37
+ 2. 存 JD + 岗位调研
38
+ 3. 挖细节/沉默亮点
39
+ 4. 迭代改写
40
+ 5. 评估迭代 → 不通过回到 3
41
+ 6. 用户确认保存
42
+ 7. 导出(如需)
43
+
44
+ **换岗位重定向:**
45
+
46
+ 1. 读现岗简历 + 新 JD
47
+ 2. 查 profile 换贴的项目
48
+ 3. 重排模块/换关键词
49
+ 4. 评估迭代 → 不通过回到 2 或 3
50
+ 5. 用户确认保存
51
+
52
+ **导出 PDF:**
53
+
54
+ 1. 校验 → 不通过回到装配
55
+ 2. 选主题
56
+ 3. 读组件库
57
+ 4. 装配 HTML
58
+ 5. 审查 → 不通过回到 4
59
+ 6. 套预览壳
60
+ 7. 检查分页留白 → 不均回 4 调整
61
+ 8. 交付
62
+
63
+ 每个步骤完成后标记 Todo,明确当前进度和下一步。
64
+
65
+ ### 检查个人资料
66
+
67
+ 使用本 SKILL 时,先运行 `profile.py path` 查看 profile 是否存在:
68
+
69
+ - **不存在** → 问用户选项目级/根目录,`init` 创建并引导补充基本信息(姓名/联系方式/求职偏好/工作经历)。
70
+ - **存在但信息不完整** → 引导用户补充缺失数据。
71
+
72
+ ### 通用规则
73
+
74
+ **脱敏**:简历经历中涉及公司内部项目名称,一律用业务功能描述或规模定义替代(如"核心交易链路"、"支撑日均百万订单的订单系统"),严禁写入公司项目原文名称。不用"某"式占位表述。
75
+
76
+ **平实表述**:每句话让读者一眼看明白你具体做了什么。写每条经历时主动问用户"你当时具体是怎么做的",引导他说出执行细节再落笔,不替用户编造。**不解释领域常识**:标准技术名词和概念(如"Skill""YAML frontmatter""Context Engineering")是读者已知的领域常识,不在简历中解释它是什么。要么删掉无差异化的技术列举,要么只写你做了什么/做成了什么,不写"XX是什么"。
77
+
78
+ **链接限制**:仅 `self-intro` 模块可含外部链接(GitHub/作品集等),其他模块禁止出现链接。
79
+
80
+ **经历定义**:
81
+
82
+ **self-intro**:个人简介 + 教育背景放在同一模块(含学校、学位、专业、毕业届),不拆开。教育信息同步记录到 profile(`education add --key 学校名 --degree 学位 --major 专业 --graduation 2026届`)。
83
+
84
+ **工作/实习经历**(一家公司一个条目,保持"面"的完整):
85
+ - **基本盘**:总体职责描述 + 核心职责模块(3-5 条 bullet),含日常运维、团队协作、零碎事项汇总、公司内获奖等——回答"你日常负责什么"
86
+ - **高光时刻**:在该条目下嵌入 1-2 个突出成果 bullet,带量化——回答"你在这家公司干成了什么"
87
+ - 基本盘和高光时刻在同一条目内,不拆成独立项目
88
+
89
+ **项目经历**(满足 4 条件:起止时间明确 + 可量化目标 + 核心角色 + 完整闭环结果):
90
+ - 分公司项目和个人项目,**公司项目在前,个人项目放后**,让工作经历和项目之间形成自然衔接感。
91
+
92
+ ### 检查现有简历
93
+
94
+ 检查 `resume/{姓名}/{求职岗位}/简历.md` 是否存在:
95
+
96
+ - **有简历但无 profile** → 按简历内容自动构建完整 profile(从简历分段提取基础信息、技能、项目、工作经历全量写入 profile)。**有简历且有 profile** → 问用户基于当前版本需要做哪些调整。同时检查 profile 是否有缺失(简历里有但 profile 没有的信息,问用户是否同步)。
97
+ - **无简历** → 问用户是否有旧版简历(Word / PDF)需要导入;有则走[简历导入](#简历导入)流程(导入时自动填充 profile);没有就从零开始。
98
+
99
+ 确认后查求职偏好(`preference` 无参显示)——城市、薪资、经验等作为岗位调研的锚点。再问用户要他觉得不错的目标公司 JD。
100
+
101
+ ### 岗位调研
102
+
103
+ 用户给出 JD(文字/链接/文件)后,**立即将 JD 全文写入 `resume/{姓名}/{求职岗位}/jd.md`**(一个岗位一个 JD 文件,不修改)。每次写/改前都先确认 JD 是最新的、已保存。
104
+
105
+ 拿到 JD 后,和用户围绕这几方面讨论,帮用户自我定位:
106
+
107
+ 1. **聊 JD 描述**:把 JD 里列的要求一条条跟用户过——"这个岗位要求熟练 X 技术,你之前用过吗?"、"它提到需要 Y 领域经验,你有哪些相关的?"
108
+ 2. **网络搜索岗位画像**:基于 JD 搜索该岗位的人才定位——不局限于这一家公司,而是看行业对这个岗位的普遍期望。
109
+ 3. **引导自我认知**:从 JD 的关键词出发,帮用户发现自己的对应能力和亮点。
110
+ 4. **聊现状与规划**:了解用户当前状态(城市、工作、年限),询问未来规划。
111
+
112
+ ### 项目材料与讨论
113
+
114
+ 写简历和改简历都需要挖掘用户的经历和材料。分为两个环节:
115
+
116
+ 1. **材料收集与探索**:用户给到网页链接、文件路径、文档等,像探索一个系统一样完整梳理整条链路,不遗漏、不预判筛选。
117
+ 2. **项目讨论**:聊项目背景、角色、难点、成果,帮用户挖出自己忘了说的亮点。
118
+
119
+ 详见 [references/projects.md](references/projects.md)。
120
+
121
+ ## 简历管理
122
+
123
+ ### 简历存储
124
+
125
+ ```
126
+ resume/{姓名}/{求职岗位}/简历.md
127
+ ```
128
+
129
+ 改写简历就读这份;换岗就开新的 `{求职岗位}/` 目录存新版(原岗版本保留)。**用户没说"可以/就这样"之前,绝不写入简历文件。**
130
+
131
+ ### 个人资料(核心数据)
132
+
133
+ `profile.json` 是全部简历操作的核心数据源。包含:
134
+
135
+ | 数据 | 命令 | 用途 |
136
+ |------|------|------|
137
+ | 基本信息 | `profile` | 姓名/联系方式 |
138
+ | 求职偏好 | `preference` | 城市/薪资/经验/学历等 |
139
+ | 在投岗位 | `target` | 正在投的岗位方向 |
140
+ | 目标公司 | `company` | 感兴趣想投的公司及 JD |
141
+ | 工作经历 | `experience` | 工作过的公司/岗位/时间段 |
142
+ | 能力/项目 | `add` / `update` / `find` | 跨岗位复用的技能和项目 |
143
+
144
+ 触发写入时机:
145
+ - 导入旧简历时直接写(证件照/基本信息/技能/工作经历)
146
+ - 讨论项目聊出可复用成果 → 评估 + 确认
147
+ - 用户主动说"帮我记一下" → 评估 + 确认
148
+ - 改完简历发现新素材 → 问用户是否同步
149
+
150
+ **写入前评估(强制):** 调用 `profile.py add` / `update` 之前,必须先派独立评估 agent 执行 [references/profile-evaluator.md](references/profile-evaluator.md),判断该条目是否应记入 profile。评估不通过不得写入。
151
+
152
+ 写入流程详见 [references/profile.md](references/profile.md)。
153
+
154
+ ### 简历导入
155
+
156
+ 用户给旧简历文件(.docx / .pdf),用 markitdown 读取转 Markdown:
157
+
158
+ ```bash
159
+ markitdown <文件路径> -o <输出路径.md>
160
+ ```
161
+
162
+ 将转换结果重排成简历格式 → 写到 `resume/{姓名}/{求职岗位}/简历.md`(自动建目录)。证件照用 `scripts/extract_avatar.py` 抽取放进同目录,MD 用 `avatar:` 引用。证件照、基本信息、技能列表直接写入个人资料 profile(不经评估 agent)。
163
+
164
+ ### 简历格式
165
+
166
+ 校验脚本会查的硬规则:
167
+
168
+ | 元素 | 写法 |
169
+ |------|------|
170
+ | 首模块 | `# self-intro`(必须是第一个 `#`),下用 `key: value` 放 name / role / gender / location / phone / email / avatar / links 等。多值字段(links、education)用缩进子项:<br>`links:`<br>`- GitHub: url`<br>`education:`<br>`- 学校: xxx`<br>`- 专业: xxx` |
171
+ | 模块 | `# 模块名`(出现顺序 = 简历模块顺序) |
172
+ | 简介 | 模块下纯文本段 |
173
+ | 标签 | 模块下「标签, 标签」单行(研究兴趣 / 方向) |
174
+ | 经历 | `## 机构 \| 角色/方向`(无 `\|` 则只有机构名) |
175
+ | 经历日期 | `date: 2024.07 — 2025.03` |
176
+ | 经历补充 | `meta: GPA 3.9/4.0 · 排名 1/60`(关键数字用 `**`) |
177
+ | 经历要点 | `- 成就(STAR + 量化)` |
178
+ | 技能 | `- 类别: 值` 或 `类别: A · B · C`。类别须按专业领域拆分(如 AI/Agent、编程语言、框架、数据存储、工程化各独立一类),不能跨域混放 |
179
+
180
+ `name:` 必填;`avatar:` 给照片相对路径;`links` 放可线上展示自己的链接,如个人博客、飞书文档、作品集等(key: value)。完整范例:[sample-resume.md](assets/sample-resume.md)。
181
+
182
+ ## 质量保障
183
+
184
+ ### 简历评估(强制)
185
+
186
+ 写/改完成简历后(`resume/{姓名}/{求职岗位}/简历.md`),**必须执行** [references/resume-evaluator.md](references/resume-evaluator.md) 的 6 维度评估流程,根据结果迭代修改直到所有维度通过。用户确认通过后才进入导出。
187
+
188
+ ### 易错点
189
+
190
+ - **残留 `{{占位符}}`**:组件模板占位符必须全替换(校验兜底)。
191
+ - **`# self-intro` 必须是首个 `#`**,渲染成 Header 而非 SectionHead。
192
+ - **`data-stick="1"` 别漏**:SectionHead 必带。
193
+ - **联系方式按实际字段拼**:没有的字段连同分隔符一起删。
194
+ - **`avatar:` 有就 `<img>`**:没照片用 icons.md 占位 SVG。
195
+ - **整篇只用所选主题的组件**,不从别的主题借。
196
+ - **标题层级只用 `#`/`##`**。
197
+
198
+ ## 预览与导出
199
+
200
+ 用户要求导出 PDF 时执行。详细流程见 [references/export.md](references/export.md)。
201
+
202
+ ## 添加新主题
203
+
204
+ 新主题可直接编写或从参考简历 HTML 转换(规范见 [references/themes/theme-index.md](references/themes/theme-index.md) 末尾)。写完用 `assets/sample-resume.md` 渲染 → 校验 → 套壳 → 浏览器打开预览核对,确认后登记到 theme-index。