v0.2.0
First minor release in the v0.x line. Bigger than its predecessor — 32
commits adding two new tool ecosystems (NATS messaging, .NET / NuGet), a
significant MCP tool surface, AI-hooks distribution to six coding agents,
auto-registration of the Jarvy MCP server, and the release-soak CI gates
that catch regressions before promotion. Soaked as v0.2.0-rc.1 →
-rc.2 over 2026-06-16 → 2026-06-22; soak record in
#25.
Known limitation — binary self-update gate ships in bootstrap mode
The Path 2/3/4 (upgrade / skip-version / rollback) CI gate is live but
#30 is open: release.yml
does not yet emit .tar.gz / .zip binary tarballs as release assets, so
the BinaryInstaller self-update path has nothing to consume. Users on a
package-manager path (Homebrew, cargo, apt, dnf, pacman, winget,
Chocolatey, scoop, AUR) update normally. Users on the binary fallback see
"No binary for this platform" — same documented gap as v0.1.x. Tracked for
v0.3.0.
Added
- NATS messaging toolchain (4 tools).
nats-server,natsCLI,nsc
(account credentials), plus anats-servicesbuilt-in template that
wires a working three-service mesh into a freshjarvy.toml. - .NET / NuGet ecosystem. New
[nuget]package section +NugetHandler
with end-to-end dry-run + install support. 5 .NET dev tools (full set
validated against upstream channel docs), 5 .NET-flavored templates, 5
example configs, andgrpcurlfor grpc service introspection. - 12 queuing / messaging tools across two batches. First batch: 6
workflow + broker tools. Second batch:pulsar,kaf,kafkactl,
emqx,argo(Workflows CLI),kn(Knative CLI). Tools without
first-party Windows manifests omit thewingetblock entirely rather
than ship placeholder IDs that could be hijacked under
supply-chain attack (see Security). - Extended MCP tool surface. AI hooks, MCP register, drift, roles,
services, templates, validation — all exposed over MCP. Mutating tools
(services_start,templates_use) gated bygate_mutation+
MutationCtx: rate limit → stderr TTY confirm → audit log. Workspace
containment enforced bysafety::resolve_within_workspace(canonical-
root check; refuses.., absolute escapes, endpoint symlinks). ai_hooksdistribution to six AI coding agents. Curated guardrail
hooks (the "don'trm -rfyour homedir", "respect .gitignore",
"stop-on-tests" class of safeguard) provisioned uniformly to Claude
Code, Cursor, Codex, Windsurf, Cline, and Continue. Bash → PowerShell
translation on Windows handled in-process so the same hook YAML works
cross-platform.mcp_registerauto-registration to the same six agents. One-shot
setup that places the Jarvy MCP server entry in each agent's config
with the correct stdio invocation, so users don't have to copy-paste
per-agent boilerplate. Trust-gated: only the built-injarvyserver
registers from a remote config unlessallow_custom_servers = true.- Telemetry category plumbing.
categoryfield travels through every
tool.requested/tool.installed/tool.failedevent, plus
template.materialized. Operators can graph "what fraction of NATS
rollouts succeeded?" without pivoting on tool name. tool.already_installedevent. Surfaces the skip path with
install_path,detection_method,prompted_userfields — previously
invisible in telemetry, now visible.- Telemetry
error_kinddiscrimination.tool.failedcarries an
error_kindenum (tap_fetch,command_failed,permission_denied,
…) so an operator can split "the brew tap was unreachable" from "the
binary install actually broke". - Drift report category grouping. Tools group by category in human
output (messaging,workflow,runtime, …) instead of one flat
list, making diff review tractable at scale. - CI: Path 8 asset download sweep workflow.
.github/workflows/verify-release.yml
fetches every release asset, verifies HTTP 200, sha256 against
SHA256SUMS.txt, cosign signature, SBOM well-formedness, and asserts
the.deb-extracted binary's--versionmatches the tag's core version.
Auto-fires onrelease: publishedand weekly to catch asset rot. - CI: Path 2/3/4 release-paths validation workflow.
.github/workflows/release-paths.yml
exercises upgrade-from-N-1, skip-version-from-N-2, and rollback flows
on macOS arm64 / Ubuntu 22.04 / Windows. Runs in bootstrap mode until
#30 ships tarballs; auto-tightens to hard-fail after. - CI: one-shot winget submission helper. For first-time Jarvy.Jarvy
publisher onboarding.
Changed
- Dash ↔ underscore tool aliasing is now uniform.
nats-serverand
nats_serverresolve to the same tool in three places that previously
diverged:registry::get_tool(),commands::validate::validate_tools,
andtools::spec::get_tool_spec(). The third site was the sev-2 found
during rc.1 soak and fixed in rc.2 —validateacceptednats-server
butsetup --dry-runreportedtool.unsupportedfor the same name. - Brew tap auto-tap. When
macos.brew(orlinux.brewfallback) is
org/tap/formulaform (exactly two slashes), install path runs
brew tap org/tapfirst so a fresh box doesn't surface an "untrusted
tap" error. Soft-fail; already-tapped is not a blocker. jarvy validateandjarvy setup --dry-runnow surface[nuget].
Previously the new section silently dropped from the validate report —
users would think their NuGet packages were configured when they
weren't.publish-packages.ymldecouples downstream channels from crates.io.
Previously a transient crates.io publish failure left winget / chocolatey
/ homebrew unsynced. Each channel now has independent secret gates and
failure modes.- Release binary
--versioncomparison uses core version, not full
tag. rc tags likev0.2.0-rc.2build binaries that report
jarvy 0.2.0(no prerelease suffix); the verify-release step now
matches on core only.
Fixed
- Drop placeholder Windows package IDs from tool definitions.
Six tools previously listed placeholderwingetIDs like
Pivotal.RabbitMQfor upstream namespaces that the publisher had not
actually claimed. Any party who registered that publisher could ship
a malicious installer pinned bywinget install -e --id. Replaced
with explicit// No first-party winget manifest as of YYYY-MMnotes;
tool.unsupportedtelemetry fires in place at runtime. - Telemetry gate respects
[telemetry] enabled = false. Every
package.*/packages.*/package_command.failedevent reads
observability::telemetry_gate::is_enabled()before emitting. Prior
implementation leaked package events to OTLP when telemetry was
disabled but an endpoint was set for unrelated reasons. Broke the
documented opt-in contract. - MCP safety boundary applies to extended mutating tools. The new
drift/roles/templates/services tools all run through
resolve_within_workspace— a path containing..or an absolute
escape that lands outside the workspace root canonicalizes to a
refusal, not a silent file write. - De-flaked
telemetry_smokeintegration test. Ephemeral port +
#[serial]annotation + 30s timeout, replacing the prior flaky
hardcoded port that intermittently lost to other tests' bound
sockets. - Mass conversion of ~200
_registered_returns_sometautology tests
to_registration_shapetests. The old tests verified
Some(_).is_some()after registration — a tautology that always
passed even when the underlyingToolSpecwas structurally broken.
Replaced with shape-asserting tests that fail when a tool's platform
matrix degrades.
Security
- Supply-chain: no more placeholder winget IDs. See Fixed above.
- Package-name validation.
validate_package_name/
validate_package_versionrefuse leading--, URL schemes, shell-meta,
and control bytes (ESC/BEL/DEL/NUL — closes ANSI injection in dry-run
preview).jarvy validateruns them on every[npm]/[pip]/[cargo]/[nuget]
entry. - Remote-config trust narrowing only.
ConfigOrigin::Remotetags
remote-fetched configs;allow_custom_commands,allow_custom_servers,
allow_remote(packages), and telemetry endpoint override are all
refused for remote configs. Library hooks and the built-injarvyMCP
server remain trustable; user-authored extensions do not.
Impact on v0.1.x users
- Cargo (
cargo install jarvy) — resolves to v0.2.0; no breaking API
surface in command flags. Existingjarvy.tomlparses unchanged. .deb/.rpm/.dmg/.msi/.AppImage— install normally
from the GitHub release.- Homebrew, install.sh, install.ps1 — still broken pending #30,
same as v0.1.x. No regression; no improvement. jarvy update— package-manager paths upgrade fine. Binary
fallback returns the documented "No binary for this platform" — same
state as v0.1.x, tracked in #30.
Patch release closing the crates.io gap that v0.1.0 left open. No
runtime code changes — release-pipeline metadata only.
Fixed
jarvy-templatesis now publishable. The crate was marked
publish = falseand lacked therepository/homepagemetadata
crates.io requires. Bothjarvyandcargo-jarvydepend on it via
{ version = "X", path = "..." }; crates.io stripspathon publish
and resolves from the registry, so the dep must already be available
there. Withpublish = false+ no version spec on the parents, the
v0.1.0cargo publishfailed aterror: failed to verify manifest ... 'jarvy-templates' does not specify a versionbefore either crate
could upload.- Both
jarvy-templatespath dependency declarations now carry a
version = "0.1.1"requirement. Required bycargo publish—
without it the parent crate cannot verify against the published
registry form of the dep. publish-packages.yml::publish-crates-iostep is now ordered.
Previously onecargo publishcall attempted to publishjarvyas
the workspace root;jarvy-templateswas never published, so the
parent's resolve always 404'd. The job now publishes
jarvy-templatesfirst, polls the crates.io index for up to 150s
until the dep surfaces, then publishesjarvywith--no-verify
(the workspace verify already ran at tag-build time; the
post-publish re-verify would race the index refresh).
Impact on v0.1.0 users
- The GitHub Release for v0.1.0 (all 49 binary assets + Sigstore
signatures) is unaffected..deb/.rpm/.dmg/.msi/
.AppImageinstall paths work exactly as documented. cargo install jarvyresolves to v0.1.1 (the first crates.io
release in the v0.1.x line). Users who triedcargo install jarvy
during the v0.1.0 → v0.1.1 window sawerror: could not find jarvy 0.1.0 in registry crates-io.- Other channels (Homebrew tap, AUR, winget, Chocolatey) were not
affected by this gap.
Full Changelog: v0.2.0-rc.2...v0.2.0
Installation
Quick Install (Unix)
curl -fsSL https://raw.githubusercontent.com/bearbinary/jarvy/main/dist/scripts/install.sh | bashQuick Install (Windows PowerShell)
irm https://raw.githubusercontent.com/bearbinary/jarvy/main/dist/scripts/install.ps1 | iexHomebrew
brew install bearbinary/tap/jarvyCargo
cargo install jarvyEarly-Release Channel
Pre-release tags (-rc.N, -beta.N) are routed through the beta channel.
Opt in: JARVY_CHANNEL=beta on the install script, or jarvy update --channel beta.
See docs/release-testing.md.
See installation docs for more options.
Security
Verify Signatures
All release artifacts are signed with Sigstore keyless OIDC. Verify any artifact:
ARTIFACT=jarvy-linux-x86_64.tar.gz
BASE=https://github.com/bearbinary/jarvy/releases/download/v0.2.0
curl -LO $BASE/$ARTIFACT
curl -LO $BASE/$ARTIFACT.sig
curl -LO $BASE/$ARTIFACT.pem
cosign verify-blob \
--signature $ARTIFACT.sig \
--certificate $ARTIFACT.pem \
--certificate-identity-regexp '^https://github\.com/bearbinary/Jarvy/\.github/workflows/release\.yml@refs/tags/v[0-9.]+(-[A-Za-z0-9.]+)?$' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
$ARTIFACTTag Signature
This release was cut from a signed git tag. Verify with:
git -c gpg.ssh.allowedSignersFile=.github/allowed_signers tag --verify v0.2.0SBOM
Software Bill of Materials in SPDX 2.3 (sbom.spdx.json) and CycloneDX 1.4 (sbom.cdx.json).
Checksums
SHA256 checksums for all artifacts are in SHA256SUMS.txt.