tianshu-mcp 0.7.4 → 0.7.6
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.en.md +107 -5
- package/CHANGELOG.md +79 -4
- package/README.en.md +406 -482
- package/README.md +381 -459
- package/assets/mcp-running.png +0 -0
- package/assets/tianshu-mcp-banner.svg +120 -65
- package/assets/tianshu-mcp-gui-agent-log.png +0 -0
- package/assets/tianshu-mcp-gui-event-stream.png +0 -0
- package/assets/tianshu-mcp-gui-overview.png +0 -0
- package/dist/agents/qoder/cdp.js +16 -0
- package/dist/agents/qoder/model.js +49 -30
- package/dist/agents/qoder/selectors.js +33 -17
- package/dist/agents/qoder/workspace.js +76 -11
- package/dist/agents/zcode/cdp.js +128 -22
- package/dist/agents/zcode/model.js +100 -2
- package/dist/agents/zcode/run.js +244 -26
- package/dist/agents/zcode/selectors.js +22 -4
- package/dist/mcp/handlers.js +11 -3
- package/dist/verify/runner.js +21 -1
- package/dist/version.generated.js +1 -1
- package/docs/gui-log-viewer.en.md +31 -3
- package/docs/gui-log-viewer.md +23 -3
- package/docs/qoder-cdp.en.md +9 -3
- package/docs/qoder-cdp.md +9 -3
- package/package.json +1 -1
- package/skills/tianshu-mcp/SKILL.md +3 -1
package/CHANGELOG.en.md
CHANGED
|
@@ -8,6 +8,84 @@ Chinese version: [CHANGELOG.md](CHANGELOG.md)
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
## [0.7.6] - 2026-09-30
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **Three ZCode adapter defects (issue #27), reproduced and fixed on real ZCode `3.14.3.7762` (Windows)**:
|
|
16
|
+
- **Split project-collection channels causing a binding deadlock**: on 3.14.3 the
|
|
17
|
+
`[data-testid^="workspace-item-"]` nodes are **not gone from the DOM** — they are scrolled out of
|
|
18
|
+
the viewport instead (measured on the real machine: **40 of 42 nodes invisible**). The old
|
|
19
|
+
implementation collected them without any visibility filter, so the ghost entries made
|
|
20
|
+
`if (!out.length)` permanently false and the only trustworthy channel (the dropdown menu) never
|
|
21
|
+
ran. `matchZcodeProject` then matched a ghost item, the working auto-import branch was skipped,
|
|
22
|
+
and the task died with `project_mismatch`. `projects()` now filters the legacy channel by
|
|
23
|
+
visibility, **always merges both channels**, and lets same-named menu items override sidebar
|
|
24
|
+
entries (only the menu's `aria-checked` is binding evidence rendered by ZCode itself).
|
|
25
|
+
- **Fall back to import when clicks never land**: `clickProject` now reports a distinguishable
|
|
26
|
+
reason (`trigger-unavailable` / `not-found` / `not-visible`). When the target is listed but not a
|
|
27
|
+
single click ever landed, the adapter falls back to the `selectZcodeFolder` import path instead
|
|
28
|
+
of declaring failure (still fail-closed when `allowCreateProject=false`).
|
|
29
|
+
- **Runtime CDP disconnects no longer declare death**: a single `Runtime.evaluate` timeout or an
|
|
30
|
+
endpoint hiccup does not mean CDP is dead (in the reported incident the agent kept writing
|
|
31
|
+
artifacts after MCP had already failed the task). The send phase and the runtime loop now share
|
|
32
|
+
one guard: the first disconnect reconnects **once, for observation only** (matching the existing
|
|
33
|
+
`codex`/`qoder` pattern — **never resending the task**); a failed reconnect or a second
|
|
34
|
+
disconnect lands on `needs_user(setup_recovery)` with both facts attached — whether the process
|
|
35
|
+
is still alive and whether the window still shows running signals — so "still running" is never
|
|
36
|
+
misread as "stopped".
|
|
37
|
+
- **`reasoningLevel` implemented end to end**: the tier set **varies per model**, so it is read
|
|
38
|
+
from the UI **after the model is confirmed** and validated. Out-of-range tiers and unreadable
|
|
39
|
+
tier sets are rejected **before sending** (`reasoning_level_invalid`) instead of silently reusing
|
|
40
|
+
the current value; omitting the tier never touches the UI. Real-machine contract:
|
|
41
|
+
trigger `chat-thought-level-select-trigger` (combobox), options
|
|
42
|
+
`chat-thought-level-select-item-{enabled,disabled}` (binary on/off), options mounted only while
|
|
43
|
+
the menu is open.
|
|
44
|
+
- **Root cause of the "two-level model menu is flaky" symptom**: model items live in the provider
|
|
45
|
+
group's **second-level submenu**, which renders only on **hover** — clicking selects the group
|
|
46
|
+
itself or collapses the menu. The provider group testid has also drifted to
|
|
47
|
+
`chat-model-select-group-registry-provider:`. Group expansion now uses hover
|
|
48
|
+
(`clickExact(..., "hover")`), and when two rounds both yield an empty candidate list the menu is
|
|
49
|
+
reopened for one more round instead of declaring `model_unavailable`.
|
|
50
|
+
- **Permission-menu contract drift (surfaced by the real-machine run, fixed as the same class of defect)**:
|
|
51
|
+
on 3.14.3 the permission items use `menuitemradio` / `menuitemcheckbox` (**not** `option`), and the
|
|
52
|
+
visible name lives in the item's **direct text node**, followed by an explanatory sentence
|
|
53
|
+
(e.g. "Full access — fewer confirmations."). Both mismatched the old implementation and stalled
|
|
54
|
+
dispatch at `permission_unknown`. The selector now carries a role-agnostic fallback, and
|
|
55
|
+
`clickExact` resolves labels from direct text nodes first.
|
|
56
|
+
|
|
57
|
+
### Real-machine verification
|
|
58
|
+
|
|
59
|
+
- `npm run probe:zcode -- dom-contracts`: `workspaceItems=42` (2 visible / 40 invisible),
|
|
60
|
+
`dataProjectPath=0`; with the menu open `projects()` returns the menu items with correct checked
|
|
61
|
+
state — independently reproducing both the issue's geometric premise and the fixed collection.
|
|
62
|
+
- `npm run probe:zcode -- models` / `permission` plus one-off probes: pinned the provider-group hover
|
|
63
|
+
semantics, the permission item role/text structure, and the binary tier shape
|
|
64
|
+
(`current=on`, `tiers=Off/On`).
|
|
65
|
+
- `npm run smoke:zcode`: end-to-end real-machine dispatch (project binding → model switch →
|
|
66
|
+
permission confirm → send → poll to terminal state).
|
|
67
|
+
|
|
68
|
+
## [0.7.5] - 2026-09-29
|
|
69
|
+
|
|
70
|
+
### Fixed
|
|
71
|
+
|
|
72
|
+
- **Qoder CN 0.4.2/0.4.3 support** (PR #26, contributed by jian-in): from 0.4.2 the model menu drops
|
|
73
|
+
the "default/custom" group tabs (candidates become a flat list and the model name moves to the trigger
|
|
74
|
+
text); in 0.4.3 the composer picker loses its `aria-label` and the bound-workspace container loses its
|
|
75
|
+
`title`. The selector candidate order now puts the stable marker `[data-workspace-picker-trigger]` before
|
|
76
|
+
the broad aria heuristic (otherwise it matches the sidebar "Workspace" section header and surfaces as
|
|
77
|
+
`qoder_stage_timeout: workspace-menu`); the "menu is open" check is narrowed to the search box
|
|
78
|
+
`workspaceSearch` (a generic `[role=menu][data-state=open]` can be matched by an unrelated overlay and
|
|
79
|
+
pass falsely); bound-workspace readback lists title-less container candidates and falls back to
|
|
80
|
+
`aria-label`/text. `QoderCdpClient` gains `resolveKey()`/`textKey()` for compound queries that need the
|
|
81
|
+
first matching candidate.
|
|
82
|
+
- **Verify engine normalises the `cwd` drive-letter case on Windows** (same PR): a project path may be
|
|
83
|
+
registered with a lowercase drive letter (e.g. `e:/proj` in `projects.json`), and vite/vitest key their
|
|
84
|
+
module graph by path string, so `e:\proj` and `E:\proj` count as two locations, the same module appears
|
|
85
|
+
twice, and collection crashes. `runVerifyCommand` now normalises with `fs.realpathSync.native` before
|
|
86
|
+
spawning (the non-native variant returns the lowercase drive letter unchanged on Windows); when the path
|
|
87
|
+
cannot be resolved it falls back to the original value, so normalisation never blocks acceptance.
|
|
88
|
+
|
|
11
89
|
## [0.7.4] - 2026-09-28
|
|
12
90
|
|
|
13
91
|
### Fixed
|
|
@@ -191,11 +269,35 @@ Chinese version: [CHANGELOG.md](CHANGELOG.md)
|
|
|
191
269
|
- ARCHITECTURE / README / agent-profiles / adapter-matrix / SKILL / usage-examples (both languages): the status moves from "in development" to "wired", and the new `endReason` / `needsUserKind` values are added.
|
|
192
270
|
- Versions: `package.json` and `src/version.generated.ts` are synced to `0.7.1` (per the `+0.0.1` rule); tag `v0.7.1` pushed and published to npm.
|
|
193
271
|
|
|
194
|
-
## [
|
|
195
|
-
|
|
196
|
-
> This
|
|
197
|
-
> model, acceptance engine and all of `src/**`) is
|
|
198
|
-
> **
|
|
272
|
+
## [0.1.0] — 2026-09-29 — mcp-gui independent line
|
|
273
|
+
|
|
274
|
+
> This is the **first stable release** of the GUI's independent version line (going stable + update log panel).
|
|
275
|
+
> The MCP package's runtime logic (tool contracts, task model, acceptance engine and all of `src/**`) is
|
|
276
|
+
> **unchanged**, and the package version stays at `0.7.4`; the GUI evolves independently with its own version
|
|
277
|
+
> numbers and its own tags (`gui-v*`).
|
|
278
|
+
>
|
|
279
|
+
> **Three categories of change relative to `0.1.0-beta.9`**:
|
|
280
|
+
>
|
|
281
|
+
> 1. **New update log panel**: a dedicated desktop update window ("Update log") that pops up automatically when the
|
|
282
|
+
> silent startup check finds a new version that has not been ignored. It offers `Download and install` /
|
|
283
|
+
> `Ignore this version` / `Later`. "Ignore this version" suppresses the **automatic** prompt only (a manual
|
|
284
|
+
> "Check for updates" still shows that version, a higher version re-prompts, and the record is persisted in app
|
|
285
|
+
> preferences). The window states **which source will be used** (the result of concurrently probing Gitee /
|
|
286
|
+
> GitHub and picking by latency, with an explicit degradation notice when neither is reachable). Its body is the
|
|
287
|
+
> **bilingual release note** for that version (composed from `docs/release-gui-v<version>.md` + `.en.md`, rendered
|
|
288
|
+
> as Markdown with inline HTML disabled). The window size follows the maintainer's annotation:
|
|
289
|
+
> `min(1070px,92vw)` × `min(750px,88vh)`. Adds `mcp-gui/src/core/version.ts` (version comparison and ignore
|
|
290
|
+
> decisions, 16 unit tests) and `mcp-gui/src/components/UpdateDialog.vue`; `Preferences` gains
|
|
291
|
+
> `ignored_update_version` (with a serde default so an old preferences file is not reset wholesale).
|
|
292
|
+
> 2. **Release pipeline now supports stable releases**: the tag filter in `.github/workflows/gui.yml` widens from
|
|
293
|
+
> `gui-v*-beta.*` to **`gui-v*`**, so stable and preview builds share one pipeline; a new step decides the
|
|
294
|
+
> pre-release flag from the tag shape (only tags containing `-beta.` / `-rc.` pass `--prerelease`); a new
|
|
295
|
+
> `scripts/gui-release-body.mjs` composes the bilingual release body (used via `--notes-file` on GitHub and
|
|
296
|
+
> `--body-file` on Gitee, so both sides are **byte-identical in content**, and a missing doc **exits non-zero**).
|
|
297
|
+
> 3. **Version and wording go stable**: the GUI version is unified to `0.1.0` in all four places
|
|
298
|
+
> (`package.json` / `package-lock.json` / `tauri.conf.json` / `Cargo.toml`); the UI label
|
|
299
|
+
> "Beta channel (pre-release)" becomes "Stable channel / 正式版通道"; and every hard-coded "beta" wording in
|
|
300
|
+
> `gitee-gui-release.mjs` and `gui.yml` is removed.
|
|
199
301
|
> (`0.1.0-beta.N`) and its own tag (`gui-v*`).
|
|
200
302
|
|
|
201
303
|
### Added
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,62 @@
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [0.7.6] - 2026-09-30
|
|
11
|
+
|
|
12
|
+
### 修复
|
|
13
|
+
|
|
14
|
+
- **ZCode 适配器三项缺陷(issue #27),已在真机 ZCode `3.14.3.7762`(Windows)上复现并修复**:
|
|
15
|
+
- **项目采集渠道分裂导致绑定死锁**:3.14.3 上 `[data-testid^="workspace-item-"]` **并未从 DOM 消失**,
|
|
16
|
+
只是被滚出视口(真机实测 **42 个节点中 40 个不可见**)。旧实现采集时不做可见性过滤,幽灵项入列使
|
|
17
|
+
`if (!out.length)` 短路恒为假,唯一可信的菜单渠道永不执行 → `matchZcodeProject` 命中幽灵项 →
|
|
18
|
+
可用的自动导入分支被跳过 → 任务卡死在 `project_mismatch`。现在 `projects()` 对旧契约项做可见性过滤、
|
|
19
|
+
两条渠道**始终合并**,且同名的菜单项覆盖侧边栏项(只有菜单的 `aria-checked` 是 ZCode 自己渲染的绑定证据)。
|
|
20
|
+
- **点击落空时回落导入**:`clickProject` 现在返回可区分的原因(`trigger-unavailable` / `not-found` /
|
|
21
|
+
`not-visible`);目标项在列表里却一次都没真正点中时,回落 `selectZcodeFolder` 导入路径而不是直接判死
|
|
22
|
+
(`allowCreateProject=false` 时仍在下一道闸门 fail-closed)。
|
|
23
|
+
- **运行期 CDP 断连不再判死**:单次 `Runtime.evaluate` 超时或端点抖动不等于 CDP 已死(issue 现场是
|
|
24
|
+
「MCP 判定失败后 agent 仍在写产物」)。发送阶段与运行期统一护栏:首次断连重连**观察一次**
|
|
25
|
+
(对齐 `codex`/`qoder` 的既有范式,重连只用于观察、**绝不重发任务**),重连失败或再次断连落
|
|
26
|
+
`needs_user(setup_recovery)`,并附「进程是否仍在」「窗口是否仍有运行信号」两侧事实,避免把「仍在跑」
|
|
27
|
+
误读成「已停」。
|
|
28
|
+
- **`reasoningLevel` 端到端实现**:档位集合**随模型变化**,因此在**模型确认之后**才读取界面实际渲染的选项
|
|
29
|
+
并校验;越权档位与「集合读不到」都在**发送前**报错(`reasoning_level_invalid`),绝不静默沿用;
|
|
30
|
+
未指定档位时完全不触碰界面。真机契约:触发器 `chat-thought-level-select-trigger`(combobox),
|
|
31
|
+
选项 `chat-thought-level-select-item-{enabled,disabled}`(二值 开启/关闭),选项只在菜单展开时挂载。
|
|
32
|
+
- **「两级模型菜单点击不稳」根因**:模型项在 provider 分组的**二级子菜单**里,**必须 hover 分组**才渲染,
|
|
33
|
+
用 click 会选中分组本身或收起菜单;provider 分组 testid 也已漂移为
|
|
34
|
+
`chat-model-select-group-registry-provider:`。现在展开分组改用 hover(`clickExact(..., "hover")`),
|
|
35
|
+
并在两轮候选皆空时把菜单重开一次再试一轮,不凭一轮空列表判 `model_unavailable`。
|
|
36
|
+
- **权限菜单契约漂移(真机测试暴露,同类问题一并修复)**:3.14.3 的权限项 role 是
|
|
37
|
+
`menuitemradio` / `menuitemcheckbox`(**不是** `option`),且可见名写在项内的**直接文本节点**里、
|
|
38
|
+
后面还跟一句说明(如「完全访问减少确认次数。」)。旧实现两处都会 0 命中,导致派发卡在 `permission_unknown`。
|
|
39
|
+
候选选择器补无 role 限制的兜底,`clickExact` 的标签解析优先取直接文本节点。
|
|
40
|
+
|
|
41
|
+
### 真机验证
|
|
42
|
+
|
|
43
|
+
- `npm run probe:zcode -- dom-contracts`:`workspaceItems=42`(可见 2 / 不可见 40)、`dataProjectPath=0`、
|
|
44
|
+
菜单展开后 `projects()` 返回菜单项且勾选态正确 —— 独立复现了 issue 的几何前提与修复后的采集结果。
|
|
45
|
+
- `npm run probe:zcode -- models` / `permission` 与一次性探针:锁定 provider 分组 hover 语义、
|
|
46
|
+
权限项 role 与文本结构、档位二值形态(`current=on`、`tiers=Off/On`)。
|
|
47
|
+
- `npm run smoke:zcode`:真机端到端派发(项目绑定 → 模型切换 → 权限确认 → 发送 → 轮询终态)。
|
|
48
|
+
|
|
49
|
+
## [0.7.5] - 2026-09-29
|
|
50
|
+
|
|
51
|
+
### 修复
|
|
52
|
+
|
|
53
|
+
- **Qoder CN 0.4.2/0.4.3 适配**(PR #26,贡献者 jian-in):0.4.2 起模型菜单移除「默认/自定义」
|
|
54
|
+
分组 tab(候选为平铺列表、模型名移到触发器文本),0.4.3 的输入栏 picker 去掉 `aria-label`、
|
|
55
|
+
已绑定工作区容器去掉 `title`。选择器候选顺序把稳定标记 `[data-workspace-picker-trigger]`
|
|
56
|
+
提到宽泛 aria 启发式之前(否则会点中侧栏「工作区」区域头,表现为 `qoder_stage_timeout: workspace-menu`);
|
|
57
|
+
「菜单已打开」判定收窄为只认搜索框 `workspaceSearch`(泛化的 `[role=menu][data-state=open]`
|
|
58
|
+
会被无关浮层误命中而假通过);已绑定工作区读回并列无 `title` 容器候选并回退 `aria-label`/文本。
|
|
59
|
+
`QoderCdpClient` 新增 `resolveKey()`/`textKey()`,供组合式查询取首个命中候选。
|
|
60
|
+
- **验收引擎在 Windows 上归一 check 的 `cwd` 盘符大小写**(同 PR):项目路径可能以小写盘符登记
|
|
61
|
+
(如 `projects.json` 里的 `e:/proj`),而 vite/vitest 按路径字符串建模块图与缓存键,
|
|
62
|
+
`e:\proj` 与 `E:\proj` 会被当成两个位置、同一模块出现两份实例,表现为收集期崩溃。
|
|
63
|
+
`runVerifyCommand` 在 spawn 前用 `fs.realpathSync.native` 归一(非 native 版本在 Windows 上
|
|
64
|
+
原样返回小写盘符,不纠正大小写);路径不可解析时退回原值,归一失败不阻断验收。
|
|
65
|
+
|
|
10
66
|
## [0.7.4] - 2026-09-28
|
|
11
67
|
|
|
12
68
|
### 修复
|
|
@@ -179,10 +235,29 @@
|
|
|
179
235
|
- ARCHITECTURE / README / agent-profiles / adapter-matrix / SKILL / usage-examples 双语:状态由「开发中」同步为「已接线」,并补齐新的 `endReason` / `needsUserKind` 取值。
|
|
180
236
|
- 版本:`package.json` 与 `src/version.generated.ts` 同步为 `0.7.1`(按 `+0.0.1` 规则);已打 tag `v0.7.1` 并发布到 npm。
|
|
181
237
|
|
|
182
|
-
## [
|
|
183
|
-
|
|
184
|
-
>
|
|
185
|
-
>
|
|
238
|
+
## [0.1.0] — 2026-09-29 — mcp-gui 独立版本线
|
|
239
|
+
|
|
240
|
+
> 本版本为 GUI 独立版本线的**首个正式版**(转正 + 更新日志面板)。MCP 主包的运行时逻辑
|
|
241
|
+
> (工具契约、任务模型、验收引擎与 `src/**`)**零改动**,主包版本保持 `0.7.4` 不变;
|
|
242
|
+
> GUI 使用独立版本号与独立 tag(`gui-v*`)独立演进。
|
|
243
|
+
>
|
|
244
|
+
> **0.1.0 相对 `0.1.0-beta.9` 的三类改动**:
|
|
245
|
+
>
|
|
246
|
+
> 1. **新增更新日志面板**:桌面端独立的更新窗口「更新日志」——启动静默检查命中新版本且该版本未被忽略时
|
|
247
|
+
> 自动弹出,提供 `下载并安装 / 忽略此版本 / 稍后`;「忽略此版本」**只压自动提示**(手动「检查更新」
|
|
248
|
+
> 仍展示该版本,出现更高版本时重新提示,记录持久化在应用偏好);窗口显式展示**本次将通过哪个源更新**
|
|
249
|
+
> (并发实测 Gitee / GitHub 择优的结果与延迟,两端都不可达时给出降级提示);正文即该版本的**双语发行说明**
|
|
250
|
+
> (`docs/release-gui-v<版本>.md` + `.en.md` 合成,Markdown 渲染、禁用内联 HTML)。窗口尺寸按维护者红框批注
|
|
251
|
+
> 实现为 `min(1070px,92vw)` × `min(750px,88vh)`。新增 `mcp-gui/src/core/version.ts`(版本比较与忽略判定,
|
|
252
|
+
> 16 项单测)与 `mcp-gui/src/components/UpdateDialog.vue`;`Preferences` 新增 `ignored_update_version`
|
|
253
|
+
> (带 serde 默认值兜底,避免旧偏好文件整份回退默认值)。
|
|
254
|
+
> 2. **发布链转为支持正式版**:`.github/workflows/gui.yml` 的 tag 过滤器由 `gui-v*-beta.*` 扩为 **`gui-v*`**,
|
|
255
|
+
> 正式版与预发布共用一条流水线;新增按 tag 形态判定 pre-release 的步骤(含 `-beta.` / `-rc.` 才带
|
|
256
|
+
> `--prerelease`);新增 `scripts/gui-release-body.mjs` 合成双语发行版正文(GitHub 侧 `--notes-file`、
|
|
257
|
+
> Gitee 侧 `--body-file`,两端**同源**,**缺文档即非 0 退出**)。
|
|
258
|
+
> 3. **版本与文案转正**:GUI 版本号四处(`package.json` / `package-lock.json` / `tauri.conf.json` / `Cargo.toml`)
|
|
259
|
+
> 统一为 `0.1.0`;界面「测试版通道(pre-release)」改为「正式版通道 / Stable channel」;
|
|
260
|
+
> `gitee-gui-release.mjs` 与 gui.yml 中的硬编码「测试版」字样全部移除。
|
|
186
261
|
|
|
187
262
|
### 新增
|
|
188
263
|
|