bff1148d20
* ci(sync-about): fix docs version-sync clone collision + webpage npm race Two real release-time bugs surfaced by the v0.4.0 release, where the docs "Published versions" table never updated and the marketing-site Cloudflare build failed: 1. docs version sync never ran. The "Sync docs version (wickra-docs)" step cloned into a directory literally named `docs`, but on a tag push the job checks out the wickra repo at the workspace root, which already contains a top-level `docs/` directory. `git clone … docs` therefore failed with "destination path 'docs' already exists", silenced by `2>/dev/null` and misreported as a missing-token warning, so the docs version table stayed at the previous release. Clone into `docs-ver` instead (mirrors the `docs-count` dir the count step already uses); it collides with nothing in the repo. 2. webpage build broke on a version race. The "Sync webpage version" step bumps package.json's `wickra-wasm` pin to the released version and pushes immediately, but release.yml publishes wickra-wasm to npm in parallel on the same tag and finishes minutes later. Cloudflare's `npm clean-install` then hit `ETARGET: No matching version found for wickra-wasm@^0.4.0`. Poll npm for wickra-wasm@<version> (up to ~15 min) before committing; if it never appears the step skips with a warning rather than pushing a build-breaking commit. Both steps were designed to mirror each other across docs/webpage; these fixes restore that symmetry so every release self-heals both sites. * ci(sync-about): regenerate webpage package-lock on version bump Third v0.4.0 release-sync defect: the webpage version step seds package.json's wickra-wasm pin but never touched package-lock.json, so even after wickra-wasm went live on npm the Cloudflare build still failed with `npm ci` EUSAGE: "lock file's wickra-wasm@0.3.1 does not satisfy wickra-wasm@0.4.0". After the package.json sed, run `npm install --package-lock-only` so the lockfile (version + resolved + integrity) matches the new pin; commit package-lock.json alongside package.json. The earlier npm-wait already guarantees the version is resolvable. Guarded: if the regen fails the step skips the whole commit rather than push a package.json/lock mismatch. The live site was unblocked out-of-band by a matching lockfile commit on the webpage repo; this makes it self-heal on every future release.