From b138c417f76004ea221f6b8e8b890b3faad9c49b Mon Sep 17 00:00:00 2001 From: dimastatz Date: Sat, 10 Oct 2026 21:27:55 +0300 Subject: [PATCH] Release 1.0.0 - Bump version to 1.0.0; the changelog's Unreleased section becomes 1.0.0 - Security: whisperCode.recorderCommand is machine-scoped, so a workspace's .vscode/settings.json can't choose the command dictation runs - README: drop the "preview" status note; specs: implemented in 1.0.0 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NcUyc2475ugBRGPm7yQMzy --- CHANGELOG.md | 14 +++++++++++++- README.md | 4 ++-- docs/specs/0001-overview.md | 2 +- docs/specs/0002-whisper-flow-transcription.md | 2 +- package-lock.json | 4 ++-- package.json | 5 +++-- src/test/extension.test.ts | 11 +++++++++++ 7 files changed, 33 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f175958..66dcd13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows [Semantic Versioning](https://semver.org/). -## [Unreleased] +## [1.0.0] - 2026-10-10 Dictation works end to end ([spec 0001](docs/specs/0001-overview.md), on [spec 0002](docs/specs/0002-whisper-flow-transcription.md)). @@ -34,6 +34,17 @@ Dictation works end to end ([spec 0001](docs/specs/0001-overview.md), on phrase there. VS Code doesn't expose the chat input to extensions as a text editor. - A manual **E2E** workflow that runs dictation against whisper-flow in Docker with a recorded WAV (`npm run e2e` locally). +- README header with the Whisper Code logo. + +### Changed + +- The 95% coverage gate measures extension code only; tests and fakes no longer count. + +### Security + +- `whisperCode.recorderCommand` can only be set in user (machine) settings, not in a + workspace's `.vscode/settings.json`, so opening a repository can't make dictation run a + command it chose. ## [0.1.0] - 2026-10-05 @@ -49,4 +60,5 @@ transcription are not implemented yet. - CI: formatting, type-aware linting, type checking, tests with a 95% coverage gate, VSIX packaging, and CodeQL analysis. +[1.0.0]: https://github.com/dimastatz/whisper-code/releases/tag/v1.0.0 [0.1.0]: https://github.com/dimastatz/whisper-code/releases/tag/v0.1.0 diff --git a/README.md b/README.md index b4f14ef..eb1c6e6 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ Real-time voice dictation for VS Code, powered by self-hosted Whisper through [whisper-flow](https://github.com/dimastatz/whisper-flow). Biases transcription with your workspace symbols so it spells useMemo right, and adapts to whether you're dictating a comment, a commit message, or a prompt. -> **Status: preview.** Dictation works end to end against a whisper-flow server. Expect rough -> edges; see [docs/specs](docs/specs) for the design. +> Requires a [whisper-flow](https://github.com/dimastatz/whisper-flow) server and a command-line +> audio recorder; see [Requirements](#requirements). Design docs are in [docs/specs](docs/specs). ## Usage diff --git a/docs/specs/0001-overview.md b/docs/specs/0001-overview.md index 6e77d1a..f142abb 100644 --- a/docs/specs/0001-overview.md +++ b/docs/specs/0001-overview.md @@ -1,6 +1,6 @@ # Spec 0001: whisper-code Overview -- **Status:** Implemented (unreleased) +- **Status:** Implemented in 1.0.0 - **Author:** Dima Statz - **Created:** 2026-10-05 diff --git a/docs/specs/0002-whisper-flow-transcription.md b/docs/specs/0002-whisper-flow-transcription.md index ffbe564..dc3a44a 100644 --- a/docs/specs/0002-whisper-flow-transcription.md +++ b/docs/specs/0002-whisper-flow-transcription.md @@ -1,6 +1,6 @@ # Spec 0002: whisper-flow as the Transcription Engine -- **Status:** Implemented (unreleased; tested with whisper-flow 1.2.1) +- **Status:** Implemented in 1.0.0 (tested with whisper-flow 1.2.1 and 1.3.0) - **Author:** Dima Statz - **Created:** 2026-10-06 - **Updates:** [0001: Overview](0001-overview.md). Answers its "which Whisper runtime" open diff --git a/package-lock.json b/package-lock.json index 41a0df9..f0d7696 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "whisper-code", - "version": "0.1.0", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "whisper-code", - "version": "0.1.0", + "version": "1.0.0", "license": "MIT", "dependencies": { "ws": "^8.22.0" diff --git a/package.json b/package.json index 3e8e4b2..8ea7693 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "whisper-code", "displayName": "Whisper Code", "description": "Real-time voice dictation for VS Code, powered by a self-hosted whisper-flow server.", - "version": "0.1.0", + "version": "1.0.0", "publisher": "dimastatz", "license": "MIT", "repository": { @@ -78,7 +78,8 @@ "type": "string" }, "default": [], - "markdownDescription": "Command that records the microphone and writes raw 16 kHz mono signed 16-bit little-endian PCM to stdout, for example `[\"sox\", \"-q\", \"-d\", \"-t\", \"raw\", \"-r\", \"16000\", \"-e\", \"signed-integer\", \"-b\", \"16\", \"-c\", \"1\", \"-L\", \"-\"]`. Empty tries `sox`, then `arecord` (Linux) or `ffmpeg`." + "markdownDescription": "Command that records the microphone and writes raw 16 kHz mono signed 16-bit little-endian PCM to stdout, for example `[\"sox\", \"-q\", \"-d\", \"-t\", \"raw\", \"-r\", \"16000\", \"-e\", \"signed-integer\", \"-b\", \"16\", \"-c\", \"1\", \"-L\", \"-\"]`. Empty tries `sox`, then `arecord` (Linux) or `ffmpeg`.", + "scope": "machine" }, "whisperCode.wrap.comments": { "type": "number", diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts index 4eb4273..a07e8d4 100644 --- a/src/test/extension.test.ts +++ b/src/test/extension.test.ts @@ -88,6 +88,17 @@ suite("Extension", function () { await vscode.commands.executeCommand("whisperCode.clearApiKey"); }); + test("a workspace can't set the recorder command", () => { + // It names a program to run, so only user (machine) settings may set it. + const extension = vscode.extensions.getExtension("dimastatz.whisper-code"); + const properties = ( + extension?.packageJSON as { + contributes: { configuration: { properties: Record } }; + } + ).contributes.configuration.properties; + assert.strictEqual(properties["whisperCode.recorderCommand"].scope, "machine"); + }); + test("commands are registered", async () => { const commands = await vscode.commands.getCommands(true); for (const command of [TOGGLE, "whisperCode.setApiKey", "whisperCode.clearApiKey"]) {