feat(ui): 要件定义书直传(点按钮开系统文件框/仅.xlsx/选定即上传)+移除 rag-bar(影响调查改由聊天驱动)+空输入禁用发送键

This commit is contained in:
lhl
2026-09-13 00:24:33 +08:00
parent 1e6d0838be
commit 4e25f76fa1
6 changed files with 178 additions and 575 deletions
@@ -0,0 +1,78 @@
# 要件定义书直传入口 + 移除 rag-bar(含输入区上移根治)— 实施计划
目标文件:`src/genesis/server/static/chat.html``frontend/src/main.ts``frontend/src/chat.css`
后端零改动(沿用 `POST /api/sessions/{sid}/files``file_type=requirements`)。
## 背景 / 问题
- 点「上传资料」展开 `#upload-panel``#composer`(底部锚定)变高 → 顶部输入框/按钮被顶上去。
- 需求:按钮改名「要件定义书」;**只允许上传要件定义书**;点击后**直接打开系统文件选择框**;选定即上传;其他资料改由项目配置提供。
- 另有同类“上移”来源:`#rag-bar` 初始 `hidden`,**建会话后被显示** → 工具栏高度变化 → 输入区再跳一次。
## 已确认决策
- D1 选定文件后**自动上传**(选定即 POST,无二次确认)。
- D2 未创建会话时点按钮 → 提示「请先发送一条消息以创建会话」。
- D3 会话内**只传要件定义书**`.xlsx`);模板/规则/做成说明书由项目配置提供;`.xls` 不支持(后端 `EXPECTED_SUFFIX``excel_reader``.xlsx`)。
- D4 **移除 `#rag-bar`**(DOM + 相关前端 JS)。理由:影响调查已由聊天驱动(`chat/agent.py` 意图 `impact``tests/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` 提示 → 取文件 → 校验 `.xlsx``FormData(file_type=requirements)` POST → 刷新标题/侧边栏 → 聊天区提示;失败提示;**各路径均清空 `file-input.value`**。
- 绑定:`#tb-upload` click → `fileInputEl.click()``fileInputEl` change → `uploadRequirements()`;删除 `#upload-btn` 绑定与面板切换。
- **删除 RAG 相关前端代码**:常量 `ragEnabledEl` / `ragStatsEl` / `ragBarEl` / `impactBtnEl``RAG_LS_KEY` / `readRagFlag` / `writeRagFlag` / `refreshRagStats()` / `updateImpactButton()``ragEnabledEl` change 监听、`impactBtnEl` click 监听;以及 `refreshRagStats()` 的全部调用点。
- `state.ts``resolveUploadType` / `shouldHideUploadSelect` 保留(node 测试覆盖),仅不再调用。
### frontend/src/chat.css
- 删除死样式:`#upload-bar``#upload-bar-inner``#upload-bar select(:focus)``.file-pick(:hover)``#upload-btn(:hover)``#proj-hint``#upload-panel``label.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 verify`typecheck + node --test + build)。
- `python -m pytest`(覆盖率 ≥99%)。
- 手动:
- 点「要件定义书」→ 弹系统文件框(过滤 .xlsx)→ 选文件**自动上传** → 聊天区显示「上传完成」;
- **输入区/按钮不再上移**(上传面板已删、rag-bar 已移除、工具栏高度恒定)且仍钉底;
- 无会话时提示先发消息;聊天框输入「做影响调查」仍可触发后端影响调查意图。
## 风险
- 会话内不再能补传模板/规则/做成说明书 → 完全依赖项目配置;未配置则生成阶段报错(符合 D3)。
- 移除 rag-bar 后,UI 不再有“启用 RAG / 影响调查”按钮;RAG 开关语义暂不可用(当前本就无效),下一轮 RAG 落地时重新引入。
- 自动上传无二次确认(符合 D1)。
---
## 评审结论与计划调整(plan-eng-review
### 事实核对(Step 0
- 后端 `/files``file_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: 待执行