diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 34ac4b6..2d13e0d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -95,7 +95,7 @@ jobs: if: runner.os == 'Windows' shell: pwsh run: | - $flags = "--remap-path-prefix=$env:GITHUB_WORKSPACE=/src/rust-spine --remap-path-prefix=$env:USERPROFILE=/src/dependencies --remap-path-prefix=$env:CARGO_HOME=/src/dependencies" + $flags = "-C target-feature=+crt-static --remap-path-prefix=$env:GITHUB_WORKSPACE=/src/rust-spine --remap-path-prefix=$env:USERPROFILE=/src/dependencies --remap-path-prefix=$env:CARGO_HOME=/src/dependencies" "RUSTFLAGS=$flags" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append # gemm-f16's unoptimized AArch64 build currently fails in inline assembly: @@ -129,6 +129,20 @@ jobs: if: runner.os != 'Windows' run: target/${{ matrix.target }}/release/spine --version + - name: Verify Windows needs no Visual C++ runtime installer + if: runner.os == 'Windows' + shell: pwsh + run: | + $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + $dumpbin = & $vswhere -latest -products '*' -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -find 'VC\Tools\MSVC\**\bin\Hostx64\x64\dumpbin.exe' | Select-Object -First 1 + if (-not $dumpbin) { throw "Cannot find dumpbin to verify Windows runtime dependencies" } + $imports = & $dumpbin /DEPENDENTS "target/$env:TARGET/release/spine.exe" | Out-String + if ($LASTEXITCODE -ne 0) { throw "Cannot inspect Windows runtime dependencies" } + Write-Output $imports + if ($imports -match '(?i)\b(?:vcruntime|msvcp|concrt)\d+[^\s]*\.dll\b') { + throw "Windows executable requires a separate Visual C++ runtime installation" + } + - name: Smoke-test Windows binary if: runner.os == 'Windows' shell: pwsh diff --git a/CHANGELOG.md b/CHANGELOG.md index e8e3dee..c35e616 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ # Changelog -## 0.3.0 — 2026-10-24 +## 0.3.1 — 2026-10-24 + +- Includes the automatic setup and maintenance changes below. +- Windows release binaries statically link the C runtime, removing the separate + Visual C++ Redistributable installation step. Release checks reject external + Visual C++ runtime DLL dependencies. + +## 0.3.0 — 2026-10-24 (validation tag; downloads not published) - Run `spine` to start chat. First-run setup asks for one model server URL, checks readiness and API access, downloads verified MiniLM assets when needed, diff --git a/Cargo.lock b/Cargo.lock index 125ea64..ea91ceb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2705,7 +2705,7 @@ dependencies = [ [[package]] name = "spine-cli" -version = "0.3.0" +version = "0.3.1" dependencies = [ "async-trait", "axum", @@ -2730,7 +2730,7 @@ dependencies = [ [[package]] name = "spine-heart" -version = "0.3.0" +version = "0.3.1" dependencies = [ "argon2", "bip39", @@ -2756,7 +2756,7 @@ dependencies = [ [[package]] name = "spine-models" -version = "0.3.0" +version = "0.3.1" dependencies = [ "blake3", "candle-core", @@ -2770,7 +2770,7 @@ dependencies = [ [[package]] name = "spine-runtime" -version = "0.3.0" +version = "0.3.1" dependencies = [ "async-trait", "axum", diff --git a/Cargo.toml b/Cargo.toml index 09f9b10..bf26dec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ members = [ exclude = ["fuzz", "vendor/candle-core"] [workspace.package] -version = "0.3.0" +version = "0.3.1" edition = "2024" rust-version = "1.99" license = "MIT OR Apache-2.0" diff --git a/Dockerfile b/Dockerfile index 0796502..0fbf640 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ RUN --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked \ FROM alpine:3.24@sha256:be2656061b536c1883c4034790e21d0a09c5aaaf51968b89368a3c0371ea2c9a AS runtime -ARG APP_VERSION=0.3.0 +ARG APP_VERSION=0.3.1 LABEL org.opencontainers.image.title="Spine" \ org.opencontainers.image.description="Standalone native Spine harness" \ org.opencontainers.image.version="${APP_VERSION}" \ diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md index d18c3cf..249f289 100644 --- a/PROJECT_STATE.md +++ b/PROJECT_STATE.md @@ -2,9 +2,11 @@ ## Baseline -- v0.3.0 includes first-run setup, the outstanding budget-aware file-pagination +- v0.3.1 includes first-run setup, the outstanding budget-aware file-pagination fix, stable dependency updates, Rust 1.99.1, and refreshed pinned CI/container images. +- Windows release builds statically include the C runtime and verify that no + separate Visual C++ runtime installer is required. - Standalone Rust workspace with no Python runtime imports. - One encrypted heart contains the signed canonical event log and its versioned cognitive projection. - The projection unifies DCMDb, per-agent Thymos, typed facts, learned risk, and context triangles. diff --git a/README.md b/README.md index be73444..9fe91e7 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Python, Node.js, npm, or separate web server to install. ## First-time setup -Spine v0.3.0 includes automatic memory-model setup and remembers successful +Spine v0.3.1 includes automatic memory-model setup and remembers successful launch settings. Download the package for your platform, open Spine, connect your model service once, and choose a heart passphrase. @@ -20,6 +20,8 @@ model. The optional NLI answer checker can be configured later. Download an archive and its checksum from the [GitHub Releases page](https://github.com/Jaredcastorena/Rust-spine/releases). No Rust, Git, Python, or Node.js is needed to run a prebuilt archive. +The Windows executable includes its C runtime, so no separate Visual C++ +Redistributable installer is needed. | System | Archive name contains | | --- | --- | diff --git a/crates/spine-cli/Cargo.toml b/crates/spine-cli/Cargo.toml index 8953108..f19c32b 100644 --- a/crates/spine-cli/Cargo.toml +++ b/crates/spine-cli/Cargo.toml @@ -25,9 +25,9 @@ rpassword.workspace = true serde.workspace = true serde_json.workspace = true sha2.workspace = true -spine-heart = { version = "0.3.0", path = "../spine-heart" } -spine-models = { version = "0.3.0", path = "../spine-models" } -spine-runtime = { version = "0.3.0", path = "../spine-runtime" } +spine-heart = { version = "0.3.1", path = "../spine-heart" } +spine-models = { version = "0.3.1", path = "../spine-models" } +spine-runtime = { version = "0.3.1", path = "../spine-runtime" } tokio.workspace = true tempfile.workspace = true walkdir.workspace = true diff --git a/crates/spine-models/Cargo.toml b/crates/spine-models/Cargo.toml index 6be7e2f..b4ba0ff 100644 --- a/crates/spine-models/Cargo.toml +++ b/crates/spine-models/Cargo.toml @@ -13,7 +13,7 @@ candle-core.workspace = true candle-nn.workspace = true candle-transformers.workspace = true serde_json.workspace = true -spine-heart = { version = "0.3.0", path = "../spine-heart" } +spine-heart = { version = "0.3.1", path = "../spine-heart" } tokenizers.workspace = true [dev-dependencies] diff --git a/crates/spine-runtime/Cargo.toml b/crates/spine-runtime/Cargo.toml index 418e017..3ef5203 100644 --- a/crates/spine-runtime/Cargo.toml +++ b/crates/spine-runtime/Cargo.toml @@ -14,7 +14,7 @@ reqwest.workspace = true regex.workspace = true serde.workspace = true serde_json.workspace = true -spine-heart = { version = "0.3.0", path = "../spine-heart" } +spine-heart = { version = "0.3.1", path = "../spine-heart" } thiserror.workspace = true tokio.workspace = true diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock index d4025d6..16f0f66 100644 --- a/fuzz/Cargo.lock +++ b/fuzz/Cargo.lock @@ -708,7 +708,7 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "spine-heart" -version = "0.3.0" +version = "0.3.1" dependencies = [ "argon2", "bip39",