onevcs 0.2.6

Version control and remote-host abstraction for agent workflows: host-neutral change requests, sessions, and a rules system.
Documentation
[package]
name = "onevcs"
# The one version source in this repository. release-plz maintains it; maturin
# reads it through `dynamic = ["version"]` and scripts/npm-build.mjs parses it out
# of this file. Never write a version anywhere else.
version = "0.2.6"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
homepage.workspace = true
description = "Version control and remote-host abstraction for agent workflows: host-neutral change requests, sessions, and a rules system."
readme = "README.md"
keywords = ["cli", "git", "github", "vcs", "agent"]
categories = ["command-line-utilities", "development-tools"]
# What a consumer receives: the sources, the manifest, and the crate's readme.
# release-plz decides this package changed by diffing its **packaged files**
# against the last release, so a change to the suite or the workspace docs
# deliberately does not cut a release on its own.
include = ["src/**/*.rs", "Cargo.toml", "README.md"]

[lib]
name = "onevcs"
path = "src/lib.rs"

[[bin]]
name = "onevcs"
path = "src/main.rs"

[dependencies]
clap = { workspace = true }
fs4 = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
serde_yaml_ng = { workspace = true }
sha2 = { workspace = true }
thiserror = { workspace = true }
time = { workspace = true }
url = { workspace = true }

# The bound on a git command terminates its whole process group, so a wedged hook
# cannot outlive the push it was gating. There is no portable spelling for that.
[target.'cfg(unix)'.dependencies]
libc = { workspace = true }

[target.'cfg(windows)'.dependencies]
dunce = { workspace = true }
windows-sys = { version = "0.61.2", features = [
    "Win32_Foundation",
    "Win32_System_Threading",
] }

# A journey that supplies implementations runs in-process, because the binary
# deliberately has no way to select a backend — so there is no subprocess whose
# stderr could be captured, and asserting what a user is told means redirecting
# this process's own descriptor.
[target.'cfg(unix)'.dev-dependencies]
libc = { workspace = true }

[dev-dependencies]
assert_cmd = { workspace = true }
# The parser the honesty journey drives `run_with` with, which is the same one the
# binary uses.
clap = { workspace = true }
# The occupancy journeys take a session's advisory lease the way a second process
# does — the same lock, from outside the binary, rather than a stand-in for one.
fs4 = { workspace = true }
predicates = { workspace = true }
# The journeys read the binary's own NDJSON stream back, which is the surface a
# consumer meets rather than an internal the suite could reach around.
serde_json = { workspace = true }
# The test implementations of this crate's own two interfaces, so one publication
# journey can run against them and against Git + GitHub and the two streams be held
# to each other. A dev-dependency cycle, which Cargo allows and `cargo publish`
# strips: nothing in the packaged crate depends on it.
onevcs-testing = { path = "../onevcs-testing" }
# The release workflow, parsed as the YAML Actions reads rather than grepped, so
# the paths a release archive names are the ones the suite checks exist.
serde_yaml_ng = { workspace = true }
tempfile = { workspace = true }

# The end-to-end journeys: they spawn the compiled binary as a subprocess, so they
# are their own target (`just test-e2e` runs it alone) while `just check` still
# runs them with everything else.
[[test]]
name = "e2e"
path = "tests/e2e/main.rs"

# The real-backend tier: real git against a real remote and the real GitHub API.
# Its own binary so `just test` and `just gate` can exclude it by name — an
# ordinary gate stays offline and credential-free — while `just smoke-real` runs
# it. Excluded by name rather than by `#[ignore]`, so no journey here is ever a
# skipped test.
[[test]]
name = "smoke"
path = "tests/smoke/main.rs"