Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
93f9fab
chore(deps): Bump actions/checkout from 6.0.2 to 7.0.0
dependabot[bot] Jul 20, 2026
0399572
chore(deps): Bump release-plz/action from 0.5.130 to 0.5.131
dependabot[bot] Jul 20, 2026
c33bf5f
chore(deps): Bump github/codeql-action/upload-sarif
dependabot[bot] Jul 20, 2026
916e512
fix(deps): drop env_logger humantime feature to remove bitflags dup (…
unclesp1d3r Jul 20, 2026
b64afcc
Merge branch 'main' into dependabot/github_actions/actions/checkout-7…
mergify[bot] Jul 20, 2026
bf4bb67
Merge branch 'main' into dependabot/github_actions/release-plz/action…
mergify[bot] Jul 20, 2026
53eb3c7
Merge branch 'main' into dependabot/github_actions/github/codeql-acti…
mergify[bot] Jul 20, 2026
bf35130
chore: Enable security lints and clean up documentation formatting (#…
unclesp1d3r Jul 20, 2026
de1dc31
Merge branch 'main' into dependabot/github_actions/github/codeql-acti…
mergify[bot] Jul 20, 2026
8427f7f
Merge branch 'main' into dependabot/github_actions/actions/checkout-7…
mergify[bot] Jul 20, 2026
8293de9
Merge branch 'main' into dependabot/github_actions/release-plz/action…
mergify[bot] Jul 20, 2026
3a1e37b
fix(evaluator,parser): gracefully and correctly handle regex rules fr…
unclesp1d3r Jul 20, 2026
a9463fe
Merge branch 'main' into dependabot/github_actions/actions/checkout-7…
mergify[bot] Jul 20, 2026
178b9c3
Merge branch 'main' into dependabot/github_actions/release-plz/action…
mergify[bot] Jul 20, 2026
28e7257
Merge branch 'main' into dependabot/github_actions/github/codeql-acti…
mergify[bot] Jul 20, 2026
bd42df4
chore: release v0.11.0 (#394)
github-actions[bot] Jul 21, 2026
cb01c9c
Merge branch 'main' into dependabot/github_actions/actions/checkout-7…
mergify[bot] Jul 21, 2026
b8b853a
Merge branch 'main' into dependabot/github_actions/release-plz/action…
mergify[bot] Jul 21, 2026
25df051
Merge branch 'main' into dependabot/github_actions/github/codeql-acti…
mergify[bot] Jul 21, 2026
2b49294
ci: bump attest-build-provenance to v4.1.1 and use bounds-checked tes…
unclesp1d3r Jul 21, 2026
2f3500f
Merge branch 'main' into dependabot/github_actions/actions/checkout-7…
mergify[bot] Jul 21, 2026
2e9cedf
Merge branch 'main' into dependabot/github_actions/github/codeql-acti…
mergify[bot] Jul 21, 2026
3db9952
Merge of #387
mergify[bot] Jul 21, 2026
fc2a4a8
Merge of #390
mergify[bot] Jul 21, 2026
938f8ff
Merge of #388
mergify[bot] Jul 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 2 additions & 15 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,22 +1,9 @@
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/enforce-dco-signoff.sh"
}
]
}
]
},
"enabledPlugins": {
"rust-analyzer-lsp@claude-plugins-official": true,
"security-guidance@claude-plugins-official": true,
"rust-cli-developer@geoffjay-claude-plugins": true,
"systems-programming@claude-code-workflows": true,
"everything-claude-code@everything-claude-code": true
"ecc@ecc": true
}
}
}
8 changes: 8 additions & 0 deletions .claude/skills/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
**/*
!.gitignore
!api-design/
!tdd-workflow/
!security-review/
!strategic-compact/
!verification-loop/
!SKILL.md
4 changes: 0 additions & 4 deletions .codex/config.toml

This file was deleted.

18 changes: 18 additions & 0 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# cargo-nextest configuration.
#
# Serialize the integration test binaries that spawn child processes (the CLI
# under test, the system `file` binary) or manipulate the process working
# directory. Running these concurrently causes subprocess-spawn contention and
# cwd races -- most visibly the planted-magic CLI security regression tests,
# which resolve behavior from a temp cwd. Under heavy full-suite parallelism
# these produced rare, load-dependent flakes once additional process-spawning
# binaries (the `system_magic_dir` differential-parity suite that shells out to
# GNU `file`) were added. Pinning them to a single-threaded group makes the
# suite deterministic while leaving the ~1500 in-process unit tests fully
# parallel.
[test-groups]
serial-integration = { max-threads = 1 }

[[profile.default.overrides]]
filter = 'binary(compatibility_tests) or binary(cli_integration) or binary(json_integration_test) or binary(security_regression) or binary(system_magic_dir)'
test-group = 'serial-integration'
9 changes: 0 additions & 9 deletions .gemini/settings.json

This file was deleted.

23 changes: 18 additions & 5 deletions .github/workflows/benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ on:
# Allow manual triggering
workflow_dispatch:

# Cancel superseded runs on the same ref so rapid pushes don't pile up
# concurrent cold-cache `mise-action` installs racing on the shared cache
# (matches ci.yml / security.yml).
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
CARGO_TERM_COLOR: always

Expand All @@ -28,9 +35,12 @@ jobs:
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
# Only rust is needed (cargo bench); avoid the full mise tool
# set whose no-prebuilt cargo tools fail to install on runners.
install_args: rust
cache: true
github_token: ${{ secrets.GITHUB_TOKEN }}

Expand All @@ -47,7 +57,7 @@ jobs:
${{ runner.os }}-cargo-

- name: Run benchmarks
run: cargo bench --bench parser_bench --bench evaluation_bench --bench io_bench
run: mise x -- cargo bench --bench parser_bench --bench evaluation_bench --bench io_bench

- name: Upload benchmark results
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
Expand All @@ -68,9 +78,12 @@ jobs:
with:
fetch-depth: 0

- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
# Only rust is needed (cargo bench); avoid the full mise tool
# set whose no-prebuilt cargo tools fail to install on runners.
install_args: rust
cache: true
github_token: ${{ secrets.GITHUB_TOKEN }}

Expand All @@ -93,7 +106,7 @@ jobs:

- name: Run benchmarks on PR branch
run: |
cargo bench --bench parser_bench --bench evaluation_bench --bench io_bench -- --save-baseline pr
mise x -- cargo bench --bench parser_bench --bench evaluation_bench --bench io_bench -- --save-baseline pr

- name: Checkout main branch
run: git checkout origin/main
Expand All @@ -102,7 +115,7 @@ jobs:
continue-on-error: true
id: main-bench
run: |
cargo bench --bench parser_bench --bench evaluation_bench --bench io_bench -- --save-baseline main
mise x -- cargo bench --bench parser_bench --bench evaluation_bench --bench io_bench -- --save-baseline main

- name: Compare benchmarks
if: steps.main-bench.outcome == 'success'
Expand Down
58 changes: 44 additions & 14 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,34 +29,50 @@ jobs:
timeout-minutes: 10
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
# Install only the tools this job uses. Installing the full
# mise tool set pulls in no-prebuilt cargo tools (cargo-audit,
# mdbook-*) whose cargo-install fallback fails on hosted
# runners; the audit/docs workflows install those where needed.
install_args: rust just
cache: true
github_token: ${{ secrets.GITHUB_TOKEN }}

- name: Ensure rustfmt and clippy are installed
run: rustup component add rustfmt clippy

# rustfmt + clippy are installed by mise's rust component set
# (`components = "...,rustfmt,clippy"`). A second `rustup component
# add` here re-added them and collided with mise's install on the
# hosted runner (`detected conflict` / `Directory not empty`), so it
# is intentionally removed.
- name: Check formatting
run: just lint-rust

test:
runs-on: ubuntu-latest
# Gate on `quality` so it populates the shared mise/toolchain cache
# FIRST. Without this, `quality` and `test` start together and both run
# a cold-cache `mise-action` install concurrently, racing on the same
# cache key (`detected conflict` / `Directory not empty`). Serializing
# them means `quality` writes the cache and every downstream job
# (`test`, and transitively `coverage` / `test-cross-platform`) restores
# the warm cache instead of racing to populate it.
needs: quality
timeout-minutes: 20
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
install_args: rust cargo:cargo-nextest
cache: true
github_token: ${{ secrets.GITHUB_TOKEN }}

- name: Run tests (all features)
run: cargo nextest run --all-features
run: mise x -- cargo nextest run --all-features

- name: Build release
run: cargo build --release --all-features
run: mise x -- cargo build --release --all-features

test-cross-platform:
strategy:
Expand All @@ -74,39 +90,53 @@ jobs:
runs-on: ${{ matrix.os }}
needs: test
timeout-minutes: 20
# `mise.toml` sets `exec_auto_install = true`, so `mise x` would
# otherwise auto-install the ENTIRE tool set before running. Several
# `cargo:` dev tools (cargo-audit, mdbook-*, git-cliff, ...) have no
# prebuilt binary on macOS/Windows and mise's cargo-install fallback
# is disabled, so that auto-install fatally fails on those runners
# (it only ever "passed" on ubuntu because every tool has a prebuilt,
# and this job never ran before -- it is gated on `test`, which was
# red until now). Disable exec-time auto-install so `mise x` uses only
# the scoped `install_args` tools (rust + cargo-nextest), which is all
# these steps need.
env:
MISE_EXEC_AUTO_INSTALL: "false"
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
install_args: rust cargo:cargo-nextest
cache: true
github_token: ${{ secrets.GITHUB_TOKEN }}

- run: cargo nextest run --all-features
- run: cargo build --release --all-features
- run: mise x -- cargo nextest run --all-features
- run: mise x -- cargo build --release --all-features

coverage:
runs-on: ubuntu-latest
needs: test
timeout-minutes: 20
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
install_args: rust cargo:cargo-nextest cargo:cargo-llvm-cov
cache: true
github_token: ${{ secrets.GITHUB_TOKEN }}

- name: Generate coverage
# Use --test-threads=1 to prevent race conditions in stdin-mocking tests
# that manipulate file descriptors (dup/dup2) which aren't thread-safe
run: cargo llvm-cov --all-features --no-report -- --test-threads=1
run: mise x -- cargo llvm-cov --all-features --no-report -- --test-threads=1

- name: Combine coverage reports
run: cargo llvm-cov report --lcov --output-path lcov.info
run: mise x -- cargo llvm-cov report --lcov --output-path lcov.info

- name: Enforce 85% coverage threshold
run: cargo llvm-cov report --fail-under-lines 85
run: mise x -- cargo llvm-cov report --fail-under-lines 85

- name: Upload to Codecov
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
Expand Down
23 changes: 19 additions & 4 deletions .github/workflows/compatibility.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,26 @@ on:
- cron: "0 2 * * *"
workflow_dispatch:

# Cancel superseded runs on the same ref so rapid pushes don't pile up
# concurrent cold-cache `mise-action` installs racing on the shared cache
# (matches ci.yml / security.yml).
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
CARGO_TERM_COLOR: always

jobs:
compatibility-tests:
name: Compatibility Tests (${{ matrix.os }})
runs-on: ${{ matrix.os }}
timeout-minutes: 20
# 30m (matching benchmarks.yml) because the `cargo build --release`
# step on the windows-latest runner alone routinely approaches 20m on a
# cold dependency cache; the compatibility test itself runs in <1s. The
# fast Linux/macOS legs finish in ~10m, so the higher ceiling only ever
# affects the slow Windows leg. See PR #376.
timeout-minutes: 30

strategy:
fail-fast: false
Expand All @@ -27,20 +39,23 @@ jobs:
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
# Only rust + just are needed here; avoid the full mise tool
# set whose no-prebuilt cargo tools fail to install on runners.
install_args: rust just
cache: true
github_token: ${{ secrets.GITHUB_TOKEN }}

- name: Verify compatibility test files are available
run: just verify-compatibility-tests

- name: Build rmagic
run: cargo build --release
run: mise x -- cargo build --release

- name: Run compatibility tests
run: cargo test test_compatibility_with_original_libmagic -- --ignored --nocapture
run: mise x -- cargo test test_compatibility_with_original_libmagic -- --ignored --nocapture

- name: Upload test results on failure
if: failure()
Expand Down
9 changes: 8 additions & 1 deletion .github/workflows/copilot-setup-steps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@ on:
paths:
- .github/workflows/copilot-setup-steps.yml

# Cancel superseded runs on the same ref so rapid pushes don't pile up
# concurrent cold-cache `mise-action` installs racing on the shared cache
# (matches ci.yml / security.yml).
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
copilot-setup-steps:
runs-on: ubuntu-latest
Expand All @@ -19,7 +26,7 @@ jobs:

steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
cache: true
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
timeout-minutes: 10
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
cache: true
Expand All @@ -41,16 +41,16 @@ jobs:
use-toc: true
use-admonish: true
- name: Install mdbook plugins
run: cargo binstall mdbook-tabs mdbook-i18n-helpers mdbook-alerts mdbook-yml-header mdbook-image-size --no-confirm
run: mise x -- cargo binstall mdbook-tabs mdbook-i18n-helpers mdbook-alerts mdbook-yml-header mdbook-image-size --no-confirm

- name: Build mdBook
run: |
cd docs
mdbook build
mise x -- mdbook build

- name: Build rustdoc and copy into book
run: |
cargo doc --no-deps --document-private-items --target-dir target
mise x -- cargo doc --no-deps --document-private-items --target-dir target
mkdir -p docs/book/api
cp -r target/doc/* docs/book/api/

Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release-plz.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ jobs:
fetch-depth: 0
# persist-credentials required for pushing signed tags via git CLI
persist-credentials: true
- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
- name: Run release-plz
uses: release-plz/action@e8792575c7f2366cf6ff3ccc33ead9ace5b691c7 # v0.5.130
uses: release-plz/action@2eb1d8bcb770b4c48ccfaad919734b38b51958c9 # v0.5.131
with:
command: release
env:
Expand All @@ -45,11 +45,11 @@ jobs:
with:
fetch-depth: 0
persist-credentials: false
- uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1
- uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1
with:
install: true
- name: Run release-plz
uses: release-plz/action@e8792575c7f2366cf6ff3ccc33ead9ace5b691c7 # v0.5.130
uses: release-plz/action@2eb1d8bcb770b4c48ccfaad919734b38b51958c9 # v0.5.131
with:
command: release-pr
env:
Expand Down
Loading
Loading