@suifei/dsh-ai-team 0.3.8 → 0.3.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.
- package/CHANGELOG.md +11 -0
- package/README.md +8 -17
- package/client.js +12 -14
- package/icon.svg +11 -28
- package/index.js +1 -1
- package/lib/host/default-roster.js +36 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.10 — 2026-11-09
|
|
4
|
+
|
|
5
|
+
- 默认成员改为小说式虚拟名:墨渊(主理人)/ 青岚(执行)/ 白砚(验收);
|
|
6
|
+
- 旧版 0.3.9 及以前的默认名(沈舟/林岚/顾清)在打开 Project 时自动升级;
|
|
7
|
+
- 只升级精确匹配的旧默认名,用户自定义名字不会被覆盖。
|
|
8
|
+
|
|
9
|
+
## 0.3.9 — 2026-11-09
|
|
10
|
+
|
|
11
|
+
- 图标改为极简线条:重檐 + 出檐 + 立柱 + 渊水,侧栏与市场图标统一;
|
|
12
|
+
- awesome-dsh-plugin 分类改为 `agi`(AGI 架构探索)。
|
|
13
|
+
|
|
3
14
|
## 0.3.8 — 2026-11-09
|
|
4
15
|
|
|
5
16
|
- 收件箱「对话」返回改为文渊阁内部主对话,不再依赖宿主 `layout.selectPanel(conversation)`;
|
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
`@suifei/dsh-ai-team` 是 DeepSeek Harness 的按需启用插件:装进专用 `ai-team` profile 后,DSH 里出现一个三栏工作台——左侧 Project 与成员,中间主对话 / 看板 / 态势,右侧 Thread。Agent 自己认领 Task、互相交接,由做的人以外的成员验收;Human 只处理方向、信任和不可撤回的决定。
|
|
23
23
|
|
|
24
|
-
新 Project
|
|
24
|
+
新 Project 自带一组可改的默认成员:**墨渊(主理人)**、**青岚(执行)**、**白砚(验收)**。名字、职责、个性、模型都可以改;模型提供商和模型名称直接读取 DSH 的 `llm` 目录,不需要手填 id。
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
@@ -77,8 +77,8 @@ dsh --profile ai-team --no-open --port 33271
|
|
|
77
77
|
│ # UI 项目 │ 看板:待处理 / 进行中 / 待验收 / 完成│ 验收 / 退回 │
|
|
78
78
|
│ │ 态势:需要你 / 团队在做 / 等待受阻 / 最近完成 │ 任务动作 │
|
|
79
79
|
│ Agents │ │ │
|
|
80
|
-
│
|
|
81
|
-
│
|
|
80
|
+
│ 墨渊 (Lead) │ │ │
|
|
81
|
+
│ 白砚 (QA) │ │ │
|
|
82
82
|
└─────────────────┴────────────────────────────────────┴─────────────┘
|
|
83
83
|
```
|
|
84
84
|
|
|
@@ -100,7 +100,7 @@ dsh --profile ai-team --no-open --port 33271
|
|
|
100
100
|
| 验收 | maker 不能验收;QA 硬门禁;`qaChecklist` 逐项通过 |
|
|
101
101
|
| 收件箱 | Human/Agent 各自拉取;跨 Project 聚合与项目内 ack |
|
|
102
102
|
| 关注 | 关注 Task;完成后收到 `followed_task_update` |
|
|
103
|
-
| 默认成员 | 新 Project
|
|
103
|
+
| 默认成员 | 新 Project 初始化墨渊 / 青岚 / 白砚;可改名、改职责、改个性、改模型 |
|
|
104
104
|
| 成员 | 持久 session;名字/角色/personality/notes/skills |
|
|
105
105
|
| 模型 | Provider / Model 下拉读取 DSH `llm` 目录;可跟随系统默认 |
|
|
106
106
|
| 进化 | `team.evolve` 只改自己的 personality;验收后 reflection wake |
|
|
@@ -199,19 +199,10 @@ round-19 DeepSeek + Zhipu 双 provider
|
|
|
199
199
|
|
|
200
200
|
---
|
|
201
201
|
|
|
202
|
-
##
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
- [架构设计](docs/03-架构设计报告.md)
|
|
207
|
-
- [UI/UX/UE 研究](docs/04-UI-UX-UE研究报告.md)
|
|
208
|
-
- [启动与执行计划](docs/05-项目启动与执行计划.md)
|
|
209
|
-
- [会议纪要](docs/06-会议纪要.md)
|
|
210
|
-
- [四象限设计](docs/07-四象限视图研究与设计.md)
|
|
211
|
-
- [异常恢复与模型治理](docs/08-异常恢复与模型治理.md)
|
|
212
|
-
- [团队进化与人才库](docs/09-团队进化与人才库.md)
|
|
213
|
-
- [安装、卸载与升级](docs/10-安装卸载升级.md)
|
|
214
|
-
- [M3 并发多项目与边界补齐](docs/reports/M3-并发多项目与边界补齐.md)
|
|
202
|
+
## 文档(仅本地)
|
|
203
|
+
|
|
204
|
+
需求、架构、UI 研究、验收报告保存在本机 `docs/`,**不随 GitHub 仓库或 npm 包发布**。
|
|
205
|
+
仓库只保留 README、CHANGELOG 与运行所需的源码 / 技能。
|
|
215
206
|
|
|
216
207
|
---
|
|
217
208
|
|
package/client.js
CHANGED
|
@@ -2974,23 +2974,21 @@ window.__ModuleLoader__.load({
|
|
|
2974
2974
|
return h('svg', {
|
|
2975
2975
|
width: size,
|
|
2976
2976
|
height: size,
|
|
2977
|
-
viewBox: '0 0
|
|
2977
|
+
viewBox: '0 0 24 24',
|
|
2978
|
+
fill: 'none',
|
|
2979
|
+
stroke: 'currentColor',
|
|
2980
|
+
strokeWidth: 1.8,
|
|
2981
|
+
strokeLinecap: 'round',
|
|
2982
|
+
strokeLinejoin: 'round',
|
|
2978
2983
|
'aria-hidden': 'true',
|
|
2979
2984
|
focusable: 'false',
|
|
2980
2985
|
},
|
|
2981
|
-
h('
|
|
2982
|
-
h('
|
|
2983
|
-
h('path', { d: '
|
|
2984
|
-
h('path', { d: '
|
|
2985
|
-
h('path', { d: '
|
|
2986
|
-
h('path', { d: '
|
|
2987
|
-
h('path', { d: 'M22 31 V42 M28 31 V42 M36 31 V42 M42 31 V42', stroke: '#D4AF37', strokeWidth: 2, strokeLinecap: 'round' }),
|
|
2988
|
-
h('path', { d: 'M19 43 H45', stroke: '#D4AF37', strokeWidth: 2, strokeLinecap: 'round' }),
|
|
2989
|
-
h('path', { d: 'M17 46 H47', stroke: '#D4AF37', strokeWidth: 2, strokeLinecap: 'round' }),
|
|
2990
|
-
h('path', { d: 'M21 49 H43', stroke: '#D4AF37', strokeWidth: 1.5, strokeLinecap: 'round', opacity: 0.7 }),
|
|
2991
|
-
h('path', { d: 'M15 54 Q21 51 27 54 T39 54 T51 54', stroke: '#D4AF37', strokeWidth: 1.5, fill: 'none', strokeLinecap: 'round', opacity: 0.85 }),
|
|
2992
|
-
h('path', { d: 'M19 57 Q25 54 31 57 T43 57', stroke: '#D4AF37', strokeWidth: 1.5, fill: 'none', strokeLinecap: 'round', opacity: 0.5 }),
|
|
2993
|
-
h('rect', { x: 29, y: 33, width: 6, height: 7, rx: 1, fill: '#C0392B' }));
|
|
2986
|
+
h('path', { d: 'M5 8l7-4 7 4' }),
|
|
2987
|
+
h('path', { d: 'M7 11h10' }),
|
|
2988
|
+
h('path', { d: 'M4 14h16' }),
|
|
2989
|
+
h('path', { d: 'M9 14v3' }),
|
|
2990
|
+
h('path', { d: 'M15 14v3' }),
|
|
2991
|
+
h('path', { d: 'M4 20c2.5-1.5 5.5-1.5 8 0s5.5 1.5 8 0' }));
|
|
2994
2992
|
}
|
|
2995
2993
|
|
|
2996
2994
|
function PanelIcon() {
|
package/icon.svg
CHANGED
|
@@ -1,29 +1,12 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
|
|
2
|
-
<!--
|
|
3
|
-
<
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
<path d="
|
|
9
|
-
<path d="
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
<!-- 三开间柱 -->
|
|
13
|
-
<path d="M22 31 V42 M28 31 V42 M36 31 V42 M42 31 V42"
|
|
14
|
-
stroke="#D4AF37" stroke-width="2" stroke-linecap="round"/>
|
|
15
|
-
|
|
16
|
-
<!-- 基座与台阶 -->
|
|
17
|
-
<path d="M19 43 H45" stroke="#D4AF37" stroke-width="2" stroke-linecap="round"/>
|
|
18
|
-
<path d="M17 46 H47" stroke="#D4AF37" stroke-width="2" stroke-linecap="round"/>
|
|
19
|
-
<path d="M21 49 H43" stroke="#D4AF37" stroke-width="1.5" stroke-linecap="round" opacity="0.7"/>
|
|
20
|
-
|
|
21
|
-
<!-- 渊水纹 -->
|
|
22
|
-
<path d="M15 54 Q21 51 27 54 T39 54 T51 54"
|
|
23
|
-
stroke="#D4AF37" stroke-width="1.5" fill="none" stroke-linecap="round" opacity="0.85"/>
|
|
24
|
-
<path d="M19 57 Q25 54 31 57 T43 57"
|
|
25
|
-
stroke="#D4AF37" stroke-width="1.5" fill="none" stroke-linecap="round" opacity="0.5"/>
|
|
26
|
-
|
|
27
|
-
<!-- 朱印:点“文”与“批红” -->
|
|
28
|
-
<rect x="29" y="33" width="6" height="7" rx="1" fill="#C0392B"/>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" role="img" aria-label="文渊阁">
|
|
2
|
+
<!-- 重檐(上层屋顶) -->
|
|
3
|
+
<path d="M5 8l7-4 7 4" />
|
|
4
|
+
<path d="M7 11h10" />
|
|
5
|
+
<!-- 出檐(下层屋檐) -->
|
|
6
|
+
<path d="M4 14h16" />
|
|
7
|
+
<!-- 立柱(三开间) -->
|
|
8
|
+
<path d="M9 14v3" />
|
|
9
|
+
<path d="M15 14v3" />
|
|
10
|
+
<!-- 渊水(底部波纹) -->
|
|
11
|
+
<path d="M4 20c2.5-1.5 5.5-1.5 8 0s5.5 1.5 8 0" />
|
|
29
12
|
</svg>
|
package/index.js
CHANGED
|
@@ -33,7 +33,7 @@ export const name = 'ai-team';
|
|
|
33
33
|
/** The workbench only makes sense where the Web carrier exists. */
|
|
34
34
|
export const inject = ['webServer', 'permissionPresets', 'sandboxPolicy'];
|
|
35
35
|
|
|
36
|
-
const VERSION = '0.3.
|
|
36
|
+
const VERSION = '0.3.10';
|
|
37
37
|
const PROJECT_ID = 'prj_main';
|
|
38
38
|
const HUMAN_ID = 'mem_human';
|
|
39
39
|
|
|
@@ -10,36 +10,66 @@
|
|
|
10
10
|
export const DEFAULT_MEMBER_ROSTER = Object.freeze([
|
|
11
11
|
{
|
|
12
12
|
id: 'mem_lead',
|
|
13
|
-
name: '
|
|
13
|
+
name: '墨渊',
|
|
14
14
|
role: '主理人',
|
|
15
15
|
personality: '先定义可验收的结果,再把方向拆成 Task;不替执行者写实现,只在关键时刻做决定。',
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
id: 'mem_maker',
|
|
19
|
-
name: '
|
|
19
|
+
name: '青岚',
|
|
20
20
|
role: '执行',
|
|
21
21
|
personality: '认领 Task 后直接推进,先交付可运行结果和证据再汇报;遇到阻塞先找 owner。',
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
id: 'mem_check',
|
|
25
|
-
name: '
|
|
25
|
+
name: '白砚',
|
|
26
26
|
role: '验收',
|
|
27
27
|
personality: '独立验收,只按结果定义和证据判断;不确定就退回,不与执行者共用 claim。',
|
|
28
28
|
},
|
|
29
29
|
]);
|
|
30
30
|
|
|
31
|
+
/** Names shipped by 0.3.9 and earlier; only these exact pins are migrated. */
|
|
32
|
+
const LEGACY_DEFAULT_NAMES = Object.freeze({
|
|
33
|
+
mem_lead: '沈舟',
|
|
34
|
+
mem_maker: '林岚',
|
|
35
|
+
mem_check: '顾清',
|
|
36
|
+
});
|
|
37
|
+
|
|
31
38
|
export const DEFAULT_LEAD_ID = 'mem_lead';
|
|
32
39
|
|
|
33
40
|
function agentMembers(service) {
|
|
34
41
|
return Object.values(service.state.members ?? {}).filter((member) => member.kind === 'agent');
|
|
35
42
|
}
|
|
36
43
|
|
|
44
|
+
async function upgradeLegacyDefaultNames(service, projectId, humanId) {
|
|
45
|
+
const renamed = [];
|
|
46
|
+
for (const [memberId, legacyName] of Object.entries(LEGACY_DEFAULT_NAMES)) {
|
|
47
|
+
const member = service.state.members?.[memberId];
|
|
48
|
+
if (member === undefined || member.kind !== 'agent' || member.name !== legacyName) continue;
|
|
49
|
+
const next = DEFAULT_MEMBER_ROSTER.find((entry) => entry.id === memberId);
|
|
50
|
+
if (next === undefined) continue;
|
|
51
|
+
await service.dispatch({
|
|
52
|
+
type: 'member.profile.update',
|
|
53
|
+
actor: { kind: 'human', memberId: humanId },
|
|
54
|
+
projectId,
|
|
55
|
+
payload: { memberId, name: next.name, reason: 'rename legacy default roster' },
|
|
56
|
+
});
|
|
57
|
+
renamed.push(memberId);
|
|
58
|
+
}
|
|
59
|
+
return renamed;
|
|
60
|
+
}
|
|
61
|
+
|
|
37
62
|
/**
|
|
38
63
|
* Add the default roster to an empty Project and make the Lead its owner.
|
|
39
|
-
*
|
|
64
|
+
* On an existing roster, only exact legacy default names are upgraded; custom
|
|
65
|
+
* names and custom roles are never touched.
|
|
66
|
+
* @returns {Promise<{seeded: boolean, members: string[], renamed: string[]}>}
|
|
40
67
|
*/
|
|
41
68
|
export async function seedDefaultRoster(service, projectId, { humanId = 'mem_human' } = {}) {
|
|
42
|
-
if (agentMembers(service).length > 0)
|
|
69
|
+
if (agentMembers(service).length > 0) {
|
|
70
|
+
const renamed = await upgradeLegacyDefaultNames(service, projectId, humanId);
|
|
71
|
+
return { seeded: false, members: [], renamed };
|
|
72
|
+
}
|
|
43
73
|
const added = [];
|
|
44
74
|
for (const member of DEFAULT_MEMBER_ROSTER) {
|
|
45
75
|
await service.dispatch({
|
|
@@ -67,5 +97,5 @@ export async function seedDefaultRoster(service, projectId, { humanId = 'mem_hum
|
|
|
67
97
|
payload: { ownerMemberId: DEFAULT_LEAD_ID, reason: 'seed default roster' },
|
|
68
98
|
});
|
|
69
99
|
}
|
|
70
|
-
return { seeded: true, members: added };
|
|
100
|
+
return { seeded: true, members: added, renamed: [] };
|
|
71
101
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@suifei/dsh-ai-team",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.10",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "文渊阁 (Wenyuan Pavilion) — AI Team mode for DeepSeek Harness: concurrent projects, owned tasks, threads, inbox and an append-only team ledger",
|
|
6
6
|
"license": "MIT",
|