Repository navigation
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #91 +/- ##
==========================================
+ Coverage 35.30% 35.36% +0.05%
==========================================
Files 121 121
Lines 41773 41773
Branches 49 49
==========================================
+ Hits 14748 14771 +23
+ Misses 27016 26993 -23
Partials 9 9
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
ifiokjr
force-pushed
the
monochange/release/release
branch
2 times, most recently
from
October 19, 2026 21:55
a3ea787 to
febf869
Compare
monochange
Bot
force-pushed
the
monochange/release/release
branch
8 times, most recently
from
October 25, 2026 22:46
08e9e62 to
6cda192
Compare
Prepare release. - release targets: monosecret (0.5.0) - released packages: @monosecret/cli, @monosecret/cli-darwin-arm64, @monosecret/cli-darwin-x64, @monosecret/cli-linux-arm64-gnu, @monosecret/cli-linux-arm64-musl, @monosecret/cli-linux-x64-gnu, @monosecret/cli-linux-x64-musl, @monosecret/cli-win32-arm64-msvc, @monosecret/cli-win32-x64-msvc, @monosecret/client, @monosecret/client-darwin-arm64, @monosecret/client-linux-arm64-gnu, @monosecret/client-linux-x64-gnu, @monosecret/client-win32-x64-msvc, @monosecret/skill, monosecret, monosecret_builder, monosecret_derive, monosecret_ffi, monosecret_rpc - updated changelogs: CHANGELOG.md, crates/monosecret/CHANGELOG.md, crates/monosecret_derive/CHANGELOG.md, dart/monosecret/CHANGELOG.md, dart/monosecret_builder/CHANGELOG.md - deleted changesets: .changeset/1790278083-monosecret.md, .changeset/ejson-timeout-tests.md, .changeset/passbolt-fake-cli-etxtbsy.md, .changeset/provider-depends-on-cycle.md, .changeset/readme-provider-count.md, .changeset/secret-hardening-clippy-cleanup.md, .changeset/security-audit-round-2.md, .changeset/sync-upstream-0-21-1.md
monochange
Bot
force-pushed
the
monochange/release/release
branch
from
October 27, 2026 17:26
6cda192 to
9399d76
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Prepared release
releasemonosecret->v0.5.0Release notes
monosecret 0.5.0
Grouped release for
monosecret.Breaking
Sync upstream SecretSpec 0.21: resolver IPC, binary secrets
Owner: @ifiokjr · Review: PR #73
Merge
cachix/secretspecfrom5ea68378(the recorded 0.21-era merge base) through upstreammain@b3a29191(post-0.21 fixes), rebranded into thecrates/monosecret,crates/monosecret_derive,crates/monosecret_ffi, and per-languagemonosecret_*SDK layout.What breaks
Secrets::setnow takesSecretBytes; text callers useset_textand deletions useprompt_and_set. Custom providers updateget/set/get_manytoSecretBytes;Provider::namereturns&strandgenerator::generatereturns bytes.monosecret getno longer appends a newline when writing to a pipe or file; terminal output still ends in a newline. Pipedmonosecret setinput remains trimmed text; use--from-file -to preserve exact bytes from stdin.-lyyjson.New providers
doppler://PROJECT[/CONFIG]): read, write, delete, and discover with profile-selected configs andDOPPLER_TOKENauth.setec://): read, write, delete, and discover through a tailnet-authenticated server, with binary values and version-pinned reads.New features
monosecret serveresolver IPC: request single declared secrets from another process over a versioned stdio protocol, with leases, prompts, store/delete, expiry/revision metadata, and--read-onlymode. Rust clients use the newmonosecret-ipccrate (async and blocking, including SSH transports); C clients uselibmonosecret-resolver.[defaults].providerschains, editor JSON Schemas (monosecret schema --config project|global), OpenPGP/OpenSSH key generation, Bitwarden UUID targeting, and JVM inline specs.Fixes
Features
Sync upstream 0.21.1 and post-release work
Packages: 🟠 rust:monosecret, 🟢 rust:monosecret_rpc
Owner: @ifiokjr · Review: PR #100
Ports the upstream range accumulated since the 0.4.0 sync, keeping every
fork-specific fix and provider. The headline additions:
passphrases and BIP-39 mnemonics, WireGuard and JWK private keys, age
identities, and self-signed
x509_identityPKCS#12 archives — plus typedconversion targets (
pkcs12,pkcs8_private_key,x509_certificate,x509_certificate_chain,x509_issuer_chain) withfrom/format/credentialsdeclarations decoded through the newtypedmodule.retry policy across HTTP, SDK, CLI, and external transports; unknown errors
stay permanent and writes opt in only with a replay-safety guarantee.
Per-provider hand-rolled retry (Doppler's rate-limit handling) folds into
the shared policy.
response/result members, bounds JSON integers to the 2^53-1 safe range in
both directions, and the C resolver mirrors both rules for portable peers.
monosecret import --profileselects the profileboth sides of an import resolve against.
a warning instead of silently dropping them.
monosecret::providers()exposes built-inprovider metadata, including feature-gated entries with their enabling
feature.
Also ports
monosecret init's schema directive on generated manifests,safer
block_onfor current-thread runtimes,ResolvedSecretDebug redaction(already independently hardened in the fork, whose stronger path redaction is
kept), the fake-provider-CLI test harness that avoids ETXTBSY on Linux, and
removal of the dead root test crate.
Beyond the 50ff51e cutoff, the sync also lands the follow-up upstream
fixes:
monosecret checkno longer persists decryptedas_pathtempfiles it never prints (they now drop with the command — verified by
regression tests pinning
get/exportpersistence), keepass moves to0.13.21 to fix KDBX DeletionTime serialization, and Proton Pass refs
gain read-only
fieldselection (values never travel through pass-cliarguments, which would expose them in the process list).
Dependency advisories found by
cargo auditare addressed where a fixedrelease exists: rustls 0.23.46 (secret-exposing Debug impls, KEX
downgrade), rustls-webpki 0.103.16 (distrusted-intermediate acceptance),
and webpki-root-certs 1.0.11 (emSign distrust). The legacy rustls 0.21
chain pinned under the AWS SDK stack and the unfixed
rsaMarvinadvisory remain and are tracked as accepted risk.
Fixes
ejson timeout tests no longer fail on a loaded machine
Packages: 🟢 rust:monosecret
Owner: @ifiokjr · Review: PR #76
The two tests that prove a hung or exited
ejsonCLI is stopped at its timeoutread the stub's descendant-PID file with
unwrap, and a loaded runner couldkill the process group before the shell wrote it — so the suite failed with "No
such file or directory" on a machine that was busy with something else. They now
wait for the file with a bounded retry, which keeps the assertion (the stub must
record its descendant, and the descendant must be gone) while removing the race,
and the exit-path test's timeout is generous because what it checks is the cost
relative to the deadline rather than how fast the stub runs.
No runtime behavior changes: the provider's timeout handling is untouched.
depends_oncycles no longer overflow the stackPackages: 🟢 rust:monosecret
Owner: @ifiokjr · Review: PR #71 · Closed issues: #70
Forcing a provider that declares
depends_on(e.g.monosecret run --provider op) applied the session-wide override to the bootstrap secret too,so building the provider needed the provider: unbounded recursion ending in
thread 'main' has overflowed its stackwith no error to report or retryagainst. The same abort happened for genuine configuration cycles (a
depends_onsecret routed back at its own provider directly or throughprofile defaults).
Bootstrap secrets now resolve from their own declared routes — the
--providerflag, the builder override, andMONOSECRET_PROVIDERare ignoredwhile they resolve — so
--provider opreadsOP_SERVICE_ACCOUNT_TOKENfromwhere it is configured and then queries 1Password. Re-entrant construction is
tracked per thread and fails with a
provider dependency cycle: store -> TOKEN -> storeerror naming the chain, and config loading rejects the directform up front (
monosecret checkreports it before anything runs). Sixregression tests cover the flag, the environment variable, both config-cycle
spellings, and static validation.
Harden secret handling and clear workspace clippy warnings
Packages: 🟢 rust:monosecret, 🟢 rust:monosecret_rpc
Owner: @ifiokjr · Review: PR #81
Env files and dotenv stores are written owner-only (0600) through staged,
fsynced, atomically renamed temporaries, and symlinked store paths are refused
rather than written through. HTTP redirect refusal moves into the shared
provider client builder, closing the gap for the Railway, Pulumi ESC, Vercel,
and Netlify providers that had none, and the redundant per-provider policies
are dropped.
Debugrenderings of resolved secrets no longer printvalueorpathfor any payload type, and GitHub::add-mask::commands arepercent-encoded and split one per line so multi-line values cannot leak into
job logs. The keyring username lookup is cached per process. The conformance
runner is clippy-clean (indexing/slicing, pass-by-value, unnecessary wraps),
its package renamed to kebab-case
monosecret-rpc-conformanceto silence thecargo manifest warning, and
cargo clippyandcargo checknow emit zerowarnings across the workspace.
Security hardening from the deep audit
Packages: 🟢 rust:monosecret
Owner: @ifiokjr · Review: PR #101
Fixes every actionable finding from a second, line-by-line security audit
of the provider layer, secret lifecycle, CLI surface, C resolver, and
packaging:
monosecret setagainstbws://is now opt-in behindMONOSECRET_BWS_ALLOW_ARGV_VALUES=1. The bws CLI only accepts a secretvalue as a command-line argument, which exposes it in the process list;
the same reasoning already made Proton Pass field refs read-only.
monosecret envnow refuses non-UTF-8 secretswith the
as_pathguidance instead of silently emitting lossyreplacement characters that differ from what
runinjects; non-ASCIIsecret names are rejected at emission (bash cannot source them);
env --outputrefuses symlinked paths, tightens a pre-existing loosefile to 0600, and
monosecret initrefuses a symlinkedmonosecret.toml.dependency's error Display prints the raw offending line, which in age's
case is decrypted plaintext. dotenv and age stores refuse symlinked
paths on read as well as write, and the age store writes atomically
(staged 0600 + fsync + rename) instead of a world-readable in-place
truncate.
O_NOFOLLOW, closing thecheck-then-read window where a racing writer could swap an entry for a
symlink.
tls=falseis refused for non-loopback hosts — therequest token would cross the network in cleartext.
generate.length/generate.bytesare bounded(1..=4096) so a fat-fingered length errors instead of aborting the
process on an uncatchable allocation failure; case-folded duplicate
secret names are rejected because the Windows environment collapses
them nondeterministically;
init --from dotenv://skips keys that arenot valid secret names instead of writing a manifest that fails its own
validation.
Setec payloads) print
[REDACTED]in Debug; the shell export buffer iszeroized;
ValidationErrorsDebug no longer carries default values;the docker credential helper writes diagnostics to stderr per the
helper protocol;
monosecret run's env is unchanged.unterminated allocation let error strings overread adjacent heap);
ss_set_errorkeeps truncated messages instead of dropping them; theserver-advertised methods array is capped so the pairwise duplicate
check cannot be driven quadratically by a hostile endpoint; prompt
answers reject embedded NUL like every other string field; the header
now documents that frees must be serialized with in-flight calls on the
same client.
instead of installing the library unverified.
getrandomfeature is restored so temp-file namesreseed from OS entropy in minimal/FFI builds.
Documentation
Keep the README's provider count pinned to the registry
Packages: ⚪ rust:monosecret
Owner: @ifiokjr · Review: PR #103
The README claimed eleven storage backends while the provider registry
ships forty-one, and the repository layout omitted the eight non-Rust
language SDKs, the conformance suite, and the schema directory. The
README now states the real count and describes the real layout, a new
registry test fails whenever the advertised count drifts from the
registered providers, and the one-off agent session reports committed to
the repository root (
context.md,PR-CHANGES.md,sync-report.txt)are gone along with their ignore-list entries. mdt's machine-local index
cache is no longer tracked, so
mdt checkanddprintstop rewritingeach other's output.
Other
ETXTBSY. The fixture now writes a scratch file and renames it into place, the same approach the bws provider tests already use. Only test code changes.Packages: ⚪ rust:monosecret
Owner: @ifiokjr · Review: PR #94
Changed files