@marsken/dsh-studio 0.1.9 → 0.1.10

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.
@@ -6,7 +6,7 @@
6
6
 
7
7
  | 项 | 值 |
8
8
  | --- | --- |
9
- | dsh-studio | `package.json` `version: 0.1.9` |
9
+ | dsh-studio | `package.json` `version: 0.1.10` |
10
10
  | DeepSeek Harness | `0.2.2-rc.1`(`dsh --version`) |
11
11
  | Node | `v24.22.2`(Linux 目标机);本机 Windows `v24.19.0` |
12
12
  | 目标系统 | Ubuntu 24.04,`dsh web` 监听 `18080`,nginx `:80` 反代并注入 `dsh-auth-*` cookie |
package/docs/publish.md CHANGED
@@ -127,6 +127,7 @@ token 只写进临时 npmrc(放在仓库外或 `tmp/` 且不提交),发完
127
127
  | --- | --- | --- |
128
128
  | `0.1.0` | 2026-11-13 | 首个公开版:看板 / 需求 / 用例回归 / 效能 / 设计评审四期 |
129
129
  | `0.1.1` | 2026-11-13 | 补三张 README 截图(npm 页可看图);默认值与文档去掉公司内网信息 |
130
+ | `0.1.10` | 2026-11-15 | shell/db 用例可跑、GitLab 核对结果常驻显示、事件带 truncated、角色归并 |
130
131
  | `0.1.9` | 2026-11-14 | 准出门禁提示「代码事实核对不通过」(只提醒,不拦) |
131
132
  | `0.1.8` | 2026-11-14 | 卡进「待评审」时自动核对代码事实,对不上就写进 history 并记 gate/blocked |
132
133
  | `0.1.7` | 2026-11-14 | webhook 投递结果进「集成健康」(地址写错了看得见) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marsken/dsh-studio",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "type": "module",
5
5
  "description": "DSH Studio: role-based multi-agent workspace (product / architect / developer / QA) with a live work board, GitLab + Feishu connection settings, all configurable from the web GUI.",
6
6
  "main": "index.js",
package/src/host/cases.js CHANGED
@@ -49,6 +49,10 @@ export function collectCases(state) {
49
49
  priority: item.priority ?? 'p2',
50
50
  pointId: item.pointId ?? '',
51
51
  http: item.http !== null && item.http !== undefined,
52
+ shell: item.shell !== null && item.shell !== undefined,
53
+ db: item.db !== null && item.db !== undefined,
54
+ // 能跑的三种:接口 / shell / 数据库。以前界面只认 http,另外两种建得出来却跑不了。
55
+ runnable: item.http != null || item.shell != null || item.db != null,
52
56
  lastRunAt: item.lastRun?.at ?? 0,
53
57
  // 失败时最想看的三样:错在哪、返回了什么、上一次的结论文案。
54
58
  lastError: String(item.lastRun?.error ?? '').slice(0, 300),
@@ -56,7 +56,23 @@ export function buildQuality(state, runs) {
56
56
  if (rework) row.rework += 1
57
57
  if (done && !rework) row.firstPass += 1
58
58
  }
59
- const runRows = (runs?.byExpert ?? []).map(item => ({ name: String(item.key ?? ''), runs: Number(item.runs) || 0, ms: Number(item.ms) || 0 }))
59
+ // 老的派单日志记的是「角色位」(dev),卡上记的是专家 id。一个角色只有一位专家时直接归并,
60
+ // 否则同一个人会在表里出现两行(一行有派单没卡、一行有卡没派单)。
61
+ const byRole = new Map()
62
+ for (const expert of state?.config?.experts ?? []) {
63
+ const role = String(expert.role ?? '')
64
+ if (role === '') continue
65
+ byRole.set(role, [...(byRole.get(role) ?? []), String(expert.id ?? '')])
66
+ }
67
+ const runRows = (runs?.byExpert ?? []).map(item => {
68
+ const key = String(item.key ?? '')
69
+ const holders = byRole.get(key) ?? []
70
+ return {
71
+ name: holders.length === 1 ? holders[0] : key,
72
+ runs: Number(item.runs) || 0,
73
+ ms: Number(item.ms) || 0,
74
+ }
75
+ })
60
76
  const runByName = new Map(runRows.map(item => [item.name.toLowerCase(), item]))
61
77
  const runById = new Map(runRows.map(item => [item.name, item]))
62
78
  const experts = [...perExpert.values()].map(row => {
@@ -85,7 +85,7 @@ async function runCaseKeys(store, keys, options = {}) {
85
85
  } catch {
86
86
  /* 记不下来不影响这次跑的结果 */
87
87
  }
88
- emitEvent('regression/finished', { by: record.by, cards: record.cards, total: record.total, passed: record.passed, failed: record.failed, bugs: record.bugs ?? 0 })
88
+ emitEvent('regression/finished', { by: record.by, cards: record.cards, total: record.total, passed: record.passed, failed: record.failed, bugs: record.bugs ?? 0, truncated: options.truncated ?? null })
89
89
  return { results, regression: record }
90
90
  }
91
91