Files
2026Technology-Competition/docs/superpowers/plans/2026-09-12-requirements-upload.md
T

5.7 KiB
Raw Blame History

要件定义书直传入口 + 移除 rag-bar(含输入区上移根治)— 实施计划

目标文件:src/genesis/server/static/chat.htmlfrontend/src/main.tsfrontend/src/chat.css 后端零改动(沿用 POST /api/sessions/{sid}/filesfile_type=requirements)。

背景 / 问题

  • 点「上传资料」展开 #upload-panel#composer(底部锚定)变高 → 顶部输入框/按钮被顶上去。
  • 需求:按钮改名「要件定义书」;只允许上传要件定义书;点击后直接打开系统文件选择框;选定即上传;其他资料改由项目配置提供。
  • 另有同类“上移”来源:#rag-bar 初始 hidden建会话后被显示 → 工具栏高度变化 → 输入区再跳一次。

已确认决策

  • D1 选定文件后自动上传(选定即 POST,无二次确认)。
  • D2 未创建会话时点按钮 → 提示「请先发送一条消息以创建会话」。
  • D3 会话内只传要件定义书.xlsx);模板/规则/做成说明书由项目配置提供;.xls 不支持(后端 EXPECTED_SUFFIXexcel_reader.xlsx)。
  • D4 移除 #rag-bar(DOM + 相关前端 JS)。理由:影响调查已由聊天驱动(chat/agent.py 意图 impacttests/test_chat_intent.py 覆盖),按钮冗余;RAG 现不可用(0 片段/禁用)。“启用 RAG/影响调查”待下一轮 RAG 落地再以合适方式加回。

变更清单

chat.html

  • #tb-upload📎 上传资料📄 要件定义书title="上传要件定义书";补 aria-label
  • 删除 #upload-panel 整块(#file-type.file-pick#upload-btn#proj-hint)。
  • #composer-toolbar 内保留 <input type="file" id="file-input" accept=".xlsx" style="display:none"><span id="upload-status"></span>
  • 删除 #rag-bar#rag-enabled / #rag-stats / #impact-btn)。

frontend/src/main.ts

  • 删除常量 fileTypeSel / projHintEl / uploadPanelEl;保留 fileInputEl / uploadStatusEl
  • 删除 updateUploadBar()全部调用点
  • 删除 UPLOAD_EXT_RULES / projectHasPrefixedType;保留 pickExt
  • 新增 uploadRequirements():无 sid 提示 → 取文件 → 校验 .xlsxFormData(file_type=requirements) POST → 刷新标题/侧边栏 → 聊天区提示;失败提示;各路径均清空 file-input.value
  • 绑定:#tb-upload click → fileInputEl.click()fileInputEl change → uploadRequirements();删除 #upload-btn 绑定与面板切换。
  • 删除 RAG 相关前端代码:常量 ragEnabledEl / ragStatsEl / ragBarEl / impactBtnElRAG_LS_KEY / readRagFlag / writeRagFlag / refreshRagStats() / updateImpactButton()ragEnabledEl change 监听、impactBtnEl click 监听;以及 refreshRagStats() 的全部调用点。
  • state.tsresolveUploadType / shouldHideUploadSelect 保留(node 测试覆盖),仅不再调用。

frontend/src/chat.css

  • 删除死样式:#upload-bar#upload-bar-inner#upload-bar select(:focus).file-pick(:hover)#upload-btn(:hover)#proj-hint#upload-panellabel.vh
  • 删除 RAG 样式#rag-bar#rag-bar label.rag-switch#rag-bar input[type=checkbox](及 :disabled)、#rag-bar .rag-stats(.ready/.zero)#rag-bar button(:disabled/:hover:not(:disabled))。
  • 保留 #upload-status

验证

  • cd frontend && npm run verifytypecheck + node --test + build)。
  • python -m pytest(覆盖率 ≥99%)。
  • 手动:
    • 点「要件定义书」→ 弹系统文件框(过滤 .xlsx)→ 选文件自动上传 → 聊天区显示「上传完成」;
    • 输入区/按钮不再上移(上传面板已删、rag-bar 已移除、工具栏高度恒定)且仍钉底;
    • 无会话时提示先发消息;聊天框输入「做影响调查」仍可触发后端影响调查意图。

风险

  • 会话内不再能补传模板/规则/做成说明书 → 完全依赖项目配置;未配置则生成阶段报错(符合 D3)。
  • 移除 rag-bar 后,UI 不再有“启用 RAG / 影响调查”按钮;RAG 开关语义暂不可用(当前本就无效),下一轮 RAG 落地时重新引入。
  • 自动上传无二次确认(符合 D1)。

评审结论与计划调整(plan-eng-review

事实核对(Step 0

  • 后端 /filesfile_type: str = Form(...) + file: UploadFile = File(...)requirements 允许,白名单 (".xlsx",)
  • updateUploadBar() 定义 1 处 + 调用 5 处 + 上传分支内 1 处,删函数须清干净(漏调用 tsc 会报错)。
  • .vh 仅用于将被删的「上传类型」label。
  • 无测试引用将删的 id。

采纳

  • F1(同类“上移”来源)#rag-bar 建会话后出现会使工具栏变高 → 一并处理:移除 rag-bar(DOM+JS)。影响调查改由聊天驱动(已有意图解析)。
  • F2:仅 .xlsx(与后端/解析一致);accept 仅过滤,change 再校验后缀。
  • F3:所有路径清空 fileInputEl.value(同文件再次可选)。
  • F4:清理上传相关死样式与 .vh
  • F7:按钮补 aria-label

接受

  • F5:会话内不再补传模板/规则 → 依赖项目配置(D3 结果)。
  • F6:新上传流为 DOM 行为,无自动化测试;靠 tsc + 手动。

GSTACK REVIEW REPORT

  • STATUS: DONE
  • REVIEWED: docs/superpowers/plans/2026-09-12-requirements-upload.md
  • FINDINGS: F1 同类上移(已采纳:移除 rag-bar) / F2 扩展名(仅 .xlsx) / F3 重复选择(已纳入) / F4 死样式清理 / F7 ariaF5/F6 接受
  • KEY DECISION: 移除 rag-bar(影响调查由聊天驱动);会话内仅传 .xlsx 要件定义书,选定即上传
  • NEXT: 待执行