diff --git a/AGENTS.md b/AGENTS.md
index 1f4a93d..fb43b80 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -19,7 +19,7 @@ VitePress build. It is also what CI runs, on every pull request
- every `require("@cap2ui5/cds-plugin")` or `import { … } from
"@cap2ui5/cds-plugin"` **inside a code fence** names only what the package
really exports (and two dead packages are reported, in either form: the
- port's `abap2UI5/…` and the plugin's withdrawn old name `cap2ui5`),
+ port's `abap2UI5/…` and the plugin's old name `cap2ui5`, a deprecated placeholder on npm),
- every `cds.requires.cap2ui5.` is an option the plugin defines (and
0.1.0's `cds.cap2ui5. ` is reported as the deprecated place),
- every `1.x.y` release number is the pinned runtime release,
@@ -66,8 +66,10 @@ On npm since 2026-09-29: `@cap2ui5/cds-plugin@0.3.1` (Node ≥ 22, peer
`@sap/cds` ≥ 9), published by the npm organisation `cap2ui5`, and
`@cap2ui5/samples@0.1.0`. The plugin pins `@abap2ui5/node-runtime@1.145.0`
(on npm since 2026-09-27) **exactly**. Up to 0.2.0 the plugin was the unscoped
-package `cap2ui5`; it is withdrawn from npm (0.2.0 never reached it), so the
-site names it only as the old name. What did NOT change name: the
+package `cap2ui5`. On npm that name is now only a deprecated placeholder,
+`cap2ui5@0.0.1-placeholder` (since 2026-09-30): no `main`, and a `cap2ui5` bin
+that prints where to go and exits 1. It installs nothing an app can use (0.2.0
+never reached npm), so the site names it only as the old name. What did NOT change name: the
configuration `cds.requires.cap2ui5`, `cds add cap2ui5`, the bin
`npx cap2ui5 abap2js`, the entity `cap2ui5.Drafts` and the logger `cap2ui5`. The runtime package was renamed from
`@abap2ui5/runtime` before its first publish — the old name never existed on
diff --git a/docs/guide/ecosystem.md b/docs/guide/ecosystem.md
index f401279..f3033ef 100644
--- a/docs/guide/ecosystem.md
+++ b/docs/guide/ecosystem.md
@@ -35,7 +35,8 @@ All three are on npm: `@cap2ui5/cds-plugin` 0.3.1 (Node ≥ 22, `@sap/cds` ≥ 9
`@abap2ui5/node-runtime` 1.145.0 (Node ≥ 22), which the plugin pins exactly,
and `@cap2ui5/samples` 0.1.0. `npm add @cap2ui5/cds-plugin` installs the first two — see the
[Quickstart](./getting-started). Up to 0.2.0 the plugin was the unscoped
-package `cap2ui5`, which is withdrawn from npm.
+package `cap2ui5`. On npm that name is now only a deprecated placeholder that
+installs nothing usable; its `cap2ui5` command prints where to go instead.
## What the plugin does and does not own
diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md
index 5e0c182..230386f 100644
--- a/docs/guide/getting-started.md
+++ b/docs/guide/getting-started.md
@@ -72,8 +72,9 @@ Your own `server.js`, if you have one, is not touched. Nothing is generated
into your repository, and there are no frontend files to serve.
::: info Coming from the package `cap2ui5`
-Up to 0.2.0 the plugin was the unscoped package `cap2ui5`, which is withdrawn
-from npm. A project that has it swaps it:
+Up to 0.2.0 the plugin was the unscoped package `cap2ui5`. On npm that name is
+now only a deprecated placeholder that installs nothing usable. A project that
+has it swaps it:
```bash
npm rm cap2ui5 && npm add @cap2ui5/cds-plugin
diff --git a/scripts/verify-refs.mjs b/scripts/verify-refs.mjs
index 954139e..a36641f 100644
--- a/scripts/verify-refs.mjs
+++ b/scripts/verify-refs.mjs
@@ -55,13 +55,13 @@
* package actually exports, and a "@cap2ui5/cds-plugin/" specifier
* lands on a file that exists. Two dead packages are reported by name,
* in either form: "abap2UI5/…", the port's package, and "cap2ui5", the
- * plugin's name up to 0.2.0, withdrawn from npm.
+ * plugin's name up to 0.2.0, now a deprecated placeholder on npm.
* 5. every plugin option named as `cds.requires.cap2ui5.` is a key the plugin
* really defines, every three-part release number (1.x.y) is the runtime
* release the checkout pins or an allowlisted historical number, and a
* `"@cap2ui5/cds-plugin": "^x.y.z"` a page tells a reader to write is a
* range the plugin's own version actually falls in (and a dependency on
- * the withdrawn `"cap2ui5"` is reported whatever its range).
+ * the deprecated `"cap2ui5"` is reported whatever its range).
*
* Check 4 exists because the first three did not see the largest defect this
* site ever had. Fenced blocks were skipped wholesale as "examples, not
@@ -221,8 +221,9 @@ const PLUGIN_VERSION = (() => {
} catch { return null; }
})();
const CAP2UI5_DEP_RE = /"@cap2ui5\/cds-plugin"\s*:\s*"[~^]?(\d+\.\d+)\.[\dx]+"/g;
-// The unscoped package `cap2ui5` was withdrawn from npm with 0.3.0 - a
-// dependency on it is a line a reader cannot install, whatever its range.
+// The unscoped package `cap2ui5` is, since 0.3.0, only a deprecated placeholder
+// on npm - a dependency on it installs nothing a reader can use, whatever its
+// range.
const WITHDRAWN_DEP_RE = /"cap2ui5"\s*:\s*"[~^]?\d/g;
const minor = (v) => String(v).split(".").slice(0, 2).join(".");
@@ -268,7 +269,7 @@ const RELEASE_RE = /\b1\.\d{2,3}\.\d+\b/g;
const CLASS_RE = /`(z2ui5_(?:cl|if|cx)_[a-z0-9_]+)(?![a-z0-9_])/gi;
// require("@cap2ui5/cds-plugin"), require("@cap2ui5/cds-plugin/lib/…"), and two
// dead packages: the port's `abap2UI5` and the plugin's own old name `cap2ui5`,
-// withdrawn from npm with 0.3.0.
+// a deprecated placeholder on npm since 0.3.0.
const PKG = "@cap2ui5/cds-plugin";
const REQUIRE_RE = /require\(\s*["'`](@cap2ui5\/cds-plugin|cap2ui5|abap2UI5)(?:\/([^"'`]+))?["'`]\s*\)/gi;
// `const { defineApp, t } = require("@cap2ui5/cds-plugin")` — the names, not just the path
@@ -326,7 +327,7 @@ for (const file of markdownFiles(DOCS)) {
}
for (const m of line.matchAll(WITHDRAWN_DEP_RE)) {
- add(file, n, `tells a reader to depend on "cap2ui5", which was withdrawn from npm `
+ add(file, n, `tells a reader to depend on "cap2ui5", which is only a deprecated placeholder on npm `
+ `- the package is "${PKG}"`);
}
@@ -362,7 +363,7 @@ for (const file of markdownFiles(DOCS)) {
continue;
}
if (pkg.toLowerCase() === "cap2ui5") {
- add(file, n, `${how} "${spec}" is the plugin's OLD name, withdrawn from npm - `
+ add(file, n, `${how} "${spec}" is the plugin's OLD name, only a deprecated placeholder on npm - `
+ `the package is "${PKG}"`);
continue;
}