v0.6.0
Known issues:
- Upgrading from v0.5.x with
jarvy update --method binaryfails with
Checksum verification failed: the v0.5.x updater does not follow the
HTTP redirects GitHub now serves on release-asset downloads (fixed in
this release, but the fix cannot reach the old binary doing the
upgrade). Workaround: reinstall via the install script
(curl -fsSL https://raw.githubusercontent.com/Cliftonz/jarvy/main/dist/scripts/install.sh | bash)
or your package manager. Upgrades from v0.6.0 onward work.
Features:
jarvy run [name] [-- args]— npm-run-style command runner for a
[commands]table injarvy.toml. An explicitly named command is
treated as consent (shell chaining allowed; the command is printed
ANSI-stripped before exec), the child's exit code is propagated, and
the working directory is the config file's directory. Barejarvy run
lists the available commands; there is no implicitcargo run/cargo testfallback, and NUL-bearing (on Windows, also%-bearing)
-- argsare refused.jarvy shell-initemits a snippet definingjr
as shorthand, and shell-init/completions gain nushell support
alongside bash/zsh/fish/sh/powershell. Telemetry:run.command.*,
shell_init.generated,completions.generated.jarvy doctor --check <path,tools,hooks>— limit the health run to
specific categories (system info is always shown as context). Skips the
unselected probes entirely; an unknown category exits2with the valid
set. Composes with--toolsand--extended. Closes PRD-027.jarvy skills update [<name>]— re-fetch skills fromlibrary_sources,
compare the advertised version/sha against the installed sidecar per
agent, and reinstall only on divergence (no-op when unchanged; a pinned
[skills.install]version that no longer matches the library refuses
rather than silently drifting). PRD-049 phase 2.jarvy skills remove <name>— uninstallSKILL.md+ the
.jarvy-skill.jsonsidecar from every targeted agent. Idempotent:
removing an absent skill is a clean no-op. User-added companion files
next toSKILL.mdare preserved.- Ad-hoc
jarvy skills install <name>— a name absent from
[skills.install]now resolves from the configuredlibrary_sources
atlatestinstead of erroring (the--nameflag is replaced by a
positional argument). - All three subcommands accept
--format json(PRD-051), and emit
skills.updated/skills.removedtelemetry events (gated behind the
standard telemetry opt-in). jarvy setupobservability flags are now wired into the tracing
subscriber:-v/-vv/-vvvraise console verbosity,-qsuppresses all
but errors (without starvingjarvy.log/ OTLP),--log-format json,
--log-file <path>,--debug-filter <module>, and--profile/
--profile-output(phase-level timing report). These flags previously
parsed but were silently dropped.- 15 new tools:
allure,aws-sam-cli,cfn-lint,cypress,
goaccess,k3s,linkerd,locust,microk8s,playwright,
putty,structurizr,task,tmux,todoist.structurizris
the 2026 consolidated "software architecture models as code" tool
(C4 model) — installs via Homebrew / Linuxbrew (the old,
now-deprecatedstructurizr-cliformula is not used); no first-party
winget/choco, so Windows uses the.waror Docker image.k3sand
microk8scover single-node local Kubernetes: k3s is Linux-only and
installs from a commit-pinned, sha256-verified copy of the upstream
installer (no floatingget.k3s.iofetch); microk8s installs via snap
on Linux or Canonical's Multipass-backed Homebrew tap on macOS. [git]gains three capabilities (seedocs/git-config.md):[git.extra]— a free-form escape hatch for git config keys Jarvy
doesn't model as typed fields (core.fsmonitor,feature.manyFiles,
…), applied last so they override modeled fields. Each entry runs a
layered guard: dotted-grammar/flag-injection key validation, a
leading--value refusal (argv option-injection), an outright
refusal of keys whose value git executes (core.pager/editor/
sshCommand/askPass/hooksPath,pager.<cmd>,filter.*.clean,
*.textconv,merge.*.driver,remote.*.uploadpack,
init.templateDir, … — RCE the!-filter alone missed;
core.fsmonitor=true|falsestays allowed) overridable with
JARVY_ALLOW_GIT_EXEC_KEYS=1, a security-guardrail-downgrade check,
and a!-shell-value refusal (leading whitespace included). The
typededitor/credential_helperfields (which legitimately set
such keys) are value-guarded instead: a bare command/helper + flags
is allowed, a shell metacharacter /!/ program-path value is
refused. The dry-run preview runs the same gauntlet, so it shows
refusals rather than claiming a blocked key "would be set."os_defaults(default on;os_defaults = falseopts out) — writes
host-aware defaults for unset keys:core.autocrlf
(Windowstrue/ elseinput), Windowscore.longpaths, macOS
core.precomposeunicode, plus a cross-platform recommended set
(fetch.prune,rerere.enabled,merge.conflictStyle = zdiff3).
Explicit fields and[git.extra]always win; keys already matching
are skipped so re-runs don't re-write.- Security guardrail —
[git.extra]values that weaken a git defense
are refused (core.protectNTFS/protectHFS = false,
safe.directory = *(CVE-2022-24765),safe.bareRepository = all,
fsck.*/fetch.fsck.*/receive.fsck.* = ignore,
*.fsckObjects = false,http[.<url>].sslVerify = false) unless
JARVY_ALLOW_GIT_PROTECT_DOWNGRADE=1. - Trust boundary — a remote-origin config (
--from <url>) cannot apply
[git]unless it setsallow_remote = true, and even then writes are
forced to--localscope (never~/.gitconfig).jarvy setup --dry-runpreviews every OS-default and[git.extra]write. Full
git_config.*telemetry — lifecycle, adoption (extra_applied,
os_defaults_applied), and security refusals/overrides — all gated
behind the telemetry opt-out.
- Default post-install hooks for
rust(clippy/rustfmt + cargo env),
tmux(TPM plugin manager),kubectx(kctx/kns aliases), andnvim
(starterinit.lua). Unix-only where the tool also ships on Windows.
Added:
- Library manifests can now reference item bodies by URL instead of
inlining them (PRD-054 companion-fetch phase):ai_hookitems honor
bash_url/powershell_url(each requiring a matching*_sha256
pin), andskillitems install theircompanion_files(templates,
helper scripts) alongsideSKILL.md. Every companion fetch is
HTTPS-bounded, sha256-verified against the manifest pin (no
unverified fetch path), cached content-addressed under
~/.jarvy/library.d/companions/, and skill companion filenames are
path-safety validated so a hostile manifest cannot escape the skill
directory. New telemetry:library.companion.{fetched,sha_mismatch,fetch_failed,refused_filename}. - npm wrapper (
packages/npm/, PRD-021):jarvy-mcpnpm package that
downloads the platform-native jarvy release binary on install
(SHA256-verified against the releaseSHA256SUMS.txt, mirroring
install.sh) and exposesjarvy-mcp(runsjarvy mcp) andjarvy
bins.npx -y jarvy-mcpis now a zero-install MCP client command.
Not yet published to npm — maintainer action. - Docker image (
dist/docker/Dockerfile, PRD-021): multi-stage
Alpine image that builds jarvy from source, runs as a non-root user,
pinsJARVY_MCP_WORKSPACE=/workspace, and defaults to the MCP server
entrypoint..github/workflows/docker-publish.ymlbuilds
linux/amd64 + linux/arm64 toghcr.io/cliftonz/jarvy, gated on
release tags / manual dispatch only. - MCP registry submission prep (
dist/mcp-registry/, PRD-021):
server.jsonfor the official MCP registry
(io.github.cliftonz/jarvy, validated against the2025-12-11
schema) plus maintainer submission runbook. Ownership proofs are
pre-wired:mcpNamein the npm package.json and the
io.modelcontextprotocol.server.nameOCI label in the Dockerfile.
Not submitted — requires the maintainer to publish npm + ghcr first. - CI e2e coverage for Fedora, Arch, and Alpine via distro containers on
the free ubuntu runner (PRD-014). - Published GitHub Action (top-level
action.yml, PRD-017 phase 2):
installs jarvy (checksum-verified) and runs validate/setup/doctor, with
caching, outputs, and a problem matcher. Self-tested on
ubuntu/macos/windows. Referenceable asCliftonz/jarvy@v1once tagged. - VS Code extension (
editors/vscode/, PRD-017 phase 3): live
jarvy.tomldiagnostics, setup/doctor/validate commands, status bar,
and an unknown-tool quick fix. Compiles clean under stricttsc. - JetBrains/IntelliJ plugin (
editors/jetbrains/, PRD-017 phase 6):
Tools ▸ Jarvy actions + a TOML ExternalAnnotator driven by
jarvy validate. Builds via./gradlew buildPlugin(IntelliJ Platform
Gradle Plugin 2.x, JDK 21). - Consumable pre-commit hook (
.pre-commit-hooks.yaml) and devcontainer
feature (dist/devcontainer/jarvy/), PRD-017 phases 4–5.
Changed:
rustmigrated from a bespoke installer to thedefine_tool!macro
(so it can carry a default hook); removed a duplicaterustentry from
the tool index.- Removed ~1.3k LOC of unwired diagnostic surface: the
observability::{network_trace, bundle}modules (the latter duplicated
the wiredjarvy ticketbundler) and the per-tool/per-network arms of
the profiler.--profile-outputdurations now serialize as integer
*_ms, matching theduration_mstelemetry contract.
Fixes:
jarvy update --method binarynow follows HTTP redirects when
downloading release assets, fixingChecksum verification failedon
every binary self-update (GitHub serves release-asset downloads via
redirect). This was the sev-1 that v0.6.0-rc.2 was cut for; see the
known-issues note above for upgrading from v0.5.x.cargo jarvy new-tool <name>scaffolding no longer generates
uncompilable module wiring.- The ghcr.io Docker image build no longer fails with
linker `musl-gcc` not found: the x86_64-musl linker pin in
.cargo/config.toml(needed by the Ubuntu cross-build) is overridden
back toccinside the Alpine builder stage. - The JetBrains plugin ID was renamed
com.jarvy.intellij→com.jarvy
before first Marketplace publication — the Plugin Verifier hard-fails
IDs containing template words like "intellij", which broke the weekly
verifyPluginCI job. install.shno longer exits1after a successful install. The
EXIT-trap cleanup referenced alocal tmp_dirthat was out of scope
when the trap fired at script exit; underset -uthat threw
tmp_dir: unbound variableand failed every install right after it
reported success. The trap now bakes the resolved path in at
registration time. (Caught by the new GitHub Action self-test.)install.shnow retries transient GitHub failures (3× with backoff)
and honorsGITHUB_TOKEN/GH_TOKENfor the authenticated
5000/hr API rate limit, so a single rate-limited request no longer
hard-failsget_latest_versionor silently skips the checksum
fetch whenSHA256SUMS.txtis actually present.- The
curl … | bashinstaller (install.sh) now verifies the downloaded
archive against the releaseSHA256SUMS.txtbefore extracting it. The
checksum routine existed but was never called, so installs ran with no
integrity check at all; the PowerShell installer (install.ps1) had the
same dead-code gap and is fixed too. A mismatch aborts the install; set
JARVY_SKIP_CHECKSUM=1to opt out. - Fix
curl … | bashfailing with a download 404 on 64-bit glibc Linux —
the most common platform.install.shrequested an
x86_64-unknown-linux-gnuasset, but Jarvy ships only the static
x86_64-unknown-linux-muslbuild for x86_64, so nothing matched. The
installer now requests the triple that actually ships (x86_64 → musl,
aarch64 → gnu, armv7 → gnueabihf).
Internal:
- Log reading and stats (
jarvy logs view/logs stats) no longer
allocate per line on the no-sanitization fast path. - New searchable tool directory in the docs site with per-OS install
commands for every registered tool. - Add end-to-end coverage for the download → install → upgrade path, which
previously had none: unit tests forinstall.sh(checksum accept/reject,
channel filter, platform-triple mapping), ashellcheck/bash -n/
PowerShell-parse lint gate, an installer e2e workflow that runs
install.shandinstall.ps1against a real published release, and a
package-install matrix (.deb→ apt,.rpm→ dnf, crate → cargo,
.msi→ Windows) that also assertsjarvy updateauto-detects the
install method.
Full Changelog: v0.6.0-rc.2...v0.6.0
Installation
Quick Install (Unix)
curl -fsSL https://raw.githubusercontent.com/Cliftonz/jarvy/main/dist/scripts/install.sh | bashQuick Install (Windows PowerShell)
irm https://raw.githubusercontent.com/Cliftonz/jarvy/main/dist/scripts/install.ps1 | iexHomebrew
brew install Cliftonz/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:
# Substitute a triple that matches your platform, e.g.
# aarch64-apple-darwin, x86_64-unknown-linux-musl,
# aarch64-unknown-linux-gnu, x86_64-pc-windows-msvc (.zip).
ARTIFACT=jarvy-v0.6.0-x86_64-unknown-linux-musl.tar.gz
BASE=https://github.com/Cliftonz/jarvy/releases/download/v0.6.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/Cliftonz/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.6.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.