sharpebench 0.18.0

SharpeBench command-line interface.
# Version rewrites for the npm surface, attached to this crate because cargo-release
# resolves `file` relative to the crate being processed, not to the workspace root.
# This crate publishes as `sharpebench`, the npm package's Rust counterpart, so the
# rules belong here; the shared release settings stay in the workspace release.toml.
#
# Without these the manifests keep the previous version across a bump, the publish step
# finds that version already on the registry, and skips - reporting success while
# shipping nothing. Cargo.toml is the only place a version is authored.

[[pre-release-replacements]]
file = "../../npm/package.json"
search = '"version": "[0-9]+\.[0-9]+\.[0-9]+"'
replace = '"version": "{{version}}"'
exactly = 1

# npm records the package version twice in its lockfile: once at the document
# root and once for the root package. Keep both identities on the release
# commit; `npm install` otherwise repairs them only later in a developer tree.
[[pre-release-replacements]]
file = "../../npm/package-lock.json"
search = '"name": "@general-liquidity/sharpebench",\n  "version": "[0-9]+\.[0-9]+\.[0-9]+"'
replace = "\"name\": \"@general-liquidity/sharpebench\",\n  \"version\": \"{{version}}\""
exactly = 1

[[pre-release-replacements]]
file = "../../npm/package-lock.json"
search = '"name": "@general-liquidity/sharpebench",\n      "version": "[0-9]+\.[0-9]+\.[0-9]+"'
replace = "\"name\": \"@general-liquidity/sharpebench\",\n      \"version\": \"{{version}}\""
exactly = 1

[[pre-release-replacements]]
file = "../../npm/mcp/package.json"
search = '"version": "[0-9]+\.[0-9]+\.[0-9]+"'
replace = '"version": "{{version}}"'
exactly = 1

# The MCP package depends on the main npm package, so its pin moves in lockstep.
[[pre-release-replacements]]
file = "../../npm/mcp/package.json"
search = '"@general-liquidity/sharpebench": "\^[0-9]+\.[0-9]+\.[0-9]+"'
replace = '"@general-liquidity/sharpebench": "^{{version}}"'
exactly = 1

# wasm-pack regenerates this on build, but keep the committed copy honest.
[[pre-release-replacements]]
file = "../../npm/pkg/package.json"
search = '"version": "[0-9]+\.[0-9]+\.[0-9]+"'
replace = '"version": "{{version}}"'
exactly = 1

# The PyPI surface. crates/sharpebench-py is a pyo3 extension-module, so it is
# `exclude`d from the workspace (it needs a Python interpreter at build time), which
# also means cargo-release never sees it as a member and neither `shared-version` nor
# `dependent-version` touches it. Both its manifests are rewritten here instead, for the
# same reason as the npm ones: a stale version would make the publish step find that
# version already on PyPI and "skip", reporting green while shipping nothing.
[[pre-release-replacements]]
file = "../sharpebench-py/pyproject.toml"
search = '(?m)^version = "[0-9]+\.[0-9]+\.[0-9]+"'
replace = 'version = "{{version}}"'
exactly = 1

[[pre-release-replacements]]
file = "../sharpebench-py/Cargo.toml"
search = '(?m)^version = "[0-9]+\.[0-9]+\.[0-9]+"'
replace = 'version = "{{version}}"'
exactly = 1

# Its three path deps carry explicit `version` pins (needed for the maturin sdist), and
# being outside the workspace they are not rewritten by `dependent-version = "upgrade"`.
[[pre-release-replacements]]
file = "../sharpebench-py/Cargo.toml"
search = 'sharpebench-stats = \{ path = "\.\./sharpebench-stats", version = "[0-9]+\.[0-9]+\.[0-9]+" \}'
replace = 'sharpebench-stats = { path = "../sharpebench-stats", version = "{{version}}" }'
exactly = 1

[[pre-release-replacements]]
file = "../sharpebench-py/Cargo.toml"
search = 'sharpebench-edge = \{ path = "\.\./sharpebench-edge", version = "[0-9]+\.[0-9]+\.[0-9]+" \}'
replace = 'sharpebench-edge = { path = "../sharpebench-edge", version = "{{version}}" }'
exactly = 1

[[pre-release-replacements]]
file = "../sharpebench-py/Cargo.toml"
search = 'sharpebench-core = \{ path = "\.\./sharpebench-core", version = "[0-9]+\.[0-9]+\.[0-9]+" \}'
replace = 'sharpebench-core = { path = "../sharpebench-core", version = "{{version}}" }'
exactly = 1

# The excluded pyo3 crate owns a separate Cargo.lock. Cargo-release updates its
# manifest and path-dependency requirements but never visits this lockfile, so
# record each local package identity explicitly in the same version commit.
[[pre-release-replacements]]
file = "../sharpebench-py/Cargo.lock"
search = 'name = "sharpebench-core"\nversion = "[0-9]+\.[0-9]+\.[0-9]+"'
replace = "name = \"sharpebench-core\"\nversion = \"{{version}}\""
exactly = 1

[[pre-release-replacements]]
file = "../sharpebench-py/Cargo.lock"
search = 'name = "sharpebench-edge"\nversion = "[0-9]+\.[0-9]+\.[0-9]+"'
replace = "name = \"sharpebench-edge\"\nversion = \"{{version}}\""
exactly = 1

[[pre-release-replacements]]
file = "../sharpebench-py/Cargo.lock"
search = 'name = "sharpebench-protocol"\nversion = "[0-9]+\.[0-9]+\.[0-9]+"'
replace = "name = \"sharpebench-protocol\"\nversion = \"{{version}}\""
exactly = 1

[[pre-release-replacements]]
file = "../sharpebench-py/Cargo.lock"
search = 'name = "sharpebench-py"\nversion = "[0-9]+\.[0-9]+\.[0-9]+"'
replace = "name = \"sharpebench-py\"\nversion = \"{{version}}\""
exactly = 1

[[pre-release-replacements]]
file = "../sharpebench-py/Cargo.lock"
search = 'name = "sharpebench-stats"\nversion = "[0-9]+\.[0-9]+\.[0-9]+"'
replace = "name = \"sharpebench-stats\"\nversion = \"{{version}}\""
exactly = 1