Commit graph

95 commits

Author SHA1 Message Date
Alex Jones
26d8e4caf5 ci(docker): lowercase image name for digest push
github.repository is mixed-case (AlexsJones/llmfit) and OCI repository
names must be lowercase. metadata-action lowercased it implicitly in the
old single-job flow, but the push-by-digest output and imagetools create
use the raw env var — both platform builds failed at export with
"invalid reference format".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 15:22:44 +01:00
Alex Jones
e4d05b7873 ci(docker): build arm64 image natively instead of under QEMU
The single-job buildx setup compiled the arm64 Rust binary under QEMU
emulation on an x86 runner, dominating the ~50 min image publish and
delaying the amd64 image behind it. Split into per-platform jobs
(linux/amd64 on ubuntu-latest, linux/arm64 on ubuntu-24.04-arm) pushing
by digest, with a merge job assembling the multi-arch manifest — same
tags and platforms, no emulation.

workflow_dispatch now takes a required release tag so an existing
release's image can be rebuilt on demand.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 15:17:46 +01:00
Alex Jones
57fa5949b9
Merge pull request #741 from AlexsJones/dependabot/github_actions/docker/metadata-action-6.2.0
chore(deps): bump docker/metadata-action from 6.0.0 to 6.2.0
2026-07-13 15:49:59 +01:00
dependabot[bot]
d464688fb8
chore(deps): bump actions/cache from 5.0.5 to 6.1.0 (#694)
Bumps [actions/cache](https://github.com/actions/cache) from 5.0.5 to 6.1.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](27d5ce7f10...55cc834586)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 11:25:44 +01:00
dependabot[bot]
4ba29021c1
chore(deps): bump docker/metadata-action from 6.0.0 to 6.2.0
Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 6.0.0 to 6.2.0.
- [Release notes](https://github.com/docker/metadata-action/releases)
- [Commits](030e881283...dc80280410)

---
updated-dependencies:
- dependency-name: docker/metadata-action
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-13 00:55:31 +00:00
Alex Jones
7b9cc973ae ci: validate community benchmark submissions on PR
Adds the Community Benchmarks workflow: any PR touching
llmfit-core/data/community/ runs scripts/validate_community_benchmarks.py,
which checks JSON schema conformance (schema.json, draft-07),
path/naming conventions (community/<slug>/<timestamp>-<hash>.json), file
size caps, and cross-field sanity the schema can't express (tps
ordering, plausible hardware bounds, submission timestamps within the
feature's lifetime). Whole-directory validation, so repo integrity is
re-checked on every touch; also runs on push to main.

Seeds the directory with the first genuine submission (Intel Arc 140V /
Core Ultra 7 258V, gemma-3 Q8 via llama-server, 3.8 tok/s) — previously
attempted in #713/#716 — which also exercises the workflow on this PR.

Closes the CI-validation follow-up named in #712.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 11:33:44 +01:00
dependabot[bot]
3c14caeb03
chore(deps): bump docker/setup-qemu-action from 4 to 4.1.0
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 4 to 4.1.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v4...v4.1.0)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-06 07:42:33 +00:00
dependabot[bot]
246293a78b
chore(deps): bump docker/setup-buildx-action from 4 to 4.1.0
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 4 to 4.1.0.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v4...v4.1.0)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-06 00:54:46 +00:00
dependabot[bot]
c814748ba5
chore(deps): bump actions/checkout from 6.0.2 to 7.0.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 7.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](https://github.com/actions/checkout/compare/v6.0.2...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 05:32:50 +00:00
Alex Jones
b964ff32d7
Merge pull request #665 from AlexsJones/dependabot/github_actions/softprops/action-gh-release-3.0.1
chore(deps): bump softprops/action-gh-release from 3.0.0 to 3.0.1
2026-07-04 06:30:36 +01:00
Alex Jones
88d8f2fde7 ci: pass HF_TOKEN to the weekly catalog scrape
Raises HuggingFace API rate limits and unlocks gated-model metadata;
the scraper already reads HF_TOKEN from env and warns-and-skips gated
repos without it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 06:40:59 +01:00
Alex Jones
6c40dcf312 feat(calibration): weekly benchmark refresh + estimate-accuracy audit against measured data
Closes the estimate<->reality loop (#112, #119):

- The weekly workflow now refreshes the localmaxxing benchmark cache
  (authenticated via LOCALMAXXING_API_KEY) alongside the catalog.
- New calibration test replays every usable cached measurement (single
  request, pure-GPU, model in catalog) through estimate_tps using each
  preset's bandwidth profile, prints per-preset accuracy, and fails on
  systematic bias (median est/measured outside [0.33, 3.0]) — the class
  of bug #449 was.

First run against 214 measured rows across 12 presets: overall median
est/measured 0.78 (safely conservative), p10 0.24, p90 1.47. Notable
per-preset finding: RX 7900 XT median 0.28 (3.5x underestimate, n=28)
- follow-up candidate for ROCm bandwidth/efficiency tuning.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 06:39:48 +01:00
Alex Jones
b4069d927b feat: request 'llmfit doctor' output in the bug report template
The doctor report (new in #675) captures raw detection-tool output that
turns hardware bug reports directly into regression-test fixtures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 05:19:31 +01:00
Alex Jones
546f73afa0 merge main 2026-07-03 05:18:12 +01:00
Alex Jones
fe89b82366 chore: move schema.json to llmfit-core/data and drop root data/ references
Follows up the #585 merge: the schema now lives next to the catalog it
validates, and the workflow/test/docs no longer reference the removed
root data/ copies.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 21:50:17 +01:00
Alex Jones
5b4a37ef4e
Merge pull request #585 from Romeo-mz/feature/weekly-update
Feature request: Add a weekly ci action to update model database
2026-07-02 21:48:41 +01:00
dependabot[bot]
fa37a56b91
chore(deps): bump softprops/action-gh-release from 3.0.0 to 3.0.1
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 3.0.0 to 3.0.1.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](b430933298...718ea10b13)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: 3.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-29 00:55:08 +00:00
dependabot[bot]
6bcd8d50c5
chore(deps): bump actions/checkout from 6.0.2 to 6.0.3
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](https://github.com/actions/checkout/compare/v6.0.2...v6.0.3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-22 00:54:41 +00:00
Trevor Gamblin
cb377f4559 feat(python): add riscv64 wheel build
Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>
2026-06-17 08:08:27 -04:00
romeo-mz
4450e63f37 refactor(workflows): enhance weekly model update script and add note for CI checks 2026-06-17 09:57:12 +02:00
romeo-mz
682d91a985 feat(workflows): update weekly model update workflow and improve schema documentation 2026-06-17 09:50:20 +02:00
romeo-mz
25b0642d6c feat(schema): add JSON schema and weekly github action 2026-06-17 09:50:20 +02:00
romeo-mz
5136eb44ef feat(models): add daily model update workflow and curated models file 2026-06-17 09:50:20 +02:00
Alex Jones
3330cfca46
Merge pull request #615 from AlexsJones/dependabot/github_actions/actions/checkout-6.0.2
chore(deps): bump actions/checkout from 6 to 6.0.2
2026-06-15 21:13:50 +01:00
dependabot[bot]
a7984b867a
chore(deps): bump astral-sh/setup-uv from 8.1.0 to 8.2.0
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.1.0 to 8.2.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/v8.1.0...v8.2.0)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 8.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-15 00:55:19 +00:00
dependabot[bot]
90b1c07739
chore(deps): bump actions/checkout from 6 to 6.0.2
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 6.0.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](https://github.com/actions/checkout/compare/v6...v6.0.2)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-08 00:54:16 +00:00
dependabot[bot]
9371510a0e
chore(deps): bump docker/build-push-action from 7.1.0 to 7.2.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 7.1.0 to 7.2.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](bcafcacb16...f9f3042f7e)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 7.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-01 01:44:50 +00:00
Alex Jones
0d6aeb3e24 fix(release): use always() to actually override transitive skip
Previous attempt added `if: needs.release.result == 'success'` to
publish-python, publish-crate, and update-homebrew, expecting that
to break the transitive skip when sign-windows fails. It didn't.

GitHub Actions rule: an `if:` expression only overrides the implicit
"skip if any ancestor failed/cancelled" behavior when it includes
one of `always()`, `failure()`, or `cancelled()`. A bare expression
that doesn't reference any of those still gets the implicit skip
gate ANDed in.

Verified against the v0.9.28 retroactive workflow_dispatch run
(26470106767): release succeeded, downstream jobs still skipped
despite the new if. Re-adding `always()` to actually take effect.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 20:33:11 +01:00
Alex Jones
18b581fcf2 fix(release): unblock downstream publish jobs when sign-windows fails
The release job runs with `if: always()` so a sign-windows failure does
not block the GitHub release. But publish-python, publish-crate, and
update-homebrew only had `needs: release`, so GitHub Actions transitively
skipped them whenever any earlier job (like sign-windows) failed.

This is why the AlexsJones/homebrew-llmfit tap has been pinned to 0.9.23
since v0.9.24 (2026-05-12): five consecutive release runs failed at
sign-windows, which silently skipped the tap update each time.

Add `if: needs.release.result == 'success'` to break the transitive
skip. Also document both Homebrew install paths in README so users on
older macOS can pick the prebuilt-binary tap over the source-build
homebrew-core formula.

Refs #581

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 20:23:20 +01:00
romeo-mz
91e9e0d1da fix: correct label formatting in bug report template 2026-05-21 11:43:19 +02:00
romeo-mz
85936d5935 feat: add issue templates for bug reports, documentation improvements, and feature requests 2026-05-20 15:02:53 +02:00
Three Foxes (in a Trenchcoat)
8214b1f19b
fix: add AutoRound format detection to prevent misclassification as GGUF (#532)
* fix: add AutoRound format detection to prevent misclassification as GGUF

- Add ModelFormat::Autoround enum variant in models.rs
- Update is_prequantized() to include AutoRound
- Fix bit-per-parameter calculation for AutoRound-4bit
- Update scrape_hf_models.py to detect auto-round quant_method
- Correct 3 misclassified AutoRound models in hf_models.json
- Add AutoRound-4bit to SUPPORTED_QUANTS and parse_quant() in plan.rs
- Update pre-quantization comments in fit.rs
- Update test_model_format_prequantized() assertion

Fixes #526

* style: apply cargo fmt formatting

* ci: use npx for web build/test steps to fix Windows PATH issue

* fix: add AutoRound-8bit to quant metrics in models.rs

Add explicit entries for AutoRound-8bit in quant_speed_multiplier,
quant_bytes_per_param, and quant_quality_penalty. Without these,
an 8-bit AutoRound model would incorrectly fall through to the
4-bit defaults (0.5 bpp, quality penalty -5.0).
2026-05-05 10:00:56 +01:00
dependabot[bot]
2b3e2d0310
chore(deps): bump googleapis/release-please-action from 4.4.1 to 5.0.0 (#528)
Bumps [googleapis/release-please-action](https://github.com/googleapis/release-please-action) from 4.4.1 to 5.0.0.
- [Release notes](https://github.com/googleapis/release-please-action/releases)
- [Changelog](https://github.com/googleapis/release-please-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/release-please-action/compare/v4.4.1...v5.0.0)

---
updated-dependencies:
- dependency-name: googleapis/release-please-action
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-04 18:17:57 +01:00
dependabot[bot]
2f4c1428fc
chore(deps): bump actions/setup-node from 6.3.0 to 6.4.0 (#529)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.3.0 to 6.4.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v6.3.0...v6.4.0)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-04 11:01:53 +01:00
dependabot[bot]
e9b25445ca
chore(deps): bump actions/setup-node from 6 to 6.3.0 (#511)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6 to 6.3.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v6...v6.3.0)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-01 14:25:37 +01:00
dependabot[bot]
bfb3428406
chore(deps): bump googleapis/release-please-action from 4 to 4.4.1 (#468)
Bumps [googleapis/release-please-action](https://github.com/googleapis/release-please-action) from 4 to 4.4.1.
- [Release notes](https://github.com/googleapis/release-please-action/releases)
- [Changelog](https://github.com/googleapis/release-please-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/release-please-action/compare/v4...v4.4.1)

---
updated-dependencies:
- dependency-name: googleapis/release-please-action
  dependency-version: 4.4.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-29 11:46:23 +01:00
dependabot[bot]
97b84fbfd0
chore(deps): bump actions/checkout from 4 to 6 (#512)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-28 12:08:45 +01:00
dependabot[bot]
000dbdc45e
chore(deps): bump actions/cache from 5.0.3 to 5.0.5 (#510)
Bumps [actions/cache](https://github.com/actions/cache) from 5.0.3 to 5.0.5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](cdf6c1fa76...27d5ce7f10)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 5.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-27 07:07:14 +01:00
James Hoctor
ae7d41d639
chore(ci): update softprops/action-gh-release to v3.0.0 (Node.js 24) (#503)
Fixes Node.js 20 deprecation warning: actions will be forced to Node.js 24
by default on June 2nd, 2026.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 22:00:11 +01:00
James Hoctor
149c114112
Move python packaging to the main repo (#444)
* feat(python): scaffold in-repo PyPI packaging

Copied hatch_build.py, src/__init__.py, src/__main__.py, and tests/ from
the external llmfit-pypi repo into llmfit-python/. Created pyproject.toml
at the repo root (adapted from llmfit-pypi) with updated author, paths, and
non-standard source mapping for the gitignore-safe llmfit-python/src/ layout.
Created .github/workflows/pypi.yml to build and publish all 8 platform wheels
on tag push, mirroring the docker.yml trigger pattern.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(python): rewrite hatch_build.py to use in-repo binaries

hatch_build.py previously downloaded release binaries from GitHub at
wheel-build time, verifying SHA256 and fetching license via the GitHub
API (~267 lines). It now expects the pre-compiled binary to already
exist at target/<rust-target>/release/ and reads version and license
directly from Cargo.toml (~174 lines, no network calls).

This enables the new CI split in release.yml: each build matrix job
uploads its binary as a binary-<target> artifact, and a dedicated
publish-python job (ubuntu-latest only) downloads all of them and runs
uv build in a loop over platform tags before publishing to PyPI in a
single step. Wheel failures no longer block binary release assets.

Also removes the now-redundant standalone pypi.yml workflow, adds
license = "MIT" to Cargo.toml workspace.package, and relocates the
Python package source into src/llmfit/ to match hatch layout.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: add Python gitignore entries

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: add Python code quality Makefile targets

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(python): respect LLMFIT_PYTHON_PLATFORM_TAG in editable installs

When the env var is set, look in target/{rust_target}/release/ (via the
renamed _find_binary_for_target) rather than the default host-native
paths (_find_local_binary). Also splits py_target_from_env / py_target
in initialize so the editable branch reuses the already-read value.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci: add Python CI workflow and tighten Rust CI path filters

- Add python-ci.yml with cross-platform pytest job (gated on llmfit-python/
  or pyproject.toml changes via dorny/paths-filter) and a lint/typecheck job
  that also triggers on scripts/**/*.py changes
- Exclude llmfit-python/** from Rust CI path triggers
- Replace cryptic Cargo.*o* glob with explicit Cargo.{lock,toml}

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: remove committed .pyc file from tracking

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: normalise ruff lint exception comment formatting

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Ruff formatted these lines into one line

* Fix import ordering

* Move pyproject.toml and uv.lock into llmfit-python/

* Correct path to tested code

* Run checks without installing llmfit itself (which fails)

* chore: bump setup-python and setup-uv to latest versions

Upgrades actions/setup-python v5 → v6 and astral-sh/setup-uv v5 → v8.1.0
to resolve Node.js 20 deprecation warnings in CI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Disallow setting LLMFIT_PYTHON_PLATFORM_TAG on an editable build

* Improve inline comments in binary selection logic

* Move binary version check out of selection logic

* Always check that binary file exists

* Check all binaries before building wheels

* Set the execute bit that was lost by GitHub Actions

* Python CI downloads latest release binary instead of rebuilding Rust

Replaces the cargo build steps in the test job with a download of the
latest release archive from GitHub Releases, verified via SHA256.
LLMFIT_VERSION is set to the downloaded release version so the wheel
build does not conflict with an unreleased Cargo.toml bump.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* publish-python: use release file downloads instead of GHA artifacts

Removes the binary artifact upload/download mechanism. publish-python
now depends on the release job (not build) and downloads each archive
directly from GitHub Releases, verifying its checksum inline via pipe
before extracting the binary and building the wheel.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix typo in ci.yml comment: worfklows -> workflows

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Accept optional v prefix in binary --version output

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Simplify BinaryNotFoundError to inherit only from LlmfitError

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add fmt-check target; use in check instead of fmt

Avoids `make check` unexpectedly modifying files on disk.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Split up checksum file to work around * in sha file on Windows

* Fix Windows zip extraction in Python CI workflow

Use unzip instead of tar to extract .zip archives on Windows, since
Git Bash's tar does not support the zip format.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Make llmfit binary version visible in CI tests

* Prevent multiline echo-on-Windows weirdness

* Consolidate CI workflows and add path-based job gating

Merges python-ci.yml into ci.yml. Adds a changes job using
dorny/paths-filter to detect whether Rust or Python files changed,
then gates fmt/clippy/check/check-python jobs accordingly via
job-level if conditions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Tell uv where the python project is

* Remove outdated sentence about LLMFIT_VERSION from docstring

* Run Python tests with debug binary in editable mode for max reuse with cargo test

* Control the working dir to control test discovery

* Run Python build system integration test when there are no Python changes

* Update comment

* Always run cargo build on macos

* Show contents of target/ (for debugging)

* Debug production of debug builds by cargo test

* Always run cargo build to get a debug build

* Only build debug binary for subsequent pytest

* Revert "Debug production of debug builds by cargo test"

This reverts commit c88158e5ae.

* Revert "Show contents of target/ (for debugging)"

This reverts commit 947cb39988.

* Update comment with corrected description of work reuse

* Move prerequisite debug build step above uv sync step

* fix(ci): use picomatch extglob to exclude llmfit-python from rust filter

The previous config used a leading-! entry (`!llmfit-python/**`) to try
to exclude the Python directory from the rust filter. In dorny/paths-filter's
default 'some' mode, each entry is OR-ed: a leading ! is passed to picomatch
as a pattern that matches anything *not* in llmfit-python/, but the positive
`llmfit-*/**` entry already matched, so the negation had no effect and
rust-changed was always true for Python-only PRs.

Replace the two entries with a single picomatch extglob pattern
`llmfit-!(python)/**`. The !(python) extglob is evaluated against the
segment between `llmfit-` and the path separator, so llmfit-python/ never
matches while all other llmfit-* directories do.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(python): add rust_integration pytest mark for Rust-triggered CI runs

Marks test_binary_runs with @pytest.mark.rust_integration so it runs
in CI when only Rust code has changed, replacing the uv sync --no-dev
integration test step.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 08:47:42 +01:00
dependabot[bot]
055029d32d
chore(deps): bump docker/build-push-action from 7.0.0 to 7.1.0 (#469)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 7.0.0 to 7.1.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](d08e5c354a...bcafcacb16)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-23 14:33:31 +01:00
Alex Jones
0ae17de68b
Add SignPath code signing for Windows releases (#489)
* ci: add SignPath code signing for Windows builds

* ci: extract exe before signing to match SignPath PE artifact config

* ci: add SignPath Authenticode signing for Windows builds

- Add sign-windows job to release workflow
- Extract exe, submit to SignPath for signing, repackage into zip
- Release job proceeds even if signing is skipped
- Add SignPath signed badge and banner to README
2026-04-22 13:39:55 +01:00
Greg Kroah-Hartman
7be5edb344
fix(ci): pass crates.io token via env, not argv (#487)
Interpolating a secret into a shell command line:

  cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }}

leaves the token visible in /proc/<pid>/cmdline and `ps` output for the
lifetime of the process. GitHub Actions secret masking redacts log
output only — it cannot scrub the kernel's process table.

cargo reads the CARGO_REGISTRY_TOKEN environment variable automatically;
the cargo book explicitly recommends this over --token for exactly this
reason. GitHub-hosted runners are ephemeral, but defense-in-depth costs
nothing here.

Co-Authored-By: gregkh_clanker_t1000
2026-04-22 10:44:52 +01:00
Alex Jones
9a99e699af
fix: synchronize Cargo.lock and update release workflow to keep it in sync (#477)
Updates Cargo.lock to match current workspace versions (v0.9.11) so that
`cargo build --locked` works for downstream packagers (e.g. macports).

Adds a post-processing step to the release-please workflow that runs
`cargo update --workspace` on release PRs, ensuring future version bumps
also update the lock file.

Fixes #476

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 20:57:21 +01:00
dependabot[bot]
0555a19bfe
chore(deps): bump actions/upload-artifact from 7.0.0 to 7.0.1 (#470)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 7.0.0 to 7.0.1.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](bbbca2ddaa...043fb46d1a)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-20 12:46:18 +01:00
Alex Jones
f21677927b fix(ci): use RELEASE_TOKEN in release-please to trigger downstream workflows
GITHUB_TOKEN events don't trigger other workflows, so the Release
workflow never fired on release:published. Using a PAT fixes this.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 13:05:16 +01:00
dependabot[bot]
e12204b5fd
chore(deps): bump docker/login-action from 3.7.0 to 4.1.0 (#434)
Bumps [docker/login-action](https://github.com/docker/login-action) from 3.7.0 to 4.1.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](c94ce9fb46...4907a6ddec)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-13 06:28:00 +01:00
Alex Jones
df27ec2847
ci: trigger Release workflow on published releases (#425)
Switches the Release workflow trigger from `push: tags` to the GitHub
`release: published` event, and adds a `workflow_dispatch` input for
manual backfills of an existing tag.

release-please creates tags with GITHUB_TOKEN, which by design does not
trigger downstream workflows. That's why v0.9.4 shipped with only
release notes and no binary assets (#424), while v0.9.3 (tag pushed
manually) worked. Reacting to the `release` event published by
release-please fires the workflow reliably for future releases.

The workflow_dispatch path accepts an existing tag and routes it
through checkout, packaging, asset upload, and the Homebrew tap update
so v0.9.4 can be backfilled after this lands.

Fixes #424

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:56:00 +01:00
Alex Jones
727ab4524d ci: configure release-please for automated release management
Replaces manual tag-and-push workflow with release-please, which
auto-creates release PRs with version bumps and changelogs on merge
to main. Existing release.yml build pipeline is unchanged — it still
triggers on v* tags created by release-please.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 21:00:58 +01:00
dependabot[bot]
34b9e1e9e9
chore(deps): bump softprops/action-gh-release from 2.5.0 to 2.6.1
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.5.0 to 2.6.1.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](a06a81a03e...153bb8e044)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: 2.6.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 00:57:55 +00:00