Skip to content

refactor(wiki): Catalog 与 Publish 子视图合并为单页一体化发布工作台 - #576

Merged
ThreeFish-AI merged 2 commits into
feature/1.x.xfrom
ThreeFish-AI/wiki-publish-entry
May 19, 2026
Merged

refactor(wiki): Catalog 与 Publish 子视图合并为单页一体化发布工作台#576
ThreeFish-AI merged 2 commits into
feature/1.x.xfrom
ThreeFish-AI/wiki-publish-entry

Conversation

@ThreeFish-AI

Copy link
Copy Markdown
Owner

背景与动机

PR #556 (commit dc90de62) 把原来独立的 /knowledge/catalog/knowledge/wiki 合并到单一路由后,引入 ModeToggle(Catalog / Publish)做视图切换:默认进入 Catalog 编辑视图,发布相关 UI 全部被折叠到第二个视图后面。结果:用户在默认视图下找不到「把编排好的 Wiki 发布到 negentropy-wiki 站点」的操作入口

本次彻底去除「模式」概念,改为单页一体化:在一个页面上同时完成 Catalog 维护和 Wiki 发布,消除发布入口的发现性问题。

设计

重构前 vs 重构后

重构前

[KnowledgeNav: ModeToggle(Catalog|Publish) + 一级导航]
├─ edit:    [Catalog 树] | [NodeDetailPanel 节点编辑]
└─ publish: [Catalog 树] | [发布列表 | WikiPublicationDetail(发布详情+操作)]

重构后

[KnowledgeNav: 一级导航]                          ← 移除 ModeToggle slot
├─ WikiPublishToolbar 粘性顶部工具栏(始终可见)
│   ├─ 发布对象选择器(下拉 + 新建 + 状态徽章)
│   ├─ 操作按钮:[从 Catalog 同步] [同步并发布] [仅发布/取消发布] [删除]
│   └─ Pipeline 状态条(pipelineActive 时渲染)
└─ 主体布局:
    ├─ 左栏 [Catalog 树]      ← CatalogTreePane 不变
    └─ 右栏 [节点编辑]        ← NodeDetailPanel 不变
        └─ 底部可折叠区:「该发布包含 N 个条目」→ WikiEntriesPreview

核心改动

文件 改动
apps/negentropy-ui/app/knowledge/wiki/_components/WikiPublishToolbar.tsx 新增 顶部粘性工具栏,承载 publish/unpublish/sync/delete 全部 handlers + Pipeline 透传
apps/negentropy-ui/app/knowledge/wiki/_components/WikiEntriesPreview.tsx 新增 底部可折叠条目预览,forwardRef + useImperativeHandle 暴露 refresh() 给工具栏
apps/negentropy-ui/app/knowledge/wiki/_components/LibraryShell.tsx 重构 移除 viewMode/handleModeChange/ModeToggle;主区固定渲染 NodeDetailPanel;底部接入 WikiEntriesPreview
apps/negentropy-ui/app/knowledge/wiki/_components/ModeToggle.tsx 删除 模式概念消失
apps/negentropy-ui/app/knowledge/wiki/_components/WikiPublicationDetail.tsx 删除 操作面板下沉到 WikiPublishToolbar;条目预览迁出到 WikiEntriesPreview
apps/negentropy-ui/app/knowledge/wiki/_components/WikiPublicationList.tsx 删除 由顶部下拉选择器替代
apps/negentropy-ui/app/knowledge/wiki/page.tsx 简化 去掉 ?mode URL 参数读取与 Suspense+useSearchParams 间接层;旧 URL ?mode=publish 仍可正常打开(参数被忽略)
apps/negentropy-ui/components/ui/KnowledgeNav.tsx 微调 移除 dead prop modeToggle 及对应渲染分支
apps/negentropy-ui/tests/unit/ui/KnowledgeNav.test.tsx 同步 移除 modeToggle 渲染顺序断言
apps/negentropy-ui/tests/unit/knowledge/WikiPublishToolbar.test.tsx 新增 7 例覆盖关键行为契约
docs/wiki/user-guide/publishing.md 新增 §8.2.1 实操指南章节
CHANGELOG.md 新增 Unreleased / Changed 条目

不变项

  • 后端 API POST /api/knowledge/wiki/publications/{id}/publish 及全部 schema 零改动
  • ISR webhook 链路(NE_KNOWLEDGE_WIKI_REVALIDATE__URL → SSG /api/revalidate)零改动
  • 数据模型、迁移、features/knowledge API client 签名零改动
  • /knowledge/wiki 路由保持 Static 预渲染(移除 useSearchParams 后是意外优化)
  • 旧 URL /knowledge/wiki?mode=publish 向后兼容(参数被忽略,不报错)

测试用例

新增 WikiPublishToolbar.test.tsx 7 例锁定行为契约:

  1. 无发布对象时,操作按钮全部 disabled
  2. draft 状态显示「仅发布」,published 状态显示「取消发布」
  3. 点「仅发布」调用 publishWiki(pubId) 并触发 onPublicationsChanged
  4. 点「取消发布」确认后调用 unpublishWiki
  5. 点「删除」确认后调用 deleteWikiPublication 并触发 onPublicationDeleted
  6. 点「同步并发布」打开选择器;选择器确认后先同步再发布
  7. 点「从 Catalog 同步」仅同步不发布

本地静态验证

  • pnpm typecheck 零错误
  • pnpm typecheck:test 零错误
  • pnpm lint --max-warnings=0 零告警
  • pnpm test 93 个测试文件 / 730 例全部通过(含新增 7 例)
  • pnpm build 成功,/knowledge/wiki 保持 ○ Static 预渲染

浏览器实机回归清单(待 PR 阶段人工验收)

本次会话中因 chrome-devtools-mcp profile 已被另一实例占用 + 完整流程需 3 个长进程外加已登录会话,未在本地完成端到端实机验证;以下清单沉淀给 reviewer 在验收环境逐项确认。

基础渲染

  • 访问 /knowledge/wiki 顶部出现「Wiki 发布」工具栏,无 ModeToggle 元素
  • Catalog 树左栏拖拽 / 重命名 / 添加 / 删除节点功能不退化
  • 节点详情(NodeDetailPanel)编辑功能不退化

发布流程

  • 工具栏「+ 新建」对话框正常;新建后下拉自动切换到该 Publication
  • 「从 Catalog 同步」打开节点选择器;提交后 toast 提示同步成功
  • 底部「该发布包含 N 个条目」展开后导航树同步显示最新条目
  • 「同步并发布」执行后 Pipeline 状态条出现并完成三步(保存版本 → 通知 SSG → 验证内容)
  • negentropy-wiki 站点(默认 http://localhost:3092)刷新看到新版本内容

回退 / 异常

  • 「取消发布」按钮在 published 状态可点;点击后回退草稿,站点不可访问
  • 多 Publication 切换正常(切换发布对象时 Pipeline 状态自动复位)
  • 旧 URL /knowledge/wiki?mode=publish 仍能正常打开(参数被忽略,不报错)

正交回归

设计依据

  • AGENTS.md「最小干预」「正交分解」「单一事实源」「主动导航」原则
  • React 范式:forwardRef + useImperativeHandle 用于父子命令式通信(Catalog 同步成功 → 触发条目预览刷新)
  • Next.js App Router:移除 useSearchParams 后页面恢复 Static 预渲染能力
  • Keep a Changelog + SemVer 约定

🤖 Generated with Claude Code

PR #556 引入的 ModeToggle 把发布相关 UI 折叠到第二个视图后,发布入口的发现性显著下降——用户在默认 Catalog 视图下找不到「把编排好的 Wiki 发布到 negentropy-wiki 站点」的操作入口。本次彻底去除「模式」概念,改为单页一体化:顶部粘性发布工具栏(Publication 选择器 + 状态徽章 + 操作按钮组 + Pipeline 状态条)+ 左栏 Catalog 树 + 右栏节点详情 + 底部可折叠的条目预览。后端 API、ISR webhook 链路、数据模型零改动。

- 新增 WikiPublishToolbar 承载 publish/unpublish/sync/delete 全部 handlers + Pipeline 透传;切换发布对象时 useEffect([pubId]) 复位 Pipeline 状态避免上次回执遗留
- 新增 WikiEntriesPreview 作为底部折叠区,forwardRef + useImperativeHandle 暴露 refresh(),从 Catalog 同步成功后由 LibraryShell 触发刷新
- 重构 LibraryShell 移除 viewMode/handleModeChange/ModeToggle,主区固定为 NodeDetailPanel
- 删除 ModeToggle/WikiPublicationDetail/WikiPublicationList 三个已被替代的组件
- 简化 page.tsx 去掉 ?mode 参数与 Suspense+useSearchParams 间接层,旧 URL ?mode=publish 仍可正常打开(参数被忽略)
- KnowledgeNav 移除 dead prop modeToggle 与对应渲染分支,同步移除 KnowledgeNav.test.tsx 中相关 case
- 新增 WikiPublishToolbar.test.tsx 7 例覆盖 disabled 态/状态切换/publishWiki/unpublishWiki/deleteWikiPublication/同步并发布/仅同步双路径
- docs/wiki/user-guide/publishing.md 新增 §8.2.1 实操指南,覆盖前置条件/第一次发布 5 步/日常增量发布/取消发布与回滚/配置说明/FAQ,交叉引用 docs/wiki/ops.md §8 与 §12.3
- CHANGELOG 在 [Unreleased]/Changed 顶部新增条目,详尽记录改动半径与契约

本地静态验证:typecheck/typecheck:test/lint 全绿,vitest 730 例全通过,Next.js build 成功且 /knowledge/wiki 路由保持 Static 预渲染。浏览器实机回归留作 PR 阶段人工验收清单。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
- catalog/page.tsx 移除 ?mode=edit 死查询串(wiki/page.tsx 已不再读取该参数)
- WikiPublishToolbar 状态徽章区补回 publication.description 截断显示,闭环信息回显
- publishing.md §8.2.1 死链占位符替换为指向 CHANGELOG.md 的相对链接

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
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