Skip to content

feat(tui): 增加 Todo 可视化面板#351

Merged
phantom5099 merged 11 commits into
1024XEngineer:mainfrom
creatang:codex/issue-266-header-render-fix
Apr 18, 2026
Merged

feat(tui): 增加 Todo 可视化面板#351
phantom5099 merged 11 commits into
1024XEngineer:mainfrom
creatang:codex/issue-266-header-render-fix

Conversation

@creatang

@creatang creatang commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator

背景

主要变更

  1. 新增 TUI Todo 面板(展示优先)
  • 展示字段:id/title/status/priority/owner/updated_at
  • 支持按状态过滤:pending/in_progress/blocked/completed/failed/canceled
  • 支持稳定排序:status + priority + updated_at
  • 支持折叠/展开
  • 支持长任务链滚动查看,避免内容被截断
  • 支持选中项查看详情
  1. Runtime 事件联动
  • 订阅并响应 Todo 相关 runtime 事件(含更新/冲突场景)
  • 通过会话快照刷新面板数据
  • TUI 只读展示,不直接改写 session 状态

设计约束对齐

  • 保持 TUI -> Runtime 边界:TUI 仅负责展示与轻交互
  • 状态来源统一为 Runtime 事件/会话快照
  • 不引入 provider/tool 直连

测试

  • 新增/更新 Todo 面板相关测试(渲染、过滤、排序、折叠、交互、事件刷新)
  • 同步更新 slash 清理后的测试断言
  • 已通过:
    • go test ./internal/tui/core/app
    • go test ./internal/tui/...

影响范围

  • 仅涉及 TUI 层与对应测试,不改变 Runtime 写入链路
  • 不影响主消息渲染与主会话输入主流程

关联

# Conflicts:
#	internal/tui/core/app/app.go
#	internal/tui/core/app/update.go
#	internal/tui/core/app/update_test.go

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Completed 4 review passes (code quality, performance, security, documentation) and deduplicated findings.

Noteworthy items are inline. Security pass found no additional critical issues beyond the inline comments.

Comment thread internal/tui/core/app/update.go Outdated
}

func (a *App) applyComponentLayout(rebuildTranscript bool) {
if a.layoutCached && a.cachedWidth == a.width && a.cachedHeight == a.height {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

High – layout cache invalidation is incomplete

This early-return only checks width/height, but layout also depends on runtime state (activityPreviewHeight, todoPreviewHeight, command menu visibility, composer height). Callers like todo collapse/expand and activity visibility changes invoke applyComponentLayout(false) expecting reflow, but this branch skips recomputation, so panel bounds and hit areas can become stale until a window resize occurs.

Please include state-driven invalidation (or remove this short-circuit) so non-resize UI changes can re-layout immediately.

textarea.Blink,
a.spinner.Tick,
tea.Tick(100*time.Millisecond, func(t time.Time) tea.Msg {
return tickMsg(t)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium – perpetual no-op tick loop

A new tea.Tick(100ms) is started here, and handleTickMsg re-schedules it forever, but the tick handler does not apply any state changes. This adds constant wakeups/renders with no functional effect.

If this is meant to drive deferred redraw, gate it behind an actual dirty flag and stop ticking when idle.

Comment thread internal/tui/core/app/update.go Outdated

// image capability precheck is intentionally disabled.
// 如果不是立即执行的命令,再执行常规的输入重置
// 婵″倹鐏夋稉宥嗘Ц缁斿宓嗛幍褑顢戦惃鍕嚒娴犮倧绱濋崘宥嗗⒔鐞涘苯鐖剁憴鍕畱鏉堟挸鍙嗛柌宥囩枂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium – comment encoding appears corrupted (mojibake)

Several newly edited comments in this file are now unreadable garbled text (for example this block and multiple function doc comments below). This hurts maintainability and violates the repo guideline requiring clear Chinese UTF-8 comments near new functions.

Please re-save/restore these comments with correct UTF-8 content.

type slashCommand = tuicommands.SlashCommand
type commandSuggestion = tuicommands.CommandSuggestion

var builtinSlashCommands = []slashCommand{

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium – docs drift after removing slash commands

This PR removes /compact, /memo, /remember, /forget from builtin slash commands, but project docs still describe them as supported commands (e.g. README.md and docs under docs/).

Please update docs in the same PR to reflect current behavior and avoid user/operator confusion.

@fennoai fennoai Bot mentioned this pull request Apr 17, 2026
@creatang

Copy link
Copy Markdown
Collaborator Author

/code 解决review中提到的问题

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

处理结果

已按 review 意见完成修复并推送到当前 PR 分支(commit: fb51dce)。

  1. 修复布局重排失效
  • 移除 applyComponentLayout 中仅按 width/height 的早退逻辑,确保 Todo 折叠/展开、面板状态变化等非 resize 场景也会立即重算布局。
  1. 移除无效 tick 循环
  • 删除 Init 中 100ms 周期 tea.Tick
  • 删除 tickMsg 分支与 handleTickMsg,避免空转唤醒。
  1. 修复注释乱码
  • internal/tui/core/app/update.go 中多处乱码注释恢复为可读中文注释(权限流、runtime 事件处理、provider add 回滚等函数说明)。
  1. 同步文档
  • 更新 README.md:移除 /compact/memo/remember/forget 的 Slash 命令说明。
  • 更新 docs/tools-and-tui-integration.md:说明 TUI 不再提供 memo 专用 slash。
  • 更新 docs/context-compact.md:改为通过 runtime.Compact(...) 触发手动 compact,并注明当前 TUI 无 /compact 入口。
  • 更新 docs/guides/configuration.md:去除 /compact 绑定描述。

验证

已执行并通过:

  • go test ./internal/tui/core/app ./internal/tui/...

未执行

  • 未执行全量 go test ./...(本次改动范围仅 TUI 与文档)。

View job run

@phantom5099

Copy link
Copy Markdown
Collaborator

@xgopilot 针对本次PR,请给我一份给AIreview用的提示词,针对的是修改中所有可能存在的风险点

@fennoai

fennoai Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

给 AIreview 的提示词

请作为严格的 Go/TUI 代码审查器,审查 PR #351origin/main...HEAD),只输出“问题与风险”,不要写正向评价。

审查目标:覆盖本 PR 所有潜在风险点,重点关注行为回归、边界条件、性能/稳定性、可维护性。

硬性要求:

  1. 先给 Findings(按严重级别排序:critical > high > medium > low)。
  2. 每条必须包含:severityfile:line风险描述触发条件影响范围修复建议
  3. 没有证据不要下结论;不确定请写“需补充验证”。
  4. 必须对以下文件重点审查:
  • internal/tui/core/app/todo.go
  • internal/tui/core/app/update.go
  • internal/tui/core/app/view.go
  • internal/tui/core/app/commands.go
  • internal/tui/core/app/app.go
  • internal/tui/state/ui_state.go
  • 相关测试:todo_test.goupdate_test.gocommands_test.goview_test.go

请重点检查以下高风险面:

  1. 布局缓存是否导致 UI 不刷新
  • 检查 applyComponentLayoutlayoutCached 快速返回逻辑是否会跳过 todo 折叠/展开、面板显隐、命令菜单变化后的高度重算。
  • 关注 todoBounds/inputBounds/waterfallMetrics/transcript.Height/todo.Height 是否一致,是否出现“渲染变了但命中区域没变”。
  1. Tick 循环与性能风险
  • 检查 tickMsg + handleTickMsg 是否形成常驻高频循环(100ms)且无业务收益。
  • 评估是否造成空转、CPU 占用升高、测试不稳定。
  1. Todo 事件一致性与状态同步
  • 检查 todo 相关 runtime 事件(updated/conflict)在会话切换、run 切换、空 sessionID 情况下是否可能刷新错误会话。
  • 检查 runtime.LoadSession 在事件路径中的调用频率和失败处理(是否吞错、是否导致 UI 状态残留)。
  1. Todo 列表排序/过滤边界
  • 检查 status + priority + updated_at 稳定排序是否满足预期,未知状态是否被错误归到最高优先级。
  • 检查空标题、空 owner、零时间、重复 ID、大列表滚动、选择越界的处理。
  1. 输入与交互回归
  • 检查键盘与鼠标交互:焦点切换、滚轮、点击表头折叠、Enter 打开详情、c 折叠。
  • 检查 /todo ... 未注册 slash 时是否出现误导行为或错误状态提示。
  1. Slash 指令清理回归
  • 检查移除 /memo/compact/remember/forget 后,帮助菜单、分发逻辑、状态文案、测试断言是否完全一致。
  • 检查遗留状态位(如 compact 相关)是否还存在不可达分支或死逻辑。
  1. 注释与编码质量风险
  • 检查 update.go 是否存在注释乱码/编码污染(如大量异常字符)。
  • 评估是否违反仓库“新增函数中文注释可读性”约束并影响维护。
  1. 测试有效性(不是数量)
  • 检查测试是否真实覆盖关键分支,而不是通过手工设置状态规避真实路径(例如缓存条件)。
  • 指出缺失的回归测试(尤其是布局缓存失效条件、tick 空转、事件风暴下的刷新行为)。

输出格式模板(严格遵循):

  • [severity] path/to/file.go:123 - 标题
  • 风险:...
  • 触发:...
  • 影响:...
  • 建议:...

最后追加两段:

  1. Open Questions(需要作者确认的点)
  2. Missing Tests(建议新增的测试用例清单)

说明

已按 origin/main...HEAD 梳理改动并提炼风险导向审查维度;未执行代码修改。

View job run

@phantom5099

Copy link
Copy Markdown
Collaborator

@xgopilot 请作为严格的 Go/TUI 代码审查器,审查 PR #351origin/main...HEAD),只输出“问题与风险”,不要写正向评价。

审查目标:覆盖本 PR 所有潜在风险点,重点关注行为回归、边界条件、性能/稳定性、可维护性。

硬性要求:

  1. 先给 Findings(按严重级别排序:critical > high > medium > low)。
  2. 每条必须包含:severityfile:line风险描述触发条件影响范围修复建议
  3. 没有证据不要下结论;不确定请写“需补充验证”。
  4. 必须对以下文件重点审查:
  • internal/tui/core/app/todo.go
  • internal/tui/core/app/update.go
  • internal/tui/core/app/view.go
  • internal/tui/core/app/commands.go
  • internal/tui/core/app/app.go
  • internal/tui/state/ui_state.go
  • 相关测试:todo_test.goupdate_test.gocommands_test.goview_test.go

请重点检查以下高风险面:

  1. 布局缓存是否导致 UI 不刷新
  • 检查 applyComponentLayoutlayoutCached 快速返回逻辑是否会跳过 todo 折叠/展开、面板显隐、命令菜单变化后的高度重算。
  • 关注 todoBounds/inputBounds/waterfallMetrics/transcript.Height/todo.Height 是否一致,是否出现“渲染变了但命中区域没变”。
  1. Tick 循环与性能风险
  • 检查 tickMsg + handleTickMsg 是否形成常驻高频循环(100ms)且无业务收益。
  • 评估是否造成空转、CPU 占用升高、测试不稳定。
  1. Todo 事件一致性与状态同步
  • 检查 todo 相关 runtime 事件(updated/conflict)在会话切换、run 切换、空 sessionID 情况下是否可能刷新错误会话。
  • 检查 runtime.LoadSession 在事件路径中的调用频率和失败处理(是否吞错、是否导致 UI 状态残留)。
  1. Todo 列表排序/过滤边界
  • 检查 status + priority + updated_at 稳定排序是否满足预期,未知状态是否被错误归到最高优先级。
  • 检查空标题、空 owner、零时间、重复 ID、大列表滚动、选择越界的处理。
  1. 输入与交互回归
  • 检查键盘与鼠标交互:焦点切换、滚轮、点击表头折叠、Enter 打开详情、c 折叠。
  • 检查 /todo ... 未注册 slash 时是否出现误导行为或错误状态提示。
  1. Slash 指令清理回归
  • 检查移除 /memo/compact/remember/forget 后,帮助菜单、分发逻辑、状态文案、测试断言是否完全一致。
  • 检查遗留状态位(如 compact 相关)是否还存在不可达分支或死逻辑。
  1. 注释与编码质量风险
  • 检查 update.go 是否存在注释乱码/编码污染(如大量异常字符)。
  • 评估是否违反仓库“新增函数中文注释可读性”约束并影响维护。
  1. 测试有效性(不是数量)
  • 检查测试是否真实覆盖关键分支,而不是通过手工设置状态规避真实路径(例如缓存条件)。
  • 指出缺失的回归测试(尤其是布局缓存失效条件、tick 空转、事件风暴下的刷新行为)。

输出格式模板(严格遵循):

  • [severity] path/to/file.go:123 - 标题
  • 风险:...
  • 触发:...
  • 影响:...
  • 建议:...

最后追加两段:

  1. Open Questions(需要作者确认的点)
  2. Missing Tests(建议新增的测试用例清单)

@fennoai

fennoai Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

[high] internal/tui/core/app/update.go:1996 - 布局缓存仅按窗口尺寸命中,导致状态变化后不重算布局
风险:applyComponentLayoutwidth/height 不变时直接返回,跳过 waterfallMetricstranscript.Heighttodo.HeightinputBounds 的更新;Todo 折叠/展开、面板显隐、命令菜单高度变化后会出现“渲染内容变了但布局/命中区域仍是旧值”。
触发:调用 applyComponentLayout(false) 且窗口大小未变化(如 Todo 折叠、事件刷新、输入区高度变化)。
影响:TUI 命中区域与视觉区域不一致,输入区和面板纵向排布可能错位,交互可点击区域偏移。
建议:为布局缓存增加失效条件(todoPanelVisible/todoCollapsed/activityVisible/menuHeight/inputHeight 等),或在相关状态变更前显式 layoutCached=false

[high] internal/tui/core/app/app.go:321 - 100ms 常驻 tick 循环无业务消费,形成空转
风险:Init 注册 tea.Tick(100ms)handleTickMsg 仅再次注册 Tick(update.go:2960),不处理任何状态;形成永久高频消息循环。
触发:应用启动后持续运行。
影响:无收益 CPU 唤醒、潜在功耗上升、在 CI/慢机下增加时序不稳定风险。
建议:移除该循环,或仅在确有动画/节流任务时启用;若保留,需绑定明确消费逻辑并可停机。

[high] internal/tui/core/app/update.go:48 - 面板焦点循环未纳入 Todo 面板
风险:panelOrder 仍为 transcript -> activity -> input,未包含 panelTodo,与新增 Todo 交互设计不一致。
触发:仅使用键盘 Tab/Shift+Tab 切换焦点。
影响:键盘用户无法进入 Todo 面板,Enter/c/上下 等 Todo 键位路径不可达(除鼠标外)。
建议:将 panelTodo 纳入 panelOrder,并补充焦点循环回归测试。

[medium] internal/tui/core/app/todo.go:111 - 未知状态排序被误判为最高优先级
风险:todoStatusRank[strings.ToLower(status)] 对未知 key 返回零值 0,与 pending 同级,导致未知状态排到顶部。
触发:runtime/session 出现新状态或异常状态字符串。
影响:排序语义失真,用户优先看到非预期条目。
建议:对未知状态赋默认大 rank(如 len(todoStatusRank)+1),并增加未知状态排序测试。

[medium] internal/tui/core/app/update.go:1058 - Todo 事件会话归属在空 sessionID 场景存在误刷风险(需补充验证)
风险:runtimeEventTodoUpdated/Conflictevent.SessionID=="" 时回退到 a.state.ActiveSessionID 后直接刷新;shouldHandleRuntimeEvent 对空 event.SessionID 不拦截。
触发:runtime 发出缺失 SessionID 的 todo 事件(尤其会话切换并发时)。
影响:可能刷新错误会话 Todo 面板并写入误导性 Activity。
建议:要求 todo 事件强制携带 SessionID;若为空则忽略并记录告警。当前行为需补充验证 runtime 事件契约。

[medium] internal/tui/core/app/update.go:833 - run 结束后的 Todo 同步吞错,可能残留旧状态
风险:syncTodosFromRunLoadSession 失败直接 return,既不清理旧 Todo,也不提示错误。
触发:run 结束时 LoadSession 临时失败/超时。
影响:面板展示过期 Todo,用户误判当前 run 结果。
建议:失败时至少记录 Activity/Status;必要时清空或标记 Todo 面板为“刷新失败”。

[medium] internal/tui/core/app/todo.go:59 - Todo 过滤能力在生产路径不可达
风险:parseTodoFilter / setTodoFilter 已实现但无实际输入入口(键盘/鼠标/slash)调用;statusTodoFilterChanged 也未被触发。
触发:用户尝试按 PR 描述“按状态过滤”。
影响:功能声明与实际行为不一致,易造成使用误导。
建议:补充明确入口(例如 /todo filter <status> 或面板快捷键),并在帮助菜单中暴露。

[low] internal/tui/core/app/update.go:468 - 注释出现乱码/编码污染,损害可维护性
风险:多处函数注释和行内注释为乱码(如 update.go:468, update.go:555, update.go:1056 等),违反仓库“新增函数中文注释可读性”约束。
触发:阅读、排障、后续重构。
影响:维护成本上升,团队对行为语义理解不一致。
建议:统一按 UTF-8 修复为可读中文注释,避免继续引入编码污染。

Open Questions

  1. Todo 相关 runtime 事件是否协议上保证 SessionID 必填?若不是,当前回退逻辑会在会话切换时引入误刷新风险。
  2. 本 PR 文案声明支持状态过滤,但当前未发现可达入口;是否计划在后续 PR 提供,还是本 PR 漏接线?
  3. tickMsg 轮询是否有未提交的后续用途(例如消费 viewDirty)?当前实现为纯空转。

Missing Tests

  1. applyComponentLayout 缓存失效回归:Todo 折叠/展开、面板显隐、命令菜单高度变化后,transcript.Height/todo.Height/inputBounds/todoBounds 必须同步更新。
  2. 空转 Tick 回归:验证在无业务更新时不会持续 100ms 调度,或验证 Tick 具备可观测业务收益。
  3. Todo 事件一致性:SessionID 为空、会话切换并发、run 切换并发下,确保不会刷新错误会话。
  4. syncTodosFromRun 失败分支:LoadSession 失败时的 UI 状态与错误提示行为。
  5. 排序边界:未知状态、零时间、空标题/空 owner、重复 ID 下排序与展示稳定性。
  6. 焦点循环:Tab/Shift+Tab 可达 panelTodo,并验证 Enter/c/上下在该焦点下可用。

View job run

…ng/neo-code into codex/issue-266-header-render-fix

# Conflicts:
#	internal/tui/core/app/update.go
#	internal/tui/core/app/update_test.go
@codecov

codecov Bot commented Apr 18, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 81.61157% with 89 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
internal/tui/core/app/update.go 67.35% 53 Missing and 26 partials ⚠️
internal/tui/core/app/todo.go 97.78% 3 Missing and 2 partials ⚠️
internal/tui/core/app/app.go 62.50% 2 Missing and 1 partial ⚠️
internal/tui/core/app/view.go 66.66% 1 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

creatang and others added 5 commits April 18, 2026 17:29
…ng/neo-code into codex/issue-266-header-render-fix
…r-render-fix

# Conflicts:
#	docs/tools-and-tui-integration.md
#	internal/tui/core/app/update.go
#	internal/tui/core/app/update_test.go
…ng/neo-code into codex/issue-266-header-render-fix
@creatang

Copy link
Copy Markdown
Collaborator Author

/code 帮我提升[internal/tui/core/app/update.go][internal/tui/core/app/view.go][internal/tui/core/app/app.go]文件覆盖率到百分之95以上

@fennoai

fennoai Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

执行结果

已补充 internal/tui/core/app/update_test.go 的覆盖场景并推送到当前 PR 分支 codex/issue-266-header-render-fix(commit: 96771f5)。

本次新增覆盖重点:

  • app.go 构造与初始化相关错误分支(NewWithMemonewApp 初始化失败分支)
  • update.go 的输入/面板路由、session/todo 同步、provider add 流程与错误分支
  • 扩展测试桩以可控触发 provider 列表/模型列表失败场景

覆盖率结果(语句加权)

  • internal/tui/core/app/app.go: 97.30%
  • internal/tui/core/app/view.go: 96.04%
  • internal/tui/core/app/update.go: 83.53%

测试

  • go test ./internal/tui/core/app -coverprofile=/tmp/app.cover.out
  • go test ./internal/tui/...

未完成项

  • update.go 目前仍未达到 95%,当前差距较大(83.53% -> 95%),主要剩余在大量键鼠交互细分分支与部分 picker 分支。

View job run

xgopilot and others added 3 commits April 18, 2026 10:05
Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: creatang <165447160+creatang@users.noreply.github.com>
…ng/neo-code into codex/issue-266-header-render-fix
@creatang creatang changed the title feat(tui): 增加 Todo 可视化面板并清理无后端 slash 指令 feat(tui): 增加 Todo 可视化面板 Apr 18, 2026
@phantom5099 phantom5099 merged commit 2d59828 into 1024XEngineer:main Apr 18, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants