From caf50ebf53fa99d67ebf14b3e5c66f39f2df6440 Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 00:12:07 +0100 Subject: [PATCH 01/35] chore: add agent skills config --- AGENTS.md | 13 +++++++++ docs/agents/domain.md | 51 ++++++++++++++++++++++++++++++++++++ docs/agents/issue-tracker.md | 46 ++++++++++++++++++++++++++++++++ docs/agents/triage-labels.md | 15 +++++++++++ 4 files changed, 125 insertions(+) create mode 100644 AGENTS.md create mode 100644 docs/agents/domain.md create mode 100644 docs/agents/issue-tracker.md create mode 100644 docs/agents/triage-labels.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..c058bf8 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,13 @@ +## Agent skills + +### Issue tracker + +Issues live in GitHub Issues on visbot/webvs (via `gh`). See `docs/agents/issue-tracker.md`. + +### Triage labels + +Default five-role vocabulary (needs-triage, needs-info, ready-for-agent, ready-for-human, wontfix). See `docs/agents/triage-labels.md`. + +### Domain docs + +Single-context: `GLOSSARY.md` + `docs/adr/` at the repo root. See `docs/agents/domain.md`. diff --git a/docs/agents/domain.md b/docs/agents/domain.md new file mode 100644 index 0000000..4032de0 --- /dev/null +++ b/docs/agents/domain.md @@ -0,0 +1,51 @@ +# Domain Docs + +How the engineering skills should consume this repo's domain documentation when exploring the codebase. + +## Before exploring, read these + +- **`GLOSSARY.md`** at the repo root, or +- **`GLOSSARY-MAP.md`** at the repo root if it exists: it points at one `GLOSSARY.md` per context. Read each one relevant to the topic. +- **`docs/adr/`**: read ADRs that touch the area you're about to work in. In multi-context repos, also check `src//docs/adr/` for context-scoped decisions. + +If any of these files don't exist, **proceed silently**. Don't flag their absence; don't suggest creating them upfront. The `/domain-modeling` skill (reached via `/grill-with-docs` and `/improve-codebase-architecture`) creates them lazily when terms or decisions actually get resolved. + +## File structure + +Single-context repo (most repos): + +``` +/ +├── GLOSSARY.md +├── docs/adr/ +│ ├── 0001-event-sourced-orders.md +│ └── 0002-postgres-for-write-model.md +└── src/ +``` + +Multi-context repo (presence of `GLOSSARY-MAP.md` at the root): + +``` +/ +├── GLOSSARY-MAP.md +├── docs/adr/ ← system-wide decisions +└── src/ + ├── ordering/ + │ ├── GLOSSARY.md + │ └── docs/adr/ ← context-specific decisions + └── billing/ + ├── GLOSSARY.md + └── docs/adr/ +``` + +## Use the glossary's vocabulary + +When your output names a domain concept (in an issue title, a refactor proposal, a hypothesis, a test name), use the term as defined in `GLOSSARY.md`. Don't drift to synonyms the glossary explicitly avoids. + +If the concept you need isn't in the glossary yet, that's a signal: either you're inventing language the project doesn't use (reconsider) or there's a real gap (note it for `/domain-modeling`). + +## Flag ADR conflicts + +If your output contradicts an existing ADR, surface it explicitly rather than silently overriding: + +> _Contradicts ADR-0007 (event-sourced orders), but worth reopening because…_ diff --git a/docs/agents/issue-tracker.md b/docs/agents/issue-tracker.md new file mode 100644 index 0000000..a63510f --- /dev/null +++ b/docs/agents/issue-tracker.md @@ -0,0 +1,46 @@ +# Issue tracker: GitHub + +Issues and specs for this repo live as GitHub issues. Use the `gh` CLI for all operations. + +## Conventions + +- **Create an issue**: `gh issue create --title "..." --body "..."`. Use a heredoc for multi-line bodies. +- **Read an issue**: `gh issue view --json number,title,body,labels,comments`. +- **List issues**: `gh issue list --state open --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'` with appropriate `--label` and `--state` filters. +- **Make an issue a sub-issue of a parent**: `gh issue create --parent ...`, or `gh issue edit --add-sub-issue ` afterwards (`gh` 2.94+). Older `gh`: `gh api --method POST repos///issues//sub_issues -F sub_issue_id=` (database id, as in **Blocking** below). Without sub-issues, put `Part of #` at the top of the child body. +- **Comment on an issue**: `gh issue comment --body "..."` +- **Apply / remove labels**: `gh issue edit --add-label "..."` / `--remove-label "..."` +- **Close**: `gh issue close --comment "..."` + +Infer the repo from `git remote -v`; `gh` does this automatically when run inside a clone. + +## Pull requests as a triage surface + +**PRs as a request surface: no.** _(Set to `yes` if this repo treats external PRs as feature requests; `/triage` reads this flag.)_ + +When set to `yes`, PRs run through the same labels and states as issues, using the `gh pr` equivalents: + +- **Read a PR**: `gh pr view --comments` and `gh pr diff ` for the diff. +- **List external PRs for triage**: `gh api --paginate 'repos/{owner}/{repo}/pulls?state=open' --jq '.[] | select(.author_association | IN("OWNER","MEMBER","COLLABORATOR") | not) | {number, title, author: .user.login, author_association, labels: [.labels[].name]}'`. +- **Comment / label / close**: `gh pr comment`, `gh pr edit --add-label`/`--remove-label`, `gh pr close`. + +GitHub shares one number space across issues and PRs, so a bare `#42` may be either: resolve with `gh pr view 42` and fall back to `gh issue view 42`. + +## When a skill says "publish to the issue tracker" + +Create a GitHub issue. + +## When a skill says "fetch the relevant ticket" + +Read it as in **Read an issue** above. + +## Wayfinding operations + +Used by `/wayfinder`. The **map** is a single issue with **child** issues as tickets. + +- **Map**: a single issue labelled `wayfinder:map`, holding the Notes / Decisions-so-far / Fog body. `gh issue create --label wayfinder:map`. +- **Child ticket**: an issue linked to the map as a GitHub sub-issue (see **Make an issue a sub-issue of a parent**). Where sub-issues aren't enabled, add the child to a task list in the map body and put `Part of #` at the top of the child body. Labels: `wayfinder:` (`research`/`prototype`/`grilling`/`task`). Once claimed, the ticket is assigned to the driving dev. +- **Blocking**: GitHub's **native issue dependencies**, the canonical, UI-visible representation. Add an edge with `gh api --method POST repos///issues//dependencies/blocked_by -F issue_id=`, where `` is the blocker's numeric **database id** (`gh api repos///issues/ --jq .id`, _not_ the `#number` or `node_id`). GitHub reports `issue_dependencies_summary.blocked_by` (open blockers only, the live gate). Where dependencies aren't available, fall back to a `Blocked by: #, #` line at the top of the child body. A ticket is unblocked when every blocker is closed. +- **Frontier query**: list the map's open children (`gh issue list --state open`, scoped to the map's sub-issues / task list), drop any with an open blocker (`issue_dependencies_summary.blocked_by > 0`, or an open issue in the `Blocked by` line) or an assignee; first in map order wins. +- **Claim**: `gh issue edit --add-assignee @me`, the session's first write. +- **Resolve**: `gh issue comment --body ""`, then `gh issue close `, then append a context pointer (gist + link) to the map's Decisions-so-far. diff --git a/docs/agents/triage-labels.md b/docs/agents/triage-labels.md new file mode 100644 index 0000000..5276464 --- /dev/null +++ b/docs/agents/triage-labels.md @@ -0,0 +1,15 @@ +# Triage Labels + +The skills speak in terms of five canonical triage roles. This file maps those roles to the actual label strings used in this repo's issue tracker. + +| Label in mattpocock/skills | Label in our tracker | Meaning | +| -------------------------- | -------------------- | ---------------------------------------- | +| `needs-triage` | `needs-triage` | Maintainer needs to evaluate this issue | +| `needs-info` | `needs-info` | Waiting on reporter for more information | +| `ready-for-agent` | `ready-for-agent` | Fully specified, ready for an AFK agent | +| `ready-for-human` | `ready-for-human` | Requires human implementation | +| `wontfix` | `wontfix` | Will not be actioned | + +When a skill mentions a role (e.g. "apply the AFK-ready triage label"), use the corresponding label string from this table. + +Edit the "Label in our tracker" column to match whatever vocabulary you actually use. From 0c8ca66b8abbb7b64538f5f3506d1bf5625f5d8f Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 08:57:44 +0100 Subject: [PATCH 02/35] docs: add ADR for ESM + CJS only output --- docs/adr/0001-esm-cjs-only.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 docs/adr/0001-esm-cjs-only.md diff --git a/docs/adr/0001-esm-cjs-only.md b/docs/adr/0001-esm-cjs-only.md new file mode 100644 index 0000000..af10fbe --- /dev/null +++ b/docs/adr/0001-esm-cjs-only.md @@ -0,0 +1,7 @@ +# Ship ESM and CJS only, no `window.Webvs` global build + +From 4.0.0, webvs publishes only ESM and CJS builds; the `dist/webvs.js` / `webvs.min.js` script-tag bundles that exposed a `window.Webvs` global are gone. No known consumer used the global (react-webvs-player and svelte-webvs-player both `import Webvs from 'webvs'`); it only served the README's unpkg ` +```js +import { Main, WebAudioAnalyser } from 'webvs'; +const webvs = new Main(....) +``` -or for a minified version +Both `import` and `require` are supported. - +### CDN -This script exposes a `Webvs` global which you can use to initialize like so `new Webvs.Main(...)`. +You can also load webvs as an ES module directly from [unpkg](https://unpkg.com). Webvs depends on `stats.js`, which has no ES module build, so map it to jsDelivr's ES module wrapper with an import map: + +```html + + +``` ## Usage A typical usage involves creating an Analyser from your music source (e.g. [Webvs.WebAudioAnalyser](http://azeemarshad.in/webvs/classes/webaudioanalyser.html) to use an `audio` tag or song url as a source) and initializing an instance of `Webvs.Main` with it. The main object serves as the primary interface or controlling the visualization. e.g. @@ -81,7 +96,7 @@ For typical workflow, start a dev server with npm run dev -and point browser to `http://localhost:8080/examples/` to view webvs test page. +It serves the webvs test page at `http://localhost:5173/examples/` straight from the source, no build needed. ## Contributing diff --git a/examples/index.html b/examples/index.html index b109b5e..165584e 100644 --- a/examples/index.html +++ b/examples/index.html @@ -50,15 +50,11 @@ - - - - - - - - + + + + + + \ No newline at end of file diff --git a/examples/test-page.js b/examples/test-page.js index e158b61..68423e6 100644 --- a/examples/test-page.js +++ b/examples/test-page.js @@ -1,4 +1,4 @@ -(function() { +import Webvs from '../index.ts'; var exampleTracks = [ { @@ -138,7 +138,7 @@ window.addExamplePreset = function(preset) { examplePresets.push(preset); } -window.initPage = function() { +function initPage() { initPresetInput(); initButtons(); initSelects(); @@ -150,4 +150,5 @@ window.initPage = function() { webvsMain.start(); } -})(); \ No newline at end of file +// preset scripts are deferred, so they all run before this fires +document.addEventListener('DOMContentLoaded', initPage); diff --git a/package-lock.json b/package-lock.json index a6b6497..8a8a57f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,11 @@ "tsdown": "0.23.1", "tslint": "5.9.1", "typescript": "^6.0.3", + "vite": "8.3.5", "vitest": "5.0.5" + }, + "engines": { + "node": ">=22" } }, "node_modules/@blazediff/core": { @@ -914,7 +918,6 @@ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8" } @@ -1202,7 +1205,6 @@ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "dev": true, "license": "MPL-2.0", - "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -1240,7 +1242,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1262,7 +1263,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1284,7 +1284,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1306,7 +1305,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1328,7 +1326,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1353,7 +1350,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1378,7 +1374,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1403,7 +1398,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1428,7 +1422,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1450,7 +1443,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1472,7 +1464,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -1525,7 +1516,6 @@ } ], "license": "MIT", - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1610,8 +1600,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/picomatch": { "version": "4.0.7", @@ -1685,7 +1674,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.20", "picocolors": "^1.1.1", @@ -1869,7 +1857,6 @@ "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -2227,7 +2214,6 @@ "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", @@ -2311,7 +2297,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -3017,8 +3002,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "peer": true + "dev": true }, "diff": { "version": "3.5.0", @@ -3215,7 +3199,6 @@ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "dev": true, - "peer": true, "requires": { "detect-libc": "^2.0.3", "lightningcss-android-arm64": "1.33.0", @@ -3236,88 +3219,77 @@ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-darwin-arm64": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-darwin-x64": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-freebsd-x64": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-arm-gnueabihf": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-arm64-gnu": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-arm64-musl": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-x64-gnu": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-linux-x64-musl": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-win32-arm64-msvc": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "lightningcss-win32-x64-msvc": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "magic-string": { "version": "1.4.5", @@ -3347,8 +3319,7 @@ "version": "3.3.20", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", - "dev": true, - "peer": true + "dev": true }, "obug": { "version": "3.0.0", @@ -3406,8 +3377,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "peer": true + "dev": true }, "picomatch": { "version": "4.0.7", @@ -3441,7 +3411,6 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz", "integrity": "sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==", "dev": true, - "peer": true, "requires": { "nanoid": "^3.3.20", "picocolors": "^1.1.1", @@ -3544,8 +3513,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", - "dev": true, - "peer": true + "dev": true }, "sprintf-js": { "version": "1.0.3", @@ -3763,7 +3731,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", "dev": true, - "peer": true, "requires": { "fsevents": "~2.3.3", "lightningcss": "^1.33.0", @@ -3778,8 +3745,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true, - "peer": true + "optional": true } } }, diff --git a/package.json b/package.json index 59599fa..8454efb 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ }, "scripts": { "build": "tsdown", + "dev": "vite --config vitest.config.mts --open /examples/", "smoke-test": "node test/smoke/smoke.mjs", "func-test": "vitest run --project func", "unit-test": "vitest run --project unit", @@ -51,6 +52,7 @@ "tsdown": "0.23.1", "tslint": "5.9.1", "typescript": "^6.0.3", + "vite": "8.3.5", "vitest": "5.0.5" }, "overrides": { From 2d915f42c6958999125baf0532947910b46c29f2 Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 15:34:44 +0100 Subject: [PATCH 20/35] docs: update ticket status --- .scratch/modernize/issues/08-examples-readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.scratch/modernize/issues/08-examples-readme.md b/.scratch/modernize/issues/08-examples-readme.md index b14d27d..9be0503 100644 --- a/.scratch/modernize/issues/08-examples-readme.md +++ b/.scratch/modernize/issues/08-examples-readme.md @@ -10,3 +10,5 @@ - [x] Manual check: a preset renders in the browser and the `rsrcMan.on('ready')` listener fires (record the result in the PR) - [x] The README's CDN section uses a ` - -``` +Builtin resources (images used by some presets) load from `resources/` relative to the page: serve the package's `resources/` folder next to your page, or pass `resourcePrefix` to `Main`. ## Usage A typical usage involves creating an Analyser from your music source (e.g. [Webvs.WebAudioAnalyser](http://azeemarshad.in/webvs/classes/webaudioanalyser.html) to use an `audio` tag or song url as a source) and initializing an instance of `Webvs.Main` with it. The main object serves as the primary interface or controlling the visualization. e.g. diff --git a/tsdown.config.ts b/tsdown.config.ts index 155cf45..1df4998 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -12,7 +12,7 @@ export default defineConfig({ plugins: [peggy], outputOptions: { exports: "named" }, define: { - RESOURCE_PACK_URL: JSON.stringify(`https://unpkg.com/webvs@${version}/resources/`), + RESOURCE_PACK_URL: JSON.stringify("resources/"), WEBVS_VERSION: JSON.stringify(version), }, }); From 814c18502ab2311b843630cec38c2679f2bc9517 Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 17:20:14 +0100 Subject: [PATCH 28/35] chore: update ts target --- package.json | 2 +- tsconfig.json | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index fc4573a..bcfeb5b 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "resources" ], "engines": { - "node": ">=22" + "node": ">=22.12" }, "scripts": { "build": "tsdown", diff --git a/tsconfig.json b/tsconfig.json index d210ff7..c968b5a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,8 @@ { "compilerOptions": { "sourceMap": true, - "strict": false, + "strict": false, + "target": "es2024", "useDefineForClassFields": false, "module": "preserve", "moduleResolution": "bundler", @@ -9,7 +10,7 @@ "noEmit": true, "lib": [ "dom", - "es2022" + "es2024" ], "types": [ "vitest/globals", From d839d0be2409c77b7bfd8b84e72811640ca2bdcf Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 17:26:45 +0100 Subject: [PATCH 29/35] docs: add cdn ticket --- .scratch/modernize/issues/13-drop-cdn-references.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .scratch/modernize/issues/13-drop-cdn-references.md diff --git a/.scratch/modernize/issues/13-drop-cdn-references.md b/.scratch/modernize/issues/13-drop-cdn-references.md new file mode 100644 index 0000000..18904cb --- /dev/null +++ b/.scratch/modernize/issues/13-drop-cdn-references.md @@ -0,0 +1,13 @@ +# 13: Drop webvs's own CDN references + +**What to build:** webvs no longer points users at a CDN. The builtin resource pack loads from `resources/`, resolved against the page URL, instead of unpkg. The README no longer has a CDN section. Instead, it says in one line how to make the builtin resources available: serve the package's `resources/` folder next to the page, or pass `resourcePrefix` to `Main`. Third-party CDN use in the examples page (CodeMirror) stays, and so do the ADR and the earlier modernize tickets and spec, which are historical records. + +**Blocked by:** None (can start immediately) + +**Status:** ready-for-agent + +- [ ] The published build's default resource pack prefix is the relative `resources/`. No unpkg URL remains in the build output +- [ ] The test and dev-server configuration keeps serving resources from `/resources/`, so tests and the examples page still load the builtin resources +- [ ] The README's CDN section is gone, including the unpkg import and the jsDelivr import map for stats.js. One line explains `resources/` and `resourcePrefix` +- [ ] Searching the repo for unpkg, jsDelivr and CDN finds nothing outside the examples page's CodeMirror tags, the ADR, `.scratch/`, `node_modules` and the lockfile +- [ ] Unit, functional and smoke tests pass From ed742a85e4ebdda25d8f685510a8fec21beed602 Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 17:28:40 +0100 Subject: [PATCH 30/35] chore: update seedrandom to 3.0.5 --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index bcfeb5b..46352c9 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "oxlint": "1.88.0", "peggy": "5.1.0", "playwright": "1.64.1", - "seedrandom": "^2.4.3", + "seedrandom": "3.0.5", "tsdown": "0.23.1", "typescript": "^7.0.2", "vite": "8.3.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b1ed934..6b9a6b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -211,8 +211,8 @@ importers: specifier: 1.64.1 version: 1.64.1 seedrandom: - specifier: ^2.4.3 - version: 2.4.4 + specifier: 3.0.5 + version: 3.0.5 tsdown: specifier: 0.23.1 version: 0.23.1(typescript@7.0.2) @@ -961,8 +961,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - seedrandom@2.4.4: - resolution: {integrity: sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==} + seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} @@ -1670,7 +1670,7 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.16 '@rolldown/binding-win32-x64-msvc': 1.2.16 - seedrandom@2.4.4: {} + seedrandom@3.0.5: {} semver@7.7.4: {} From 816d13a35ec3ce98504eb48b46a951efd757c95e Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 17:29:23 +0100 Subject: [PATCH 31/35] chore: update dependencies --- package.json | 6 +- pnpm-lock.yaml | 229 ++++++++++++++++++++++++------------------------- 2 files changed, 117 insertions(+), 118 deletions(-) diff --git a/package.json b/package.json index 46352c9..8d1a525 100644 --- a/package.json +++ b/package.json @@ -45,11 +45,11 @@ "devDependencies": { "@types/node": "22.20.5", "@vitest/browser-playwright": "5.0.5", - "oxlint": "1.88.0", - "peggy": "5.1.0", + "oxlint": "1.90.0", + "peggy": "5.1.1", "playwright": "1.64.1", "seedrandom": "3.0.5", - "tsdown": "0.23.1", + "tsdown": "0.23.4", "typescript": "^7.0.2", "vite": "8.3.5", "vitest": "5.0.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b9a6b2..972dcff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -202,11 +202,11 @@ importers: specifier: 5.0.5 version: 5.0.5(playwright@1.64.1)(vite@8.3.5(@types/node@22.20.5))(vitest@5.0.5) oxlint: - specifier: 1.88.0 - version: 1.88.0 + specifier: 1.90.0 + version: 1.90.0 peggy: - specifier: 5.1.0 - version: 5.1.0 + specifier: 5.1.1 + version: 5.1.1 playwright: specifier: 1.64.1 version: 1.64.1 @@ -214,8 +214,8 @@ importers: specifier: 3.0.5 version: 3.0.5 tsdown: - specifier: 0.23.1 - version: 0.23.1(typescript@7.0.2) + specifier: 0.23.4 + version: 0.23.4(typescript@7.0.2) typescript: specifier: ^7.0.2 version: 7.0.2 @@ -244,131 +244,131 @@ packages: '@oxc-project/types@0.156.0': resolution: {integrity: sha512-1Duyg48TdJNdyhEB8Xn1L36bT9Pv6GUtlKjHxOys8xkaF/rQq3XJE+bAurSK/AgIz5mGFsb77cn9Pb20+WCScw==} - '@oxlint/binding-android-arm-eabi@1.88.0': - resolution: {integrity: sha512-k6Fgkf86ubfeH4GvqYsRolfuVAp0pfYVZvifSlXNHPdMaWUOfxUrmLEeDD7hF6U2oJuhsVxhSWq86/xCJ+9MmA==} + '@oxlint/binding-android-arm-eabi@1.90.0': + resolution: {integrity: sha512-sgfalb1HuxYjiAa4wESZ626z1FGusqNcXYHyB5oIOEprS2sbPg0UYEfo83uF1GNG70DIfZxHkXuE6KFrlSdn8Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.88.0': - resolution: {integrity: sha512-AsIyhl9o1ejwtac7NMbhKpMdSml6NWR0ljKjZERxC8OHYDAW8o/Om9n1QHVLi4VCEUo42Zte2/Op9kyoGpJZMg==} + '@oxlint/binding-android-arm64@1.90.0': + resolution: {integrity: sha512-RcKhz1ETMq+fazE9TKS2+5NIRGwigm/nW8egqF0LI+A8Yw2iW5r0E/C3XAPRiwIm/vcPiutIRIa6IQCIKhZsTQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.88.0': - resolution: {integrity: sha512-qgBjB7eEKcCB4RqjXGuoSZq74g0wD09fWFJ+HWcCJcKaga8TeUHtb+BY0SsxdleSLBgx4RZ7qmgo0EzqEq7JoQ==} + '@oxlint/binding-darwin-arm64@1.90.0': + resolution: {integrity: sha512-PSrxMvP6mx+p1karZcUxLdy9lpaP+JWQPti4al9FgTaPhxE+pT/BjhGExloVVSWgZgIfOlLOjVyyq8BXlodhLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.88.0': - resolution: {integrity: sha512-sCz3X5Mw/xdzEzn4fsCt1Iq8NKJnGNfhR+b9B5k+4DysYAHsmIhYoocnBPiQ9kvY3+pUun2A0Z8Vtun/Nv6YoQ==} + '@oxlint/binding-darwin-x64@1.90.0': + resolution: {integrity: sha512-OLbU9qsrV2Q8QxT2OEzOPdO8zCCpyI8qB+hDI8yr6RsYELtkf0FAZhJdfjM/RnLHKzt44HWwAPnk92vBtKofvw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.88.0': - resolution: {integrity: sha512-xTOdYOIqCufgIj0knvxu86FBfovP6QBiD7ngNva01gb8xPQCD5gXkE5APGczH35zStim1O3zqvFbLQmY85xXRg==} + '@oxlint/binding-freebsd-x64@1.90.0': + resolution: {integrity: sha512-fBA4pWyVDARmNucQqpyFuPC49xYf1r+sX7dxPL5fNPQrSMLum39Sn56tZ9JPleWC7FzLPwSQ7plYYfirYBHF8A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.88.0': - resolution: {integrity: sha512-BLadtw88NdYJBrAtC1dYzrPfSP2d5zgx6iuZycdD0YmZBJ2Nqbit9Z4PSaIb6gxK25dweArGMPbOmq/0ugwUPg==} + '@oxlint/binding-linux-arm-gnueabihf@1.90.0': + resolution: {integrity: sha512-zhxH78eP2nR6/pGdhBc7MIfjhhcgATeu8fkmkFJbuzfk6Cj0FzBxyEhL85yDqrCybjx+G2YDzZGsxIO9kvO4Iw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.88.0': - resolution: {integrity: sha512-wILSczl/DaZsCcf7j7tvNbssp8hxEHIJxrv4j7+JjI3TAL1U/JTWbeUtoJJC/vo8+2hkTmHLYoKJjmiNbijdXw==} + '@oxlint/binding-linux-arm-musleabihf@1.90.0': + resolution: {integrity: sha512-MvYmpHyJqUJjEvkZbJHdwfdL45cGn8EVBkYmoXFiaYFW9suoD3dbJl5mBdpy0DVgdjlyddmldbRtk3cCgETadQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.88.0': - resolution: {integrity: sha512-jutT2Hy8JCuZuMwIFHo2HtyxfOfBJHyQxlBHBK1SL9W2f8n/WhjAP0FnDMz9d/mjhv9+QA0mx5AdQ9fDjsrFFg==} + '@oxlint/binding-linux-arm64-gnu@1.90.0': + resolution: {integrity: sha512-L13Sy+Kg0nZhwTsToniqjUFPA2TuM6962qCZ5Wp5KeB517Tw7ApdLTTtlb+bF86fcZZa2EtvCVvAJxk4Dya/MQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.88.0': - resolution: {integrity: sha512-8N8iGV9hh4Lkeuq7QsEkjoXNRRflqR1G2qyoGYXcA0k5qllrdqmfylKEXyHIVERxqNDyMO4StqDQ0uLxXcBQAg==} + '@oxlint/binding-linux-arm64-musl@1.90.0': + resolution: {integrity: sha512-wFDdZWGpzIPFdJFjSLWnKB0TGzFriTKUIrl04iMqMyM9BBIJTuerfCHYa0WpDSjr5x3lcW/CHLyacSt886WpGg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.88.0': - resolution: {integrity: sha512-5ydcQt3znNQ/rGEWYRvpS2cK9+T18P2VYgnyJ+eloEAwi9YUmsXy5VGrRqNWIK6qzWwHGnEE3ojVqqQNo+f0hA==} + '@oxlint/binding-linux-ppc64-gnu@1.90.0': + resolution: {integrity: sha512-FRywfn+MoKn8xpBSzgNwNVliSKRI2QXkxi/iF7o6FEQs8Bh8z2RpVTaFAcO3pchXjvB2eGNFIoLLQABIQ+u7VA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.88.0': - resolution: {integrity: sha512-iGx0uvFT54b/5DPJdEBCxYIrVB3v0uTy+JhRh3CyEp8/22BXDkG8rffkFwREdLsdj9mOrPbJYVOZw8ipcBuzjw==} + '@oxlint/binding-linux-riscv64-gnu@1.90.0': + resolution: {integrity: sha512-IS2PaUgpc/qeLADTyhUNmdx3x4ijs9pjJdPKBYHaT+mAE7k3FsjnHPTjhpsak1b++h6CIPhv6WX9Z+y7Pw0voQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.88.0': - resolution: {integrity: sha512-Wt47mKMWelVjRjuR7BCFxXkB0m79K1sTEbqMHRWciKUgo5iv7sWsF4RXSOyFYHD9zerNrkRZblnN273rhwOA1Q==} + '@oxlint/binding-linux-riscv64-musl@1.90.0': + resolution: {integrity: sha512-s7JFKRkGS8O7i2ZVODfuO++NC7sH6HDqpMn8lYxw91w0SXJOxnAVjQ8utvmDwLMMT0jaSkuOKuUYJDGDtu4sHQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.88.0': - resolution: {integrity: sha512-g3L12KCS4+1gtUt3RbJ4F+Yxx4LNmmZLEPfhd8rAHEJjJk2lAgNfnjGoP/phJyhG5WS6VbNYbJtadJelNfvTMA==} + '@oxlint/binding-linux-s390x-gnu@1.90.0': + resolution: {integrity: sha512-b0GxrOQr5VONCkd7KLSqmP6b6nqZuTpuS8QPQHzltmqdXP5bY0Jl0CZ0QmlCTrS3ExaLYbioFYOARzNbYvcApQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.88.0': - resolution: {integrity: sha512-og/XHVDOD9ZJgRiZkT9DgzQd4sr+JZW7e4l17Q/jVMZiIbeEd4uIu9iAoUbTF1gIvVZoRc4QDOxyVUvQGp4WHg==} + '@oxlint/binding-linux-x64-gnu@1.90.0': + resolution: {integrity: sha512-iaJeShJtgUp8rZbt9YUdTAGOpmX5KogCLba17Jp1tWdJ3F4M3D2g2TKUyI1FMTHxKH9NNHuQcuC2kZRg6IV7yQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.88.0': - resolution: {integrity: sha512-EmhBsp+xuKb6YbZNEMLBo80Xw71AZOIm18do8ni/GLX/Lw1XzNhVYpbxO1KasYtoAvrGtCOdCPULRlIE0bPbTQ==} + '@oxlint/binding-linux-x64-musl@1.90.0': + resolution: {integrity: sha512-/aZoXnL5WBLCXuzfHqvEFXcm4iwYmr/cYByHDTXzLFzJdE5DC7bm6phpWqHv6BeqpVgY9IpBAxGDv2WEkl5JCg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.88.0': - resolution: {integrity: sha512-DBUcx/KwYdg1DAz+G01P/GFv512J04EsZadbHptx2FTpWT/MWRg21ZToNHt9pnsfQRBQ3et/g+vqzbvrdAVbuA==} + '@oxlint/binding-openharmony-arm64@1.90.0': + resolution: {integrity: sha512-SMhk7ozwoxYDKfYqGZCQEfULOKDneF9uhaoIf2neoDLWvNtjY9yVeL7YHmE5L9WdKvMpWNwwZxhenxBu6AgfOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.88.0': - resolution: {integrity: sha512-xeVd0n4XG5HvynxfYvXi6uB+JvZbVZataowPS8cYpMbYg9mwE4sSyElFQd4LVJFifq8bRLDSR18XgEildmcXAg==} + '@oxlint/binding-win32-arm64-msvc@1.90.0': + resolution: {integrity: sha512-KBvR3A9fO7fCi2vCP8ifWvlia7tGEQV9NaYh+IGwa/7Groy48Mt/UaYqMK9/zOtAWl20BUCf6RPqzJ32fRw33Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.88.0': - resolution: {integrity: sha512-MA6iOw//amleaz2mVMsZrA7NHlEexjTrhIxSMFCXQi6IUuQO+3Od00GZhr2iCYw6RFzMW36jkKK/WHBXMsoQAw==} + '@oxlint/binding-win32-ia32-msvc@1.90.0': + resolution: {integrity: sha512-+x42rDHQGbTCuT3EzpWAzhP3NoVPE/cJsG4gnrakOSg0olV+GCdMpPU23Nvrl3zZMnXxFZdTtDv4D3SuaA5ZeQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.88.0': - resolution: {integrity: sha512-3Sz6rVWe8Dy+ufsXurFN1GX2dX43F/lQMSLelK9gFjiba7nHvLlqlhR5cHlWVnCpSqUY1hN9pyCX9XToe6ve6g==} + '@oxlint/binding-win32-x64-msvc@1.90.0': + resolution: {integrity: sha512-30JiaFEBUB9peEOcvVM8ggo88SoN/IdSr9DW505JdBji/R6dM66gKEiG65hw6qcaF2f4mO0cEJ+RwRZprmun9g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@peggyjs/from-mem@3.1.3': - resolution: {integrity: sha512-LLlgtfXIaeYXoOYovOI0spLM8ZXaqkAlmcRRrLzHJzLMqkU6Sw0R4KMoCoHx1PjaP815pSCBlS+BN6aD8t1Jgg==} - engines: {node: '>=20.8'} + '@peggyjs/from-mem@4.0.0': + resolution: {integrity: sha512-JrTyhN5Vo2K3Ktz+bTTpt7ueL6PRG/11xhW7BdSK2TaJIbxSJpRk10TLn+4eBPQUCtrkQeYAg0MlVrc9QZMFEg==} + engines: {node: '>=22'} '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -882,12 +882,12 @@ packages: resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} engines: {node: '>=12.20.0'} - oxlint@1.88.0: - resolution: {integrity: sha512-uIcFgw8BmqvFRGzH5+r7d2zJMEexwNSrEmM6WQNnGh3VkO0XYTEFoyxyNE6tjKMUib9Cue4XJA2DoWruO5D6aw==} + oxlint@1.90.0: + resolution: {integrity: sha512-RkTN9EmgIUpLuhNoLhO3OliMGJlvb3Dk7XVjBZnfoMCHrVpuz5ESd97klfiyYeV7XfA2lNLnDCPMkUI+Qw5How==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=7.0.2003' + oxlint-tsgolint: '>=7.0.2005' vite-plus: '*' peerDependenciesMeta: oxlint-tsgolint: @@ -898,9 +898,9 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - peggy@5.1.0: - resolution: {integrity: sha512-IEo5aYRZ2kXH4Qby06cjtL114PZnwLoTiA41vUmg2vPZgANn+c87m5BUurhuDr5/cu758ZlpgsAfBVx+hhO5+w==} - engines: {node: '>=20'} + peggy@5.1.1: + resolution: {integrity: sha512-HhhbwH1MoCq9YNqeC2n1ap6YzLSL1YUgUxGoeiXcmGOlAYTqxwmifPJ7gFZtkR/S2+KXZ6BkJ5FfycTtq9oCRQ==} + engines: {node: '>=22'} hasBin: true picocolors@1.1.1: @@ -964,8 +964,8 @@ packages: seedrandom@3.0.5: resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -973,8 +973,8 @@ packages: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} - source-map-generator@2.0.6: - resolution: {integrity: sha512-IlassDs1Ve8nV6uyQZXF9kdkJpVKnMte2JZQXu13M0A5zwc+vu6+LNHfmxsHBMDtoZE21RHiKI0/xvpecZRCNg==} + source-map-generator@2.0.7: + resolution: {integrity: sha512-DJBSmVt7U50+Z+MihfPJKhrbAAC0VHriNQlufDfgaikQfAmPck05rjJ9BO2LXTabA6644umhFm2+XZ8aRZxTkQ==} engines: {node: '>=20'} source-map-js@1.2.2: @@ -999,6 +999,9 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinyps@0.5.1: + resolution: {integrity: sha512-B6Ykif5HflC3AdDkS4Zst/2muYVfeXoVMy+KorqH80s/1x4vunIORpNySH681X7fjj+dFM9MDKD6/Hsccjb87Q==} + tinyrainbow@3.2.0: resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} engines: {node: '>=14.0.0'} @@ -1007,18 +1010,14 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - tsdown@0.23.1: - resolution: {integrity: sha512-MSC2WSOts3in95J334/VIS7KPfor3eCSvndJ6KdoVj9Aak9Kh1aNfz9ws5owhdukuTNSXRdfkPEzA/ihpDD6SA==} + tsdown@0.23.4: + resolution: {integrity: sha512-AQQ/2Y7KBnf15GL4Ynjdltc94PkbKRI+arStyrp7inSQkRmTWNiXgfv50ESsjhBEsoVtiSloCAO2VyrqojWIOQ==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 - '@tsdown/css': 0.23.1 - '@tsdown/exe': 0.23.1 + '@tsdown/css': 0.23.4 + '@tsdown/exe': 0.23.4 '@vitejs/devtools': '*' publint: ^0.3.8 tsx: '*' @@ -1192,66 +1191,66 @@ snapshots: '@oxc-project/types@0.156.0': {} - '@oxlint/binding-android-arm-eabi@1.88.0': + '@oxlint/binding-android-arm-eabi@1.90.0': optional: true - '@oxlint/binding-android-arm64@1.88.0': + '@oxlint/binding-android-arm64@1.90.0': optional: true - '@oxlint/binding-darwin-arm64@1.88.0': + '@oxlint/binding-darwin-arm64@1.90.0': optional: true - '@oxlint/binding-darwin-x64@1.88.0': + '@oxlint/binding-darwin-x64@1.90.0': optional: true - '@oxlint/binding-freebsd-x64@1.88.0': + '@oxlint/binding-freebsd-x64@1.90.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.88.0': + '@oxlint/binding-linux-arm-gnueabihf@1.90.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.88.0': + '@oxlint/binding-linux-arm-musleabihf@1.90.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.88.0': + '@oxlint/binding-linux-arm64-gnu@1.90.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.88.0': + '@oxlint/binding-linux-arm64-musl@1.90.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.88.0': + '@oxlint/binding-linux-ppc64-gnu@1.90.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.88.0': + '@oxlint/binding-linux-riscv64-gnu@1.90.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.88.0': + '@oxlint/binding-linux-riscv64-musl@1.90.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.88.0': + '@oxlint/binding-linux-s390x-gnu@1.90.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.88.0': + '@oxlint/binding-linux-x64-gnu@1.90.0': optional: true - '@oxlint/binding-linux-x64-musl@1.88.0': + '@oxlint/binding-linux-x64-musl@1.90.0': optional: true - '@oxlint/binding-openharmony-arm64@1.88.0': + '@oxlint/binding-openharmony-arm64@1.90.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.88.0': + '@oxlint/binding-win32-arm64-msvc@1.90.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.88.0': + '@oxlint/binding-win32-ia32-msvc@1.90.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.88.0': + '@oxlint/binding-win32-x64-msvc@1.90.0': optional: true - '@peggyjs/from-mem@3.1.3': + '@peggyjs/from-mem@4.0.0': dependencies: - semver: 7.7.4 + semver: 7.8.5 '@polka/url@1.0.0-next.29': {} @@ -1583,35 +1582,35 @@ snapshots: obug@3.0.0: {} - oxlint@1.88.0: + oxlint@1.90.0: optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.88.0 - '@oxlint/binding-android-arm64': 1.88.0 - '@oxlint/binding-darwin-arm64': 1.88.0 - '@oxlint/binding-darwin-x64': 1.88.0 - '@oxlint/binding-freebsd-x64': 1.88.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.88.0 - '@oxlint/binding-linux-arm-musleabihf': 1.88.0 - '@oxlint/binding-linux-arm64-gnu': 1.88.0 - '@oxlint/binding-linux-arm64-musl': 1.88.0 - '@oxlint/binding-linux-ppc64-gnu': 1.88.0 - '@oxlint/binding-linux-riscv64-gnu': 1.88.0 - '@oxlint/binding-linux-riscv64-musl': 1.88.0 - '@oxlint/binding-linux-s390x-gnu': 1.88.0 - '@oxlint/binding-linux-x64-gnu': 1.88.0 - '@oxlint/binding-linux-x64-musl': 1.88.0 - '@oxlint/binding-openharmony-arm64': 1.88.0 - '@oxlint/binding-win32-arm64-msvc': 1.88.0 - '@oxlint/binding-win32-ia32-msvc': 1.88.0 - '@oxlint/binding-win32-x64-msvc': 1.88.0 + '@oxlint/binding-android-arm-eabi': 1.90.0 + '@oxlint/binding-android-arm64': 1.90.0 + '@oxlint/binding-darwin-arm64': 1.90.0 + '@oxlint/binding-darwin-x64': 1.90.0 + '@oxlint/binding-freebsd-x64': 1.90.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.90.0 + '@oxlint/binding-linux-arm-musleabihf': 1.90.0 + '@oxlint/binding-linux-arm64-gnu': 1.90.0 + '@oxlint/binding-linux-arm64-musl': 1.90.0 + '@oxlint/binding-linux-ppc64-gnu': 1.90.0 + '@oxlint/binding-linux-riscv64-gnu': 1.90.0 + '@oxlint/binding-linux-riscv64-musl': 1.90.0 + '@oxlint/binding-linux-s390x-gnu': 1.90.0 + '@oxlint/binding-linux-x64-gnu': 1.90.0 + '@oxlint/binding-linux-x64-musl': 1.90.0 + '@oxlint/binding-openharmony-arm64': 1.90.0 + '@oxlint/binding-win32-arm64-msvc': 1.90.0 + '@oxlint/binding-win32-ia32-msvc': 1.90.0 + '@oxlint/binding-win32-x64-msvc': 1.90.0 pathe@2.0.3: {} - peggy@5.1.0: + peggy@5.1.1: dependencies: - '@peggyjs/from-mem': 3.1.3 + '@peggyjs/from-mem': 4.0.0 commander: 14.0.3 - source-map-generator: 2.0.6 + source-map-generator: 2.0.7 picocolors@1.1.1: {} @@ -1672,7 +1671,7 @@ snapshots: seedrandom@3.0.5: {} - semver@7.7.4: {} + semver@7.8.5: {} sirv@3.0.2: dependencies: @@ -1680,7 +1679,7 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 - source-map-generator@2.0.6: {} + source-map-generator@2.0.7: {} source-map-js@1.2.2: {} @@ -1697,13 +1696,13 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 + tinyps@0.5.1: {} + tinyrainbow@3.2.0: {} totalist@3.0.1: {} - tree-kill@1.2.2: {} - - tsdown@0.23.1(typescript@7.0.2): + tsdown@0.23.4(typescript@7.0.2): dependencies: cac: 7.1.0 defu: 6.1.7 @@ -1716,7 +1715,7 @@ snapshots: rolldown-plugin-dts: 0.28.8(rolldown@1.2.16)(typescript@7.0.2) tinyexec: 1.3.1 tinyglobby: 0.2.17 - tree-kill: 1.2.2 + tinyps: 0.5.1 unconfig-core: 7.5.0 verkit: 0.5.0 optionalDependencies: From b4f74fa5869ee75dc8ddf9291c269b244418b877 Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 17:49:41 +0100 Subject: [PATCH 32/35] chore: rename fork, add contributors --- package.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 8d1a525..4911593 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webvs", - "version": "3.0.0", + "version": "4.0.0", "description": "Audio Visualization rendering library", "type": "module", "exports": { @@ -32,12 +32,16 @@ }, "repository": { "type": "git", - "url": "git://github.com/azeem/webvs.git" + "url": "git://github.com/visbot/webvs.git" }, "author": "Azeem Arshad", + "contributors": [ + "Jan T. Sott (https://github.com/idleberg)", + "Jakob Karge (https://github.com/grandchild)" + ], "license": "MIT", "bugs": { - "url": "https://github.com/azeem/webvs/issues" + "url": "https://github.com/visbot/webvs/issues" }, "dependencies": { "stats.js": "^0.17.0" From edf6df1ba089e71d0483f986d4f7dbdd6cd8668d Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 17:50:17 +0100 Subject: [PATCH 33/35] docs: add badges, rename imports --- README.md | 13 ++++++------- package.json | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e5b7534..1538253 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ # Webvs -[![npm version](https://badge.fury.io/js/webvs.svg)](https://www.npmjs.com/package/webvs) -[![CircleCI](https://img.shields.io/circleci/project/azeem/webvs.svg?)](https://circleci.com/gh/azeem/webvs/) -[![David](https://img.shields.io/david/azeem/webvs.svg)](https://david-dm.org/azeem/webvs) -[![David](https://img.shields.io/david/dev/azeem/webvs.svg)](https://david-dm.org/azeem/webvs?type=dev) +[![License](https://img.shields.io/github/license/visbot/webvs?color=blue&style=for-the-badge)](https://github.com/visbot/node-webvs/blob/main/LICENSE) +[![Version: npm](https://img.shields.io/npm/v/@visbot/webvs?style=for-the-badge)](https://www.npmjs.org/package/@visbot/webvs) +![GitHub branch check runs](https://img.shields.io/github/check-runs/visbot/webvs/main?style=for-the-badge) A Winamp AVS like visualization library for the web. @@ -22,19 +21,19 @@ The documentation for the [Main](http://azeemarshad.in/webvs/classes/main.html) For use with package bundlers, Webvs is available on [npm](https://www.npmjs.com/package/webvs) as `webvs`. Install using - npm install webvs + npm install @visbot/webvs and import in your code and initialize as follows ```js -import Webvs from 'webvs'; +import Webvs from '@visbot/webvs'; const webvs = new Webvs.Main(....) ``` or import only what you need ```js -import { Main, WebAudioAnalyser } from 'webvs'; +import { Main, WebAudioAnalyser } from '@visbot/webvs'; const webvs = new Main(....) ``` diff --git a/package.json b/package.json index 4911593..c8e6b96 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "webvs", + "name": "@visbot/webvs", "version": "4.0.0", "description": "Audio Visualization rendering library", "type": "module", From 956543ece588d6a09f4568c750d37b2f47942a51 Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 18:52:22 +0100 Subject: [PATCH 34/35] fix: update imports --- test/smoke/smoke.mjs | 4 ++-- test/smoke/types.cts | 2 +- test/smoke/types.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/smoke/smoke.mjs b/test/smoke/smoke.mjs index 74ffaaa..6e2c7ad 100644 --- a/test/smoke/smoke.mjs +++ b/test/smoke/smoke.mjs @@ -13,8 +13,8 @@ function check(mod, format) { } } -check(createRequire(import.meta.url)("webvs"), "require"); -check(await import("webvs"), "import"); +check(createRequire(import.meta.url)("@visbot/webvs"), "require"); +check(await import("@visbot/webvs"), "import"); execSync("pnpm exec tsc -p test/smoke/tsconfig.json", { stdio: "inherit" }); diff --git a/test/smoke/types.cts b/test/smoke/types.cts index e2a9809..a333d2c 100644 --- a/test/smoke/types.cts +++ b/test/smoke/types.cts @@ -1,4 +1,4 @@ -import webvs = require("webvs"); +import webvs = require("@visbot/webvs"); export const named: object[] = [webvs.AnalyserAdapter, webvs.Component, webvs.Main, webvs.ShaderProgram, webvs.WebAudioAnalyser]; export const version: string = webvs.default.Main.version; diff --git a/test/smoke/types.ts b/test/smoke/types.ts index 26d436a..c04ba79 100644 --- a/test/smoke/types.ts +++ b/test/smoke/types.ts @@ -1,4 +1,4 @@ -import Webvs, { AnalyserAdapter, Component, Main, ShaderProgram, WebAudioAnalyser } from "webvs"; +import Webvs, { AnalyserAdapter, Component, Main, ShaderProgram, WebAudioAnalyser } from "@visbot/webvs"; export const named: object[] = [AnalyserAdapter, Component, Main, ShaderProgram, WebAudioAnalyser]; export const version: string = Webvs.Main.version; From eea2dcc284f105b92b547d8721dae765c0af3807 Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Sun, 1 Nov 2026 18:53:02 +0100 Subject: [PATCH 35/35] ci: bump workflow actions --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6c5ecb2..b620587 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,9 +12,9 @@ jobs: matrix: node-version: [22, 24] steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 + - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 with: node-version: ${{ matrix.node-version }} cache: pnpm