You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
chore(release): anvil-ssh 1.0.0 — first stable release (#31)
First stable release. No API change from 0.9.0; this release is a
stabilization signal under SemVer.
CHANGELOG declares the public API stable: patch bumps add no
symbols, minor bumps add only, major bumps coordinate with
downstream consumers (primarily Steelbore/Gitway).
The legacy GitwaySession / GitwayConfig / GitwayError #[deprecated]
aliases stay through the entire 1.x line. This is a deliberate
softening of the original AGENTS.md roadmap (which had proposed
removing them at 1.0): the corresponding gitway-lib shim re-exports
anvil_ssh::* glob-style and is preserved through Gitway 1.x per
Gitway's docs/migration-from-v0.9.md; removing the upstream aliases
now would silently break that shim. Removal is scheduled for 2.0.
README rewritten for v1.0:
- Updated Status block (1.0.0 stable, MSRV 1.88)
- Updated Use block (anvil-ssh = "1.0", deprecation timeline)
- New v1.0 feature matrix
- "What this is NOT" section clarifying scope
- Refreshed module table with M11.5-M19 modules (cert_authority,
ssh_config, proxy, algorithms, retry, log)
- Security section linking to Gitway's threat model + the
RUSTSEC-2023-0071 residual-risk note
AGENTS.md type-rename roadmap revised to defer Gitway* alias
removal to 2.0; SemVer commitment block added.
Local verification:
- cargo build --release: 2m21s, clean
- cargo clippy --all-targets -- -D warnings: clean (47s)
- cargo fmt --check: clean
- cargo test: 292 passed, 0 failed, 7 ignored (require
GITWAY_INTEGRATION_TESTS=1)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
-`v0.1.x` — types carried over from the source crate as `GitwaySession` / `GitwayConfig` / `GitwayError` to keep the lift-and-shift extraction zero-rename. Downstream churn limited to crate-name change.
54
-
-`v0.2.0` (current) — types renamed to `AnvilSession` / `AnvilConfig` / `AnvilError`. Legacy `Gitway*` names retained as `#[deprecated]` re-exports for one major version.
-`v0.1.x` — types carried over from the source crate as `GitwaySession` / `GitwayConfig` / `GitwayError` to keep the lift-and-shift extraction zero-rename.
54
+
-`v0.2.0` — types renamed to `AnvilSession` / `AnvilConfig` / `AnvilError`. Legacy `Gitway*` names retained as `#[deprecated]` re-exports.
55
+
-`v1.0.0` (current) — stabilization, cut concurrently with Gitway 1.0.0. Deprecated `Gitway*` aliases **kept** through the 1.x line. This is a deliberate softening of the original roadmap (which had proposed removing them at 1.0): the corresponding `gitway-lib` shim re-exports `anvil_ssh::*` glob-style and is preserved through Gitway 1.x per Gitway's `docs/migration-from-v0.9.md`. Removing the upstream aliases at 1.0 would silently break that shim.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+80Lines changed: 80 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,86 @@
2
2
3
3
All notable changes to Anvil are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow [SemVer](https://semver.org/).
4
4
5
+
## [1.0.0] — TBD
6
+
7
+
The first stable release of `anvil-ssh`. This release declares the
8
+
public API **stable under SemVer**: every `pub` symbol that's
9
+
exposed today is supported through the 1.x line.
10
+
11
+
### Public API stability commitment
12
+
13
+
From 1.0 onward:
14
+
15
+
-**Patch bumps** (`1.0.x`) are bug fixes only — no API additions.
16
+
-**Minor bumps** (`1.x.0`) may add new public symbols; existing
17
+
ones never change shape or behavior.
18
+
-**Major bumps** (`x.0.0`) are reserved for breaking changes and
19
+
are coordinated with downstream consumers — primarily
Copy file name to clipboardExpand all lines: README.md
+63-7Lines changed: 63 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,13 +6,17 @@ Anvil is the foundation library extracted from [Steelbore/Gitway](https://github
6
6
7
7
## Status
8
8
9
-
`v0.1.0` — initial cold-start extraction from Steelbore/Gitway @ `28abee6`. Pre-1.0; the public type names will rename in `0.2.0` (see [CHANGELOG](CHANGELOG.md)). Full v1.0 scope and roadmap live in the [Gitway PRD](https://github.com/steelbore/gitway/blob/main/Gitway-PRD-v1.0.md).
9
+
**`v1.0.0`** — first stable release. Public API frozen under SemVer
10
+
through the 1.x line. Full release notes in [CHANGELOG.md](CHANGELOG.md);
11
+
roadmap context in the [Gitway PRD](https://github.com/Steelbore/Gitway/blob/main/Gitway-PRD-v1.0.md).
The flat re-exports `AnvilSession` / `AnvilConfig` / `AnvilError` were renamed in `0.2.0` from the legacy `GitwaySession` / `GitwayConfig` / `GitwayError` (which were carried over from the source crate to keep the 0.1.0 extraction zero-rename). The legacy names remain available as `#[deprecated]` re-exports for one major version per [Gitway PRD §7.4](https://github.com/steelbore/gitway/blob/main/Gitway-PRD-v1.0.md); they will be removed in `1.0.0`. Migration is mechanical — `s/Gitway/Anvil/g` in your `use anvil_ssh::*;` imports.
36
+
The flat re-exports `AnvilSession` / `AnvilConfig` / `AnvilError`
37
+
were renamed in `0.2.0` from the legacy `GitwaySession` /
38
+
`GitwayConfig` / `GitwayError`. The legacy names remain available
39
+
as `#[deprecated]` re-exports through the entire 1.x line; removal
40
+
is scheduled for 2.0.0. Migration is mechanical — `s/Gitway/Anvil/g`
|**Proxies**|`ProxyCommand` token expansion (`%h %p %r %n %%`); `ProxyJump` chains up to 8 hops; independent host-key verification at every hop | Per-hop retry semantics (single-attempt fallback for proxy paths) |
50
+
|**`@cert-authority` host CA**| Parsing, surfacing in audit logs, `@revoked` blocklist with policy-overriding semantics | Live cert validation during KEX (FR-61/62/63 — blocked on russh upstream; will land in 1.x) |
51
+
|**Connection retry**| Exponential backoff with jitter, fatal-vs-transient classifier, per-attempt timeout, max-retry-window, retry history accessor | HTTP 429/503 (no HTTP layer in transport path) |
|**`known_hosts`**| Parse and write hashed (`HashKnownHosts yes`) entries via HMAC-SHA1; `@cert-authority`, direct, and `@revoked` lines; embedded fingerprint catalogue | None for v1.0 |
54
+
|**Keys**| Ed25519 / ECDSA-P256/P384/P521 / RSA generation in OpenSSH format; passphrase encryption + change | FIDO2 / `sk-ssh-*` hardware-backed keys (deferred to 1.x; see Gitway PRD §5.8.5 / M16) |
55
+
|**Signing**| SSHSIG produce / verify / `find-principals` / `check-novalidate`; `allowed_signers` file parser | None for v1.0 |
56
+
|**Agent**| Cross-platform client (Unix domain socket on Unix; named pipe on Windows interoperable with `\\.\pipe\openssh-ssh-agent`); async daemon (Unix `setsid(2)` + Windows foreground modes) | Background-mode `gitway agent start` without `-D` is Unix-only; Windows requires foreground (`-D` plus a launcher) |
57
+
|**Tracing**| Per-category targets (`CAT_KEX`, `CAT_AUTH`, `CAT_CHANNEL`, `CAT_CONFIG`, `CAT_RETRY`); `tracing_log` bridge for legacy `log::*!` callers; structured events at every host-key check, auth attempt, applied directive, and ProxyJump hop | None for v1.0 |
58
+
59
+
## What this is NOT
60
+
61
+
-**Not a general-purpose SSH library.** Anvil targets the SSH
62
+
surface that Git needs — exec channels, key management, signing,
63
+
agent. No PTY, no SFTP, no port forwarding, no SCP.
64
+
-**Not a TLS or HTTP toolkit.** SSH only.
65
+
-**Not a runtime.** Anvil exposes async APIs but doesn't install
66
+
a tracing subscriber or pick an executor for you. Consumers
67
+
(typically [Gitway](https://github.com/Steelbore/Gitway)) own the
68
+
runtime/subscriber policy.
69
+
-**Not a TOFU implementation.** The known-host fingerprints for
70
+
GitHub, GitLab, and Codeberg are pinned at build time. Adding
71
+
a new provider is a code change, reviewed and shipped in a
|`time`| ISO 8601 timestamp helpers (no `chrono` / `time` crate dep) |
50
98
@@ -68,6 +116,14 @@ cargo fmt --check
68
116
69
117
`perl` is required by `aws-lc-rs` for assembly pre-processing on every platform; `nasm` is also required on Windows MSVC.
70
118
119
+
## Security
120
+
121
+
See [Gitway's `docs/security.md`](https://github.com/Steelbore/Gitway/blob/main/docs/security.md) for the full threat model. TL;DR: Anvil defends against active network attackers (pinned fingerprints, algorithm denylist, `@revoked` enforcement) and memory-safety classes (`#![forbid(unsafe_code)]` everywhere). One known residual risk is documented:
122
+
123
+
-**RUSTSEC-2023-0071** — Marvin Attack on the `rsa` crate. No upstream patch yet; we use `rsa` only for local keygen + SSHSIG signing (transport crypto is `aws-lc-rs`, constant-time). The default key type is Ed25519, which is unaffected.
0 commit comments