Changelog
Releases
This page is generated from CHANGELOG.md at build time, so it cannot drift from the repository. Rules are data: pack history lives in rules/, binaries in GitHub releases.
Latest: 3.0.1 · 2026-09-20
3.0.1 · 2026-09-20
Added
- Interactive Terminal UI: Bubble Tea interactive terminal application (
vibeshield) featuring live stack detection, slash commands (/scan,/diff,/fix,/help,/quit), streaming scanner progress, navigable findings table, code context viewer, and mechanical VibePatch preview. - Asynchronous Streaming Scan Engine:
scan.Streamfor non-blocking real-time event updates across files and discovered findings. - Comprehensive QA Test Suite: Added
test/suite with multi-stack vulnerable fixtures (vulnerable-node-app,vulnerable-react-app,vulnerable-supabase-app,vulnerable-python-app,clean-app) and edge-case suites (unicode paths, binary files, monorepos). - Added
test/COMMANDS.mdfull inventory checklist andtest/BUGS.mdQA bug tracker.
Fixed
- Fixed
scandiff.Diffline membership method invocation in interactive diff mode. - Synchronized local install binary path resolution in PowerShell scripts.
- Tidied indirect Go module checksums for Charm Bubbles.
3.0.0 · 2026-09-19
Added
vibeshield doctor [path]. A read-only health check for the binary, the config, the git pre-commit hook, the PR-gate workflow and the agent rule files. Every gap is printed with the exact command that fixes it.--format jsonemitsvibeshield.doctor/v1; the exit code is1when anything needs fixing, so CI can assert the gate is really wired up. This is the first thing to run when a scan behaves unexpectedly.vibeshield completion <bash|zsh|fish|powershell>. Generated completion scripts. Every verb and flag comes from the same tables the parser uses, and a test fails the build if the help text and the completion tables drift.vibeshield rules [id]. The rule packs without the actions and agent recipes thatsearchalso indexes —search --rules --limit 0under a name people actually reach for.vibeshield rules VS-SEC-017reads one rule in full;vibeshield ruleslists them all, grouped by category.- Per-command help.
vibeshield scan --help,vibeshield help scanandvibeshield scan -hnow print that command's own flags and examples, and exit0. Previously every subcommand printed the global manual, soscan --helpnever mentioned--diff. - "Did you mean" suggestions.
vibeshield scnanow answers withDid you mean \vibeshield scan\?instead of the whole manual. Similarity is Damerau-Levenshtein based, so transposed letters count as one edit, and the 0.6 floor means an unrelated word gets silence rather than a confident wrong answer. -Vas a version alias, alongside the existing-vand--version..gitattributesnormalising line endings. Without it a Windows checkout rewrites every file to CRLF, which madegofmt -l .report every Go file as unformatted and put CRLF shebangs on the shell scripts.vibeshield.yml, and the repository now scans itself in CI. The "VibeShield scans itself" step in.github/workflows/ci.ymlruns the scanner against this repository withmode: block-on-critical. Getting it to pass took a real ignore list, and the reason is instructive: a scanner pointed at its own source always finds itself. The rule packs contain every pattern they detect, the golden fixtures are vulnerable on purpose, and the docs must display the install one-liner thatVS-SEC-027exists to flag. Every exception invibeshield.ymlnames its files and states why, and nothing is excluded because a finding was inconvenient — the first run went from 248 findings to 0 by fixing two real bugs and documenting the structural ones.packaging/homebrew/README.mdandscripts/gen-homebrew-formula.mjs, which turns a published release's ownsha256sums.txtinto a ready-to-submit formula. The generated.rbis deliberately not committed: a formula with placeholder checksums is worse than no formula..github/workflows/publish-npm.yml, publishing the npm launcher with OIDC trusted publishing (no stored token) and--provenance, and refusing to publish whenpackage.jsonorlib/run.jsdisagree with the release tag.
Changed
- Top-level help rewritten around examples. It opens with four commands to run first, groups the verbs into Everyday / Explore / Meta, and states the exit-code contract — because that is the whole contract for a gate.
--listonsearchis no longer truncated by the default--limit 20. The README documentsvibeshield search --rules --listas "every shipped rule" and it printed 20 entries. An explicit--limitstill wins.- The console catalog covers
doctor,rulesandcompletion. - Version 3.0.0 across the binary, npm launcher, GitHub Action, Claude Code plugin, contracts, docs and site.
Fixed
- The one-line installers were pinned to
v1.0.0.scripts/install.shandscripts/install.ps1both defaulted tov1.0.0, and neither was listed inscripts/bump-version.mjs— so every release since the first bumped 26 version touchpoints and silently skipped the two files that decide what the README's headline install command actually downloads. Anyone running that one-liner got a release two major versions old, or a 404 if the old assets had been pruned. Both now default tov3.0.0and both are in the bump list, so this cannot drift again. - The installers advised installing at a floating tag. The
go installfallbacks ininstall.sh,install.ps1and the npm launcher all ended in@latest, which is the exact pattern this project's ownVS-DEP-011rule flags: a floating tag resolves to whatever is published at run time. They now pin to the release being installed. The npm fallback ininstall.ps1was also unpinned (npm install -g vibeshield) and now installs the matching version. publish-npm.ymlupgraded the global npm CLI from a floating tag. A security tool's release workflow should not do the thing its ownVS-DEP-004rule calls a supply-chain window. Node 24 bundles npm 11.x, which supports OIDC trusted publishing, so the upgrade is gone entirely and replaced with an assertion that fails loudly if a future Node downgrade makes trusted publishing unavailable.--rulesswallowed the following flag insearch. The positional-arg rewriter used one global table of value-taking flags, so insearch— where--rulesis a boolean switch — it consumed the next argument as if it were a directory name.vibeshield search --rules --listandvibeshield rules VS-SEC-017 --no-colorboth failed with a flag parse error. The table is now per-subcommand, andTestFlagTakesValueCoversEveryValueFlagcovers the boolean/value split in both directions.doctor --config <missing-file>is now a warning rather than a silent fall-through to the defaults.initcmd's exportedFindGitDirreplaces the unexportedfindGitDir, sodoctorandinitcannot disagree about where the git directory is.- The
actionReftest asserts againstdefaultActionTaginstead of a literal version, so a release bump no longer has to edit a test. - The Claude Code plugin manifest pointed at
github.com/vibeshield/vibeshieldand avibeshield.devhomepage that does not exist. Both now point at the real repository and site.
Notes
- Zero new runtime dependencies. Still a single static binary, no CGO.
- Cross-compiles clean for linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64 and windows/arm64.
2.0.1 · 2026-09-19
Fixed
notifications.slacknow enforces the rule the docs already claimed.contracts/cli.mdand the site config page both say a literal webhook URL is a config error (exit 2), because a webhook path *is* the credential. The field was not in the config struct at all, soLoadsilently ignored it and a committed webhook scanned clean. Now validated:${SLACK_WEBHOOK}and$SLACK_WEBHOOKare accepted; anything else — including the malformed${A— exits 2. Delivery is still not wired up; the block is validated so a config can be written once and stay correct.scan <path>reads<path>/vibeshield.yml. The config was resolved relative to the working directory, sovibeshield scan ../other-projectsilently used the wrong project's configuration, or none. An explicit--configstill wins, and when the scan path is.nothing changes.vibeshield versionno longer overstates the rule count. It reported "122 rules" when the engine can evaluate 117: fivestructuralrules load and validate so packs stay portable, but the matcher skips them. It now reports117 active · 5 reserved, and the console marks a reserved rule as reserved in its detail pane instead of letting you search for a rule that cannot fire.
Added
scripts/audit-contract.mjsnow reports rule coverage, so an inert-rule count is visible in CI rather than buried in the pack.scripts/bump-version.mjstakes<from> <to>and an optional--pack <version>, so a tool-only release can no longer accidentally bump the rule-pack version.
2.0.0 · 2026-09-18
Added
--format sarif. SARIF 2.1.0 output, whichcontracts/cli.mdhas listed as a supported format since v1.0.0 while the binary answered "lands in v2.1". Findings now upload to GitHub code scanning viagithub/codeql-action/upload-sarifand appear in a repository's Security tab with the rule text, the one-line fix, and apartialFingerprintsentry built from the contract's own dismiss hash so an alert survives reformatting. Severity maps to SARIF levels (critical/high→error,medium→warning,low/info→note); line-less findings omit the region rather than emitting the invalidstartLine: 0.-v/--verboseonscanandfix— the global flagcontracts/cli.mddocumented but the binary never accepted. Reports the resolved config, mode, languages, pack version and rule count, plus the walk result, on stderr.scripts/audit-contract.mjs— probes the built binary for every command, flag and format value the docs promise, and fails when one is missing. This is howinitand--format sarifwere found.vibeshield init. The setup command thatcontracts/cli.mdhas always specified but the binary never implemented. Detects the stack from manifests (language, ecosystem, framework), writes avibeshield.yml, a pull-request gate workflow pinned to the release this binary came from, and a POSIX pre-commit hook, then runs the first scan. Conservative by design: it never overwrites a file without--force, never touches an existing git hook, and--dry-runprints the whole plan first. Flags:--mode,--dry-run,--force,--no-hook,--no-workflow,--no-scan,--no-color.- Interactive console (
vibeshield,vibeshield ui). One search box over the actions, 7 agent setup recipes and all 122 core rules. Arrow keys /Tabto move,Enterto open,Escto clear then quit,Ctrl+Uto reset. Selecting an action hands the terminal back and runs the real command, so the menu can never drift from the documented flags. vibeshield search [query]. The same ranking on stdout, with--list,--rules,--agents,--limitand--format json(vibeshield.search/v1) for scripting and agent tool-calls.vibeshield agents [name]. Per-agent setup recipes for Codex, Claude Code (CLI + Desktop), Google Antigravity, Cursor, Windsurf, GitHub Copilot and anyAGENTS.mdclient.--bodyprints the pasteable rule block,--markdownemits the matrix as a table.- Fuzzy search engine (
scanner/internal/cli): separator folding (vs-sec-017≡vs sec 017≡vssec017), word-boundary ranking, keyword reinforcement and a subsequence fallback. Multi-token queries narrow rather than widen. Fully unit-tested, no dependencies. - First-class agent rule files, generated from one source of truth:
AGENTS.md,.agents/rules/vibeshield.md(Antigravity),.cursor/rules/vibeshield.mdc,.cursorrules,.windsurf/rules/vibeshield.md,.windsurfrules,.github/copilot-instructions.md.scripts/sync-agent-rules.mjs --checkfails CI if any of them drifts from the Go constant. scripts/bump-version.mjs— explicit, auditable version bump that never touches fixture project versions.CHANGELOG.md,docs/agents.md.
Changed
- Version 2.0.0 across the binary, npm launcher, GitHub Action, Claude Code plugin, rule packs, contracts and site docs.
vibeshieldwith no arguments: on a TTY it opens the console; when stdin is a pipe it still prints usage and exits2, so existing automation is unchanged.- Rule packs bumped to
2.0.0(rule IDs and semantics unchanged — this is a pack-version bump, not a rule rewrite).
Fixed
- Rule-pack version drift between
rules/core/and the embedded copy underscanner/internal/rules/packs/core/.
Notes
- Zero new runtime dependencies. Raw-terminal handling is pure
syscallper platform (term_windows.go/term_linux.go/term_darwin.go), so the scanner still builds as a single static binary with no CGO. - Cross-compiles clean for linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64 and windows/arm64.