@@ -4,6 +4,163 @@ All notable changes to the Pipeline-Check VS Code extension. The
44format follows [ Keep a Changelog] ( https://keepachangelog.com/en/1.1.0/ ) ;
55versions follow [ SemVer] ( https://semver.org/ ) .
66
7+ > ⚠ ** Release note for publish.yml:** the release-notes extractor (an
8+ > ` awk ` script in publish.yml) prints every line between the ** first**
9+ > and ** second** ` ## [ ` headers. When cutting a release, fold the
10+ > entries under ` ## [Unreleased] ` into the new ` ## [X.Y.Z] — <date> `
11+ > section ** above** Unreleased, or remove the Unreleased block for the
12+ > release commit. Otherwise the GitHub release ships boilerplate.
13+
14+ ## [ 0.2.0] — 2026-05-19
15+
16+ Closes 24 of 29 items from the 2026-05-19 in-depth UX/code review.
17+ Adds the activity-bar Findings tree's missing affordances (status bar,
18+ CodeLens, navigation, context menus, per-provider toggles), the
19+ release-tooling polish (` production ` environment gate, pre-release
20+ channel, three-OS CI, integration tests), and the discovery /
21+ accessibility pass.
22+
23+ ** Heads-up for users with non-standard workflow paths:** the
24+ extension's ` activationEvents ` now match only the
25+ ` workspaceContains: ` patterns shared with the LSP ` documentSelector `
26+ (plus ` onStartupFinished ` so the activity-bar slot is always
27+ visible). If your repo keeps CI definitions outside the standard
28+ locations (e.g. ` pipelines/build.yml ` instead of
29+ ` .github/workflows/*.yml ` ), the extension still activates on
30+ ` onStartupFinished ` , but the LSP only scans files matching the
31+ document selector. Use ` pipelineCheck.serverArgs ` to point the LSP
32+ at a different path or symlink your custom config into a standard
33+ location.
34+
35+ ### Added
36+
37+ - ** Inline CodeLens summary.** Each scanned file carries a
38+ ` Pipeline-Check: 2 critical · 1 high ` lens at line 1. Click reveals
39+ the Findings panel. Re-emits on every diagnostic publish so the
40+ text tracks the latest scan. (R26)
41+ - ** Status bar item.** Bottom-left of the window, shows the top two
42+ non-zero severities (e.g. ` $(shield) 3C 1H ` ) with a tooltip that
43+ breaks down the full per-severity tally. Click reveals the
44+ Findings panel. (R9)
45+ - ** Keyboard navigation.** ` Alt+F8 ` / ` Shift+Alt+F8 ` jump between
46+ Pipeline-Check findings in editor order (fsPath ascending, then by
47+ line); wraps at both ends. Mirrors VS Code's ` F8 ` muscle memory
48+ for the global "Next Problem" command. (R12)
49+ - ** Per-provider toggles.** New ` pipelineCheck.disabledProviders `
50+ setting silences whole providers. ` dockerfile ` covers both
51+ ` Dockerfile ` and ` Containerfile ` (same syntax). Useful in a
52+ monorepo where Pipeline-Check would otherwise lint a sub-project's
53+ Dockerfile that has its own lint pipeline. (R25)
54+ - ** Rule documentation link in leaf tooltip.** When the server
55+ publishes a ` Diagnostic.code.target ` URL, the Findings tree's
56+ leaf tooltip appends a clickable
57+ ` $(book) <rule-id> documentation ` link below the message body. (R8)
58+ - ** Client-side structured logging.** The extension's output channel
59+ now interleaves ` [client] HH:MM:SS.mmm ` lines around activation
60+ and command invocations with the LSP's ` window/logMessage `
61+ traffic. Easier to triage bug reports — start/ok/failed
62+ breadcrumbs land in the same surface users already focus via
63+ * Show language server output* . (R16)
64+ - ** Pre-release channel.** Tags like ` v0.2.0-rc.1 ` ship to the
65+ marketplace pre-release channel; the matching GitHub release is
66+ marked ` prerelease ` . Detection is by the presence of a ` - ` after
67+ the semver core. (R24)
68+ - ** Right-click context menu on Findings tree leaves.** * Open Rule
69+ Documentation* opens the URL the server published via
70+ ` Diagnostic.code.target ` in the system browser; * Copy Rule ID*
71+ writes the rule's identifier to the clipboard. Same data the leaf
72+ tooltip already surfaces, now available without keeping the
73+ tooltip open.
74+ - ** ` pipelineCheck.codeLens.enabled ` setting.** Defaults to ` true ` .
75+ Hides the line-1 file-summary CodeLens for users who find it
76+ intrusive without disabling CodeLens globally. Toggle takes effect
77+ on the next render — no extension restart.
78+ - ** ` pipelineCheck.copyInstallCommand ` command.** Copies
79+ ` pip install "pipeline-check[lsp]" ` to the clipboard. Surfaced
80+ from the Findings welcome state and from the Command Palette so
81+ users can re-find it after dismissing the first-run error toast.
82+
83+ ### Changed
84+
85+ - ** Welcome state of the Findings panel teaches.** Now leads with
86+ what Pipeline-Check does + a * Copy install command* link for the
87+ Python ` [lsp] ` extra, then onboarding ("open a workflow…"), then
88+ the Alt+F8 / Shift+Alt+F8 keyboard hint, then a ` --- ` separator
89+ and the recovery actions (Restart, Open Log) demoted below.
90+ - ** ` onStartupFinished ` activation event.** The extension now wakes
91+ up after VS Code's start-up barrier so the activity-bar slot is
92+ visible in every workspace — not just ones with a
93+ ` workspaceContains: ` match. The LSP child process still only
94+ spawns when the ` documentSelector ` matches an open document, so
95+ there's no idle-Python-process cost.
96+ - ** Status bar item hides in non-CI workspaces.** On activation we
97+ do a one-shot ` findFiles ` for any of the trigger patterns; the
98+ status bar item only shows once we've seen evidence the workspace
99+ is CI-relevant (either a match or an actual diagnostic publish).
100+ Stops ` $(shield) clean ` cluttering the bottom-left in frontend
101+ projects that happen to have Pipeline-Check installed alongside
102+ other linters.
103+ - ** Status bar accessibility label.** Screen readers now hear
104+ "Pipeline-Check: 3 critical, 1 high" instead of the codicon
105+ shortcode + letter-by-letter abbreviation.
106+ - ** Status bar tooltip teaches Alt+F8.** The trailing line of the
107+ tooltip ("Alt+F8 / Shift+Alt+F8 to step through findings") is the
108+ primary discovery surface for the navigation keybindings.
109+ - ** Command titles use title case** for VS Code's convention:
110+ "Restart Language Server", "Show Language Server Output",
111+ "Refresh Findings". Existing "Go to Next Finding" and "Change
112+ Grouping" stay the same. Command IDs are unchanged — settings,
113+ keybindings, and automation continue to work.
114+
115+ - ** ` @vscode/test-electron ` integration suite** now runs in CI
116+ (Linux only, via ` xvfb-run -a ` ). Five tests pin activation, the
117+ command-registration contract, the Findings view registration,
118+ the configuration schema completeness, and the workspace-trust
119+ capability declarations. Catches what unit tests can only
120+ approximate. (R17)
121+ - ** Three-OS test matrix** — `[ ubuntu-latest, windows-latest,
122+ macos-latest] `. The LSP child-process spawn path is
123+ Windows-sensitive; matrix CI catches the LF/CRLF and
124+ path-separator bugs single-OS CI silently misses. (R21)
125+ - ** Activation surface narrowed.** Triggers are
126+ ` workspaceContains: ` patterns matching the providers we actually
127+ scan (the ` documentSelector ` uses the same patterns). Opening an
128+ unrelated ` package.json ` or ` mkdocs.yml ` no longer wakes up the
129+ extension. (H4)
130+ - ** Trigger-pattern list lives in one place.** Extracted into
131+ ` src/providers.ts ` as a single ` PROVIDERS ` map; the ` documentSelector ` ,
132+ ` activationEvents ` , and the LSP middleware's per-provider filter
133+ all read from it. A regression test asserts the manifest's
134+ ` activationEvents ` stay in lockstep with the patterns. (R14)
135+ - ** Shared ` vi.mock("vscode") ` factory** under ` src/__testStubs__/ ` .
136+ Unit tests now share a single stub instead of redefining the
137+ surface per file. (R18)
138+ - ** Marketplace description length** gated in CI at the
139+ 145-character truncation point so future edits don't blow it. (R20)
140+
141+ ### Fixed
142+
143+ - ** ` Restart language server ` toast no longer fires on failure** —
144+ if the server failed to come up, the error notification already
145+ carries the install hint; the success toast used to fire too,
146+ giving the user contradictory signals. (R2)
147+ - ** ` stopClient ` has a 2-second hard ceiling** on the LSP child's
148+ shutdown. A deadlocked server used to hold the deactivate path
149+ indefinitely; VS Code reported "Window not responding" until the
150+ user force-quit. (R3)
151+ - ** ` groupByFile ` no longer round-trips Uri through string** for
152+ every group node. Bucket value carries the original Uri. (R4)
153+ - ** ` compareByLocation ` sorts on ` fsPath ` ** instead of the full URI
154+ string. Cross-scheme entries (file:// vs untitled://) no longer
155+ bunch at one end. (R5)
156+ - ** ` collectFindings ` is memoised per refresh** — buildRoot and
157+ updateBadge used to walk the global diagnostic store twice per
158+ refresh. (R6)
159+ - ** ` onDidChangeDiagnostics ` skips refreshes from unrelated
160+ publishers.** ESLint / mypy / redhat.yaml keystroke chatter no
161+ longer rebuilds the tree. The skip-check also catches * clears*
162+ (a stale leaf can't outlive a cleared file). (R7)
163+
7164## [ 0.1.1] — 2026-05-19
8165
9166Production-readiness pass. v0.1.0 was effectively unusable on a clean
0 commit comments