dsh-pre-duediligence 0.1.6 → 0.1.7
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/CHANGELOG.md +6 -0
- package/README.md +16 -14
- package/docs/DSH-UX-001-ADOPTION.md +9 -8
- package/install.sh +1 -1
- package/lib/client.js +15 -17
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/types/workbench-style.d.ts +1 -1
- package/package.json +1 -1
- package/skills/qcc-previsit-onepager/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
+
## [0.1.7] - 2026-09-07
|
|
4
|
+
|
|
5
|
+
- 右侧五阶段菜单统一为招投标工作台风格:等宽分栏、图标在上、短标题在下,移除容易越界的第二行描述。
|
|
6
|
+
- 选中阶段使用浅蓝底、蓝色文字和底部蓝色指示线;相邻阶段用细分隔线,桌面与窄屏均保持在右栏边界内。
|
|
7
|
+
- 采纳 DSH-UX-001 v1.1.2,并新增阶段方向、描述节点数量和横向溢出 UI 断言。
|
|
8
|
+
|
|
3
9
|
## [0.1.6] - 2026-09-07
|
|
4
10
|
|
|
5
11
|
- 修复左侧“访前尽调”入口自动展开右侧工作台:入口现在只创建并进入专属 Session,初始页保持完整对话空间。
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# dsh-pre-duediligence
|
|
2
2
|
|
|
3
|
-
当前版本:**0.1.
|
|
3
|
+
当前版本:**0.1.7**。界面已对齐 DSH-UX-001 v1.1.2 与企查查蓝 Mockup:菜单、首页和工作台使用同一建筑 LOGO,首页名称为“访前尽调一页纸智能体”;点击左侧“访前尽调”只进入初始会话,右侧工作台默认关闭,点击输入框下方业务按钮后才打开。右侧阶段菜单采用招投标式等宽图标标签,不显示第二行描述。详见 [更新日志](CHANGELOG.md)和[规范采纳记录](docs/DSH-UX-001-ADOPTION.md)。
|
|
4
4
|
|
|
5
5
|
面向 DeepSeek Harness 的 Session 级访前尽调智能体。业务人员从左侧菜单进入,在会话级工作台定义一次拜访;Agent 调用企查查五类 MCP,使用机会与风险双引擎完成经营状态识别、假设与反证、风险核验,最终交付可追溯的访前尽调报告。
|
|
6
6
|
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
3. 资料采集
|
|
22
22
|
4. 证据核验
|
|
23
23
|
5. 材料输出
|
|
24
|
+
- 右侧五阶段菜单采用招投标工作台样式:等宽分栏、图标在上、短标题在下;选中项使用浅蓝底、蓝字和底部蓝线,菜单不显示第二行描述并在窄屏内收缩
|
|
24
25
|
- 快捷菜单与阶段导航只切换视图,不伪造执行状态;只有捕获到完整报告后才显示“报告已生成”
|
|
25
26
|
- 关闭工作台只隐藏界面,不取消任务;从输入框下方同一组快捷按钮恢复
|
|
26
27
|
- 进度与工具记录只读取当前 Session 的真实事件,不维护跨 Session 的浏览器任务列表
|
|
@@ -64,7 +65,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/duhu2000/dsh-pre-duediligenc
|
|
|
64
65
|
|
|
65
66
|
1. `dsh-better-sidebar@0.17.1`:提供 Session 级右侧工作台容器。
|
|
66
67
|
2. `dsh-mcp-connector@0.2.32`:提供通用 MCP 连接器与市场,通过“企查查·企业工商”完成 OAuth,并动态挂载企业、风险、知产、经营、历史和董监高 MCP。
|
|
67
|
-
3. `dsh-pre-duediligence@0.1.
|
|
68
|
+
3. `dsh-pre-duediligence@0.1.7`:提供左侧智能体入口、访前工作台、提示词生成器和完整 Skill。
|
|
68
69
|
|
|
69
70
|
安装完成后停止旧的 DSH Web 进程并重新运行:
|
|
70
71
|
|
|
@@ -79,7 +80,7 @@ dsh web
|
|
|
79
80
|
~~~bash
|
|
80
81
|
dsh plugin --profile web add dsh-better-sidebar@0.17.1 --allow-build=node-pty
|
|
81
82
|
dsh plugin --profile web add dsh-mcp-connector@0.2.32
|
|
82
|
-
dsh plugin --profile web add dsh-pre-duediligence@0.1.
|
|
83
|
+
dsh plugin --profile web add dsh-pre-duediligence@0.1.7 --allow-build=dsh-pre-duediligence
|
|
83
84
|
dsh web
|
|
84
85
|
~~~
|
|
85
86
|
|
|
@@ -93,7 +94,7 @@ Better Sidebar 必须使用 `0.17.1`;工作台依赖它的 `targetedOpen` 与
|
|
|
93
94
|
dsh plugin --profile web list --depth 0
|
|
94
95
|
~~~
|
|
95
96
|
|
|
96
|
-
应能看到 `dsh-better-sidebar@0.17.1`、`dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.
|
|
97
|
+
应能看到 `dsh-better-sidebar@0.17.1`、`dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.7`。重启 DSH 并连接“企查查·企业工商”后,在左侧菜单点击“访前尽调”只进入初始会话;右侧工作台保持关闭,点击输入框下方业务按钮后才打开对应视图。Better Sidebar 的右侧“+”菜单不会列出该入口,普通会话的首页、输入框、消息流和 Session 头部保持原样。
|
|
97
98
|
|
|
98
99
|
### 从旧访前尽调包迁移
|
|
99
100
|
|
|
@@ -109,7 +110,7 @@ dsh plugin --profile web remove qcc-previsit-dsh
|
|
|
109
110
|
|
|
110
111
|
如果 Web profile 已安装 `qcc-dsh-mcp-oauth`,不要让它与 MCP 连接器同时管理同名企查查 Server:
|
|
111
112
|
|
|
112
|
-
1. 先安装 `dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.
|
|
113
|
+
1. 先安装 `dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.7`,完全重启 DSH。
|
|
113
114
|
2. 打开“🧩 MCP连接器”,按界面提示迁移旧企查查授权;也可以重新连接“企查查·企业工商”。
|
|
114
115
|
3. 迁移完成后停止 DSH,执行 `dsh plugin --profile web remove qcc-dsh-mcp-oauth`。
|
|
115
116
|
4. 再次启动 DSH,在“已安装”中确认企查查连接健康,然后执行一次真实企业查询。
|
|
@@ -134,15 +135,16 @@ pnpm test:ui
|
|
|
134
135
|
2. 点击左侧“访前尽调”,确认只进入专属初始会话,右侧工作台保持关闭;同时右侧 Better Sidebar 的“+”菜单不出现该入口,普通会话保持 DSH 原样。
|
|
135
136
|
3. 点击“访前尽调”,确认首页标题为“访前尽调一页纸智能体”,LOGO 与菜单一致,说明行独立居中。
|
|
136
137
|
4. 确认五项快捷菜单位于原生输入框下方,点击后才打开右侧工作台并切换到对应视图。
|
|
137
|
-
5.
|
|
138
|
-
6.
|
|
139
|
-
7.
|
|
140
|
-
8.
|
|
141
|
-
9.
|
|
142
|
-
10.
|
|
143
|
-
11.
|
|
144
|
-
12.
|
|
145
|
-
13.
|
|
138
|
+
5. 检查右侧五阶段菜单为等宽分栏、上图标下短标题且无第二行描述;选中项为浅蓝底、蓝字和底部蓝线,窄屏不横向越界。
|
|
139
|
+
6. 打开输入框左上角“提示词生成”,检查四步、滚动、固定头尾、Tab 焦点环和 Escape 恢复焦点。
|
|
140
|
+
7. 选择“银行/信贷客户经理、首次拜访、风险与涉诉、股权与实控人、15分钟标准、一页纸简报”并填写企业。
|
|
141
|
+
8. 输入框已有自由文本时,分别验证取消、追加、替换;确认回填后不会自动发送。
|
|
142
|
+
9. 点击 DSH 原生发送按钮,确认消息作为用户可见文本发送到当前 Session。
|
|
143
|
+
10. 确认工作台只展示当前 Session 真实发生的企业、经营、知识产权和风险工具调用。
|
|
144
|
+
11. 检查风险侧先出现企业风险扫描,零计数维度没有继续下钻。
|
|
145
|
+
12. 中途关闭工作台,确认任务继续;点击输入框下方任一业务快捷按钮可恢复并进入对应视图。
|
|
146
|
+
13. Agent 停止但未生成完整报告时应显示“等待确认 / 继续”;完整报告出现后才显示“报告已生成”。
|
|
147
|
+
14. 检查报告有八段(含独立产业定位),假设包含支持/反对/未知,必问包含答 A/B 分支,覆盖声明区分零记录和调用失败。
|
|
146
148
|
|
|
147
149
|
## 自动化契约
|
|
148
150
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# DSH-UX-001 v1.1.
|
|
1
|
+
# DSH-UX-001 v1.1.2 采纳与验收记录
|
|
2
2
|
|
|
3
|
-
日期:2026-09-07。业务插件:`dsh-pre-duediligence@0.1.
|
|
3
|
+
日期:2026-09-07。业务插件:`dsh-pre-duediligence@0.1.7`。规范源:[共享交互规范 v1.1.2](../../../../AI-设计/DSH智能体开发交互规范方案.md),视觉参考:[企查查蓝交互 Mockup(原文件名 v1.1.0,内容 v1.1.2)](../../../../AI-设计/DSH智能体_企查查蓝_UI_Mockup_v1.1.0.html)。
|
|
4
4
|
|
|
5
5
|
## 页面与品牌映射
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
| 中央首页 | 标题“访前尽调一页纸智能体”,同排建筑 LOGO,独立说明行 | 只在插件创建的空白 Session 可逆改写;卸载时恢复宿主标题、图标和预览标识 |
|
|
11
11
|
| 原生输入区 | Composer 下方五项快捷菜单;左上角“提示词生成” | 不替换输入框、模型、权限和原生发送按钮 |
|
|
12
12
|
| 提示词向导 | 对象 → 角色场景 → 范围深度 → 确认输出 | Portal 到 body;回填不发送;已有草稿显式选择替换、追加或取消 |
|
|
13
|
-
| 右侧工作台 | 当前任务 /
|
|
13
|
+
| 右侧工作台 | 当前任务 / 任务历史;招投标式五步等宽导航(上图标、下短标题、无描述);由输入框下方快捷按钮打开和恢复 | Better Sidebar 是唯一权威工作台;关闭不取消会话任务;不另设会话头打开入口;窄屏菜单不横向越界 |
|
|
14
14
|
| 下载材料 | 自包含 HTML 一页纸报告 | 只使用已捕获的当前 Session 报告,不跨 Session 合并 |
|
|
15
15
|
|
|
16
16
|
## 菜单与阶段映射
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
| 访前材料 | 材料输出 |
|
|
24
24
|
| 任务历史 | 任务历史 |
|
|
25
25
|
|
|
26
|
-
五步导航为:对象与目标 → 范围确认 → 资料采集 → 证据核验 →
|
|
26
|
+
五步导航为:对象与目标 → 范围确认 → 资料采集 → 证据核验 → 材料输出。导航采用招投标右侧菜单的单行等宽分栏、上图标下短标题、细分隔线样式;选中项使用浅蓝底、蓝字和底部蓝线,菜单内不显示第二行描述。导航选择仅表示用户正在查看的页面,不表示阶段已经完成。
|
|
27
27
|
|
|
28
28
|
## 状态映射
|
|
29
29
|
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
|
|
40
40
|
## Token 与组件
|
|
41
41
|
|
|
42
|
-
浅色品牌 / 动作色为 `#128BED / #0875D1`,深色为 `#55ADFF / #82C3FF`;表头、背景、文字、边框、成功和复核色均按 v1.1.
|
|
42
|
+
浅色品牌 / 动作色为 `#128BED / #0875D1`,深色为 `#55ADFF / #82C3FF`;表头、背景、文字、边框、成功和复核色均按 v1.1.2 候选表实现。小号白字主按钮使用动作色,深色模式动作按钮使用深色文字。所有变量限定在 `.qcc*` 自有节点,不覆盖全局 `:root`。
|
|
43
43
|
|
|
44
44
|
## DSH 兼容范围与例外
|
|
45
45
|
|
|
@@ -51,8 +51,8 @@
|
|
|
51
51
|
## 自动化证据
|
|
52
52
|
|
|
53
53
|
- `pnpm run typecheck`:TypeScript 严格模式通过。
|
|
54
|
-
- `pnpm run test`:11 个测试文件、
|
|
55
|
-
- `pnpm run test:ui`:真实 React、隔离宿主 DOM 与本机 Headless Chrome 的浅色/深色 × 桌面/移动共 4 组通过;检查菜单位于 Composer 外下方、三处同源 LOGO
|
|
54
|
+
- `pnpm run test`:11 个测试文件、58 项测试通过,覆盖会话归属、LOGO/首页文本、菜单、提示词草稿合并、五步状态、阶段菜单样式与描述移除、完成判定、报告导出、安装与 Skill 契约。
|
|
55
|
+
- `pnpm run test:ui`:真实 React、隔离宿主 DOM 与本机 Headless Chrome 的浅色/深色 × 桌面/移动共 4 组通过;检查菜单位于 Composer 外下方、三处同源 LOGO、五步等宽纵向图标导航、零描述节点、菜单宽度边界、弹窗滚动和边界、Escape/焦点恢复、主题 Token 及页面横向溢出。
|
|
56
56
|
- `pnpm run build` 与 `npm pack --dry-run`:发布前执行,结果以发布提交的 CI / Release 记录为准。
|
|
57
57
|
|
|
58
58
|
视觉回归截图和机器结果生成于 `_scratch/ui-layout/`,该目录不提交仓库,也不进入 npm 包。
|
|
@@ -65,4 +65,5 @@
|
|
|
65
65
|
4. 向导正文可滚动、头尾固定;Tab 不越出弹窗,Escape 关闭并恢复焦点。
|
|
66
66
|
5. 输入框已有文字时验证替换、追加、取消三条路径;回填后不自动发送。
|
|
67
67
|
6. 点击输入框下方五项业务按钮后才打开对应工作台视图;关闭不取消任务,再点同组按钮可重新打开。
|
|
68
|
-
7.
|
|
68
|
+
7. 右侧五阶段菜单为等宽分栏、上图标下短标题且无第二行描述;选中项有浅蓝底、蓝字和底部蓝线,390px 窄屏不横向越界。
|
|
69
|
+
8. Agent 停止但无完整报告时仍显示“等待确认 / 继续”;完整报告出现后才显示“报告已生成”并允许下载。
|
package/install.sh
CHANGED
|
@@ -5,7 +5,7 @@ set -euo pipefail
|
|
|
5
5
|
readonly PROFILE_NAME="${DSH_PROFILE:-web}"
|
|
6
6
|
readonly BETTER_SIDEBAR_SPEC="dsh-better-sidebar@0.17.1"
|
|
7
7
|
readonly MCP_CONNECTOR_SPEC="dsh-mcp-connector@0.2.32"
|
|
8
|
-
readonly PREVISIT_SPEC="${DSH_PRE_DUEDILIGENCE_SPEC:-dsh-pre-duediligence@0.1.
|
|
8
|
+
readonly PREVISIT_SPEC="${DSH_PRE_DUEDILIGENCE_SPEC:-dsh-pre-duediligence@0.1.7}"
|
|
9
9
|
readonly LEGACY_PREVISIT_NAME="qcc-previsit-dsh"
|
|
10
10
|
readonly LEGACY_QCC_OAUTH_NAME="qcc-dsh-mcp-oauth"
|
|
11
11
|
|
package/lib/client.js
CHANGED
|
@@ -1434,11 +1434,11 @@ html[data-theme="dark"] .qccPrevisitHeroLogo,html.dark .qccPrevisitHeroLogo{colo
|
|
|
1434
1434
|
.qccPwStatus{display:inline-flex;align-items:center;min-height:25px;padding:0 8px;border-radius:999px;background:var(--qcc-table-head);color:var(--qcc-secondary);font-size:11px;white-space:nowrap}.qccPwStatus[data-status="running"]{background:var(--qcc-selected);color:var(--qcc-action)}.qccPwStatus[data-status="ready"]{background:var(--qcc-success-bg);color:var(--qcc-success)}.qccPwStatus[data-status="failed"]{background:var(--qcc-danger-bg);color:var(--qcc-danger)}
|
|
1435
1435
|
.qccPwClose{display:grid;place-items:center;width:30px;height:30px;border:0;border-radius:8px;background:transparent;color:var(--qcc-secondary);font-size:22px;cursor:pointer}.qccPwClose:hover{background:var(--qcc-selected);color:var(--qcc-action)}
|
|
1436
1436
|
.qccPwTabs{display:flex;gap:22px;padding:0 18px;border-bottom:1px solid var(--qcc-border);background:var(--qcc-surface);flex:none}.qccPwTabs button{position:relative;min-height:39px;padding:0;border:0;background:transparent;color:var(--qcc-secondary);font:inherit;font-size:13px;cursor:pointer}.qccPwTabs button[data-selected="true"]{color:var(--qcc-action);font-weight:650}.qccPwTabs button[data-selected="true"]::after{position:absolute;right:0;bottom:-1px;left:0;height:2px;background:var(--qcc-action);content:""}
|
|
1437
|
-
.qccPwStages{display:grid;grid-template-columns:repeat(5,minmax(
|
|
1438
|
-
.qccPwStage{display:flex;align-items:center;
|
|
1439
|
-
.qccPwStageIcon{display:grid;place-items:center;width:
|
|
1437
|
+
.qccPwStages{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));min-height:78px;padding:0;border-bottom:1px solid var(--qcc-border);background:var(--qcc-surface);overflow:hidden;flex:none}
|
|
1438
|
+
.qccPwStage{position:relative;display:flex;min-width:0;min-height:78px;align-items:center;justify-content:center;flex-direction:column;gap:7px;padding:9px 5px;border:0;border-right:1px solid var(--qcc-border);background:transparent;color:var(--qcc-secondary);font:inherit;text-align:center;cursor:pointer}.qccPwStage:last-child{border-right:0}.qccPwStage:hover{background:var(--qcc-page);color:var(--qcc-text)}.qccPwStage[data-selected="true"]{background:var(--qcc-selected);color:var(--qcc-action)}.qccPwStage[data-selected="true"]::after{position:absolute;right:10px;bottom:-1px;left:10px;height:3px;border-radius:3px 3px 0 0;background:var(--qcc-action);content:""}
|
|
1439
|
+
.qccPwStageIcon{display:grid;place-items:center;width:30px;height:30px;border:1px solid var(--qcc-border);border-radius:7px;background:var(--qcc-surface);flex:0 0 30px}.qccPwStage[data-selected="true"] .qccPwStageIcon{background:var(--qcc-selected)}.qccPwStage[data-progress="done"] .qccPwStageIcon{background:var(--qcc-success-bg);color:var(--qcc-success)}.qccPwStage[data-progress="failed"] .qccPwStageIcon{background:var(--qcc-danger-bg);color:var(--qcc-danger)}
|
|
1440
1440
|
.qccPwIcon{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.65;stroke-linecap:round;stroke-linejoin:round}
|
|
1441
|
-
.qccPwStageCopy{display:
|
|
1441
|
+
.qccPwStageCopy{display:block;min-width:0;max-width:100%}.qccPwStageCopy strong{display:block;overflow:hidden;font-size:12px;line-height:1.35;text-overflow:ellipsis;white-space:nowrap}
|
|
1442
1442
|
.qccPwBody{min-height:0;padding:16px;overflow:auto;flex:1}.qccPwPanel{display:grid;gap:13px;max-width:960px;margin:0 auto}
|
|
1443
1443
|
.qccPwPageHeading{display:flex;align-items:flex-start;justify-content:space-between;gap:14px}.qccPwPageHeading h2{margin:1px 0 0;font-size:19px}.qccPwPageHeading p:not(.qccPwEyebrow){margin:4px 0 0;color:var(--qcc-secondary);font-size:12px;line-height:1.5}.qccPwEyebrow{margin:0;color:var(--qcc-action);font-size:10px;font-weight:750;letter-spacing:.12em}.qccPwTaskId{padding:5px 8px;border:1px solid var(--qcc-border);border-radius:7px;background:var(--qcc-surface);color:var(--qcc-secondary);font:11px ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
1444
1444
|
.qccPwCard{padding:15px;border:1px solid var(--qcc-border);border-radius:12px;background:var(--qcc-surface)}.qccPwCardHeader{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:12px}.qccPwCardHeader h3{margin:0;font-size:14px}.qccPwCardHeader p{margin:4px 0 0;color:var(--qcc-secondary);font-size:11px;line-height:1.5}.qccPwMode{padding:3px 7px;border-radius:999px;background:var(--qcc-selected);color:var(--qcc-action);font-size:10px;white-space:nowrap}
|
|
@@ -1461,7 +1461,7 @@ html[data-theme="dark"] .qccPrevisitHeroLogo,html.dark .qccPrevisitHeroLogo{colo
|
|
|
1461
1461
|
@media(max-width:760px){
|
|
1462
1462
|
.qccPrevisitCapabilities{display:grid;grid-template-columns:repeat(3,1fr)}.qccPrevisitCapability{padding-inline:7px}
|
|
1463
1463
|
.qccPromptBackdrop{padding:0;overflow:hidden}.qccPromptPanel{width:100%;max-width:100vw;max-height:100dvh;height:100dvh;border:0;border-radius:0}.qccPromptHead,.qccPromptBody,.qccPromptActions{min-width:0;width:100%;padding-inline:16px;box-sizing:border-box}.qccPromptHead>div{min-width:0}.qccPromptChoices{grid-template-columns:repeat(2,minmax(0,1fr))}.qccPromptSteps button{justify-content:center}.qccPromptSteps button span{display:none}
|
|
1464
|
-
.qccPwHeader{align-items:flex-start}.qccPwSession{display:none}.
|
|
1464
|
+
.qccPwHeader{align-items:flex-start}.qccPwSession{display:none}.qccPwStage{min-height:66px;gap:5px;padding:7px 3px}.qccPwStageIcon{width:25px;height:25px;flex-basis:25px}.qccPwStageCopy strong{font-size:10px}.qccPwStage[data-selected="true"]::after{right:6px;left:6px}.qccPwBody{padding:12px}.qccPwSteps{grid-template-columns:repeat(2,1fr)}.qccPwFooter{align-items:flex-end}.qccPwFooterHint{display:none}.qccPwDeliverables{grid-template-columns:1fr}.qccDockRow{grid-template-columns:1fr}.qccDockLabel{padding:0}.qccDockFoot{align-items:stretch;flex-direction:column}.qccDockActions{justify-content:flex-end}
|
|
1465
1465
|
}
|
|
1466
1466
|
@media(max-width:430px){.qccPrevisitCapabilities{grid-template-columns:repeat(2,1fr)}.qccPromptChoices{grid-template-columns:1fr}.qccPwRiskTiles,.qccPwCoverage,.qccPwStateStrip{grid-template-columns:repeat(2,1fr)}.qccPwSubtitle{max-width:190px}}
|
|
1467
1467
|
@media(prefers-reduced-motion:reduce){.qccPwShell *,.qccPromptPanel *,.qccPrevisitCapabilities *{animation:none!important;transition:none!important}}
|
|
@@ -1639,11 +1639,11 @@ var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
|
1639
1639
|
var inject = ["slots", "sessions", "workspaces", "conversation", "betterSidebar"];
|
|
1640
1640
|
var STYLE_ID = "dsh-pre-duediligence-workbench";
|
|
1641
1641
|
var PHASE_LABELS = {
|
|
1642
|
-
target:
|
|
1643
|
-
scope:
|
|
1644
|
-
collect:
|
|
1645
|
-
verify:
|
|
1646
|
-
output:
|
|
1642
|
+
target: "\u5BF9\u8C61\u4E0E\u76EE\u6807",
|
|
1643
|
+
scope: "\u8303\u56F4\u786E\u8BA4",
|
|
1644
|
+
collect: "\u8D44\u6599\u91C7\u96C6",
|
|
1645
|
+
verify: "\u8BC1\u636E\u6838\u9A8C",
|
|
1646
|
+
output: "\u6750\u6599\u8F93\u51FA"
|
|
1647
1647
|
};
|
|
1648
1648
|
var STATUS_LABELS = {
|
|
1649
1649
|
empty: "\u5F85\u8BBE\u5B9A",
|
|
@@ -2146,14 +2146,12 @@ function PrevisitWorkbenchTab(props) {
|
|
|
2146
2146
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", "data-selected": shared.view !== "history", onClick: () => setView("target"), children: "\u5F53\u524D\u4EFB\u52A1" }),
|
|
2147
2147
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", "data-selected": shared.view === "history", onClick: () => setView("history"), children: "\u4EFB\u52A1\u5386\u53F2" })
|
|
2148
2148
|
] }),
|
|
2149
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("nav", { className: "qccPwStages", "aria-label": "\u8BBF\u524D\u4EFB\u52A1\u9636\u6BB5", children: PREVISIT_PHASES.map((current) => {
|
|
2149
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("nav", { className: "qccPwStages", "aria-label": "\u8BBF\u524D\u4EFB\u52A1\u9636\u6BB5", role: "tablist", children: PREVISIT_PHASES.map((current) => {
|
|
2150
2150
|
const phaseState = phaseStates.find((item) => item.id === current);
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.
|
|
2154
|
-
|
|
2155
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("small", { children: PHASE_LABELS[current].description })
|
|
2156
|
-
] })
|
|
2151
|
+
const selected = shared.view === current;
|
|
2152
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("button", { type: "button", role: "tab", "aria-selected": selected, className: "qccPwStage", "data-selected": selected, "data-progress": phaseState?.progress ?? "idle", onClick: () => setPhase(current), children: [
|
|
2153
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "qccPwStageIcon", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Icon, { name: current }) }),
|
|
2154
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "qccPwStageCopy", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("strong", { children: PHASE_LABELS[current] }) })
|
|
2157
2155
|
] }, current);
|
|
2158
2156
|
}) }),
|
|
2159
2157
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "qccPwBody", children: [
|
package/lib/index.js
CHANGED
package/lib/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/skill-file.ts"],
|
|
4
|
-
"sourcesContent": ["import { readFileSync } from \"node:fs\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { parseSkillFile } from \"./skill-file.js\"\n\nexport const inject = [\"skills\"] as const\n\nexport const SKILL_NAME = \"qcc-previsit-onepager\"\nexport const SKILL_DESCRIPTION =\n \"\u8C03\u7528\u4F01\u67E5\u67E5\u4E94\u7C7B MCP \u6267\u884C\u4F01\u4E1A\u8BBF\u524D\u5C3D\u8C03\uFF0C\u4EE5\u673A\u4F1A\u4E0E\u98CE\u9669\u53CC\u5F15\u64CE\u8BC6\u522B\u7ECF\u8425\u72B6\u6001\u3001\u5EFA\u7ACB\u5E76\u53CD\u8BC1\u4E1A\u52A1\u5047\u8BBE\uFF0C\u4EA4\u4ED8\u53EF\u8FFD\u6EAF\u7684\u8BBF\u524D\u5C3D\u8C03\u62A5\u544A\u3002\"\n\ntype SkillRegistration = {\n name: string\n description: string\n whenToUse: string\n content: string\n source: \"bundled\"\n resourceBase: {\n kind: \"directory\"\n path: string\n }\n metadata: Readonly<Record<string, unknown>>\n}\n\nexport type HostContext = {\n skills: {\n register(skill: SkillRegistration): () => void\n }\n}\n\nexport function loadBundledSkill(): SkillRegistration {\n const skillDirectoryUrl = new URL(\"../skills/qcc-previsit-onepager/\", import.meta.url)\n const skillSource = readFileSync(new URL(\"SKILL.md\", skillDirectoryUrl), \"utf8\")\n const { content } = parseSkillFile(skillSource)\n\n return {\n name: SKILL_NAME,\n description: SKILL_DESCRIPTION,\n whenToUse: \"\u7528\u6237\u8981\u6C42\u51C6\u5907\u5BA2\u6237\u62DC\u8BBF\u3001\u8BBF\u524D\u5C3D\u8C03\u3001\u4E00\u9875\u7EB8\u7B80\u62A5\u3001\u6388\u4FE1\u9762\u8C08\u3001\u5546\u52A1\u8C08\u5224\u3001\u7B7E\u7EA6\u6838\u67E5\u3001\u590D\u8BBF\u66F4\u65B0\u3001\u89E6\u8FBE\u8DEF\u5F84\u6216\u5F53\u9762\u63D0\u95EE\u6E05\u5355\u65F6\u4F7F\u7528\u3002\",\n content,\n source: \"bundled\",\n resourceBase: {\n kind: \"directory\",\n path: fileURLToPath(skillDirectoryUrl),\n },\n metadata: {\n author: \"QCC\",\n version: \"0.1.
|
|
4
|
+
"sourcesContent": ["import { readFileSync } from \"node:fs\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { parseSkillFile } from \"./skill-file.js\"\n\nexport const inject = [\"skills\"] as const\n\nexport const SKILL_NAME = \"qcc-previsit-onepager\"\nexport const SKILL_DESCRIPTION =\n \"\u8C03\u7528\u4F01\u67E5\u67E5\u4E94\u7C7B MCP \u6267\u884C\u4F01\u4E1A\u8BBF\u524D\u5C3D\u8C03\uFF0C\u4EE5\u673A\u4F1A\u4E0E\u98CE\u9669\u53CC\u5F15\u64CE\u8BC6\u522B\u7ECF\u8425\u72B6\u6001\u3001\u5EFA\u7ACB\u5E76\u53CD\u8BC1\u4E1A\u52A1\u5047\u8BBE\uFF0C\u4EA4\u4ED8\u53EF\u8FFD\u6EAF\u7684\u8BBF\u524D\u5C3D\u8C03\u62A5\u544A\u3002\"\n\ntype SkillRegistration = {\n name: string\n description: string\n whenToUse: string\n content: string\n source: \"bundled\"\n resourceBase: {\n kind: \"directory\"\n path: string\n }\n metadata: Readonly<Record<string, unknown>>\n}\n\nexport type HostContext = {\n skills: {\n register(skill: SkillRegistration): () => void\n }\n}\n\nexport function loadBundledSkill(): SkillRegistration {\n const skillDirectoryUrl = new URL(\"../skills/qcc-previsit-onepager/\", import.meta.url)\n const skillSource = readFileSync(new URL(\"SKILL.md\", skillDirectoryUrl), \"utf8\")\n const { content } = parseSkillFile(skillSource)\n\n return {\n name: SKILL_NAME,\n description: SKILL_DESCRIPTION,\n whenToUse: \"\u7528\u6237\u8981\u6C42\u51C6\u5907\u5BA2\u6237\u62DC\u8BBF\u3001\u8BBF\u524D\u5C3D\u8C03\u3001\u4E00\u9875\u7EB8\u7B80\u62A5\u3001\u6388\u4FE1\u9762\u8C08\u3001\u5546\u52A1\u8C08\u5224\u3001\u7B7E\u7EA6\u6838\u67E5\u3001\u590D\u8BBF\u66F4\u65B0\u3001\u89E6\u8FBE\u8DEF\u5F84\u6216\u5F53\u9762\u63D0\u95EE\u6E05\u5355\u65F6\u4F7F\u7528\u3002\",\n content,\n source: \"bundled\",\n resourceBase: {\n kind: \"directory\",\n path: fileURLToPath(skillDirectoryUrl),\n },\n metadata: {\n author: \"QCC\",\n version: \"0.1.7\",\n industry: \"enterprise-services\",\n mcpServers: [\"qcc-company\", \"qcc-risk\", \"qcc-ipr\", \"qcc-operation\", \"qcc-executive\"],\n },\n }\n}\n\nexport function apply(ctx: HostContext): void {\n ctx.skills.register(loadBundledSkill())\n}\n", "export type ParsedSkillFile = {\n content: string\n frontmatter: string | null\n}\n\nexport function parseSkillFile(source: string): ParsedSkillFile {\n const normalized = source.replaceAll(\"\\r\\n\", \"\\n\")\n\n if (!normalized.startsWith(\"---\\n\")) {\n return { content: normalized.trim(), frontmatter: null }\n }\n\n const closingMarker = normalized.indexOf(\"\\n---\\n\", 4)\n\n if (closingMarker === -1) {\n throw new Error(\"SKILL.md \u7684 YAML frontmatter \u7F3A\u5C11\u7ED3\u675F\u6807\u8BB0\")\n }\n\n return {\n frontmatter: normalized.slice(4, closingMarker).trim(),\n content: normalized.slice(closingMarker + 5).trim(),\n }\n}\n"],
|
|
5
5
|
"mappings": ";AAAA,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;;;ACIvB,SAAS,eAAe,QAAiC;AAC9D,QAAM,aAAa,OAAO,WAAW,QAAQ,IAAI;AAEjD,MAAI,CAAC,WAAW,WAAW,OAAO,GAAG;AACnC,WAAO,EAAE,SAAS,WAAW,KAAK,GAAG,aAAa,KAAK;AAAA,EACzD;AAEA,QAAM,gBAAgB,WAAW,QAAQ,WAAW,CAAC;AAErD,MAAI,kBAAkB,IAAI;AACxB,UAAM,IAAI,MAAM,uEAAoC;AAAA,EACtD;AAEA,SAAO;AAAA,IACL,aAAa,WAAW,MAAM,GAAG,aAAa,EAAE,KAAK;AAAA,IACrD,SAAS,WAAW,MAAM,gBAAgB,CAAC,EAAE,KAAK;AAAA,EACpD;AACF;;;ADjBO,IAAM,SAAS,CAAC,QAAQ;AAExB,IAAM,aAAa;AACnB,IAAM,oBACX;AAqBK,SAAS,mBAAsC;AACpD,QAAM,oBAAoB,IAAI,IAAI,oCAAoC,YAAY,GAAG;AACrF,QAAM,cAAc,aAAa,IAAI,IAAI,YAAY,iBAAiB,GAAG,MAAM;AAC/E,QAAM,EAAE,QAAQ,IAAI,eAAe,WAAW;AAE9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,IACR,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,MAAM,cAAc,iBAAiB;AAAA,IACvC;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY,CAAC,eAAe,YAAY,WAAW,iBAAiB,eAAe;AAAA,IACrF;AAAA,EACF;AACF;AAEO,SAAS,MAAM,KAAwB;AAC5C,MAAI,OAAO,SAAS,iBAAiB,CAAC;AACxC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/** DSH-UX-001 v1.1.
|
|
1
|
+
/** DSH-UX-001 v1.1.2:所有变量和组件选择器均限定在本插件拥有的节点内。 */
|
|
2
2
|
export declare const WORKBENCH_CSS: string;
|
package/package.json
CHANGED