diff --git a/.github/workflows/rust-tests.yml b/.github/workflows/rust-tests.yml
new file mode 100644
index 0000000..a9641d0
--- /dev/null
+++ b/.github/workflows/rust-tests.yml
@@ -0,0 +1,41 @@
+name: Rust Tests
+
+on:
+ push:
+ pull_request:
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: rust-tests-${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ test:
+ name: fmt, clippy and tests
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ persist-credentials: false
+
+ - name: Install stable Rust toolchain
+ uses: dtolnay/rust-toolchain@18f0487477426dce244608110aa2660c2893deb7 # stable
+ with:
+ toolchain: stable
+ components: rustfmt, clippy
+
+ - name: Check formatting
+ run: cargo fmt --all --check
+
+ - name: Run clippy
+ run: cargo clippy --workspace --all-targets -- -D warnings
+
+ - name: Run tests
+ run: cargo test --workspace
+
+ - name: Build examples
+ run: cargo build --workspace --examples
diff --git a/.github/workflows/security-audit.yml b/.github/workflows/security-audit.yml
index 9fdfdbc..adb6603 100644
--- a/.github/workflows/security-audit.yml
+++ b/.github/workflows/security-audit.yml
@@ -20,12 +20,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Install stable Rust toolchain
- uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable
+ uses: dtolnay/rust-toolchain@18f0487477426dce244608110aa2660c2893deb7 # stable
with:
toolchain: stable
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e40bcf7..a58d2d1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,48 @@
# Changelog
+## 2026-11-03 — v0.3.0
+
+### Added
+
+- `xfetch-api-common` 0.3.0: shared JSON protocol constants, frame shape,
+ timeout helper and stdin/stdout JSON helpers. It carries no per-kind
+ request/response types; plugins, effects and extensions keep their own
+ contracts.
+- `xfetch-extension-api`: `io` module, standard entrypoints
+ (`read_config_provider_request`, `read_config_provider_args_or_default`,
+ `write_config_provider_response`, `write_config`), `ExtensionApiError`,
+ `ConfigProviderRequest::validate()`, `kind_enum()`, `parse_args()` and
+ `parse_args_or_default()`.
+- Effect and extension examples: `crates/effect-api/examples/simple-effect.rs`
+ and `crates/extension-api/examples/simple-extension.rs`.
+- `rust-tests.yml`: fmt, clippy `-D warnings`, workspace tests and example
+ builds on push and pull request.
+
+### Changed
+
+- All SDK crates bumped to `0.3.0`.
+- `with_timeout` and JSON IO now delegate to `xfetch-api-common`; the existing
+ public paths and error variants are preserved.
+- `LogoAnimationRequest` and `EffectRequest` tolerate a missing optional
+ `args` field through `serde(default)`.
+- `PluginApiError` and `EffectApiError` implement `From
- Today this repository contains the public plugin SDK used by the core,
- official plugins, and third-party plugin authors.
+ The current release line is 0.3.0. It keeps the JSON
+ protocol at version 1 and the WIT at
+ xfetch:runtime@0.1.0; the changes are additive.
crates/common (xfetch-api-common): shared protocol constants, frame shape, timeout and JSON IO helpers.crates/plugin-api: shared protocol crate for xfetch plugins.crates/extension-api: shared protocol crate for xfetch extensions (config providers).crates/effect-api: shared protocol crate for xfetch effects (intro animations over the info lines).crates/guest-api: host-call helpers for WebAssembly guests (http_request, exec, log, protocol_version).wit/xfetch-runtime.wit: component-model contract (plugin, effect and extension worlds).docs/: focused documentation for setup, protocol, SDK usage, wasm guests, and examples.examples/: minimal plugin, effect and extension binaries that compile against the public crates.xfetch-api-common first, then xfetch-plugin-api, xfetch-extension-api and xfetch-effect-api; xfetch-guest-api is independent.