From 896b71fc621303493a5f1f3b002c630d85775c3a Mon Sep 17 00:00:00 2001 From: kingchenc Date: Sat, 23 May 2026 10:58:08 +0200 Subject: [PATCH] release(0.1.5): bump versions, finalize CHANGELOG, fail loud on missing platform binaries (R20, Z2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Versions bumped to 0.1.5 in every authoritative location: - workspace `Cargo.toml` (`[workspace.package].version`, the `wickra-core` path dependency pin). - `bindings/python/pyproject.toml`. - `bindings/node/package.json` (main + all six `optionalDependencies` pins). - All six per-platform `bindings/node/npm//package.json` templates. CHANGELOG: the accumulated `[Unreleased]` block is promoted to `[0.1.5] - TBD` (date left for the user to set at tag time); the new `[Unreleased]` header sits empty above it; the compare link table is extended with `[0.1.5]: …compare/v0.1.4...v0.1.5` and the `[Unreleased]` link is repointed to `…compare/v0.1.5...HEAD`. Wiki refresh for 0.1.5 (R20 + Z2): - `Home.md` version pin table updated; the Quickstart-Node hint replaces the "spam filter holding back Windows" caveat with "0.1.5 is the first release in which `npm install wickra` works end-to-end on Windows" (npm Support released the name on 2026-05-22). - `Quickstart-Node.md`'s Windows caveat is rewritten to explain the history (`0.1.1`–`0.1.4` of `wickra-win32-x64-msvc` are burned) and the resolution (0.1.5+ installs cleanly). - `Quickstart-Rust.md` version mention bumped. - `Warmup-Periods.md` note bumped + corrected: every Node and WASM class — single- and multi-output — now exposes `warmupPeriod()` after R3 (this branch), not only the single-output ones. `release.yml` `publish_dir` no longer silently swallows a second-attempt platform-package publish failure with a `::warning::` and `return 0`. A real failure (after the existing 30s retry) now emits an `::error::` and fails the job. The original mask is exactly what allowed the `wickra-win32-x64-msvc@0.1.1–0.1.4` spam-filter rejections to land four times in a row without anyone noticing (audit finding R20). Failing loud means the next regression of this shape is caught at the release run, not by a Windows user trying to `require('wickra')`. This commit does NOT push, tag, or trigger a release — the user publishes the 0.1.5 tag themselves once the manual npm-republish smoke test confirms `wickra-win32-x64-msvc@0.1.5` accepts publish on the freshly-released name. --- .github/workflows/release.yml | 21 +++++++++++++------ CHANGELOG.md | 5 ++++- Cargo.lock | 12 +++++------ Cargo.toml | 4 ++-- bindings/node/npm/darwin-arm64/package.json | 2 +- bindings/node/npm/darwin-x64/package.json | 2 +- .../node/npm/linux-arm64-gnu/package.json | 2 +- bindings/node/npm/linux-x64-gnu/package.json | 2 +- .../node/npm/win32-arm64-msvc/package.json | 2 +- bindings/node/npm/win32-x64-msvc/package.json | 2 +- bindings/node/package.json | 14 ++++++------- bindings/python/pyproject.toml | 2 +- docs/wiki/Home.md | 18 +++++++++------- docs/wiki/Quickstart-Node.md | 19 +++++++++-------- docs/wiki/Quickstart-Rust.md | 2 +- docs/wiki/Warmup-Periods.md | 7 ++++--- 16 files changed, 66 insertions(+), 50 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0267bc9b..33acdd71 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -228,10 +228,16 @@ jobs: working-directory: bindings/node run: npx napi artifacts --dir artifacts - # Publish each platform package individually so one failure doesn't kill - # the others. Skip versions that are already on npm. Tolerate spam-filter - # 403s with a one-time retry after a short delay (spam detection is - # often rate-limit-based and clears on the next request). + # Publish each platform package individually. Skip versions that are + # already on npm. A first-attempt 403 from npm's spam filter is + # tolerated for a single 30-second retry — that historically clears + # rate-limit-driven false positives. Anything that still fails after + # the retry is a *real* failure (the platform binary will be missing + # from `optionalDependencies` and Windows-style installs will break, + # exactly the regression that produced audit finding R20) — fail the + # job loudly so the release does not silently land in a half-published + # state. Previously this loop swallowed the second-attempt failure with + # a `::warning::` and `return 0`; that mask is removed. - name: Publish platform packages (idempotent) working-directory: bindings/node env: @@ -239,6 +245,7 @@ jobs: run: | set +e version=$(node -p "require('./package.json').version") + fail=0 publish_dir() { local dir=$1 local pkg=$(basename "$dir") @@ -264,13 +271,15 @@ jobs: rc=$? fi if [ "$rc" -ne 0 ]; then - echo "::warning::$pkgname could not be published; the main package will skip the missing optional dep" + echo "::error::$pkgname could not be published — the release would land with a missing platform binary; failing the job." + return 1 fi return 0 } for dir in npm/*/; do - publish_dir "$dir" + publish_dir "$dir" || fail=1 done + exit $fail - name: Publish main package to npm (idempotent) working-directory: bindings/node diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bf9c047..6ae65e17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.5] - TBD + ### Fixed - `HistoricalVolatility::update` no longer substitutes a `0.0` log-return on non-positive prices (audit finding R13). Negative or zero prices are @@ -247,7 +249,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 optional Binance live feed. - Bindings for Python, Node.js, and WebAssembly. -[Unreleased]: https://github.com/kingchenc/wickra/compare/v0.1.4...HEAD +[Unreleased]: https://github.com/kingchenc/wickra/compare/v0.1.5...HEAD +[0.1.5]: https://github.com/kingchenc/wickra/compare/v0.1.4...v0.1.5 [0.1.4]: https://github.com/kingchenc/wickra/compare/v0.1.3...v0.1.4 [0.1.3]: https://github.com/kingchenc/wickra/compare/v0.1.2...v0.1.3 [0.1.2]: https://github.com/kingchenc/wickra/compare/v0.1.1...v0.1.2 diff --git a/Cargo.lock b/Cargo.lock index fa049b0d..526bb650 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1941,7 +1941,7 @@ dependencies = [ [[package]] name = "wickra" -version = "0.1.4" +version = "0.1.5" dependencies = [ "approx", "criterion", @@ -1952,7 +1952,7 @@ dependencies = [ [[package]] name = "wickra-core" -version = "0.1.4" +version = "0.1.5" dependencies = [ "approx", "proptest", @@ -1962,7 +1962,7 @@ dependencies = [ [[package]] name = "wickra-data" -version = "0.1.4" +version = "0.1.5" dependencies = [ "approx", "csv", @@ -1989,7 +1989,7 @@ dependencies = [ [[package]] name = "wickra-node" -version = "0.1.4" +version = "0.1.5" dependencies = [ "napi", "napi-build", @@ -1999,7 +1999,7 @@ dependencies = [ [[package]] name = "wickra-python" -version = "0.1.4" +version = "0.1.5" dependencies = [ "numpy", "pyo3", @@ -2008,7 +2008,7 @@ dependencies = [ [[package]] name = "wickra-wasm" -version = "0.1.4" +version = "0.1.5" dependencies = [ "console_error_panic_hook", "js-sys", diff --git a/Cargo.toml b/Cargo.toml index 9058b2e0..56f38f5b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ members = [ exclude = ["fuzz"] [workspace.package] -version = "0.1.4" +version = "0.1.5" authors = ["kingchenc "] edition = "2021" rust-version = "1.75" @@ -24,7 +24,7 @@ keywords = ["finance", "trading", "indicators", "technical-analysis", "ta"] categories = ["finance", "mathematics", "science"] [workspace.dependencies] -wickra-core = { path = "crates/wickra-core", version = "0.1.4" } +wickra-core = { path = "crates/wickra-core", version = "0.1.5" } thiserror = "2" rayon = "1.10" diff --git a/bindings/node/npm/darwin-arm64/package.json b/bindings/node/npm/darwin-arm64/package.json index 3f1ab105..7f60c5aa 100644 --- a/bindings/node/npm/darwin-arm64/package.json +++ b/bindings/node/npm/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "wickra-darwin-arm64", - "version": "0.1.4", + "version": "0.1.5", "description": "Native binding for wickra (macOS Apple Silicon). Installed automatically as an optional dependency of wickra on matching platforms.", "main": "wickra.darwin-arm64.node", "files": [ diff --git a/bindings/node/npm/darwin-x64/package.json b/bindings/node/npm/darwin-x64/package.json index 4ec5f26e..b64903ad 100644 --- a/bindings/node/npm/darwin-x64/package.json +++ b/bindings/node/npm/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "wickra-darwin-x64", - "version": "0.1.4", + "version": "0.1.5", "description": "Native binding for wickra (macOS Intel). Installed automatically as an optional dependency of wickra on matching platforms.", "main": "wickra.darwin-x64.node", "files": [ diff --git a/bindings/node/npm/linux-arm64-gnu/package.json b/bindings/node/npm/linux-arm64-gnu/package.json index f3a3958c..8b53c4c0 100644 --- a/bindings/node/npm/linux-arm64-gnu/package.json +++ b/bindings/node/npm/linux-arm64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "wickra-linux-arm64-gnu", - "version": "0.1.4", + "version": "0.1.5", "description": "Native binding for wickra (linux arm64 GNU). Installed automatically as an optional dependency of wickra on matching platforms.", "main": "wickra.linux-arm64-gnu.node", "files": [ diff --git a/bindings/node/npm/linux-x64-gnu/package.json b/bindings/node/npm/linux-x64-gnu/package.json index f8fcf274..41ace2f5 100644 --- a/bindings/node/npm/linux-x64-gnu/package.json +++ b/bindings/node/npm/linux-x64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "wickra-linux-x64-gnu", - "version": "0.1.4", + "version": "0.1.5", "description": "Native binding for wickra (linux x64 GNU). Installed automatically as an optional dependency of wickra on matching platforms.", "main": "wickra.linux-x64-gnu.node", "files": [ diff --git a/bindings/node/npm/win32-arm64-msvc/package.json b/bindings/node/npm/win32-arm64-msvc/package.json index 0018047c..5385aae3 100644 --- a/bindings/node/npm/win32-arm64-msvc/package.json +++ b/bindings/node/npm/win32-arm64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "wickra-win32-arm64-msvc", - "version": "0.1.4", + "version": "0.1.5", "description": "Native binding for wickra (Windows arm64 MSVC). Installed automatically as an optional dependency of wickra on matching platforms.", "main": "wickra.win32-arm64-msvc.node", "files": [ diff --git a/bindings/node/npm/win32-x64-msvc/package.json b/bindings/node/npm/win32-x64-msvc/package.json index c59693f0..f3d61b8a 100644 --- a/bindings/node/npm/win32-x64-msvc/package.json +++ b/bindings/node/npm/win32-x64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "wickra-win32-x64-msvc", - "version": "0.1.4", + "version": "0.1.5", "description": "Native binding for wickra (Windows x64 MSVC). Installed automatically as an optional dependency of wickra on matching platforms.", "main": "wickra.win32-x64-msvc.node", "files": [ diff --git a/bindings/node/package.json b/bindings/node/package.json index ce229e69..fba95dcc 100644 --- a/bindings/node/package.json +++ b/bindings/node/package.json @@ -1,6 +1,6 @@ { "name": "wickra", - "version": "0.1.4", + "version": "0.1.5", "description": "Streaming-first technical indicators: incremental, fast, install-free. Node bindings powered by Rust.", "author": "kingchenc ", "main": "index.js", @@ -47,12 +47,12 @@ "node": ">= 18" }, "optionalDependencies": { - "wickra-linux-x64-gnu": "0.1.4", - "wickra-linux-arm64-gnu": "0.1.4", - "wickra-darwin-x64": "0.1.4", - "wickra-darwin-arm64": "0.1.4", - "wickra-win32-x64-msvc": "0.1.4", - "wickra-win32-arm64-msvc": "0.1.4" + "wickra-linux-x64-gnu": "0.1.5", + "wickra-linux-arm64-gnu": "0.1.5", + "wickra-darwin-x64": "0.1.5", + "wickra-darwin-arm64": "0.1.5", + "wickra-win32-x64-msvc": "0.1.5", + "wickra-win32-arm64-msvc": "0.1.5" }, "scripts": { "build": "napi build --platform --release", diff --git a/bindings/python/pyproject.toml b/bindings/python/pyproject.toml index b740914d..65ca3a42 100644 --- a/bindings/python/pyproject.toml +++ b/bindings/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "wickra" -version = "0.1.4" +version = "0.1.5" description = "Streaming-first technical indicators: incremental, fast, install-free." readme = "README.md" license = { text = "PolyForm-Noncommercial-1.0.0" } diff --git a/docs/wiki/Home.md b/docs/wiki/Home.md index e8412747..4531d31d 100644 --- a/docs/wiki/Home.md +++ b/docs/wiki/Home.md @@ -26,12 +26,12 @@ open an issue on GitHub to discuss a separate license. | Registry | Package | Version | |-----------|----------------|---------| -| crates.io | `wickra` | 0.1.4 | -| crates.io | `wickra-core` | 0.1.4 | -| crates.io | `wickra-data` | 0.1.4 | -| PyPI | `wickra` | 0.1.4 | -| npm | `wickra` | 0.1.4 | -| npm | `wickra-wasm` | 0.1.4 | +| crates.io | `wickra` | 0.1.5 | +| crates.io | `wickra-core` | 0.1.5 | +| crates.io | `wickra-data` | 0.1.5 | +| PyPI | `wickra` | 0.1.5 | +| npm | `wickra` | 0.1.5 | +| npm | `wickra-wasm` | 0.1.5 | Release notes and tagged builds: . @@ -45,8 +45,10 @@ Release notes and tagged builds: streaming via the `Indicator` and `BatchExt` traits, and the `Chain` combinator. - [Quickstart: Node](Quickstart-Node.md) — `npm install wickra`, basic - `SMA` and `MACD` calls, and the current Windows install caveat - (`wickra-win32-x64-msvc@0.1.4` is held by the npm spam filter). + `SMA` and `MACD` calls, and the install surface. Windows x64 was + previously blocked by an npm spam filter on `wickra-win32-x64-msvc`; + that was resolved with npm Support, and 0.1.5 is the first release in + which `npm install wickra` works end-to-end on Windows. - [Quickstart: WASM](Quickstart-WASM.md) — `npm install wickra-wasm`, building with `wasm-pack`, and running indicators client-side in a browser or bundler. diff --git a/docs/wiki/Quickstart-Node.md b/docs/wiki/Quickstart-Node.md index 174d9e11..94fbb110 100644 --- a/docs/wiki/Quickstart-Node.md +++ b/docs/wiki/Quickstart-Node.md @@ -10,15 +10,16 @@ slow JS reimplementation. npm install wickra ``` -> **Windows install caveat (current, 0.1.4).** The platform-specific -> sub-package `wickra-win32-x64-msvc@0.1.4` is presently held back by npm's -> automated spam filter. On a Windows x64 machine `npm install wickra` -> succeeds, but `require('wickra')` then throws -> `Error: Cannot find module 'wickra-win32-x64-msvc'` because the loader -> falls through to `require('wickra-win32-x64-msvc')` when no local `.node` -> binary is found. Linux x64 and macOS (x64 + arm64) wheels are unaffected. -> If you are on Windows today, build the binding from source (see "Building -> from source" below) until the npm side is resolved. +> **Windows install (0.1.5+).** Earlier patch releases were blocked on +> Windows x64 because the platform-specific sub-package +> `wickra-win32-x64-msvc` was held back by npm's automated spam filter, so +> `require('wickra')` threw `Error: Cannot find module +> 'wickra-win32-x64-msvc'` after a successful `npm install`. npm Support +> released the name on 2026-05-22; 0.1.5 is the first version in which +> Windows x64 installs cleanly end-to-end (version numbers `0.1.1`–`0.1.4` +> of that sub-package remain burned and cannot be republished — see the +> npm registry page for `wickra-win32-x64-msvc`). Linux x64, Linux arm64 +> and macOS (x64 + arm64) were unaffected throughout. ## A first run diff --git a/docs/wiki/Quickstart-Rust.md b/docs/wiki/Quickstart-Rust.md index cb1779ff..963766bc 100644 --- a/docs/wiki/Quickstart-Rust.md +++ b/docs/wiki/Quickstart-Rust.md @@ -15,7 +15,7 @@ build. The `wickra` crate is a thin façade that re-exports everything from `wickra-core`; you can also depend on `wickra-core` directly if you want to skip the façade. -The published crate is at version `0.1.4` on +The published crate is at version `0.1.5` on [crates.io](https://crates.io/crates/wickra). ## The `Indicator` trait in 30 seconds diff --git a/docs/wiki/Warmup-Periods.md b/docs/wiki/Warmup-Periods.md index 63dbace4..f7b775f1 100644 --- a/docs/wiki/Warmup-Periods.md +++ b/docs/wiki/Warmup-Periods.md @@ -153,9 +153,10 @@ const sma = new wickra.SMA(20); console.log(sma.warmupPeriod()); // -> 20 ``` -(Note: as of `wickra@0.1.4`, `warmupPeriod()` is exposed on the Node -single-output classes but not on every multi-output class — consult -`bindings/node/index.d.ts` for the authoritative surface.) +(Since `wickra@0.1.5`, `warmupPeriod()` is exposed on every Node and +WASM class — single- and multi-output — alongside `update()`, `reset()` +and `isReady()`. Consult `bindings/node/index.d.ts` for the +authoritative TypeScript surface.) ## See also