@@ -11,6 +11,29 @@ commit collapses this section into `## [X.Y.Z] — <date>`.
1111
1212### Added
1313
14+ - ** Findings panel.** A dedicated activity-bar slot
15+ ("Pipeline-Check" — custom inverted-Y pipeline glyph at
16+ ` media/pipeline-check.svg ` ) carries a ` Findings ` tree that
17+ re-groups the diagnostics the LSP server has already published.
18+ Strictly a re-presentation: never triggers its own scan, so the
19+ thin-transport-adapter promise in ` extension.ts ` stays intact.
20+ The activity-bar icon carries a live count badge so "how many
21+ findings does this workspace have right now?" is answerable
22+ without expanding the panel. Three group modes — severity
23+ (default), file, rule — are switched via a ` Change Grouping `
24+ Quick Pick that marks the active mode with ` $(check) ` . Each leaf
25+ renders as the rule title plus a ` RULE · file:LINE ` description
26+ that drops whichever component is already implied by the parent
27+ group; clicking opens the file at the diagnostic range.
28+ CRITICAL is rendered as ` flame ` and HIGH as ` error ` so the two
29+ distinguish in the severity-grouped tree without breaking parity
30+ with the editor gutter (which has no "more red than red" state);
31+ INFO uses ` circle-outline ` themed to ` descriptionForeground ` so
32+ it is visibly the quietest row instead of inheriting the default
33+ foreground. The welcome state leads with what the extension does
34+ rather than what is missing; the diagnostic recovery links sit
35+ on a secondary "Not seeing findings?" line.
36+
1437- ** ` pipelineCheck.severityThreshold ` setting.** A new enum knob
1538 (` low ` / ` medium ` / ` high ` / ` critical ` , default ` low ` ) that mirrors
1639 the CLI's ` --severity-threshold ` . Drives a client-side
@@ -24,8 +47,70 @@ commit collapses this section into `## [X.Y.Z] — <date>`.
2447 unconditionally, so an older server (or a non-pipeline-check
2548 publish) is never hidden.
2649
50+ ### Security
51+
52+ - ** ` pipelineCheck.serverCommand ` and ` pipelineCheck.serverArgs ` are now
53+ ` machine-overridable ` .** Workspace overrides require an explicit
54+ prompt, so a malicious ` .vscode/settings.json ` can't silently swap
55+ the interpreter or inject ` -c "<code>" ` once the user trusts the
56+ workspace.
57+ - ** Declared ` capabilities.untrustedWorkspaces: "limited" ` ** and
58+ ` virtualWorkspaces: false ` . The extension stays inactive in
59+ untrusted workspaces until the user trusts them, so the LSP child
60+ process never spawns from a freshly-cloned, untrusted repo.
61+ - ** Hardened the publish workflow.** Pinned ` @vscode/vsce ` and ` ovsx `
62+ to specific versions (no more ` @latest ` with PATs in env), added a
63+ ` git merge-base ` check that refuses to publish a tag that isn't on
64+ ` main ` , added a CHANGELOG-fold check, and narrowed workflow-level
65+ permissions to ` contents: read ` with the publish job opting up to
66+ ` contents: write ` . The publish job is gated on the ` production `
67+ GitHub Environment so ` VSCE_PAT ` / ` OVSX_PAT ` are only readable from
68+ a run that has cleared required reviewers.
69+ - ** Added [ SECURITY.md] ( SECURITY.md ) ** with GitHub Private Vulnerability
70+ Reporting as the disclosure channel, response SLAs, and a published
71+ threat model.
72+
73+ ### Tests
74+
75+ - ** Vitest unit suite added.** 25 tests covering the severity threshold
76+ filter (extracted into [ src/severityFilter.ts] ( src/severityFilter.ts ) )
77+ and the Findings tree's pure logic (collection from
78+ diagnostics, group-by-severity / file / rule, severity normalisation,
79+ no-refresh-storm contract). ` npm test ` runs the suite; both ci.yml
80+ and publish.yml gate on it. Test files live next to the code they
81+ cover and are stripped from the .vsix.
82+
83+ ### Fixed
84+
85+ - ** The published ` .vsix ` was missing its runtime dependency.** The
86+ previous build emitted ` out/extension.js ` via ` tsc ` but excluded
87+ ` node_modules/ ` from the package, so ` require("vscode-languageclient/node") `
88+ threw on activation in a clean install. Now bundled with esbuild into
89+ a single ` dist/extension.js ` (the only JS in the ` .vsix ` ); a CI
90+ smoke step ([ scripts/smoke.js] ( scripts/smoke.js ) ) stubs the ` vscode `
91+ module, loads the bundle, and asserts ` activate ` / ` deactivate ` are
92+ exported so this regression class fails the build instead of the user.
93+
2794### Changed
2895
96+ - ** ` npm audit --omit=dev --audit-level=high ` now runs on every push to
97+ ` main ` ** so advisories filed after a PR has merged still surface.
98+ - ** Activation tightened.** The extension used to activate on every YAML
99+ / JSON / Dockerfile / Terraform / Groovy file in any workspace, then
100+ rely on the server's content filter to drop unrelated documents.
101+ ` activationEvents ` is now a ` workspaceContains: ` list of the trigger
102+ files we actually scan (` .github/workflows/* ` , ` .gitlab-ci.yml ` ,
103+ ` azure-pipelines.yml ` , etc.). The LSP's ` documentSelector ` is
104+ switched from language IDs to matching file-path globs, so the
105+ server only sees candidate documents — no more spurious activations
106+ on ` package.json ` , ` mkdocs.yml ` , or a Helm ` values.yaml ` .
107+ - ** ` @vscode/vsce ` and ` ovsx ` are pinned devDependencies.** Workflows
108+ invoke them via the locally-installed binaries (` npx vsce ` ,
109+ ` npx ovsx ` ) after ` npm ci ` . Versions live in ` package-lock.json `
110+ and Dependabot's existing npm config keeps them current.
111+ - ** Marketplace metadata polish.** Added ` Other ` to ` categories ` ,
112+ pointed ` qna ` at the repo Discussions page.
113+
29114- ** Marketplace polish pass.** The ` package.json ` ` description ` is
30115 rewritten so the numbers that differentiate this extension (22
31116 providers, 14 compliance frameworks beyond OWASP Top 10 CI/CD,
0 commit comments