一个本地自用的 DSH Desktop 工作台:把同时在跑的公司项目、日常工作和零散项目放在一处, 按模块看到每个项目的状态、进度、待跟进事项和 DDL 时间风险,点开看进展,随时问一句,或者 让 Agent 基于这些登记数据做分析、写汇报文档。
工作台只在本地开发和使用,不做市场投稿。
- 项目太多、散落在脑子里或若干个表格里,没有一处能一眼看完「谁在跑、谁要炸、谁快到期」。
- 待跟进事项容易漏,尤其是同时跟进十几个项目的时候。
- 需要写周报、状态汇报、风险清单时,每次都要重新翻一遍记录。
-
进入:在侧栏顶部的模式切换器里选「项目总控台」。没有会话、没有工作区也能直接看到整个页面。
-
看板:顶栏下面是 7 个维度的页签,左侧是模块导航——「模块」轴(全部/公司项目/日常工作/ 其他项目,以及你自己新建的模块)带项目数与风险点,「智能视图」给出需关注/已逾期/本周到期/ 有待跟进/已完成的计数。所有页签都跟着左侧的筛选走。 页签分别是:
页签 维度 内容 概览 统计 6 个 KPI(项目总数/需关注/待跟进/本周到期/平均进度/未排期)、一句话结论、问一句、风险分布环形图、模块负载堆叠条、进度分布直方图、负责人负载排行、需要马上处理、本周到期 模块看板 模块 按模块分区的卡片墙,段头给出项目数/需关注/待跟进/平均进度 状态看板 状态 按「进行中/待启动/阻塞/暂停/已完成」分列的看板,列内按风险排序 列表 明细 项目/模块/状态/进度/截止/剩余/风险/待跟进的紧凑表格 日历 按天 月历网格,DDL 与待跟进落进对应日期格(风险着色),可翻月/回今天,点某天看当天事项并直接勾完成 时间线 区间 甘特式横条,每行一个项目,按起止日期定位,risk 着色,带周刻度与「今天」竖线 待跟进 行动 全部待跟进事项按「已逾期/今天到期/本周内/更晚/未排期」分桶,可就地勾完成 -
点开:点卡片、时间线条、列表行或日历里的项目名,都从右侧滑出详情抽屉:关键信息网格、 时间风险条与判定理由、说明与标签、进展记录(按类型追加、彩色时间线)、待跟进清单、AI 助手按钮。
-
问一句:在提问框里输入「哪些项目这周到期?」「有什么风险?」「我的待跟进还有哪些?」, 面板直接在本地数据上回答;回答里的项目可以接着点开。
-
交给 Agent:在详情或总览点「分析进展 / 生成周报 / 生成状态汇报 / 生成风险清单 / 生成会议纪要骨架」, 面板会把项目数据整理成提示词或文档草稿,一键复制后粘贴到旁边的原生会话发送,也可以下载成
.md。
完成状态:项目被标记为「已完成」,或改动写入成功(右上角显示「已保存 · 修订 N」)。 失败恢复:保存失败时面板回滚到上一次成功的数据并显示原因;版本冲突(另一个窗口改过)会提示 「重新加载」;数据文件损坏时拒绝覆盖。
第一次进入(文档还是空的、而且从没生成过示例)时会自动按模块生成 12 个示例项目,内容都是 一个后端/全栈工程师手上的真实工作,用来把各个看板填满:
| 模块 | 示例 |
|---|---|
| 公司项目 | 订单结算服务重构、数据中台订单域接入、移动端首屏性能优化、灰度发布平台上线 |
| 日常工作 | 内部分享《线上问题定位实战》准备、Q3 技术季度汇报、线上告警值班与故障复盘、依赖升级与技术债清理 |
| 其他项目 | 自研服务监控小工具、开源项目 issue 与 PR 维护、技术笔记与博客整理、副业小程序原型 |
覆盖已逾期 2、紧急 3、进度风险 2、阻塞 1、已完成 1、正常 3,带 13 条未完成待跟进与多条进展记录, 每条都挂「示例」标签。侧栏底部「示例数据」可以再生成一份,「清空」一键删掉(带确认)。
顶栏「AI 填充」:用一句话说明要做什么,工作台会判断是新增 / 修改 / 删除 / 查询,并把它变成一份 可读的变更清单。增删改都会先弹确认,点「确认执行」才一次性写入;查询只回答案、不改数据。
- 交给宿主注册的 LLM(默认走
agentDefaultModel的 provider/model)把指令翻译成 JSON 计划; 模型只负责"翻译",校验、项目匹配、日期解析、预览、落库全部在本工作台的纯函数里做, 模型说错话不会直接改数据。 - 模型不可用(没有 llm 服务、没配默认模型、超时、返回不是 JSON)时,退回本地规则解析, 界面上会标注来源是「模型解析」还是「本地规则解析」。
- 支持的动作:新增项目、修改项目(名称/模块/状态/负责人/起止日期/进度/说明/链接)、删除项目、 新增待跟进、完成待跟进、追加进展记录;一次最多 20 条。
- 找不到或匹配到多个项目的那几条会被跳过,并在确认弹窗里逐条列出原因,不会瞎改。
- 执行完在工作台顶部留一条「撤销」条,可以一键回到执行前。
例:
- 「把订单结算服务重构的 DDL 改到下周五,进度调到 80%」
- 「新增项目:服务网格试点,放到公司项目,截止月底」
- 「给内部分享《线上问题定位实战》准备加一条待跟进:周五前做一次预讲」
- 「删掉副业小程序原型」
- 「这周要交付什么?」
改了服务端入口后需要重启 Harness(应用菜单 Harness → 重启 / ⌘⇧R); 重启前点「解析」会提示「服务端还没加载 AI 解析接口」。
市场条目用的是固定地址 https://github.com/OliverLiy/projectHub/releases/latest/download/dsh-workbench-project-console.tgz,
所以发版不需要再提目录 PR:
- 改
package.json的version(完整 SemVer); pnpm verify && pnpm pack;- 在 GitHub 建一个新 Release,把包改成固定文件名
dsh-workbench-project-console.tgz上传(文件名不带版本号); - 市场每天重建一次索引,会自动读到新版本号与新的校验值。
目录里不写版本号 —— 版本由包内的 package.json 决定,市场探测时读取。
项目数据存在 DSH 数据目录下:
$DSH_HOME/project-console/state.json
# 本机即:~/Library/Application Support/dsh-desktop/harness/project-console/state.json
- 写入是原子的(临时文件 + rename),并带版本号做并发检测。
- 卸载工作台不会删除这个目录,重新安装后数据还在。
- 想从零开始就自己移走或删掉这个文件。
按本地日历日比较,等级从高到低:
| 等级 | 触发条件 |
|---|---|
| 已逾期 | 今天晚于 DDL |
| 阻塞 | 状态为「阻塞」 |
| 紧急 | 距 DDL ≤ 3 天 |
| 进度风险 | 时间已过 X% 而进度明显落后(时间比例 − 进度 ≥ 30%) |
| 临近 | 距 DDL ≤ 7 天 |
| 未排期 | 没填 DDL |
| 正常 | 其余进行中的项目 |
| 已完成 | 状态为「已完成」 |
包已按规范打成 tarball,用当前 Desktop 支持的插件安装方式装入 web profile:
pnpm pack # 产出 dsh-workbench-project-console-1.0.1.tgz
dsh plugin --profile web add "$PWD/dsh-workbench-project-console-1.0.1.tgz"dsh plugin 会把包装进 profile 并把 dsh.profile.bundles 里加上本包,所以它会被当作
插件层加载。装完重启 Harness(应用菜单 Harness → 重启,或 ⌘⇧R),
再到「工作台管理/已安装的工作台」确认条目并添加。
首次使用还需要在 设置 → 通用 里打开「启用工作台功能」(这是宿主的开关,工作台不能代替你打开)。
pnpm install
pnpm build # 把 src/ 打成单文件客户端模块 lib/client.js
pnpm test # node:test 单元与集成测试
pnpm check # 按规范第 3 节校验包格式
pnpm verify # build + test + checkpackage.json npm 与 DSH 插件声明
cordis.patch.yml 把服务端入口插入插件树,并指定数据目录
dsh/server.js 服务端入口:/api/project-console/* 接口
dsh/store.js 项目数据的原子存储与结构收敛
src/client/index.js 客户端入口:注册工作台面板
src/client/panel.js 面板外壳:顶栏、页签、侧栏、抽屉、表单、弹窗
src/client/screens.js 7 个维度的看板视图组件
src/client/charts.js 环形图/堆叠条/直方图/排行条(手写 SVG + CSS)
src/client/ui.js 图标与基础组件(按钮、徽标、进度、弹窗、抽屉、提示)
src/client/styles.js 面板样式(宿主令牌 + 容器查询)
src/client/api.js 客户端访问本工作台接口
src/shared/analysis.js 风险与汇总计算(纯函数)
src/shared/views.js 模块分组、智能视图筛选与搜索(纯函数)
src/shared/insights.js 看板数据层:风险分布/状态列/模块负载/进度分布/负责人负载/日历/时间线/待跟进分桶(纯函数)
src/shared/aiplan.js AI 计划层:NL→计划校验、项目匹配、日期解析、预览、应用、本地规则兜底(纯函数)
src/shared/query.js 「问一句」的本地问答
src/shared/prompt.js Agent 提示词与文档草稿
scripts/build-client.mjs 多文件源码 → 单文件客户端模块
scripts/check-workbench-package.mjs 包格式校验
lib/client.js 构建产物(随包分发)
Desktop 不会替你构建客户端,lib/client.js 必须是已构建好的单文件模块。本项目的
scripts/build-client.mjs 只支持一个很小的语法子集:第 0 列的单行 import/export,
其他内容(包括 CSS 模板字符串)原样保留。相对路径的模块会被内联;裸包名(react)
交给模块加载器的 require,因为它是宿主共享基线。写不支持的语法会在构建时报错,
而不是产出坏包。
- 面板注册为左侧嵌入式业务面板(
embedded: true+businessSide: 'left'+ 宽度 0.68), 根节点第一个子元素是语义<header>:这是宿主文档里的结构,macOS 收起侧栏时宿主会按--dsh-frame-leading-clearance给顶栏预留窗口按钮的宽度(本机实测 160px 生效)。 - 面板宽度受宿主约束,只有左侧 68% 主区;原生会话留在右侧,公共入口(侧栏、 模式切换器、「工作台管理」、设置)都由宿主保留。
- 不使用
customFrame(那会拿走宿主自带的「新建工作区并开始对话/在此工作区新建会话」入口, 需要自己重做一遍会话创建与归属登记),也不自己造聊天界面:原生会话由宿主放置。 - 样式优先复用宿主的
--dsw-*设计令牌(颜色、圆角、字体),跟随 Desktop 主题; 布局用容器查询适配面板宽度,不是视口宽度。 - 不创建会话、不改写会话归属、不动工作区:所有依赖会话的动作都由你复制提示词到旁边的会话完成。
- 键盘可达:所有操作都是原生
button/input,有可见焦点轮廓。
MIT,见 LICENSE。