Files
Julius Brussee 82864c8f4c feat: ship Caveman 2.0.0 — engine, proxy, SDKs, unified CLI
Single-commit port of the Caveman 2 tree onto the original repo history
(candidate caveman-2@88878a4 applied over main@3098342). No unrelated-history
merge; original history untouched.

Preserved v1 surfaces:
- skills/caveman/SKILL.md byte-for-byte, plus plugin mirror and caveman.skill zip
- legacy CI (Node 18/20/22 installer + Python 3.11 suites) alongside engine-ci
- cli/install.js compatibility shim forwarding to bin/install.js
- .codex/config.toml ships both hooks and codex_hooks for older Codex (#617)
- README Trendshift + Skills.sh badges and local star-history asset
- v1.10.0-pinned curl installs; benchmarks/tmp-starcharts ignore rules

Fixed for public same-repo release:
- SECURITY.md vulnerability reporting points at this repository
- release-binaries.yml publishes to this repo via job-scoped GITHUB_TOKEN
  (cross-repo PAT removed); binary-release environment still gates signing
- packages/cli/PUBLISHING.md rewritten for packages/ layout and same-repo flow
- profile-contract and provider-catalog lanes skip lane-scope gates on
  initial import so the launch PR can gate on their real validation steps
- ANNOUNCEMENT.md network claim corrected: compression is local; requests
  still go to the provider you configured

Caveman 2 stays opt-in: bin-v1.0.0 binaries and @caveman-ai/cli publish
separately after this lands and soaks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BLvb5QniwYjmcawyssQNw9
2026-08-11 16:46:10 +02:00

4.0 KiB

Publishing @caveman-ai/cli

Founder sign-off remains required. Publish from a reviewed repository checkout, never from an unpacked tarball.

Package name

  • Publish as @caveman-ai/cli with npm publish --access public.
  • Never publish under bare caveman; that npm name is unrelated.
  • Package bin entries install both caveman and cave.

Release trains

Tag Owns
cli-v* Manual npm publication of this zero-runtime-dependency JS CLI
bin-v* Signed Go companions through release-binaries.yml

(Caveman Cloud server images release from the Caveman Cloud repository, not from here.)

The binary workflow publishes compiled artifacts and signed manifests to this repository's Releases at https://github.com/JuliusBrussee/caveman/releases/download. packages/cli/BINARY_RELEASE independently pins the binary release consumed by the CLI build; CLI semver does not imply binary version.

The repository environment binary-release needs one founder-controlled secret: CAVEMAN_BINARY_SIGNING_PRIVATE_KEY_PEM, matching the committed public key. Release upload uses the workflow's own GITHUB_TOKEN with job-scoped contents: write; no cross-repo PAT exists. Windows assets use win32/{arm64,amd64} names and are installed with .exe filenames.

caveman setup --install verifies checksum manifest against public key compiled into CLI, then verifies SHA-256 of each streamed artifact before atomic install. This local check covers key-signed manifest chain. Workflow derives public key from private key before signing and verifies generated bundle locally before upload.

Release order

Ordering is load-bearing: assets must exist before npm package naming them.

  1. Set packages/cli/BINARY_RELEASE to the binary tag about to be cut. Run CLI tests and commit generated constants. Require the latest profile-contract Actions run green; it covers shipped profiles against real compression.

  2. Cut the matching binary tag in this repository (annotated, signed, on main). release-binaries.yml builds, signs, and publishes assets to this repository's Releases behind the binary-release environment approval.

  3. Without GITHUB_TOKEN, GH_TOKEN, ~/.netrc, or authenticated gh, verify anonymous HTTP 200 for all 36 binaries and two manifest files.

  4. Bump packages/cli/package.json, cut CLI tag, then run:

    node agents/compile.mjs
    pnpm --dir packages/cli test
    node agents/probe-installed.mjs --all --json
    (cd packages/cli && npm pack --dry-run)
    (cd packages/cli && npm publish --access public)
    

    probe-installed --all is release-machine proof. Missing, broken, or version-drifted binaries fail the gate; CI installs each pin independently so local global installs cannot hide profile drift.

  5. Post-publish smoke on clean machines (macOS ARM, Linux x64, Windows x64), pinned to the exact npm version: install the CLI, caveman setup --install, caveman --version, caveman wrap --off, one compression plus byte-exact retrieval, then uninstall without damaging user config.

If smoke fails, deprecate the npm version, revert quickstart install text, and investigate before another cut. Never overwrite a published version or delete an ordinary binary Release; remove assets only for an active security risk.

Package contents

Tarball remains JS only: dist/, README.md, LICENSE, and package metadata. No postinstall network fetch exists. Users explicitly run caveman setup --install; package-manager script policy cannot silently block runtime setup.

Before publication:

node agents/compile.mjs
pnpm --dir packages/cli test
node agents/probe-installed.mjs --all --json
(cd packages/cli && npm pack --dry-run)

Inspect tarball. It must contain generated binary release constants in compiled dist/index.js, but no private key, source tree, Go binary, or credential. Do not substitute npm --prefix packages/cli pack: npm 11 can ignore that prefix for pack/publish and target the repository root package instead.