dsh-pre-duediligence 0.1.7 → 0.1.8

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # 更新日志
2
2
 
3
+ ## [0.1.8] - 2026-09-07
4
+
5
+ - 首页输入框下方五项快捷菜单统一为数据清洗补全风格:独立描边卡片、图标在上、短标签在下。
6
+ - 卡片保持单行排列;窄屏仅在菜单容器内部横向滚动,不再切换为多行宫格,也不会撑宽页面。
7
+ - 采纳 DSH-UX-001 v1.1.3,并新增快捷菜单方向、高度、边框、单行及视口边界 UI 断言。
8
+
3
9
  ## [0.1.7] - 2026-09-07
4
10
 
5
11
  - 右侧五阶段菜单统一为招投标工作台风格:等宽分栏、图标在上、短标题在下,移除容易越界的第二行描述。
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # dsh-pre-duediligence
2
2
 
3
- 当前版本:**0.1.7**。界面已对齐 DSH-UX-001 v1.1.2 与企查查蓝 Mockup:菜单、首页和工作台使用同一建筑 LOGO,首页名称为“访前尽调一页纸智能体”;点击左侧“访前尽调”只进入初始会话,右侧工作台默认关闭,点击输入框下方业务按钮后才打开。右侧阶段菜单采用招投标式等宽图标标签,不显示第二行描述。详见 [更新日志](CHANGELOG.md)和[规范采纳记录](docs/DSH-UX-001-ADOPTION.md)。
3
+ 当前版本:**0.1.8**。界面已对齐 DSH-UX-001 v1.1.3 与企查查蓝 Mockup:菜单、首页和工作台使用同一建筑 LOGO,首页名称为“访前尽调一页纸智能体”;点击左侧“访前尽调”只进入初始会话,右侧工作台默认关闭,点击输入框下方业务按钮后才打开。首页快捷菜单采用数据清洗补全式纵向描边卡片,右侧阶段菜单采用招投标式等宽图标标签。详见 [更新日志](CHANGELOG.md)和[规范采纳记录](docs/DSH-UX-001-ADOPTION.md)。
4
4
 
5
5
  面向 DeepSeek Harness 的 Session 级访前尽调智能体。业务人员从左侧菜单进入,在会话级工作台定义一次拜访;Agent 调用企查查五类 MCP,使用机会与风险双引擎完成经营状态识别、假设与反证、风险核验,最终交付可追溯的访前尽调报告。
6
6
 
@@ -14,7 +14,7 @@
14
14
  - 只在 DSH 左侧菜单增加“访前尽调”入口;对应工作台标签在 Better Sidebar 的右侧“+”菜单中隐藏
15
15
  - 菜单、首页与工作台统一使用企查查蓝 Mockup 的线性建筑 LOGO;初始页面为“访前尽调一页纸智能体”
16
16
  - 点击左侧入口只创建并进入访前 Session,初始页不打开右侧工作台;点击输入框下方五项业务按钮后才打开对应视图
17
- - 首页只保留简洁说明、DSH 原生输入框和输入框下方五项快捷菜单:企业核验、经营画像、风险核查、访前材料、任务历史
17
+ - 首页只保留简洁说明、DSH 原生输入框和输入框下方五项快捷菜单:企业核验、经营画像、风险核查、访前材料、任务历史;菜单采用数据清洗补全式单行描边卡片,上图标下短标签,窄屏在容器内横向滚动
18
18
  - “当前任务 / 任务历史”主导航与五阶段业务导航分离:
19
19
  1. 对象与目标
20
20
  2. 范围确认
@@ -65,7 +65,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/duhu2000/dsh-pre-duediligenc
65
65
 
66
66
  1. `dsh-better-sidebar@0.17.1`:提供 Session 级右侧工作台容器。
67
67
  2. `dsh-mcp-connector@0.2.32`:提供通用 MCP 连接器与市场,通过“企查查·企业工商”完成 OAuth,并动态挂载企业、风险、知产、经营、历史和董监高 MCP。
68
- 3. `dsh-pre-duediligence@0.1.7`:提供左侧智能体入口、访前工作台、提示词生成器和完整 Skill。
68
+ 3. `dsh-pre-duediligence@0.1.8`:提供左侧智能体入口、访前工作台、提示词生成器和完整 Skill。
69
69
 
70
70
  安装完成后停止旧的 DSH Web 进程并重新运行:
71
71
 
@@ -80,7 +80,7 @@ dsh web
80
80
  ~~~bash
81
81
  dsh plugin --profile web add dsh-better-sidebar@0.17.1 --allow-build=node-pty
82
82
  dsh plugin --profile web add dsh-mcp-connector@0.2.32
83
- dsh plugin --profile web add dsh-pre-duediligence@0.1.7 --allow-build=dsh-pre-duediligence
83
+ dsh plugin --profile web add dsh-pre-duediligence@0.1.8 --allow-build=dsh-pre-duediligence
84
84
  dsh web
85
85
  ~~~
86
86
 
@@ -94,7 +94,7 @@ Better Sidebar 必须使用 `0.17.1`;工作台依赖它的 `targetedOpen` 与
94
94
  dsh plugin --profile web list --depth 0
95
95
  ~~~
96
96
 
97
- 应能看到 `dsh-better-sidebar@0.17.1`、`dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.7`。重启 DSH 并连接“企查查·企业工商”后,在左侧菜单点击“访前尽调”只进入初始会话;右侧工作台保持关闭,点击输入框下方业务按钮后才打开对应视图。Better Sidebar 的右侧“+”菜单不会列出该入口,普通会话的首页、输入框、消息流和 Session 头部保持原样。
97
+ 应能看到 `dsh-better-sidebar@0.17.1`、`dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.8`。重启 DSH 并连接“企查查·企业工商”后,在左侧菜单点击“访前尽调”只进入初始会话;右侧工作台保持关闭,点击输入框下方业务按钮后才打开对应视图。Better Sidebar 的右侧“+”菜单不会列出该入口,普通会话的首页、输入框、消息流和 Session 头部保持原样。
98
98
 
99
99
  ### 从旧访前尽调包迁移
100
100
 
@@ -110,7 +110,7 @@ dsh plugin --profile web remove qcc-previsit-dsh
110
110
 
111
111
  如果 Web profile 已安装 `qcc-dsh-mcp-oauth`,不要让它与 MCP 连接器同时管理同名企查查 Server:
112
112
 
113
- 1. 先安装 `dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.7`,完全重启 DSH。
113
+ 1. 先安装 `dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.8`,完全重启 DSH。
114
114
  2. 打开“🧩 MCP连接器”,按界面提示迁移旧企查查授权;也可以重新连接“企查查·企业工商”。
115
115
  3. 迁移完成后停止 DSH,执行 `dsh plugin --profile web remove qcc-dsh-mcp-oauth`。
116
116
  4. 再次启动 DSH,在“已安装”中确认企查查连接健康,然后执行一次真实企业查询。
@@ -134,7 +134,7 @@ pnpm test:ui
134
134
  1. 在 DSH 选择一个工作空间和 Session。
135
135
  2. 点击左侧“访前尽调”,确认只进入专属初始会话,右侧工作台保持关闭;同时右侧 Better Sidebar 的“+”菜单不出现该入口,普通会话保持 DSH 原样。
136
136
  3. 点击“访前尽调”,确认首页标题为“访前尽调一页纸智能体”,LOGO 与菜单一致,说明行独立居中。
137
- 4. 确认五项快捷菜单位于原生输入框下方,点击后才打开右侧工作台并切换到对应视图。
137
+ 4. 确认五项快捷菜单位于原生输入框下方,呈单行独立描边卡片、上图标下短标签;390px 窄屏只在菜单内部横向滚动且页面不越界,点击后才打开右侧工作台并切换到对应视图。
138
138
  5. 检查右侧五阶段菜单为等宽分栏、上图标下短标题且无第二行描述;选中项为浅蓝底、蓝字和底部蓝线,窄屏不横向越界。
139
139
  6. 打开输入框左上角“提示词生成”,检查四步、滚动、固定头尾、Tab 焦点环和 Escape 恢复焦点。
140
140
  7. 选择“银行/信贷客户经理、首次拜访、风险与涉诉、股权与实控人、15分钟标准、一页纸简报”并填写企业。
@@ -1,6 +1,6 @@
1
- # DSH-UX-001 v1.1.2 采纳与验收记录
1
+ # DSH-UX-001 v1.1.3 采纳与验收记录
2
2
 
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)。
3
+ 日期:2026-09-07。业务插件:`dsh-pre-duediligence@0.1.8`。规范源:[共享交互规范 v1.1.3](../../../../AI-设计/DSH智能体开发交互规范方案.md),视觉参考:[企查查蓝交互 Mockup(原文件名 v1.1.0,内容 v1.1.3)](../../../../AI-设计/DSH智能体_企查查蓝_UI_Mockup_v1.1.0.html)。
4
4
 
5
5
  ## 页面与品牌映射
6
6
 
@@ -8,7 +8,7 @@
8
8
  | --- | --- | --- |
9
9
  | 左侧入口 | 菜单名固定为“访前尽调”,使用 Mockup 的线性建筑 SVG;只创建并进入专属 Session | 位于工作区列表前;不调用 `openTab`,初始页右栏关闭;隐藏 Better Sidebar 标签菜单项 |
10
10
  | 中央首页 | 标题“访前尽调一页纸智能体”,同排建筑 LOGO,独立说明行 | 只在插件创建的空白 Session 可逆改写;卸载时恢复宿主标题、图标和预览标识 |
11
- | 原生输入区 | Composer 下方五项快捷菜单;左上角“提示词生成” | 不替换输入框、模型、权限和原生发送按钮 |
11
+ | 原生输入区 | Composer 下方五项数据清洗补全式描边卡片快捷菜单(上图标、下短标签);左上角“提示词生成” | 不替换输入框、模型、权限和原生发送按钮;窄屏只在菜单内部横向滚动,不撑宽页面 |
12
12
  | 提示词向导 | 对象 → 角色场景 → 范围深度 → 确认输出 | Portal 到 body;回填不发送;已有草稿显式选择替换、追加或取消 |
13
13
  | 右侧工作台 | 当前任务 / 任务历史;招投标式五步等宽导航(上图标、下短标题、无描述);由输入框下方快捷按钮打开和恢复 | Better Sidebar 是唯一权威工作台;关闭不取消会话任务;不另设会话头打开入口;窄屏菜单不横向越界 |
14
14
  | 下载材料 | 自包含 HTML 一页纸报告 | 只使用已捕获的当前 Session 报告,不跨 Session 合并 |
@@ -39,7 +39,7 @@
39
39
 
40
40
  ## Token 与组件
41
41
 
42
- 浅色品牌 / 动作色为 `#128BED / #0875D1`,深色为 `#55ADFF / #82C3FF`;表头、背景、文字、边框、成功和复核色均按 v1.1.2 候选表实现。小号白字主按钮使用动作色,深色模式动作按钮使用深色文字。所有变量限定在 `.qcc*` 自有节点,不覆盖全局 `:root`。
42
+ 浅色品牌 / 动作色为 `#128BED / #0875D1`,深色为 `#55ADFF / #82C3FF`;表头、背景、文字、边框、成功和复核色均按 v1.1.3 候选表实现。小号白字主按钮使用动作色,深色模式动作按钮使用深色文字。所有变量限定在 `.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 个测试文件、58 项测试通过,覆盖会话归属、LOGO/首页文本、菜单、提示词草稿合并、五步状态、阶段菜单样式与描述移除、完成判定、报告导出、安装与 Skill 契约。
55
- - `pnpm run test:ui`:真实 React、隔离宿主 DOM 与本机 Headless Chrome 的浅色/深色 × 桌面/移动共 4 组通过;检查菜单位于 Composer 外下方、三处同源 LOGO、五步等宽纵向图标导航、零描述节点、菜单宽度边界、弹窗滚动和边界、Escape/焦点恢复、主题 Token 及页面横向溢出。
54
+ - `pnpm run test`:11 个测试文件、59 项测试通过,覆盖会话归属、LOGO/首页文本、菜单、提示词草稿合并、首页纵向描边卡片、五步状态、阶段菜单样式与描述移除、完成判定、报告导出、安装与 Skill 契约。
55
+ - `pnpm run test:ui`:真实 React、隔离宿主 DOM 与本机 Headless Chrome 的浅色/深色 × 桌面/移动共 4 组通过;检查快捷菜单的五项单行、纵向布局、54px 高度、中性描边、内部横向滚动与视口边界,并覆盖三处同源 LOGO、五步导航、弹窗、焦点、主题 Token 及页面横向溢出。
56
56
  - `pnpm run build` 与 `npm pack --dry-run`:发布前执行,结果以发布提交的 CI / Release 记录为准。
57
57
 
58
58
  视觉回归截图和机器结果生成于 `_scratch/ui-layout/`,该目录不提交仓库,也不进入 npm 包。
@@ -64,6 +64,7 @@
64
64
  3. 浅色、深色及 390px 窄屏下,无横向页面溢出;移动输入字号不低于 16px。
65
65
  4. 向导正文可滚动、头尾固定;Tab 不越出弹窗,Escape 关闭并恢复焦点。
66
66
  5. 输入框已有文字时验证替换、追加、取消三条路径;回填后不自动发送。
67
- 6. 点击输入框下方五项业务按钮后才打开对应工作台视图;关闭不取消任务,再点同组按钮可重新打开。
68
- 7. 右侧五阶段菜单为等宽分栏、上图标下短标题且无第二行描述;选中项有浅蓝底、蓝字和底部蓝线,390px 窄屏不横向越界。
69
- 8. Agent 停止但无完整报告时仍显示“等待确认 / 继续”;完整报告出现后才显示“报告已生成”并允许下载。
67
+ 6. 输入框下方五项业务按钮为数据清洗补全式单行描边卡片、上图标下短标签;390px 窄屏仅菜单内部横向滚动,页面不越界。
68
+ 7. 点击上述卡片后才打开对应工作台视图;关闭不取消任务,再点同组按钮可重新打开。
69
+ 8. 右侧五阶段菜单为等宽分栏、上图标下短标题且无第二行描述;选中项有浅蓝底、蓝字和底部蓝线,390px 窄屏不横向越界。
70
+ 9. 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.7}"
8
+ readonly PREVISIT_SPEC="${DSH_PRE_DUEDILIGENCE_SPEC:-dsh-pre-duediligence@0.1.8}"
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
@@ -1143,9 +1143,9 @@ function CapabilityIcon({ children }) {
1143
1143
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children });
1144
1144
  }
1145
1145
  function CapabilityBar(props) {
1146
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("nav", { className: "qccPrevisitCapabilities", "aria-label": "\u8BBF\u524D\u5C3D\u8C03\u80FD\u529B\u83DC\u5355", children: CAPABILITIES.map((item) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("button", { type: "button", className: "qccPrevisitCapability", onClick: () => props.onNavigate(item.view), children: [
1146
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("nav", { className: "qccPrevisitCapabilities", "aria-label": "\u8BBF\u524D\u5C3D\u8C03\u80FD\u529B\u83DC\u5355", children: CAPABILITIES.map((item) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("button", { type: "button", className: "qccPrevisitCapability", "aria-label": item.label, title: item.label, onClick: () => props.onNavigate(item.view), children: [
1147
1147
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CapabilityIcon, { children: item.icon }),
1148
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: item.label })
1148
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "qccPrevisitCapabilityLabel", children: item.label })
1149
1149
  ] }, item.view)) });
1150
1150
  }
1151
1151
  function installCapabilityMount(marker, onMount) {
@@ -1380,11 +1380,13 @@ var WORKBENCH_CSS = String.raw`
1380
1380
  html[data-theme="dark"] .qccPrevisitHeroLogo,html.dark .qccPrevisitHeroLogo{color:#55ADFF}
1381
1381
  .qccPrevisitExperience{width:100%;box-sizing:border-box;text-align:center}
1382
1382
  .qccPrevisitHomeSummary{max-width:620px;margin:0 auto 18px;color:var(--qcc-secondary);font-size:14px;line-height:1.7}
1383
- .qccPrevisitCapabilityMount{width:100%;box-sizing:border-box;margin-top:12px}
1384
- .qccPrevisitCapabilities{display:flex;align-items:stretch;justify-content:center;gap:8px;width:100%;max-width:720px;margin:0 auto;padding:0 8px;box-sizing:border-box}
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}
1383
+ .qccPrevisitCapabilityMount{width:100%;padding:8px 0;box-sizing:border-box;flex:none}
1384
+ .qccPrevisitCapabilities{display:flex;align-items:center;justify-content:safe center;gap:8px;width:100%;max-width:var(--dsh-composer-card-max-width,780px);margin:0 auto;padding:2px 16px 0;box-sizing:border-box;overflow-x:auto;scrollbar-width:none}
1385
+ .qccPrevisitCapabilities::-webkit-scrollbar{display:none}
1386
+ .qccPrevisitCapability{display:inline-flex;align-items:center;justify-content:center;flex-direction:column;gap:5px;flex:0 0 auto;min-width:108px;min-height:54px;padding:7px 12px;border:1px solid var(--qcc-border);border-radius:8px;background:var(--qcc-surface);color:var(--qcc-secondary);font:inherit;font-size:12px;cursor:pointer;transition:border-color .16s ease,color .16s ease,background .16s ease}
1386
1387
  .qccPrevisitCapability svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;flex:none}
1387
- .qccPrevisitCapability:hover{border-color:var(--qcc-brand);background:var(--qcc-selected);color:var(--qcc-action)}
1388
+ .qccPrevisitCapabilityLabel{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
1389
+ .qccPrevisitCapability:hover,.qccPrevisitCapability:focus-visible{border-color:var(--qcc-border);background:var(--qcc-selected);color:var(--qcc-action)}
1388
1390
  .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}
1389
1391
  .qccPrevisitLauncherContent{display:inline-flex;align-items:center;gap:9px;color:inherit}
1390
1392
  .qccPrevisitLauncherContent svg{color:var(--qcc-brand);flex:none}
@@ -1459,11 +1461,11 @@ html[data-theme="dark"] .qccPrevisitHeroLogo,html.dark .qccPrevisitHeroLogo{colo
1459
1461
  .qccDockBody{display:grid;gap:12px}.qccDockRow{display:grid;grid-template-columns:68px 1fr;align-items:start;gap:10px}.qccDockLabel{padding-top:7px;color:var(--qcc-secondary);font-size:12px}.qccDockCompany{width:100%;min-height:38px;padding:8px 10px;border:1px solid var(--qcc-border);border-radius:8px;background:var(--qcc-surface);color:var(--qcc-text);font:inherit;font-size:16px;box-sizing:border-box}.qccDockChips{display:flex;flex-wrap:wrap;gap:7px}.qccDockChip{min-height:32px;padding:0 10px;border:1px solid var(--qcc-border);border-radius:8px;background:var(--qcc-surface);color:var(--qcc-secondary);font:inherit;font-size:11px;cursor:pointer}.qccDockChip[data-selected="true"]{border-color:var(--qcc-brand);background:var(--qcc-selected);color:var(--qcc-action)}.qccDockFoot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:4px}.qccDockHint{color:var(--qcc-secondary);font-size:10px;line-height:1.45}.qccDockHint[data-tone="error"]{color:var(--qcc-danger)}.qccDockActions{display:flex;gap:7px;flex:none}.qccDockBtn{min-height:34px;padding:0 11px;border:1px solid var(--qcc-border);border-radius:8px;background:var(--qcc-surface);color:var(--qcc-text);font:inherit;font-size:11px;cursor:pointer}.qccDockPrimary{border-color:var(--qcc-action);background:var(--qcc-action);color:var(--qcc-action-text)}
1460
1462
 
1461
1463
  @media(max-width:760px){
1462
- .qccPrevisitCapabilities{display:grid;grid-template-columns:repeat(3,1fr)}.qccPrevisitCapability{padding-inline:7px}
1464
+ .qccPrevisitCapabilities{justify-content:flex-start;padding-inline:12px}.qccPrevisitCapability{min-width:92px;padding-inline:10px}
1463
1465
  .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
1466
  .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
1467
  }
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}}
1468
+ @media(max-width:430px){.qccPromptChoices{grid-template-columns:1fr}.qccPwRiskTiles,.qccPwCoverage,.qccPwStateStrip{grid-template-columns:repeat(2,1fr)}.qccPwSubtitle{max-width:190px}}
1467
1469
  @media(prefers-reduced-motion:reduce){.qccPwShell *,.qccPromptPanel *,.qccPrevisitCapabilities *{animation:none!important;transition:none!important}}
1468
1470
  `;
1469
1471
 
package/lib/index.js CHANGED
@@ -38,7 +38,7 @@ function loadBundledSkill() {
38
38
  },
39
39
  metadata: {
40
40
  author: "QCC",
41
- version: "0.1.7",
41
+ version: "0.1.8",
42
42
  industry: "enterprise-services",
43
43
  mcpServers: ["qcc-company", "qcc-risk", "qcc-ipr", "qcc-operation", "qcc-executive"]
44
44
  }
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.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"],
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.8\",\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.2:所有变量和组件选择器均限定在本插件拥有的节点内。 */
1
+ /** DSH-UX-001 v1.1.3:所有变量和组件选择器均限定在本插件拥有的节点内。 */
2
2
  export declare const WORKBENCH_CSS: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-pre-duediligence",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Session 级 DeepSeek Harness 访前尽调工作台,使用企查查 MCP 生成可追溯的访前尽调报告。",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -5,7 +5,7 @@ whenToUse: 用户要求准备客户拜访、访前尽调、一页纸简报、授
5
5
  user-invocable: true
6
6
  metadata:
7
7
  author: QCC
8
- version: 0.1.7
8
+ version: 0.1.8
9
9
  ---
10
10
 
11
11
  # 访前尽调