---
name: resume-workbench-builder
description: 根据用户简历、补充问答和个性化配置，生成一个可运行的简历工作台 HTML 应用。适用于用户想拥有自己的简历工作台时；不把最终交付停在聊天回复里。
---

# 简历工作台 Builder Skill

## 目标

通过一次配置对话，收集用户的真实经历、偏好和工作台配置，最终生成一个属于用户的简历工作台应用。

最终交付必须是可运行产物：

- 首选：单个可打开的 `index.html`
- 可选：通过外部固定外壳进一步打包为 EXE

聊天只是安装和配置过程，最终产品是可运行的工作台。

## 何时使用

- 用户想拥有自己的简历编辑和岗位定制工具
- 用户愿意先上传或填写完整经历
- 用户希望之后多次输入 JD 生成不同岗位版本
- 用户接受通过 AI 对话完成初始化和定制

## 何时不使用

- 用户只想立刻在聊天里改一份简历
- 用户没有真实经历，只想让 AI 编造
- 用户要求自动投递或自动填写招聘网站
- 用户要求保证通过筛选、面试或录用

## 必需输入

1. 用户的真实简历或完整经历
2. 用户确认的事实库
3. 工作台名称、AI 调用模式、导出方式和本地存储偏好

## 执行流程

1. 先问用户：简历要粘贴文本、上传文件，还是手动填写。
2. 读取简历并提取事实库。
3. 一次只问一个关键问题，补全和确认经历。
4. 按 `references/interview.md` 收集工作台配置。
5. 按 `references/config-schema.json` 写入 `app-config.json`。
6. 复制 `assets/workbench-template/index.html`。
7. 把配置注入模板中的 `__APP_CONFIG_JSON__`，不得删除核心功能。
8. 按 `references/output-schema.json` 生成输出文件。
9. 按 `references/acceptance.md` 自检。
10. 让用户实际打开工作台并完成一次岗位测试。

## 核心规则

- 聊天不是最终产品。没有生成可运行应用，不算完成。
- 只使用用户确认的事实，不编造经历、项目、数字或成果。
- 生成的工具一次处理一个 JD。
- 不自动投递，不承诺通过筛选。
- 工作台必须支持本地保存和后续编辑。
- 不在 HTML 源码里写入 API Key。
- API Key 只能由用户在本地设置页填写。
- 默认生成单文件 HTML；EXE 只能通过已存在的固定外壳另行打包。
- 不把模板改成只会聊天的页面。

## 按需加载

- 配置问答：`references/interview.md`
- 配置结构：`references/config-schema.json`
- 工作台规格：`references/app-spec.md`
- 输出结构：`references/output-schema.json`
- 失败处理：`references/failure-handling.md`
- 最终验收：`references/acceptance.md`
- HTML 模板：`assets/workbench-template/index.html`

## 最终输出

标准输出目录：

```text
resume-workbench/
  index.html
  app-config.json
  README.md
```

如果运行环境支持写文件，直接生成上述目录；如果只能对话，输出可保存的完整文件内容，并明确告诉用户每个文件放哪里。

## 完成条件

- 工作台可以打开
- 用户资料已预填
- 可以保存并编辑资料
- 可以输入一个 JD
- 可以生成 AI 分析任务或调用兼容 API
- 可以保存结果并导出
- 不存在模板占位符
- 用户实际打开并确认

## 配置注入

1. 先把用户确认的信息整理成一个合法 JSON 对象，并同步写入 `app-config.json`。
2. 序列化 HTML 内嵌配置时，把 JSON 中的 `</` 转义为 `<\/`，避免用户内容提前闭合 `<script>`。
3. 用该 JSON 替换模板里的 `__APP_CONFIG_JSON__`，只替换一次。
4. 替换后重新搜索 `__APP_CONFIG_JSON__`；只要占位符还在，就不得交付。
5. `app-config.json` 与 HTML 中注入的配置必须一致，但两者都不能出现 API Key。
