Skip to content

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 13 Jul 17:52
v0.6.0
cbde66f

Known issues:

  • Upgrading from v0.5.x with jarvy update --method binary fails 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 in jarvy.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. Bare jarvy run
    lists the available commands; there is no implicit cargo run/cargo test fallback, and NUL-bearing (on Windows, also %-bearing)
    -- args are refused. jarvy shell-init emits a snippet defining jr
    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 exits 2 with the valid
    set. Composes with --tools and --extended. Closes PRD-027.
  • jarvy skills update [<name>] — re-fetch skills from library_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> — uninstall SKILL.md + the
    .jarvy-skill.json sidecar from every targeted agent. Idempotent:
    removing an absent skill is a clean no-op. User-added companion files
    next to SKILL.md are preserved.
  • Ad-hoc jarvy skills install <name> — a name absent from
    [skills.install] now resolves from the configured library_sources
    at latest instead of erroring (the --name flag is replaced by a
    positional argument).
  • All three subcommands accept --format json (PRD-051), and emit
    skills.updated / skills.removed telemetry events (gated behind the
    standard telemetry opt-in).
  • jarvy setup observability flags are now wired into the tracing
    subscriber: -v/-vv/-vvv raise console verbosity, -q suppresses all
    but errors (without starving jarvy.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. structurizr is
    the 2026 consolidated "software architecture models as code" tool
    (C4 model) — installs via Homebrew / Linuxbrew (the old,
    now-deprecated structurizr-cli formula is not used); no first-party
    winget/choco, so Windows uses the .war or Docker image. k3s and
    microk8s cover single-node local Kubernetes: k3s is Linux-only and
    installs from a commit-pinned, sha256-verified copy of the upstream
    installer (no floating get.k3s.io fetch); microk8s installs via snap
    on Linux or Canonical's Multipass-backed Homebrew tap on macOS.
  • [git] gains three capabilities (see docs/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|false stays allowed) overridable with
      JARVY_ALLOW_GIT_EXEC_KEYS=1, a security-guardrail-downgrade check,
      and a !-shell-value refusal (leading whitespace included). The
      typed editor/credential_helper fields (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 = false opts out) — writes
      host-aware defaults for unset keys: core.autocrlf
      (Windows true / else input), Windows core.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 sets allow_remote = true, and even then writes are
      forced to --local scope (never ~/.gitconfig). jarvy setup --dry-run previews 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), and nvim
    (starter init.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_hook items honor
    bash_url / powershell_url (each requiring a matching *_sha256
    pin), and skill items install their companion_files (templates,
    helper scripts) alongside SKILL.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-mcp npm package that
    downloads the platform-native jarvy release binary on install
    (SHA256-verified against the release SHA256SUMS.txt, mirroring
    install.sh) and exposes jarvy-mcp (runs jarvy mcp) and jarvy
    bins. npx -y jarvy-mcp is 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,
    pins JARVY_MCP_WORKSPACE=/workspace, and defaults to the MCP server
    entrypoint. .github/workflows/docker-publish.yml builds
    linux/amd64 + linux/arm64 to ghcr.io/cliftonz/jarvy, gated on
    release tags / manual dispatch only.
  • MCP registry submission prep (dist/mcp-registry/, PRD-021):
    server.json for the official MCP registry
    (io.github.cliftonz/jarvy, validated against the 2025-12-11
    schema) plus maintainer submission runbook. Ownership proofs are
    pre-wired: mcpName in the npm package.json and the
    io.modelcontextprotocol.server.name OCI 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 as Cliftonz/jarvy@v1 once tagged.
  • VS Code extension (editors/vscode/, PRD-017 phase 3): live
    jarvy.toml diagnostics, setup/doctor/validate commands, status bar,
    and an unknown-tool quick fix. Compiles clean under strict tsc.
  • 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:

  • rust migrated from a bespoke installer to the define_tool! macro
    (so it can carry a default hook); removed a duplicate rust entry from
    the tool index.
  • Removed ~1.3k LOC of unwired diagnostic surface: the
    observability::{network_trace, bundle} modules (the latter duplicated
    the wired jarvy ticket bundler) and the per-tool/per-network arms of
    the profiler. --profile-output durations now serialize as integer
    *_ms, matching the duration_ms telemetry contract.

Fixes:

  • jarvy update --method binary now follows HTTP redirects when
    downloading release assets, fixing Checksum verification failed on
    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 to cc inside the Alpine builder stage.
  • The JetBrains plugin ID was renamed com.jarvy.intellijcom.jarvy
    before first Marketplace publication — the Plugin Verifier hard-fails
    IDs containing template words like "intellij", which broke the weekly
    verifyPlugin CI job.
  • install.sh no longer exits 1 after a successful install. The
    EXIT-trap cleanup referenced a local tmp_dir that was out of scope
    when the trap fired at script exit; under set -u that threw
    tmp_dir: unbound variable and 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.sh now retries transient GitHub failures (3× with backoff)
    and honors GITHUB_TOKEN / GH_TOKEN for the authenticated
    5000/hr API rate limit, so a single rate-limited request no longer
    hard-fails get_latest_version or silently skips the checksum
    fetch when SHA256SUMS.txt is actually present.
  • The curl … | bash installer (install.sh) now verifies the downloaded
    archive against the release SHA256SUMS.txt before 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=1 to opt out.
  • Fix curl … | bash failing with a download 404 on 64-bit glibc Linux —
    the most common platform. install.sh requested an
    x86_64-unknown-linux-gnu asset, but Jarvy ships only the static
    x86_64-unknown-linux-musl build 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 for install.sh (checksum accept/reject,
    channel filter, platform-triple mapping), a shellcheck / bash -n /
    PowerShell-parse lint gate, an installer e2e workflow that runs
    install.sh and install.ps1 against a real published release, and a
    package-install matrix (.deb → apt, .rpm → dnf, crate → cargo,
    .msi → Windows) that also asserts jarvy update auto-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 | bash

Quick Install (Windows PowerShell)

irm https://raw.githubusercontent.com/Cliftonz/jarvy/main/dist/scripts/install.ps1 | iex

Homebrew

brew install Cliftonz/tap/jarvy

Cargo

cargo install jarvy

Early-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' \
  $ARTIFACT

Tag Signature

This release was cut from a signed git tag. Verify with:

git -c gpg.ssh.allowedSignersFile=.github/allowed_signers tag --verify v0.6.0

SBOM

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.