dsh-pre-duediligence 0.1.5 → 0.1.6
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 +10 -9
- package/docs/DSH-UX-001-ADOPTION.md +7 -7
- package/install.sh +2 -2
- package/lib/client.js +6 -26
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/types/left-sidebar.d.ts +2 -2
- 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.6] - 2026-09-07
|
|
4
|
+
|
|
5
|
+
- 修复左侧“访前尽调”入口自动展开右侧工作台:入口现在只创建并进入专属 Session,初始页保持完整对话空间。
|
|
6
|
+
- 右侧工作台仅由输入框下方五项业务快捷按钮显式打开;关闭后也从同一组按钮重新进入。
|
|
7
|
+
- 采纳 DSH-UX-001 v1.1.1 的初始开合规则,并补充入口不调用 `openTab` 的回归测试。
|
|
8
|
+
|
|
3
9
|
## [0.1.5] - 2026-09-07
|
|
4
10
|
|
|
5
11
|
- 对齐 DSH-UX-001 v1.1.0 与企查查蓝 Mockup:浅深色 Token、组件状态、键盘焦点和窄屏布局统一更新。
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# dsh-pre-duediligence
|
|
2
2
|
|
|
3
|
-
当前版本:**0.1.
|
|
3
|
+
当前版本:**0.1.6**。界面已对齐 DSH-UX-001 v1.1.1 与企查查蓝 Mockup:菜单、首页和工作台使用同一建筑 LOGO,首页名称为“访前尽调一页纸智能体”;点击左侧“访前尽调”只进入初始会话,右侧工作台默认关闭,点击输入框下方业务按钮后才打开。详见 [更新日志](CHANGELOG.md)和[规范采纳记录](docs/DSH-UX-001-ADOPTION.md)。
|
|
4
4
|
|
|
5
5
|
面向 DeepSeek Harness 的 Session 级访前尽调智能体。业务人员从左侧菜单进入,在会话级工作台定义一次拜访;Agent 调用企查查五类 MCP,使用机会与风险双引擎完成经营状态识别、假设与反证、风险核验,最终交付可追溯的访前尽调报告。
|
|
6
6
|
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
- 使用 dsh-better-sidebar 0.17.1,不再使用遮挡对话的自定义浮层
|
|
14
14
|
- 只在 DSH 左侧菜单增加“访前尽调”入口;对应工作台标签在 Better Sidebar 的右侧“+”菜单中隐藏
|
|
15
15
|
- 菜单、首页与工作台统一使用企查查蓝 Mockup 的线性建筑 LOGO;初始页面为“访前尽调一页纸智能体”
|
|
16
|
+
- 点击左侧入口只创建并进入访前 Session,初始页不打开右侧工作台;点击输入框下方五项业务按钮后才打开对应视图
|
|
16
17
|
- 首页只保留简洁说明、DSH 原生输入框和输入框下方五项快捷菜单:企业核验、经营画像、风险核查、访前材料、任务历史
|
|
17
18
|
- “当前任务 / 任务历史”主导航与五阶段业务导航分离:
|
|
18
19
|
1. 对象与目标
|
|
@@ -21,7 +22,7 @@
|
|
|
21
22
|
4. 证据核验
|
|
22
23
|
5. 材料输出
|
|
23
24
|
- 快捷菜单与阶段导航只切换视图,不伪造执行状态;只有捕获到完整报告后才显示“报告已生成”
|
|
24
|
-
-
|
|
25
|
+
- 关闭工作台只隐藏界面,不取消任务;从输入框下方同一组快捷按钮恢复
|
|
25
26
|
- 进度与工具记录只读取当前 Session 的真实事件,不维护跨 Session 的浏览器任务列表
|
|
26
27
|
- 完整报告保留在 DSH 原生会话中
|
|
27
28
|
|
|
@@ -63,7 +64,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/duhu2000/dsh-pre-duediligenc
|
|
|
63
64
|
|
|
64
65
|
1. `dsh-better-sidebar@0.17.1`:提供 Session 级右侧工作台容器。
|
|
65
66
|
2. `dsh-mcp-connector@0.2.32`:提供通用 MCP 连接器与市场,通过“企查查·企业工商”完成 OAuth,并动态挂载企业、风险、知产、经营、历史和董监高 MCP。
|
|
66
|
-
3. `dsh-pre-duediligence@0.1.
|
|
67
|
+
3. `dsh-pre-duediligence@0.1.6`:提供左侧智能体入口、访前工作台、提示词生成器和完整 Skill。
|
|
67
68
|
|
|
68
69
|
安装完成后停止旧的 DSH Web 进程并重新运行:
|
|
69
70
|
|
|
@@ -78,7 +79,7 @@ dsh web
|
|
|
78
79
|
~~~bash
|
|
79
80
|
dsh plugin --profile web add dsh-better-sidebar@0.17.1 --allow-build=node-pty
|
|
80
81
|
dsh plugin --profile web add dsh-mcp-connector@0.2.32
|
|
81
|
-
dsh plugin --profile web add dsh-pre-duediligence@0.1.
|
|
82
|
+
dsh plugin --profile web add dsh-pre-duediligence@0.1.6 --allow-build=dsh-pre-duediligence
|
|
82
83
|
dsh web
|
|
83
84
|
~~~
|
|
84
85
|
|
|
@@ -92,7 +93,7 @@ Better Sidebar 必须使用 `0.17.1`;工作台依赖它的 `targetedOpen` 与
|
|
|
92
93
|
dsh plugin --profile web list --depth 0
|
|
93
94
|
~~~
|
|
94
95
|
|
|
95
|
-
应能看到 `dsh-better-sidebar@0.17.1`、`dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.
|
|
96
|
+
应能看到 `dsh-better-sidebar@0.17.1`、`dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.6`。重启 DSH 并连接“企查查·企业工商”后,在左侧菜单点击“访前尽调”只进入初始会话;右侧工作台保持关闭,点击输入框下方业务按钮后才打开对应视图。Better Sidebar 的右侧“+”菜单不会列出该入口,普通会话的首页、输入框、消息流和 Session 头部保持原样。
|
|
96
97
|
|
|
97
98
|
### 从旧访前尽调包迁移
|
|
98
99
|
|
|
@@ -108,7 +109,7 @@ dsh plugin --profile web remove qcc-previsit-dsh
|
|
|
108
109
|
|
|
109
110
|
如果 Web profile 已安装 `qcc-dsh-mcp-oauth`,不要让它与 MCP 连接器同时管理同名企查查 Server:
|
|
110
111
|
|
|
111
|
-
1. 先安装 `dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.
|
|
112
|
+
1. 先安装 `dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.6`,完全重启 DSH。
|
|
112
113
|
2. 打开“🧩 MCP连接器”,按界面提示迁移旧企查查授权;也可以重新连接“企查查·企业工商”。
|
|
113
114
|
3. 迁移完成后停止 DSH,执行 `dsh plugin --profile web remove qcc-dsh-mcp-oauth`。
|
|
114
115
|
4. 再次启动 DSH,在“已安装”中确认企查查连接健康,然后执行一次真实企业查询。
|
|
@@ -130,16 +131,16 @@ pnpm test:ui
|
|
|
130
131
|
## 人工验收
|
|
131
132
|
|
|
132
133
|
1. 在 DSH 选择一个工作空间和 Session。
|
|
133
|
-
2.
|
|
134
|
+
2. 点击左侧“访前尽调”,确认只进入专属初始会话,右侧工作台保持关闭;同时右侧 Better Sidebar 的“+”菜单不出现该入口,普通会话保持 DSH 原样。
|
|
134
135
|
3. 点击“访前尽调”,确认首页标题为“访前尽调一页纸智能体”,LOGO 与菜单一致,说明行独立居中。
|
|
135
|
-
4.
|
|
136
|
+
4. 确认五项快捷菜单位于原生输入框下方,点击后才打开右侧工作台并切换到对应视图。
|
|
136
137
|
5. 打开输入框左上角“提示词生成”,检查四步、滚动、固定头尾、Tab 焦点环和 Escape 恢复焦点。
|
|
137
138
|
6. 选择“银行/信贷客户经理、首次拜访、风险与涉诉、股权与实控人、15分钟标准、一页纸简报”并填写企业。
|
|
138
139
|
7. 输入框已有自由文本时,分别验证取消、追加、替换;确认回填后不会自动发送。
|
|
139
140
|
8. 点击 DSH 原生发送按钮,确认消息作为用户可见文本发送到当前 Session。
|
|
140
141
|
9. 确认工作台只展示当前 Session 真实发生的企业、经营、知识产权和风险工具调用。
|
|
141
142
|
10. 检查风险侧先出现企业风险扫描,零计数维度没有继续下钻。
|
|
142
|
-
11.
|
|
143
|
+
11. 中途关闭工作台,确认任务继续;点击输入框下方任一业务快捷按钮可恢复并进入对应视图。
|
|
143
144
|
12. Agent 停止但未生成完整报告时应显示“等待确认 / 继续”;完整报告出现后才显示“报告已生成”。
|
|
144
145
|
13. 检查报告有八段(含独立产业定位),假设包含支持/反对/未知,必问包含答 A/B 分支,覆盖声明区分零记录和调用失败。
|
|
145
146
|
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
# DSH-UX-001 v1.1.
|
|
1
|
+
# DSH-UX-001 v1.1.1 采纳与验收记录
|
|
2
2
|
|
|
3
|
-
日期:2026-09-07。业务插件:`dsh-pre-duediligence@0.1.
|
|
3
|
+
日期:2026-09-07。业务插件:`dsh-pre-duediligence@0.1.6`。规范源:[共享交互规范 v1.1.1](../../../../AI-设计/DSH智能体开发交互规范方案.md),视觉参考:[企查查蓝交互 Mockup(原文件名 v1.1.0,内容 v1.1.1)](../../../../AI-设计/DSH智能体_企查查蓝_UI_Mockup_v1.1.0.html)。
|
|
4
4
|
|
|
5
5
|
## 页面与品牌映射
|
|
6
6
|
|
|
7
7
|
| 规范区域 | 本插件实现 | 隔离边界 |
|
|
8
8
|
| --- | --- | --- |
|
|
9
|
-
| 左侧入口 | 菜单名固定为“访前尽调”,使用 Mockup 的线性建筑 SVG |
|
|
9
|
+
| 左侧入口 | 菜单名固定为“访前尽调”,使用 Mockup 的线性建筑 SVG;只创建并进入专属 Session | 位于工作区列表前;不调用 `openTab`,初始页右栏关闭;隐藏 Better Sidebar 标签菜单项 |
|
|
10
10
|
| 中央首页 | 标题“访前尽调一页纸智能体”,同排建筑 LOGO,独立说明行 | 只在插件创建的空白 Session 可逆改写;卸载时恢复宿主标题、图标和预览标识 |
|
|
11
11
|
| 原生输入区 | Composer 下方五项快捷菜单;左上角“提示词生成” | 不替换输入框、模型、权限和原生发送按钮 |
|
|
12
12
|
| 提示词向导 | 对象 → 角色场景 → 范围深度 → 确认输出 | Portal 到 body;回填不发送;已有草稿显式选择替换、追加或取消 |
|
|
13
|
-
| 右侧工作台 | 当前任务 /
|
|
13
|
+
| 右侧工作台 | 当前任务 / 任务历史;五步业务导航;由输入框下方快捷按钮打开和恢复 | Better Sidebar 是唯一权威工作台;关闭不取消会话任务;不另设会话头打开入口 |
|
|
14
14
|
| 下载材料 | 自包含 HTML 一页纸报告 | 只使用已捕获的当前 Session 报告,不跨 Session 合并 |
|
|
15
15
|
|
|
16
16
|
## 菜单与阶段映射
|
|
@@ -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.1 候选表实现。小号白字主按钮使用动作色,深色模式动作按钮使用深色文字。所有变量限定在 `.qcc*` 自有节点,不覆盖全局 `:root`。
|
|
43
43
|
|
|
44
44
|
## DSH 兼容范围与例外
|
|
45
45
|
|
|
@@ -60,9 +60,9 @@
|
|
|
60
60
|
## 实机验收清单
|
|
61
61
|
|
|
62
62
|
1. 普通会话不出现访前标题、菜单、提示词触发器或工作台恢复入口。
|
|
63
|
-
2.
|
|
63
|
+
2. 从“访前尽调”进入后,只显示专属初始会话,右侧工作台关闭;菜单与首页显示同一建筑 LOGO,首页名称和说明行居中。
|
|
64
64
|
3. 浅色、深色及 390px 窄屏下,无横向页面溢出;移动输入字号不低于 16px。
|
|
65
65
|
4. 向导正文可滚动、头尾固定;Tab 不越出弹窗,Escape 关闭并恢复焦点。
|
|
66
66
|
5. 输入框已有文字时验证替换、追加、取消三条路径;回填后不自动发送。
|
|
67
|
-
6.
|
|
67
|
+
6. 点击输入框下方五项业务按钮后才打开对应工作台视图;关闭不取消任务,再点同组按钮可重新打开。
|
|
68
68
|
7. 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.6}"
|
|
9
9
|
readonly LEGACY_PREVISIT_NAME="qcc-previsit-dsh"
|
|
10
10
|
readonly LEGACY_QCC_OAUTH_NAME="qcc-dsh-mcp-oauth"
|
|
11
11
|
|
|
@@ -59,4 +59,4 @@ else
|
|
|
59
59
|
"重启后打开左侧“🧩 MCP连接器”,选择“企查查·企业工商”并完成 OAuth 授权。" \
|
|
60
60
|
"该连接会提供企业、风险、知产、经营、历史和董监高 MCP。"
|
|
61
61
|
fi
|
|
62
|
-
printf '%s\n' "在 DSH
|
|
62
|
+
printf '%s\n' "在 DSH 左侧菜单点击“访前尽调”进入初始会话;右侧工作台默认关闭,点击输入框下方业务按钮后才打开。"
|
package/lib/client.js
CHANGED
|
@@ -1096,7 +1096,7 @@ function LeftSidebarEntry(props) {
|
|
|
1096
1096
|
mount
|
|
1097
1097
|
);
|
|
1098
1098
|
}
|
|
1099
|
-
function registerLeftSidebarLauncher(ctx, service
|
|
1099
|
+
function registerLeftSidebarLauncher(ctx, service) {
|
|
1100
1100
|
ctx.slots.inject("sidebar.footer.action", () => ctx.slots.register({
|
|
1101
1101
|
name: "sidebar.footer.action",
|
|
1102
1102
|
id: "dsh-pre-duediligence-launcher",
|
|
@@ -1108,9 +1108,6 @@ function registerLeftSidebarLauncher(ctx, service, reveal) {
|
|
|
1108
1108
|
throw new Error("\u8BBF\u524D\u5C3D\u8C03\u5DE5\u4F5C\u53F0\u5F53\u524D\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u63D2\u4EF6\u914D\u7F6E");
|
|
1109
1109
|
}
|
|
1110
1110
|
const sessionId = await createPrevisitSession(ctx);
|
|
1111
|
-
if (!openWorkbench(service, { sessionId }, reveal)) {
|
|
1112
|
-
throw new Error("\u8BBF\u524D\u5C3D\u8C03\u5DE5\u4F5C\u53F0\u5F53\u524D\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u63D2\u4EF6\u914D\u7F6E");
|
|
1113
|
-
}
|
|
1114
1111
|
ctx.sessions.open?.(sessionId);
|
|
1115
1112
|
}
|
|
1116
1113
|
})
|
|
@@ -1318,7 +1315,7 @@ function derivePhaseStates(input) {
|
|
|
1318
1315
|
|
|
1319
1316
|
// src/workbench-style.ts
|
|
1320
1317
|
var WORKBENCH_CSS = String.raw`
|
|
1321
|
-
.qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent
|
|
1318
|
+
.qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent{
|
|
1322
1319
|
--qcc-brand:#128BED;
|
|
1323
1320
|
--qcc-action:#0875D1;
|
|
1324
1321
|
--qcc-action-hover:#0666B7;
|
|
@@ -1338,7 +1335,7 @@ var WORKBENCH_CSS = String.raw`
|
|
|
1338
1335
|
--qcc-danger-bg:#FFF1F0;
|
|
1339
1336
|
color:var(--qcc-text);
|
|
1340
1337
|
}
|
|
1341
|
-
:is(html[data-theme="dark"],html.dark) :is(.qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent
|
|
1338
|
+
:is(html[data-theme="dark"],html.dark) :is(.qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent){
|
|
1342
1339
|
--qcc-brand:#55ADFF;
|
|
1343
1340
|
--qcc-action:#82C3FF;
|
|
1344
1341
|
--qcc-action-hover:#ACD7FF;
|
|
@@ -1358,7 +1355,7 @@ var WORKBENCH_CSS = String.raw`
|
|
|
1358
1355
|
--qcc-danger-bg:#442826;
|
|
1359
1356
|
}
|
|
1360
1357
|
@media(prefers-color-scheme:dark){
|
|
1361
|
-
.qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent
|
|
1358
|
+
.qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent{
|
|
1362
1359
|
--qcc-brand:#55ADFF;
|
|
1363
1360
|
--qcc-action:#82C3FF;
|
|
1364
1361
|
--qcc-action-hover:#ACD7FF;
|
|
@@ -1388,11 +1385,9 @@ html[data-theme="dark"] .qccPrevisitHeroLogo,html.dark .qccPrevisitHeroLogo{colo
|
|
|
1388
1385
|
.qccPrevisitCapability{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-width:0;min-height:38px;padding:8px 12px;border:1px solid var(--qcc-border);border-radius:10px;background:var(--qcc-surface);color:var(--qcc-secondary);font:inherit;font-size:13px;cursor:pointer;transition:border-color .16s ease,color .16s ease,background .16s ease}
|
|
1389
1386
|
.qccPrevisitCapability svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;flex:none}
|
|
1390
1387
|
.qccPrevisitCapability:hover{border-color:var(--qcc-brand);background:var(--qcc-selected);color:var(--qcc-action)}
|
|
1391
|
-
.qccPrevisitCapability:focus-visible,.qccPromptTrigger:focus-visible,.qccPromptPanel button:focus-visible,.qccPromptPanel input:focus-visible,.qccPwShell button:focus-visible
|
|
1388
|
+
.qccPrevisitCapability:focus-visible,.qccPromptTrigger:focus-visible,.qccPromptPanel button:focus-visible,.qccPromptPanel input:focus-visible,.qccPwShell button:focus-visible{outline:2px solid var(--qcc-brand);outline-offset:2px}
|
|
1392
1389
|
.qccPrevisitLauncherContent{display:inline-flex;align-items:center;gap:9px;color:inherit}
|
|
1393
1390
|
.qccPrevisitLauncherContent svg{color:var(--qcc-brand);flex:none}
|
|
1394
|
-
.qccPrevisitHeaderAction{display:inline-flex;align-items:center;gap:6px;min-height:32px;padding:0 10px;border:1px solid var(--qcc-border);border-radius:8px;background:var(--qcc-surface);color:var(--qcc-text);font:inherit;font-size:12px;cursor:pointer}
|
|
1395
|
-
.qccPrevisitHeaderAction svg{color:var(--qcc-brand)}
|
|
1396
1391
|
|
|
1397
1392
|
.qccPromptLayer{position:absolute;z-index:4;top:10px;left:12px}
|
|
1398
1393
|
.qccPromptTrigger{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 9px;border:1px solid var(--qcc-border);border-radius:8px;background:var(--qcc-surface);color:var(--qcc-action);font:inherit;font-size:12px;font-weight:600;cursor:pointer}
|
|
@@ -2195,13 +2190,6 @@ function installStyles() {
|
|
|
2195
2190
|
document.head.append(style);
|
|
2196
2191
|
return () => style.remove();
|
|
2197
2192
|
}
|
|
2198
|
-
function PrevisitHeaderEntry(props) {
|
|
2199
|
-
if (!isPrevisitSession(props.sessionId)) return null;
|
|
2200
|
-
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("button", { type: "button", className: "qccPrevisitHeaderAction", "aria-label": "\u6253\u5F00\u8BBF\u524D\u5C3D\u8C03\u5DE5\u4F5C\u53F0", title: "\u6253\u5F00\u8BBF\u524D\u5C3D\u8C03\u5DE5\u4F5C\u53F0", onClick: props.openWorkbench, children: [
|
|
2201
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PrevisitLogo, { size: 16 }),
|
|
2202
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: "\u8BBF\u524D\u5C3D\u8C03" })
|
|
2203
|
-
] });
|
|
2204
|
-
}
|
|
2205
2193
|
function apply(ctx) {
|
|
2206
2194
|
const service = ctx.betterSidebar;
|
|
2207
2195
|
const shared = createPrevisitStore();
|
|
@@ -2222,7 +2210,7 @@ function apply(ctx) {
|
|
|
2222
2210
|
() => registerWorkbenchTab(service, (props) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PrevisitWorkbenchTab, { ...props, ctx, shared, reveal, startPrompt })),
|
|
2223
2211
|
"dsh-pre-duediligence: hidden workbench tab"
|
|
2224
2212
|
);
|
|
2225
|
-
registerLeftSidebarLauncher(ctx, service
|
|
2213
|
+
registerLeftSidebarLauncher(ctx, service);
|
|
2226
2214
|
ctx.slots.inject("conversation.input.dock", () => ctx.slots.register({
|
|
2227
2215
|
name: "conversation.input.dock",
|
|
2228
2216
|
id: "dsh-pre-duediligence:home",
|
|
@@ -2239,14 +2227,6 @@ function apply(ctx) {
|
|
|
2239
2227
|
order: 110,
|
|
2240
2228
|
inject: () => ({ store: shared })
|
|
2241
2229
|
}, PrevisitPromptGenerator));
|
|
2242
|
-
ctx.slots.inject("conversation.session.header.actions", () => ctx.slots.register({
|
|
2243
|
-
name: "conversation.session.header.actions",
|
|
2244
|
-
id: "dsh-pre-duediligence:workbench-entry",
|
|
2245
|
-
order: 110,
|
|
2246
|
-
inject: (sessionId) => ({ openWorkbench: () => {
|
|
2247
|
-
openForSession(sessionId);
|
|
2248
|
-
} })
|
|
2249
|
-
}, PrevisitHeaderEntry));
|
|
2250
2230
|
}
|
|
2251
2231
|
|
|
2252
2232
|
return module.exports;
|
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.6\",\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,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { BetterSidebarService } from "./better-sidebar.js";
|
|
2
2
|
type SnapshotStore<T> = {
|
|
3
3
|
getSnapshot(): T;
|
|
4
4
|
};
|
|
@@ -37,5 +37,5 @@ export type LeftSidebarHost = {
|
|
|
37
37
|
};
|
|
38
38
|
get?(name: string): unknown;
|
|
39
39
|
};
|
|
40
|
-
export declare function registerLeftSidebarLauncher(ctx: LeftSidebarHost, service: BetterSidebarService
|
|
40
|
+
export declare function registerLeftSidebarLauncher(ctx: LeftSidebarHost, service: BetterSidebarService): void;
|
|
41
41
|
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/** DSH-UX-001 v1.1.
|
|
1
|
+
/** DSH-UX-001 v1.1.1:所有变量和组件选择器均限定在本插件拥有的节点内。 */
|
|
2
2
|
export declare const WORKBENCH_CSS: string;
|
package/package.json
CHANGED