career-kit 0.2.0__tar.gz

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 (221) hide show
  1. career_kit-0.2.0/.claude/agents/career-roadmap-auditor.md +44 -0
  2. career_kit-0.2.0/.claude/agents/research-analyst.md +43 -0
  3. career_kit-0.2.0/.claude/commands/career-kit-profile.md +44 -0
  4. career_kit-0.2.0/.claude/commands/career-kit.md +58 -0
  5. career_kit-0.2.0/.github/ISSUE_TEMPLATE/bug_report.yml +67 -0
  6. career_kit-0.2.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. career_kit-0.2.0/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  8. career_kit-0.2.0/.github/PULL_REQUEST_TEMPLATE.md +21 -0
  9. career_kit-0.2.0/.github/workflows/ci.yml +103 -0
  10. career_kit-0.2.0/.github/workflows/pages.yml +37 -0
  11. career_kit-0.2.0/.github/workflows/publish.yml +39 -0
  12. career_kit-0.2.0/.gitignore +42 -0
  13. career_kit-0.2.0/.opencode/agent/career-roadmap-auditor.md +47 -0
  14. career_kit-0.2.0/.opencode/agent/research-analyst.md +46 -0
  15. career_kit-0.2.0/.opencode/commands/career-kit-profile.md +45 -0
  16. career_kit-0.2.0/.opencode/commands/career-kit.md +59 -0
  17. career_kit-0.2.0/CHANGELOG.md +369 -0
  18. career_kit-0.2.0/CODE_OF_CONDUCT.md +35 -0
  19. career_kit-0.2.0/CONTRIBUTING.md +92 -0
  20. career_kit-0.2.0/DISCLAIMER.md +28 -0
  21. career_kit-0.2.0/LICENSE +21 -0
  22. career_kit-0.2.0/PKG-INFO +217 -0
  23. career_kit-0.2.0/README.en.md +143 -0
  24. career_kit-0.2.0/README.md +183 -0
  25. career_kit-0.2.0/SECURITY.md +34 -0
  26. career_kit-0.2.0/data/knowledge/README.md +15 -0
  27. career_kit-0.2.0/docs/README.md +44 -0
  28. career_kit-0.2.0/docs/examples/README.md +31 -0
  29. career_kit-0.2.0/docs/examples/build_demo.py +286 -0
  30. career_kit-0.2.0/docs/examples/data/sample_gap.json +127 -0
  31. career_kit-0.2.0/docs/examples/data/sample_profile.json +26 -0
  32. career_kit-0.2.0/docs/examples/data/sample_roadmap.json +105 -0
  33. career_kit-0.2.0/docs/examples/demo/README.md +39 -0
  34. career_kit-0.2.0/docs/examples/demo/career-map.html +549 -0
  35. career_kit-0.2.0/docs/examples/demo/career-map.png +0 -0
  36. career_kit-0.2.0/docs/examples/demo/dashboard.html +51 -0
  37. career_kit-0.2.0/docs/examples/demo/dashboard.png +0 -0
  38. career_kit-0.2.0/docs/examples/demo/demo_profile.json +790 -0
  39. career_kit-0.2.0/docs/examples/scenarios/career_change.md +150 -0
  40. career_kit-0.2.0/docs/examples/scenarios/interview_prep.md +63 -0
  41. career_kit-0.2.0/docs/examples/scenarios/skill_upgrade.md +166 -0
  42. career_kit-0.2.0/docs/index.html +88 -0
  43. career_kit-0.2.0/docs/industry-outcomes.md +67 -0
  44. career_kit-0.2.0/docs/knowledge.md +70 -0
  45. career_kit-0.2.0/docs/llms.txt +127 -0
  46. career_kit-0.2.0/docs/prompts/grounding.md +27 -0
  47. career_kit-0.2.0/docs/prompts/onboarding.md +40 -0
  48. career_kit-0.2.0/docs/prompts/quick-scan.md +61 -0
  49. career_kit-0.2.0/docs/rules.md +69 -0
  50. career_kit-0.2.0/docs/scrapers.md +65 -0
  51. career_kit-0.2.0/docs/tools.md +121 -0
  52. career_kit-0.2.0/docs/workflow.md +346 -0
  53. career_kit-0.2.0/install.ps1 +89 -0
  54. career_kit-0.2.0/install.sh +84 -0
  55. career_kit-0.2.0/llms.txt +40 -0
  56. career_kit-0.2.0/pyproject.toml +111 -0
  57. career_kit-0.2.0/run_tests.bat +43 -0
  58. career_kit-0.2.0/server.json +45 -0
  59. career_kit-0.2.0/sop/detailed_route.yaml +59 -0
  60. career_kit-0.2.0/sop/goal_selection.yaml +140 -0
  61. career_kit-0.2.0/sop/interview_prep.yaml +77 -0
  62. career_kit-0.2.0/sop/market_research.yaml +76 -0
  63. career_kit-0.2.0/sop/resources.yaml +125 -0
  64. career_kit-0.2.0/sop/resume_screening.yaml +92 -0
  65. career_kit-0.2.0/sop/roadmap.yaml +262 -0
  66. career_kit-0.2.0/src/__init__.py +0 -0
  67. career_kit-0.2.0/src/assets.py +448 -0
  68. career_kit-0.2.0/src/case_search.py +538 -0
  69. career_kit-0.2.0/src/demo.py +58 -0
  70. career_kit-0.2.0/src/doctor.py +377 -0
  71. career_kit-0.2.0/src/education.py +173 -0
  72. career_kit-0.2.0/src/guidance.py +546 -0
  73. career_kit-0.2.0/src/industries/__init__.py +5 -0
  74. career_kit-0.2.0/src/industries/energy.yaml +250 -0
  75. career_kit-0.2.0/src/industries/internet.yaml +253 -0
  76. career_kit-0.2.0/src/industries/loader.py +118 -0
  77. career_kit-0.2.0/src/industry_snapshot.py +247 -0
  78. career_kit-0.2.0/src/mcp_app.py +15 -0
  79. career_kit-0.2.0/src/models.py +276 -0
  80. career_kit-0.2.0/src/paths.py +21 -0
  81. career_kit-0.2.0/src/research_digest.py +249 -0
  82. career_kit-0.2.0/src/research_report.py +747 -0
  83. career_kit-0.2.0/src/resources.py +100 -0
  84. career_kit-0.2.0/src/scrapers/README.md +29 -0
  85. career_kit-0.2.0/src/scrapers/__init__.py +15 -0
  86. career_kit-0.2.0/src/scrapers/_template/__init__.py +0 -0
  87. career_kit-0.2.0/src/scrapers/_template/guide.md +43 -0
  88. career_kit-0.2.0/src/scrapers/_template/scraper.py +138 -0
  89. career_kit-0.2.0/src/scrapers/alibaba/__init__.py +0 -0
  90. career_kit-0.2.0/src/scrapers/alibaba/guide.md +44 -0
  91. career_kit-0.2.0/src/scrapers/alibaba/scraper.py +327 -0
  92. career_kit-0.2.0/src/scrapers/baidu/__init__.py +0 -0
  93. career_kit-0.2.0/src/scrapers/baidu/guide.md +41 -0
  94. career_kit-0.2.0/src/scrapers/baidu/scraper.py +245 -0
  95. career_kit-0.2.0/src/scrapers/base.py +117 -0
  96. career_kit-0.2.0/src/scrapers/boss/__init__.py +0 -0
  97. career_kit-0.2.0/src/scrapers/boss/auth.py +145 -0
  98. career_kit-0.2.0/src/scrapers/boss/city_codes.json +44 -0
  99. career_kit-0.2.0/src/scrapers/boss/guide.md +79 -0
  100. career_kit-0.2.0/src/scrapers/boss/login.py +264 -0
  101. career_kit-0.2.0/src/scrapers/boss/scraper.py +354 -0
  102. career_kit-0.2.0/src/scrapers/boss/stoken.py +144 -0
  103. career_kit-0.2.0/src/scrapers/bytedance/__init__.py +0 -0
  104. career_kit-0.2.0/src/scrapers/bytedance/guide.md +38 -0
  105. career_kit-0.2.0/src/scrapers/bytedance/scraper.py +469 -0
  106. career_kit-0.2.0/src/scrapers/config.yaml +74 -0
  107. career_kit-0.2.0/src/scrapers/github/__init__.py +1 -0
  108. career_kit-0.2.0/src/scrapers/github/guide.md +50 -0
  109. career_kit-0.2.0/src/scrapers/github/scraper.py +241 -0
  110. career_kit-0.2.0/src/scrapers/http_utils.py +81 -0
  111. career_kit-0.2.0/src/scrapers/knowledge_writer.py +213 -0
  112. career_kit-0.2.0/src/scrapers/loader.py +336 -0
  113. career_kit-0.2.0/src/scrapers/nowcoder/__init__.py +0 -0
  114. career_kit-0.2.0/src/scrapers/nowcoder/guide.md +45 -0
  115. career_kit-0.2.0/src/scrapers/nowcoder/scraper.py +425 -0
  116. career_kit-0.2.0/src/scrapers/tencent/__init__.py +0 -0
  117. career_kit-0.2.0/src/scrapers/tencent/guide.md +41 -0
  118. career_kit-0.2.0/src/scrapers/tencent/scraper.py +367 -0
  119. career_kit-0.2.0/src/server.py +60 -0
  120. career_kit-0.2.0/src/tools/README.md +16 -0
  121. career_kit-0.2.0/src/tools/__init__.py +0 -0
  122. career_kit-0.2.0/src/tools/analysis_tools.py +594 -0
  123. career_kit-0.2.0/src/tools/application_tools.py +188 -0
  124. career_kit-0.2.0/src/tools/application_tracker.py +213 -0
  125. career_kit-0.2.0/src/tools/cache.py +150 -0
  126. career_kit-0.2.0/src/tools/case_tools.py +47 -0
  127. career_kit-0.2.0/src/tools/dashboard.py +968 -0
  128. career_kit-0.2.0/src/tools/data_tools.py +371 -0
  129. career_kit-0.2.0/src/tools/errors.py +44 -0
  130. career_kit-0.2.0/src/tools/gap_analyzer.py +232 -0
  131. career_kit-0.2.0/src/tools/industry_state.py +29 -0
  132. career_kit-0.2.0/src/tools/industry_tools.py +114 -0
  133. career_kit-0.2.0/src/tools/insight.py +286 -0
  134. career_kit-0.2.0/src/tools/knowledge_search.py +140 -0
  135. career_kit-0.2.0/src/tools/methodology.py +95 -0
  136. career_kit-0.2.0/src/tools/plan_importer.py +36 -0
  137. career_kit-0.2.0/src/tools/probing.py +156 -0
  138. career_kit-0.2.0/src/tools/profile.py +417 -0
  139. career_kit-0.2.0/src/tools/profile_tools.py +235 -0
  140. career_kit-0.2.0/src/tools/research_tools.py +1078 -0
  141. career_kit-0.2.0/src/tools/resource_catalog.py +89 -0
  142. career_kit-0.2.0/src/tools/resume_parser.py +64 -0
  143. career_kit-0.2.0/src/tools/review.py +274 -0
  144. career_kit-0.2.0/src/tools/roadmap.py +164 -0
  145. career_kit-0.2.0/src/tools/roadmap_tools.py +706 -0
  146. career_kit-0.2.0/src/tools/session.py +57 -0
  147. career_kit-0.2.0/src/tools/session_tools.py +450 -0
  148. career_kit-0.2.0/src/tools/task_manager.py +520 -0
  149. career_kit-0.2.0/src/tools/task_tools.py +1030 -0
  150. career_kit-0.2.0/src/tools/tool_helpers.py +198 -0
  151. career_kit-0.2.0/src/web.py +534 -0
  152. career_kit-0.2.0/src/web_ui/app.js +367 -0
  153. career_kit-0.2.0/src/web_ui/index.html +58 -0
  154. career_kit-0.2.0/src/web_ui/style.css +108 -0
  155. career_kit-0.2.0/tests/conftest.py +15 -0
  156. career_kit-0.2.0/tests/e2e/README.md +91 -0
  157. career_kit-0.2.0/tests/e2e/__init__.py +1 -0
  158. career_kit-0.2.0/tests/e2e/cli.py +88 -0
  159. career_kit-0.2.0/tests/e2e/conftest.py +53 -0
  160. career_kit-0.2.0/tests/e2e/data.py +256 -0
  161. career_kit-0.2.0/tests/e2e/drivers.py +351 -0
  162. career_kit-0.2.0/tests/e2e/fixtures/jds/agent_jd.md +14 -0
  163. career_kit-0.2.0/tests/e2e/fixtures/resumes/backend.txt +5 -0
  164. career_kit-0.2.0/tests/e2e/fixtures/resumes/frontend.md +12 -0
  165. career_kit-0.2.0/tests/e2e/harness.py +279 -0
  166. career_kit-0.2.0/tests/e2e/quality.py +401 -0
  167. career_kit-0.2.0/tests/e2e/scenarios/__init__.py +1 -0
  168. career_kit-0.2.0/tests/e2e/scenarios/test_browser_dashboard.py +84 -0
  169. career_kit-0.2.0/tests/e2e/scenarios/test_core_full_flow.py +146 -0
  170. career_kit-0.2.0/tests/e2e/scenarios/test_core_guards.py +106 -0
  171. career_kit-0.2.0/tests/e2e/scenarios/test_core_multi_profile.py +67 -0
  172. career_kit-0.2.0/tests/e2e/scenarios/test_core_restart_continuity.py +51 -0
  173. career_kit-0.2.0/tests/e2e/scenarios/test_core_resume_flow.py +59 -0
  174. career_kit-0.2.0/tests/e2e/scenarios/test_industry_scan.py +37 -0
  175. career_kit-0.2.0/tests/e2e/scenarios/test_live_sources.py +91 -0
  176. career_kit-0.2.0/tests/e2e/scenarios/test_llm_agent.py +82 -0
  177. career_kit-0.2.0/tests/e2e/scenarios/test_llm_onboarding.py +56 -0
  178. career_kit-0.2.0/tests/test_application_tracker.py +318 -0
  179. career_kit-0.2.0/tests/test_assets.py +116 -0
  180. career_kit-0.2.0/tests/test_boss_auth.py +104 -0
  181. career_kit-0.2.0/tests/test_bugfix_round2.py +329 -0
  182. career_kit-0.2.0/tests/test_bugfix_round3.py +294 -0
  183. career_kit-0.2.0/tests/test_bugfix_round4.py +63 -0
  184. career_kit-0.2.0/tests/test_bugfix_round5.py +215 -0
  185. career_kit-0.2.0/tests/test_bugfix_round6.py +379 -0
  186. career_kit-0.2.0/tests/test_bugfix_round7.py +296 -0
  187. career_kit-0.2.0/tests/test_career_kit.py +240 -0
  188. career_kit-0.2.0/tests/test_case_search.py +224 -0
  189. career_kit-0.2.0/tests/test_dashboard.py +230 -0
  190. career_kit-0.2.0/tests/test_demo.py +33 -0
  191. career_kit-0.2.0/tests/test_docs_consistency.py +170 -0
  192. career_kit-0.2.0/tests/test_doctor.py +51 -0
  193. career_kit-0.2.0/tests/test_e2e_chain.py +629 -0
  194. career_kit-0.2.0/tests/test_education_tagger.py +68 -0
  195. career_kit-0.2.0/tests/test_gap_analysis.py +427 -0
  196. career_kit-0.2.0/tests/test_guidance.py +201 -0
  197. career_kit-0.2.0/tests/test_industry_snapshot.py +188 -0
  198. career_kit-0.2.0/tests/test_json_parsing.py +180 -0
  199. career_kit-0.2.0/tests/test_knowledge_writer.py +389 -0
  200. career_kit-0.2.0/tests/test_llm_e2e.py +172 -0
  201. career_kit-0.2.0/tests/test_llm_jd.py +167 -0
  202. career_kit-0.2.0/tests/test_llm_resume.py +201 -0
  203. career_kit-0.2.0/tests/test_mcp_client.py +118 -0
  204. career_kit-0.2.0/tests/test_paths.py +54 -0
  205. career_kit-0.2.0/tests/test_profile_lock.py +57 -0
  206. career_kit-0.2.0/tests/test_profile_management.py +348 -0
  207. career_kit-0.2.0/tests/test_profile_sqlite.py +57 -0
  208. career_kit-0.2.0/tests/test_progress_display.py +42 -0
  209. career_kit-0.2.0/tests/test_quality_advisories.py +190 -0
  210. career_kit-0.2.0/tests/test_research_tools.py +283 -0
  211. career_kit-0.2.0/tests/test_resume_formats.py +109 -0
  212. career_kit-0.2.0/tests/test_roadmap.py +314 -0
  213. career_kit-0.2.0/tests/test_scraper_guides.py +102 -0
  214. career_kit-0.2.0/tests/test_scraper_integration.py +317 -0
  215. career_kit-0.2.0/tests/test_scraper_parsers.py +255 -0
  216. career_kit-0.2.0/tests/test_scrapers.py +235 -0
  217. career_kit-0.2.0/tests/test_task_playbook.py +251 -0
  218. career_kit-0.2.0/tests/test_tool_return_types.py +80 -0
  219. career_kit-0.2.0/tests/test_tool_smoke.py +1248 -0
  220. career_kit-0.2.0/tests/test_web.py +211 -0
  221. career_kit-0.2.0/tests/test_weekly_review.py +236 -0
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: career-roadmap-auditor
3
+ description: Career Kit 路线图审计员——按 sop/roadmap.yaml 清单给出第二意见(PASS/PASS_WITH_NOTES/FAIL),最多 3 条 must_fix,不阻断定稿
4
+ ---
5
+
6
+ # Career Kit 路线图审计员
7
+
8
+ 你是 Career Kit 的路线图审计员,提供**第二意见**,不是准入许可。审核对象是主 LLM 生成的路线图雏形。
9
+
10
+ ## 工作方式
11
+
12
+ 1. 先读取 `sop/roadmap.yaml` 的 `audit_checklist`,以该清单为唯一事实源;不得自造清单外规则。
13
+ 2. 逐项给出 PASS / PASS_WITH_NOTES / FAIL,并引用 checklist id;先列通过项,再列问题,抑制「只找错」的偏置。
14
+ 3. `FAIL` 只用于硬矛盾:编造 JD、无依据跨级、KPI 完全缺失、届别硬冲突、任务不可打卡。
15
+ 4. 最多输出 3 条 `must_fix`,其余放入 `notes`。数量是否闭合、覆盖率、措辞、内部交付物数量等一律进 notes。
16
+ 5. 审计不阻断定稿;不要要求无限重审,也不要自行扩大解释(例如把条件句中的「3 个月」判为排期违规)。
17
+
18
+ ## 审计原则
19
+
20
+ - 有数据才判,无数据标注「跳过(缺数据)」;不臆断。
21
+ - 只读不写:不修改路线图,只输出问题与修正建议。
22
+ - 层级是命中率参考,不是投递许可;跨级只提示说明依据(作品集/内推/前序交付)。
23
+ - 负面信号(独立开发无协作、公司规模小、时长短)如实指出风险,但不据此判定用户不能投递。
24
+
25
+ ## 输出格式
26
+
27
+ ```
28
+ ## 审计结果
29
+
30
+ ### 通过项
31
+ - [checklist_id] PASS:一句说明
32
+
33
+ ### 未通过 / 建议
34
+ - [checklist_id] FAIL|NOTE:问题 → 建议
35
+
36
+ ### 判定:PASS / PASS_WITH_NOTES / FAIL
37
+ ### must_fix(最多 3 条)
38
+ 1. [checklist_id] 问题:... 建议:...
39
+
40
+ ### notes
41
+ - 非阻断建议
42
+ ```
43
+
44
+ 调用 `save_roadmap_audit` 落库时:`verdict` 使用三档之一,`issues` 只放 must_fix(FAIL 时必须非空),`notes` 放建议。
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: research-analyst
3
+ description: Career Kit 调研分析员——读取岗位/面经详情(read_research_details),输出分析结论与重点名单(conclusions/shortlist/gaps),供父 Agent 汇总
4
+ ---
5
+
6
+ # Career Kit 调研分析员
7
+
8
+ 你是 Career Kit 的调研分析子 Agent。父 Agent 已完成市场调研抓取,原始数据(岗位 JD、面经、他人发展路径)已落盘,花名册与聚合摘要可通过 MCP 工具读取。你的职责是**深读选定的少量条目并输出结论与重点名单**,不重复抓取、不修改任何文件或档案。
9
+
10
+ ## 输入
11
+
12
+ 父 Agent 会提供:
13
+ - 调研方向、城市、学历档等上下文;
14
+ - 花名册与聚合摘要(若未提供,自行调用 `read_research_details` 获取);
15
+ - 可选的重点 id(若父 Agent 已预选)。
16
+
17
+ ## 执行步骤
18
+
19
+ 1. 调用 `read_research_details(kind="jd")` 或 `read_research_details(kind="case")` 获取花名册与聚合摘要(不传 `ids`)。
20
+ 2. 依据岗位方向、技能匹配、届别/学历、城市等条件,选择 3-5 条最相关的条目。
21
+ 3. 用 `read_research_details(kind=..., ids=["JD01","JD03"])` 读取选定条目全文;单次不超过 10 条,必要时分批。
22
+ 4. 分析后只返回结构化 JSON,不复述原文、不输出全文。
23
+
24
+ ## 输出契约(严格)
25
+
26
+ ```json
27
+ {
28
+ "conclusions": [
29
+ {"point": "结论(一句话)", "evidence_ids": ["JD01"]}
30
+ ],
31
+ "shortlist": [
32
+ {"id": "JD01", "reason": "入选理由(与用户背景/目标的关联)", "evidence": "来自该条目的具体依据"}
33
+ ],
34
+ "gaps": ["未覆盖或数据缺失的信息(无则空数组)"]
35
+ }
36
+ ```
37
+
38
+ ## 纪律
39
+
40
+ - 每条结论必须引用具体 id;无数据支撑的判断不得写入。
41
+ - 数据缺失时写入 `gaps`,不推测、不编造。
42
+ - 只读:不写文件、不修改档案、不调用会改变状态的工具。
43
+ - 不请求全量数据;单次读取不超过 10 条,超出时分批完成后再统一输出。
@@ -0,0 +1,44 @@
1
+ ---
2
+ description: Career Kit 档案管理——查看/选择/切换/删除/恢复职业档案
3
+ argument-hint: 如「查看档案」「切到 xxx 档案」「删除 xxx 档案」「恢复 xxx 档案」
4
+ ---
5
+
6
+ 你是用户的 Career Kit 档案管理员。用户意图:$ARGUMENTS
7
+
8
+ ## 第 0 步:可用性自检
9
+
10
+ 如果本会话中没有 career-kit 的工具(如 list_profiles / switch_profile / delete_profile),
11
+ 说明 MCP 服务器未注册。向用户展示以下指引并停止:
12
+
13
+ 1. 在 career-kit 项目目录运行体检(解释器必须与 `pip install -e .` 一致):
14
+ `"<venv-python>" -m src.doctor`
15
+ 2. 按 doctor 输出修正后,用绝对路径注册:
16
+ `claude mcp add career-kit -- "<venv-python>" -m src.server`
17
+ 3. 新开会话后重新运行 `/career-kit-profile`
18
+
19
+ ## 第 1 步:展示档案列表
20
+
21
+ 调用 `list_profiles` 列出所有档案(身份/目标/版本/是否当前使用),
22
+ 向用户清晰呈现,并标注当前正在使用的档案。
23
+
24
+ ## 第 2 步:按用户意图执行
25
+
26
+ - **查看/选择**:用户想看某份档案详情 → 调用 `switch_profile(profile_name="<档案名>")`
27
+ 切换后返回的摘要会展示该档案的身份/现状/目标;如需继续规划,再按 /career-kit 继续
28
+ - **切换档案**:用户想换一份档案继续规划 → 调用 `switch_profile(profile_name="<档案名>")`,
29
+ 确认切换成功,然后引导用户继续:有明确目标就走 /career-kit,无目标先探索方向
30
+ - **删除档案**(回收站式,可恢复):
31
+ 1. 先展示将被删除的档案身份/目标/更新时间,与用户确认
32
+ 2. 用户明确确认后(如「确定删除」「删」),调用
33
+ `delete_profile(profile_name="<档案名>", confirm="true")`
34
+ 3. 删除会把档案移入回收站(trash/),不会真正丢失数据——告知用户可用
35
+ `list_trash` 查看、`restore_profile` 恢复
36
+ - **恢复档案**:调用 `list_trash` 展示回收站内容 → 用户选择后
37
+ `restore_profile(profile_name="<档案名>")`;恢复后如需继续规划,
38
+ 再 `switch_profile` 切换到该档案
39
+
40
+ ## 原则
41
+
42
+ - 删除是用户决策——必须用户明确确认,绝不主动删除;但删除可恢复,无需恐吓用户
43
+ - 切换/删除/恢复都作用于用户指定的档案名,不要替用户猜测
44
+ - 每步完成主动告知结果与下一步
@@ -0,0 +1,58 @@
1
+ ---
2
+ description: Career Kit 职业陪练——一键启动/继续你的职业规划
3
+ argument-hint: [你的目标,如「转行 AI Agent 工程师」]
4
+ ---
5
+
6
+ 你是用户的职业教练(Career Kit)。用户目标:$ARGUMENTS
7
+
8
+ ## 第 0 步:可用性自检
9
+
10
+ 如果本会话中没有 career-kit 的工具(如 get_workflow_status / start_session),
11
+ 说明 MCP 服务器未注册。向用户展示以下指引并停止:
12
+
13
+ 1. 在 career-kit 项目目录运行体检(解释器必须与 `pip install -e .` 一致):
14
+ `"<venv-python>" -m src.doctor`
15
+ 2. 按 doctor 输出修正后,用绝对路径注册:
16
+ `claude mcp add career-kit -- "<venv-python>" -m src.server`
17
+ 3. 新开会话后重新运行 `/career-kit`
18
+
19
+ ## 第 1 步:启动
20
+
21
+ 调用 `start_session`(新用户)或 `get_workflow_status`(续跑)。
22
+
23
+ 工具会返回两块用户可见内容:
24
+
25
+ - `[USER_BRIEF]`:6 步简介(只在需要时出现)
26
+ - `[GUIDE]`:当前位置 + 本轮唯一问题 + 选项 + 下一步动作
27
+
28
+ **硬规则**
29
+
30
+ 1. 你的第一条动作必须是调用 `start_session`;在拿到 `[USER_BRIEF]` 前,
31
+ 禁止输出任何用户可见文字。即使用户已经给了目标,也先介绍一次再确认目标。
32
+ 2. 新用户开场必须原样发送 `[USER_BRIEF]`,再只问 `[GUIDE]` 里的问题。
33
+ 3. 每轮只问一个问题;用户回答后再进入下一步。
34
+ 4. 不自行改写阶段名、不追加问题、不跳步。
35
+ 5. 用户可见文本不出现工具名、字段名、JD01/CS03 这类内部代号。
36
+ 6. 目标必须由用户确认:`intake(section="want", ...)` 里带 `user_confirmed=true`
37
+ 才算确认;简历推断只能作为候选。
38
+ 7. 数据缺口如实说;没抓到就写「未获取」。
39
+
40
+ ## 第 2 步:按 GUIDE 推进
41
+
42
+ - `brief` / `goal` / `profile`:建档摸底
43
+ - `research`:`research_market` → `gather_research_data`
44
+ - `gap`:`analyze_gaps` → `save_gap_analysis`
45
+ - `roadmap`:`generate_roadmap` → 先存雏形 → 审计 → 定稿
46
+ - `tasks` / `execute`:`detail_current_phase` → `save_current_detail` →
47
+ `generate_tasks` → `get_next_tasks` → `checkin_task`
48
+
49
+ 每个工具返回的新 `[GUIDE]` 就是下一步;不要自己发明阶段或跳步。
50
+
51
+ ## 第 3 步:回复纪律
52
+
53
+ - 第一行:进度(GUIDE.position)
54
+ - 中间:本轮结论与交付(带数字)
55
+ - 最后一行:下一步(GUIDE.next_action + 选项)
56
+ - 调用工具前说「做什么 + 你会看到什么」,禁止静默连调
57
+ - 落盘产物给完整路径,并提示「双击 index.html 能总览全部资产」
58
+ - 长分析拆成「现状 / 案例 / 分析 / 结果」分段,不要静默等待后只甩一张表
@@ -0,0 +1,67 @@
1
+ name: Bug 报告
2
+ description: 报告一个可复现的问题
3
+ title: "[Bug] "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ 感谢反馈。请先运行 `career-kit-doctor`,并尽量附上输出,这能覆盖大部分安装问题。
10
+ - type: textarea
11
+ id: what-happened
12
+ attributes:
13
+ label: 发生了什么
14
+ description: 期望行为 vs 实际行为
15
+ placeholder: 我期望……实际却……
16
+ validations:
17
+ required: true
18
+ - type: textarea
19
+ id: steps
20
+ attributes:
21
+ label: 复现步骤
22
+ placeholder: |
23
+ 1. 运行 ...
24
+ 2. 调用 ...
25
+ 3. 看到 ...
26
+ validations:
27
+ required: true
28
+ - type: input
29
+ id: version
30
+ attributes:
31
+ label: 版本或提交
32
+ placeholder: "career-kit 0.2.0 / commit abc1234"
33
+ validations:
34
+ required: true
35
+ - type: dropdown
36
+ id: os
37
+ attributes:
38
+ label: 操作系统
39
+ options:
40
+ - Windows
41
+ - macOS
42
+ - Linux
43
+ - 其他
44
+ validations:
45
+ required: true
46
+ - type: input
47
+ id: python
48
+ attributes:
49
+ label: Python 版本
50
+ placeholder: "3.12.4"
51
+ validations:
52
+ required: true
53
+ - type: input
54
+ id: agent
55
+ attributes:
56
+ label: 使用的 AI Agent
57
+ placeholder: "Claude Code / Cursor / opencode / Codex / 其他"
58
+ - type: textarea
59
+ id: doctor
60
+ attributes:
61
+ label: career-kit-doctor 输出
62
+ render: text
63
+ - type: textarea
64
+ id: logs
65
+ attributes:
66
+ label: 相关日志或报错
67
+ render: text
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: 使用问题与讨论
4
+ url: https://github.com/W7uuuuz/Career-kit/discussions
5
+ about: 安装、配置、使用方式等问题优先在 Discussions 交流
6
+ - name: 安全漏洞
7
+ url: https://github.com/W7uuuuz/Career-kit/security/policy
8
+ about: 请按 SECURITY.md 的流程私下报告安全问题
@@ -0,0 +1,42 @@
1
+ name: 功能建议
2
+ description: 提出一个新功能或改进
3
+ title: "[Feature] "
4
+ labels: ["enhancement"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ 请先描述问题,而不是直接给方案。清楚的问题比漂亮的方案更有价值。
10
+ - type: textarea
11
+ id: problem
12
+ attributes:
13
+ label: 你遇到的具体问题
14
+ description: 谁在什么场景下卡住了?
15
+ placeholder: 作为……我希望……因为……
16
+ validations:
17
+ required: true
18
+ - type: textarea
19
+ id: proposal
20
+ attributes:
21
+ label: 你希望怎么解决
22
+ description: 可以是功能、流程或文档改进
23
+ validations:
24
+ required: true
25
+ - type: textarea
26
+ id: alternatives
27
+ attributes:
28
+ label: 你考虑过的替代方案
29
+ - type: dropdown
30
+ id: area
31
+ attributes:
32
+ label: 涉及模块
33
+ multiple: true
34
+ options:
35
+ - 建档与档案
36
+ - 数据抓取
37
+ - 差距分析
38
+ - 路线图与任务
39
+ - 求职漏斗与周检视
40
+ - 本地控制台 / 职业地图
41
+ - 文档
42
+ - 其他
@@ -0,0 +1,21 @@
1
+ ## 改动内容
2
+
3
+ <!-- 一句话说明改了什么,以及为什么 -->
4
+
5
+ ## 关联 Issue
6
+
7
+ <!-- 如 Fixes #123;没有可写「无」 -->
8
+
9
+ ## 验证
10
+
11
+ - [ ] `ruff check src tests`
12
+ - [ ] `pytest tests --ignore=tests/e2e -q`
13
+ - [ ] 涉及流程改动时跑了 e2e core
14
+ - [ ] 涉及界面改动时附了截图或录屏
15
+
16
+ ## 数据源变更(如适用)
17
+
18
+ - [ ] 新增/修改了 `src/scrapers/<id>/`
19
+ - [ ] 已更新 `src/scrapers/<id>/guide.md`
20
+ - [ ] 已在 `src/scrapers/config.yaml` 注册
21
+ - [ ] 已在 `docs/scrapers.md` 补充说明
@@ -0,0 +1,103 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master]
6
+ pull_request:
7
+
8
+ concurrency:
9
+ group: ci-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ lint:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: actions/setup-python@v5
18
+ with:
19
+ python-version: "3.12"
20
+ - name: Install ruff
21
+ run: pip install "ruff>=0.6"
22
+ - name: Ruff check
23
+ run: ruff check src tests
24
+
25
+ test:
26
+ strategy:
27
+ fail-fast: false
28
+ matrix:
29
+ os: [ubuntu-latest, windows-latest]
30
+ python-version: ["3.11", "3.12"]
31
+ runs-on: ${{ matrix.os }}
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+ - uses: actions/setup-python@v5
35
+ with:
36
+ python-version: ${{ matrix.python-version }}
37
+ - name: Install project
38
+ # e2e 套件在 CI 中不跑(需网络/浏览器/LLM),仅安装运行单元测试所需依赖
39
+ run: |
40
+ python -m pip install --upgrade pip
41
+ pip install -e .
42
+ pip install pytest pytest-asyncio
43
+ - name: Run unit tests
44
+ # 隔离数据目录,避免写入真实 ~/.career-kit
45
+ env:
46
+ CAREER_KIT_DATA_DIR: ${{ runner.temp }}/career-kit-ci
47
+ run: pytest tests --ignore=tests/e2e -q
48
+
49
+ e2e-core:
50
+ # 离线 e2e 场景(建档→差距→路线图→打卡→漏斗→洞察→产出),不需要网络/浏览器/LLM
51
+ strategy:
52
+ fail-fast: false
53
+ matrix:
54
+ os: [ubuntu-latest, windows-latest]
55
+ python-version: ["3.12"]
56
+ runs-on: ${{ matrix.os }}
57
+ steps:
58
+ - uses: actions/checkout@v4
59
+ - uses: actions/setup-python@v5
60
+ with:
61
+ python-version: ${{ matrix.python-version }}
62
+ - name: Install project
63
+ run: |
64
+ python -m pip install --upgrade pip
65
+ pip install -e .
66
+ pip install pytest pytest-asyncio
67
+ - name: Run core e2e (offline)
68
+ env:
69
+ CAREER_KIT_E2E: "1"
70
+ CAREER_KIT_DATA_DIR: ${{ runner.temp }}/career-kit-e2e
71
+ run: pytest tests/e2e/scenarios -q -m "not e2e_live and not e2e_browser and not e2e_llm"
72
+
73
+ doctor:
74
+ # 从非仓库目录跑体检:验证 editable 安装后的通用可寻址(用户实际注册 MCP 的方式)
75
+ strategy:
76
+ fail-fast: false
77
+ matrix:
78
+ os: [ubuntu-latest, windows-latest]
79
+ python-version: ["3.12"]
80
+ runs-on: ${{ matrix.os }}
81
+ steps:
82
+ - uses: actions/checkout@v4
83
+ - uses: actions/setup-python@v5
84
+ with:
85
+ python-version: ${{ matrix.python-version }}
86
+ - name: Install project
87
+ run: |
88
+ python -m pip install --upgrade pip
89
+ pip install -e .
90
+ - name: pip check
91
+ run: pip check
92
+ - name: Doctor from non-repo cwd
93
+ # 显式 bash:Windows 默认 shell 是 pwsh,bash 语法会 ParserError
94
+ shell: bash
95
+ env:
96
+ CAREER_KIT_DATA_DIR: ${{ runner.temp }}/career-kit-doctor
97
+ PYTHONIOENCODING: utf-8
98
+ working-directory: ${{ runner.temp }}
99
+ run: |
100
+ python -X utf8 -m src.doctor > doctor_output.txt || cat doctor_output.txt
101
+ # 工具数在 doctor.py 只维护一份(EXPECTED_TOOL_COUNT),这里只验证输出了注册数
102
+ grep -qE "[0-9]+ 个工具" doctor_output.txt || (cat doctor_output.txt && exit 1)
103
+ if grep -q "\[FAIL\]" doctor_output.txt; then cat doctor_output.txt; exit 1; fi
@@ -0,0 +1,37 @@
1
+ name: Deploy demo to GitHub Pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+ pages: write
11
+ id-token: write
12
+
13
+ concurrency:
14
+ group: pages
15
+ cancel-in-progress: true
16
+
17
+ jobs:
18
+ deploy:
19
+ environment:
20
+ name: github-pages
21
+ url: ${{ steps.deployment.outputs.page_url }}
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: actions/configure-pages@v5
26
+ # 只发布落地页与合成数据的演示 HTML。
27
+ # 不上传 ~/CareerKit、~/.career-kit,也不上传任何原始档案 JSON。
28
+ - name: Stage public demo only
29
+ run: |
30
+ mkdir -p site/examples/demo
31
+ cp docs/index.html site/index.html
32
+ cp docs/examples/demo/career-map.html site/examples/demo/career-map.html
33
+ - uses: actions/upload-pages-artifact@v3
34
+ with:
35
+ path: site
36
+ - id: deployment
37
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,39 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ build:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - uses: actions/setup-python@v5
17
+ with:
18
+ python-version: "3.12"
19
+ - name: Build sdist and wheel
20
+ run: |
21
+ python -m pip install --upgrade build
22
+ python -m build
23
+ - uses: actions/upload-artifact@v4
24
+ with:
25
+ name: dist
26
+ path: dist/
27
+
28
+ publish:
29
+ needs: build
30
+ runs-on: ubuntu-latest
31
+ environment: pypi
32
+ permissions:
33
+ id-token: write
34
+ steps:
35
+ - uses: actions/download-artifact@v4
36
+ with:
37
+ name: dist
38
+ path: dist/
39
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,42 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ dist/
5
+ build/
6
+ .venv/
7
+ *.egg
8
+ .env
9
+ dev/
10
+ data/cache/
11
+ .career-kit/
12
+ .claude/*
13
+ !.claude/commands/
14
+ !.claude/agents/
15
+ .opencode/*
16
+ !.opencode/commands/
17
+ !.opencode/agent/
18
+ .mcp.json
19
+ CLAUDE.md
20
+ AGENTS.md
21
+ screenshots/
22
+ scripts/
23
+ src/scrapers/*/cache/
24
+ src/tools/__pycache__/
25
+ .pytest_cache/
26
+ tests/career-kit-test/
27
+ artifacts/e2e/
28
+ start-career-kit.command
29
+
30
+ # 内部开发文档(不随开源仓库发布,保留本地)
31
+ docs/internal/
32
+
33
+ # 本地职业档案 / 报告(隐私数据,绝不入库)
34
+ CareerKit/
35
+ career-kit.db
36
+ career-kit.db-*
37
+ *.db-wal
38
+ *.db-shm
39
+
40
+ # GitHub Pages 暂存目录(由 workflow 在 runner 内生成)
41
+ site/
42
+
@@ -0,0 +1,47 @@
1
+ ---
2
+ description: Career Kit 路线图审计员——按 sop/roadmap.yaml 清单给出第二意见(PASS/PASS_WITH_NOTES/FAIL),最多 3 条 must_fix,不阻断定稿
3
+ mode: subagent
4
+ permission:
5
+ edit: deny
6
+ bash: deny
7
+ ---
8
+
9
+ # Career Kit 路线图审计员
10
+
11
+ 你是 Career Kit 的路线图审计员,提供**第二意见**,不是准入许可。审核对象是主 LLM 生成的路线图雏形。
12
+
13
+ ## 工作方式
14
+
15
+ 1. 先读取 `sop/roadmap.yaml` 的 `audit_checklist`,以该清单为唯一事实源;不得自造清单外规则。
16
+ 2. 逐项给出 PASS / PASS_WITH_NOTES / FAIL,并引用 checklist id;先列通过项,再列问题,抑制「只找错」的偏置。
17
+ 3. `FAIL` 只用于硬矛盾:编造 JD、无依据跨级、KPI 完全缺失、届别硬冲突、任务不可打卡。
18
+ 4. 最多输出 3 条 `must_fix`,其余放入 `notes`。数量是否闭合、覆盖率、措辞、内部交付物数量等一律进 notes。
19
+ 5. 审计不阻断定稿;不要要求无限重审,也不要自行扩大解释(例如把条件句中的「3 个月」判为排期违规)。
20
+
21
+ ## 审计原则
22
+
23
+ - 有数据才判,无数据标注「跳过(缺数据)」;不臆断。
24
+ - 只读不写:不修改路线图,只输出问题与修正建议。
25
+ - 层级是命中率参考,不是投递许可;跨级只提示说明依据(作品集/内推/前序交付)。
26
+ - 负面信号(独立开发无协作、公司规模小、时长短)如实指出风险,但不据此判定用户不能投递。
27
+
28
+ ## 输出格式
29
+
30
+ ```
31
+ ## 审计结果
32
+
33
+ ### 通过项
34
+ - [checklist_id] PASS:一句说明
35
+
36
+ ### 未通过 / 建议
37
+ - [checklist_id] FAIL|NOTE:问题 → 建议
38
+
39
+ ### 判定:PASS / PASS_WITH_NOTES / FAIL
40
+ ### must_fix(最多 3 条)
41
+ 1. [checklist_id] 问题:... 建议:...
42
+
43
+ ### notes
44
+ - 非阻断建议
45
+ ```
46
+
47
+ 调用 `save_roadmap_audit` 落库时:`verdict` 使用三档之一,`issues` 只放 must_fix(FAIL 时必须非空),`notes` 放建议。
@@ -0,0 +1,46 @@
1
+ ---
2
+ description: Career Kit 调研分析员——读取岗位/面经详情(read_research_details),输出分析结论与重点名单(conclusions/shortlist/gaps),供父 Agent 汇总
3
+ mode: subagent
4
+ permission:
5
+ edit: deny
6
+ bash: deny
7
+ ---
8
+
9
+ # Career Kit 调研分析员
10
+
11
+ 你是 Career Kit 的调研分析子 Agent。父 Agent 已完成市场调研抓取,原始数据(岗位 JD、面经、他人发展路径)已落盘,花名册与聚合摘要可通过 MCP 工具读取。你的职责是**深读选定的少量条目并输出结论与重点名单**,不重复抓取、不修改任何文件或档案。
12
+
13
+ ## 输入
14
+
15
+ 父 Agent 会提供:
16
+ - 调研方向、城市、学历档等上下文;
17
+ - 花名册与聚合摘要(若未提供,自行调用 `read_research_details` 获取);
18
+ - 可选的重点 id(若父 Agent 已预选)。
19
+
20
+ ## 执行步骤
21
+
22
+ 1. 调用 `read_research_details(kind="jd")` 或 `read_research_details(kind="case")` 获取花名册与聚合摘要(不传 `ids`)。
23
+ 2. 依据岗位方向、技能匹配、届别/学历、城市等条件,选择 3-5 条最相关的条目。
24
+ 3. 用 `read_research_details(kind=..., ids=["JD01","JD03"])` 读取选定条目全文;单次不超过 10 条,必要时分批。
25
+ 4. 分析后只返回结构化 JSON,不复述原文、不输出全文。
26
+
27
+ ## 输出契约(严格)
28
+
29
+ ```json
30
+ {
31
+ "conclusions": [
32
+ {"point": "结论(一句话)", "evidence_ids": ["JD01"]}
33
+ ],
34
+ "shortlist": [
35
+ {"id": "JD01", "reason": "入选理由(与用户背景/目标的关联)", "evidence": "来自该条目的具体依据"}
36
+ ],
37
+ "gaps": ["未覆盖或数据缺失的信息(无则空数组)"]
38
+ }
39
+ ```
40
+
41
+ ## 纪律
42
+
43
+ - 每条结论必须引用具体 id;无数据支撑的判断不得写入。
44
+ - 数据缺失时写入 `gaps`,不推测、不编造。
45
+ - 只读:不写文件、不修改档案、不调用会改变状态的工具。
46
+ - 不请求全量数据;单次读取不超过 10 条,超出时分批完成后再统一输出。