# Changelog All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/). ## [Unreleased] Planned work is tracked in exactly one place: the [Roadmap](./README.md#roadmap) in `README.md`. This file records what has shipped, so an item appears here only once it is implemented — not when it is merely intended. ### Changed - **Sharpened the install-cooldown note against a measured run.** Four minutes after `0.3.0` published, the bare `dsh plugin add @ltao0829/dsh-task-notify` resolved to `0.1.0` — pnpm's `minimumReleaseAge` window admits the newest release *older* than 24 hours, which is not necessarily the immediately previous one — and DSH refused it with an explicit peer-mismatch error and restored `package.json`, the lockfile, and `node_modules`. Both READMEs now describe that instead of "silently resolves to the previous release". ## [0.3.0] - 2026-10-02 The first feature release on the DSH 0.2 line: notification customization, a coverage regression gate, and an npm downloads badge. No peer range changed, so a `0.2.x` install upgrades in place. ### Added - **Notification customization.** The eight boolean switches gained user-facing configuration: - **Title / body templates** with `{title}` (task title), `{session}` (session ID), and `{kind}` (localized event type) placeholders; empty templates keep the built-in localized copy, unknown placeholders stay as written, and template output is rendered as plain text (`textContent`), so a template cannot inject markup. - **Sound styles**: none / single tone / the classic two-tone / a custom audio URL, plus a 0–100% volume control. A custom mode with an empty URL falls back to the two-tone; an unloadable URL degrades to silence. - **Toast placement and duration**: any of the four screen corners, and 3–15 seconds on screen (previously fixed at bottom-right for 5 seconds). - **Quiet hours**: a local-time window (may cross midnight, e.g. 22:00 → 08:00) that suppresses every reminder, plus a per-session mute list. - **Test coverage measurement and regression gate.** Added `@vitest/coverage-v8` (pinned to the exact vitest version), a `pnpm run coverage` script, and V8 coverage over `src/**` with `text` + `lcov` reporters. Global thresholds track the measured coverage with about one point of slack — statements 77 / branches 68 / functions 90 / lines 81 against a measured 78.6 / 69.85 / 91.35 / 82.3 — and are raise-only; a drop fails the run. CI runs coverage after the build on both Node legs and uploads `coverage/lcov.info` from the Node 24 leg as an artifact. The weakest remaining files are the client watcher (`src/client/index.ts`, 69.76% of statements and 44.44% of branches) and the toast/notification renderer (`src/client/notify.ts`, 70.58%). - **npm downloads badge** in both READMEs (`img.shields.io/npm/dm/…`), backed purely by npm's public download API — no client-side reporting was added. Caveat to keep attached to any use of the number: it counts npm tarball downloads per month (CI installs and registry mirrors included), not active users. ### Changed - **Settings storage upgraded to `dsh.taskNotify.v3`.** A leftover `v2` record is migrated once — every toggle is kept, and the retired `sound` boolean maps to `soundMode: 'double'` (off maps to `'off'`) — after which the `v2` key is removed. Every stored field is sanitized on load: junk values degrade to their defaults, `volume` and `toastSeconds` are clamped into `0`–`1` / `3`–`15`. - **Documentation on `main` since `0.2.0`.** Install guidance in both READMEs names a version range (pnpm 11's 24-hour `minimumReleaseAge` cooldown would otherwise resolve the bare name to an older release), pins Git installs to a release tag, and states the DSH line pairing. Both READMEs also gained a language switch, a requirements table, an uninstall section, a troubleshooting table, and settings labels that match `src/client/locales.ts`; the demo table lists the three recording file names instead of embedding GIFs that are not in the repository. - Added `docs/roadmap-plan.md`: scope, technical constraints, dependencies, risks, and acceptance criteria for every open roadmap item. - **Settings-page and test hygiene.** The body-template box is now its own labelled field instead of a second box under the title label — a placeholder is not an accessible name. `tests/settings-card.spec.tsx` restores every setting to its documented default in `beforeEach`, so no test can observe another test's edits (the file imports the store statically, and a dynamic import after `vi.resetModules()` would hand the card a second React instance). ### Fixed - **Corrected the DSH 0.1.x install path.** Both READMEs told DSH 0.1.x users to install `0.1.2`, but npm has only ever carried `0.1.0` and `0.2.0` and no `v0.1.1`/`v0.1.2` tag exists, so the instruction could not be followed. The `0.1.x` line is now documented as discontinued, with a pointer to the DSH upgrade. ## [0.2.0] - 2026-10-02 Re-targets the plugin at **DeepSeek Harness 0.2 (`0.2.0-rc.2`)**. This is a breaking release: DSH 0.2 removed the client packages and slots the 0.1.x line was built on. ### Changed - **Detection now folds three DSH 0.2 client sources** instead of the retired single `sessions.list` store: `ctx.sessions.list` (catalog and Host baseline), `ctx.uiSession.sessionStatus` (live running state and the pending interaction), and `ctx.jobs.state` (per-Session job rosters). - **Background jobs are watched per Session.** `IJobs.watchRows(sessionId)` opens one `job.list` stream per Session; the watcher opens one for every Session observed running since page load, and a new "watch every session" setting switches to the whole catalog. - **A pending interaction is tracked by its opaque request key** rather than by presence alone, so a replacement request reminds again while a reconnect replay of the same request stays silent. The `kind` is now an open, domain-owned string, and an unrecognized kind falls back to the wire word instead of a wrong translation. - **Settings moved to the `settings.plugins.tab` seat** (Plugins section, one page per contribution). The retired `settings.plugin.item` card list no longer exists, so the settings page renders toggles as a form rather than a single `
  • ` card. - **Client context types come from `@deepseek-ai/cordis`** plus the domain packages' declaration merges; `@deepseek-ai/dsh-client-runtime` was removed from DSH and is no longer referenced. - **Host half is now inert.** The `schemastery` `Config` schema was dropped along with the dependency: the host half is a loader anchor and holds no settings. - **Build externals track the 0.2 platform module table** (`@deepseek-ai/dsh-client-store` and `-ui-dockkit` in; `dsh-client-runtime`, `dsh-client-web-react`, and `dsh-client-schema-form` out). - **Theme tokens refreshed for the 0.2 alias table**: the toast uses `--dsw-alias-bg-overlay`, and the settings page no longer uses the removed `--dsw-alias-label-tertiary`. - Toast copy is localized through the plugin's own namespace instead of being hard-coded Chinese. ### Added - Manifest contract tests (`tests/manifest.spec.ts`): `manifestVersion`, the web client platform, the `engines.dsh` range, per-peer range pinning, and patch/plugin identity agreement. - `tests/client-apply.spec.ts`: drives `apply(ctx)` against a fake client context, covering the registrations and the watcher end-to-end — the seat the 0.1.1 keyed-slot regression escaped through. - A "watch every session" setting with `zh`/`en` copy. ### Fixed - Installation is accepted again by DSH 0.2's compatibility gate, which checks `peerDependencies` on `@deepseek-ai/dsh*` against the runtime version. The retired `dsh.compatibility` block and the 0.1.x peer ranges are gone; every DSH peer is pinned to `^0.2.0-rc.2`. ### Removed - The `dsh.compatibility` manifest block (`dsh` and `dshReleases` tables), which DSH 0.2 no longer reads. - The `schemastery` runtime dependency and the host `Config` schema. - The `dsh.taskNotify.v1` storage key in favour of `dsh.taskNotify.v2`, so a DSH 0.2 install starts from clean defaults instead of inheriting a record written by the 0.1.x line. ## [0.1.2] - 2026-09-13 ### Fixed - Remove the obsolete host-side `installSettingsSection` integration, which is not exported by `@deepseek-ai/dsh-settings` in DSH `0.1.5`. Notification preferences remain browser-local as designed. - Make disposable-profile verification tolerate first-run setup time, probe the authenticated Web URL, report the actual HTTP status, surface pnpm failures, and always clean up the spawned process and temporary profile. ### Changed - Expand `@deepseek-ai/dsh-*` `peerDependencies` range to `>=0.1.0-rc.6 <0.2.0 || ^0.1.1-rc.1 || ^0.1.2-alpha.1 || ^0.1.3-alpha.1 || ^0.1.5-alpha.1 || ^0.1.5-rc.1` to align with declared DSH releases including `0.1.5-alpha.2`, `0.1.5-rc.1`, and `0.1.5-rc.2`. - Update `pnpm-lock.yaml` with aligned peerDependencies. ### Added - Add disposable profile verification script (`scripts/verify-disposable-profile.cjs`) and integrate `verify:profile` into CI workflow. - Add verification evidence report (`docs/verification-evidence.md`). ## [0.1.1] - 2026-09-13 ### Fixed - Register the settings card into the keyed `settings.plugin.item` slot with a `key` (the settings namespace) instead of a list-slot `id`. The previous wiring made the plugin fail to load with `keyed slot "settings.plugin.item" requires options.key` on dsh `0.1.1-rc.2` (#7). ### Changed - Declare explicit DSH and Node.js compatibility under `dsh.compatibility` and `engines` in `package.json` for DSH Store catalog contract compliance. ## [0.1.0] - 2026-08-20 Initial release. ### Added - Turn-completion reminder: fires when an agent turn (thinking or tool use) finishes. - Background-job reminder: fires when a background command or subagent job settles (`completed` / `failed` / `killed`). - Review-needed reminder: fires when a running task waits for approval, plan review, or a question answer. - Failure reminder: fires when an agent turn errors (`lastAgentError`) or a background job fails / is killed. - Three notification channels: OS-level browser notification, in-page toast, optional two-tone beep. - Per-event configuration with seven independent toggles, persisted in `localStorage` (`dsh.taskNotify.v1`). - Host half (`src/index.ts`) registering the `task-notify` settings section. - Pure snapshot-diff detector (`src/detect.ts`) with Vitest unit tests (`tests/detect.spec.ts`, 15 tests). - CI workflow (`.github/workflows/ci.yml`): typecheck + test + build on push and pull request. - English `README.md` and Chinese `README.zh-CN.md` documentation. ### Security - No external server, telemetry, analytics, or API key. Notifications are generated locally; settings live in `localStorage` only; conversation content is never uploaded. ## [0.0.0] - 2026-08-14 Initial development (pre-release commits).