dsh-data-cleaning-agent 0.8.8 → 0.8.9

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
@@ -2,6 +2,15 @@
2
2
 
3
3
  本文件记录 `dsh-data-cleaning-agent` 的版本变更。格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [SemVer](https://semver.org/lang/zh-CN/)。
4
4
 
5
+ ## [0.8.9] - 2026-09-07
6
+
7
+ ### Changed
8
+ - 按共享 DSH-UX-001 v1.1.2 对齐招投标工作台的阶段菜单:单行五个等宽分栏、上图标下短标题、分隔线及选中蓝色底线;取消数字前缀和横向滚动布局。说明与状态仅保留在内容区和工作台头部。
9
+ - 窄屏缩小图标与字号,长标题在分栏内省略并保留完整可访问名称和悬停提示;阶段导航、质量体检子视图及 Host 工作流保持不变。
10
+
11
+ ### Tests
12
+ - 增补五阶段图标/标题结构断言与隔离 Chromium 深浅色布局回归,覆盖 320px 窄屏、普通/展开工作台、长标题防溢出,以及切换阶段不修改 Host 任务。
13
+
5
14
  ## [0.8.8] - 2026-09-06
6
15
 
7
16
  ### Changed
package/README.en.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  > A data cleaning & completion agent plugin for DeepSeek Harness: local CSV/XLSX/JSON engine plus optional Qichacha (QCC) MCP enterprise-data enrichment. Initiated and maintained by the Qichacha (QCC) team.
4
4
  >
5
- > Current source version / 当前源码版本: **0.8.8** (stable release)
5
+ > Current source version / 当前源码版本: **0.8.9** (stable release)
6
6
 
7
- This release aligns the business UI with QCC blue: a database logo beside the home title, consistent entry/workbench icons, and searchable field groups retaining all 128 fields. Native DSH input and send behavior are preserved.
7
+ This release aligns the workbench stage menu with the tender agent: five equal-width columns in one row, line icons above short labels, and a pale-blue selection with a blue underline. Narrow layouts stay within the panel. All 128 fields, existing workflows, and native DSH input and send behavior are preserved.
8
8
 
9
9
  [![CI](https://github.com/duhu2000/dsh-data-cleaning-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/duhu2000/dsh-data-cleaning-agent/actions/workflows/ci.yml)
10
10
  [![npm](https://img.shields.io/npm/v/dsh-data-cleaning-agent)](https://www.npmjs.com/package/dsh-data-cleaning-agent)
package/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  > 在 DeepSeek Harness 中清洗、补全、画像企业名单数据的智能体插件:本地 CSV/XLSX/JSON 引擎 + 可选企查查(Qichacha/QCC)MCP 企业数据补全,由企查查(Qichacha/QCC)团队发起并维护。
4
4
  >
5
- > 当前源码版本 / Current source version: **0.8.8**(正式版本)
5
+ > 当前源码版本 / Current source version: **0.8.9**(正式版本)
6
6
 
7
- 本版统一企查查蓝业务界面:数据库 LOGO 与首页名称同排,入口/工作台图标一致;字段支持按维度、名称或工具搜索,保留全部 128 个字段。仅调整本业务界面,不替换 DSH 原生输入和发送机制。
7
+ 本版将右侧阶段菜单对齐招投标工作台:单行五个等宽分栏、上图标下短标题,选中项采用浅蓝底和蓝色底线;窄屏不换行、不横向溢出。保留企查查蓝界面、全部 128 个字段和原有工作流,不替换 DSH 原生输入和发送机制。
8
8
 
9
9
  [![CI](https://github.com/duhu2000/dsh-data-cleaning-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/duhu2000/dsh-data-cleaning-agent/actions/workflows/ci.yml)
10
10
  [![npm](https://img.shields.io/npm/v/dsh-data-cleaning-agent)](https://www.npmjs.com/package/dsh-data-cleaning-agent)
package/lib/client.js CHANGED
@@ -63,6 +63,20 @@ window.__ModuleLoader__.load({
63
63
  h('path', { d: DATABASE_PATH }));
64
64
  }
65
65
 
66
+ // 阶段只展示线性图标和短标题;说明、状态与操作保留在内容区。
67
+ const STAGE_ICON_PATHS = {
68
+ upload: 'M12 16V3m-4 4 4-4 4 4M4 14v6h16v-6',
69
+ check: 'M9 6h11M9 12h11M9 18h11M3 6l1 1 2-2M3 12l1 1 2-2M3 18l1 1 2-2',
70
+ search: 'M16 16l5 5M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0',
71
+ database: DATABASE_PATH,
72
+ table: 'M4 3h16v18H4zM4 8h16M4 13h16M4 17h16M10 8v13',
73
+ };
74
+ function StageIcon({ kind }) {
75
+ return h('svg', { width: 20, height: 20, viewBox: '0 0 24 24', fill: 'none',
76
+ stroke: 'currentColor', strokeWidth: 1.7, strokeLinecap: 'round', strokeLinejoin: 'round',
77
+ 'aria-hidden': true, focusable: false }, h('path', { d: STAGE_ICON_PATHS[kind] }));
78
+ }
79
+
66
80
  // 搜索仅改变可见字段,绝不清除已选字段或改变 Host 的字段目录。
67
81
  function visibleCatalogFields(group, query) {
68
82
  const needle = String(query || '').trim().toLowerCase();
@@ -525,32 +539,65 @@ body:has(.dcAgentPromptBackdrop) { overflow: hidden; }
525
539
 
526
540
  .dcAgentStepper {
527
541
  display: grid;
528
- grid-template-columns: repeat(4, minmax(0, 1fr));
529
- gap: 8px;
530
- padding: 12px 18px;
542
+ grid-template-columns: repeat(var(--dc-stage-count, 5), minmax(0, 1fr));
543
+ min-width: 0;
531
544
  border-bottom: 1px solid var(--dc-border);
532
- background: var(--dc-page);
545
+ background: var(--dc-surface);
533
546
  }
534
547
 
535
548
  .dcAgentStep {
549
+ position: relative;
550
+ min-width: 0;
536
551
  display: flex;
552
+ flex-direction: column;
537
553
  align-items: center;
538
554
  justify-content: center;
539
- gap: 6px;
540
- padding: 9px 6px;
541
- border: 1px solid var(--dc-border);
542
- border-radius: 6px;
555
+ gap: 8px;
556
+ padding: 12px 4px;
557
+ border: 0;
558
+ border-right: 1px solid var(--dc-border);
559
+ border-radius: 0;
543
560
  background: transparent;
544
561
  color: var(--dc-muted);
545
562
  font-size: 12px;
563
+ font-weight: 600;
546
564
  cursor: pointer;
547
- white-space: nowrap;
548
565
  }
566
+ .dcAgentStep:last-child { border-right: 0; }
567
+ .dcAgentStep:hover { background: var(--dc-page); }
549
568
  .dcAgentStep.is-active {
550
569
  color: var(--dc-action);
551
- border-color: var(--dc-action);
552
570
  background: var(--dc-selected);
553
571
  }
572
+ .dcAgentStep.is-active::after {
573
+ content: '';
574
+ position: absolute;
575
+ bottom: 0;
576
+ left: 8px;
577
+ right: 8px;
578
+ height: 3px;
579
+ border-radius: 3px 3px 0 0;
580
+ background: var(--dc-action);
581
+ }
582
+ .dcAgentStepIcon {
583
+ display: grid;
584
+ place-items: center;
585
+ width: 30px;
586
+ height: 30px;
587
+ flex: none;
588
+ border: 1px solid var(--dc-border);
589
+ border-radius: 8px;
590
+ }
591
+ .dcAgentStepIcon svg { display: block; }
592
+ .dcAgentStepLabel {
593
+ display: block;
594
+ width: 100%;
595
+ min-width: 0;
596
+ line-height: 18px;
597
+ white-space: nowrap;
598
+ overflow: hidden;
599
+ text-overflow: ellipsis;
600
+ }
554
601
 
555
602
  .dcAgentWbBody {
556
603
  flex: 1 1 auto;
@@ -818,7 +865,6 @@ body:has(.dcAgentPromptBackdrop) { overflow: hidden; }
818
865
  @media (max-width: 760px) {
819
866
  .dcAgentWorkbench, .dcAgentWorkbench.is-expanded { width: 100vw; max-width: none; min-width: 0; border-radius: 0; }
820
867
  .dcAgentOverlay { background: rgba(8, 10, 14, 0.22); pointer-events: auto; }
821
- .dcAgentStepper { grid-template-columns: repeat(2, minmax(0, 1fr)); }
822
868
  .dcAgentQccBadge, .dcAgentJobsPill { display: none; }
823
869
  .dcAgentCandidate { grid-template-columns: 1fr; }
824
870
  .dcAgentCapabilities { justify-content: flex-start; padding-inline: 12px; }
@@ -834,15 +880,17 @@ body:has(.dcAgentPromptBackdrop) { overflow: hidden; }
834
880
  .dcAgentWorkbench { width: 420px; max-width: 48vw; min-width: 360px; }
835
881
  .dcAgentQccBadge, .dcAgentJobsPill { display: none; }
836
882
  }
883
+ @media (max-width: 360px) {
884
+ .dcAgentStep { font-size: 11px; padding: 10px 3px; gap: 6px; }
885
+ .dcAgentStepIcon { width: 26px; height: 26px; }
886
+ .dcAgentStepIcon svg { width: 18px; height: 18px; }
887
+ }
837
888
  /* Distinct levels: management tabs → compact task steps → working content. */
838
889
  .dcAgentWorkbench, .dcAgentPromptPanel { font-size: 14px; line-height: 1.5; }
839
890
  .dcAgentWbHeader, .dcAgentManagement, .dcAgentStepper { flex: none; }
840
891
  .dcAgentManagement { display: flex; gap: 24px; padding: 0 18px; border-bottom: 1px solid var(--dc-border); }
841
892
  .dcAgentManagement .dcAgentButton { border: 0; border-bottom: 3px solid transparent; border-radius: 0; padding: 10px 0; background: transparent; }
842
893
  .dcAgentManagement .dcAgentButton[aria-pressed="true"] { border-bottom-color: var(--dc-action); color: var(--dc-action); font-weight: 600; }
843
- .dcAgentStepper { display: flex; overflow-x: auto; gap: 4px; padding: 10px 12px; }
844
- .dcAgentStep { flex: 0 0 auto; border-color: transparent; padding: 7px 8px; }
845
- .dcAgentStep.is-active { border-color: transparent; }
846
894
  .dcAgentCapability { border-radius: 8px; }
847
895
  .dcAgentWbBody { min-height: 0; }
848
896
  .dcAgentTable th { background: var(--dc-table-head); color: var(--dc-text); }
@@ -913,11 +961,11 @@ body:has(.dcAgentPromptBackdrop) { overflow: hidden; }
913
961
  }
914
962
 
915
963
  const STEPS = [
916
- { key: 'upload', label: '导入与核验', icon: '1' },
917
- { key: 'rules', label: '规则与体检', icon: '2' },
918
- { key: 'match', label: '主体匹配', icon: '3' },
919
- { key: 'enrich', label: '字段补全', icon: '4' },
920
- { key: 'download', label: '结果下载', icon: '5' },
964
+ { key: 'upload', label: '导入与核验', icon: 'upload' },
965
+ { key: 'rules', label: '规则与体检', icon: 'check' },
966
+ { key: 'match', label: '主体匹配', icon: 'search' },
967
+ { key: 'enrich', label: '字段补全', icon: 'database' },
968
+ { key: 'download', label: '结果下载', icon: 'table' },
921
969
  ];
922
970
 
923
971
  const CAPABILITIES = [
@@ -3977,15 +4025,18 @@ body:has(.dcAgentPromptBackdrop) { overflow: hidden; }
3977
4025
  h('button', { type: 'button', className: 'dcAgentButton', 'aria-pressed': step === 'history',
3978
4026
  onClick: () => actions.setStep('history') }, '任务历史'),
3979
4027
  ),
3980
- step !== 'history' ? h('nav', { className: 'dcAgentStepper', 'aria-label': '清洗流程' },
4028
+ step !== 'history' ? h('nav', { className: 'dcAgentStepper', 'aria-label': '清洗流程',
4029
+ style: { '--dc-stage-count': STEPS.length } },
3981
4030
  STEPS.map((st) => h('button', {
3982
4031
  key: st.key,
3983
4032
  type: 'button',
3984
4033
  className: `dcAgentStep${(step === 'profile' ? 'rules' : step) === st.key ? ' is-active' : ''}`,
3985
4034
  'aria-label': st.label,
4035
+ title: st.label,
3986
4036
  'aria-current': (step === 'profile' ? 'rules' : step) === st.key ? 'step' : undefined,
3987
4037
  onClick: () => actions.setStep(st.key),
3988
- }, `${st.icon} ${st.label}`)),
4038
+ }, h('span', { className: 'dcAgentStepIcon' }, h(StageIcon, { kind: st.icon })),
4039
+ h('span', { className: 'dcAgentStepLabel' }, st.label))),
3989
4040
  ) : null,
3990
4041
  h('div', { className: 'dcAgentWbBody' },
3991
4042
  error ? h('div', { className: 'dcAgentError', role: 'alert' }, error) : null,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-data-cleaning-agent",
3
- "version": "0.8.8",
3
+ "version": "0.8.9",
4
4
  "description": "Clean, complete, and profile enterprise name lists in DeepSeek Harness — a data cleaning & completion agent plugin with local CSV/XLSX/JSON engine and optional Qichacha (QCC) MCP enrichment. Maintained by Qichacha/QCC.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",