Skip to content

feat(web): 频道组织架构/汇报关系树预览(扩 DivisionBoard,#281)#300

Merged
leeguooooo merged 1 commit into
mainfrom
feat/org-structure-preview-281
Jul 11, 2026
Merged

feat(web): 频道组织架构/汇报关系树预览(扩 DivisionBoard,#281)#300
leeguooooo merged 1 commit into
mainfrom
feat/org-structure-preview-281

Conversation

@leeguooooo

Copy link
Copy Markdown
Owner

做什么(#281,owner「整个频道的组织关系应该可以预览」)

#168(DivisionBoard 已展示 per-agent 汇报关系)基础上,加整个频道组织/汇报结构的可预览树视图

实现

门禁(rebase 到最新 main 后亲验)

  • web orgTree 8/8;全量 484/0;tsc 0;build 0;rebase 无冲突。
  • 变异:断开父子边 → 树形/嵌套测试红;去掉环守卫 filter → 环测试栈溢出红。均复绿。

未做(follow-up)

树只基于 spawn-lineage(lineage.parent_agent)。正式管理层级(超出 spawn 的显式汇报层)需新后端模型——这是 #168 标注的限制,未杜撰。placement 目前是 DivisionBoard 内默认折叠的 details;若想要顶层「Org」tab,组件与纯函数已解耦、小改即可。

🤖 opus agent 实现 + 我亲验。

#168 已在 DivisionBoard 逐行标注了「汇报给谁 / 谁是主负责人」,但那是碎片,
看不出整体层级。#281 要求「整个频道的组织关系可以预览」——本改动把同一份
presence/lineage/role/昵称数据折成一棵可整体查看的汇报树。

- 新增纯函数 lib/orgTree.ts::buildOrgTree:根 = 频道主负责人(role=host),
  子节点 = 通过 lineage.parent_agent 汇报上来的成员,递归嵌套;无/未知汇报
  对象的散兵单独归入 unassigned 堆(含汇报对象在频道外的,标 external)。
  host 一律锚定顶层;汇报给自己视为无上级;DFS 带 visited 环保护——b→c→b
  这类环只打断回边、不无限递归,每个节点仍渲染一次。
- 新增展示组件 components/OrgTreePreview.tsx:DivisionBoard 内一个可折叠的
  「组织架构 / org structure」预览区,嵌套 ul + 虚线连接线画层级,移动端响应、
  随主题变量走;标注 class 独立(org-lead-tag/org-report),不与 #168 逐行
  选择器冲突。
- i18n en+zh 新增 Channel.org.*;数据全部来自现有 presence/lineage,不新造
  后端模型。正式管理层级(超出 spawn-lineage 的汇报线)需后端支持,见 #168
  交接说明,属后续项。

TDD:orgTree.test.ts 覆盖 树形/多 lead/孤儿/external/环/自环/中层锚定/空输入;
mutation 已验证——断开 parent-linking → 树形测试红,去掉环保护 filter → 环测试
栈溢出红。

Claude-Session: https://claude.ai/code/session_01FS3jLbZK3AqVXgkhRcEEQg
@leeguooooo leeguooooo merged commit 6960bbd into main Jul 11, 2026
17 checks passed
@leeguooooo leeguooooo deleted the feat/org-structure-preview-281 branch July 11, 2026 09:45
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.

1 participant