tianshu-mcp 0.3.4 → 0.4.1

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.
Files changed (39) hide show
  1. package/CHANGELOG.en.md +625 -510
  2. package/CHANGELOG.md +520 -447
  3. package/README.en.md +438 -351
  4. package/README.md +438 -350
  5. package/dist/agents/builtin.js +6 -3
  6. package/dist/agents/codex/discovery.js +15 -17
  7. package/dist/agents/codex/instance.js +99 -33
  8. package/dist/agents/codex/launcher.js +7 -0
  9. package/dist/agents/codex/registry.js +47 -18
  10. package/dist/agents/codex/run.js +59 -11
  11. package/dist/agents/registry.js +17 -15
  12. package/dist/agents/traework/cdp/client.js +28 -1
  13. package/dist/agents/traework/launcher.js +11 -10
  14. package/dist/agents/traework/run.js +12 -11
  15. package/dist/agents/traework/ui/composer.js +2 -1
  16. package/dist/agents/traework/ui/model.js +3 -1
  17. package/dist/agents/traework/ui/session.js +11 -8
  18. package/dist/agents/zcode/dialog.js +52 -23
  19. package/dist/agents/zcode/discovery.js +37 -55
  20. package/dist/agents/zcode/instance.js +66 -35
  21. package/dist/agents/zcode/project.js +10 -1
  22. package/dist/agents/zcode/run.js +30 -2
  23. package/dist/agents/zcode/selectors.js +6 -0
  24. package/dist/config/schema.js +10 -0
  25. package/dist/loop/fix-loop.js +1 -0
  26. package/dist/mcp/handlers.js +56 -14
  27. package/dist/tasks/task-store.js +4 -18
  28. package/dist/util/path.js +85 -3
  29. package/dist/util/ttl-cache.js +35 -0
  30. package/dist/verify/acceptance.js +135 -32
  31. package/dist/verify/code-analysis.js +99 -72
  32. package/dist/verify/exec.js +6 -1
  33. package/dist/verify/git-baseline.js +41 -16
  34. package/dist/verify/report.js +5 -1
  35. package/dist/verify/runner.js +46 -25
  36. package/dist/version.generated.js +1 -1
  37. package/package.json +1 -1
  38. package/skills/tianshu-mcp/SKILL.md +57 -15
  39. package/skills/tianshu-mcp/usage-examples.md +111 -24
package/CHANGELOG.en.md CHANGED
@@ -1,24 +1,136 @@
1
- # Changelog
2
-
3
- All notable changes to `tianshu-mcp` are documented here. The format follows
4
- [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project adheres to
5
- [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
-
7
- Chinese version: [CHANGELOG.md](CHANGELOG.md)
8
-
9
- ---
10
-
11
- ## [Unreleased]
12
-
13
- ### Planned
14
-
15
- - More external AI-Agent adapters (a new agent = one profile + an optional adapter file).
16
- - TraeWork executable discovery and native-dialog driving on macOS (currently fail-closed).
17
- - Optional project-level skill seeding (by default nothing is written into target repos).
18
- - macOS hardware verification for the Codex GUI adapter (built-in status remains `research`).
19
- - Best-effort stop of a GUI-side pending session (via a temporary CDP connection) when cancelling
20
- a task in the `needs_user` state.
21
-
1
+ # Changelog
2
+
3
+ All notable changes to `tianshu-mcp` are documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project adheres to
5
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ Chinese version: [CHANGELOG.md](CHANGELOG.md)
8
+
9
+ ---
10
+
11
+ ## [Unreleased]
12
+
13
+ ### Planned
14
+
15
+ - More external AI-Agent adapters (a new agent = one profile + an optional adapter file).
16
+ - TraeWork executable discovery and native-dialog driving on macOS (currently fail-closed).
17
+ - Optional project-level skill seeding (by default nothing is written into target repos).
18
+ - Cancel/rework/new-project matrices for the Codex and ZCode GUI drivers on macOS (both remain `research` on darwin).
19
+ - Best-effort stop of a GUI-side pending session (via a temporary CDP connection) when cancelling
20
+ a task in the `needs_user` state.
21
+
22
+ ---
23
+
24
+ ## [0.4.1] — 2026-09-13
25
+
26
+ Documentation release: the orchestration skill docs are aligned with the actual v0.4.0 tool
27
+ surface, and the open-source repos now credit community contributors. No code behaviour changes.
28
+
29
+ ### Docs
30
+
31
+ - **Skill docs fully aligned with the v0.4.0 tool surface** (`skills/tianshu-mcp/`, idempotently synced
32
+ into `~/.rivet/skills/tianshu-mcp/` at server startup):
33
+ - `SKILL.md` now documents the **projectPath safety gate** (absolute path + existing directory +
34
+ realpath canonicalization, rejection of the home directory and system/root directories, dirty-repo
35
+ warning), so an infrastructure rejection is not mistaken for an agent failure.
36
+ - `SKILL.md` adds a **hard-failure error-code reference** (`setup_failed`/`project_ambiguous`/
37
+ `project_mismatch`/`model_unavailable`/`model_mismatch`/`permission_unknown`/`cdp_disconnected`/
38
+ `instance_busy`/`session_lost`/`input_mismatch`/`send_unknown`/`idle_timeout` and more), stating
39
+ that hard failures never enter acceptance or auto-rework.
40
+ - `SKILL.md` covers all `needs_user` kinds, including the new `setup_recovery` (zcode initialization
41
+ recovery exhausted), plus `continue_task` state/type restrictions and the refusal semantics when the
42
+ zcode session anchor is lost.
43
+ - `SKILL.md` documents the `codex-cli` headless path (user-defined `driver=spawn` profile, `model` not
44
+ applicable, CLI ≥0.154.0 requirement), the `ready`/`research` status semantics, **default-parallel 2**
45
+ acceptance checks (`verifyConcurrency`), and the `requireChanges` zero-change gate.
46
+ - `usage-examples.md` adds: a `codex-cli` dispatch example; the **full meta-block field table** (now
47
+ including `agentEndReason`/`lastRunSignal`/`checks`/`round`/`keptInstance`/`zcodeSessionId`/
48
+ `modelProvider`/`permissionMode`/`progressSummary`); an **error-code reference table**; a project-level
49
+ `.tianshu-mcp/acceptance.json` template (with the parallel-interference warning and `requireChanges`
50
+ guidance); a `setup_recovery` recovery example; and the profile whole-key override semantics.
51
+ - **Bilingual README contributor credits**: a new "Contributors" section lists, in order of first
52
+ participation, the community members who took part through Issues and pull requests (avatar + name).
53
+
54
+ ### Other
55
+
56
+ - `package.json` version bumped to `0.4.1` (`serverInfo.version` is synced automatically at build time).
57
+
58
+ ---
59
+
60
+ ## [0.4.0] — 2026-09-13
61
+
62
+ ### Added
63
+
64
+ - `projectPath` safety gate: `run_task`/`verify_task` validate at submission (absolute path +
65
+ existing directory + realpath symlink resolution), reject the home directory itself and
66
+ system/root directories (including macOS `/private/*` realpath forms); the submission receipt
67
+ notes symlink resolution; dirty git repos get an uncommitted-changes coexistence warning.
68
+ - ZCode GUI driver supports macOS: adapts to the main process rewriting its title (relaxed port
69
+ attribution + bounded scan of the configured port range when argv hides the debug port) and
70
+ detached+unref instance persistence; the folder-panel driver is rewritten for the macOS window
71
+ form (NSOpenPanel as a standalone window + AX value write into the go-to field, immune to IME
72
+ interception). Machine-verified closed loop on 2026-09-13 (macOS arm64, ZCode 3.11.2: bind →
73
+ readback → send → run evidence → acceptance PASS → succeeded); macOS stays `research` until
74
+ the cancel/rework/new-project matrix is covered.
75
+ - Codex GUI driver supports macOS: spawns the ChatGPT.app bundle executable directly
76
+ (per-platform `activation` default spawn/msix-com) with detached+unref instance persistence;
77
+ POSIX process enumeration and SIGTERM stop; default discovery dirs on darwin; project
78
+ registration writes the shared state file (`~/.codex/.codex-global-state.json`) on darwin too;
79
+ the observation loop reconnects CDP across transient renderer hangs / target replacement
80
+ (only 5 consecutive failures count as disconnected). Machine-verified closed loop on
81
+ 2026-09-13 (macOS arm64: discover → register → bind → send → run evidence → acceptance PASS
82
+ → succeeded); macOS stays `research` until the cancel/rework matrix is covered.
83
+
84
+ ### Fixed
85
+
86
+ - zcode macOS new-task inert-button fallback: `conversation-new-task` can hit an inert home-screen
87
+ icon (click does nothing); when the project trigger misses, the flow now falls back to the
88
+ sidebar `[data-testid=task-new-button]` and retries.
89
+ - `normalizeProjectPath` resolves symlinks: macOS `/tmp`→`/private/tmp` used to fail project
90
+ path matching and degrade into a name match, falsely reporting `project_ambiguous`;
91
+ falls back to lexical normalization when realpath fails.
92
+ - zcode macOS panel failures no longer misreport `needsPermission`: the execFile message embeds
93
+ the full script text (containing the `ACCESSIBILITY_PERMISSION_REQUIRED` literal), so every
94
+ failure looked like a permission problem — the check now reads the stderr execution-error line.
95
+ - `get_profiles` now lists user-defined profiles from the data-directory `agent-profiles.json`
96
+ (previously hidden until first resolve, even though `run_task` could already use them — inconsistent discovery feedback).
97
+ - zcode-flow test stubs now cover `listDialogs`, removing a flake where real osascript/PowerShell
98
+ calls blew the `taskTimeoutMs` wall-clock budget under full-suite load.
99
+ - CDP `connect()` failure paths now dispose of the WebSocket themselves (no longer relying on
100
+ callers to disconnect); the `send()` timeout timer is unref'd.
101
+ - **Drive roots were not rejected by the `projectPath` gate** (Windows): `normPath` strips the
102
+ trailing slash (`D:\` -> `d:`), which never equals the `d:/` entries in the reject list, so the
103
+ gate was effectively a no-op for drive roots; a dedicated drive-root check now covers every
104
+ drive letter instead of relying on enumeration.
105
+ - `test/unit/project-dir-guard.test.ts` had a non-portable system-directory assertion: `/etc` and
106
+ `/usr` are POSIX paths, and on Windows they hit "directory does not exist" rather than the reject
107
+ list; the assertion is now platform-branched and verifies drive roots plus `C:/Windows` on Windows.
108
+ - `test/unit/acceptance-parallel.test.ts` cancellation case was flaky (green alone, red in a full
109
+ run): a fixed 250ms delay can precede the child spawn on slower platforms, mislabelling an
110
+ in-flight check as `skipped`; it now waits until both in-flight checks have really started.
111
+
112
+ ### Performance
113
+
114
+ - All `execFileSync`/`spawnSync` calls across GUI instance probing, discovery and registration
115
+ are now async; ready-wait loops reuse a per-tick process snapshot with a 1.5s TTL cache —
116
+ eliminating event-loop freezes during Windows polling (up to 30s per call).
117
+ - Acceptance command checks run with bounded parallelism: new `verifyConcurrency` (**⚠ default
118
+ changed from serial to 2**, range 1–4; project-level `.tianshu-mcp/acceptance.json` overrides,
119
+ 1 = fully serial — set 1 explicitly for checks that write build outputs, run with `--fix`, or
120
+ share cache directories); logs are concatenated in declaration order with unchanged format;
121
+ cancellation interrupts both in-flight and pending checks.
122
+ - Git baseline hashing is single-pass with bounded async concurrency (untracked cap 5000);
123
+ code analysis reads each file at most once, sniffing only a prefix of large files.
124
+ - `get_profiles` and task snapshot reads now use `Promise.all`.
125
+ - Test suite 267s → 51s: traework UI-layer sleeps are injectable (production defaults unchanged);
126
+ vitest split into parallel unit / serial integration projects.
127
+ - `tsconfig.build.json` no longer emits declarations — 70 `.d.ts` files dropped (140 → 71 files).
128
+
129
+ ### Documentation
130
+
131
+ - README (both languages) gains "macOS headless path: codex-cli (user profile)" — including the
132
+ revoked-certificate warning for ≤0.130.0 and a complete profile example.
133
+
22
134
  ---
23
135
 
24
136
  ## [0.3.4] — 2026-09-13
@@ -28,7 +140,7 @@ Chinese version: [CHANGELOG.md](CHANGELOG.md)
28
140
  - Add initialization recovery with shared deadlines, configurable budgets and a resumable `setup_recovery` state. Reconcile native side effects after timeouts and terminate helper processes on cancellation.
29
141
  - Handle split model labels, hidden outgoing animation text, residual project menus trapping focus and send buttons that are not yet ready.
30
142
  - Add real DOM and recovery/cancellation regressions. Windows hardware verifies cold first import, imported-project reuse and same-task recovery with actual artifacts and 2/2 acceptance checks.
31
- - Release/tarball only; no npm publication. macOS has no real-device verification for this patch and the ZCode profile remains `research`.
143
+ - Published as a GitHub Release/tarball and to npm (`latest`). macOS has no real-device verification for this patch and the ZCode profile remains `research`.
32
144
 
33
145
  See [release notes](docs/release-v0.3.4.en.md) and [validation evidence](docs/zcode-issue-8-10-validation.en.md).
34
146
 
@@ -53,492 +165,495 @@ Fixes issues #4 / #7 by adapting the ZCode GUI driver to the 3.11.2 model-menu a
53
165
  ---
54
166
 
55
167
  ## [0.3.2] — 2026-09-12
56
-
57
- Fixes for issues #5 / #6: **the MCP task model was disconnected from the state of the turn inside
58
- the Codex GUI**. The former is the completion-detection deadlock that kept reporting `running`
59
- while Codex waited for user confirmation; the latter is `cancel_task` only aborting the MCP-side
60
- wait loop, never stopping the in-GUI run, with a misleading description. Both share the same root
61
- cause and are resolved together.
62
-
63
- ### Fixed
64
-
65
- - **Waiting-for-user detection (issue #5)**:
66
- - `judgeCodexPoll` gains a stall fallback: while the stop button stays visible and the
67
- conversation hash is unchanged for `gui.stallTimeoutMs` (default 5 minutes), the task
68
- transitions to `needs_user` (`needsUserKind=user_confirmation`) instead of deadlocking in
69
- `running` until the overall timeout; the stall timer resets as soon as content changes again.
70
- - New configurable UI detection `gui.selectors.userGate` (e.g. the embedded-checkout page or
71
- approval cards): when configured and matched, transitions to `needs_user` immediately.
72
- Unset by default (disabled) — no unverified selectors are built in.
73
- - Tightened the `stopButton` selector: removed the `aria-label*="取消"` over-match (the Cancel
74
- button on waiting-for-user screens used to be mistaken for a running signal).
75
- - **Recovery path (issue #5 fallout)**: `continue_task` now supports codex —
76
- - `user_confirmation`: after the user completes the action in the Codex window, resume by
77
- re-attaching as an observer of the in-GUI run (no message is sent); if the turn already
78
- finished before resuming, the task is still judged `succeeded` correctly;
79
- - `login_required`: after login, re-checks the environment and re-dispatches the task brief
80
- (fresh session + project binding + full initial prompt);
81
- - zcode recovery behaviour is unchanged; other agents are rejected explicitly.
82
- - **Cancel actually stops the GUI (issue #6)**:
83
- - `cancel_task` no longer succeeds on request alone for GUI agents: it first best-effort clicks
84
- the in-app stop button over CDP, then waits (bounded by `gui.cancelWaitMs`, default 15s) for
85
- the GUI to become idle before settling `cancelled`; if the stop could not be confirmed the
86
- terminal message states "GUI 内运行未确认停止…" (the in-GUI run may still be going);
87
- - process-tree termination for CLI agents is unchanged;
88
- - cancelling from `needs_user` now notes that a pending session may remain in the GUI
89
- (no CDP connection exists at that point — documented limitation).
90
- - **Re-dispatch anti-overlap guard (issue #6 chain risk)**: when dispatching, if the managed
91
- instance still has an unstopped run, MCP first tries to stop it; if it cannot, the dispatch
92
- fails hard with `instance_busy`, preventing old and new turns from overlapping inside the same
93
- app (observed in the wild when re-dispatching right after a cancel).
94
- - The startup log no longer hardcodes the tool count as `8`; it reports the actual registry size
95
- (`TOOL_DEFS.length`, currently 9).
96
-
97
- ### Changed
98
-
99
- - Tool descriptions match actual semantics: `cancel_task` distinguishes CLI (kill process tree)
100
- from GUI (best-effort stop click + bounded wait); `continue_task` no longer claims to be
101
- ZCode-only.
102
- - `GuiProfile` gains two configurable options, `stallTimeoutMs` (default 300000) and
103
- `cancelWaitMs` (default 15000), both overridable via agent-profiles.json.
104
- - Skill docs (SKILL.md §4/§5, usage-examples.md §7) document the codex `user_confirmation` /
105
- `login_required` recovery flows, GUI cancel semantics and the new options.
106
-
107
- ---
108
-
109
- ## [0.3.1] — 2026-09-12
110
-
111
- Post-v0.3.0 housekeeping for docs and release automation: **no source-level behavior changes**.
112
- The focus is a full rewrite of the self-installed skill docs plus GitHub/Gitee release-body
113
- composition and link fixes.
114
-
115
- ### Changed
116
-
117
- - **Skill docs (`skills/tianshu-mcp/`) fully rewritten to match the actual v0.3.0 tool surface**:
118
- - Corrected the `codex` description from "headless CLI" to the ChatGPT desktop GUI adapter
119
- (MSIX + COM activation + CDP); documents the required `model`, optional `reasoningLevel` /
120
- `planDoc` / `designSystem`, and that `mode` is not supported;
121
- - Documented the `run_task` `context` parameter and the send-time validation of path references
122
- inside task/context; corrected the `autoFixRounds` default precedence
123
- (call argument > codex 5 / zcode 2 > server default 0);
124
- - Added usage for `list_tasks`, `query_task(tailLines)`, `get_task_report(round)` and
125
- `verify_task` (`extraChecks` / `checksMode` / `baselineRef`) plus the four-level acceptance
126
- command precedence;
127
- - Documented the four `needs_user` kinds and meta fields such as `needsUserKind` /
128
- `pendingQuestion` / `errorType` / `reportRound` / `verificationSource`;
129
- - Added `continue_task` to the approval list; replaced emoji status markers with plain text
130
- (PASS / warning) in the usage examples.
131
- - **Release automation fixes (exposed by the v0.3.0 tag)**:
132
- - The release body is now composed bilingually from `docs/release-v<version>.md` and `.en.md`,
133
- with in-document relative links rewritten to tag-absolute links; a missing doc fails the
134
- workflow loudly instead of producing a shell-only body;
135
- - `Full Changelog` resolves the previous tag via `git describe` into a `compare/<prev>...<tag>`
136
- link instead of degrading to a commits link;
137
- - The body's `CI` link resolves the CI run for the same SHA instead of pointing at the Release run;
138
- - Gitee releases are automated in `release.yml`: `scripts/gitee-release.mjs` idempotently
139
- creates/updates the mirrored release (requires the `GITEE_TOKEN` secret; skipped loudly when unset).
140
- - `.gitignore` now ignores npm pack artifacts and local temporary verification directories.
141
- - Added the missing `[0.1.10]` / `[0.2.0]` / `[0.3.0]` / `[0.3.1]` compare links at the bottom of
142
- this file and its Chinese counterpart.
143
-
144
- ---
145
-
146
- ## [0.3.0] — 2026-09-12
147
-
148
- The Codex desktop app now runs through a **GUI driver**: a new `codex-gui` adapter uses MSIX COM activation
149
- plus CDP to drive the ChatGPT desktop app through the full loop (locate install → launch GUI → bind/create
150
- project → pick model and reasoning level → send instructions → run detection → verify → auto-repair).
151
-
152
- ### BREAKING CHANGES
153
-
154
- - **`agentId=codex` now executes via the desktop GUI instead of the headless CLI**: a new `driver=gui` +
155
- `adapter=codex-gui` + `activation=msix-com`, with the previous **`codex exec` headless path removed**.
156
- After upgrading, `run_task(agentId="codex")` launches and drives the Codex desktop window rather than a
157
- headless child process. To keep headless execution, add a separate `driver=spawn` profile
158
- (`argsTemplate: ["exec", "<prompt:arg>", "--skip-git-repo-check", "--sandbox", "workspace-write"]`) as
159
- documented in `docs/agent-profiles.en.md`.
160
- - This path requires the Codex desktop app (MSIX store package) to be installed; CLI-only environments are
161
- no longer directly supported.
162
-
163
- ### Added
164
-
165
- - `codex-gui` adapter (`src/agents/codex/**`): Appx-first install discovery (scan fallback taking the newest
166
- version), MSIX COM activation with a dedicated `user-data-dir` and dynamic debug port, plus CDP attach and
167
- target convergence (excluding the overlay secondary window).
168
- - Task parameters: `reasoningLevel` (low/medium/high, bilingual), `planDoc`, `designSystem`.
169
- - Model and reasoning level: models are `menuitemradio` candidates while **reasoning strength is a slider**
170
- (0–4: 轻度/中/高/极高/极高), set precisely with arrow keys and read back for verification; level
171
- comparison is exact to avoid matching "高" against "极高".
172
- - **Automatic project registration**: a target directory not yet registered on the Codex side is written
173
- directly into Codex project state (idempotent, backup-before-write, atomic write, only while the
174
- MCP-managed instance is stopped), so it takes the stable bound-project path instead of the brittle native
175
- folder dialog; on failure it falls back to UI creation.
176
- - Verification and repair: reuses the existing AcceptanceEngine (defaults derived from `package.json`, with
177
- weak-verification labelling); on failure the MCP generates an in-project
178
- `.zcode/plans/codex-fix-r<N>.md` (one per round, never overwritten) and cites it in the repair instruction,
179
- up to 5 rounds by default (`defaultAutoFixRounds`).
180
- - Run detection: the stop button is the authoritative running signal, and text stability counts as completion
181
- evidence only after it; without a running signal it fails open to `idle_timeout` while keeping the instance
182
- (never a false completion).
183
- - `scripts/probe-codex.mjs` hardware diagnostic script; 67 Codex unit tests plus integration coverage of the
184
- verify-fail → generated plan → repair-pass loop.
185
- - Docs: `docs/codex-gui-cdp.en.md`, `docs/codex-windows-smoke.en.md` (including the round-2 real business task
186
- acceptance) and their Chinese counterparts.
187
-
188
- ### Changed
189
-
190
- - `GuiProfile` gains `activation` / `userDataDir` / `appxPackageName` / `permissionMode` / `fixPlanDir`;
191
- existing `spawn` profiles are unaffected.
192
- - `ExecutableDiscovery` gains `appxPackageName` / `installRelativeExe` / `scanRoots` / `scanPattern`.
193
-
194
- ### Fixed (exposed by hardware testing)
195
-
196
- - The model trigger mis-matched the sibling permission chip (4 chips share `aria-haspopup`; only the model chip
197
- lacks `aria-label`).
198
- - Reasoning strength was clicked like a menu item and could never be set (it is actually a slider).
199
- - Menus/popovers only open on **trusted** mouse events (DOM `.click()` is ignored).
200
- - A transient empty model read during toolbar re-render after binding was treated as a "model mismatch".
201
- - Model/reasoning trigger selectors now exclude the top menu bar and the mode switcher.
202
- - Cold-start readiness budget widened to 150s (registration stops the instance first; cold start measured ~85s).
203
- - CI: fixed a `normalizeDir` assertion that depended on the host platform, which failed on ubuntu/macos.
204
- - Fixed integration tests polluting real Codex project state by not injecting `ensureRegistered`.
205
-
206
- ### Verification
207
-
208
- - Windows 10 x64 hardware: full loop for a registered project, and the verify-fail → generated plan →
209
- repair-pass loop; an unregistered project completed the full loop after automatic registration.
210
- - Real business task: drove Codex to build a "Fruit Ninja" mini-game in HTML+CSS+JS (`GPT-5.6 Sol` with
211
- reasoning strength "高"); the artifacts passed acceptance and were verified playable in a headless browser
212
- (score rises, lives decrement, Game Over and restart work, no JS exceptions).
213
- - macOS unverified: the built-in Codex GUI status is `research` and is excluded from readiness.
214
-
215
- ---
216
-
217
- ## [0.2.0] — 2026-09-11
218
-
219
- ### Added
220
-
221
- - Dedicated `zcode-gui` Electron CDP adapter with data-driven Windows/macOS discovery, dynamic ports, product/process checks, and a global serial lock.
222
- - Exact ZCode project binding, guarded native folder pickers, `provider/model`, Full Access read-back, and idempotent sending.
223
- - Paused `needs_user` state and approval-gated `continue_task` for original-session answers and environment rechecks after instance, login, or permission handling.
224
- - Multi-signal liveness, progress events, UI preservation, default auto-verification, and two same-session repair rounds. Repair plans stay in MCP task storage.
225
- - `scripts/probe-zcode.mjs`, fake-CDP/state/path/model tests, and bilingual documentation.
226
-
227
- ### Safety and compatibility
228
-
229
- - GUI profiles support an explicit `adapter`; legacy `driver="gui"` profiles retain TraeWork behavior.
230
- - The built-in ZCode profile remains `research` until both real platform loops pass.
231
- - No private `app-server`, credential access, automatic user-instance termination, or fixed screen coordinates.
232
-
233
- ### Fixed and verified
234
-
235
- - Fixed ZCode read-back for dynamic model labels, transient renderer load/reload, delayed new-session registration, and stale session-ID contamination.
236
- - `AskUserQuestion` continuation now selects and submits an exact accessible option in the original session; zero or ambiguous matches fail closed.
237
- - Windows 10 x64 passed three hardware loops: real file development, same-session repair after a controlled failure, and `continue_task` after a model question. macOS hardware evidence remains pending.
238
-
239
- ---
240
-
241
- ## [0.1.10] — 2026-09-10
242
-
243
- ### Fixed
244
-
245
- - **Fixed stdio log pollution (issue #1)**: the unified logger previously sent only ERROR to
246
- `console.error` while INFO/WARN/DEBUG went to `console.log`, sharing stdout with MCP JSON-RPC
247
- messages and breaking handshakes or tool calls in strict stdio clients. All levels passing the
248
- threshold now go to stderr, leaving stdout for valid MCP messages only.
249
- - Log file appending, timestamps, level tags and the `<data dir>/logs/server.log` path are unchanged;
250
- a startup failure is still reported on stderr.
251
-
252
- ### Added
253
-
254
- - New `scripts/check-stdio.mjs` strict stdio smoke: a real child process validates the complete
255
- stdout/stderr byte stream, allowing only newline-delimited, schema-valid MCP JSON-RPC messages on
256
- stdout; empty lines, non-JSON lines, parser errors, or trailing fragments at exit fail the run.
257
- It covers six scenarios: first start, second start with matching skills, `--no-skill-install`,
258
- a corrupt `config.json`, logs during a stub task, and clean EOF shutdown.
259
- - New `npm run check:stdio` and `npm run check:stdio:src` scripts.
260
-
261
- ### Tests
262
-
263
- - New `test/unit/log.test.ts`: real-child-process checks for the four log levels' channels, default
264
- INFO filtering, threshold-filtered file logging, and UTF-8 content (4/6 failed before the fix; see
265
- `docs/m2-evidence/issue1-old-impl-log-test-failure.txt`).
266
- - CI's three-platform matrix now includes Node 24; the build step runs the strict stdio check instead
267
- of an EOF-exit-only smoke.
268
- - CI `pack-check` and Release install the freshly built tarball into a clean consumer directory, read
269
- the installed bin dynamically, and reuse the same strict stdio check; Release adds `lint` and the
270
- installed-package protocol gate, failing before a draft is created.
271
- - ESLint enables `no-console` (allowing `error` only) for `src/**/*.ts` to prevent new direct stdout writes.
272
-
273
- ---
274
-
275
- ## [0.1.9] — 2026-09-09
276
-
277
- ### Fixed
278
-
279
- - Fixed premature TraeWork completion while the model was still thinking but the DOM stayed unchanged for about 36 seconds.
280
- The stop button and loading task tail are now authoritative running signals and override completion marks; stable rounds now
281
- start an idle timer, which defaults to ten minutes before returning `idle`.
282
- - Fixed permanently pending `Runtime.evaluate` calls after a CDP WebSocket disconnect. Close/error rejects all pending requests,
283
- each CDP command has a 15-second default timeout, and task cancellation is observed within about one second.
284
- - Only `completion_mark` / `ask_user` release an instance launched by this module. Idle, timeout, cancellation, and CDP loss retain
285
- it, with `agentEndReason` / `keptInstance` exposed in task metadata.
286
- - Fixed a shutdown race where an orchestrator still collecting its baseline could remain `queued` and be mislabeled as a user
287
- cancellation. User cancellation is now determined only from structured cancellation intent.
288
-
289
- ### Added
290
-
291
- - Polling emits a progress event visible through `query_task` every 30 seconds by default.
292
- - Added `gui.idleTimeoutMs`, `gui.cdpSendTimeoutMs`, `gui.progressIntervalMs`, and five overrideable liveness selectors.
293
-
294
- ### Testing
295
-
296
- - Added liveness truth-table, CDP timeout/disconnect convergence, selector-expression, and fake-CDP instance-retention regressions.
297
- - Windows/macOS/Linux × Node 20/22 and tarball gates remain covered.
298
-
299
- ---
300
-
301
- ## [0.1.8] — 2026-09-08
302
-
303
- ### Fixed
304
-
305
- - **Atomic-write concurrency defect** (the real cause of intermittent CI failures): the temp filename in
306
- `writeJsonAtomic`/`writeTextAtomic` was `<target>.<pid>.tmp`, so concurrent writes to the same target in one
307
- process shared one temp file - the first to finish renames it away and the next throws `ENOENT`; on Windows a
308
- concurrent rename can also throw `EPERM`. Symptom: `rework_task` intermittently returned an `undefined` meta
309
- (hit on CI windows/Node 20). Fixed by a random temp suffix plus backoff-retry on transient rename errors.
310
-
311
- ### Testing
312
-
313
- - New `test/unit/atomic-write.test.ts` (3 cases: concurrent JSON/text writes all succeed, no leftover temp files).
314
-
315
- ---
316
-
317
- ## [0.1.7] — 2026-09-08
318
-
319
- ### Fixed
320
-
321
- - **Project-folder binding still failed** (v0.1.6 did not fully resolve it; field report: the native dialog
322
- appeared but the edit box was empty and confirm was clicked anyway):
323
- - **Root cause**: the MCP passes a `normPath()`-normalized path (lowercase drive + forward slashes, e.g.
324
- `d:/Trae项目/AI游戏/象棋`), which the **native Windows picker rejects** — measured: read-back matched, yet the dialog
325
- stayed open after confirm. Fix: convert via the new `toNativeWindowsPath()` to `D:\a\b`.
326
- - `WM_GETTEXT` **read-back verification** after writing; on mismatch re-locate and retry (up to 3 times);
327
- if it still mismatches, **never click confirm** and fail loudly.
328
- - The hwnd detected after the footer click is **passed into the write script**; after clicking, success
329
- requires that hwnd to be gone.
330
- - **Auto-close stale dialogs** (left over from a previous failure) before binding.
331
- - Confirm button now also requires its rect to be in the lower half of the dialog.
332
- - The dialog script's full trace (HWND/READBACK) is written to the task log.
333
-
334
- ### Testing
335
-
336
- - Total tests **172 → 181** (unit incl. path normalization and atomic-write concurrency; integration incl. stale-dialog cleanup).
337
- - Machine-verified: a new Chinese project `D:\Trae项目\AI游戏\象棋` (absent from the dropdown)
338
- passed end-to-end through the native dialog; `五子棋` and the ASCII project `ts-bind-test` regressed green.
339
-
340
- ---
341
-
342
- ## [0.1.6] — 2026-09-08
343
-
344
- ### Fixed
345
-
346
- - **Project-folder binding got stuck / reported "waiting for native dialog timed out"** (field report; the adapter was not broken):
347
- - `clickDropdownFooter` used to trust `element.click()`'s return value, but the native popup may never
348
- appear → it now **confirms the dialog actually appeared**, otherwise it logs a dropdown DOM snapshot and fails loudly.
349
- - Dialog detection polled from Node every 800 ms while PowerShell cold start is ~4.5–6 s, so a 15 s budget
350
- allowed only ~2 probes → now it polls **inside a single PowerShell call** (400 ms interval) with a 30 s budget.
351
- - **CJK paths were corrupted** (measured: `D:\Trae项目\ts-bind-test` became `D:Traes-bind-test`):
352
- SendKeys/clipboard are mangled by the console code page → the path is now written via Win32
353
- **`WM_SETTEXT`**, which is fully reliable for CJK.
354
- - **The confirm click hit a file-list row**: `AutomationId="1"` is not unique (rows also use 0/1/2…) →
355
- now located by **AutomationId=1 AND ControlType=Pane**, then clicked by bounding rect.
356
- - PowerShell output was garbled for Chinese → the script now emits **ASCII-only** and Node maps it back
357
- via `localizeDialogMessage()`.
358
-
359
- ### Added
360
-
361
- - **Non-Work binding fallback**: when binding fails in Code/Design, the driver **falls back to Work once**,
362
- switches back to the target mode, and re-verifies the project is still bound; only if both attempts fail
363
- does it report an error including the reason from each mode.
364
- - Machine-verified: for a project **absent from the dropdown** (`D:\Trae项目\ts-bind-test`),
365
- `run_task(agentId=traework, mode=Code)` passed end-to-end — native dialog wrote the path → confirm clicked →
366
- project entered TraeWork's list (`solo-lite.local-project-folders` 22→23) → task sent → auto-verification `succeeded`.
367
-
368
- ### Changed
369
-
370
- - `docs/traework-cdp.md` / `.en.md`: 7 new pitfall entries; added the "dropdown entries ≠ project map" fact and the fallback note.
371
-
372
- ### Testing
373
-
374
- - Total tests **167 → 172** (new dialog message-mapping/platform-branch unit tests + Code→Work fallback integration test).
375
-
376
- ---
377
-
378
- ## [0.1.5] — 2026-09-08
379
-
380
- ### Added
381
-
382
- - **TraeWork panel mode switching**: `run_task` gained a `mode` parameter supporting `Work` / `Code` / `Design`.
383
- - Resolution order: explicit `mode` parameter > task-text detection > keep `Work`.
384
- - Text detection handles mixed Chinese/English phrasing ("switch to Code mode", "use design mode", "工作模式", "代码模式", "设计模式", …).
385
- - New `gui.modeSwitch` profile switch (default `true`).
386
- - New pure functions `detectModeFromText` / `resolveMode` (unit-tested).
387
- - **Dedicated SVG assets**: `assets/tianshu-mcp-icon.svg` (app icon), `assets/tianshu-mcp-banner.svg` (wide banner).
388
- - New `scripts/probe-traework.mjs mode <Work|Code|Design>` subcommand (real-machine diagnostics/verification).
389
- - New bilingual release notes `docs/release-v0.1.5.md` / `.en.md`.
390
-
391
- ### Changed
392
-
393
- - **TraeWork execution order**: measurement showed the three modes **each keep an independent project binding** —
394
- switching modes replaces the input bar's project with whatever that mode last used.
395
- Order is now: ensure instance → wait for UI → new session → switch to target mode → bind project inside that mode → switch model → send.
396
- - After binding, both mode and project are re-verified; any mismatch **fails loudly** (never silently develops in the wrong mode).
397
- - meta block now exposes `model` / `mode` for Tianshu to read back.
398
- - `package.json`: `license` changed from `MIT` to `Apache-2.0` (matching the repository `LICENSE` file);
399
- added `repository` / `homepage` / `bugs`; `files` now includes `assets`.
400
- - README.md / README.en.md fully rewritten: stack badges, SVG banner (above the icon), language isolation
401
- (the Chinese README references Chinese docs only; the English README references English docs only).
402
-
403
- ### Fixed
404
-
405
- - **Rework feedback race** (pre-existing; intermittent under load): the terminal snapshot is written first, so a caller's
406
- immediate `rework_task(feedback)` could be erased by the previous run's `delete meta.reworkFeedback`, leaving the rework
407
- round without feedback. Now the feedback is consumed and cleared atomically when `startTask` begins.
408
- Added regression test `test/integration/rework-feedback-race.test.ts`.
409
- - **`projectBasename` cross-platform**: it used `path.basename` (which does not split backslashes on POSIX), failing
410
- Linux/macOS CI; now it splits explicitly on both `\` and `/`.
411
-
412
- ### Testing
413
-
414
- - Total tests **153 → 167** (14 new mode-related cases).
415
- - Real-machine end-to-end: `mode=Work` / `mode=Code` / `mode=Design` all completed
416
- "switch mode → bind project → send → create file → auto-verification passed".
417
-
418
- ---
419
-
420
- ## [0.1.4] — 2026-09-08
421
-
422
- ### Added
423
-
424
- - TraeWork GUI driver over CDP: `traework` moved from `unsupported` to `driver=gui` / `status=ready`.
425
- - Capabilities: launch/reuse instance → new session → bind project folder (dropdown first, restricted computer-use
426
- native dialog as fallback) → optional model selection → read-back-verified send → poll to completion →
427
- auto-verify → repair-plan file + same-session rework on failure.
428
- - Safety: reuse the user's instance by default, never kill a process tree, verify the command line before terminating;
429
- computer-use is limited to TraeWork's folder picker.
430
- - `AgentAdapter` gained an optional `run()` execution surface; the orchestrator branches on `adapter.run`
431
- (CLI agents still use spawn).
432
- - Profile gained `driver` (`spawn` / `gui`) and a `gui` section; `run_task` gained a `model` parameter.
433
- - New `src/agents/traework/**` (CDP client, selector table, launcher, session/input/model/reply modules, restricted computer-use).
434
- - On verification failure a repair-plan file `rework-<taskId>-r<N>.md` is generated (task dir + project `.tianshu-mcp`)
435
- and its filename is referenced in the rework message.
436
-
437
- ### Changed
438
-
439
- - `docs/adapter-matrix.md` T1 conclusion corrected from `unsupported` to "integrated (driver=gui)".
440
- - formatter now passes cancel-source fields (`abortSource`, …) through to `query_task`'s meta block.
441
-
442
- ### Fixed
443
-
444
- - Unified timeout terminal state: normal timeouts now also land `failed(timeout)` plus exactly one `timeout_killed` event, in fixed order.
445
- - Stabilized the `shutdown` test polling.
446
-
447
- ### Testing
448
-
449
- - Total tests **72 → 153** (new TraeWork unit/integration cases).
450
- - Real-machine end-to-end: `run_task(agentId=traework, model=GLM-5.3, autoVerify=true)` drove TraeWork to create a file and passed acceptance.
451
-
452
- ---
453
-
454
- ## [0.1.3] — 2026-09-08
455
-
456
- ### Fixed
457
-
458
- - **S1** No-reason cancel was mis-recorded as `interrupted`: added independent `cancelRequestedAt` / `abortSource` fields;
459
- cancel intent no longer depends on the optional `reason` (5 regression tests).
460
- - **S2** Unified timeout terminal state (shared with 0.1.4).
461
- - **S3** Tracked pre-dirty net-diff attribution: pre-existing dirty files are excluded by content hash when unchanged;
462
- unchanged staged/unstaged files are no longer reported as agent changes (4 regressions).
463
- - **S4** `verify_task(taskId)` persists real-task metadata (`reportRound` / `verificationSource` /
464
- `latestVerificationVerdict`, keeping `agentId`); single-source MCP version (`sync-version` injection).
465
- - **S5** `projects.json` official Zod schema + last-known-good for `config`/`profiles`/`projects` + content-sha256
466
- hot-reload invalidation (fixed corrupt JSON being treated as missing and reset).
467
-
468
- ### Changed
469
-
470
- - **S6** CI/Release `npm ci` retry corrected (stop on success / 3 attempts / attempt counter);
471
- Vitest v3 upgrade (0 audit vulnerabilities); plain-text status markers (emoji scan test).
472
-
473
- ### Testing
474
-
475
- - Total tests **53 → 72**.
476
-
477
- ---
478
-
479
- ## [0.1.2] — 2026-09-08
480
-
481
- ### Changed
482
-
483
- - Build no longer ships source maps (no `.map`, tarball ≈ 69.9 KB).
484
-
485
- ### Testing
486
-
487
- - Total tests **53**.
488
-
489
- ---
490
-
491
- ## [0.1.1] — 2026-09-07
492
-
493
- ### Added
494
-
495
- - **Release after the R1–R5 fixes**:
496
- - **R1** Cancel/interrupt state persistence (`cancel_requested → cancelled`, `cancelReason`/`finishedAt`/`errorType`
497
- persisted, restart-recoverable, idempotent, bounded shutdown).
498
- - **R2** Call-level `taskTimeoutMs` precedence fix + cross-platform process-tree termination
499
- (POSIX process-group SIGTERM→SIGKILL, Windows `taskkill /T /F`).
500
- - **R3** Git baseline participates in diff (boundary at `baseline.head`; agent commits do not lose changes;
501
- dirty-worktree hash attribution).
502
- - **R4** Verification tool parameters and report-round semantics (`round=0` valid, manual verify does not overwrite
503
- reports, `extraChecks` append + `checksMode=replace`, `optional` does not affect verdict, `baselineRef` validated).
504
- - **R5** Removed hardcoded agent paths (`{LOCALAPPDATA}` placeholders + platform-standard candidates);
505
- mtime hot reload for `config`/`profile`/`projects`.
506
- - **R6** Cross-platform CI matrix (Windows/macOS/Linux × Node 20/22) and Release version consistency
507
- (tag/input = `package.json` = tarball), plus tarball content checks.
508
- - **R7** npm published `tianshu-mcp@0.1.1` + `npx -y` raise with 8 tools connected.
509
- - **R8** Bilingual docs synced (including 4 English topic docs).
510
-
511
- ---
512
-
513
- ## [0.1.0] — 2026-09-07
514
-
515
- ### Added
516
-
517
- - First usable release: **M1 core engine + stub-agent end-to-end**.
518
- - 8 MCP tools: `run_task` / `query_task` / `list_tasks` / `get_task_report` / `cancel_task` / `verify_task` /
519
- `rework_task` / `get_profiles`.
520
- - `TaskManager` state machine / per-project serial queue / global concurrency gate / cancel (kill tree) / event-stream persistence.
521
- - Acceptance engine: git baseline & diff, default check-set derivation, command runner, code analysis,
522
- `report.md` / `report.json`.
523
- - fix-loop auto rework + `needs_attention`; skill self-install.
524
- - Stub-agent 3 playbooks (good / fix-on-first / never) integration tests + protocol tests — **53/53 green**.
525
-
526
- ---
527
-
528
- [Unreleased]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.3.3...HEAD
168
+
169
+ Fixes for issues #5 / #6: **the MCP task model was disconnected from the state of the turn inside
170
+ the Codex GUI**. The former is the completion-detection deadlock that kept reporting `running`
171
+ while Codex waited for user confirmation; the latter is `cancel_task` only aborting the MCP-side
172
+ wait loop, never stopping the in-GUI run, with a misleading description. Both share the same root
173
+ cause and are resolved together.
174
+
175
+ ### Fixed
176
+
177
+ - **Waiting-for-user detection (issue #5)**:
178
+ - `judgeCodexPoll` gains a stall fallback: while the stop button stays visible and the
179
+ conversation hash is unchanged for `gui.stallTimeoutMs` (default 5 minutes), the task
180
+ transitions to `needs_user` (`needsUserKind=user_confirmation`) instead of deadlocking in
181
+ `running` until the overall timeout; the stall timer resets as soon as content changes again.
182
+ - New configurable UI detection `gui.selectors.userGate` (e.g. the embedded-checkout page or
183
+ approval cards): when configured and matched, transitions to `needs_user` immediately.
184
+ Unset by default (disabled) — no unverified selectors are built in.
185
+ - Tightened the `stopButton` selector: removed the `aria-label*="取消"` over-match (the Cancel
186
+ button on waiting-for-user screens used to be mistaken for a running signal).
187
+ - **Recovery path (issue #5 fallout)**: `continue_task` now supports codex —
188
+ - `user_confirmation`: after the user completes the action in the Codex window, resume by
189
+ re-attaching as an observer of the in-GUI run (no message is sent); if the turn already
190
+ finished before resuming, the task is still judged `succeeded` correctly;
191
+ - `login_required`: after login, re-checks the environment and re-dispatches the task brief
192
+ (fresh session + project binding + full initial prompt);
193
+ - zcode recovery behaviour is unchanged; other agents are rejected explicitly.
194
+ - **Cancel actually stops the GUI (issue #6)**:
195
+ - `cancel_task` no longer succeeds on request alone for GUI agents: it first best-effort clicks
196
+ the in-app stop button over CDP, then waits (bounded by `gui.cancelWaitMs`, default 15s) for
197
+ the GUI to become idle before settling `cancelled`; if the stop could not be confirmed the
198
+ terminal message states "GUI 内运行未确认停止…" (the in-GUI run may still be going);
199
+ - process-tree termination for CLI agents is unchanged;
200
+ - cancelling from `needs_user` now notes that a pending session may remain in the GUI
201
+ (no CDP connection exists at that point — documented limitation).
202
+ - **Re-dispatch anti-overlap guard (issue #6 chain risk)**: when dispatching, if the managed
203
+ instance still has an unstopped run, MCP first tries to stop it; if it cannot, the dispatch
204
+ fails hard with `instance_busy`, preventing old and new turns from overlapping inside the same
205
+ app (observed in the wild when re-dispatching right after a cancel).
206
+ - The startup log no longer hardcodes the tool count as `8`; it reports the actual registry size
207
+ (`TOOL_DEFS.length`, currently 9).
208
+
209
+ ### Changed
210
+
211
+ - Tool descriptions match actual semantics: `cancel_task` distinguishes CLI (kill process tree)
212
+ from GUI (best-effort stop click + bounded wait); `continue_task` no longer claims to be
213
+ ZCode-only.
214
+ - `GuiProfile` gains two configurable options, `stallTimeoutMs` (default 300000) and
215
+ `cancelWaitMs` (default 15000), both overridable via agent-profiles.json.
216
+ - Skill docs (SKILL.md §4/§5, usage-examples.md §7) document the codex `user_confirmation` /
217
+ `login_required` recovery flows, GUI cancel semantics and the new options.
218
+
219
+ ---
220
+
221
+ ## [0.3.1] — 2026-09-12
222
+
223
+ Post-v0.3.0 housekeeping for docs and release automation: **no source-level behavior changes**.
224
+ The focus is a full rewrite of the self-installed skill docs plus GitHub/Gitee release-body
225
+ composition and link fixes.
226
+
227
+ ### Changed
228
+
229
+ - **Skill docs (`skills/tianshu-mcp/`) fully rewritten to match the actual v0.3.0 tool surface**:
230
+ - Corrected the `codex` description from "headless CLI" to the ChatGPT desktop GUI adapter
231
+ (MSIX + COM activation + CDP); documents the required `model`, optional `reasoningLevel` /
232
+ `planDoc` / `designSystem`, and that `mode` is not supported;
233
+ - Documented the `run_task` `context` parameter and the send-time validation of path references
234
+ inside task/context; corrected the `autoFixRounds` default precedence
235
+ (call argument > codex 5 / zcode 2 > server default 0);
236
+ - Added usage for `list_tasks`, `query_task(tailLines)`, `get_task_report(round)` and
237
+ `verify_task` (`extraChecks` / `checksMode` / `baselineRef`) plus the four-level acceptance
238
+ command precedence;
239
+ - Documented the four `needs_user` kinds and meta fields such as `needsUserKind` /
240
+ `pendingQuestion` / `errorType` / `reportRound` / `verificationSource`;
241
+ - Added `continue_task` to the approval list; replaced emoji status markers with plain text
242
+ (PASS / warning) in the usage examples.
243
+ - **Release automation fixes (exposed by the v0.3.0 tag)**:
244
+ - The release body is now composed bilingually from `docs/release-v<version>.md` and `.en.md`,
245
+ with in-document relative links rewritten to tag-absolute links; a missing doc fails the
246
+ workflow loudly instead of producing a shell-only body;
247
+ - `Full Changelog` resolves the previous tag via `git describe` into a `compare/<prev>...<tag>`
248
+ link instead of degrading to a commits link;
249
+ - The body's `CI` link resolves the CI run for the same SHA instead of pointing at the Release run;
250
+ - Gitee releases are automated in `release.yml`: `scripts/gitee-release.mjs` idempotently
251
+ creates/updates the mirrored release (requires the `GITEE_TOKEN` secret; skipped loudly when unset).
252
+ - `.gitignore` now ignores npm pack artifacts and local temporary verification directories.
253
+ - Added the missing `[0.1.10]` / `[0.2.0]` / `[0.3.0]` / `[0.3.1]` compare links at the bottom of
254
+ this file and its Chinese counterpart.
255
+
256
+ ---
257
+
258
+ ## [0.3.0] — 2026-09-12
259
+
260
+ The Codex desktop app now runs through a **GUI driver**: a new `codex-gui` adapter uses MSIX COM activation
261
+ plus CDP to drive the ChatGPT desktop app through the full loop (locate install → launch GUI → bind/create
262
+ project → pick model and reasoning level → send instructions → run detection → verify → auto-repair).
263
+
264
+ ### BREAKING CHANGES
265
+
266
+ - **`agentId=codex` now executes via the desktop GUI instead of the headless CLI**: a new `driver=gui` +
267
+ `adapter=codex-gui` + `activation=msix-com`, with the previous **`codex exec` headless path removed**.
268
+ After upgrading, `run_task(agentId="codex")` launches and drives the Codex desktop window rather than a
269
+ headless child process. To keep headless execution, add a separate `driver=spawn` profile
270
+ (`argsTemplate: ["exec", "<prompt:arg>", "--skip-git-repo-check", "--sandbox", "workspace-write"]`) as
271
+ documented in `docs/agent-profiles.en.md`.
272
+ - This path requires the Codex desktop app (MSIX store package) to be installed; CLI-only environments are
273
+ no longer directly supported.
274
+
275
+ ### Added
276
+
277
+ - `codex-gui` adapter (`src/agents/codex/**`): Appx-first install discovery (scan fallback taking the newest
278
+ version), MSIX COM activation with a dedicated `user-data-dir` and dynamic debug port, plus CDP attach and
279
+ target convergence (excluding the overlay secondary window).
280
+ - Task parameters: `reasoningLevel` (low/medium/high, bilingual), `planDoc`, `designSystem`.
281
+ - Model and reasoning level: models are `menuitemradio` candidates while **reasoning strength is a slider**
282
+ (0–4: 轻度/中/高/极高/极高), set precisely with arrow keys and read back for verification; level
283
+ comparison is exact to avoid matching "高" against "极高".
284
+ - **Automatic project registration**: a target directory not yet registered on the Codex side is written
285
+ directly into Codex project state (idempotent, backup-before-write, atomic write, only while the
286
+ MCP-managed instance is stopped), so it takes the stable bound-project path instead of the brittle native
287
+ folder dialog; on failure it falls back to UI creation.
288
+ - Verification and repair: reuses the existing AcceptanceEngine (defaults derived from `package.json`, with
289
+ weak-verification labelling); on failure the MCP generates an in-project
290
+ `.zcode/plans/codex-fix-r<N>.md` (one per round, never overwritten) and cites it in the repair instruction,
291
+ up to 5 rounds by default (`defaultAutoFixRounds`).
292
+ - Run detection: the stop button is the authoritative running signal, and text stability counts as completion
293
+ evidence only after it; without a running signal it fails open to `idle_timeout` while keeping the instance
294
+ (never a false completion).
295
+ - `scripts/probe-codex.mjs` hardware diagnostic script; 67 Codex unit tests plus integration coverage of the
296
+ verify-fail → generated plan → repair-pass loop.
297
+ - Docs: `docs/codex-gui-cdp.en.md`, `docs/codex-windows-smoke.en.md` (including the round-2 real business task
298
+ acceptance) and their Chinese counterparts.
299
+
300
+ ### Changed
301
+
302
+ - `GuiProfile` gains `activation` / `userDataDir` / `appxPackageName` / `permissionMode` / `fixPlanDir`;
303
+ existing `spawn` profiles are unaffected.
304
+ - `ExecutableDiscovery` gains `appxPackageName` / `installRelativeExe` / `scanRoots` / `scanPattern`.
305
+
306
+ ### Fixed (exposed by hardware testing)
307
+
308
+ - The model trigger mis-matched the sibling permission chip (4 chips share `aria-haspopup`; only the model chip
309
+ lacks `aria-label`).
310
+ - Reasoning strength was clicked like a menu item and could never be set (it is actually a slider).
311
+ - Menus/popovers only open on **trusted** mouse events (DOM `.click()` is ignored).
312
+ - A transient empty model read during toolbar re-render after binding was treated as a "model mismatch".
313
+ - Model/reasoning trigger selectors now exclude the top menu bar and the mode switcher.
314
+ - Cold-start readiness budget widened to 150s (registration stops the instance first; cold start measured ~85s).
315
+ - CI: fixed a `normalizeDir` assertion that depended on the host platform, which failed on ubuntu/macos.
316
+ - Fixed integration tests polluting real Codex project state by not injecting `ensureRegistered`.
317
+
318
+ ### Verification
319
+
320
+ - Windows 10 x64 hardware: full loop for a registered project, and the verify-fail → generated plan →
321
+ repair-pass loop; an unregistered project completed the full loop after automatic registration.
322
+ - Real business task: drove Codex to build a "Fruit Ninja" mini-game in HTML+CSS+JS (`GPT-5.6 Sol` with
323
+ reasoning strength "高"); the artifacts passed acceptance and were verified playable in a headless browser
324
+ (score rises, lives decrement, Game Over and restart work, no JS exceptions).
325
+ - macOS unverified: the built-in Codex GUI status is `research` and is excluded from readiness.
326
+
327
+ ---
328
+
329
+ ## [0.2.0] — 2026-09-11
330
+
331
+ ### Added
332
+
333
+ - Dedicated `zcode-gui` Electron CDP adapter with data-driven Windows/macOS discovery, dynamic ports, product/process checks, and a global serial lock.
334
+ - Exact ZCode project binding, guarded native folder pickers, `provider/model`, Full Access read-back, and idempotent sending.
335
+ - Paused `needs_user` state and approval-gated `continue_task` for original-session answers and environment rechecks after instance, login, or permission handling.
336
+ - Multi-signal liveness, progress events, UI preservation, default auto-verification, and two same-session repair rounds. Repair plans stay in MCP task storage.
337
+ - `scripts/probe-zcode.mjs`, fake-CDP/state/path/model tests, and bilingual documentation.
338
+
339
+ ### Safety and compatibility
340
+
341
+ - GUI profiles support an explicit `adapter`; legacy `driver="gui"` profiles retain TraeWork behavior.
342
+ - The built-in ZCode profile remains `research` until both real platform loops pass.
343
+ - No private `app-server`, credential access, automatic user-instance termination, or fixed screen coordinates.
344
+
345
+ ### Fixed and verified
346
+
347
+ - Fixed ZCode read-back for dynamic model labels, transient renderer load/reload, delayed new-session registration, and stale session-ID contamination.
348
+ - `AskUserQuestion` continuation now selects and submits an exact accessible option in the original session; zero or ambiguous matches fail closed.
349
+ - Windows 10 x64 passed three hardware loops: real file development, same-session repair after a controlled failure, and `continue_task` after a model question. macOS hardware evidence remains pending.
350
+
351
+ ---
352
+
353
+ ## [0.1.10] — 2026-09-10
354
+
355
+ ### Fixed
356
+
357
+ - **Fixed stdio log pollution (issue #1)**: the unified logger previously sent only ERROR to
358
+ `console.error` while INFO/WARN/DEBUG went to `console.log`, sharing stdout with MCP JSON-RPC
359
+ messages and breaking handshakes or tool calls in strict stdio clients. All levels passing the
360
+ threshold now go to stderr, leaving stdout for valid MCP messages only.
361
+ - Log file appending, timestamps, level tags and the `<data dir>/logs/server.log` path are unchanged;
362
+ a startup failure is still reported on stderr.
363
+
364
+ ### Added
365
+
366
+ - New `scripts/check-stdio.mjs` strict stdio smoke: a real child process validates the complete
367
+ stdout/stderr byte stream, allowing only newline-delimited, schema-valid MCP JSON-RPC messages on
368
+ stdout; empty lines, non-JSON lines, parser errors, or trailing fragments at exit fail the run.
369
+ It covers six scenarios: first start, second start with matching skills, `--no-skill-install`,
370
+ a corrupt `config.json`, logs during a stub task, and clean EOF shutdown.
371
+ - New `npm run check:stdio` and `npm run check:stdio:src` scripts.
372
+
373
+ ### Tests
374
+
375
+ - New `test/unit/log.test.ts`: real-child-process checks for the four log levels' channels, default
376
+ INFO filtering, threshold-filtered file logging, and UTF-8 content (4/6 failed before the fix; see
377
+ `docs/m2-evidence/issue1-old-impl-log-test-failure.txt`).
378
+ - CI's three-platform matrix now includes Node 24; the build step runs the strict stdio check instead
379
+ of an EOF-exit-only smoke.
380
+ - CI `pack-check` and Release install the freshly built tarball into a clean consumer directory, read
381
+ the installed bin dynamically, and reuse the same strict stdio check; Release adds `lint` and the
382
+ installed-package protocol gate, failing before a draft is created.
383
+ - ESLint enables `no-console` (allowing `error` only) for `src/**/*.ts` to prevent new direct stdout writes.
384
+
385
+ ---
386
+
387
+ ## [0.1.9] — 2026-09-09
388
+
389
+ ### Fixed
390
+
391
+ - Fixed premature TraeWork completion while the model was still thinking but the DOM stayed unchanged for about 36 seconds.
392
+ The stop button and loading task tail are now authoritative running signals and override completion marks; stable rounds now
393
+ start an idle timer, which defaults to ten minutes before returning `idle`.
394
+ - Fixed permanently pending `Runtime.evaluate` calls after a CDP WebSocket disconnect. Close/error rejects all pending requests,
395
+ each CDP command has a 15-second default timeout, and task cancellation is observed within about one second.
396
+ - Only `completion_mark` / `ask_user` release an instance launched by this module. Idle, timeout, cancellation, and CDP loss retain
397
+ it, with `agentEndReason` / `keptInstance` exposed in task metadata.
398
+ - Fixed a shutdown race where an orchestrator still collecting its baseline could remain `queued` and be mislabeled as a user
399
+ cancellation. User cancellation is now determined only from structured cancellation intent.
400
+
401
+ ### Added
402
+
403
+ - Polling emits a progress event visible through `query_task` every 30 seconds by default.
404
+ - Added `gui.idleTimeoutMs`, `gui.cdpSendTimeoutMs`, `gui.progressIntervalMs`, and five overrideable liveness selectors.
405
+
406
+ ### Testing
407
+
408
+ - Added liveness truth-table, CDP timeout/disconnect convergence, selector-expression, and fake-CDP instance-retention regressions.
409
+ - Windows/macOS/Linux × Node 20/22 and tarball gates remain covered.
410
+
411
+ ---
412
+
413
+ ## [0.1.8] — 2026-09-08
414
+
415
+ ### Fixed
416
+
417
+ - **Atomic-write concurrency defect** (the real cause of intermittent CI failures): the temp filename in
418
+ `writeJsonAtomic`/`writeTextAtomic` was `<target>.<pid>.tmp`, so concurrent writes to the same target in one
419
+ process shared one temp file - the first to finish renames it away and the next throws `ENOENT`; on Windows a
420
+ concurrent rename can also throw `EPERM`. Symptom: `rework_task` intermittently returned an `undefined` meta
421
+ (hit on CI windows/Node 20). Fixed by a random temp suffix plus backoff-retry on transient rename errors.
422
+
423
+ ### Testing
424
+
425
+ - New `test/unit/atomic-write.test.ts` (3 cases: concurrent JSON/text writes all succeed, no leftover temp files).
426
+
427
+ ---
428
+
429
+ ## [0.1.7] — 2026-09-08
430
+
431
+ ### Fixed
432
+
433
+ - **Project-folder binding still failed** (v0.1.6 did not fully resolve it; field report: the native dialog
434
+ appeared but the edit box was empty and confirm was clicked anyway):
435
+ - **Root cause**: the MCP passes a `normPath()`-normalized path (lowercase drive + forward slashes, e.g.
436
+ `d:/Trae项目/AI游戏/象棋`), which the **native Windows picker rejects** — measured: read-back matched, yet the dialog
437
+ stayed open after confirm. Fix: convert via the new `toNativeWindowsPath()` to `D:\a\b`.
438
+ - `WM_GETTEXT` **read-back verification** after writing; on mismatch re-locate and retry (up to 3 times);
439
+ if it still mismatches, **never click confirm** and fail loudly.
440
+ - The hwnd detected after the footer click is **passed into the write script**; after clicking, success
441
+ requires that hwnd to be gone.
442
+ - **Auto-close stale dialogs** (left over from a previous failure) before binding.
443
+ - Confirm button now also requires its rect to be in the lower half of the dialog.
444
+ - The dialog script's full trace (HWND/READBACK) is written to the task log.
445
+
446
+ ### Testing
447
+
448
+ - Total tests **172 → 181** (unit incl. path normalization and atomic-write concurrency; integration incl. stale-dialog cleanup).
449
+ - Machine-verified: a new Chinese project `D:\Trae项目\AI游戏\象棋` (absent from the dropdown)
450
+ passed end-to-end through the native dialog; `五子棋` and the ASCII project `ts-bind-test` regressed green.
451
+
452
+ ---
453
+
454
+ ## [0.1.6] — 2026-09-08
455
+
456
+ ### Fixed
457
+
458
+ - **Project-folder binding got stuck / reported "waiting for native dialog timed out"** (field report; the adapter was not broken):
459
+ - `clickDropdownFooter` used to trust `element.click()`'s return value, but the native popup may never
460
+ appear → it now **confirms the dialog actually appeared**, otherwise it logs a dropdown DOM snapshot and fails loudly.
461
+ - Dialog detection polled from Node every 800 ms while PowerShell cold start is ~4.5–6 s, so a 15 s budget
462
+ allowed only ~2 probes → now it polls **inside a single PowerShell call** (400 ms interval) with a 30 s budget.
463
+ - **CJK paths were corrupted** (measured: `D:\Trae项目\ts-bind-test` became `D:Traes-bind-test`):
464
+ SendKeys/clipboard are mangled by the console code page → the path is now written via Win32
465
+ **`WM_SETTEXT`**, which is fully reliable for CJK.
466
+ - **The confirm click hit a file-list row**: `AutomationId="1"` is not unique (rows also use 0/1/2…) →
467
+ now located by **AutomationId=1 AND ControlType=Pane**, then clicked by bounding rect.
468
+ - PowerShell output was garbled for Chinese → the script now emits **ASCII-only** and Node maps it back
469
+ via `localizeDialogMessage()`.
470
+
471
+ ### Added
472
+
473
+ - **Non-Work binding fallback**: when binding fails in Code/Design, the driver **falls back to Work once**,
474
+ switches back to the target mode, and re-verifies the project is still bound; only if both attempts fail
475
+ does it report an error including the reason from each mode.
476
+ - Machine-verified: for a project **absent from the dropdown** (`D:\Trae项目\ts-bind-test`),
477
+ `run_task(agentId=traework, mode=Code)` passed end-to-end — native dialog wrote the path → confirm clicked →
478
+ project entered TraeWork's list (`solo-lite.local-project-folders` 22→23) → task sent → auto-verification `succeeded`.
479
+
480
+ ### Changed
481
+
482
+ - `docs/traework-cdp.md` / `.en.md`: 7 new pitfall entries; added the "dropdown entries ≠ project map" fact and the fallback note.
483
+
484
+ ### Testing
485
+
486
+ - Total tests **167 → 172** (new dialog message-mapping/platform-branch unit tests + Code→Work fallback integration test).
487
+
488
+ ---
489
+
490
+ ## [0.1.5] — 2026-09-08
491
+
492
+ ### Added
493
+
494
+ - **TraeWork panel mode switching**: `run_task` gained a `mode` parameter supporting `Work` / `Code` / `Design`.
495
+ - Resolution order: explicit `mode` parameter > task-text detection > keep `Work`.
496
+ - Text detection handles mixed Chinese/English phrasing ("switch to Code mode", "use design mode", "工作模式", "代码模式", "设计模式", …).
497
+ - New `gui.modeSwitch` profile switch (default `true`).
498
+ - New pure functions `detectModeFromText` / `resolveMode` (unit-tested).
499
+ - **Dedicated SVG assets**: `assets/tianshu-mcp-icon.svg` (app icon), `assets/tianshu-mcp-banner.svg` (wide banner).
500
+ - New `scripts/probe-traework.mjs mode <Work|Code|Design>` subcommand (real-machine diagnostics/verification).
501
+ - New bilingual release notes `docs/release-v0.1.5.md` / `.en.md`.
502
+
503
+ ### Changed
504
+
505
+ - **TraeWork execution order**: measurement showed the three modes **each keep an independent project binding** —
506
+ switching modes replaces the input bar's project with whatever that mode last used.
507
+ Order is now: ensure instance → wait for UI → new session → switch to target mode → bind project inside that mode → switch model → send.
508
+ - After binding, both mode and project are re-verified; any mismatch **fails loudly** (never silently develops in the wrong mode).
509
+ - meta block now exposes `model` / `mode` for Tianshu to read back.
510
+ - `package.json`: `license` changed from `MIT` to `Apache-2.0` (matching the repository `LICENSE` file);
511
+ added `repository` / `homepage` / `bugs`; `files` now includes `assets`.
512
+ - README.md / README.en.md fully rewritten: stack badges, SVG banner (above the icon), language isolation
513
+ (the Chinese README references Chinese docs only; the English README references English docs only).
514
+
515
+ ### Fixed
516
+
517
+ - **Rework feedback race** (pre-existing; intermittent under load): the terminal snapshot is written first, so a caller's
518
+ immediate `rework_task(feedback)` could be erased by the previous run's `delete meta.reworkFeedback`, leaving the rework
519
+ round without feedback. Now the feedback is consumed and cleared atomically when `startTask` begins.
520
+ Added regression test `test/integration/rework-feedback-race.test.ts`.
521
+ - **`projectBasename` cross-platform**: it used `path.basename` (which does not split backslashes on POSIX), failing
522
+ Linux/macOS CI; now it splits explicitly on both `\` and `/`.
523
+
524
+ ### Testing
525
+
526
+ - Total tests **153 → 167** (14 new mode-related cases).
527
+ - Real-machine end-to-end: `mode=Work` / `mode=Code` / `mode=Design` all completed
528
+ "switch mode → bind project → send → create file → auto-verification passed".
529
+
530
+ ---
531
+
532
+ ## [0.1.4] — 2026-09-08
533
+
534
+ ### Added
535
+
536
+ - TraeWork GUI driver over CDP: `traework` moved from `unsupported` to `driver=gui` / `status=ready`.
537
+ - Capabilities: launch/reuse instance → new session → bind project folder (dropdown first, restricted computer-use
538
+ native dialog as fallback) → optional model selection → read-back-verified send → poll to completion →
539
+ auto-verify → repair-plan file + same-session rework on failure.
540
+ - Safety: reuse the user's instance by default, never kill a process tree, verify the command line before terminating;
541
+ computer-use is limited to TraeWork's folder picker.
542
+ - `AgentAdapter` gained an optional `run()` execution surface; the orchestrator branches on `adapter.run`
543
+ (CLI agents still use spawn).
544
+ - Profile gained `driver` (`spawn` / `gui`) and a `gui` section; `run_task` gained a `model` parameter.
545
+ - New `src/agents/traework/**` (CDP client, selector table, launcher, session/input/model/reply modules, restricted computer-use).
546
+ - On verification failure a repair-plan file `rework-<taskId>-r<N>.md` is generated (task dir + project `.tianshu-mcp`)
547
+ and its filename is referenced in the rework message.
548
+
549
+ ### Changed
550
+
551
+ - `docs/adapter-matrix.md` T1 conclusion corrected from `unsupported` to "integrated (driver=gui)".
552
+ - formatter now passes cancel-source fields (`abortSource`, …) through to `query_task`'s meta block.
553
+
554
+ ### Fixed
555
+
556
+ - Unified timeout terminal state: normal timeouts now also land `failed(timeout)` plus exactly one `timeout_killed` event, in fixed order.
557
+ - Stabilized the `shutdown` test polling.
558
+
559
+ ### Testing
560
+
561
+ - Total tests **72 → 153** (new TraeWork unit/integration cases).
562
+ - Real-machine end-to-end: `run_task(agentId=traework, model=GLM-5.3, autoVerify=true)` drove TraeWork to create a file and passed acceptance.
563
+
564
+ ---
565
+
566
+ ## [0.1.3] — 2026-09-08
567
+
568
+ ### Fixed
569
+
570
+ - **S1** No-reason cancel was mis-recorded as `interrupted`: added independent `cancelRequestedAt` / `abortSource` fields;
571
+ cancel intent no longer depends on the optional `reason` (5 regression tests).
572
+ - **S2** Unified timeout terminal state (shared with 0.1.4).
573
+ - **S3** Tracked pre-dirty net-diff attribution: pre-existing dirty files are excluded by content hash when unchanged;
574
+ unchanged staged/unstaged files are no longer reported as agent changes (4 regressions).
575
+ - **S4** `verify_task(taskId)` persists real-task metadata (`reportRound` / `verificationSource` /
576
+ `latestVerificationVerdict`, keeping `agentId`); single-source MCP version (`sync-version` injection).
577
+ - **S5** `projects.json` official Zod schema + last-known-good for `config`/`profiles`/`projects` + content-sha256
578
+ hot-reload invalidation (fixed corrupt JSON being treated as missing and reset).
579
+
580
+ ### Changed
581
+
582
+ - **S6** CI/Release `npm ci` retry corrected (stop on success / 3 attempts / attempt counter);
583
+ Vitest v3 upgrade (0 audit vulnerabilities); plain-text status markers (emoji scan test).
584
+
585
+ ### Testing
586
+
587
+ - Total tests **53 → 72**.
588
+
589
+ ---
590
+
591
+ ## [0.1.2] — 2026-09-08
592
+
593
+ ### Changed
594
+
595
+ - Build no longer ships source maps (no `.map`, tarball ≈ 69.9 KB).
596
+
597
+ ### Testing
598
+
599
+ - Total tests **53**.
600
+
601
+ ---
602
+
603
+ ## [0.1.1] — 2026-09-07
604
+
605
+ ### Added
606
+
607
+ - **Release after the R1–R5 fixes**:
608
+ - **R1** Cancel/interrupt state persistence (`cancel_requested → cancelled`, `cancelReason`/`finishedAt`/`errorType`
609
+ persisted, restart-recoverable, idempotent, bounded shutdown).
610
+ - **R2** Call-level `taskTimeoutMs` precedence fix + cross-platform process-tree termination
611
+ (POSIX process-group SIGTERM→SIGKILL, Windows `taskkill /T /F`).
612
+ - **R3** Git baseline participates in diff (boundary at `baseline.head`; agent commits do not lose changes;
613
+ dirty-worktree hash attribution).
614
+ - **R4** Verification tool parameters and report-round semantics (`round=0` valid, manual verify does not overwrite
615
+ reports, `extraChecks` append + `checksMode=replace`, `optional` does not affect verdict, `baselineRef` validated).
616
+ - **R5** Removed hardcoded agent paths (`{LOCALAPPDATA}` placeholders + platform-standard candidates);
617
+ mtime hot reload for `config`/`profile`/`projects`.
618
+ - **R6** Cross-platform CI matrix (Windows/macOS/Linux × Node 20/22) and Release version consistency
619
+ (tag/input = `package.json` = tarball), plus tarball content checks.
620
+ - **R7** npm published `tianshu-mcp@0.1.1` + `npx -y` raise with 8 tools connected.
621
+ - **R8** Bilingual docs synced (including 4 English topic docs).
622
+
623
+ ---
624
+
625
+ ## [0.1.0] — 2026-09-07
626
+
627
+ ### Added
628
+
629
+ - First usable release: **M1 core engine + stub-agent end-to-end**.
630
+ - 8 MCP tools: `run_task` / `query_task` / `list_tasks` / `get_task_report` / `cancel_task` / `verify_task` /
631
+ `rework_task` / `get_profiles`.
632
+ - `TaskManager` state machine / per-project serial queue / global concurrency gate / cancel (kill tree) / event-stream persistence.
633
+ - Acceptance engine: git baseline & diff, default check-set derivation, command runner, code analysis,
634
+ `report.md` / `report.json`.
635
+ - fix-loop auto rework + `needs_attention`; skill self-install.
636
+ - Stub-agent 3 playbooks (good / fix-on-first / never) integration tests + protocol tests — **53/53 green**.
637
+
638
+ ---
639
+
640
+ [Unreleased]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.4.1...HEAD
641
+ [0.4.1]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.4.0...v0.4.1
642
+ [0.4.0]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.3.4...v0.4.0
643
+ [0.3.4]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.3.3...v0.3.4
529
644
  [0.3.3]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.3.2...v0.3.3
530
- [0.3.2]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.3.1...v0.3.2
531
- [0.3.1]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.3.0...v0.3.1
532
- [0.3.0]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.2.0...v0.3.0
533
- [0.2.0]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.10...v0.2.0
534
- [0.1.10]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.9...v0.1.10
535
- [0.1.9]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.8...v0.1.9
536
- [0.1.8]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.7...v0.1.8
537
- [0.1.7]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.6...v0.1.7
538
- [0.1.6]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.5...v0.1.6
539
- [0.1.5]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.4...v0.1.5
540
- [0.1.4]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.3...v0.1.4
541
- [0.1.3]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.2...v0.1.3
542
- [0.1.2]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.1...v0.1.2
543
- [0.1.1]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.0...v0.1.1
544
- [0.1.0]: https://github.com/lanlan0811/tianshu-mcp/releases/tag/v0.1.0
645
+ [0.3.2]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.3.1...v0.3.2
646
+ [0.3.1]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.3.0...v0.3.1
647
+ [0.3.0]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.2.0...v0.3.0
648
+ [0.2.0]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.10...v0.2.0
649
+ [0.1.10]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.9...v0.1.10
650
+ [0.1.9]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.8...v0.1.9
651
+ [0.1.8]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.7...v0.1.8
652
+ [0.1.7]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.6...v0.1.7
653
+ [0.1.6]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.5...v0.1.6
654
+ [0.1.5]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.4...v0.1.5
655
+ [0.1.4]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.3...v0.1.4
656
+ [0.1.3]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.2...v0.1.3
657
+ [0.1.2]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.1...v0.1.2
658
+ [0.1.1]: https://github.com/lanlan0811/tianshu-mcp/compare/v0.1.0...v0.1.1
659
+ [0.1.0]: https://github.com/lanlan0811/tianshu-mcp/releases/tag/v0.1.0