diff --git a/02_process/PRD.md b/02_process/PRD.md index fc2216d..b19abb0 100644 --- a/02_process/PRD.md +++ b/02_process/PRD.md @@ -1,6 +1,6 @@ # dsh-worktable(工作台)PRD -> 版本:v0.2 草案 · 日期:2026-08-16 · 状态:v1 原型已上线;§10 待设计内容已定案并实现(v2,代码完成、待重启后 GUI 验收) +> 版本:v0.2 草案 · 日期:2026-08-16 · 状态:v2 已实现并验收;§12 多项目分栏框架(v3)设计定案、待新项目开工时实现 > 关联项目:dsh-travelatlas(第一个入驻项目)、上游参考 dsh-reminder(文件夹结构) ## 1. 项目定位 @@ -227,6 +227,63 @@ ctx.slots.register({ | 侧边栏区块 + 三按钮 + ≡ 拖动 | ✅ v1 已实现 | `01_content/src/client/` | | 项目子座位协议 + travelatlas 入驻 | ✅ v1 已实现 | 同上 + dsh-travelatlas/src/client | | 服务端健康路由 | ✅ 已实现 | `01_content/src/index.ts` | -| 视图菜单去分组、编辑模式、添加面板、快捷方式、埋点、i18n | ✅ 本窗口(v2)已实现并构建,待重启后 GUI 验收 | `01_content/src/client/`(§5.3–§5.7) | +| 视图菜单去分组、编辑模式、添加面板、快捷方式、埋点、i18n | ✅ 本窗口(v2)已实现并验收 | `01_content/src/client/`(§5.3–§5.7) | | travelatlas 卡片协议 v2 | ✅ 本窗口已实现并构建(并行重写覆盖后已重新应用) | `dsh-travelatlas/src/client/index.tsx` | +| 多项目分栏框架(openSplit 声明式多栏) | 📝 设计定案(§12),代码待新项目开工时实现 | PRD §12 | + +## 12. 多项目分栏框架(v3 设计,已定案、待实现) + +> 状态:设计定案(2026-08-16 与用户讨论确认)。代码待第一个新项目(如建筑审图)开工时实现, +> travelatlas 可顺带迁入验证。本节为设计规格,不属于 v2 已实现范围。 + +### 12.1 背景与目标 + +- 用户后续项目(建筑审图 / 网页动画生成 / 机器人工作台等)都将以「内容栏并置 + 右侧对话」的 + 形式入驻工作台,栏数 1..n 各异(审图 3 栏、动画 4+ 栏、机器人 2 栏); +- 把 travelatlas 的分栏几何逻辑抽为工作台统一能力:**框架管几何,项目管声明**; +- 目标:新项目接入成本 ≈ 声明一个 SplitSpec(约 20 行),不复制任何几何代码。 + +### 12.2 openSplit 协议(owner props 扩展,向后兼容) + +- owner props v2 增加可选回调 `openSplit(spec: SplitSpec)`(引用稳定); +- 项目卡片 onClick 时调用(与 `reportUsed(id)` 并列); +- 不调用 openSplit 的项目不受框架约束(路线 A 逃生舱):可自行注册 `shell.overlay` + 实现任意自定义布局(travelatlas 现行分栏即属此类)。两条路线并存,互不排斥。 + +### 12.3 SplitSpec 声明 + +```ts +type SplitSpec = { + id: string // 项目 id(用于宽度持久化) + title: string // 分栏标题(左上角) + panes: SplitPane[] // 内容栏,从左到右 1..n +} + +type SplitPane = { + id: string + title: string + width: { default: number; min: number; max: number } + content: + | { kind: 'iframe'; url: string } // 主推:同源站点路由(/xxx/site/) + | { kind: 'component'; component: any } // 预留:项目打包的 React 组件(实现时验证跨插件引用可行性) +} +``` + +示例(建筑审图 3 栏):`panes: [图纸, 规范]` + 自动对话栏。 + +### 12.4 框架职责 + +- 几何:查找会话根(`[data-phase]` 探测 + 结构化甄别,与 travelatlas 现行 hack 一致, + 集中一处维护)、marginLeft 右挤对话区、分隔线拖宽(逐栏 width 约束)、Esc/✕ 退出、 + 会话关闭或结构变化自动退出; +- 对话栏:固定最右,宽度 240–480 可拖; +- 持久化:`dsh.worktable.split.v1` = `{ [projectId]: { [paneId]: width, chat: width } }`; +- iframe 内容:同源路由约定 `//site/`(项目服务端自行托管,travelatlas 模式), + URL 校验 http/https,新标签打开入口同 travelatlas; +- 内容形式:`iframe` 为主;`component` 预留位,待深度交互项目出现时验证并实现。 + +### 12.5 实施时机 + +- 待第一个新项目开工时在本窗口实现;travelatlas 迁入(改为声明式)作为验证用例; +- 实现不改动 §5.3 卡片协议既有字段,仅新增 openSplit;v2 卡片与老项目不受影响。 diff --git a/02_process/worklogs/2026-08-16_worktable-v2.md b/02_process/worklogs/2026-08-16_worktable-v2.md index 6a5446a..e3828cb 100644 --- a/02_process/worklogs/2026-08-16_worktable-v2.md +++ b/02_process/worklogs/2026-08-16_worktable-v2.md @@ -154,3 +154,25 @@ - 备注 3(验证教训):esbuild 默认 ascii charset,非 ASCII 字符在 bundle 里以 \u{...} 转义 输出,且 pwsh Get-Content/IWR 按 ANSI 解码 UTF-8——校验 emoji 需用 read 工具读 UTF-8 或直接查转义序列(如 1F30F)。 + +## 补记(checkpoint + GitHub 推送) + +- 用户确认效果稳定,执行 checkpoint:dsh-worktable 建 git 仓库(branch main), + 本地身份 Aisland ,首次提交 d58cbc5(20 文件; + node_modules/lib/03_local/日志按根 .gitignore 排除);README「当前状态」段同步为 v2。 +- 推送到 GitHub 私有仓库 https://github.com/Aisland-SJL/dsh-worktable: + 安装 gh CLI(winget,v2.97.0);设备授权流程首次因网络超时失败——根因为系统代理 + (127.0.0.1:7890)只作用于 WinINET,gh CLI 需显式 HTTPS_PROXY 环境变量; + 带上代理重试成功,账号为 Aisland-SJL,创建私有仓库并推送 main=d58cbc5,已验证同步。 +- 遗留:lib/ 未入库(clone 后需 npm install && npm run build); + 01_content 内缺 README.md/LICENSE(开源独立发布前补);版本号仍 0.1.0(开源前升 0.2.0)。 + +## 补记(多项目分栏框架设计定案) + +- 用户规划后续项目:建筑审图工作台(图纸+规范+对话 3 栏)、网页动画生成工作台(4+ 栏)、 + 机器人工作台(2 栏)等,均以「内容栏并置 + 右侧对话」形式入驻工作台。 +- 讨论结论(用户确认):路线 B——工作台内置「声明式多栏」分栏框架(openSplit(spec) 回调), + 框架管几何(会话根探测/挤右栏/拖分隔线/Esc/宽度持久化),项目管声明(panes 数组 + iframe URL + 为主、component 预留位);路线 A(项目自带 overlay)作为逃生舱并存。 +- 落地:PRD §12 写入设计规格(SplitSpec/框架职责/实施时机),代码待第一个新项目开工时实现; + §11 状态表同步;本窗口暂不写代码(用户选择「先落设计」)。