@nanmicoder/dsh-agent-teams 0.1.14 → 0.1.15

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/lib/index.js CHANGED
@@ -26,6 +26,7 @@ import { collectArchivedTeamsActivity, collectTeamsActivity } from "./snapshot.j
26
26
  import { findTeamByCaptain } from "./state.js";
27
27
  import { formatProfilesForPrompt } from "./profiles.js";
28
28
  import { qualityPlanningPrompt } from "./quality-gates.js";
29
+ import { authenticatedWebRoutes } from "./web-routes.js";
29
30
  /** Web-server service key candidates, newest first. */
30
31
  const WEB_SERVER_KEYS = ['webServer', 'httpServer'];
31
32
  /** Workspace registry service key candidates, newest first. */
@@ -159,10 +160,11 @@ export function apply(ctx, config) {
159
160
  const registerWebSurface = () => {
160
161
  if (webRegistered)
161
162
  return;
162
- const webServer = (ctx.get(WEB_SERVER_KEYS[0]) ?? ctx.get(WEB_SERVER_KEYS[1]));
163
+ const rawWebServer = (ctx.get(WEB_SERVER_KEYS[0]) ?? ctx.get(WEB_SERVER_KEYS[1]));
163
164
  const workspaceRegistry = (ctx.get(WORKSPACE_KEYS[0]) ?? ctx.get(WORKSPACE_KEYS[1]));
164
- if (webServer === undefined || workspaceRegistry === undefined)
165
+ if (rawWebServer === undefined || workspaceRegistry === undefined)
165
166
  return;
167
+ const webServer = authenticatedWebRoutes(rawWebServer, () => ctx.get('connection'));
166
168
  webRegistered = true;
167
169
  // Activity panel data route: the browser floater polls this for team
168
170
  // snapshots (disk truth + live subagent activity). Mirrors the Claude
@@ -19,7 +19,8 @@
19
19
  import type { ModelDirectoryResolver } from '@deepseek-ai/dsh-client-ui-model-selection/client';
20
20
  import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
21
21
  import type { SessionId } from '@deepseek-ai/dsh-session/types';
22
- import type { ObservableSnapshot, SessionListState } from '@deepseek-ai/dsh-client-runtime/client';
22
+ import type { ObservableSnapshot } from '@deepseek-ai/dsh-client-store';
23
+ import type { SessionListState } from '@deepseek-ai/dsh-api-session-controller/client';
23
24
  /** The top-right activity floater. Teams follow the current session: live
24
25
  * snapshots and historic card summaries are only shown while their captain
25
26
  * session is the one currently open. */
@@ -10,7 +10,7 @@
10
10
  * the card survives restarts without writing an out-of-repo event type.
11
11
  * @module dsh-agent-teams/client/card
12
12
  */
13
- import type { ConversationNodeDefinition } from '@deepseek-ai/dsh-client-runtime/client';
13
+ import type { ConversationNodeDefinition } from '@deepseek-ai/dsh-client-ui-conversation/client';
14
14
  /** Final keyed Chat payload for the team summary card. */
15
15
  export interface AgentTeamsCardData {
16
16
  readonly teamId: string;
@@ -23,7 +23,7 @@ export interface AgentTeamsCardData {
23
23
  readonly role: string;
24
24
  }[];
25
25
  }
26
- declare module '@deepseek-ai/dsh-client-ui-conversation/client' {
26
+ declare module '@deepseek-ai/dsh-client-ui-chat/client' {
27
27
  interface ChatNodeDataMap {
28
28
  /** Lightweight team summary card anchoring the conversation. */
29
29
  'agent-teams': AgentTeamsCardData;
@@ -1,5 +1,5 @@
1
1
  /** Browser plugin for the AgentTeams activity floater and conversation card. */
2
- import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client';
2
+ import type { Context as ClientContext } from '@deepseek-ai/cordis';
3
3
  import { type AgentTeamsLocaleKey } from './locales.ts';
4
4
  declare module '@deepseek-ai/dsh-client-ui-slots' {
5
5
  interface LocaleNamespaceMap {
@@ -1,5 +1,6 @@
1
1
  /** Version-tolerant navigation into durable AgentTeams member transcripts. */
2
- import type { SessionId, SubagentAddress } from '@deepseek-ai/dsh-client-runtime/client';
2
+ import type { SessionId } from '@deepseek-ai/dsh-session/types';
3
+ import type { SubagentAddress } from '@deepseek-ai/dsh-subagent/client';
3
4
  /** Narrow sessions-service face used by the activity panel and team card. */
4
5
  export interface AgentTeamsSessionNavigator {
5
6
  /** Legacy/ordinary session navigation. */
@@ -0,0 +1,13 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { HostConnectionService } from '@deepseek-ai/dsh-client-connection';
3
+ /** Public WebServer route surface used by the plugin. */
4
+ export interface WebRouteHost {
5
+ register(route: {
6
+ kind: 'exact' | 'prefix';
7
+ path: string;
8
+ handler: (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;
9
+ }): () => void;
10
+ }
11
+ export type BrowserRequestGate = Pick<HostConnectionService, 'requestRejection'>;
12
+ /** Raw WebServer routes do not inherit Connection's authentication fence. */
13
+ export declare function authenticatedWebRoutes(server: WebRouteHost, connection: () => BrowserRequestGate | undefined): WebRouteHost;
@@ -0,0 +1,26 @@
1
+ /** Raw WebServer routes do not inherit Connection's authentication fence. */
2
+ export function authenticatedWebRoutes(server, connection) {
3
+ return {
4
+ register(route) {
5
+ return server.register({
6
+ ...route,
7
+ async handler(req, res) {
8
+ const gate = connection();
9
+ // Missing/disposing Connection is an assembly failure, never an
10
+ // invitation to expose workspace state or accept plan mutations.
11
+ const rejection = gate === undefined ? 503 : gate.requestRejection(req);
12
+ if (rejection !== undefined) {
13
+ res.writeHead(rejection, {
14
+ 'content-type': 'application/json; charset=utf-8',
15
+ 'cache-control': 'no-store',
16
+ });
17
+ res.end(JSON.stringify({ error: rejection === 503 ? 'authentication unavailable'
18
+ : rejection === 401 ? 'unauthorized' : 'forbidden' }));
19
+ return;
20
+ }
21
+ await route.handler(req, res);
22
+ },
23
+ });
24
+ },
25
+ };
26
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanmicoder/dsh-agent-teams",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "description": "AgentTeams for DeepSeek Harness: multi-agent team collaboration (captain, members, tasks with dependencies, messaging) driven by natural language, with a tree monitor in the web GUI",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -56,6 +56,7 @@
56
56
  },
57
57
  "publishConfig": {
58
58
  "access": "public",
59
+ "tag": "latest",
59
60
  "registry": "https://registry.npmjs.org/"
60
61
  },
61
62
  "dsh": {
@@ -65,10 +66,12 @@
65
66
  "client": {
66
67
  "inject": [
67
68
  "@deepseek-ai/dsh-client-locale",
68
- "@deepseek-ai/dsh-client-runtime",
69
69
  "@deepseek-ai/dsh-client-ui-conversation",
70
70
  "@deepseek-ai/dsh-client-ui-layout",
71
- "@deepseek-ai/dsh-client-ui-model-selection"
71
+ "@deepseek-ai/dsh-client-ui-model-selection",
72
+ "@deepseek-ai/dsh-api-session-controller",
73
+ "@deepseek-ai/dsh-client-ui-session",
74
+ "@deepseek-ai/dsh-client-ui-chat"
72
75
  ],
73
76
  "platform": "web"
74
77
  }
@@ -78,26 +81,35 @@
78
81
  "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit",
79
82
  "sync:skill": "node scripts/sync-skill.mjs",
80
83
  "verify:skill": "node scripts/sync-skill.mjs --check",
81
- "verify": "node scripts/verify.mjs && node scripts/fallback-tdd.mjs && node scripts/quality-gates-tdd.mjs && node scripts/lifecycle-verify.mjs && node scripts/stress-verify.mjs && pnpm verify:skill",
82
- "prepublishOnly": "pnpm build && pnpm verify"
84
+ "verify": "node scripts/verify.mjs && node scripts/fallback-tdd.mjs && node scripts/quality-gates-tdd.mjs && node scripts/lifecycle-verify.mjs && node scripts/stress-verify.mjs && pnpm verify:web-routes && pnpm verify:release && pnpm verify:skill",
85
+ "prepublishOnly": "pnpm build && pnpm verify",
86
+ "verify:web-routes": "node scripts/web-routes-verify.mjs",
87
+ "verify:release": "node --test scripts/release-metadata.test.mjs"
83
88
  },
84
89
  "peerDependencies": {
85
- "@deepseek-ai/cordis": "^4.0.1-rc.1",
86
- "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
87
- "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6",
88
- "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6",
89
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.0-rc.6",
90
- "@deepseek-ai/dsh-client-ui-layout": "^0.1.0-rc.6",
91
- "@deepseek-ai/dsh-client-ui-model-selection": "^0.1.0-rc.8",
92
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.6",
93
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6",
94
- "@deepseek-ai/dsh-commands": "^0.1.0-rc.6",
95
- "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
96
- "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
97
- "@deepseek-ai/dsh-subagent": "^0.1.0-rc.6",
98
- "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
99
- "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
100
- "@deepseek-ai/schemastery": "^3.18.1-rc.1",
90
+ "@deepseek-ai/cordis": "^4.0.2",
91
+ "@deepseek-ai/dsh-agent": "^0.1.2-alpha.2",
92
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.2-alpha.2",
93
+ "@deepseek-ai/dsh-client-connection": "^0.1.2-alpha.2",
94
+ "@deepseek-ai/dsh-client-locale": "^0.1.2-alpha.2",
95
+ "@deepseek-ai/dsh-client-store": "^0.1.2-alpha.2",
96
+ "@deepseek-ai/dsh-client-ui-chat": "^0.1.2-alpha.2",
97
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-alpha.2",
98
+ "@deepseek-ai/dsh-client-ui-layout": "^0.1.2-alpha.2",
99
+ "@deepseek-ai/dsh-client-ui-model-selection": "^0.1.2-alpha.2",
100
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-alpha.2",
101
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-alpha.2",
102
+ "@deepseek-ai/dsh-client-ui-session": "^0.1.2-alpha.2",
103
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-alpha.2",
104
+ "@deepseek-ai/dsh-commands": "^0.1.2-alpha.2",
105
+ "@deepseek-ai/dsh-llm": "^0.1.2-alpha.2",
106
+ "@deepseek-ai/dsh-session": "^0.1.2-alpha.2",
107
+ "@deepseek-ai/dsh-session-projection": "^0.1.2-alpha.2",
108
+ "@deepseek-ai/dsh-subagent": "^0.1.2-alpha.2",
109
+ "@deepseek-ai/dsh-system-prompt": "^0.1.2-alpha.2",
110
+ "@deepseek-ai/dsh-tools": "^0.1.2-alpha.2",
111
+ "@deepseek-ai/dsh-util-values": "^0.1.2-alpha.2",
112
+ "@deepseek-ai/schemastery": "^3.18.2",
101
113
  "react": "^18.2.0"
102
114
  },
103
115
  "peerDependenciesMeta": {
@@ -107,10 +119,19 @@
107
119
  "@deepseek-ai/dsh-agent": {
108
120
  "optional": true
109
121
  },
122
+ "@deepseek-ai/dsh-api-session-controller": {
123
+ "optional": true
124
+ },
125
+ "@deepseek-ai/dsh-client-connection": {
126
+ "optional": true
127
+ },
110
128
  "@deepseek-ai/dsh-client-locale": {
111
129
  "optional": true
112
130
  },
113
- "@deepseek-ai/dsh-client-runtime": {
131
+ "@deepseek-ai/dsh-client-store": {
132
+ "optional": true
133
+ },
134
+ "@deepseek-ai/dsh-client-ui-chat": {
114
135
  "optional": true
115
136
  },
116
137
  "@deepseek-ai/dsh-client-ui-conversation": {
@@ -125,6 +146,12 @@
125
146
  "@deepseek-ai/dsh-client-ui-primitives": {
126
147
  "optional": true
127
148
  },
149
+ "@deepseek-ai/dsh-client-ui-renderer": {
150
+ "optional": true
151
+ },
152
+ "@deepseek-ai/dsh-client-ui-session": {
153
+ "optional": true
154
+ },
128
155
  "@deepseek-ai/dsh-client-ui-slots": {
129
156
  "optional": true
130
157
  },
@@ -137,6 +164,9 @@
137
164
  "@deepseek-ai/dsh-session": {
138
165
  "optional": true
139
166
  },
167
+ "@deepseek-ai/dsh-session-projection": {
168
+ "optional": true
169
+ },
140
170
  "@deepseek-ai/dsh-subagent": {
141
171
  "optional": true
142
172
  },
@@ -146,6 +176,9 @@
146
176
  "@deepseek-ai/dsh-tools": {
147
177
  "optional": true
148
178
  },
179
+ "@deepseek-ai/dsh-util-values": {
180
+ "optional": true
181
+ },
149
182
  "@deepseek-ai/schemastery": {
150
183
  "optional": true
151
184
  },
@@ -154,23 +187,31 @@
154
187
  }
155
188
  },
156
189
  "devDependencies": {
157
- "@deepseek-ai/cordis": "^4.0.1",
158
- "@deepseek-ai/dsh-agent": "0.1.0-rc.8",
159
- "@deepseek-ai/dsh-client-locale": "0.1.0-rc.8",
160
- "@deepseek-ai/dsh-client-runtime": "0.1.0-rc.8",
161
- "@deepseek-ai/dsh-client-ui-conversation": "0.1.0-rc.8",
162
- "@deepseek-ai/dsh-client-ui-layout": "0.1.0-rc.8",
163
- "@deepseek-ai/dsh-client-ui-model-selection": "0.1.0-rc.8",
164
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.0-rc.8",
165
- "@deepseek-ai/dsh-client-ui-slots": "0.1.0-rc.8",
166
- "@deepseek-ai/dsh-commands": "0.1.0-rc.8",
167
- "@deepseek-ai/dsh-llm": "0.1.0-rc.8",
168
- "@deepseek-ai/dsh-session": "0.1.0-rc.8",
169
- "@deepseek-ai/dsh-subagent": "0.1.0-rc.8",
170
- "@deepseek-ai/dsh-system-prompt": "0.1.0-rc.8",
171
- "@deepseek-ai/dsh-tools": "0.1.0-rc.8",
172
- "@deepseek-ai/dsh-workspace": "0.1.0-rc.8",
173
- "@deepseek-ai/schemastery": "^3.18.1",
190
+ "@deepseek-ai/cordis": "^4.0.2",
191
+ "@deepseek-ai/dsh": "0.1.2-alpha.2",
192
+ "@deepseek-ai/dsh-agent": "0.1.2-alpha.2",
193
+ "@deepseek-ai/dsh-api-session-controller": "0.1.2-alpha.2",
194
+ "@deepseek-ai/dsh-client-connection": "0.1.2-alpha.2",
195
+ "@deepseek-ai/dsh-client-locale": "0.1.2-alpha.2",
196
+ "@deepseek-ai/dsh-client-store": "0.1.2-alpha.2",
197
+ "@deepseek-ai/dsh-client-ui-chat": "0.1.2-alpha.2",
198
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.2-alpha.2",
199
+ "@deepseek-ai/dsh-client-ui-layout": "0.1.2-alpha.2",
200
+ "@deepseek-ai/dsh-client-ui-model-selection": "0.1.2-alpha.2",
201
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.2-alpha.2",
202
+ "@deepseek-ai/dsh-client-ui-renderer": "0.1.2-alpha.2",
203
+ "@deepseek-ai/dsh-client-ui-session": "0.1.2-alpha.2",
204
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.2-alpha.2",
205
+ "@deepseek-ai/dsh-commands": "0.1.2-alpha.2",
206
+ "@deepseek-ai/dsh-llm": "0.1.2-alpha.2",
207
+ "@deepseek-ai/dsh-session": "0.1.2-alpha.2",
208
+ "@deepseek-ai/dsh-session-projection": "0.1.2-alpha.2",
209
+ "@deepseek-ai/dsh-subagent": "0.1.2-alpha.2",
210
+ "@deepseek-ai/dsh-system-prompt": "0.1.2-alpha.2",
211
+ "@deepseek-ai/dsh-tools": "0.1.2-alpha.2",
212
+ "@deepseek-ai/dsh-util-values": "0.1.2-alpha.2",
213
+ "@deepseek-ai/dsh-workspace": "0.1.2-alpha.2",
214
+ "@deepseek-ai/schemastery": "^3.18.2",
174
215
  "@types/node": "^24.13.3",
175
216
  "@types/react": "~18.3.1",
176
217
  "@types/react-dom": "^18.3.7",
@@ -0,0 +1,61 @@
1
+ # AgentTeams v0.1.15-alpha.1
2
+
3
+ ## Compatibility first
4
+
5
+ **Requires DeepSeek Harness 0.1.2-alpha.2.** This is an opt-in Alpha release,
6
+ published to npm **alpha**. **latest remains 0.1.14** for the previous host line.
7
+ There is no dual-version adapter and the plugin does not upgrade Harness for you.
8
+
9
+ ```sh
10
+ # First verify that the Harness instance you run is 0.1.2-alpha.2.
11
+ dsh --version
12
+ dsh plugin --profile web add @nanmicoder/dsh-agent-teams@0.1.15-alpha.1
13
+ ```
14
+
15
+ Keep a working older host/plugin pair if you cannot update Harness. The previous
16
+ baseline was Harness **0.1.0-rc.8 + plugin 0.1.14**:
17
+
18
+ ```sh
19
+ dsh plugin --profile web add @nanmicoder/dsh-agent-teams@0.1.14
20
+ ```
21
+
22
+ Restart the matching host and refresh the browser. Source users must update and
23
+ rebuild the actual Harness checkout too. See the README for upgrade and rollback
24
+ instructions; neither every older RC nor future Alpha versions are claimed as supported.
25
+
26
+ ## Changes
27
+
28
+ - Restore the Web client on Alpha.2 using its current conversation, session,
29
+ store and subagent APIs; remove the retired client-runtime dependency.
30
+ - Pin the development dependency graph to Alpha.2 and validate the packaged plugin.
31
+ - Protect raw state, plan, halt and artwork routes with host authentication and
32
+ Host/Origin checks; fail closed when the Connection service is unavailable.
33
+ - Keep prereleases away from npm/GitHub latest through explicit channel metadata,
34
+ publication flags and regression checks.
35
+
36
+ ## Validation
37
+
38
+ Real DeepSeek API calls in `/tmp`, including a three-member order-settlement
39
+ workflow producing JSON, offline HTML and an independent review. Human UI tests
40
+ covered plan revision/approval/discard, invalid dependencies, member navigation,
41
+ interruption/continuation, refresh recovery, locales/themes and 390px layouts.
42
+ Model output mistakes required human correction and member continuation; this
43
+ does not claim unattended business correctness. See
44
+ [the acceptance record](https://github.com/NanmiCoder/dsh-agent-teams/blob/v0.1.15-alpha.1/docs/alpha2-release-acceptance.md).
45
+
46
+ Full build/verification and real HTTP authentication regression checks passed
47
+ locally. Real API/UI coverage is macOS arm64 + Alpha.2 + DeepSeek Flash; Docker
48
+ was unavailable. Linux Actions run the build and automated checks before publish.
49
+
50
+ ## 中文说明
51
+
52
+ 本版只对应 **Harness 0.1.2-alpha.2**,通过 **alpha** 渠道发布,
53
+ **latest 保留 0.1.14**。没有安装 Alpha.2、或实际运行的 Harness 源码未更新,
54
+ 请保留原先可用的旧插件;原验证基线为宿主 0.1.0-rc.8 + 插件 0.1.14。
55
+ 升级插件不会自动升级宿主。更新后必须重启对应宿主并刷新浏览器;
56
+ 回退时也要匹配宿主与插件版本,不需要删除凭据或团队数据。
57
+
58
+ 本次修复 Alpha.2 下插件无法加载的问题,并补齐 Web 路由认证。
59
+ 已用真实 API 完成订单分析、报表生成和独立复核,并在真实 UI 中验证计划审核、
60
+ 修改、取消、成员续跑、刷新、多语言、主题和手机宽度。
61
+ 业务产物曾出现模型执行偏差,已通过人工反馈和成员续跑修正,详见验收记录。
@@ -0,0 +1,57 @@
1
+ # AgentTeams v0.1.15
2
+
3
+ **The default install now supports DeepSeek Harness 0.1.2-alpha.2.**
4
+ This release publishes to npm **latest** and is the latest GitHub release.
5
+ It replaces the opt-in-only release policy of 0.1.15-alpha.1, with no plugin
6
+ runtime changes.
7
+
8
+ ## Install / upgrade
9
+
10
+ Use the current supported Harness developer preview and the latest plugin:
11
+
12
+ ```sh
13
+ npm install --global @deepseek-ai/dsh@0.1.2-alpha.2
14
+ dsh --version
15
+ dsh plugin --profile web add @nanmicoder/dsh-agent-teams@latest
16
+ ```
17
+
18
+ Use `@0.1.15` instead of `@latest` to pin this release. Restart Harness and
19
+ refresh the browser after updating. The host's Alpha.2 version does not
20
+ require a separate Alpha plugin channel.
21
+
22
+ ## Older hosts
23
+
24
+ If Harness must stay on **0.1.0-rc.8**, install the historical plugin explicitly:
25
+
26
+ ```sh
27
+ dsh plugin --profile web add @nanmicoder/dsh-agent-teams@0.1.14
28
+ ```
29
+
30
+ Other older hosts should likewise pin their known-working plugin version;
31
+ they must not follow `@latest`. There is no dual-version adapter. Updating
32
+ the plugin does not update the running host, including a source-built host.
33
+ See the README for source-build and rollback instructions.
34
+
35
+ ## Included fixes and validation
36
+
37
+ - Alpha.2 Web client activation using current conversation, session and store APIs.
38
+ - Host authentication and Host/Origin checks on raw state, plan, halt and artwork routes.
39
+ - The same runtime previously exercised with real DeepSeek API calls, three-member
40
+ order-settlement delivery, and human UI review in `/tmp`.
41
+ - Rebuild, full automated verification and runtime-payload comparison for this
42
+ release. This publication-policy change does not claim a second full business run.
43
+
44
+ See the [real API / UI acceptance record](https://github.com/NanmiCoder/dsh-agent-teams/blob/v0.1.15/docs/alpha2-release-acceptance.md)
45
+ for the recovered model mistakes, screenshots methodology and environment limits.
46
+
47
+ ## 中文说明
48
+
49
+ **默认最新插件 0.1.15 适配 Harness 0.1.2-alpha.2,发布到 `latest`。**
50
+ Harness 本身处于开发者预览阶段,插件默认发行跟进当前已适配的新宿主;
51
+ 不再因为宿主带 Alpha 名称,就把适配放到必须主动选择的插件 Alpha 渠道。
52
+
53
+ 新宿主使用插件 `@latest`(当前为 0.1.15);旧宿主应安装明确兼容的固定版本,
54
+ 例如 Harness 0.1.0-rc.8 使用插件 `@0.1.14`。没有更新 Harness 源码或安装版本的用户,
55
+ 不要只把插件更新到 latest。中英文 README 已给出完整操作方法。
56
+
57
+ 本次调整版本、发行渠道和文档,运行时代码与此前真实业务 / UI 验收的 Alpha.2 适配一致。