dsh-erpbot 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +177 -2
- package/client.js +7418 -0
- package/cordis.patch.yml +4 -0
- package/icon.svg +11 -0
- package/index.js +386 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +65 -4
- package/scripts/build.mjs +115 -0
- package/src/README.md +51 -0
- package/src/assistant/index.js +459 -0
- package/src/board-data.js +77 -0
- package/src/bot-data.js +148 -0
- package/src/bundle.json +162 -0
- package/src/cards/index.js +475 -0
- package/src/chart/index.js +186 -0
- package/src/dashboard/index.js +337 -0
- package/src/entry.js +23 -0
- package/src/header.js +19 -0
- package/src/i18n/index.js +602 -0
- package/src/icons.js +115 -0
- package/src/kpi-detail.js +135 -0
- package/src/loader.js +19 -0
- package/src/metric-format.js +90 -0
- package/src/mount.js +109 -0
- package/src/nav.js +9 -0
- package/src/pages-data.js +1326 -0
- package/src/primitives.js +106 -0
- package/src/shell/index.js +100 -0
- package/src/styles.js +2219 -0
- package/src/theme-bridge.js +33 -0
- package/src/workbench/index.js +831 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 mingde431
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,178 @@
|
|
|
1
|
-
#
|
|
1
|
+
# erpBot(Harness Erp)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
一个 DSH(DeepSeek Harness)Web UI 插件:在左侧导航栏顶部新增 **erpBot** 入口,点开是一个按 **Aurora** 主题的财务 / ERP 面板——**1 个总览 + 4 个业务 Bot + 1 个底座**,支持中英双语,**左下角可切换语言**。
|
|
4
|
+
|
|
5
|
+
## 功能
|
|
6
|
+
|
|
7
|
+
- 左侧导航栏图标列表顶部(`plugins`、自动化任务之上)新增 erpBot 图标(B 字标)。
|
|
8
|
+
- 主面板:Aurora 风格的财务面板(统计卡 + 迷你折线、虚拟信用卡与额度进度、SVG 收支折线图、支出占比环形图、最近交易)。
|
|
9
|
+
- **六个导航目录**:总览 `overview`、账房·财 `cai`、司库·资 `zi`、军师·推 `tui`、税官·税 `shui`、底座 `base`(MCP 与数据单页)。页面状态写进 `#/erp/<id>`,刷新后停在原页;`#/erp/shu`、`#/erp/guan` 作为底座深链别名,都落到同一页。
|
|
10
|
+
- **左侧 rail**:白色导航组内从上到下是 **erpBot 的 B 字标 + 6 个导航图标**(总览 / 四个 Bot / 底座),导航组外左右各留 **8px**;左下角是 erpBot 字标 + 「中 / EN」分段语言开关。列宽不写死,由内容算出(图标按钮 + 组内边距 + 两侧 8px 留白):常规/中档 70px、≤900px 66px、≤560px 60px;B 字标与图标同宽同列,悬浮与选中态沿用原 Aurora 图标列设计。
|
|
11
|
+
- 单一主题:只保留 Aurora 一种风格(源设计里的第二种主题已移除)。
|
|
12
|
+
- 双语:只做 `中文` / `EN` 两种,**默认中文**。切换控件是左下角按钮组(设置、语言)里的**一颗圆按钮**,只显示当前语言(`中` / `EN`),点击即切换。语言是插件内自持状态,不跟随、也不改写宿主的界面语言。
|
|
13
|
+
- **我的卡片是轮播**,最多 5 张(`CARD_LIMIT`):左右两颗圆箭头翻页、底部圆点直接跳转、右上角显示「第 N / 5 张」,并用 `CARD_AUTO_MS`(5.2s)自动轮播。鼠标移入卡片区或键盘聚焦时**暂停**自动轮播,手动翻页后计时器重置,不会刚翻完又被自动切走。卡片数据在 `CARDS` 数组里,每张有自己的品牌、卡号后四位、有效期、安全码、额度进度和配色(`v1`–`v5` 五种 Aurora 家族色调,CSS 类 `.visa.v2…v5`)。源设计里的「添加卡片」按钮已移除。
|
|
14
|
+
- 自适应:面板宽高完全跟随 DSH 分配的槽位区域。
|
|
15
|
+
- **宽度**用容器查询分级重排:`.erp-app` 声明 `container-type:inline-size` / `container-name:erp`,所有断点都是 `@container erp (max-width: 1180/900/720/560px)`,即按**槽位宽度**而非窗口宽度重排(4 列统计卡 → 2 列 → 1 列,row2 / row3 依次塌成单列)。
|
|
16
|
+
- **高度**用 `container-type:size` 的板容器:`.erp-board` 声明 `container-name:board`,短高度断点全部是 `@container board (max-height: 820/680/560/460px)`。**关键点**:旧实现用 `@media (max-height: …)`,测的是浏览器窗口高度;面板实际高度由 DSH 分配,窗口高而面板矮时规则不会触发 → 底部卡片被裁。改成容器查询后,量的是槽位盒子本身。
|
|
17
|
+
- 行高不写死像素:宽屏下 `.t1-main` 用 `grid-template-rows: auto minmax(var(--erp-row2-min),1.42fr) minmax(var(--erp-row3-min),1fr)`,三行**分享**框内剩余高度;各短高度档只把 `--erp-row2-min` / `--erp-row3-min` 改成 `0px`,不再直接写 `grid-template-rows`(否则窄面板单列堆叠时也会被强制 fr 分配,把卡片压成 0 高)。
|
|
18
|
+
- 放不下的信息靠**卡片内部降级**消化,绝不把布局顶出去:图表 `flex:1 1 auto` + `min-height` 触底;`.ov-foot`、`.boost`、`.spark`、`.stat-sub`、`.yc-meta`、时间段等次要信息按高度档依次隐藏;交易行按档留 4/3/2 行;VISA 卡在矮盒里从 1.62:1 卡片切成横向 banner(banner 会为左右箭头预留 `padding`,箭头永远不被品牌字盖住),低于 24px 整卡隐藏;环形图改由行高驱动(`height:100%;width:auto;max-height`),极矮档删环留图例。
|
|
19
|
+
- 图表自身有 `tight` 模式:`drawOverview()` 在 `H < 118` 时收窄内边距、省略非零刻度标签、隐藏 tooltip,但**仍然绘图**(旧实现在 `H < 110` 直接 return,矮面板会留空白卡)。
|
|
20
|
+
- 只有右侧 `.t1-main` 会滚动;左侧 `.t1-rail` 整体 `overflow:hidden`,矮面板下只有主图标组自己滚动(隐藏滚动条),设置/语言那颗底部按钮组 `flex:none` 始终留在左下角。
|
|
21
|
+
- 单列模式(`@container erp (max-width:1180px)`)下卡片区是内容高度,卡面(高度驱动的 1.62:1)会塌成 0,所以这一档给 `.visa-wrap` 单独设 `height:clamp(120px,24cqh,240px)`。
|
|
22
|
+
- 支出构成卡是**二级容器**:`.exp-card` 自己声明 `container-type:inline-size`(`container-name:exp`),环形图直径、圆心文字、图例字号与间距全部用 `clamp(…cqi…)` 按**卡片自身宽度**伸缩;**环形图与图例始终同一行**(窄于 290px 只收紧间距、把环径压到 76–96px,绝不改成上下堆叠——堆叠会把卡脚顶出卡片),窄于 190px 时隐藏百分比,宽于 420px 时环与图例作为整组居中、图例宽度封顶避免两端拉散。环形图再有第三层 `@container donut (max-height:66px)`,环太矮时只保留金额、隐去「支出合计」。560px 档的图例折成两列网格,460px 档(环已隐藏)图例占满卡片宽度、四列一行排开。
|
|
23
|
+
|
|
24
|
+
## 六个导航目录(总览 / 四 Bot / 底座)
|
|
25
|
+
|
|
26
|
+
2026-11-12 起,导航从 7 个收敛为 6 个,分成三种形态:
|
|
27
|
+
|
|
28
|
+
- **财 / 资 / 推 / 税 = Bot 页**(`BotShell`):顶排仍是 4 个 KPI 卡;KPI 行以下是**一整块对话卡片**(官方 DSH 会话嵌入),不再有常驻左栏。点对话头部的 **Bot 头像**打开右侧配置抽屉:身份(角色定义只读 + 称呼 / 语气 / 时间口径偏好)、技能(本地 8 / 6 / 8 / 6 + 可加载平台技能,上限 12)、记忆(用户身份关系 + 技能清单,存 localStorage)。每个 Bot 一个独立工作区(默认 `D:\erpBot\<bot>`,D 盘不可用时降级到 `Documents\deepseek-harness\erpbot-<bot>`)。技能「看结果」在右侧画布抽屉里复用原 12 种渲染器。
|
|
29
|
+
- **底座 `base` = MCP 与数据单页**:一个导航入口(`底座 · MCP 与数据` / `Base · MCP and Data`),**页内无 tab**;顶排 4 张 KPI(MCP 通道 / 数据源 / 指标 / 质量异常)+ 一张工作台(左清单 8 项 + 右主内容)。8 项顺序:MCP 通道与服务、技能与场景、数据源、蒸馏批次、主数据映射、指标与口径、质量与对账、回执与审计;原数据 / 治理两页的 12 项合并为 8 项,工具与白名单、健康度、场景与运行、导出与回执的内容并入保留项。深链 `#/erp/shu` / `#/erp/guan` 是别名,都落到本页。
|
|
30
|
+
- **总览 `overview`**:待办与跨页状态,布局不变。
|
|
31
|
+
|
|
32
|
+
- 财 / 资 / 推 / 税:账、钱、预测、税(内容见 `spec/` 下四份 `*-content-spec.md`;Bot 身份 / 技能配置同见 `spec/`)。
|
|
33
|
+
- 底座(MCP 与数据)的写边界、审计链、导出与跨页同数规则见 `spec/base-content-spec.md` §6;**审计链唯一在底座**,Bot 只保留回执引用。
|
|
34
|
+
|
|
35
|
+
### KPI 卡(7 种变体,按 `kpi.kind` 渲染)
|
|
36
|
+
|
|
37
|
+
2026-11-12 重做:**每张卡只留三件事** —— 主数字(带单位)、一行口径(`kpi.cardSub`)、一个微型图;账户拆分、三层图例、状态分解、备注全部收进 `MetricDetailModal`。卡的骨架固定为 标题行 → 主数字(+ 仪表环)→ 口径行 → 微型图 + 环比,四列并排时不再出现 8–9px 小字和互相挤压。
|
|
38
|
+
|
|
39
|
+
**金额单位**:payload 仍只写精确到分的元(`¥8,450,000.00`,见 SCHEMA §4),**显示层**由 `moneyParts()` / `compactMoney()` 统一换算:
|
|
40
|
+
|
|
41
|
+
| 量级 | 中文 | English |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| ≥ 1 亿 | `¥1.26亿` | ≥ 1B → `¥1.26B` |
|
|
44
|
+
| ≥ 1 万 | `¥845万`、`¥1,200万`、`¥64.35万` | ≥ 1M → `¥8.45M`;≥ 10K → `¥643.5K` |
|
|
45
|
+
| < 1 万 | 保留精确元 `¥8,640.00` | 同(`¥8,640.00`) |
|
|
46
|
+
|
|
47
|
+
小数点后最多两位、去掉无意义的尾零,溢出时自动进位(`99,999,999` → `1亿`)。浮点单位只用于**读数**:图标 title、弹窗「精确金额」行、构成明细与 `detail.formula` 仍给到分,勾稽不因换算失真。
|
|
48
|
+
|
|
49
|
+
| kind | 卡上长什么样 | 用在哪页 |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| `value` | 大数字 + 迷你折线 + 环比 | 财(凭证数)、推(预测收入)、税(应纳增值税) |
|
|
52
|
+
| `split` | 大数字 + 3 段占比条(无文字) | 资(总余额)、税(待缴 → 增值税 / 附加 / 个税) |
|
|
53
|
+
| `stack` | 大数字 + 3 段构成条(无图例) | 资(可用余额三层) |
|
|
54
|
+
| `gauge` | 主数字 + 环形进度(`ratio`) | 财(期末 8/12)、推(预算执行 64%)、税(申报 2/3) |
|
|
55
|
+
| `countdown` | 主数字 + 进度条 + 截止日(口径行) | 税(申报剩 4 天) |
|
|
56
|
+
| `status` | 主数字 + 状态徽标(标题行右侧)+ 一行清单摘要 | 财(待处理单据 37)、资(未达项 3 笔)、推(假设版本 A3) |
|
|
57
|
+
| `delta` | 带符号差异 + 迷你折线 + note 收进弹窗 | 财(借贷差异 ¥0.00)、资(今日净额)、推(与上版差异) |
|
|
58
|
+
|
|
59
|
+
点开卡片进入 `MetricDetailModal`:标题 + 主数字(同单位)+ **精确金额** + 完整口径(`kpi.sub`)+ 可选迷你折线(有 `kpi.spark` 才有)+ **构成明细**(`detail.breakdown`,缺省回退 `kpi.parts` / `kpi.lines`,数值/占比/占比条)+ **统计口径**(`detail.formula`)+ 更新时点。`detail.formula` 就是该数的口径,必须能算。
|
|
60
|
+
|
|
61
|
+
### 右侧主内容(12 种渲染器,按 `section.kind` 分发)
|
|
62
|
+
|
|
63
|
+
| kind | 渲染 | 用在哪页 |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `list` | 行列表(name / desc / badge / tone / meta) | 财应付、税查验、税申报 |
|
|
66
|
+
| `table` | 多列表格 + 合计行 | 财凭证 / 报表、资票据、税销项 / 进项、推管报 |
|
|
67
|
+
| `flow` | 收付款流水(in / out 方向与符号) | 资收付待办、税报送与缴款 |
|
|
68
|
+
| `cards` | 卡片网格(自适应 4 列) | 财固定资产、资账户、推资金计划 |
|
|
69
|
+
| `steps` | 进度条 + 步骤清单(done / active / todo / off) | 财期末关账 12 步 |
|
|
70
|
+
| `checks` | 断言清单(ok / warn / error) | 财试算平衡、财核对底稿 |
|
|
71
|
+
| `bars` | 横向条形(pct + 文本值) | 财应收账龄、推预算编制、推差异归因 |
|
|
72
|
+
| `chart` | 折线 / 柱状 + 标签 + 口径注脚 | 资资金计划、推滚动预测、税税负率 |
|
|
73
|
+
| `donut` | 环形构成 + 图例 | 推成本分摊 |
|
|
74
|
+
| `timeline` | 版本 / 运行时间线 | 推假设版本 A1 → A2 → A3 |
|
|
75
|
+
| `scenarios` | 情景对比表 | 推情景模拟 |
|
|
76
|
+
| `empty` | 未接入占位(旧 `rows` 结构自动降级) | 仅历史数据兜底;全部页面均已接入真实 payload |
|
|
77
|
+
|
|
78
|
+
左栏条目可带 `pill`(如「4 批」「12 步」「2/3」);右栏顶部可带 1–3 个 `summary` 摘要块,底部可带 `foot` 口径落款;`chart` / `donut` / `bars` 等按数据形状各自成图。
|
|
79
|
+
|
|
80
|
+
**图表 / 清单双视图**:`chart` / `donut` / `bars` 三类板块在 payload 里带 `alt`(`{kind:'list'|'table', data}`)时,右栏标题右侧出现「图表 / 清单」切换;图表看趋势,清单看同一口径的明细行(合计对平)。切段时自动回到图表视图。
|
|
81
|
+
|
|
82
|
+
### 数据与维护
|
|
83
|
+
|
|
84
|
+
- 页面数据 = `PAGES.cai/zi/tui/shui/base`(`base` 为单页内联 payload,4 KPI + 8 清单项,不再有数据 / 治理 tab);源文件 `src/pages-data.js`,**改数据改 payload → `node scripts/build.mjs` → 重启 DSH**,不要手改 `client.js` 里的 `PAGES` 块。
|
|
85
|
+
- payload 契约:`_erp-dev/pages/SCHEMA.md`;最小示例:`_erp-dev/pages/_example.js`;单页校验:`node _erp-dev/tools/validate-page.js <cai|zi|tui|shui>`(`base` 页 payload 内联在 `src/pages-data.js`,由 `_erp-dev/check.cjs` 覆盖)。
|
|
86
|
+
- **单位只换算在渲染层**:payload 永远写 `¥` + 千分位 + 两位小数(SCHEMA §4 禁止 `万/亿`);`PageKpi` / `MetricDetailModal` 用 `moneyParts()` / `compactMoney()` 显示成 `¥845万` / `¥8.45M`。改单位规则只改这两个函数,别改数据。
|
|
87
|
+
- 卡的短口径在 `kpi.cardSub`(`{zh,en}`,一行以内);完整口径仍是 `kpi.sub`,只出现在弹窗。`caption`(如「剩 4 步」)也在弹窗显示。
|
|
88
|
+
- 渲染回归:`node _erp-dev/check.cjs` —— 覆盖全部页面 4 KPI × 变体、rail 分组与选中态、底座单页(4 KPI + 8 清单项)、英文无中文泄漏、跨页锚点与金额格式,并断言「卡上不出现 7 位元金额」「有金额的页必须出现 万/亿」「每卡一行口径 + 一个微型图」「弹窗所需的 `cardSub` 齐全」;段内合计另跑 `node _erp-dev/tools/check-anchors.js`。
|
|
89
|
+
- 内容与口径来源:`spec/`(四份 Bot 规格 + `base-content-spec.md`)与 `docs/`(需求 / 数据契约 / 验收 / 架构)。
|
|
90
|
+
- 预览截图:`_erp-shots/` 下的整页 / KPI / 弹窗 / 窄面板与暗色截图;底座合并后的验收截图:`base-merged-01-overview.png`(默认)、`base-merged-02-skills.png`(技能与场景)、`base-merged-03-receipts.png`(回执与审计)、`base-merged-04-en.png`(英文)、`base-merged-05-narrow1180.png` / `base-merged-06-narrow900.png` / `base-merged-11-narrow1180-fresh.png`(窄面板)、`base-merged-07-dark.png` / `base-merged-09-dark-skills.png` / `base-merged-10-dark-receipts.png`(暗色);其中 `v9-shu*.png` / `v9-guan*.png` 与 `v7-cai/zi/tui/shui.png` 为底座合并前的历史截图。
|
|
91
|
+
- 预览:`_erp-dev/.preview/index.html?page=<id>`,可加 `&lang=en`、`&theme=dark`、`&open=<0-3>`(自动打开第 N 个 KPI 弹窗,方便截图)。
|
|
92
|
+
- 预览截图(2026-11-12 重做后):`_erp-shots/kpi-zi-zh.png` / `kpi-cai-zh.png` / `kpi-tui-zh.png` / `kpi-shui-zh.png`(KPI 行)、`kpi-zi-en.png` / `kpi-shui-en.png`(英文)、`kpi-zi-dark.png` / `kpi-cai-dark.png`(暗色)、`kpi-zi-1024.png` / `kpi-zi-640.png` / `kpi-shui-1024.png`(窄面板)、`kpi-before-zi-1502.png`(改版前基线)、`kpi-before-after.png`(对比图)、`modal-zi-1/2/3.png`、`modal-cai-1/2/3.png`、`modal-shui-0/1/3.png`、`modal-tui-1.png`(KPI 弹窗)、`modal-zi-en.png` / `modal-cai-en-2.png` / `modal-zi-dark.png` / `modal-zi-narrow.png`。整页截图:`_erp-shots/v9-overview.png` / `v9-cai.png` / `v9-tui.png` / `v9-shui.png` / `v9-zi-en.png`。改版验收记录见 `_erp-dev/verify-report.md` 末节,独立审计与修复记录见 `_erp-shots/audit/kpi-audit-57317AF.md` 末节。
|
|
93
|
+
|
|
94
|
+
## 安装状态
|
|
95
|
+
|
|
96
|
+
已通过 `plugin_manager` 装进 `desktop` profile(`dsh.profile.bundles` 含 `dsh-erpbot`,`dependencies` 为 `link:D:/DSH 插件/dsh-erpbot`),**改动 `client.js` 后需重启 DSH 生效**。
|
|
97
|
+
|
|
98
|
+
## 结构
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
dsh-erpbot/
|
|
102
|
+
├── package.json # bundle manifest:exports / files / dsh.bundle.patch / dsh.client
|
|
103
|
+
├── cordis.patch.yml # 向 profile 的 Cordis 组合插入 dsh-erpbot 条目
|
|
104
|
+
├── index.js # Host 半:按 bot 白名单建工作区目录(D:\erpBot\<bot>)+ POST /erp/workspace
|
|
105
|
+
├── client.js # Client 半【产物】:由 src/ 拼接而成,不要直接改
|
|
106
|
+
├── src/ # Client 半【来源】:7 个功能板块工厂 + 横切小片 + entry 接线
|
|
107
|
+
│ ├── bundle.json # 拼接顺序的唯一声明(order 升序)
|
|
108
|
+
│ ├── entry.js # 唯一接线点:实例化 7 个工厂、解构到顶层
|
|
109
|
+
│ ├── loader.js # __ModuleLoader__.load 开头
|
|
110
|
+
│ ├── mount.js # return { inject, apply } 收尾
|
|
111
|
+
│ ├── i18n/ chart/ assistant/ cards/ dashboard/ workbench/ shell/ # 功能板块(各一个 createXxx 工厂)
|
|
112
|
+
│ └── icons.js styles.js board-data.js pages-data.js bot-data.js nav.js
|
|
113
|
+
│ metric-format.js theme-bridge.js primitives.js kpi-detail.js # 横切共享小片
|
|
114
|
+
├── scripts/ # build.mjs(拼接 + acorn AST 顺序校验)、verify.mjs、test-manifest.mjs、lint-factories.mjs
|
|
115
|
+
├── locale/en.json # 显示元数据(插件市场/设置页用)
|
|
116
|
+
├── locale/zh.json
|
|
117
|
+
└── icon.svg # 原创图标(Aurora 渐变 + B 字标)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`client.js` 是 DSH 实际加载的 **单文件 bundle**。源码按**功能板块**拆成 7 个工厂函数
|
|
121
|
+
(`createI18n` / `createChart` / `createAssistant` / `createCards` / `createDashboard` /
|
|
122
|
+
`createWorkbench` / `createShell`),每个板块**依赖对象进、命名空间对象出**;`entry.js`
|
|
123
|
+
按拓扑序实例化它们,`scripts/build.mjs` 纯拼接 + acorn AST 校验顺序。`createAssistant` 现在是
|
|
124
|
+
**四个 Bot 的会话引擎**(工作区 / 会话 / 预填 / 官方会话嵌入),`createWorkbench` 额外提供
|
|
125
|
+
`BotShell`(对话页)与 `SectionShell`(单页工作台);底座「MCP 与数据」单页也走 `SectionShell`。详见 `src/README.md`。
|
|
126
|
+
|
|
127
|
+
## 安装
|
|
128
|
+
|
|
129
|
+
```powershell
|
|
130
|
+
# 通过 plugin_manager 安装(需要审批)
|
|
131
|
+
plugin_manager action:install_bundle target:"D:\DSH 插件\dsh-erpbot"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
安装后读取返回的 `application` / `warnings`;用 `cordis_inspect_query`(provider `Config`, method `listConfigs`)确认出现 `dsh-erpbot` 行,再刷新 GUI 页面即可。
|
|
135
|
+
|
|
136
|
+
开发期也可以像 `dsh-workbench` 那样用 `link:D:\DSH 插件\dsh-erpbot` 依赖装进 profile,此后改代码只需重启 DSH。
|
|
137
|
+
|
|
138
|
+
## 开发说明
|
|
139
|
+
|
|
140
|
+
- Client 半用 `window.__ModuleLoader__.load({ id: 'dsh-erpbot', factory(require) {...} })`,React 从 `require('react')` 取,**不要**再装 React 或引 CDN。
|
|
141
|
+
- **改代码:编辑 `src/**` → `node scripts/build.mjs` → 重启 DSH。** 直接改 `client.js` 会被下次构建覆盖。
|
|
142
|
+
- 提交前自检:
|
|
143
|
+
```powershell
|
|
144
|
+
npm install # 首次:装 devDependency acorn(仅校验,不进产物)
|
|
145
|
+
node scripts/build.mjs # 拼接 + AST 顺序校验
|
|
146
|
+
node scripts/build.mjs --check # 产物与 src 同步
|
|
147
|
+
node scripts/test-manifest.mjs # 校验器负面测试
|
|
148
|
+
node scripts/lint-factories.mjs # 工厂未注入自由引用(防运行时空白回归)
|
|
149
|
+
node --check client.js # 产物语法
|
|
150
|
+
```
|
|
151
|
+
- 片段是被**字面拼接**的连续行段、共享同一作用域:不要给片段加 `import`/`export`。
|
|
152
|
+
板块之间只通过工厂 `deps` 参数显式通信,不靠自由变量隐式传递。
|
|
153
|
+
|
|
154
|
+
- 客户端 bundle 在启动时加载,**不会热替换**;改完 `client.js` 需要重启 DSH 才生效。
|
|
155
|
+
- 语言:i18n 板块闭包内 `let lang = 'zh'`,`setLang()` 通知 `subscribeLang` 订阅者重绘;`LanguageSwitch` 渲染「中 / EN」两段式胶囊(文案取自 `LANG_BADGE = { zh: '中', en: 'EN' }`),胶囊宽度跟随 rail 列宽、两段均分。字典以 `ctx.locale.register(NS, { zh, en })` 发布。
|
|
156
|
+
- 样式全部以 `.erp-app` 前缀作用域化,不触碰宿主 UI。三层容器查询:`.erp-app`(`inline-size`,面板宽度)、`.erp-board`(`size`,面板高度)、`.exp-card` / `.donut` / `.visa-wrap`(卡片自身盒子)。**不要**用 `@media` 做面板尺寸判断 —— 面板尺寸 ≠ 窗口尺寸。
|
|
157
|
+
- **改 CSS 注释时绝不能出现反引号**:`const CSS = \`` 是模板字符串,注释里的反引号会提前终止它,运行时报 `ReferenceError`(本插件踩过两次)。
|
|
158
|
+
- **新增一页只需三处**:`NAV` 加一条(`id` / `icon` / `key`)、`ZH` + `EN` 各加一条 `nav.<id>`、`PAGES` 加同 id 的配置。配置里有 `sections` 且带 `botId` 的页走 `BotShell`(KPI 行 + 对话卡 + 头像配置);有 `sections` 但无 `botId` 的页走 `SectionShell`(四个 KPI + 段列表工作台);没有 `sections` 就退回总览式 `core` / `sub` 卡片布局。页面 id 必须全小写字母(`readHashPage` 用 `#/erp/([a-z]+)` 解析)。
|
|
159
|
+
- 左侧 rail 是「B 字标当第一个图标」的分组图标列:白卡片里从上到下是 B 字标、6 个导航图标;卡片左右各留 8px(`--erp-rail-gutter`,作用在 `.t1-rail` 的左右 padding 上)。列宽 = 图标按钮 + 组内边距 + 两侧留白,三个 token `--erp-rail-btn` / `--erp-rail-pad` / `--erp-rail-gutter` 都挂在 `.erp-board` 上;B 字标的宽高直接取 `--erp-rail-btn`,所以品牌块和图标永远同宽同列。矮面板下只有导航组自身滚动(含 B 字标),底部语言锁不住不下移。
|
|
160
|
+
- 不起 DSH 也能看页面:浏览器打开 `_erp-dev/.preview/index.html?page=shui`(该目录用本地 `react.js` + 真 `client.js` 渲染,`?page=<id>` 预置 `#/erp/<id>`,`?lang=en` 自动切英文)。
|
|
161
|
+
- 左侧 rail 底部组只有 **设置 + 语言** 两颗按钮(源设计的登出/危险按钮已移除,`--danger` 相关的 `.rail-btn.danger` 样式与 `ICONS.logout` 一并删除)。
|
|
162
|
+
|
|
163
|
+
## 槽位契约
|
|
164
|
+
|
|
165
|
+
| 槽位 | 注册 | 说明 |
|
|
166
|
+
| --- | --- | --- |
|
|
167
|
+
| `sidebar.panellist` | `id: 'dsh-erpbot'`, `order: -10`, `label: () => t('nav.erp')` | 左侧导航图标行;`order` 为负即排在 `plugins`(0) 之前 |
|
|
168
|
+
| `main` | `key: 'dsh-erpbot'` | 主面板;`key` 必须等于 sidebar 的 `id` 才会被调度 |
|
|
169
|
+
|
|
170
|
+
`label` 用 thunk 形式,每次投影重读,因此切换语言后导航栏文字会跟着变。
|
|
171
|
+
|
|
172
|
+
## 每页内嵌对话(Bot 页)
|
|
173
|
+
|
|
174
|
+
- 入口:财 / 资 / 推 / 税 四页的**对话头部**;右上角 spark 图标、总览 AI 卡、浮动 Dock / Rail / Modal 已退役。
|
|
175
|
+
- 会话:每个 Bot 一个专属工作区(`D:\erpBot\cai|zi|tui|shui`,Host 半路由 `POST /erp/workspace` 按 `{bot}` 白名单建目录并注册);会话自动创建并持久化在 `localStorage dsh-erpbot.bot.session.v1.<bot>`。
|
|
176
|
+
- 对话正文仍是官方 `conversation.content` 嵌入(`variant: 'embedded'`,固定 Chat),不自绘聊天界面;技能入口只有三条:欢迎 chips 预填 composer、配置抽屉「问这个」、对话回复 / 技能行「看结果」开画布。
|
|
177
|
+
- 配置抽屉:右侧覆盖式(452px,画布 560px,≤900px 全宽),三页签身份 / 技能 / 记忆;记忆存 `localStorage dsh-erpbot.bot.memory.v1.<bot>`,只存身份关系与技能清单,不含业务数据。
|
|
178
|
+
- 改 `client.js` 后需重启 DSH 生效;Host 半路由改动同样需要重启。
|