dsh-plugin-teamflow 0.1.1 → 0.1.2
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 +32 -0
- package/README.en.md +162 -137
- package/README.md +168 -148
- package/lib/client.js +0 -2
- package/lib/descriptors.mjs +0 -2
- package/lib/host.mjs +11 -8
- package/lib/store.mjs +0 -2
- package/package.json +97 -70
- package/lib/client.js.map +0 -1
- package/lib/descriptors.mjs.map +0 -1
- package/lib/host.mjs.map +0 -1
- package/lib/store.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,148 +1,168 @@
|
|
|
1
|
-
# dsh-plugin-teamflow
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
→
|
|
14
|
-
→
|
|
15
|
-
→
|
|
16
|
-
→
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
- **
|
|
34
|
-
- **token
|
|
35
|
-
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
AGENTS.md
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
│
|
|
59
|
-
│
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
dsh
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
1
|
+
# dsh-plugin-teamflow
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/dsh-plugin-teamflow) [](./LICENSE)
|
|
4
|
+
|
|
5
|
+
中文 | [English](./README.en.md)
|
|
6
|
+
|
|
7
|
+
TeamFlow 团队研发流水线 —— DeepSeek Harness 可分发插件(`dsh plugin --profile web add` 安装)。
|
|
8
|
+
|
|
9
|
+
把「用户一句话需求 → 真实研发团队多 Agent 流水线」做成宿主级能力:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
需求 → PRD(基于既有模式/产品记忆,文档归档防臃肿)
|
|
13
|
+
→ (UI 改造时)UI/UX 设计
|
|
14
|
+
→ (新项目时)架构师规划并落地脚手架 + AGENTS.md
|
|
15
|
+
→ 高级全栈工程师技术方案(与派发任务对齐)
|
|
16
|
+
→ 可拆分任务时按并发并行开发
|
|
17
|
+
→ QA 功能测试(结构化缺陷 → 登记 Bug)
|
|
18
|
+
→ 产品验收(更新产品记忆)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 核心特性
|
|
22
|
+
|
|
23
|
+
- **防假交付**:① 实质校验——拒绝措辞("我无法完成"等)或低于阶段长度下限的输出视为未交付,走重试/需人工;② token 熔断——单阶段累计 60k 预算,超限停止重试;③ 上下文耗尽类失败不重试(重试同一 prompt 大概率复现);④ 产品级并发锁——同一产品同时只允许一条活跃流水线,防需求状态互踩;⑤ 阶段产物全文保留(内存 + 磁盘,供详情抽屉与断点续跑读取)。
|
|
24
|
+
- **完成汇总自动汇报主线程**:流水线结束(成功/失败/取消/中断)后自动把汇总(状态/阶段统计/token 总计/backlog/后续操作指引)投递给发起会话的 Agent——空闲时唤醒(followup),忙碌时注入下一步上下文(inject),与 DSH 后台任务通知同款机制(tool-jobs 模式,但独立实现,不依赖 web 面被禁用的 tool-jobs)。用户无需盯面板,模型会转述结果或按指引继续(认领缺陷/流转/断点重跑)。
|
|
25
|
+
- **断点续跑**:每阶段 checkpoint 落盘 `$DSH_HOME/teamflow/runs/<runId>.json`(LangGraph checkpointer 语义);进程崩溃/重启后自动标记 `interrupted`,可用 `teamflow_resume` / 面板「↻ 从断点重跑」从第一个未完成阶段继续(跳过已完成阶段,复用阶段产物全文)。
|
|
26
|
+
- **backlog 持久化(v0.1.0 起按工作区隔离)到 `$DSH_HOME/teamflow/<workspace>/backlog/`**
|
|
27
|
+
`requirements.json` / `tasks.json` / `bugs.json`,跨重启不丢;backlog 按「工作区(项目)」隔离——一个工作区就是一条项目线,不同工作区各看各的团队工作台。
|
|
28
|
+
- **单任务模型**:一个需求 = 一张轮转任务卡(不再按角色拆任务),任务卡记录 `devAssign` / `qaAssign` / 验收人,状态轮转:待办→开发中→待测试→测试中→待验收→已验收|打回|需人工;交付前端页面同时展示每个角色花在该任务上的**真实 token usage**。
|
|
29
|
+
- **产物收口**:流水线文档(PRD/设计/架构/技术方案/QA/记忆/历史)全部收口到 `docs/teamflow/`,命令运行日志收口到 `logs/teamflow/<runId>/`,宿主 `docs/<职责>/` 与项目根不再被 TeamFlow 污染;host 端 run 日志同样落 `<工作区>/logs/teamflow/<runId>.log`。
|
|
30
|
+
- **状态机 + 事件日志**:需求(立项→进行中→待验收→已验收)、任务(待办→开发中→待测试→测试中→待验收→完成|打回|需人工)、缺陷(待认领→处理中→已修复待验→已关闭)。
|
|
31
|
+
- **打回阈值**:单阶段连续 2 次 Agent 失败自动重试,仍失败 → `needs-human`,需人工介入。
|
|
32
|
+
- **并发池**:开发任务按 `maxConcurrency`(默认 3,最大 8)并行执行。
|
|
33
|
+
- **QA 缺陷登记**:QA 报告按固定表格输出 → 自动解析成 Bug 进入 backlog。
|
|
34
|
+
- **token 计量(官方口径)**:每阶段记录 `usage` = **输入(缓存未命中)/输入(缓存命中)/写缓存/输出 + 调用数**(由子代理会话逐事件累计)+ **缓存命中率**(cacheRead/(input+cacheRead))。工作台卡片/任务卡/完成汇报均按此口径展示,模型无关、与官方账单一致。
|
|
35
|
+
- **lite 模式**:微功能轻量——`teamflow_start(lite:true)` 跳过独立技术方案文档阶段(PRD 即契约),直接 **PRD → 开发 → QA → 验收**;配套 `needDesign:true` 时**保留 UI/UX 设计阶段**。实测较完整 7 段省 ~64% 时间、~88% token。
|
|
36
|
+
- **token 熔断**:单阶段官方总消耗(input+cacheRead+cacheWrite+output 累计)超 `STAGE_TOKEN_BUDGET`(默认 60k)时停止重试、需人工介入。
|
|
37
|
+
- **🏭 团队工作台(Web tab)**:与 chat / 轨迹并列的会话头部 tab,含:
|
|
38
|
+
- 流水线图形工作流(阶段泳道 + 节点卡片:状态/耗时/token/子代理会话,2s 实时刷新)
|
|
39
|
+
- **Backlog 拖拽看板**(需求/任务/缺陷三组状态泳道,卡片拖拽流转,原生 HTML5 DnD 零依赖)
|
|
40
|
+
- 成本中心(每阶段 token + 总计 + 运行时长)
|
|
41
|
+
- 人工介入中心(needs-human 项聚合 + 一键终态)
|
|
42
|
+
- 历史 run 切换 + 产品切换
|
|
43
|
+
|
|
44
|
+
## AGENTS.md 最小侵入原则(重要)
|
|
45
|
+
|
|
46
|
+
AGENTS.md 会被 harness 无条件注入每个会话,是**团队资产**。TeamFlow 遵循职责分离:
|
|
47
|
+
|
|
48
|
+
- **AGENTS.md 只放稳定共识层**:团队角色流程、工程约定、文档索引、`<!-- teamflow:begin/end -->` 托管区(仅指针)。
|
|
49
|
+
- **产品记忆/待办放独立活文档** `docs/teamflow/memory.md`(按需读取,不注入每次会话 → 省 token)。
|
|
50
|
+
- **已有项目接入**:检测到 AGENTS.md 已存在 → 绝不重写/重排/覆盖,仅在文末追加托管块(若没有);团队原有约定一行不动。
|
|
51
|
+
- **退出干净**:团队停用 TeamFlow 后,删除托管块与 `docs/teamflow/` 即完全复原,AGENTS.md 无残留账本。
|
|
52
|
+
|
|
53
|
+
## 架构(阶段 3)
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
web profile 宿主组合
|
|
57
|
+
├── teamflow-host (dsh-plugin-teamflow/host) Cordis service `teamflow`
|
|
58
|
+
│ └── TeamflowService extends TypertRemoteService
|
|
59
|
+
│ ├── ctx.typert.register(strict descriptors) ← 17 个 Remote 方法
|
|
60
|
+
│ ├── ctx.tools.register(teamflow_*) ← 11 个模型工具
|
|
61
|
+
│ └── node:fs → $DSH_HOME/teamflow/...
|
|
62
|
+
└── teamflow-client (dsh-plugin-teamflow/client,自动扫描) ← package.json 声明 dsh.client,
|
|
63
|
+
└── ctx.remote.$mount(TEAMFLOW_REMOTE_CONTRIBUTION) 无需 patch 行,clientModules 自动注册
|
|
64
|
+
└── conversation.view tab「🏭 团队工作台」
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**为什么不用 @Remote 装饰器**:宿主插件以纯 JS 分发,避免装饰器语法/TS 编译要求;
|
|
68
|
+
用 `ctx.typert.register` 注册 strict 描述符(`descriptors.js` 纯数据,host/client 共用一份,
|
|
69
|
+
保证 endpoint 与 wire 参数一致)。
|
|
70
|
+
|
|
71
|
+
**为什么是宿主级插件(而不是动态插件)**:动态(会话内)插件宿主运行在受限沙箱,
|
|
72
|
+
其 `fs` 被硬限制在运行时根,无法写入 `$DSH_HOME` 或会话工作区(实测
|
|
73
|
+
`file access denied under workspace-write mode`)。只有宿主组合里的正式插件拥有真实
|
|
74
|
+
Node `fs`,能把 backlog 落到 `$DSH_HOME`,且 client 能注册独立 tab。
|
|
75
|
+
|
|
76
|
+
## 目录结构
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
dsh-plugin-teamflow/
|
|
80
|
+
package.json # dsh.bundle.patch + dsh.client 声明;exports 指向 lib/ 构建产物
|
|
81
|
+
cordis.patch.yml # insert 块;entry 名用包根(clientModules 才能扫到 dsh.client)
|
|
82
|
+
tsdown.config.ts # client 构建(ModuleLoader bundle → lib/client.js)
|
|
83
|
+
tsdown.host.config.ts # host/store/descriptors 构建(ESM → lib/*.mjs)
|
|
84
|
+
descriptors.ts # Remote 描述符(纯数据,host/client 共用)
|
|
85
|
+
store.ts # 持久化层:原子写/备份/损坏自愈 + journal 序列化/加载(可独立测试)
|
|
86
|
+
host/index.ts # TeamflowService(TS;构建为 lib/host.mjs 供宿主加载)
|
|
87
|
+
client/index.tsx # 团队工作台(TSX;构建为 lib/client.js)
|
|
88
|
+
test/smoke.js # 无依赖 smoke 测试(描述符/模块结构/安全加固)
|
|
89
|
+
test/journal.test.js # journal 行为测试(直跑 store.ts 源码)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**TypeScript 说明**:全仓 TS/TSX。host 之所以**必须构建**(不能靠 Node strip-types 直跑)——Node 22 的 type stripping 对 `node_modules` 下的文件不生效("unsupported for files under node_modules"),而宿主组合从 profile/node_modules 加载插件。与 DSH 生态一致(`@deepseek-ai/dsh-*` 宿主包 exports 均指向 lib/*.js)。改动源码后需 `pnpm bundle` 重建并同步 profile 副本的 `lib/`。
|
|
93
|
+
|
|
94
|
+
## 环境要求
|
|
95
|
+
|
|
96
|
+
- DeepSeek Harness(dsh)宿主,**web profile**(插件含浏览器端工作台,client 面向 web 平台);
|
|
97
|
+
- Node.js ≥ 22.18;
|
|
98
|
+
- 依赖宿主提供的 `@deepseek-ai/dsh-*` 与 `react`(peerDependencies,宿主注入,无需单独安装)。
|
|
99
|
+
|
|
100
|
+
## 安装(对使用者)
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# 从 npm 安装(发布后)
|
|
104
|
+
dsh plugin --profile web add dsh-plugin-teamflow
|
|
105
|
+
|
|
106
|
+
# 或本地目录安装(开发时)
|
|
107
|
+
dsh plugin --profile web add file:./plugins/dsh-plugin-teamflow
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
安装后**重启** `dsh --profile web`,宿主行 `teamflow-host` 生效:
|
|
111
|
+
- 模型侧出现 11 个 `teamflow_*` 工具:`start / triage / status / backlog / claim / update / assign / cancel / resume / pause / resume_session`;
|
|
112
|
+
- 浏览器侧会话头部出现「🏭 团队工作台」tab;
|
|
113
|
+
- backlog 写入 `$DSH_HOME/teamflow/<product>/backlog/*.json`。
|
|
114
|
+
|
|
115
|
+
> 注意:`@deepseek-ai/*` 为宿主私有包,运行需 DeepSeek Harness(dsh)宿主环境;本包不发布也无法独立运行。
|
|
116
|
+
|
|
117
|
+
## 快速上手
|
|
118
|
+
|
|
119
|
+
1. **选团队**:会话输入框旁点「🏭」按钮,选择团队(或选「无团队」= 不走流水线,直接对话);
|
|
120
|
+
2. **发需求**:直接说需求,模型会自动调用 `teamflow_start`(自动分诊模式:patch / lite / tech / medium / full)——也可以用「直接跑 medium 模式做这个」等指定档位;
|
|
121
|
+
3. **看进展**:会话头部切到「🏭 团队工作台」tab——流水线图实时刷新(每阶段 token / 耗时 / 子代理会话),Backlog 看板可拖拽流转、点卡片看详情;
|
|
122
|
+
4. **收结果**:流水线完成后自动向当前会话汇报(状态 / 阶段统计 / token / 后续指引);中断/失败的运行可「↻ 从断点重跑」。
|
|
123
|
+
|
|
124
|
+
> 使用规则提醒:`teamflow_start` 调用后**主线程不要自行改代码或跑验证**——实现、QA、汇报由流水线各阶段子代理完成(避免与流水线抢活)。
|
|
125
|
+
|
|
126
|
+
## 卸载(对使用者)
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
dsh plugin --profile web remove dsh-plugin-teamflow
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
重启 `dsh --profile web` 后插件完全移除(模型侧 `teamflow_*` 工具与「🏭 团队工作台」tab 消失)。
|
|
133
|
+
|
|
134
|
+
可选清理(卸载**不会**自动清,按需执行):
|
|
135
|
+
- **运行数据**:删除 `$DSH_HOME/teamflow/`(backlog / 运行记录,删除前确认不再需要)。
|
|
136
|
+
- **项目痕迹**:若某项目用过 TeamFlow,删除该项目 `AGENTS.md` 中的 `<!-- teamflow:begin/end -->` 托管块与 `docs/teamflow/` 目录,即可完全复原(AGENTS.md 最小侵入原则的"退出干净")。
|
|
137
|
+
|
|
138
|
+
## 开发与验证
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
npm test # smoke(描述符/结构/安全)+ journal(断点续跑行为)
|
|
142
|
+
npm run typecheck # tsc --noEmit 类型检查(需本机 dsh profile 提供 @deepseek-ai/* 类型)
|
|
143
|
+
node --check lib/host.mjs lib/client.js lib/store.mjs lib/descriptors.mjs
|
|
144
|
+
npm run bundle # 构建 client(tsdown → lib/client.js,__ModuleLoader__.load 注册)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**插件开发者**(本插件的本地开发链路)见仓库内 [`AGENTS.md`](./AGENTS.md) 与 [`docs/adr/`](./docs/adr)——含部署同步(`node deploy.mjs` → 重启 `dsh --profile web`)、生效前提(运行中 web 从 profile 部署副本加载 host,只构建源码不生效)、设计决策记录(ADR-0001~0008)与基准对比(`docs/benchmarks/`)。本仓库其余源码均为 TS/TSX,需先 `pnpm bundle` 构建后再运行(`node_modules` 下 strip-types 不生效)。
|
|
148
|
+
|
|
149
|
+
注意:`lib/` 被 `.gitignore` 排除,但发布必须带上构建产物(`files` 白名单已含 `lib/`;`exports["./client"]` 指向 `./lib/client.js`)。
|
|
150
|
+
|
|
151
|
+
## 契约速览
|
|
152
|
+
|
|
153
|
+
| 工具 / Remote | 作用 |
|
|
154
|
+
|---|---|
|
|
155
|
+
| `teamflow_start` / `teamflow.start(sessionId, requirement, options)` | 启动流水线 |
|
|
156
|
+
| `teamflow_status` / `teamflow.list()` + `teamflow.snapshot(runId)` | 查询运行进度(阶段/状态/token/日志/是否需人工) |
|
|
157
|
+
| `teamflow_backlog` / `teamflow.backlog(product)` | 查看 backlog(+ persistence 落盘路径) |
|
|
158
|
+
| `teamflow_claim` | 认领任务或缺陷 |
|
|
159
|
+
| `teamflow_update` / `teamflow.backlogUpdate(kind, id, to, product, reason)` | 人工流转状态(处理 needs-human) |
|
|
160
|
+
| `teamflow_cancel` / `teamflow.cancel(runId)` | 取消运行 |
|
|
161
|
+
| `teamflow_resume` / `teamflow.resume(runId, sessionId)` | 断点续跑(从第一个未完成阶段重跑) |
|
|
162
|
+
| `teamflow_triage` | 需求分诊预览(默认 start 自动分诊,仅在想预评估/强制 mode 时使用) |
|
|
163
|
+
| `teamflow_assign` | 指定任务/缺陷的负责人(与 claim 分离:claim 只改状态) |
|
|
164
|
+
| `teamflow_pause` / `teamflow_resume_session` | 当前会话暂停/恢复 teamflow 触发(会话级,新会话自动重置) |
|
|
165
|
+
|
|
166
|
+
## License
|
|
167
|
+
|
|
168
|
+
MIT —— 详见 [LICENSE](./LICENSE)。
|
package/lib/client.js
CHANGED
package/lib/descriptors.mjs
CHANGED
package/lib/host.mjs
CHANGED
|
@@ -3293,10 +3293,14 @@ const simpleRender = (args, value) => [{
|
|
|
3293
3293
|
text: JSON.stringify(value, null, 2).slice(0, 4e3)
|
|
3294
3294
|
}];
|
|
3295
3295
|
function registerTools(ctx) {
|
|
3296
|
-
|
|
3297
|
-
|
|
3298
|
-
|
|
3299
|
-
|
|
3296
|
+
let registeredCount = 0;
|
|
3297
|
+
const T = (tool) => {
|
|
3298
|
+
registeredCount++;
|
|
3299
|
+
return ctx.tools.register({
|
|
3300
|
+
...tool,
|
|
3301
|
+
parameters: parameterSchemaSpecToJsonSchema(tool.parameters)
|
|
3302
|
+
});
|
|
3303
|
+
};
|
|
3300
3304
|
T({
|
|
3301
3305
|
name: "teamflow_start",
|
|
3302
3306
|
description: "Start the team R&D pipeline (background async): runs the stages per team config (PRD→design→tech→dev→QA→acceptance). Specify teamId (matches teams.json) or pick a team via the UI \"+\" button first so messages auto-match. Stage failures auto-retry; beyond threshold → rework/human intervention; per-stage token usage recorded. NOTE: after calling, the implementation work is done by pipeline subagents — the main thread MUST NOT write code or run verifications for it. requirement must be a faithful transcription of the user's words; do not invent file paths / tech claims without code verification (downstream stages build the PRD from it).",
|
|
@@ -3734,6 +3738,7 @@ function registerTools(ctx) {
|
|
|
3734
3738
|
return resumeRun(args && typeof args.runId === "string" ? args.runId : null, parent.session.id);
|
|
3735
3739
|
}
|
|
3736
3740
|
});
|
|
3741
|
+
return registeredCount;
|
|
3737
3742
|
}
|
|
3738
3743
|
/** 会话级暂停标记:pausedSessions.has(sessionId) → 该会话的 teamflow_start 被拦截。 */
|
|
3739
3744
|
const pausedSessions = /* @__PURE__ */ new Set();
|
|
@@ -3798,8 +3803,8 @@ var TeamflowService = class extends TypertRemoteService {
|
|
|
3798
3803
|
},
|
|
3799
3804
|
invocations: TEAMFLOW_DESCRIPTORS
|
|
3800
3805
|
});
|
|
3801
|
-
registerTools(ctx);
|
|
3802
|
-
console.log(`[teamflow] host 就绪:backlog 根 ${teamflowRoot()},Remote ${TEAMFLOW_DESCRIPTORS.length} 个,工具
|
|
3806
|
+
const modelTools = registerTools(ctx);
|
|
3807
|
+
console.log(`[teamflow] host 就绪:backlog 根 ${teamflowRoot()},Remote ${TEAMFLOW_DESCRIPTORS.length} 个,工具 ${modelTools} 个${interruptedCount > 0 ? `,⚠ 发现 ${interruptedCount} 条中断的流水线(可用 teamflow_resume 从断点重跑)` : ""}`);
|
|
3803
3808
|
}
|
|
3804
3809
|
ping() {
|
|
3805
3810
|
return { ok: true };
|
|
@@ -4143,5 +4148,3 @@ var TeamflowService = class extends TypertRemoteService {
|
|
|
4143
4148
|
};
|
|
4144
4149
|
//#endregion
|
|
4145
4150
|
export { TeamflowService, TeamflowService as default };
|
|
4146
|
-
|
|
4147
|
-
//# sourceMappingURL=host.mjs.map
|
package/lib/store.mjs
CHANGED
|
@@ -254,5 +254,3 @@ function loadJournals() {
|
|
|
254
254
|
}
|
|
255
255
|
//#endregion
|
|
256
256
|
export { STAGE_OUTPUT_CLIP, dshHome, fileFor, journalFile, loadJournals, persistJournal, persistRunLog, productDir, readJson, readJsonAny, runLogFile, runsDir, serializeJournal, slugPath, teamflowRoot, workspaceDir, writeJson, writeText };
|
|
257
|
-
|
|
258
|
-
//# sourceMappingURL=store.mjs.map
|
package/package.json
CHANGED
|
@@ -1,70 +1,97 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dsh-plugin-teamflow",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "TeamFlow 团队研发流水线(TypeScript):需求→PRD→设计→架构→技术方案→并行开发→QA→验收;backlog 持久化 + 断点续跑 + 完成汇报 + 防假交付;Web 团队工作台(conversation.view tab + 拖拽看板)",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./lib/host.mjs",
|
|
7
|
-
"exports": {
|
|
8
|
-
".": "./lib/host.mjs",
|
|
9
|
-
"./host": "./lib/host.mjs",
|
|
10
|
-
"./client": "./lib/client.js",
|
|
11
|
-
"./store": "./lib/store.mjs",
|
|
12
|
-
"./descriptors": "./lib/descriptors.mjs",
|
|
13
|
-
"./package.json": "./package.json"
|
|
14
|
-
},
|
|
15
|
-
"engines": {
|
|
16
|
-
"node": ">=22.18"
|
|
17
|
-
},
|
|
18
|
-
"dsh": {
|
|
19
|
-
"bundle": {
|
|
20
|
-
"patch": "./cordis.patch.yml"
|
|
21
|
-
},
|
|
22
|
-
"client": {
|
|
23
|
-
"platform": "web",
|
|
24
|
-
"inject": [
|
|
25
|
-
"@deepseek-ai/dsh-client-locale",
|
|
26
|
-
"@deepseek-ai/dsh-client-runtime",
|
|
27
|
-
"@deepseek-ai/dsh-client-ui-conversation"
|
|
28
|
-
],
|
|
29
|
-
"immediately": false
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
"scripts": {
|
|
33
|
-
"bundle": "tsdown && tsdown -c tsdown.host.config.ts",
|
|
34
|
-
"bundle:host": "tsdown -c tsdown.host.config.ts",
|
|
35
|
-
"bundle:client": "tsdown",
|
|
36
|
-
"watch": "tsdown --watch",
|
|
37
|
-
"deploy": "node deploy.mjs",
|
|
38
|
-
"typecheck": "tsc --noEmit",
|
|
39
|
-
"test": "node test/smoke.js && node test/verdict.test.js && node test/stages.test.js && node test/journal.test.js",
|
|
40
|
-
"prepublishOnly": "npx tsdown && npx tsdown -c tsdown.host.config.ts && node test/smoke.js && node test/verdict.test.js && node test/stages.test.js && node test/journal.test.js"
|
|
41
|
-
},
|
|
42
|
-
"files": [
|
|
43
|
-
"lib",
|
|
44
|
-
"cordis.patch.yml",
|
|
45
|
-
"README.md"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"@
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-plugin-teamflow",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "TeamFlow 团队研发流水线(TypeScript):需求→PRD→设计→架构→技术方案→并行开发→QA→验收;backlog 持久化 + 断点续跑 + 完成汇报 + 防假交付;Web 团队工作台(conversation.view tab + 拖拽看板)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./lib/host.mjs",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./lib/host.mjs",
|
|
9
|
+
"./host": "./lib/host.mjs",
|
|
10
|
+
"./client": "./lib/client.js",
|
|
11
|
+
"./store": "./lib/store.mjs",
|
|
12
|
+
"./descriptors": "./lib/descriptors.mjs",
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=22.18"
|
|
17
|
+
},
|
|
18
|
+
"dsh": {
|
|
19
|
+
"bundle": {
|
|
20
|
+
"patch": "./cordis.patch.yml"
|
|
21
|
+
},
|
|
22
|
+
"client": {
|
|
23
|
+
"platform": "web",
|
|
24
|
+
"inject": [
|
|
25
|
+
"@deepseek-ai/dsh-client-locale",
|
|
26
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
27
|
+
"@deepseek-ai/dsh-client-ui-conversation"
|
|
28
|
+
],
|
|
29
|
+
"immediately": false
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"bundle": "tsdown && tsdown -c tsdown.host.config.ts",
|
|
34
|
+
"bundle:host": "tsdown -c tsdown.host.config.ts",
|
|
35
|
+
"bundle:client": "tsdown",
|
|
36
|
+
"watch": "tsdown --watch",
|
|
37
|
+
"deploy": "node deploy.mjs",
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"test": "node test/smoke.js && node test/verdict.test.js && node test/stages.test.js && node test/journal.test.js",
|
|
40
|
+
"prepublishOnly": "npx tsdown && npx tsdown -c tsdown.host.config.ts && node test/smoke.js && node test/verdict.test.js && node test/stages.test.js && node test/journal.test.js"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"lib",
|
|
44
|
+
"cordis.patch.yml",
|
|
45
|
+
"README.md",
|
|
46
|
+
"README.en.md",
|
|
47
|
+
"CHANGELOG.md"
|
|
48
|
+
],
|
|
49
|
+
"keywords": [
|
|
50
|
+
"dsh",
|
|
51
|
+
"deepseek-harness",
|
|
52
|
+
"plugin",
|
|
53
|
+
"teamflow",
|
|
54
|
+
"multi-agent",
|
|
55
|
+
"pipeline",
|
|
56
|
+
"agent-team",
|
|
57
|
+
"llm-agent",
|
|
58
|
+
"kanban",
|
|
59
|
+
"coding-agent"
|
|
60
|
+
],
|
|
61
|
+
"dependencies": {},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/node": "^26.2.0",
|
|
64
|
+
"@types/react": "^18.3.31",
|
|
65
|
+
"tsdown": "^0.22.2",
|
|
66
|
+
"typescript": "^6.0.3"
|
|
67
|
+
},
|
|
68
|
+
"peerDependencies": {
|
|
69
|
+
"react": "^18.2.0",
|
|
70
|
+
"@deepseek-ai/dsh-base": "*",
|
|
71
|
+
"@deepseek-ai/dsh-client-locale": "*",
|
|
72
|
+
"@deepseek-ai/dsh-client-runtime": "*",
|
|
73
|
+
"@deepseek-ai/dsh-client-ui-conversation": "*",
|
|
74
|
+
"@deepseek-ai/dsh-llm": "*",
|
|
75
|
+
"@deepseek-ai/dsh-tools": "*",
|
|
76
|
+
"@deepseek-ai/dsh-typert-protocol": "*"
|
|
77
|
+
},
|
|
78
|
+
"peerDependenciesMeta": {
|
|
79
|
+
"@deepseek-ai/dsh-base": { "optional": true },
|
|
80
|
+
"@deepseek-ai/dsh-client-locale": { "optional": true },
|
|
81
|
+
"@deepseek-ai/dsh-client-runtime": { "optional": true },
|
|
82
|
+
"@deepseek-ai/dsh-client-ui-conversation": { "optional": true },
|
|
83
|
+
"@deepseek-ai/dsh-llm": { "optional": true },
|
|
84
|
+
"@deepseek-ai/dsh-tools": { "optional": true },
|
|
85
|
+
"@deepseek-ai/dsh-typert-protocol": { "optional": true },
|
|
86
|
+
"react": { "optional": true }
|
|
87
|
+
},
|
|
88
|
+
"license": "MIT",
|
|
89
|
+
"repository": {
|
|
90
|
+
"type": "git",
|
|
91
|
+
"url": "https://github.com/MichaelShii/dsh-plugin-teamflow.git"
|
|
92
|
+
},
|
|
93
|
+
"homepage": "https://github.com/MichaelShii/dsh-plugin-teamflow",
|
|
94
|
+
"bugs": {
|
|
95
|
+
"url": "https://github.com/MichaelShii/dsh-plugin-teamflow/issues"
|
|
96
|
+
}
|
|
97
|
+
}
|