# Changelog

This project follows [Semantic Versioning](https://semver.org/). Chinese version: [CHANGELOG.md](CHANGELOG.md).

## [1.1.4] - 2026-10-19

### Fixed

- **Host-requirement verdicts on a `0.2.1-rc.2` host**: the five `@deepseek-ai/dsh-*` peer ranges used to read `^0.1.0-rc.6 || ^0.2.0-rc.1`. The **market verdict** (dshmarket's `deriveHostCompatibility`, which uses `includePrerelease`) called that compatible, but **strict semver** (the profile health check and dsh's own install gate use node-semver with the same bounds) does **not** match `0.2.1-rc.2`: a prerelease only satisfies a range that names a prerelease on the **same `major.minor.patch`**, and `^0.2.0-rc.1` names the `0.2.0` tuple, so it cannot reach `0.2.1-rc.2`. The same machine therefore showed "market says compatible, health check / gate says mismatch".
  - Fix: the five `@deepseek-ai/dsh-*` peers now read **`^0.1.0-rc.6 || ^0.1.1-rc.1 || ^0.2.0-rc.1 || ^0.2.1-alpha.1`** (the last branch must start at `alpha` to cover all of `0.2.1`'s alpha/rc releases at once; `^0.2.1-rc.1` would miss `0.2.1-alpha.x`, and `>=0.1.0-rc.6 <0.3.0` misses nearly every prerelease under strict semver).

### Tests & verification

- **Range matrix** (dshmarket's `satisfiesRange`, run in both strict and `includePrerelease` modes): `0.1.0-rc.6/rc.7/rc.8`, `0.1.1-rc.1/rc.2`, `0.2.0-rc.1/rc.2`, `0.2.1-alpha.4/rc.1/rc.2`, `0.2.1`, `0.2.2` **all pass (✓ strict and loose)**; `0.3.0` is correctly excluded.
- **Measured against the real host**: this machine's Desktop app is **0.2.1-rc.2** (`dsh` / `dsh-base` / `dsh-web-app` / `dsh-desktop-host` / `dsh-tools` / `dsh-client-locale` / `dsh-client-ui-conversation` all `0.2.1-rc.2` in `app.asar`). Running the dependency-install verdict with the real host package inventory (**381 `@deepseek-ai/*` packages**) gives `status=compatible`, `requirement` = the new range, `crossesImplicitCeiling=false`.
- **The client half is unaffected**: `lib/client.js` only requires `react` and `react/jsx-runtime`; at runtime it consumes host capabilities through `ctx.slots` / `ctx.locale` (the client module declares `inject: ["slots","locale"]`). Host `0.2.1-rc.2` still provides `dsh-client-ui-slots` (79 `"@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.2"` dependency declarations inside its asar).
  - Note: `@deepseek-ai/dsh-client-runtime` is no longer a standalone package in the 0.2.1-rc.2 desktop build (the frontend ships a bundled `client-runtime`), so that peer entry is skipped by the compatibility derivation (not in the host package inventory); it is kept for older hosts that still publish it separately.

### Release

- npm: `dsh-unitverse@1.1.4`
- GitHub: https://github.com/runcat-tommy/dsh-unitverse

## [1.1.3] - 2026-10-16

### Docs

- **Rewrote the installation section as three parallel routes**: route 1 install straight from GitHub / route 2 download from GitHub and install locally / route 3 install from npm (recommended). Each route now states **who it suits, what to watch out for, and how to update**, backed by a side-by-side table and a one-line summary. The previous "Option 1–4" list enumerated commands by source, which hid the differences in **updating and build approval** between routes.
  - Documented what `dsh plugin` really is: a thin **forwarder for pnpm** (`dsh plugin --profile <name> <args…>` ≡ running `pnpm <args…>` inside that profile directory, after which DSH re-aligns `dsh.profile.bundles`), so `add` / `up` / `remove` / `list` are all pnpm commands.
  - Added the update command (`up`), uninstall (`remove`) / inspection (`list`), and the offline tarball path.
- **Split the screenshots by language**: `README.md` now carries only the Chinese UI screenshot and `README.en.md` only the English one, each pointing at the other README. Both used to embed both images, so an English reader saw a Chinese-UI screenshot inside an English document.
  - `screenshots.json` is **unchanged and still lists both**: the market detail page does not distinguish browser language, so dropping one would leave the other locale without a preview.

### Changed

- Did **not** adopt the `package.json` `readme` field (the npm page keeps showing the English README via this repo's existing publish-time swap of `README.md`): empirically the field is written **verbatim** into the registry packument's `readme` (after `dsh-mcp-mini-manager` was published that way, the root `readme` was the 12-character string `README.en.md`), and that field is exactly what the npm page renders — so it replaces the page with a bare filename. For comparison, packages without the field (`dsh-unitverse` 1.1.2, `dsh-panda-calendar`, `dsh-skill-mini-manager`, `dsh-windows-c-cleanup`) all carry the full README text there.

### Release

- npm: `dsh-unitverse@1.1.3`
- GitHub: https://github.com/runcat-tommy/dsh-unitverse

## [1.1.2] - 2026-10-16

### Fixed

- **The community market classified the plugin as incompatible with the current DSH**: `package.json` declared the four client packages with `^0.1.0-rc.6` (i.e. `>=0.1.0-rc.6 <0.2.0`), but the DSH release line has moved to **0.2.x** — the Desktop app on this machine ships `0.2.0-rc.2`, including `dsh-client-locale` / `dsh-client-ui-conversation` / `dsh-client-ui-slots` at `0.2.0-rc.2`. By the market's own logic (dshmarket's `discovery-compatibility.js` plus `crossesImplicitCeiling` in `compatibility.js`), a host past the implicit `^0.1.x` ceiling counts as "the declared line is behind us", so the verdict was **incompatible**: once listed, 0.2.x users installing or updating would be told the plugin "declares DSH ^0.1.0-rc.6 while you are running 0.2.0-rc.2" and offered "no version declaring compatibility with the current DSH".
  - Fix: the four client ranges and `@deepseek-ai/dsh-tools` now read **`^0.1.0-rc.6 || ^0.2.0-rc.1`**. Re-running the same derivation returns **compatible** for hosts `0.1.0-rc.6`, `0.1.1-rc.2` and `0.2.0-rc.2`.
  - Also fixed `@deepseek-ai/dsh-tools: "*"`: a bare `*` does not match a prerelease under strict semver (here it resolved to `0.1.0-rc.8`), which the profile health check reported as `peer range @deepseek-ai/dsh-tools@* does not match resolved 0.1.0-rc.8`. Five plugins on this machine share that pattern.
- The READMEs (both languages) now state the requirement as "0.1.0-rc.6+ or 0.2.x" instead of "0.1.0-rc.6+", matching the new declarations.

### Release

- npm: `dsh-unitverse@1.1.2`
- GitHub: https://github.com/runcat-tommy/dsh-unitverse

## [1.1.1] - 2026-09-10

### Added

- Added the `dsh.marketplace` declaration to `package.json` (`profiles: ["web"]`, `requiresBuildApproval: false`, `requiresRestart: true`, `manualSteps: false`). The field was missing while every sibling plugin already declared it: community market registries read it to decide which profiles a plugin maps to and whether installing it needs build approval, a restart or manual steps. The values match the plugin's real behaviour — runtime artifacts are committed and there are no `preinstall` / `install` / `postinstall` / `prepare` lifecycle scripts, so no build approval is needed; the plugin ships a web client, which the registry rule maps to `web` only; the host-side tool needs a restart to take effect; installation has no manual steps.

### Release

- npm: `dsh-unitverse@1.1.1`
- GitHub: https://github.com/runcat-tommy/dsh-unitverse

## [1.1.0] - 2026-09-10

The web converter view kept working, but the model-facing `convert` tool **rejected every single call** since 0.1.0 because of host output validation. This release fixes that blocking defect and repairs the temperature-difference (Δ) output and error text.

### Fixed

- **The `convert` tool could not be called at all**: the output schema declared only 7 properties while the engine returned 10 (it also returns `categoryEn`, `fromInput`, `toInput`), so under `additionalProperties: false` every call was rejected by the host with "returned invalid output". All three properties are now declared, keeping the caller's original spelling in the echo.
- **The Δ marker was dropped from a difference `summary`**: `10 Δ°C → Δ°F` used to read `10 °C = 18 °F`, i.e. it looked like an absolute-scale equality (the absolute `10 °C` is `50 °F`). Echoed units and `summary` now keep the marker: `10 Δ°C = 18 Δ°F (温度)`.
- **The absolute/Δ mismatch error doubled the marker into `ΔΔ`**: `Δ°C → K` used to suggest `use ΔΔ°C and K consistently` (`ΔΔ°C` is not a valid unit) and offered only one repair. It now prefixes `Δ` only to the side that lacks it and names both repairs: `use both with the Δ marker (Δ°C, ΔK) or both absolute (°C, K)`.
- Stray trailing space in the unknown-unit error message.
- Stale delta example in the core JSDoc, `convert(1, 'Δ°C', '°F')` → `convert(1, 'Δ°C', 'Δ°F')`. The original call is rejected as `mixed-delta`, and the comment ships inside `lib/*.d.ts`, so it handed library consumers a wrong example.

### Changed

- Echoed unit names for a difference conversion now carry the `Δ` prefix (`from` / `to` fields and `summary`), which tells an interval apart from an absolute reading. The web view is unaffected — it builds its own display strings and never reads `summary`.
- Tests grew from 88 to 92: a regression assertion that the output schema and the returned key set stay identical (so a missing declaration can never silently break the tool again), plus dedicated assertions for the delta echo and the non-doubled error hint.

### Docs

- `README.md` / `README.en.md`: document the full `convert` result shape (10 fields) and the delta echo / dual-repair error behaviour.

### Release

- npm: `dsh-unitverse@1.1.0`
- GitHub: https://github.com/runcat-tommy/dsh-unitverse

## [0.1.0] - 2026-09-10

First release.

### Added

- **`convert` tool**: converts across ten categories — length, area, volume, time, angle, speed, temperature, pressure, energy/heat and power — with 80+ common units (metric, imperial/US customary, common Chinese units).
- **Lenient unit spelling**: `km` / `KM` / `kilometer` / `千米` / `公里` all resolve; matching is case-insensitive and accepts symbols, English full names and Chinese names.
- **Two temperature modes**: absolute scales (°C / °F / K / °R) and temperature differences (`Δ°C` ↔ `Δ°F`); mixing the two is rejected with a clear error.
- **Web converter view** "单位换算 / Unit Converter": renders next to Conversation / Trajectory in the session view tab bar and runs purely in the browser (the conversion core is bundled into `lib/client.js`, so no model or server round-trip is involved).
  - One module per category: ten category tabs, and each module **only lists its own category's units**, so units are never mixed.
  - Units are picked from dropdowns (`symbol · name`) — nothing has to be typed; one-click swap and one-click copy of the result.
  - The temperature module adds a **difference Δ switch**; recent conversions are stored per category in browser localStorage.
  - All copy, **unit names included**, follows the DSH zh/en UI language and refreshes the moment the language changes.
- Results are rounded to ~10 significant digits by default; unknown units and cross-category requests return structured errors (`unknown-unit` / `category-mismatch` / `bad-value` / `mixed-delta`).

### Changed

- Renamed the plugin to **`dsh-unitverse`** (formerly `dsh-unit-conversion`; unit + universe). The tool is still `convert` and the view tab is still "单位换算 / Unit Converter".

### Release

- npm: `dsh-unitverse@0.1.0` (first publish; previously GitHub source only)
- GitHub: https://github.com/runcat-tommy/dsh-unitverse
- The browser half ships through the `dsh.client` declaration plus `exports["./client"]`; when it is not loaded, the tool keeps working unchanged.
