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); + }); +});