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
feat(vault): M4 write-path increment (remove + generate) + first green CI
## M4 write-path increment
- `vault generate` — pure-local password generator (`vault-core::generate`):
`GenerateOptions` (length + per-class toggles) → `Zeroizing<String>`, OS
`getrandom` with 64-bit rejection sampling (no modulo bias), one-per-enabled-
class seed then Fisher–Yates shuffle. CLI: `vault generate [--length N]
[--symbols] [--no-lowercase] [--no-uppercase] [--no-digits] [--json]`.
- `vault remove` — soft-delete via `DELETE /api/ciphers/{id}`, dropped from the
in-memory cache. Selector matches `Cipher.id` exactly first, else a
case-insensitive decrypted-name match; multiple name matches refuse with
`IpcError::AmbiguousItem { name, ids }` (CLI exit 10). Non-TTY stdin requires
`--force`. New `Response::Removed { id, name }`; `vault-agent::Vault` now owns
the authenticated `BitwardenClient` (retiring the dead `access_token` field).
(add / edit remain pending for the rest of M4.)
## First green CI (M0–M3 had been red on every push)
Four jobs were failing independently of behaviour; all four now pass locally
against `cargo {fmt,clippy -D warnings,test} --workspace`, `cargo deny`, and the
`--version` gate:
- clippy: resolved workspace-wide pedantic + nursery + restriction debt that had
never been seen (clippy never completed locally). `# Errors`/`# Panics` docs,
`const fn`, `#[must_use]`, let-chains, `map_or`/`sort_by_key`, derived
`Default`, `Send`/`Sync` bounds on the transport generics, and justified
`#[allow]`s on the infallible HMAC/RNG `expect`s and the civil-calendar casts.
- `vault --version`: now emits the §13.2 block via `long_version` (clap's
`after_help` only shows on `--help`). Mirrored in `vault-agent`.
- rustfmt: `cargo fmt --all`.
Policy decisions (called out, not slipped in):
- deny.toml: allow `CDLA-Permissive-2.0` — webpki-roots ≥ 1.0 ships Mozilla's CA
bundle under it; a permissive *data* licence, GPL-compatible, no copyleft on
the linking program.
- The eight `vault-*` crates are `publish = false` (internal app crates, never
released to crates.io) + `allow-wildcard-paths = true`, so intra-workspace
`path` deps stop tripping the wildcard ban.
- clippy.toml: `unwrap`/`expect`/`panic` permitted in tests only.
Note: `.cargo/config.toml` (local Arch `-flto=auto` workaround) is deliberately
left untracked — its `force`d CFLAGS would break the macOS CI runner.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
0 commit comments