Skip to content

Commit 51b2d59

Browse files
dmartinochoaclaude
andcommitted
release: v1.1.0 — severity filter, CodeActions, preflight + upgrade flow
Three user-visible features plus the infrastructure to support an out-of-date engine cleanly: - Per-panel severity quick-filter: title-bar Show/Hide Severities Quick Pick mutes severities in the Findings panel only (editor surface unchanged). State persists per-workspace. - Quick-fix lightbulb on every diagnostic: Open <RULE-ID> docs / Copy rule ID / Reveal in panel. - Fast-fail engine preflight: a ~5s `import pipeline_check; importlib.metadata.version(...)` probe runs before LanguageClient.start(). A missing install surfaces the install toast in <1s instead of waiting the 30s start ceiling; an out-of-date install (below MIN_ENGINE_VERSION = "1.0.0") routes to a dedicated `Upgrade in terminal` CTA, and the Findings panel swaps to a third welcome entry promoting the same action. - Status-bar tooltip carries the captured engine version so users can confirm at a glance which pipeline-check install is talking to the editor. Test coverage: 254 → 362 (+108 from the v1.0.3 baseline) across new files for preflight, codeActions, quickPicks, plus extensions to findingsView, install, statusBar, lspState, manifest, whatsNew. Two bugs caught during the coverage pass: readDocsUrl now defends against a throwing target.toString() (would have silently disabled lightbulbs for the file), and the smoke stub got CodeActionKind (would have failed CI on the smoke step). Marketplace listing: 4 screenshots wired into the README — Findings panel + hover hero, hover detail, change-grouping picker, severity filter picker. Recipe doc updated; two slots open for status-bar tooltip and lightbulb dropdown. Also bundles the publish.yml fix from earlier on this branch (commit 2c56b67) — partial-failure no longer strands the GitHub release. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 2c56b67 commit 51b2d59

28 files changed

Lines changed: 2836 additions & 161 deletions

CHANGELOG.md

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,105 @@ versions follow [SemVer](https://semver.org/).
1111
> section **above** Unreleased, or remove the Unreleased block for the
1212
> release commit. Otherwise the GitHub release ships boilerplate.
1313
14+
## [1.1.0] — 2026-05-25
15+
16+
Feature batch on top of v1.0.3. Three user-visible additions plus
17+
infrastructure for a fourth: a Findings-panel severity quick-filter
18+
(mute MEDIUM while triaging CRITICAL without touching the editor-wide
19+
threshold setting), a quick-fix lightbulb on every diagnostic (Open
20+
docs / Copy rule ID / Reveal in panel), and a fast-fail engine
21+
preflight that surfaces the install or upgrade action in under a
22+
second instead of waiting out the 30-second LSP start ceiling. The
23+
status-bar tooltip now carries the engine version so users can
24+
confirm at a glance which `pipeline-check` install is talking to the
25+
editor. Test count: 254 → 329 (75 new) across the new and extended
26+
suites — severity filter, code actions, preflight, version compare,
27+
upgrade flow, status-bar tooltip, lspState.
28+
29+
### Added
30+
31+
- **Per-panel severity quick-filter.** New title-bar **Show / Hide
32+
Severities** button opens a multi-select Quick Pick; unchecked
33+
severities are hidden from the Findings panel only. The editor
34+
surface (gutter, Problems panel, CodeLens) is unaffected — the
35+
filter is for triage, not for muting the project. State persists
36+
per workspace via `workspaceState`. Composes with the existing
37+
substring filter; both are dropped when their condition clears.
38+
- **Quick-fix lightbulb on every Pipeline-Check diagnostic.**
39+
Rule-agnostic actions land on every finding the lightbulb attaches
40+
to: **Open `<RULE-ID>` documentation** (when the server published
41+
`Diagnostic.code.target`), **Copy rule ID** (routes through the
42+
same code path as the panel's context-menu entry), and **Show in
43+
Pipeline-Check Findings panel** (always available). No CodeAction
44+
mutates the file — they're discoverability surfaces, not
45+
auto-fixes.
46+
- **Fast-fail engine preflight.** Before `LanguageClient.start()`
47+
spawns the LSP, a 5-second probe runs
48+
`import pipeline_check; print(importlib.metadata.version(...))`
49+
on the configured interpreter. A missing install fires the install
50+
toast in under a second instead of the 30-second LSP start
51+
ceiling. An out-of-date install (engine version below
52+
`MIN_ENGINE_VERSION`) routes to a dedicated **Upgrade in terminal**
53+
CTA instead of the generic install path. The probe is gated to
54+
the default `python -m pipeline_check.lsp` shape so custom wrapper
55+
scripts skip the check (`shouldPreflight` returns `false`) and
56+
fall back to the existing start-timeout behavior.
57+
- **Engine version in the status-bar tooltip.** The captured version
58+
appears as a trailing `Engine vX.Y.Z` line on hover. Useful for
59+
triaging "why isn't this rule firing?" reports across people on
60+
different upstream versions. Cleared on `stopClient()` and on the
61+
mid-session `State.Stopped` transition so the tooltip stops
62+
claiming a server is connected after a crash.
63+
- **`pipelineCheck.upgradeInTerminal` command + welcome panel
64+
variant.** New command runs
65+
`python -m pip install --upgrade "pipeline-check[lsp]"` in a
66+
dedicated `Pipeline-Check upgrade` terminal (typed but not
67+
auto-executed, matching the install-command pattern). When the
68+
preflight rejects with `reason="out_of_date"`, the new
69+
`pipelineCheck.engineOutOfDate` context key flips, and the
70+
Findings panel switches to a third welcome entry that promotes
71+
**Upgrade in terminal** as its primary CTA. The toast and the
72+
panel surface the same action so a user who dismisses the toast
73+
can still find it.
74+
75+
### Changed
76+
77+
- **README: Install section rewritten** as a numbered two-step flow
78+
("install the Python engine, then install the extension") so
79+
first-timers can't skip the engine. Version requirements moved
80+
inline with each step; the standalone Requirements section is
81+
gone. A new "Verify" step points readers at the `🛡` status-bar
82+
tally and the `Pipeline-Check: Show language server output`
83+
command for the case where it doesn't appear. The Commands table
84+
was also extended to list the two new commands and the
85+
severity-toggle entry.
86+
- **`What's new` toast copy is now generic.** Previously it
87+
hard-coded the v1.0.0 surfaces (Findings panel, status bar,
88+
CodeLens, Alt+F8); the prose was stale the moment 1.0.1 shipped.
89+
The toast now says `Pipeline-Check ${version} is here. See what
90+
changed?` and the **See release notes** action does the
91+
version-specific work. One less thing to remember to update per
92+
release.
93+
94+
### Infrastructure
95+
96+
- **`MIN_ENGINE_VERSION = "1.0.0"`** in
97+
[src/preflight.ts](src/preflight.ts) is the new floor the preflight
98+
asserts. Anyone on a 0.x install sees the **Upgrade in terminal**
99+
CTA on next launch; every 1.0.x install passes through unchanged.
100+
The extension's stable contract with the engine — reading
101+
`Diagnostic.code.target` (rule-docs URL) and `data.severity` (panel
102+
grouping) from publishes — has held across the 1.x line, so the
103+
floor is the same as the 1.x major. **Maintainer note:** bump
104+
patch/minor here when the extension starts depending on a newer
105+
field; the change forces the upgrade prompt for users behind the
106+
new floor and deserves its own CHANGELOG entry.
107+
- **`isAtLeast` / `parseVersion`** helpers in preflight handle the
108+
PEP 440 / SemVer shapes pipeline-check ships (numeric
109+
MAJOR.MINOR.PATCH plus occasional rc / dev tails). Pre-releases
110+
rank BELOW the corresponding release per spec, so `1.2.3rc1` does
111+
not satisfy a `MIN_ENGINE_VERSION = "1.2.3"` assertion.
112+
14113
## [1.0.3] — 2026-05-21
15114

16115
Recovery republish of v1.0.2 — Open VSX returned an HTTP 405 on

README.md

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,25 @@
1111

1212
Lint CI/CD pipelines for 22 providers against OWASP Top 10 CI/CD Risks and 14 other compliance frameworks. 810+ rules, inline in your editor: severity-graded gutter squiggles, hover descriptions with `--explain` prose, and recommended-action hints. Built on the same rule registry as the [pipeline-check](https://github.com/dmartinochoa/pipeline-check) CLI, so editor findings match `pipeline_check --output json` byte-for-byte (modulo position translation).
1313

14-
<!--
15-
Once docs/screenshots/01-inline.png, 02-findings-panel.png,
16-
03-hover.png, and 04-status-bar.png exist, uncomment the block below.
17-
See docs/screenshots/README.md for the capture recipe. The marketplace
18-
listing renders these via GitHub's raw blob URL, so they don't need
19-
to ship inside the .vsix.
14+
![Editor window with the Findings panel grouped by severity, gutter squiggles on the open workflow file, the activity-bar badge showing six findings, and a diagnostic hover tooltip](docs/screenshots/01-inline-findings.png)
2015

21-
![Inline findings in the editor gutter](docs/screenshots/01-inline.png)
16+
![Zoomed hover on a finding showing the rule title, the --explain prose, the Fix recommendation, and a link to the rule documentation](docs/screenshots/02-hover-detail.png)
2217

23-
![Findings panel in the activity bar, grouped by severity](docs/screenshots/02-findings-panel.png)
18+
![Change Grouping Quick Pick offering Severity, File, and Rule modes](docs/screenshots/03-change-grouping.png)
2419

25-
![Hover tooltip showing problem, description, and rule docs link](docs/screenshots/03-hover.png)
26-
27-
![Status bar item showing the per-severity tally](docs/screenshots/04-status-bar.png)
28-
-->
20+
![Show / Hide Severities Quick Pick with checkboxes for CRITICAL, HIGH, MEDIUM, LOW, and INFO, each labelled with a one-line description](docs/screenshots/04-severity-filter.png)
2921

3022
## Features
3123

3224
- **Inline diagnostics** — gutter squiggles + the Problems panel get a row per finding, severity-graded so CRITICAL and HIGH read red, MEDIUM yellow, LOW info-blue. Hover shows the rule title, the `--explain` prose, and a link to the rule documentation.
3325
- **Findings panel** — dedicated slot in the activity bar with a Pipeline-Check pipeline glyph. Re-groups findings by **severity** (default), **file**, or **rule** via the title-bar **Change Grouping** button; activity-bar icon carries a live count badge.
34-
- **Status bar item** — bottom-left of the window, shows the top two severity counts at a glance (e.g. `🛡 3C 1H`). Click reveals the Findings panel.
26+
- **Per-panel severity filter** — title-bar **Show / Hide Severities** button lets you mute MEDIUM while triaging CRITICAL without changing the editor-wide `severityThreshold` setting. State persists per workspace.
27+
- **Quick-fix lightbulb** — every finding carries a lightbulb with **Open `<RULE-ID>` documentation**, **Copy rule ID**, and **Show in Findings panel** — useful for triage without round-tripping through the panel.
28+
- **Status bar item** — bottom-left of the window, shows the top two severity counts at a glance (e.g. `🛡 3C 1H`). Tooltip carries the engine version so you know which `pipeline_check` install is talking to the editor. Click reveals the Findings panel.
3529
- **CodeLens summary** — every scanned file carries a `Pipeline-Check: 2 critical · 1 high` lens at line 1. Click navigates to the Findings panel.
3630
- **Keyboard navigation**`Alt+F8` / `Shift+Alt+F8` jump between findings, with wrap at both ends. Mirrors VS Code's `F8` for "next problem" so muscle memory carries over.
3731
- **Tunable signal**`pipelineCheck.severityThreshold` quiets the editor surface (`low` / `medium` / `high` / `critical`) without restarting the server; `pipelineCheck.disabledProviders` silences whole providers in a monorepo where Pipeline-Check would otherwise lint files belonging to a sub-project.
32+
- **Fast-fail engine check** — when the LSP fails to import the Python engine, the extension surfaces the install / upgrade action in under a second instead of waiting out the 30-second start ceiling. Engines below the extension's minimum required version get a dedicated **Upgrade in terminal** prompt.
3833

3934
## What it scans
4035

@@ -57,7 +52,26 @@ Multi-file and context-heavy providers (Kubernetes, Helm, Terraform plans, live
5752

5853
## Install
5954

60-
Search for `Pipeline-Check` in the extensions panel, or install from the command line:
55+
Pipeline-Check ships as **two pieces** that talk to each other over stdio:
56+
57+
1. **Python rule engine** — the linter itself, installed from PyPI.
58+
2. **VS Code extension** — a thin LSP client (this repo) that spawns the engine and surfaces its findings in the editor.
59+
60+
You need both. The extension does no scanning on its own; if the engine isn't installed, the Findings panel shows an **Install in terminal** button that runs the command below for you.
61+
62+
### 1. Install the Python engine
63+
64+
Requires Python 3.11+ on `PATH`:
65+
66+
```bash
67+
python -m pip install "pipeline-check[lsp]"
68+
```
69+
70+
If `pipeline_check` lives in a virtualenv or under `python3` rather than `python`, point [`pipelineCheck.serverCommand`](#configuration) at an absolute interpreter path.
71+
72+
### 2. Install the extension
73+
74+
Requires VS Code 1.85+. Search for `Pipeline-Check` in the extensions panel, or install from the command line:
6175

6276
```bash
6377
# Microsoft VS Code Marketplace
@@ -67,16 +81,9 @@ code --install-extension greylag-ci.pipeline-check
6781
codium --install-extension greylag-ci.pipeline-check
6882
```
6983

70-
The extension is a thin LSP client; the rule engine itself runs in Python and must be installed separately:
71-
72-
```bash
73-
python -m pip install "pipeline-check[lsp]"
74-
```
75-
76-
## Requirements
84+
### 3. Verify
7785

78-
- VS Code 1.85 or newer.
79-
- Python 3.11 or newer on `PATH`, with `pipeline-check[lsp]` installed.
86+
Open any supported config file (see [What it scans](#what-it-scans)) — findings appear inline within a second or two, and the status bar shows a `🛡` tally. If you see `🛡 LSP not ready` instead, run **Pipeline-Check: Show language server output** from the Command Palette; the most common cause is `serverCommand` pointing at an interpreter that doesn't have `pipeline_check` installed.
8087

8188
## Configuration
8289

@@ -96,9 +103,14 @@ All commands appear in the Command Palette under the **Pipeline-Check** category
96103
|---|---|
97104
| **Restart language server** — kills and respawns the LSP process | |
98105
| **Show language server output** — focuses the output channel (LSP server logs + `[client]` client-side breadcrumbs) | |
106+
| **Install LSP Server in Terminal** — opens a terminal with the `pip install` command typed but not executed | |
107+
| **Upgrade LSP Server in Terminal** — same flow with `pip install --upgrade` for an out-of-date engine | |
99108
| **Go to Next Finding** | <kbd>Alt</kbd>+<kbd>F8</kbd> |
100109
| **Go to Previous Finding** | <kbd>Shift</kbd>+<kbd>Alt</kbd>+<kbd>F8</kbd> |
110+
| **Scan Workspace** — opens every candidate file so the LSP runs `didOpen` on each | |
101111
| **Change Grouping** (Findings view) — Quick Pick: Severity / File / Rule | |
112+
| **Show / Hide Severities** (Findings view) — multi-select Quick Pick that mutes severity levels in the panel only (editor surface unchanged) | |
113+
| **Filter Findings** (Findings view) — substring filter on rule ID, message, or path | |
102114
| **Refresh** (Findings view) — re-render from the current diagnostic stream | |
103115

104116
## Workspace trust
129 KB
Loading
50.1 KB
Loading
14.2 KB
Loading
20.5 KB
Loading

docs/screenshots/README.md

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,38 @@
11
# Marketplace screenshots
22

3-
Three PNGs go in this directory; the main `README.md` already has
4-
references to them, commented out. Once the files exist, uncomment
5-
the block and the marketplace listing picks them up automatically
6-
(vsce rewrites relative paths to the GitHub raw blob URL).
3+
Four PNGs ship today; the main `README.md` references them directly.
4+
The marketplace listing renders relative image paths through GitHub's
5+
raw blob URL, so the PNGs don't need to ship inside the `.vsix`
6+
[.vscodeignore](../../.vscodeignore) excludes `docs/**` for that
7+
reason.
8+
9+
## Currently shipping (v1.1.0)
10+
11+
| Filename | What it shows |
12+
|---|---|
13+
| `01-inline-findings.png` | Full editor window with the Findings panel grouped by severity, gutter squiggles on the open workflow, activity-bar badge showing the live count, and a hover tooltip on one diagnostic. The "hero" shot — proves the whole-product story in one frame. |
14+
| `02-hover-detail.png` | Zoomed hover on a single diagnostic — title, `--explain` prose, `Fix:` recommendation, and the `pipeline-check(GHA-XXX)` documentation link. |
15+
| `03-change-grouping.png` | The **Change Grouping** Quick Pick showing Severity / File / Rule. |
16+
| `04-severity-filter.png` | The new **Show / Hide Severities** Quick Pick — landed in v1.1.0. Multi-select with one-line descriptions per severity. |
17+
18+
## Slots still open
19+
20+
Two v1.1.0 surfaces aren't yet shown. Capture and drop in when
21+
convenient; the README block will need a matching `![alt](path)` line
22+
added underneath the existing four:
723

824
| Filename | What it shows |
925
|---|---|
10-
| `01-inline.png` | Editor view of `test-fixtures/sample-workflow/release.yml` with all four GHA squiggles in the gutter. |
11-
| `02-problems-panel.png` | The Problems panel with the four diagnostics. Each rule ID is a hyperlink now that `codeDescription.href` is wired. Capture one ID under hover state so the underline is visible. |
12-
| `03-hover.png` | Hover tooltip on one diagnostic showing title, description, and the `Fix:` recommendation. |
26+
| `05-status-bar.png` | Status-bar shield with the per-severity tally (e.g. `🛡 3C 1H`) AND the tooltip open, including the trailing `Engine v0.X.Y` line. Proves the engine-version surface. |
27+
| `06-quickfix-lightbulb.png` | The CodeAction lightbulb dropdown on a finding, showing **Open `<RULE-ID>` documentation / Copy rule ID / Show in Pipeline-Check Findings panel**. The triage-ergonomics shot. |
1328

1429
## How to capture
1530

1631
1. From the vscode repo root: `npm run compile`.
1732
2. Press <kbd>F5</kbd>, pick the **Run Extension (sample workflow)** debug profile.
18-
3. In the extension-host window, open `release.yml` (the fixture auto-opens with that profile).
19-
4. Wait for the four diagnostics to publish (~half a second).
20-
5. Take the three screenshots described above and save them in this directory with the filenames in the table.
21-
6. Open the main `README.md` and uncomment the `<!-- screenshot block -->` to surface them on the listing.
33+
3. In the extension-host window, `release.yml` auto-opens. Wait ~1s for the diagnostics to publish.
34+
4. Take each screenshot per the table above and save into this directory with the matching filename.
35+
5. Open the main `README.md` and add an `![alt](docs/screenshots/<filename>.png)` line into the screenshot block for any new captures.
2236

2337
## Capture settings
2438

package.json

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "pipeline-check",
33
"displayName": "Pipeline-Check",
44
"description": "Lint CI/CD pipelines for 22 providers against OWASP Top 10 CI/CD Risks and 14 other compliance frameworks. 810+ rules, inline in your editor.",
5-
"version": "1.0.3",
5+
"version": "1.1.0",
66
"publisher": "greylag-ci",
77
"license": "MIT",
88
"icon": "icon.png",
@@ -89,8 +89,13 @@
8989
},
9090
{
9191
"view": "pipelineCheck.findings",
92-
"when": "!pipelineCheck.lspReady",
92+
"when": "!pipelineCheck.lspReady && !pipelineCheck.engineOutOfDate",
9393
"contents": "Pipeline-Check lints CI/CD configs against OWASP Top 10 CI/CD risks and 14 compliance frameworks. 810+ rules.\n\nIt needs a Python helper — `pipeline-check[lsp]` from PyPI — running locally.\n\n[Install in terminal](command:pipelineCheck.installInTerminal)\n[Retry connection](command:pipelineCheck.restart)\n\nAlready installed but still seeing this? [Open server log](command:pipelineCheck.showLog)."
94+
},
95+
{
96+
"view": "pipelineCheck.findings",
97+
"when": "pipelineCheck.engineOutOfDate",
98+
"contents": "The installed `pipeline-check` engine is older than this extension requires.\n\nUpgrade it from PyPI:\n\n[Upgrade in terminal](command:pipelineCheck.upgradeInTerminal)\n[Retry connection](command:pipelineCheck.restart)\n\n[Open server log](command:pipelineCheck.showLog) for the version probe's output."
9499
}
95100
],
96101
"commands": [
@@ -114,6 +119,11 @@
114119
"title": "Install LSP Server in Terminal",
115120
"category": "Pipeline-Check"
116121
},
122+
{
123+
"command": "pipelineCheck.upgradeInTerminal",
124+
"title": "Upgrade LSP Server in Terminal",
125+
"category": "Pipeline-Check"
126+
},
117127
{
118128
"command": "pipelineCheck.scanWorkspace",
119129
"title": "Scan Workspace",
@@ -153,6 +163,12 @@
153163
"category": "Pipeline-Check",
154164
"icon": "$(filter)"
155165
},
166+
{
167+
"command": "pipelineCheck.findings.toggleSeverity",
168+
"title": "Show / Hide Severities",
169+
"category": "Pipeline-Check",
170+
"icon": "$(eye)"
171+
},
156172
{
157173
"command": "pipelineCheck.goToNextFinding",
158174
"title": "Go to Next Finding",
@@ -189,10 +205,15 @@
189205
"group": "navigation@1"
190206
},
191207
{
192-
"command": "pipelineCheck.findings.changeGrouping",
208+
"command": "pipelineCheck.findings.toggleSeverity",
193209
"when": "view == pipelineCheck.findings",
194210
"group": "navigation@2"
195211
},
212+
{
213+
"command": "pipelineCheck.findings.changeGrouping",
214+
"when": "view == pipelineCheck.findings",
215+
"group": "navigation@3"
216+
},
196217
{
197218
"command": "pipelineCheck.findings.refresh",
198219
"when": "view == pipelineCheck.findings",

0 commit comments

Comments
 (0)