Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)).
Expand Down Expand Up @@ -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

Expand All @@ -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
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion docs/specs/0001-overview.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
2 changes: 1 addition & 1 deletion docs/specs/0002-whisper-flow-transcription.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down Expand Up @@ -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",
Expand Down
11 changes: 11 additions & 0 deletions src/test/extension.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, { scope?: string }> } };
}
).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"]) {
Expand Down
Loading