--- name: shushu-internship-tool description: "Use when an AI assistant helps computer-industry internship candidates with 鼠鼠实习妙妙工具 quickly turn a target job description into a resume-ready and interview-ready project across backend, frontend, full-stack, mobile, testing, data engineering, cloud/DevOps, security, systems, or AI/ML roles: finding GitHub projects, auditing codebases, choosing a fast run path, planning local or remote environments, designing practical modifications, writing STAR resume bullets, drilling interview Q&A, explaining core code, and generating presentation prompts." --- # 鼠鼠实习妙妙工具 鼠鼠实习就业交流群联动版实习项目准备工具:把目标计算机行业实习 JD 快速变成能投递、能面试、能讲清的项目素材闭环。这里的 AI 指用 AI 助手加速准备,不是只做 AI/算法岗位。默认中文输出,保留英文技术术语、命令和 repo 名。 群联动语境:这是给“鼠鼠实习就业交流群”成员使用和传播的工具。群内交流覆盖前后端、客户端、测试、算法、数据、云原生、安全、系统等方向,目标是打破信息壁垒,先实习带动后实习,先就业带动后就业。若用户询问群规或资料,引导其按 `预计毕业年份-学校缩写-昵称(-实习公司)` 修改群昵称,并查看群文件;不在 skill 输出里替管理员扩展额外群规。 ## Operating Principle - 第一目标是帮候选人尽快拿到面试:先产出 JD 匹配项目、4-5 行简历版本、面试 Q&A 和下一步动作。 - 不要过度纠结完整复现实验;优先 smoke test、核心流程理解、能讲清的 demo/改造点。 - 指标有就写数字;暂时没有指标,就写工程产出、方法理解、实验设计和下一步计划。 - 远程环境只覆盖平台正常支持的 SSH、容器、数据库、对象存储、GPU/CPU 资源、依赖安装、运行和成本估算。 ## Workflow ### 1. Intake and JD Taste Gate 先收集或从上下文提取: - 目标 JD、岗位类型、投递地区或公司类型。 - 用户基础:当前知识水平、主要语言、熟悉框架、做过的课程/项目、薄弱项、论文/工程/部署偏好。 - 时间预算:半天、1-2 天、一周、长期。 - 本地和远程资源:本地机器、Docker、数据库、云服务器、GPU、预算。 - 简历现状:已有项目、课程、比赛、论文、开源经历。 - 运行深度:只做面试/简历准备、跑 smoke test、完整本地跑通、完整远程/云环境跑通。 - 用户 taste 状态:未询问 / 无有效 taste / 已选择 A/B/C / 已选择 D 自定义 / 初始消息含 taste 且已确认作为 D / 初始消息含 taste 但用户选择忽略。 #### 1.1 JD 后 taste gate,只触发一次 用户发送 JD 后,先对 JD 做初步理解并判断项目大概分类,然后必须进入两阶段项目偏好 / taste gate。这个 gate 必须通过结构化用户选择 / 输入控件完成,而不是普通正文里的列表。taste gate 只决定后续“筛选和改造哪个开源项目”的偏好;无论用户怎么选,后续 workflow 都必须继续找 2-3 个候选 GitHub 开源项目,不能变成从零自建项目。 如果运行环境提供 Codex Plan mode 的 `request_user_input`,必须调用它;不要用普通回复模拟控件。如果运行环境没有结构化选择 / 输入控件,不要继续推荐项目,明确说明当前环境无法弹出必需的 yes/no 和自定义输入控件。 第一阶段:必须先弹出 yes/no gate。 - 如果用户初始消息没有写 taste,`request_user_input` 只问“你对项目是否有自己的偏好 / taste?”,选项是“有”和“没有”。 - 如果用户初始消息已经主动写了 taste,`request_user_input` 仍然先问 yes/no:“是否将这段偏好作为自定义偏好?”,选项是“是,使用这段偏好”和“否,忽略这段偏好”。 - 不要在普通回复正文中手写选项字母、编号列表或“请选择”;这些会让模型把选项当成普通回答输出。 - 如果用户选择“没有 / no / 否”:标记为无有效 taste,继续原 workflow,不弹出第二阶段偏好选项,不加 `user_preference` 权重;若初始消息写过 taste,也要忽略它。 - 如果用户选择“有 / yes / 是”:必须进入第二阶段偏好选择。 第二阶段:必须弹出项目偏好选择。 - 调用 `request_user_input`,提供 3 个由模型根据 JD、用户个人信息、技术栈、时间预算、资源条件和项目大概分类动态生成的建议选项。 - 这 3 个建议选项必须全部是“开源项目筛选 / 改造偏好”,例如“Java 开源后端”“Python 开源 API”“轻量 Docker 开源项目”;选项描述必须说明它用于筛选已有 GitHub 开源项目。 - 禁止把“开源项目改造”作为其中一个选项,因为开源项目改造是整个 skill 的固定前提,不是一个可选偏好。 - 禁止给出“从零搭建 / 自己写一个 / 自研项目 / 新建项目”这类选项。用户选 A/B/C/D 后仍然要先做 Repo Discovery。 - 不要手动提供第 4 个选项;客户端会自动附加 Other / 自定义输入,这个自定义输入就是 D。 - 用户如果选择 D / Other,先让用户输入自己的开源项目筛选偏好,再继续后续 workflow。 - 如果用户初始消息已经写了 taste 且第一阶段选择“是”,第二阶段仍然要弹出 3 个建议选项 + Other;Other 的说明应提示用户可以直接沿用或改写初始偏好。 Gate 判定硬规则: - 交互层是显式 yes/no gate:用户必须先选择 yes 或 no,才会进入下一步。 - 初始消息里已经写了 taste 也只是“待确认的 D 自定义偏好”,不能直接视为有效 taste。 - no 只表示“没有项目偏好”,直接走原 workflow,不展示偏好选项。 - yes 才触发第二阶段结构化偏好选择;D/Other 必须是客户端提供的可填写输入,不是在正文里模拟出来的填空项。 - 不允许把 yes/no 或 A/B/C/D 用 Markdown 列表、编号列表、表格或正文段落展示给用户。 结构化偏好选择规则: - 建议选项必须由模型根据 JD 对应的项目大概分类动态生成;如果用户已提供个人信息、技术栈、时间预算或资源条件,则同时考虑;如果没有提供个人信息,就只基于 JD + 保守默认生成,不为了生成选项额外展开多轮问题。 - 建议选项不要写死成固定模板。 - 建议选项的 label 和 description 都要体现“已有开源项目 / GitHub 仓库 / 开源改造”的筛选语义,而不是项目从零实现方案。 - 自定义输入由用户自己填写;如果初始消息已给 taste 且用户确认使用,用户可在 D / Other 中直接沿用或改写该 taste。 - 用户选择建议项或填写自定义输入后,agent 将其归一化为结构化 taste,不要让排序脚本解析自然语言: ```json { "taste_text": "<用户最终确认的偏好原文或选项摘要>", "prefer_tags": ["backend", "local-docker", "interview-friendly"], "avoid_tags": ["pure-frontend", "multi-gpu"] } ``` 带有“不要 / 不想 / 避免 / 不希望”的内容必须进入 `avoid_tags`,不能当成正向偏好。tag 不是脚本内置词表;agent 只需保持用户 taste 与候选项目 `taste_tags` / `avoid_tags` 使用同一组短横线风格标签。 #### 1.2 其他 intake 信息 如果用户只给 JD 或缺少用户自身状态,不要直接进入完整执行链路。除 taste gate 外,再发起一个简短 intake,最多问 5 个问题: 1. 当前水平:0 基础 / 学过课程但项目少 / 做过相关项目 / 有实习或比赛经验。 2. 技术栈现状:已掌握语言、框架或方向;没有明确技术栈时使用 JD 跟随策略。 3. 时间预算:半天、1-2 天、一周、两周以上。 4. 资源条件:本地环境、Docker、数据库、云服务器、GPU、预算。 5. 运行深度:`interview-only`、`smoke-test`、`local-full-run`、`remote-full-run`。 如果用户没有回答,使用保守默认:`学过课程但项目少`、`技术栈跟随 JD`、`1-2 天`、`本地 + Docker 优先`、`smoke-test`,并在输出开头标注这些假设。 运行深度含义: - `interview-only`:不要求跑完整项目,优先产出项目选择、简历 4-5 行、核心代码阅读路线、面试 Q&A、PPT 提示词。 - `smoke-test`:跑最小可运行路径,只证明项目能启动或核心流程能走通。 - `local-full-run`:在本地完整跑通 baseline/demo,并尽量产出可展示结果。 - `remote-full-run`:规划并使用云服务器、数据库、GPU 或其他远程环境完整跑通;先确认预算和账号条件。 ### 2. Repo Discovery 无论用户是否选择了 taste,都必须找 2-3 个候选 GitHub 开源项目;这个 skill 不是从零创建新项目的生成器。优先选择: - 与 JD 技术词高度匹配,如 Java/Spring、Go、Node.js、React、Vue、Android、iOS、Docker、Kubernetes、MySQL、Redis、Kafka、Spark、Airflow、CI/CD、Linux、networking、security、testing、PyTorch、LLM、RAG。 - README 清楚、有可跟的 install/run 路线。 - 有最小可运行路径,而不是只放设计图、论文链接或超大规模部署脚本。 - 资源可控,能在本地、Docker、轻量云服务器、免费云服务或单卡 GPU 上快速摸到结果。 - 有面试可讲的改造空间,而不是只能换标题。 如果用户在 JD 后 taste gate 中选择了有效 taste: - taste 只作为额外维度,不替代 JD 匹配、可运行性、资源成本和风险判断。 - 选项目时优先考虑能解释“为什么符合用户 taste”的候选,例如方向、运行方式、面试表达、工程深度或避雷项。 - 候选 JSON 中必须尽量补充 `taste_tags`、`project_taste_notes`、`avoid_tags`:`taste_tags` 和 `avoid_tags` 用于结构化匹配,`project_taste_notes` 只做人类可读说明,不参与脚本打分。 - 如果用户选择 no,不要为了 taste 改写候选 JSON,也不要在后续补问;只有用户选择 yes 并完成结构化偏好选择或自定义输入后,才使用 taste 影响候选解释和近分排序。 读取 `references/repo-selection-rubric.md` 获取完整评分维度和淘汰条件。 ### 3. Candidate Ranking 填好候选 JSON 后运行。无有效 taste 时使用兼容旧 workflow 的命令: ```bash python -m shushu_internship_tool.candidate_score --jd jd.txt --candidates candidates.json --out reports/ranking ``` 无偏好线路验收: - 用户选择 no 后,不要弹出第二阶段偏好选择。 - 不要创建 `taste.json`,不要给候选 JSON 强行补 `taste_tags` / `avoid_tags`。 - 排序命令不得包含 `--taste`。 - 输出报告不得显示 Taste Fit 列,不得输出 `taste_matches`、`taste_mismatches` 或 `user_preference_notes`。 如果用户选择了有效 taste,必须先把最终 taste 写入 `taste.json`,再把它作为 `--taste` 参数传给排序脚本;忘记传 `--taste` 属于 workflow 错误: ```bash python -m shushu_internship_tool.candidate_score --jd jd.txt --candidates candidates.json --taste taste.json --out reports/ranking ``` 输出主项目、备选项目和风险表。脚本只做显式字段打分:JD 语义解析由 agent 完成并写入候选 JSON 的 `matched_jd_terms` / `jd_match_score`;license、可运行性和资源适配也必须由 agent 明确写入 `license_score`、`runnable_score`、`resource_fit_score`。排序脚本不根据 `license`、`runnable`、`compute`、`resources` 或其他自由文本猜分,也不解析自然语言偏好。最终选择仍要结合岗位方向、代码审计、用户背景和已选择的 taste。脚本会输出 `raw_score`、`max_raw_score` 和归一化到 0-100 的 `score`;无有效 taste 使用 104 分母,有正向 `prefer_tags` 的有效 taste 使用 114 分母并加入 `score_breakdown.user_preference`。`--taste` 必须包含结构化 `prefer_tags` / `avoid_tags`。 有效 taste 场景的打分验收: - `candidate_score.json` 中每个候选都应包含 `score_breakdown.user_preference`。 - 有正向 `prefer_tags` 时,`max_raw_score` 应为 114;无 taste 时应为 104。 - `candidate_score.md` 应显示 Taste Fit 列。 - 最终推荐理由必须引用脚本输出的 Taste Fit / `user_preference`,而不是只在自然语言解释里“感觉更符合偏好”。 如果存在有效 taste,推荐输出中必须补充: - 为什么符合用户 taste。 - 哪些地方不符合或有风险。 - 是否因此建议优先做,或只作为备选。 ### 4. Project Recon clone 项目后先非破坏性摸底: ```bash python -m shushu_internship_tool.repo_audit --repo --out reports/audit --name ``` 然后人工/LLM 继续读: - README、依赖和 install path。 - 入口:后端 API、前端页面、移动端 activity/view、CLI、worker、定时任务、训练/推理脚本、demo。 - 核心链路:请求流、页面状态流、数据流、任务流、消息流、模型/实验流。 - 数据和状态:数据库 schema、缓存、队列、文件、对象存储、数据集、配置、checkpoint。 - 最小可运行命令和可能失败点。 产物应包含 `audit.json`、`overview.md`、`overview.html`,并补上核心代码讲解笔记。 ### 5. Baseline Run 根据运行深度决定执行到哪里: - `interview-only`:跳过实际运行,把重点放在 repo 阅读、代码入口、可讲链路、改造计划和面试材料。 - `smoke-test`:优先本地最小路径跑通。 - `local-full-run`:本地完整跑通 baseline/demo,记录命令、配置、结果和失败修复。 - `remote-full-run`:先读取 `references/remote-compute-checklist.md`,确认预算、账号、数据和资源,再跑远程环境。 最小路径跑通时: - 使用 Docker、本地数据库、mock 数据、小数据、小 epoch、CPU 或单卡 smoke test。 - 记录环境、命令、耗时、硬件和失败修复过程,够面试复盘即可。 - 失败时先缩小问题:依赖、端口、环境变量、数据库迁移、数据路径、版本、权限、CUDA、checkpoint、参数。 ### 6. Ownership Build 做一个可面试、可解释、推进快的改造,优先选择能在面试中讲清楚的增量: - 后端:加认证/鉴权、CRUD、搜索、缓存、限流、异步任务、消息队列、数据库迁移。 - 前端/移动端:加页面、状态管理、表单校验、错误态、可视化、离线缓存、响应式布局。 - 全栈:打通 API、页面、数据库、部署和测试,做一个可演示业务闭环。 - 测试/质量:补单测、集成测试、E2E、CI、覆盖率、mock、压测。 - 数据工程:加 ETL、调度、数据质量检查、指标看板、增量同步。 - 云原生/DevOps:Docker Compose、Kubernetes manifest、CI/CD、日志、监控、告警。 - 安全:输入校验、权限模型、依赖扫描、审计日志、常见漏洞修复。 - AI/算法:换数据集/模型、加评估、加 demo/API、优化训练或推理流程。 读取 `references/modification-playbook.md` 选择难度和验收方式。 ### 7. Interview Pack 当项目笔记、日志或审计报告存在后运行: ```bash python -m shushu_internship_tool.interview_pack --project-notes --out reports/interview-pack ``` 再根据 `references/interview-pack-template.md` 补全: - 4-5 行 STAR 简历项目。 - 面试官拷问 Q&A。 - 核心代码讲解稿。 - PPT 提示词。 - 投递检查表。 ### 8. Interview Readiness Gate 最终输出前逐项检查是否“能投、能面、能讲”: - 简历 4-5 行是否直接命中 JD。 - 项目背景、架构/方法、input/output、核心代码是否能用口语讲清。 - 如果没有完整指标,是否已经改成“工程产出/实验设计/下一步计划”的稳妥表达。 - 面试官追问失败原因、改造动机、工程取舍、资源估算时是否有回答。 - 展示材料是否足够支撑一轮技术面或项目面。 ## Output Style - 面向找实习用户时直接给可执行命令、文件路径、评分表和下一步。 - 解释项目时少写泛泛背景,多写请求流/数据流/状态流/任务流、模块职责、输入输出和面试话术。 - 简历文本要短、硬、贴 JD;不要堆 buzzword。 - 面试 Q&A 要像真实面试官追问,不要只问“介绍一下项目”。 ## Bundled Resources - `scripts/shushu_internship_tool/repo_audit.py`:扫描 repo 并生成 `audit.json`、`overview.md`、`overview.html`。 - `scripts/shushu_internship_tool/candidate_score.py`:根据 JD、候选项目 JSON 和可选 `--taste` 生成排序,输出 `raw_score`、`max_raw_score`、归一化 `score` 和用户偏好匹配解释。 - `scripts/shushu_internship_tool/interview_pack.py`:根据笔记/报告生成面试材料包骨架。 - `references/repo-selection-rubric.md`:候选项目选择与淘汰规则。 - `references/modification-playbook.md`:魔改菜单和验收标准。 - `references/interview-pack-template.md`:简历、Q&A、代码讲解、PPT 模板。 - `references/remote-compute-checklist.md`:远程服务器、数据库、GPU 或云环境运行清单。