From a50ff7fdf4c042cf625a2d378e7c7f12330f1ad2 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 20:15:01 +0000
Subject: [PATCH] =?UTF-8?q?=F0=9F=A6=8B=20New=20version=20release?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.changeset/release-traps.md | 11 -----------
CHANGELOG.md | 12 ++++++++++++
dotnet/src/SmooAI.File.S3/SmooAI.File.S3.csproj | 2 +-
dotnet/src/SmooAI.File/SmooAI.File.csproj | 2 +-
go/file/version.go | 2 +-
package.json | 2 +-
python/pyproject.toml | 2 +-
python/src/smooai_file/__init__.py | 2 +-
rust/file/Cargo.lock | 2 +-
rust/file/Cargo.toml | 2 +-
10 files changed, 20 insertions(+), 19 deletions(-)
delete mode 100644 .changeset/release-traps.md
diff --git a/.changeset/release-traps.md b/.changeset/release-traps.md
deleted file mode 100644
index eec4a35..0000000
--- a/.changeset/release-traps.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@smooai/file': patch
----
-
-Three release and test traps that each report success while doing nothing.
-
-**`go test ./...` served a cached pass against a corrupted fixture.** Go's build cache doesn't invalidate on a file loaded from outside the package directory, which is exactly the shape of the shared contract fixtures under `spec/`. Verified: zeroing every `sha256` and setting `headBytes` to 999 still printed `ok (cached)`. `go:test` now passes `-count=1`, and the same corruption fails immediately. Until this, the Go quarter of the five-port lazy contract proved nothing.
-
-**`release.yml` ran `pnpm format` in write mode.** Whatever it rewrote was either swept into the release commit unreviewed, or — in publish mode, where the changesets action commits nothing — left the tree dirty for `cargo publish --locked`, which would fail every release now that `--allow-dirty` is gone. The workflow now runs `format:check`, and the formatting the release genuinely needs runs inside `pnpm run version`, before the action commits. Changesets' generated `CHANGELOG.md` is confirmed not oxfmt-clean, so without that ordering `format:check` would redden every future release PR.
-
-**Publishing to PyPI, crates.io, NuGet and the Go tag was gated on npm having published in the same run.** If npm succeeded and a later step failed, the retry found nothing new for npm, so all four skipped — a green run that published nothing, stranding four ports on the previous release indefinitely. Each step is now gated on whether its own registry carries `package.json`'s version, so a retry ships exactly what is missing, and a final step fails the run if npm published a version the others didn't.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f1188a1..0625cae 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,17 @@
# @smooai/file
+## 2.2.20
+
+### Patch Changes
+
+- d4cb3a3: Three release and test traps that each report success while doing nothing.
+
+ **`go test ./...` served a cached pass against a corrupted fixture.** Go's build cache doesn't invalidate on a file loaded from outside the package directory, which is exactly the shape of the shared contract fixtures under `spec/`. Verified: zeroing every `sha256` and setting `headBytes` to 999 still printed `ok (cached)`. `go:test` now passes `-count=1`, and the same corruption fails immediately. Until this, the Go quarter of the five-port lazy contract proved nothing.
+
+ **`release.yml` ran `pnpm format` in write mode.** Whatever it rewrote was either swept into the release commit unreviewed, or — in publish mode, where the changesets action commits nothing — left the tree dirty for `cargo publish --locked`, which would fail every release now that `--allow-dirty` is gone. The workflow now runs `format:check`, and the formatting the release genuinely needs runs inside `pnpm run version`, before the action commits. Changesets' generated `CHANGELOG.md` is confirmed not oxfmt-clean, so without that ordering `format:check` would redden every future release PR.
+
+ **Publishing to PyPI, crates.io, NuGet and the Go tag was gated on npm having published in the same run.** If npm succeeded and a later step failed, the retry found nothing new for npm, so all four skipped — a green run that published nothing, stranding four ports on the previous release indefinitely. Each step is now gated on whether its own registry carries `package.json`'s version, so a retry ships exactly what is missing, and a final step fails the run if npm published a version the others didn't.
+
## 2.2.19
### Patch Changes
diff --git a/dotnet/src/SmooAI.File.S3/SmooAI.File.S3.csproj b/dotnet/src/SmooAI.File.S3/SmooAI.File.S3.csproj
index b52f34d..9e63ffa 100644
--- a/dotnet/src/SmooAI.File.S3/SmooAI.File.S3.csproj
+++ b/dotnet/src/SmooAI.File.S3/SmooAI.File.S3.csproj
@@ -10,7 +10,7 @@
SmooAI.File.S3
SmooAI.File.S3
SmooAI.File.S3
- 2.2.19
+ 2.2.20
S3 helpers for SmooAI.File — createPresignedUploadUrl, createFromS3, uploadToS3, saveToS3.
README.md
diff --git a/dotnet/src/SmooAI.File/SmooAI.File.csproj b/dotnet/src/SmooAI.File/SmooAI.File.csproj
index 9726e39..058ba30 100644
--- a/dotnet/src/SmooAI.File/SmooAI.File.csproj
+++ b/dotnet/src/SmooAI.File/SmooAI.File.csproj
@@ -10,7 +10,7 @@
SmooAI.File
SmooAI.File
SmooAI.File
- 2.2.19
+ 2.2.20
File utilities with magic-byte MIME detection (via Mime-Detective) and typed validation errors. Use SmooAI.File.S3 for S3 upload/download helpers.
README.md
diff --git a/go/file/version.go b/go/file/version.go
index 4c7178b..607e2e4 100644
--- a/go/file/version.go
+++ b/go/file/version.go
@@ -1,4 +1,4 @@
package file
// Version is the current version of the smooai-file Go package.
-const Version = "2.2.19"
+const Version = "2.2.20"
diff --git a/package.json b/package.json
index 156a040..a04f2e7 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@smooai/file",
- "version": "2.2.19",
+ "version": "2.2.20",
"description": "File operations that don't lie — magic-byte MIME detection catches spoofed extensions, size + content validation is built in, and presigned S3 uploads are one call away. Stream-first so large uploads don't blow your memory.",
"homepage": "https://github.com/SmooAI/file#readme",
"bugs": {
diff --git a/python/pyproject.toml b/python/pyproject.toml
index 00d3a7f..94095f6 100644
--- a/python/pyproject.toml
+++ b/python/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "smooai-file"
-version = "2.2.19"
+version = "2.2.20"
description = "A unified file handling library for working with files from local filesystem, S3, URLs, and streams."
readme = "README.md"
authors = [{ name = "SmooAI", email = "brent@smooai.com" }]
diff --git a/python/src/smooai_file/__init__.py b/python/src/smooai_file/__init__.py
index 1ec4b13..2cb3bcb 100644
--- a/python/src/smooai_file/__init__.py
+++ b/python/src/smooai_file/__init__.py
@@ -4,7 +4,7 @@
S3, URLs, and streams.
"""
-__version__ = "2.2.19"
+__version__ = "2.2.20"
from ._content_disposition import parse_content_disposition
from ._detection import detect_from_bytes, detect_from_extension, extension_from_mime
diff --git a/rust/file/Cargo.lock b/rust/file/Cargo.lock
index 1bb8d59..e61cbf9 100644
--- a/rust/file/Cargo.lock
+++ b/rust/file/Cargo.lock
@@ -2279,7 +2279,7 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "smooai-file"
-version = "2.2.19"
+version = "2.2.20"
dependencies = [
"aws-config",
"aws-sdk-s3",
diff --git a/rust/file/Cargo.toml b/rust/file/Cargo.toml
index 86bd2d3..fbed268 100644
--- a/rust/file/Cargo.toml
+++ b/rust/file/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "smooai-file"
-version = "2.2.19"
+version = "2.2.20"
edition = "2021"
description = "A unified file handling library for working with files from local filesystem, S3, URLs, and streams."
license = "MIT"