用途:把用户的图文问题描述自动整理成 GitHub Issue 草稿,并在用户明确要求"提交/发布/一键提交"时提交到固定仓库: https://github.com/iOfficeAI/AionUi
- 不修 bug,不读取仓库代码;只做"整理 +(可选)发布提交"。
- 目标仓库固定:
iOfficeAI/AionUi。 - 先统一生成
work_order.json,并在需要时补齐attachment_markdown等附件衍生数据。 - 提交器有三种且彼此独立:
skill(本地脚本 + Playwright)、chrome_mcp(Chrome DevTools MCP)、github_mcp(GitHub MCP)。
- Issue Draft(markdown,字段齐全)
- Publish Plan(说明将用 skill / chrome_mcp / github_mcp + 关键参数)
- Work Item(必须包含
session_id、work_id、work_order_path、artifacts_path) - 若用户明确要发布:输出"开始发布",并在发布后输出 issue URL;否则最后问一句:
现在发布提交吗?
work_order.json是"单 issue 工作单",不是会话总表。- 同一个对话里,如果用户提出的是"新的另一个 issue",必须新建一个
work_id和新的工作目录,不能覆盖前一个 issue 的work_order.json。 - 仅当用户明确表示"继续修改/重提同一个 issue"时,才复用原来的
work_id与工作目录。 - 每次提交或附件准备都只读取当前
work_order.json的attachments,不要扫描其他work_id的历史附件。 - 推荐目录结构:
issue_runs/<session_id>/<work_id>/work_order.jsonissue_runs/<session_id>/<work_id>/artifacts/
- 最终回复和失败回复都要带上
work_id与路径,避免多 issue 对话里串单。
- 模板选择:用户明确"功能建议/需求/希望增加" → feature request;否则默认 bug report。
- 标题:中英双语(中文优先),一句话、短、明确。
- 附件:优先保留用户提供的截图/录屏/日志路径;若本地附件需要跟随 issue 一起发布,先准备
attachment_markdown(GitHub 已托管 URL 的 Markdown 片段),再交给任一提交器使用。 - 不编造事实:不能凭空补充版本号、平台、复现步骤等"事实性信息"。可以做结构化整理与措辞优化。
- 允许推测:若为了可读性需要补充"可能原因/可能范围/建议排查",必须显式标注为 【推测】,并且不要把推测写入 work_order.json 的事实字段里。
- platform:若用户没说,先不追问,默认用
"auto"(由脚本在运行时推断并写回为模板可选值) - version:必填字段。尽量从用户描述/截图/日志中提取;提取不到则进行最小问询获取。
- 仅当用户明确要求"忽略版本/按最新版本/就填 latest 强行提交"时,才默认填
latest(并在 Draft 中标注 【推测/未确认】)
- 仅当用户明确要求"忽略版本/按最新版本/就填 latest 强行提交"时,才默认填
- bug_description:精炼描述(必填)
- steps_to_reproduce:编号步骤(必填)
- expected_behavior:期望结果(必填)
- actual_behavior:若用户未单独描述,默认同 bug_description
- additional_context:可选
- feature_description(必填)
- problem_statement(必填)
- proposed_solution(必填)
- feature_category:尽量命中模板 options;不确定选
Other - additional_context:可选
- 未明确发布:只输出草稿并确认是否发布。
- 明确发布:先生成
work_order.json;若存在本地附件且需要真正上传,再补attachment_markdown;最后再选用提交器。 - 只有在"阻塞必填信息完全缺失且无法合理默认"时才问 1~2 个问题(否则直接发布)。
- 发布前预览:在正式生成 work_order.json 前,先输出一次 Issue Draft + Publish Plan 作为预览给用户看:
- 用户明确"现在就提交/立刻发布":预览后 直接触发所选提交器(预览不是确认门槛)
- 用户明确"先预览/先别提交/我看一下再提交":只输出预览并等待用户修改点,再触发提交
- Bug 的
version(必填):若无法从用户描述/截图中提取,先问 1 次版本号(例如"关于页版本号是多少?")。- 若用户明确要求忽略版本或强行按最新提交 → 填
latest并标注 【推测/未确认】,继续提交
- 若用户明确要求忽略版本或强行按最新提交 → 填
- 复现步骤/期望:若用户描述太抽象导致无法写成可执行步骤/可验证期望,再追问 1 个关键问题。
- 默认:
submit_method = "skill" - 用户明确要求 GitHub MCP:
submit_method = "github_mcp" - 用户明确要求浏览器 MCP:
submit_method = "chrome_mcp" - 任一提交器失败且用户仍要求发布:切到另一种提交器继续(不要把三种方式耦合成一条链)
skill:独立 Chromium + 专用user-data-dir,不污染日常浏览器chrome_mcp:独立 Chrome 实例,可视化操作;标签页可关,浏览器窗口可能残留github_mcp:无浏览器;附件走git clone + binary copy + git push
- 无论走哪条链路,都先生成
work_order.json,作为统一的结构化数据源。 - 字段必须对齐
assets/templates/*.yml的 YAMLid;schema 见references/work_order_schema.md。 - 固定字段(总是生成):
schema_version:v24session_id: 同一对话/会话共享work_id: 每个 issue 唯一owner_repo:iOfficeAI/AionUiproject_url:https://github.com/iOfficeAI/AionUiissue_type:bug或featuretitleattachments: 文件路径数组(可为空)issue_number:""issue_url:""
- 可选附件衍生字段:
attachment_markdown: 已上传到 GitHub 后生成的 Markdown 片段attachment_upload_status:uploaded/listed_local/missing_files/upload_failed/none
- 运行态字段:
runtime.statusruntime.last_submitterruntime.last_errorruntime.last_run_logruntime.attempt_count/runtime.prepare_count/runtime.submission_countevents[]:append-only 运行历史
- Bug:
- 推荐
platform: "auto" version:必填。优先写入用户提供的真实版本号;若无法获取则最小问询;仅在用户明确要求忽略版本/按最新提交时才用latest(并在 Draft 中标注为 【推测/未确认】)
- 推荐
- Feature:
- 不要生成 bug-only 字段(例如
platform/version/actual_behavior)
- 不要生成 bug-only 字段(例如
work_order.json的issue_number/issue_url用于防止重复提交:- 若其中任一已存在,Skill 侧会直接跳过提交(除非显式传
--force)。 - Agent 在对话层也要避免把"已提交返回的 issue URL"当成新输入再次触发提交。
- 若其中任一已存在,Skill 侧会直接跳过提交(除非显式传
- 需要"再提交一次"(新 issue)时:
- 推荐:生成一个新的
work_id和新的work_order.json - 或者:清空旧
work_order.json的issue_number/issue_url,或在你明确知道后果时使用--force
- 推荐:生成一个新的
attachments始终保存原始本地路径,作为事实来源。attachments可以是绝对路径,也可以是相对work_order.json的路径;当前实现不要求附件必须位于work_id目录内。- 若本地截图/录屏/日志需要真正跟随 issue 发布,先准备
attachment_markdown,不要把本地路径直接交给github_mcp。 - 预上传前会先过滤 GitHub 当前支持的图片:
.png、.gif、.jpg、.jpeg,且单文件不超过10MB。 - 不支持或超限的附件只跳过上传,不阻断本次 issue;需在回复中说明它们仅以本地路径形式保留。
- 同一
work_id下若有同名文件,脚本自动加序号后缀(如screenshot.png→screenshot-2.png)。
skill/chrome_mcp:浏览器原生上传,不需要预上传github_mcp:如果本地有图片附件且attachment_markdown为空,先执行:python scripts/python/github_mcp_upload_attachments.py \ --work-order /path/to/work_order.json \ --login {login}- 路径规则固定为:
issue-assets/{target_owner}/{target_repo}/{work_id}/{filename} - 禁止使用 MCP
push_files上传图片:会把二进制变成 base64 文本,图片无法回显 owner_repo中的/只表示目标项目的owner/repo,不要和{login}/issue-assets混淆
目标:直接通过 GitHub MCP 创建 issue,不依赖浏览器。
- GitHub MCP 路径从
work_order.json读取字段,并优先使用attachment_markdown生成 body。
- 生成
work_order.json - 若本地有图片附件且
attachment_markdown为空:get_me→ 检查/创建{login}/issue-assets→ 运行github_mcp_upload_attachments.py - 运行
github_mcp_build_payload.py --work-order ...生成title/body - 解析
owner_repo为目标项目的owner与repo,调用 GitHub MCP 创建 issue - 回写
issue_number/issue_url
目标:在浏览器里完成 Issue Form 提交(不依赖本地 Playwright 脚本)。
- chrome_mcp 路径同样从
work_order.json读取字段值(Agent 应先生成 work_order.json,再逐字段填入浏览器)。 - 字段映射关系(work_order.json key → 表单 label):
- Bug:
title→ Title,platform→ Platform(下拉),version→ AionUi Version,bug_description→ Bug Description,steps_to_reproduce→ Steps to Reproduce,expected_behavior→ Expected Behavior,actual_behavior→ Actual Behavior,additional_context→ Additional Context - Feature:
title→ Title,feature_description→ Feature Description,problem_statement→ Problem Statement,proposed_solution→ Proposed Solution,feature_category→ Feature Category(下拉),additional_context→ Additional Context
- Bug:
- 打开:
{{project_url}}/issues/new?template=bug_report.yml(或feature_request.yml) - 未登录则提示用户在浏览器中完成 GitHub 登录,等待页面跳转回 Issue Form
- 等待表单加载完成(标志:出现 "Add a title" 输入框)
- 从
work_order.json读取各字段值,按上述映射逐个填入表单:- 文本字段:使用 fill 工具
- 下拉字段(Platform / Feature Category):先 click 打开下拉菜单,再 click 选中目标选项
- 校验必填非空 → 点击 Create 按钮
- 等待页面 URL 变为
/issues/\d+格式,确认提交成功 - 回传最终 issue URL,并写回
work_order.json的issue_number/issue_url - 提交成功后等待约 10 秒,让用户确认提交结果,然后关闭标签页(close_page)。注意:MCP 无法自动关闭浏览器窗口本身,需提示用户手动关闭残留的浏览器窗口
- Skill 失败:回传失败原因 + 本地
artifacts/路径(截图/HTML/run.log)。 - 用户仍坚持发布:切换到另一种提交器完成提交。