优化: git状态色与设置控件token化收敛+看板销账清尾
This commit is contained in:
+11
-10
@@ -8,6 +8,7 @@
|
||||
> **2026-06-27 归档**: 已完成 `[x]`/`✅` 项已迁至 [07-项目管理/todo归档/2026-06-27.md](./07-项目管理/todo归档/2026-06-27.md)。
|
||||
>
|
||||
> **2026-08-05 编号碰撞登记**: `F-260619-03` 被两个特性复用(消息拆分存储=文档本体 + AI工具路径授权=复用)。子代理审查确认:改 18 处编号无实际价值有风险,**暂不改代码**,后续新增注释编号统一走日期+序号体系、避免复用已有编号。路径授权若后续单独立项再独立编号。
|
||||
> **2026-08-15 编号碰撞登记**: `REFACTOR-260619-04` 被复用(父③③.2 审批状态机拆分=待办 vs ToolCard 拆分=已完成)。后续引用审批状态机拆分时用「审批状态机拆分」描述,不再沿用该编号。
|
||||
|
||||
### 💡 2026-08-04 父子任务支持(✅ 已完成)
|
||||
|
||||
@@ -221,7 +222,7 @@ graph TD
|
||||
|
||||
### 待澄清 / A-B 待定
|
||||
|
||||
- [ ] S-260614-01 — **[用户已澄清 2026-06-17]** 「显示多开」= 多个会话来回切都可对话(非 AI Chat 窗口多开)。**✅ 已并入 F-260616-09(已决 a):A 路线已实施,B 高优先立项,详见待决策归档/2026-06.md**
|
||||
- [x] S-260614-01 — ✅ 已销账(并入 F-09,F-09 B 阶段 2026-08-07 全部落地)。**[用户已澄清 2026-06-17]** 「显示多开」= 多个会话来回切都可对话(非 AI Chat 窗口多开)。**✅ 已并入 F-260616-09(已决 a):A 路线已实施,B 高优先立项,详见待决策归档/2026-06.md**
|
||||
|
||||
#### ℹ️ 架构观察(INFO · 2 项·不进修复队列)
|
||||
|
||||
@@ -319,7 +320,7 @@ graph TD
|
||||
|
||||
> ✅ 全部修复完成(2026-06-27 核验)
|
||||
|
||||
- [~] **IDEA-FIX-10 [P2🟠]** — **前端 filter + 后端分页漏数据**。团队决策:`hot`/`pending` 保留前端 filter(扩多值属性过度设计);keyword/order_by 已下沉后端。
|
||||
- [x] **IDEA-FIX-10 [P2🟠]** — **前端 filter + 后端分页漏数据**。团队决策:`hot`/`pending` 保留前端 filter(扩多值属性过度设计);keyword/order_by 已下沉后端。✅ 关闭(2026-08-15:团队决策定案,无后续动作)
|
||||
|
||||
---
|
||||
|
||||
@@ -350,7 +351,7 @@ graph TD
|
||||
**P3(风格/可读·低优)**:
|
||||
|
||||
- [x] **WC-P3-SubflowNode-风格** — ✅ **已销账(2026-08-09)**:subflow_node trait 顺序(execute→schema→node_type)对齐 ai/human 节点
|
||||
- [~] **WC-P3-script-注释** — 🟡 部分:script_node.rs:9「替代纯 env var」措辞与 env var 回退并存,需改措辞(待批)
|
||||
- [x] **WC-P3-script-注释** ✅ 已销账(2026-08-15 全文核验):script_node.rs 全部 env var 相关注释(:9/:144/:167 等)均已是「运行时配置优先、env var 回退」语义,无「替代纯 env var」矛盾表述,无需改动
|
||||
|
||||
**专项(已登记 memory,留指针)**:
|
||||
|
||||
@@ -386,9 +387,9 @@ graph TD
|
||||
- [x] ✅ **P1-f** cmd 闪烁 N² — **已落地(2026-08-09 141777b)**:module.rs 新增仓库级 git status 缓存(GIT_STATUS_CACHE,key=仓库根 path,TTL 5s,锁内不跑 git,非 git 不缓存;get_module_file_tree + get_module_git_status 两处收口;删除/更新 module 清缓存);前端联动未做(5s TTL 自然过期 + FileExplorer 刷新已重拉目录树,无独立缺口)
|
||||
- [x] ✅ **P1-g** store.tasks.filter 污染 — **2026-08-09 核验+补全销账**:ProjectDetail 独立 taskApi.list 已修;ChatInput @项目 enrichment 独立拉取(projectTasksCache)已修 + @任务联想本批改独立全量缓存 taskSuggestionCache(隔离 Tasks 页筛选子集)+ mentionTotal 对齐
|
||||
|
||||
**P2(打磨)**:✅ 幽灵 `--df-primary` 已清(2026-08-15:4 处引用迁 `--df-accent` 逐主题等价,双主题定义删除,零残留)/ ✅ 死代码 PlanProgress·isLastUser 已核不存在 / git 状态色 token / 控件统一(原问题 8 延伸)
|
||||
**P2(打磨)**:✅ 幽灵 `--df-primary` 已清(2026-08-15:4 处引用迁 `--df-accent` 逐主题等价,双主题定义删除,零残留)/ ✅ 死代码 PlanProgress·isLastUser 已核不存在 / ✅ git 状态色 token(2026-08-15:--df-git-added/modified/deleted/untracked 双主题,FileTree/GitChanges/FilePreview 18 处迁 var+color-mix)/ ✅ 控件统一(2026-08-15:.setting-input 全局定义承接,Connection/ProviderPanel 重复副本删,存布局覆盖)
|
||||
|
||||
**批次 I(原 12 大改 · 后续专项)**:Dashboard 统计卡压底行(问题 1,依赖 P1 数据源)/ Projects 视图模式(问题 2)/ TaskDetail(4)·IdeaDetail(5)·KnowledgeDetail(6)·ProjectDetail(10)重设计 / project_event_repo 埋点接入(问题 3)
|
||||
**批次 I(原 12 大改 · 后续专项)**:Dashboard 统计卡压底行(问题 1,依赖 P1 数据源)/ Projects 视图模式(问题 2)/ TaskDetail(4)·IdeaDetail(5)·KnowledgeDetail(6)·ProjectDetail(10)重设计 / ✅ project_event_repo 埋点已接入(2026-08-15 核验:commands/project.rs emit_project_event 封装 best-effort 写入 + list_project_activities 消费)
|
||||
|
||||
---
|
||||
|
||||
@@ -401,8 +402,8 @@ graph TD
|
||||
- [x] **AC-1** ✅ 已落地(2026-08-09 核验):双层拦截——调用级 `cache.rs:251 find_cached_readonly_result`(同 tool_name+canonical_args 已 completed 即返缓存+警告头,第 2 次即命中)+ 轮级 `is_repetitive_exploration`(helpers.rs:304-332,单签名≥3/唯一率<40%)→ `check_stall_breaker`(警示→硬熔断 emit AiHelpRequired)
|
||||
- [x] **AC-2** ✅ 已落地(2026-08-09 核验,提交 fe780c0):`MAX_TOOL_CALLS_PER_ROUND=8`(agentic/mod.rs:245)+ 目录列举去重(readonly_cache_args_key 只取 path,返目录专用警告)+ `detect_listing_bypass`(run_command 含列举命令且引用已列目录→警告,保守式不硬拒)
|
||||
- [x] **AC-3** ✅ 已落地(2026-08-09 核验):prompt.rs:304/323 项目/任务清单已含 id + 注明语(projects_listed_note "引用用 id 非名称");**兜底机制超要求**:entity_resolve.rs name→id 自动解析(RESOLVE_MAP 12 工具 + UUID 跳过 + 0 命中/重名返可行动错误 + 9 单测,audit/mod.rs process_tool_calls 单点漏斗)
|
||||
- [~] **AC-4** 🟡 部分(2026-08-09 核验):read_file **符号级命中**提示已补强(tools/file.rs:179-196 用 code_intel contains_definition 检测内容含定义节点才提示,替代旧按扩展名)+ 三态本体(code_intel.rs:130)+ 缓存兜底 + 单测 4;**模型分级已评估=保持现状**(穿模型需改 process_tool_calls 多路径签名波及 ai_approve/trust_hits/low_risk,ROI 低——提示一行且 token 节省可忽略,启发式判弱模型脆弱)
|
||||
- [~] **AC-5** 🟡 部分(2026-08-09 核验):画像复盘已做(docs/AI工具失败画像复盘-2026-08-08.md)+ 4/5 自愈机制落地(advance_task legal_targets / patch_file 相近锚点 / read_file·read_symbol 相近文件名候选 / search_files total=0 引导);**运行时失败率统计 ✅ 已落地(141777b)**:tool_failure_stats IPC 命令(stats_by_tool 按工具 status 聚合,failed_rate=failed/(completed+failed),rejected 不计分母,可选 from 时间下限)
|
||||
- [x] **AC-4** 🟡 部分(2026-08-09 核验):read_file **符号级命中**提示已补强(tools/file.rs:179-196 用 code_intel contains_definition 检测内容含定义节点才提示,替代旧按扩展名)+ 三态本体(code_intel.rs:130)+ 缓存兜底 + 单测 4;**模型分级已评估=保持现状**(穿模型需改 process_tool_calls 多路径签名波及 ai_approve/trust_hits/low_risk,ROI 低——提示一行且 token 节省可忽略,启发式判弱模型脆弱)。✅ 关闭(2026-08-15:残尾均为已评估定案,无后续动作)
|
||||
- [x] **AC-5** 🟡 部分(2026-08-09 核验):画像复盘已做(docs/AI工具失败画像复盘-2026-08-08.md)+ 4/5 自愈机制落地(advance_task legal_targets / patch_file 相近锚点 / read_file·read_symbol 相近文件名候选 / search_files total=0 引导);**运行时失败率统计 ✅ 已落地(141777b)**:tool_failure_stats IPC 命令(stats_by_tool 按工具 status 聚合,failed_rate=failed/(completed+failed),rejected 不计分母,可选 from 时间下限)。✅ 关闭(2026-08-15:残尾均为已评估定案,无后续动作)
|
||||
|
||||
### 💡 2026-08-04 MCP 多进程架构潜在问题(分析登记)
|
||||
|
||||
@@ -416,8 +417,8 @@ graph TD
|
||||
- [x] **P1-4** ✅ 已落地(e722823):校验下沉 crates/df-storage/src/crud/task_validation.rs,df-mcp/GUI 复用同源函数
|
||||
- [x] **P1-5** ✅ 已落地(02c8d8e):db.rs busy_timeout(5s) + WAL + foreign_keys
|
||||
- [x] **P1-6** ✅ 已落地(02c8d8e):server.rs:100-107 空闲超时 60s 退出(--idle-timeout 可配)
|
||||
- [~] **P1-7** 🟡 部分(设计取舍):高危默认拒 + 中危审计 + --read-only 可选;未做默认只读/写前确认(有缓解可接受)
|
||||
- [x] **P2-8** ✅ 已落地(8cb666a):主 list 工具分页 + list_trash 补分页(offset/limit/has_more); **P2-9** 🟡 Windows lowercase 待核; **P2-10** 有意收敛
|
||||
- [x] **P1-7** 🟡 部分(设计取舍):高危默认拒 + 中危审计 + --read-only 可选;未做默认只读/写前确认(有缓解可接受)。✅ 关闭(2026-08-15:设计取舍已接受,无后续动作)
|
||||
- [x] **P2-8** ✅ 已落地(8cb666a):主 list 工具分页 + list_trash 补分页(offset/limit/has_more); **P2-9** ✅ 已核销(2026-08-15):df-project scan/mod.rs 统一 to_lowercase 比较版(:69/:73)+ 单测断言,normalize_for_compare/canonicalize_for_store 已拆分; **P2-10** 有意收敛
|
||||
|
||||
---
|
||||
|
||||
@@ -468,7 +469,7 @@ graph TD
|
||||
- [x] **CSW-P2-3** — ✅ 已修:`conversation.rs:211-226` save_conversation_serialized 持 per-conv 锁(`mod.rs:696-701` save_locks)串行化 DELETE+INSERT,20+ 调用点无旁路
|
||||
- [x] **CSW-P2-4** — ✅ 已修:`state.rs:561-565` clear_session_allowed_dirs_if_idle 仅在 `active_convs().is_empty()` 才清,后台 loop 文件工具不丢临时授权(三调用点 create/switch/delete 均用 _if_idle)
|
||||
- [x] **CSW-P2-5** — ✅ 已修:`useAiConversations.ts:67/75-76/110` `_newConvLock` 防抖 + 300ms 释放
|
||||
- [ ] **CSW-P2-6** — ✅ 已修:`streamingGuard.ts:78` 带 convId 写 per-conv 流式态,无 convId 才写全局
|
||||
- [x] **CSW-P2-6** — ✅ 已修:`streamingGuard.ts:78` 带 convId 写 per-conv 流式态,无 convId 才写全局
|
||||
|
||||
**其他已销项**:CSW-P2-7(需实测确认,从待办去除)
|
||||
---
|
||||
|
||||
@@ -653,11 +653,11 @@ onUnmounted(() => {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.git-modified { background: rgba(255, 165, 0, 0.18); color: #f0a020; }
|
||||
.git-added { background: rgba(60, 180, 80, 0.18); color: #4caf50; }
|
||||
.git-modified { background: color-mix(in srgb, var(--df-git-modified) 18%, transparent); color: var(--df-git-modified); }
|
||||
.git-added { background: color-mix(in srgb, var(--df-git-added) 18%, transparent); color: var(--df-git-added); }
|
||||
.git-untracked { background: rgba(150, 150, 150, 0.18); color: #999; }
|
||||
.git-deleted { background: rgba(220, 60, 60, 0.18); color: #e05050; }
|
||||
.git-other { background: rgba(100, 150, 220, 0.18); color: #6a9adc; }
|
||||
.git-deleted { background: color-mix(in srgb, var(--df-git-deleted) 18%, transparent); color: var(--df-git-deleted); }
|
||||
.git-other { background: color-mix(in srgb, var(--df-git-untracked) 18%, transparent); color: var(--df-git-untracked); }
|
||||
|
||||
.preview-body {
|
||||
flex: 1;
|
||||
@@ -1070,13 +1070,13 @@ onUnmounted(() => {
|
||||
background: rgba(40, 160, 70, 0.12);
|
||||
}
|
||||
|
||||
.diff-add .diff-line-prefix { color: #4caf50; }
|
||||
.diff-add .diff-line-prefix { color: var(--df-git-added); }
|
||||
|
||||
.diff-del {
|
||||
background: rgba(220, 60, 60, 0.12);
|
||||
}
|
||||
|
||||
.diff-del .diff-line-prefix { color: #e05050; }
|
||||
.diff-del .diff-line-prefix { color: var(--df-git-deleted); }
|
||||
|
||||
.diff-hdr {
|
||||
background: rgba(60, 140, 220, 0.08);
|
||||
|
||||
@@ -462,13 +462,13 @@ watch(
|
||||
}
|
||||
|
||||
.git-modified {
|
||||
background: rgba(255, 165, 0, 0.18);
|
||||
color: #f0a020;
|
||||
background: color-mix(in srgb, var(--df-git-modified) 18%, transparent);
|
||||
color: var(--df-git-modified);
|
||||
}
|
||||
|
||||
.git-added {
|
||||
background: rgba(60, 180, 80, 0.18);
|
||||
color: #4caf50;
|
||||
background: color-mix(in srgb, var(--df-git-added) 18%, transparent);
|
||||
color: var(--df-git-added);
|
||||
}
|
||||
|
||||
.git-untracked {
|
||||
@@ -477,13 +477,13 @@ watch(
|
||||
}
|
||||
|
||||
.git-deleted {
|
||||
background: rgba(220, 60, 60, 0.18);
|
||||
color: #e05050;
|
||||
background: color-mix(in srgb, var(--df-git-deleted) 18%, transparent);
|
||||
color: var(--df-git-deleted);
|
||||
}
|
||||
|
||||
.git-other {
|
||||
background: rgba(100, 150, 220, 0.18);
|
||||
color: #6a9adc;
|
||||
background: color-mix(in srgb, var(--df-git-untracked) 18%, transparent);
|
||||
color: var(--df-git-untracked);
|
||||
}
|
||||
|
||||
/* 加载/错误/空态 */
|
||||
|
||||
@@ -665,9 +665,9 @@ watch(() => props.refreshKey, () => {
|
||||
}
|
||||
|
||||
.gc-file-status { width: 20px; text-align: center; font-size: 11px; font-weight: 500; flex-shrink: 0; }
|
||||
.gc-st-modified { color: #f0a020; }
|
||||
.gc-st-added { color: #4caf50; }
|
||||
.gc-st-deleted { color: #e05050; }
|
||||
.gc-st-modified { color: var(--df-git-modified); }
|
||||
.gc-st-added { color: var(--df-git-added); }
|
||||
.gc-st-deleted { color: var(--df-git-deleted); }
|
||||
.gc-st-untracked { color: #999; }
|
||||
.gc-file-path {
|
||||
flex: 1; min-width: 0;
|
||||
|
||||
@@ -225,10 +225,10 @@ onMounted(loadConnections)
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 阶段1/3 UX 重构:panel/panel-header/empty-hint/btn 系列/setting-select/
|
||||
/* 阶段1/3 UX 重构:panel/panel-header/empty-hint/btn 系列/setting-select/setting-input
|
||||
已迁移到 settings.css 全局。
|
||||
本 scoped 仅保留 ConnectionPanel 特有样式:connection-card/conn 系列/type 系列/form 系列/
|
||||
setting-input/btn-link 等。 */
|
||||
btn-link 及 form-field 内输入控件布局覆盖等。 */
|
||||
|
||||
/* ===== 链接按钮(本面板特有,未进全局) ===== */
|
||||
.btn-link { background: none; border: none; color: var(--df-accent); font-size: 12px; cursor: pointer; padding: 2px 6px; }
|
||||
@@ -294,8 +294,8 @@ onMounted(loadConnections)
|
||||
.form-label { flex: 0 0 44px; font-size: 12px; font-weight: 500; color: var(--df-text-secondary); text-align: right; }
|
||||
.form-actions { display: flex; justify-content: flex-end; padding-top: 4px; }
|
||||
|
||||
.setting-input { flex: 1; min-width: 0; padding: 6px 12px; background: var(--df-bg); border: 0.5px solid var(--df-border); border-radius: var(--df-radius-sm); color: var(--df-text); font-size: 13px; outline: none; }
|
||||
.setting-input:focus { border-color: var(--df-accent); }
|
||||
/* 输入/下拉在 form-field 内 flex 填满(基础样式走全局 settings.css .setting-input/.setting-select) */
|
||||
.form-field .setting-input,
|
||||
.form-field .setting-select { flex: 1; min-width: 0; }
|
||||
/* host+port 组合行(端口跟在 host 后;min-width:0 允许收缩防窄面板溢出,label 已缩窄控制距离) */
|
||||
.form-row { display: flex; gap: 6px; }
|
||||
|
||||
@@ -639,10 +639,10 @@ onMounted(loadProviders)
|
||||
|
||||
<style scoped>
|
||||
/* 阶段1/3 UX 重构:panel/panel-header/empty-hint/btn 系列/setting-select/
|
||||
toggle/toggle-slider 已迁移到 settings.css 全局。
|
||||
setting-input/toggle/toggle-slider 已迁移到 settings.css 全局。
|
||||
本 scoped 仅保留 ProviderPanel 特有样式:provider-card/default-badge/
|
||||
pool-badge/detail 系列/form 系列/setting-input/btn-link/toggle--sm 等。
|
||||
注:注释内勿用斜杠分隔类名列表(会误闭合 CSS 注释)。
|
||||
pool-badge/detail 系列/form 系列/btn-link/toggle--sm 及输入控件布局覆盖等。
|
||||
注:注释列举类名时勿写星斜杠序列(会提前闭合 CSS 注释)。 */
|
||||
|
||||
/* ===== 链接按钮(本面板特有,未进全局) ===== */
|
||||
.btn-link { background: none; border: none; color: var(--df-accent); font-size: 12px; cursor: pointer; padding: 2px 6px; }
|
||||
@@ -739,8 +739,8 @@ onMounted(loadProviders)
|
||||
.form-field--full { flex-direction: column; align-items: stretch; gap: 4px; }
|
||||
.form-field--full .form-label { flex: none; text-align: left; margin-bottom: 4px; }
|
||||
|
||||
.setting-input { flex: 1; min-width: 0; padding: 6px 12px; background: var(--df-bg); border: 0.5px solid var(--df-border); border-radius: var(--df-radius-sm); color: var(--df-text); font-size: 13px; outline: none; }
|
||||
.setting-input:focus { border-color: var(--df-accent); }
|
||||
/* 输入/下拉在 form-field 内 flex 填满(基础样式走全局 settings.css .setting-input/.setting-select) */
|
||||
.form-field .setting-input,
|
||||
.form-field .setting-select { flex: 1; min-width: 0; }
|
||||
.setting-input--sm { flex: 0 0 auto; min-width: 0; width: 70px; padding: 4px 8px; font-size: 12px; }
|
||||
|
||||
|
||||
@@ -39,6 +39,12 @@
|
||||
--df-info: #5eaff0;
|
||||
--df-info-bg: rgba(94,175,240,0.12);
|
||||
|
||||
/* git 变更状态色(added/modified/deleted/untracked) */
|
||||
--df-git-added: #4caf50;
|
||||
--df-git-modified: #f0a020;
|
||||
--df-git-deleted: #e05050;
|
||||
--df-git-untracked: #6a9adc;
|
||||
|
||||
/* — Border: 统一 0.5px 极细边框 — */
|
||||
--df-border: rgba(255,255,255,0.06);
|
||||
--df-border-strong: rgba(255,255,255,0.10);
|
||||
@@ -93,6 +99,12 @@
|
||||
--df-info: #0984e3;
|
||||
--df-info-bg: rgba(9,132,227,0.10);
|
||||
|
||||
/* git 变更状态色(added/modified/deleted/untracked) */
|
||||
--df-git-added: #4caf50;
|
||||
--df-git-modified: #f0a020;
|
||||
--df-git-deleted: #e05050;
|
||||
--df-git-untracked: #6a9adc;
|
||||
|
||||
--df-border: rgba(0,0,0,0.08);
|
||||
--df-border-strong: rgba(0,0,0,0.14);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user