From 48d2d6bee522b5c4c89662225922ae002fac6ce1 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Fri, 7 Aug 2026 12:03:03 -0400 Subject: [PATCH] chore: retire the project MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rumcodecs set out to answer whether numcodecs.js could be reimplemented in Rust/WASM without breaking its API or its byte formats. It could, and that is the whole of what the experiment had to say. Retire it rather than leave a maintained-looking package that nobody is maintaining. README gets a warning callout above the usage docs, so the notice lands before a reader starts integrating rather than after, and points at numcodecs.js as the replacement. Contributing now says issues and pull requests are not being reviewed and that forking is the way forward. The CI badges are dropped because they go blank the moment the workflows are disabled or the repo is archived. package.json carries the same message where npm renders it: a marked-up description, retired/deprecated/unmaintained keywords, and a `deprecated` field. That field is not what makes `npm install` warn — that flag is registry state set by `npm deprecate` — but it keeps the intent in version control instead of somewhere someone has to remember to reapply. Version bumps to 0.1.2 so any of this can reach the registry at all; 0.1.1 is already published. The notice spans two files that drift independently, so test/index.test.ts now pins them together: package.json must carry a non-empty deprecation naming the replacement, and the README callout must exist, say retired, link the same replacement, and sit above the quick start. The callout is delimited by where the blockquote ends rather than by a fixed trailing string, since a moved anchor would leave indexOf returning -1, slice(0, -1) handing back nearly the whole README, and the link assertion passing on a link nowhere near the callout. Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 24 +++++++++++---- package.json | 10 +++++-- test/index.test.ts | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 645fb5f..a18f64c 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,23 @@

rumcodecs

- CI - Rust CI + Retired npm MIT License

+> [!WARNING] +> **This project is retired.** rumcodecs was an experiment: could numcodecs.js +> be reimplemented in Rust/WASM without breaking its API or its byte formats? +> It could, and that is as far as the experiment goes. The project is no longer +> maintained. +> +> The published package stays on npm and keeps working, but it is deprecated: +> expect no further releases, no bug fixes, no security updates, and no support. +> Use [numcodecs.js](https://github.com/manzt/numcodecs.js) for anything real. +> The code below is left as it was — read it, fork it, take what is useful +> (MIT). +

numcodecs.js reimplemented in Rust.

@@ -129,10 +140,11 @@ rumcodecs/ ## 🤝 Contributing -Start with [AGENTS.md](AGENTS.md) for the repository map and conventions, and -the [open issues](https://github.com/fideus-labs/rumcodecs/issues) for what to -pick up next. All participation is governed by our -[Code of Conduct](CODE_OF_CONDUCT.md). +Nothing to contribute to — the project is retired, and issues and pull requests +are no longer being reviewed or merged. Forking is the way forward: the MIT +license covers everything here, and [AGENTS.md](AGENTS.md) still has the +repository map and conventions if you want to pick the code up. Anyone still +interacting here is governed by our [Code of Conduct](CODE_OF_CONDUCT.md). ## 📄 License diff --git a/package.json b/package.json index 5dd4bf9..1ba9319 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,15 @@ { "name": "@fideus-labs/rumcodecs", - "version": "0.1.1", - "description": "Buffer compression and transformation codecs — Rust/WASM reimplementation of numcodecs using blusc", + "version": "0.1.2", + "description": "[RETIRED — experiment, unmaintained] Buffer compression and transformation codecs — Rust/WASM reimplementation of numcodecs using blusc", "keywords": [ "blosc", "codecs", "compression", + "deprecated", + "retired", "rust", + "unmaintained", "wasm", "zarr" ], @@ -76,5 +79,6 @@ "engines": { "node": ">=18.0.0" }, - "packageManager": "pnpm@11.20.0" + "packageManager": "pnpm@11.20.0", + "deprecated": "rumcodecs was an experiment and is retired — unmaintained, with no further releases, fixes, or security updates. Use numcodecs (https://github.com/manzt/numcodecs.js) instead." } diff --git a/test/index.test.ts b/test/index.test.ts index 028da6e..272331c 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -78,3 +78,76 @@ describe("rumcodecs exports", () => { expect(entries.index).toMatch(/src\/index\.ts$/); }); }); + +// rumcodecs is retired. The notice lives in two files that reach different +// audiences — package.json feeds the npm search result and the package page, +// README.md is what GitHub and that same page render — and nothing but these +// assertions keeps them agreeing. A routine `npm version` bump or a docs edit +// can drop one side, and the result is a package that announces itself as +// retired in one place and as maintained in the other, which nobody notices +// until it is published. +// +// None of this is what makes `npm install` print a deprecation warning: that +// flag lives in the registry and is set by `npm deprecate`, out of this +// repository's reach. The `deprecated` field below is a marker for readers and +// tooling, so the intent survives in version control rather than existing only +// as registry state someone has to remember to reapply. +describe("retirement notice", () => { + const readme = readFileSync(new URL("../README.md", import.meta.url), "utf8"); + + // The callout runs from the marker to the first line that leaves the + // blockquote. Slicing to a fixed trailing string instead degrades silently: + // indexOf returns -1 when it moves, slice(0, -1) then hands back nearly the + // whole README, and "the link is inside the callout" starts passing on a link + // that is nowhere near it. + const calloutStart = readme.indexOf("> [!WARNING]"); + const calloutBody = (() => { + if (calloutStart === -1) return ""; + const lines = readme.slice(calloutStart).split("\n"); + const end = lines.findIndex((line, i) => i > 0 && !line.startsWith(">")); + return (end === -1 ? lines : lines.slice(0, end)).join("\n"); + })(); + + it("package.json carries a deprecation message", () => { + expect(typeof pkg.deprecated).toBe("string"); + expect(pkg.deprecated.trim()).not.toBe(""); + }); + + // A deprecation notice that does not say what to use instead makes the reader + // do the search themselves, so the replacement is part of the contract. + it("the deprecation message names the replacement", () => { + expect(pkg.deprecated).toMatch(/numcodecs/); + }); + + it("the npm description marks the package retired", () => { + expect(pkg.description).toMatch(/retired/i); + }); + + it("the keywords mark the package retired", () => { + expect(pkg.keywords).toContain("retired"); + expect(pkg.keywords).toContain("deprecated"); + }); + + it("the README leads with a retirement callout", () => { + expect(calloutStart).toBeGreaterThan(-1); + expect(calloutBody).toMatch(/retired/i); + }); + + // Both files should point at the same escape hatch. Matching the link rather + // than the bare name, and only inside the callout: the name "numcodecs.js" + // occurs in the callout's own opening sentence and throughout the prose + // below, so anything looser still passes on a callout that strands the reader + // with "this is retired" and nowhere to click. + it("the README callout links to the replacement named in package.json", () => { + expect(calloutBody).toMatch(/\[numcodecs\.js\]\(https:\/\/github\.com\/manzt\/numcodecs\.js\)/); + }); + + // The callout is only useful above the fold. Sinking it below the codec table + // or the quick start means the reader has already started integrating. + it("the README callout precedes the usage docs", () => { + const quickStart = readme.indexOf("Quick start"); + expect(calloutStart).toBeGreaterThan(-1); + expect(quickStart).toBeGreaterThan(-1); + expect(calloutStart).toBeLessThan(quickStart); + }); +});